diff --git a/ABOUT-NLS b/ABOUT-NLS index dd2659f0a..2f50c6693 100644 --- a/ABOUT-NLS +++ b/ABOUT-NLS @@ -3,9 +3,8 @@ 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. +together, so that 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, @@ -16,7 +15,7 @@ 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. +work at translations should 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 @@ -56,27 +55,27 @@ 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: +provides the GNU `gettext' functions. If not, the GNU `gettext' own +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 +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 +will decide to use this. This might be not what is 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 @@ -87,7 +86,7 @@ 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 + Internationalized packages have usually 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 diff --git a/AUTHORS b/AUTHORS index 888bf94fa..0de6a8662 100644 --- a/AUTHORS +++ b/AUTHORS @@ -3,6 +3,8 @@ Maintainer: Werner Koch Bug reports: Security related bug reports: +Please note that this file is for the 1.9 branch of GnuPG. + Authors ======= @@ -28,6 +30,9 @@ Edmund GRIMLEY EVANS Translations [eo] Florian Weimer Assigns past and future changes (changed:g10/parse-packet.c, include/iobuf.h, util/iobuf.c) +g10 Code GmbH Assigns past and future changes + (all work since 2001 as indicated by mail addresses in ChangeLogs) + Gaël Quéri Translations [fr] (fixed a lot of typos) @@ -50,8 +55,6 @@ Laurentiu Buzdugan Translations [ro] Magda Procha'zkova' Translations [cs] -Meng Jie Translations [zh_CN] - Michael Roth Assigns changes. (wrote cipher/des.c., changes and bug fixes all over the place) @@ -59,9 +62,15 @@ Michal Majer Translations [sk] Marco d'Itri Translations [it] +Marcus Brinkmann + (gpgconf and fixes all over the place) + Matthew Skala Disclaimer (wrote cipher/twofish.c) +Moritz Schulte + (ssh support gpg-agent) + Niklas Hernaeus Disclaimer (weak key patches) @@ -96,15 +105,13 @@ Rafael Caetano dos Santos Translations [pt_BR] Toomas Soome Translations [et] -Trond Endrestøl Translations [nb] - -Urko Lusa Translations [es] -Jaime Sua'rez Translations [es] +Urko Lusa Translations [es_ES] Walter Koch Translations [de] Werner Koch Assigns GNU Privacy Guard and future changes. - (started the whole thing) + (started the whole thing, wrote the S/MIME extensions, the + smartcard daemon and the gpg-agent) Yosiaki IIDA Translations [ja] @@ -113,28 +120,15 @@ Yosiaki IIDA 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 . - -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 files common/libestream.[ch] are maintained as a separate project +by g10 Code GmbH. These files, as used here, are considered part of +GnuPG. 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. + Copyright 1998, 1999, 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 diff --git a/BUGS b/BUGS deleted file mode 100644 index 40650568e..000000000 --- a/BUGS +++ /dev/null @@ -1,12 +0,0 @@ -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 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 index 3912109b5..d60c31a97 100644 --- a/COPYING +++ b/COPYING @@ -2,7 +2,7 @@ Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -305,7 +305,7 @@ the "copyright" line and a pointer to where the full notice is found. You should have 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 + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. @@ -313,7 +313,7 @@ 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 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. diff --git a/ChangeLog b/ChangeLog index 3533a2bc8..6c016dc0e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,640 +1,386 @@ -2006-08-01 Werner Koch +2006-07-29 Marcus Brinkmann - Released 1.4.5. + * README: Spelling fixes. -2006-07-31 Werner Koch +2006-07-27 Werner Koch - * README: Updated info on the key used to sign the tarball. + Released 1.9.22. -2006-07-28 Werner Koch + * configure.ac: Call AB_INIT. - Released 1.4.5rc1. +2006-07-03 Werner Koch -2006-07-08 David Shaw + * configure.ac: Test for ksba_dn_teststr. - * configure.ac: Fix resolver autoconf code so it works (fails) - properly with uClibc. +2006-06-30 Werner Koch -2006-06-25 Werner Koch + * keyserver/: New. Taken from 1.4.4 + * Makefile.am (SUBDIRS): Include keyserver/. + * configure.ac: Include keyserver/. + (FAKE_CURL, GPGKEYS_CURL): New. + +2006-06-20 Werner Koch - Released 1.4.4. + Released 1.9.21. -2006-05-23 David Shaw +2006-06-08 Marcus Brinkmann - * configure.ac: Add --disable-optimization. This is handy for - debugging so the compiler doesn't rearrange things and eliminate - variables. + * configure.ac (PTH_LIBS): Add --all to pth-config invocation. -2006-05-22 Marcus Brinkmann +2006-05-24 Werner Koch - * configure.ac: Remove check for noexecstack and invoke - CL_AS_NOEXECSTACK instead. + * configure.ac: New option --disable-optimization taked from 1.4.3. -2006-05-16 Werner Koch +2006-05-23 Werner Koch - * README: Removed note for OSF5 as this is the default now. - Reported by Joerg Honegger. + * configure.ac (ZLIBS): New for zlib link commands. Add bzip2 + support. - * configure.ac [osf5]: Fixed warning name to ptrmismatch1. +2006-05-22 Werner Koch -2006-04-27 David Shaw + * configure.ac (EXEEXT): New. - * NEWS: Note SHA-224 and DSA2. +2006-04-18 Werner Koch - * configure.ac: Remove --enable-old-keyserver-helpers. Comment - out --enable-m-guard for now. - -2006-04-12 Werner Koch - - * configure.ac: Print version at end of run. - (svn_revision): Posix adjustment. + * configure.ac (PK_UID_CACHE_SIZE): New. 2006-04-07 Werner Koch * configure.ac: Use new method to include the SVN revison. Now it is the actual global revision number. -2006-04-04 Werner Koch +2005-12-20 Werner Koch - * NEWS: Fixed old news entry to point to rfc4398 which has been - published just before 1.4.3. + Released 1.9.20. -2006-04-03 Werner Koch +2005-11-28 Werner Koch - Released 1.4.3. + * configure.ac: Append the revision to the version string. -2006-03-30 David Shaw +2005-11-13 Werner Koch - * README: Some more notes about building fat binaries. + * am/cmacros.am (-DGNUPG_SYSCONFDIR): Define it. -2006-03-24 David Shaw +2005-11-11 Werner Koch - * README: Missing some instructions on building a fat binary. + * configure.ac (NEED_KSBA_VERSION: Require 0.9.13. -2006-03-20 David Shaw +2005-09-12 Werner Koch - * configure.ac: Improved --disable-endian-check that doesn't - involve changing #ifdefs in the rest of the code. + Released 1.9.19. -2006-03-19 David Shaw +2005-08-01 Werner Koch - * configure.ac: Add --disable-endian-check for building fat - binaries on OSX. + Released 1.9.18. + + * configure.ac: Require libksba 0.9.12 to match new features in gpgsm. - * README: Add note on how to build a fat binary on OSX. +2005-06-20 Werner Koch -2006-03-17 David Shaw + Released 1.9.17. - * configure.ac: Allow the DNS stuff to work on OSX by trying the - Apple-specific BIND_8_COMPAT. +2005-06-02 Werner Koch -2006-03-09 Werner Koch + * configure.ac (HAVE_PTH): Define as alias for USE_GNU_PTH. It is + used by common/estream.c. - Released 1.4.3rc2. +2005-06-01 Werner Koch -2006-03-07 David Shaw + * configure.ac (gl_INIT): Add gnulib stuff. + (fseeko, ftello, ttyname, isascii): Replaced the AC_REPLACE_FUNCS + by a simple check. + (putc_unlocked): Removed check. Not used. + (strsep, mkdtemp, asprintf): Replaced checks by gnulib checks. + (xsize): Added will probably come handy soon. + (CFLAGS): Use -Wformat-security instead of + -Wformat-nonliteral. Add --Wno-format-y2k. + * gl/, gl/m4/: New. - * NEWS: Note CERT retrieval. Tweak PKA and backsig language to - match current code. +2005-05-15 Werner Koch - * NEWS: Note --auto-key-locate and that keyservers can handle - binary data now. + * configure.ac: Remove option --disable-threads; require the use + of GNU Pth. -2006-03-01 David Shaw +2005-04-27 Werner Koch - * configure.ac: Fix accidental enabling of SHA-384/512. Noted by - Nelson H. F. Beebe. + * configure.ac: Removed OpenSC detection and options. + * acinclude.m4: Ditto. -2006-02-18 David Shaw +2005-04-21 Werner Koch - * 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. + Released 1.9.16. + + * configure.ac: Do not build gpg by default. -2006-02-14 Werner Koch +2005-04-20 Werner Koch - Released 1.4.3rc1. + * configure.ac: Test whether GPG_ERR_LOCKED is declared and + provide a replacement if not. -2006-02-09 Werner Koch +2005-04-15 Werner Koch - * configure.ac: Check for fcntl and ftruncate. + * configure.ac: Require libksba 0.9.11. -2006-01-22 David Shaw +2005-04-15 Marcus Brinkmann - * configure.ac: Add define for EXEEXT so we can find keyserver - helpers on systems that use extensions. + * configure.ac: Check for /usr/bin/shred and define SHRED. + + * configure.ac: Add --enable-symcryptrun, disabled by default. + Define automake variable BUILD_SYMCRYPTRUN. + Check for openpty -lutil, define LIBUTIL_LIBS. -2005-12-23 David Shaw +2005-03-03 Werner Koch - * configure.ac: Add switch for DNS CERT. - -2005-12-22 David Shaw - - * 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 - - * NEWS: Note --fetch-keys. - -2005-12-06 David Shaw - - * configure.ac: UINT64_C test needs #include . - - * 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 - - * NEWS: Note backsigs, the xxxxx-clean options, and the - xxxxx-minimal options. - -2005-11-02 David Shaw - - * configure.ac: Check for a getpagesize() declaration. - -2005-10-14 David Shaw - - * 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 - - * 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 - - * configure.ac: Changed identification file name to g10/gpg.c - -2005-10-02 Marcus Brinkmann - - * configure.ac [!$try_gettext]: Invoke AM_PO_SUBDIRS. - -2005-08-31 David Shaw - - * configure.ac: Check for getpwnam, getpwuid, and pwd.h. - -2005-08-09 David Shaw - - * configure.ac: Remove hardcoded -I and -L for /usr/local on - FreeBSD. - -2005-08-04 David Shaw - - * configure.ac: Call GNUPG_CHECK_USTAR and generate tools/gpg-zip. - -2005-07-28 Werner Koch - - * configure.ac (USE_DNS_PKA): Define in addition to USE_DNS_SRV. - -2005-07-27 Werner Koch - - 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 - - * 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 - - Released 1.4.2. - -2005-07-20 David Shaw - - * configure.ac: Add a define for FAKE_CURL. - -2005-07-19 Werner Koch - - * configure.ac [W32]: Always set DISABLE_KEYSERVER_PATH. - -2005-06-21 Werner Koch - - Released 1.4.2rc2. - -2005-06-20 David Shaw - - * NEWS: Note key cleaning commands. - -2005-06-13 David Shaw - - * configure.ac: Add check for no-pointer-sign warning keyword, and - disable. This is gcc4 specific. - -2005-05-31 Werner Koch - - Released 1.4.2rc1. - - * README: Add a note on GnuPG 1.9. - - Updated FSF address in all files. - -2005-05-26 David Shaw - - * NEWS: Note command completion and the new curl-based HKP helper. - -2005-04-16 David Shaw - - * 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 - - * configure.ac: Check for memrchr() - -2005-03-31 Werner Koch - - * 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 - - * configure.ac: Move the LDAP detecting code to m4/ldap.m4. - -2005-03-15 Werner Koch - - Released 1.4.1. - -2005-03-11 Werner Koch - - * configure.ac: New option --enable-noexecstack. - -2005-02-16 Werner Koch - - Released 1.4.1rc2. - -2005-02-11 David Shaw - - * configure.ac: Add --enable-fake-curl option to help test no-curl - HTTP. - - * NEWS: Note Mister/Zuccherato CFB countermeasures. - -2005-02-04 Werner Koch - - * configure.ac (GNUPG_CHECK_GNUMAKE): Removed. Not needed for - decent automakes. - -2005-02-03 David Shaw - - * NEWS: Fix typo. + * acinclude.m4 (GNUPG_PTH_VERSION_CHECK): Accidently used + --ldflags instead of --cflags. Reported by Kazu Yamamoto. 2005-02-03 Werner Koch - Released 1.4.1rc1. - -2005-01-22 David Shaw - - * 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 - - * configure.ac (HAVE_W32_SYSTEM): Define it. - -2005-01-18 David Shaw - - * 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. + * AUTHORS: Copied from 1.4 and edited to refelct the changes in + 1.9. 2005-01-17 Werner Koch - * README: Updated for SHA1 checksums. + * configure.ac: Make --without-included-regex work as expected. + Fixed FTP location info for some libraries. - * configure.ac: Make --without-included-zlib work as - expected. Reported by Norihiko Murase. Same for - --without-included-regex. +2005-01-13 Werner Koch -2005-01-03 David Shaw + Released 1.9.15. - * configure.ac: Use new GNUPG_CHECK_LIBUSB macro. + * acinclude.m4 (GNUPG_PTH_VERSION_CHECK): Link a simple test + program to see whether the installation is sane. -2004-12-28 David Shaw +2005-01-07 Werner Koch - * 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. + * configure.ac: Require gpg-error 1.0. -2004-12-24 David Shaw +2005-01-04 Werner Koch - * 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. + * configure.ac: Remove hack not to build gpg2 for W32. + * autogen.sh : Pass option --disable-gpg instead. -2004-12-22 David Shaw +2004-12-22 Werner Koch - * 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. + Released 1.9.14. -2004-12-21 David Shaw +2004-12-20 Werner Koch - * configure.ac: Add check for --enable-ftp. It is disabled by - default for now. - -2004-12-18 David Shaw - - * configure.ac: Call the new GNUPG_CHECK_READLINE macro for - readline stuff. - -2004-12-17 David Shaw - - * configure.ac: Add a --with-ldap=DIR so people can add to the - search path. - -2004-12-16 David Shaw - - * configure.ac: Check for arpa/nameser.h. - -2004-12-16 Werner Koch - - * THANKS: Added John Clizbe for help testing the 1.4.0a W32 - binary. - -2004-12-16 Werner Koch - - Released 1.4.0. - -2004-12-14 Werner Koch - - Released 1.3.93. + * configure.ac: Add PATHSEP_C and PATHSEP_S. For W32 let all + directories default to c:/gnupg. Require libassuan 0.6.9. - * Makefile.am (AUTOMAKE_OPTIONS): Add filename-length-max=99. +2004-12-18 Werner Koch -2004-11-06 David Shaw + * configure.ac (AH_BOTTOM): Define EXEEXT_S. - * configure.ac: Autodetect wldap32 on Windoze. + * autogen.sh: Updated --build-w32 feature. -2004-11-04 David Shaw +2004-12-15 Werner Koch - * README, configure.ac: Add --enable-backsigs to enable the - experimental backsigs code. + * Makefile.am (SUBDIRS) [W32]: Do not build in tests/. -2004-11-04 Werner Koch + * acinclude.m4: Add proper macro name quoting for use with + automake 1.9. - * AUTHORS: Use Maxim Britov. I am not that accustomed to the - Russian way of writing names. + * configure.ac: Add replacement check for ttyname. + Removed support for a included zlib. -2004-10-28 Werner Koch +2004-12-06 Werner Koch - Released 1.3.92. + * configure.ac (have_w32_system): New. Disable Pth checks for W32. + Link jnlib/w32-pth.h to pth.h. -2004-10-26 Werner Koch +2004-12-03 Werner Koch - * 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. + Released 1.9.13. -2004-10-21 David Shaw +2004-11-26 Werner Koch - * acinclude.m4: aclocal 1.9 wants quoting on AC_DEFUN arguments. + * configure.ac: Replace strsep. Replaced use of "target" by + "host". + +2004-10-22 Werner Koch -2004-10-21 Werner Koch + Released 1.9.12. - * configure.ac: Remove the check for asprintf + * Makefile.am (AUTOMAKE_OPTIONS): Set option to create bzip2 tarball. -2004-10-15 Werner Koch +2004-10-01 Werner Koch - Released 1.3.91. + Released 1.9.11. - * README: Mentioned --enable-selinux-support. +2004-09-30 Werner Koch -2004-10-15 David Shaw + * README: Minor updates. - * NEWS: Note gpgkeys_finger, keyserver timeouts, and the direct - trust model. +2004-09-30 gettextize -2004-10-15 Werner Koch + * configure.ac (AM_GNU_GETTEXT_VERSION): Bump to 0.14.1. - * Makefile.am (DISTCHECK_CONFIGURE_FLAGS): New. - (AUTOMAKE_OPTIONS): New. +2004-08-16 Werner Koch - * configure.ac: Check whether vasprintf needs a replacement. + * configure.ac: Build Makefile for tests/pkits. New option + --with-pkits-tests. + +2004-08-05 Werner Koch -2004-10-13 Werner Koch + * configure.ac: Changed tests for libusb to also suuport the + stable version 0.1.x. - * configure.ac: Actually name the option --disable-finger and not - http. Add option --enable-selinux-support. +2004-07-22 Werner Koch -2004-10-11 Werner Koch + Released 1.9.10. - * configure.ac: New option --disable-finger. + * configure.ac: Define AM conditional HAVE_OPENSC. -2004-09-17 Werner Koch +2004-07-21 Werner Koch - * configure.ac: Don't check for usb_create_match or - use_get_string_simple anymore. + * configure.ac: Don't set DIE to no after it might has been set to + yes. -2004-09-15 David Shaw +2004-07-20 Werner Koch - * configure.ac: Give warning when using capabilities. Check for - usb_get_string_simple for old libusb reasons. + * Makefile.am (sm): Build kbx only if gpgsm is to be build. -2004-09-10 David Shaw +2004-07-20 Werner Koch - * NEWS: Note HTTP basic auth. + * configure.ac: New option --enable-agent-only. - * configure.ac: Check for usb_get_busses since very old stable - libusb doesn't have it. +2004-06-08 Werner Koch -2004-09-09 Werner Koch + Released 1.9.9. - * README: Doc --disable-card-support and --without-readline. +2004-06-06 Werner Koch - * 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. + * configure.ac: Require libksba 0.9.7. -2004-07-27 Werner Koch +2004-04-29 Werner Koch - * configure.ac (AM_GNU_GETTEXT_VERSION): New. - (min_automake_version): New. + Released 1.9.8. -2004-05-24 David Shaw +2004-04-20 Werner Koch - * configure.ac: Try for wldap32 on Win32 platforms. + * configure.ac: Remove the fopencookie test. We don't need the + dummy function because we conditionally use fopencookie, + fpencookie or a replacement at place. -2004-05-22 Werner Koch +2004-04-02 Thomas Schwinge - Releases 1.3.6. + * autogen.sh: Added ACLOCAL_FLAGS. -2004-05-21 David Shaw +2004-04-06 Werner Koch - * NEWS: Note --sig-keyserver-url and the ability to use a - preferred keyserver in a regular data sig to fetch the signing - key. + Released 1.9.7. - * configure.ac: Replacement function for timegm(). No need to - check for setenv() any longer. + * configure.ac: Require libgcrypt 1.1.94. + Introduce PACKAGE_GT and set it to gnupg2. -2004-05-20 David Shaw +2004-03-23 Werner Koch - * NEWS: Note HTTP key fetching. + * configure.ac: Define SAFE_VERSION_DASH and SAFE_VERSION_DOT. - * README: Update version and note that HKP is no longer build in. +2004-03-09 Werner Koch - * configure.ac: Handle --disable-http and other code to properly - build gpgkeys_http. + * configure.ac (NEED_GPG_ERROR_VERSION): Set to 0.7. -2004-05-19 David Shaw +2004-03-06 Werner Koch - * 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. + Released 1.9.6. + + * configure.ac: Check the Libgcrypt API. - * acinclude.m4 (GNUPG_SYS_NM_PARSE): Remove a leftover slash in a - sed expression. +2004-02-25 Werner Koch -2004-05-01 Werner Koch + * configure.ac: New option --disable-threads to inhibit + unintentional builds without Pth. - * acinclude.m4 (ac_pipe_works): Fixed BRE syntax \? -> \{0,1\}. - Reported by Todd Vierling. +2004-02-21 Werner Koch -2004-02-26 Werner Koch + Released 1.9.5. - Released 1.3.5. +2004-02-20 Werner Koch -2004-02-25 David Shaw + * configure.ac: Fixed URLs in the notice messages. - * README: Update copyright. +2004-02-18 Werner Koch - * 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. + * acinclude.m4: Removed macros to detect gpg-error, libgcrypt, + libassuan and ksba as they are now distributed in m4/. -2004-02-20 David Shaw +2004-02-13 Werner Koch - * configure.ac: Check for timegm(). Replacement functions for - setenv() and unsetenv(). + * configure.ac: Require libksba 0.9.4 and libgcrypt 1.1.92. -2004-02-19 David Shaw +2004-02-12 Werner Koch - * configure.ac: Check for ln -s and add GPGKEYS_LDAP conditional, - both for making gpgkeys_ldaps symlink to gpgkeys_ldap. + * autogen.sh: Removed cruft from debugging. - * 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. + * am/cmacros.am: New. -2004-01-27 David Shaw +2004-02-11 Werner Koch - * NEWS: Note --enable-key-cache, the OpenBSD/i386 and HPPA fixes, - and Elgamal removal. + * configure.ac: Removed the need for g10defs.h. Reworked the + --with-foo-pgm stuff. - * README, configure.ac: Add --enable-key-cache=SIZE configure - option. This sets the key/uid cache size. Default is 4096. + * autogen.sh (check_version): Removed bashism and simplified. + * acinclude.m4 (AM_PATH_OPENSC): Kludge to avoid error output for + a bad opensc-config. -2004-01-11 David Shaw +2004-01-30 Werner Koch - * 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. + Released 1.9.4. - * THANKS: Added Phong Nguyen, who found the Elgamal signing key - problem. + * configure.ac: Require libksba 0.9.3 due to another bug fix there. + +2004-01-29 Werner Koch + + * README: Updated. + + * configure.ac: Require libksba 0.9.2 due to bug fixes. + +2004-01-24 Werner Koch + + * configure.ac: Now requires libassuan 0.6.3. 2003-12-23 Werner Koch - * configure.ac: Use -Wformat-nonliteral in maintainer-mode. + Released 1.9.3. -2003-11-30 David Shaw + * README-alpha: Removed. + * configure.ac, Makefile.am: Add the tests and tools directories. - * NEWS: Note --disable-rsa. +2003-12-19 Werner Koch - * configure.ac: Add --disable-rsa. + * configure.ac: Now require libgcrypt 1.1.91 to help testing the + latest libgcrypt changes. Requires libksab 0.9.1. - * README: Add --with-zlib, --with-bzip2, --without-bzip2, - --disable-rsa, and --enable-minimal. Update gettext version. +2003-12-17 Werner Koch - * README: Update version number. Add BZIP2. Remove Elgamal - sign+encrypt. + * configure.ac: Requires now libassuan 0.6.2. + (CFLAGS): Add --Wformat-noliteral in gcc mode. -2003-11-27 Werner Koch +2003-12-16 Werner Koch - Released 1.3.4. + * configure.ac: Check for funopen and fopencookie as part of the + jnlib checks. -2003-11-27 David Shaw +2003-12-09 Werner Koch - * NEWS: Note that we won't encrypt to an Elgamal sign+encrypt key - any longer. + * configure.ac: Add a min_automake_version. + * README.CVS: New. + * autogen.sh: Revamped except for the --build-w32 hack. + * Makefile.am: Add README.CVS - * configure.ac: Use MSG_NOTICE instead of MSG_WARN for less - serious notifications. +2003-11-17 Werner Koch - * NEWS: I meant "less" not "more". - -2003-11-12 David Shaw - - * 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 - - * configure.ac: Locate libbz2 for bzip2 compression support. - -2003-10-26 David Shaw - - * 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 - - * 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. + Release 1.9.2. -2003-10-24 David Shaw + * configure.ac: Requires now libassuan 0.6.1. - * configure.ac (DLLIBS): Work properly on platforms where dlopen - and friends are in libc instead of libdl. +2003-10-31 Werner Koch -2003-10-24 Werner Koch - - * configure.ac (DLLIBS): Fixed last change. - -2003-10-23 Werner Koch - - * configure.ac (DLLIBS): Do not include -ldl in the mingw32 case. + * configure.ac (NEED_KSBA_VERSION): Set to 0.9.0 due the changed + time interface. 2003-10-21 Werner Koch @@ -642,1352 +388,306 @@ Hurd; Robert Millan reported that the uname test is now sufficient. -2003-10-16 David Shaw - - * configure.ac: Include -ldl when card support is used. - -2003-10-10 Werner Koch - - Release 1.3.3. - -2003-10-09 David Shaw - - * NEWS: Note multiple Comment: support and --sig-keyserver-url. - 2003-10-01 Werner Koch * configure.ac (AH_BOTTOM): Define GNUPG_MAJOR_VERSION. - (ENABLE_CARD_SUPPORT): Define as automake conditional. -2003-09-30 David Shaw +2003-09-23 Werner Koch - * 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 - - * configure.ac (LIBUSB_LIBS,HAVE_LIBUSB): Check for Libusb. - (--enable-card-support): New. - -2003-09-04 David Shaw - - * configure.ac: Drop TIGER/192 support. Check for UINT64_C to go - along with uint64_t. - -2003-09-01 David Shaw - - * 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 - - * AUTHORS, THANKS: Updates from stable. - -2003-08-25 David Shaw - - * 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 - - * 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 - - * 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 - - * configure.ac: Define SAFE_VERSION so that RISCOS can override it - and remove invalid chars. - -2003-05-30 David Shaw - - * 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 - - Released 1.3.2. - -2003-05-26 David Shaw - - * NEWS: Document --gnupg and the deprecation of --no-openpgp and - --no-pgpX. - -2003-05-24 David Shaw - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * Makefile.am (EXTRA_DIST): Add autogen.sh wrapper. - -2003-04-07 David Shaw - - * 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 - - * 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 - - * 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 - - * configure.ac: Define @CAPLIBS@ to link in -lcap if we are using - capabilities. - -2003-02-22 David Shaw - - * 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 - - * 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 - - * 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 - - * NEWS: Add notes about disabled keys, trustdb tweaks, and - "revuid". - -2002-12-27 David Shaw - - * NEWS: Add note about convert-from-106 script. - -2002-11-25 David Shaw - - * 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 - - * 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 - - Released 1.3.1 - -2002-11-03 David Shaw - - * NEWS: Note trust signature support, - --hidden-encrypt-to/--hidden-recipient, and long algorithm name - support everywhere. - -2002-10-31 David Shaw - - * 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 - - * 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 - - * configure.ac: Regex tests adapted from mutt to decide whether to - use the internal regex code or not. - -2002-10-18 Werner Koch - - Released 1.3.0. + Merged most of David Shaw's changes in 1.3 since 2003-06-03. - * 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 - - * README: Multiple A record rotation works with MINGW32 now, and - clarify how it works with LDAP. - -2002-10-16 David Shaw - - * README: Some typo fixes from Florian Weimer, and bump version - number. - -2002-10-15 David Shaw - - * NEWS: Some 1.3 notes. - -2002-10-12 Werner Koch - - * configure.ac (NAME_OF_DEV_URANDOM): Use /dev/urandom for - NetBSD. Reported by Christian Biere. - -2002-10-07 David Shaw - - * 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 - - * configure.ac: Add an --enable-old-tiger, to revert back to the - old OID. - -2002-09-27 David Shaw - - * configure.ac: Remove --enable-tiger, as TIGER is now always - enabled. - -2002-09-25 David Shaw - - * configure.ac: Add NETLIBS to EGDLIBS when using EGD as EGD uses - sockets. - -2002-09-24 David Shaw - - * 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 - - * configure.ac: Try linking LDAP as just -lldap as it seems very - recent OpenLDAPs (>=2.0.23) support that. - -2002-09-14 David Shaw - - * 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 - - * NEWS: Note that the old IDEA plugin won't work with post-1.1.90 - gpg. - -2002-09-12 David Shaw - - * 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 - - 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 - - * 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 - - * README: Removed the note about a development version so that we - later don't forget this. Minor other changes. - -2002-08-29 Werner Koch - - * 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 - - * 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 - - * 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 - - * configure.ac: Add an --enable-tiger. - - * NEWS: Clarify new permission checks. - -2002-08-07 David Shaw - - * 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 - - * configure.ac: Bumbed version number. - -2002-08-04 Werner Koch - - Released 1.1.91. - - * configure.ac (ALL_LINGUAS): Added Catalan. - -2002-08-02 Werner Koch - - * 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 - - * README, configure.ac: --with-exec-path is now clarified into - --disable-keyserver-path - - * NEWS: changes since 1.1.90. - -2002-07-24 David Shaw - - * configure.ac: Include a GNUPG_LIBEXECDIR in g10defs.h, as well - as a SUBST for Makefiles. - -2002-07-22 Timo Schulz - - * configure.ac: Replace the 'c:/' variables with 'c:\' due - to the fact we already use '\' in the remaining code. + * configure.ac: Drop all TIGER/192 support. + (uint64_t): Check for UINT64_C to go along with uint64_t. + (getaddrinfo): Check for it. + (sigset_t): 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. + (W32LIBS): 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. + +2003-09-06 Werner Koch + + Released 1.9.1. -2002-07-08 David Shaw + * configure.ac: Require newer versions of some libraries. - * configure.ac: Add --with-mailprog to override the use of - sendmail with another MTA. We can use anything that follows the - "$MAILPROG -t" convention. +2003-09-02 Werner Koch -2002-07-04 David Shaw + * configure.ac (HAVE_LIBUSB): Added a simple test for libusb. - * configure.ac: --enable-exec-path should be a 'with'. Fix 'no' - cases of --with-exec-path and --with-photo-viewer. +2003-08-19 Marcus Brinkmann - * README: Document --disable-exec, --disable-photo-viewers, - --disable-keyserver-helpers, --enable-exec-path, and - --with-photo-viewer. + * configure.ac (AM_PATH_GPG_ERROR): Add missing comma in + invocation. - * 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. +2003-08-06 Werner Koch -2002-07-03 David Shaw + * configure.ac: Check for libgpg-error. Print infos about missing + libraries more nicely. + * acinclude.m4 (AM_PATH_GPG_ERROR): Added. - * configure.ac: Allow setting USE_EXEC_PATH to lock the exec-path - to a fixed value. +2003-08-05 Werner Koch + + Released 1.9.0. + + * configure.ac (GNUPG_DEFAULT_HONMEDIR): Changed back to ~/.gnupg. + +2003-07-31 Werner Koch + + * Makefile.am (DISTCLEANFILES): Add g10defs.h + +2003-06-18 Werner Koch + + * configure.ac (GNUPG_DEFAULT_HOMEDIR): Changed temporary to + .gnupg2 to avoid accidential use with production keys. + +2003-06-11 Werner Koch + + * configure.ac: Merged all stuff from current 1.3 version in. + * acinclude.m4: Merged required macros from current 1.2 version in. + +2003-06-04 Werner Koch + + * configure.ac, Makefile.am: Enable building of gpg. + +2003-04-29 Werner Koch + + * configure.ac: Build a limited version of scdaemon if libopensc + is not available. + + * configure.ac (ALL_LINUGAS): Removed. + + * Makefile.am (ACLOCAL_AMFLAGS): New. + * configure.ac (AM_GNU_GETTEXT_VERSION): New. Set to 0.11.5. + +2003-04-29 gettextize + + * Makefile.am (SUBDIRS): Add m4. + (ACLOCAL_AMFLAGS): New variable. + (EXTRA_DIST): Add scripts/config.rpath. + * configure.ac (AC_CONFIG_FILES): Add m4/Makefile. + +2003-04-29 Werner Koch + + * assuan/ : Removed. We now use libassuan. + * Makefile.am (SUBDIRS): Removed assuan + + * configure.ac: Check for libassuan. + +2003-01-09 Werner Koch + + * configure.ac (GNUPG_PROTECT_TOOL): New option --with-protect-tool. + (NEED_KSBA_VERSION): Does now require 0.4.6. + + * README: Noted where to find gpg-protect-tool. + +2002-10-31 Neal H. Walfield + + * configure.ac: Check for flockfile and funlockfile. Check for + isascii and putc_unlocked replacing them if not found. + + * configure.ac (PTH_LIBS): If pth is found, add the output of + `$PTH_CONFIG --ldflags`, not just `$PTH_CONFIG --libs`. + +2002-10-19 Werner Koch + + * configure.ac: Bumped version number to 1.9.0-cvs. + + NewPG (Aegypten project) to GnuPG merge. + +2002-09-20 Werner Koch + + Released 0.9.2. + +2002-09-05 Neal H. Walfield + + * configure.ac: Check for makeinfo. + +2002-09-03 Neal H. Walfield + + * autogen.sh (have_version): New function. Generalize and + simplify logic for finding and determining the versions of GNU + programs. Use it. + +2002-08-23 Werner Koch + + Released 0.9.1. + + * acinclude.m4 (AM_PATH_LIBGCRYPT): Updated from Libgcrypt. + (AM_PATH_OPENSC): Strip non-digits from the micro version. + +2002-08-21 Werner Koch + + Released 0.9.0. + + * configure.ac: Changed the default homedir to .gnupg. + * README-alpha: Removed. + +2002-08-19 Werner Koch + + * acinclude.m4: Removed -lpcsclite from KSBA_LIBS; copy+paste bug. + +2002-08-13 Werner Koch + + * acinclude.m4 (AM_PATH_OPENSC, AM_PATH_KSBA): New. + * configure.ac: Use them. + +2002-08-10 Werner Koch + + Released 0.3.10. + + * configure.ac (NEED_LIBKSBA_VERSION): Require 0.4.4. Add support + for gettext. + +2002-07-22 Werner Koch + + * configure.ac: Check for ftello and provide a replacement. 2002-07-01 Werner Koch - * configure.ac: Set version number to 1.1.91. - - Released 1.1.90. + Released 0.3.9. - * 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 - - * configure.ac: Link W32 version against libwsock32. + * README: Short note on how to export in pkcs-12 format. 2002-06-29 Werner Koch - * configure.ac (development_version): New. - (HAVE_DEV_RANDOM_IOCTL): Removed test for it; it was never used. + * configure.ac: Define --with options to set the default location + of the agent, scdaemon, pinentry and dirmngr. - * BUGS, AUTHORS: Add a note on how to send security related bug - reports. +2002-06-27 Werner Koch -2002-06-20 David Shaw + * README: Short blurb on how to import a PKCS-12 file. - * NEWS: changes since 1.0.7. + * configure.ac (AH_BOTTOM): New to define some constants. - * configure.ac: Set new version number (1.1.90), and fix Solaris - compiler flags for shared objects. +2002-06-25 Werner Koch -2002-06-11 David Shaw - - * 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. + Released 0.3.8. -2002-06-05 David Shaw + * configure.ac (NEED_LIBGCRYPT_VERSION): Set to 1.1.8. - * configure.ac: Add a switch for the experimental external HKP - keyserver interface. +2002-06-12 Werner Koch -2002-05-22 Werner Koch + * configure.ac (NEED_LIBKSBA_VERSION): We need 0.4.3 now. - * configure.ac: Check for strcasecmp and strncasecmp. Removed - stricmp and memicmp checks. +2002-06-04 Werner Koch -2002-05-08 David Shaw + Released 0.3.7. - * configure.ac: If LDAP comes up unusable, try #including - before giving up. Old versions of OpenLDAP require that. +2002-05-21 Werner Koch -2002-05-03 David Shaw + * configure.ac: We now require libgcrypt 1.1.7 and libksba 0.4.2. - * configure.ac: In g10defs.h, use \ for the directory separator - when HAVE_DOSISH_SYSTEM is on. +2002-05-14 Werner Koch - * 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. + * doc/: New + * configure.ac, Makefile.am: Added doc/ -2002-04-30 David Shaw +2002-05-03 Werner Koch - * 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 - - Released 1.0.7. - - * README: Fixed some minor things. + Released 0.3.6. 2002-04-25 Werner Koch - * configure.ac: Check for locale.h and setlocale + * configure.ac: Check for setlocale. -2002-04-24 David Shaw +2002-04-24 Marcus Brinkmann - * Update NEWS with recent changes. + * configure.ac: Check for locale.h. -2002-04-19 Werner Koch +2002-04-15 Werner Koch - Released 1.0.6e snapshot. + Released 0.3.5. + + * NEWS: Started to describe release notes. + + * configure.ac (NEED_LIBKSBA_VERSION, NEED_LIBGCRYPT_VERSION): Defined -2002-04-12 Werner Koch +2002-04-01 Werner Koch - * configure.ac: Add a warning note to the definition of the - EXTSEP macros. + Released 0.3.4. -2002-04-09 Werner Koch +2002-03-18 Werner Koch - * configure.ac (ALL_LINGUAS): Added Czech, Galician and Greek - translations. s/es_ES/es/. + Released 0.3.3. + +2002-03-08 Werner Koch + + * README: Add some explanation on how to specify a user ID. 2002-03-06 Werner Koch - * configure.ac (ALL_LINGUAS): s/pt_PT/pt/ + Released 0.3.2. -2002-03-04 David Shaw +2002-03-04 Werner Koch - * 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. + Released 0.3.1. -2002-03-03 Werner Koch + * README: Explained some options and files. - Release 1.0.6d snapshot. +2002-02-14 Werner Koch -2002-01-04 David Shaw + * configure.ac: Fixed status messages related to presence of Pth. - * NEWS: about symmetric messages and fixed file sizes. +2002-02-13 Werner Koch -2001-12-22 Werner Koch + * acinclude.m4 (GNUPG_SYS_SO_PEERCRED): New. + * configure.ac: use it. - Released 1.0.6c snapshot. - - * configure.ac (AH_BOTTOM): Moved EXEC_TEMPFILE_ONLY to here. +2002-02-12 Werner Koch - * acconfig.h: Removed, it should no longer be used. + * configure.ac: Check for PTH. Provide replacement fucntions for + apsrintf and fopencookie. -2001-12-21 David Shaw + * acinclude.m4 (GNUPG_PTH_VERSION_CHECK): New. - * Add an acconfig.h to define EXEC_TEMPFILE_ONLY on platforms that - can't do fork/exec. +2002-02-07 Werner Koch -2001-12-21 Werner Koch + Released 0.3.0. - * Makefile.am (dist-hook): We should also look in include for - distfiles. - (EXTRA_DIST): Remove VERSION because it is generated by dist-hook. + * configure.ac: Require libgcrypt 1.1.6. -2001-12-20 David Shaw +2002-02-01 Marcus Brinkmann - * configure.ac: replacement function for mkdtemp() + * configure.ac (KSBA_CONFIG): Remove superfluous x in front of + variable. -2001-12-19 David Shaw +2002-01-26 Werner Koch - * configure.ac: Check for stat() + * configure.ac: Add options to disable the build of some programs + and print a configure status at the end. + * acinclude.m4 (GNUPG_BUILD_PROGRAM): New. -2001-12-19 Werner Koch + * scd/ : New. Added to Makefile and configure. + * configure.ac: Check for libopensc + * Makefile.am: Build scd only when libopensc is available - * acinclude.m4 (GNUPG_SYS_SYMBOL_UNDERSCORE): Support Cygwin target - * configure.ac [CYGWIN32]: Don't build tiger. By Disastry. +2002-01-23 Werner Koch + + * configure.ac (mkdtemp): See whether we have to provide a + replacement. 2001-12-18 Werner Koch - * 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. + Released 0.0.0. -2001-10-23 Werner Koch +2001-12-17 Werner Koch - Released 1.0.6b snapshot. + * acinclude.m4: Add AM_PATH_LIBGCRYPT macro. + * configure.ac: and use it here. Figure out the location of libksba -2001-10-22 Werner Koch +2001-12-15 Werner Koch - * configure.ac: Fixed for automake 1.5 + * configure.ac (missing_dir): Bail out if asprintf and fopencookie + are not available. -2001-10-17 Werner Koch +2001-12-04 Werner Koch - * README: Removed note on local_ID. + * configure.ac (HAVE_JNLIB_LOGGING): always define it. -2001-09-28 Werner Koch - - * 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 - - * configure.ac [MINGW32]: Switched from wsock.dll to ws2_32.dll. - -2001-09-09 Werner Koch - - * 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 - - * configure.ac: Test for strsep(). - -2001-09-03 Werner Koch - - * configure.ac: Removed GDBM tests. - -2001-08-23 Werner Koch - - * configure.in (AC_FUNC_FSEEKO): Add. - (AC_CHECK_FUNCS): Remove fseeko. By Paul Eggert . - -2001-08-22 Werner Koch - - * 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 - - * 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 - - * configure.ac (VERSION,PACKAGE): Fixed quoting. - -2001-07-26 Werner Koch - - * 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 - - 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 - - * configure.in (DYNLINK_MOD_CFLAGS): Use -shared with dec-osf. - Reported by Chris Adams. Merged some cases. - -2001-05-29 Werner Koch - - Released version 1.0.6. - -2001-05-28 Werner Koch - - * configure.in (BUILD_INCLUDED_LIBINTL): Set to no for W32. - -2001-04-29 Werner Koch - - Released version 1.0.5. - -2001-04-28 Werner Koch - - Updated all copyright notices. - -2001-04-27 Werner Koch - - * README: Removed a few outdated paragraphs. - -2001-04-17 Werner Koch - - * 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 - - * configure.in (ALL_LINGUAS): Add Turkish translation. Thanks - to Nilgun Belma Buguner. - -2001-03-18 Werner Koch - - * configure.in: Hardwire the use of -lsocket for some - systems. Thanks to Reinhard Wobst. - -2001-03-13 Werner Koch - - * configure.in: Add copyright notice and -lwsock32. - -2001-03-12 Werner Koch - - * INSTALL: Add a note to VPATH builds. - -2001-03-08 Werner Koch - - * debian/: Applied update from James. - - Added copyright and license notices to some more files. - -2001-01-18 Werner Koch - - * configure.in: Removed tool definitions for MingW32 - -2000-11-17 Werner Koch - - * acinclude.m4 (GNUPG_CHECK_FAQPROG): Do not prinnt the warning. - -2000-11-11 Paul Eggert - - 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 - - * configure.in: Disabled fopen64 checks for Solaris and HPUX. - -2000-10-13 Werner Koch - - * configure.in: Append mpi/mpi-asm-defs.h to g10defs.h - -2000-10-09 Werner Koch - - * acinclude.m4: Changed wording of the faqprog.pl warning. - -Wed Oct 4 15:50:18 CEST 2000 Werner Koch - - * 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 - - * 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 - - * configure.in: Check for fstat64 and fopen64 - -Wed Sep 6 14:59:09 CEST 2000 Werner Koch - - * configure.in (GNUPG_HOMEDIR): New. - -Fri Aug 25 16:05:38 CEST 2000 Werner Koch - - * 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 - - * acinclude.m4 (GNUPG_CHECK_MLOCK): Removed that silly mkdir(). - -Wed Jul 19 11:26:43 CEST 2000 Werner Koch - - * configure.in (mingw32): Changes to allow for mingw32msvc - -Fri Jul 14 10:17:30 CEST 2000 Werner Koch - - * acinclude.m4 (GNUPG_CHECK_MLOCK): Fixed syntax error in C code. - -Wed Jul 12 13:32:06 CEST 2000 Werner Koch - - Version 1.0.2 - -Fri Jun 9 10:09:52 CEST 2000 Werner Koch - - * configure.in: Add check for termio.h, wait unctiosn and sigaction. - -Wed Jun 7 19:19:09 CEST 2000 Werner Koch - - * 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 - - * 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 - - Version 1.0.1-ePit-1 - -Sun May 28 13:55:17 CEST 2000 Werner Koch - - * acinclude.m4 (GNUPG_SYS_NM_PARSE): Added BSDI support. - (GNUPG_CHECK_RDYNAMIC): Ditto. - -Wed Apr 19 10:57:26 CEST 2000 Werner Koch - - * acconfig.h (HAVE_MLOCK): Added - -Wed Mar 22 13:50:24 CET 2000 Werner Koch - - * 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 - - * 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 - - * 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 - - * configure.in: Add check for clock_gettime - -Wed Feb 23 10:07:57 CET 2000 Werner Koch - - * configure.in (ALL_LINGUAS): Add nl. - -Wed Feb 16 16:25:09 CET 2000 Werner Koch - - * configure.in (ALL_LINGUAS): Add Esperanto. - -Wed Feb 16 14:09:00 CET 2000 Werner Koch - - * 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 - - * 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 - - * 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 - - * 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 - - * INSTALL: Add a hint for AIX. By Jos Backus. - -Sat Dec 4 12:30:28 CET 1999 Werner Koch - - * 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 - - * BUGS: Replaced content with a link to the online list. - -Fri Nov 12 20:33:19 CET 1999 Werner Koch - - * README: Fixed a type and add a note about the gnupg-i18n ML. - -Thu Oct 28 16:08:20 CEST 1999 Werner Koch - - * acinclude.m4, configure.in (GNUPG_CHECK_GNUMAKE): New. - -Sat Oct 9 20:34:41 CEST 1999 Werner Koch - - * 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 - - * 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 - - * textfilter.c (copy_clearsig_text) [__MINGW32__): Use CR,LF. - -Fri Sep 17 12:56:42 CEST 1999 Werner Koch - - * 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 - - * 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 - - * VERSION: Set to 1.0.0. - -Mon Sep 6 19:59:08 CEST 1999 Werner Koch - - * 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 - - * VERSION: Set to 0.9.11. - -Tue Aug 31 17:20:44 CEST 1999 Werner Koch - - * 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 - - * configure.in: Some support for DJGPP (Mark Elbrecht) - -Wed Aug 4 10:34:46 CEST 1999 Werner Koch - - * VERSION: Set to 0.9.10. - -Mon Jul 26 09:34:46 CEST 1999 Werner Koch - - * 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 - - * 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 - - * acinclude.m4 (GNUPG_SYS_SYMBOL_UNDERSCORE): Fixed last modification. - -Wed Jul 7 13:08:40 CEST 1999 Werner Koch - - * Makefile.am: Support for libtool. - * configure.in: Ditto. - -Tue Jun 29 21:44:25 CEST 1999 Werner Koch - - * 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 - - * 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 - - * configure.in: Add test for docbook-to-man - -Tue Jun 15 12:21:08 CEST 1999 Werner Koch - - * acinclude.m4 (GNUPG_SYS_NM_PARSE): Support for {net,free}bsd, - -Thu Jun 10 14:18:23 CEST 1999 Werner Koch - - * configure.in (ZLIB,GDBM): Check both, header and lib. - -Sat Jun 5 15:30:33 CEST 1999 Werner Koch - - * pkclist.c (key_present_in_pk_list): New (Michael). - -Tue May 25 19:50:32 CEST 1999 Werner Koch - - * configure.in (IS_DEVELOPMENT_VERSION): Fixed detection. - -Sun May 23 14:20:22 CEST 1999 Werner Koch - - * acinclude.m4 (GNUPG_SYS_SYMBOL_UNDERSCORE): assume yes when - cross-compiling. - -Mon May 17 21:54:43 CEST 1999 Werner Koch - - * configure.in (socket): Fix for Unisys by Katsuhiro Kondou. - -Sat May 8 19:28:08 CEST 1999 Werner Koch - - * NEWS: Add a marker line which I forgot to do for 0.9.6. - -Thu May 6 14:18:17 CEST 1999 Werner Koch - - * README: Minor updates - - * VERSION: Now 0.9.6 - -Thu Apr 8 09:35:53 CEST 1999 Werner Koch - - * 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 - - * Makefile.am (g10defs.h): Removed. - * configure.in (AC_OUTPUT_COMMANDS): Create g10defs.h - -Sat Mar 20 12:55:33 CET 1999 Werner Koch - - * VERSION: Now 0.9.5 - -Sun Mar 14 19:34:36 CET 1999 Werner Koch - - * 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 - - * configure.in: Removed the need for libtool - -Mon Mar 8 20:47:17 CET 1999 Werner Koch - - * 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 - - * configure.in (dld): Test disabled. - -Fri Feb 26 17:55:41 CET 1999 Werner Koch - - * encode.c (encode_simple): temporary fix. - -Wed Feb 24 11:07:27 CET 1999 Werner Koch - - * configure.in: New option --enable-static-rnd. - -Mon Feb 22 20:04:00 CET 1999 Werner Koch - - * 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 - - * VERSION: Released 0.9.3 - -Fri Feb 19 15:49:15 CET 1999 Werner Koch - - * acinclude.m4: Removed gettext macros. - -Tue Feb 16 14:10:02 CET 1999 Werner Koch - - * 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 - - * configure.in: Changed detection of compiler flags. - * intl/ : Removed directory - -Wed Feb 10 17:15:39 CET 1999 Werner Koch - - * 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 - - * configure.in: --enable-m-guard is now default - -Wed Jan 13 12:49:36 CET 1999 Werner Koch - - * 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 - - * config.links (m68k-atari-mint): New - -Tue Jan 12 09:17:19 CET 1999 Gaël Quéri - - * all: Fixed typos all over the place - -Sat Jan 9 16:02:23 CET 1999 Werner Koch - - * configure.in: Add a way to statically link rndunix - -Sun Jan 3 15:28:44 CET 1999 Werner Koch - - * 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 - - * README: Replaced the command overview with a short intro. - -Sat Dec 12 18:40:32 CET 1998 Werner Koch - - * 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 - - * 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 - - * 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. + Copyright 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 @@ -1996,3 +696,5 @@ Fri Feb 13 19:43:41 1998 Werner Koch (wk@isil.d.shuttle.de) 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 index 095b1eb40..54caf7c19 100644 --- a/INSTALL +++ b/INSTALL @@ -1,16 +1,13 @@ -Installation Instructions -************************* +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software +Foundation, Inc. -Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004 Free -Software Foundation, Inc. - -This file is free documentation; the Free Software Foundation gives + 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. + These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses @@ -70,9 +67,9 @@ The simplest way to compile this package is: 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. + 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 @@ -85,7 +82,7 @@ is an example: Compiling For Multiple Architectures ==================================== -You can compile the package for more than one kind of computer at the + 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 @@ -102,19 +99,19 @@ for another architecture. Installation Names ================== -By default, `make install' will install the package's files in + 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'. +option `--prefix=PATH'. 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. +give `configure' the option `--exec-prefix=PATH', the package will use +PATH 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 +options like `--bindir=PATH' 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. @@ -125,7 +122,7 @@ option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= -Some packages pay attention to `--enable-FEATURE' options to + 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 @@ -140,11 +137,11 @@ you can use the `configure' options `--x-includes=DIR' and 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 + 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: @@ -170,9 +167,9 @@ 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'. + 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. @@ -181,7 +178,7 @@ 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 + 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 @@ -195,7 +192,8 @@ overridden in the site shell script). `configure' Invocation ====================== -`configure' recognizes the following options to control how it operates. + `configure' recognizes the following options to control how it +operates. `--help' `-h' diff --git a/Makefile.am b/Makefile.am index 3f1d670b8..6f5f165b8 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,7 +1,8 @@ -# Copyright (C) 1998,1999,2000,2001,2003 Free Software Foundation, Inc. -# +# Makefile.am - main makefile for NewPG/GnuPG +# 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 @@ -14,40 +15,68 @@ # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +# 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 +ACLOCAL_AMFLAGS = -I m4 -I gl/m4 +AUTOMAKE_OPTIONS = dist-bzip2 -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 +EXTRA_DIST = scripts/config.rpath autogen.sh README.CVS 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. +if BUILD_GPGSM +kbx = kbx +else +kbx = +endif + + +if BUILD_GPG +gpg = g10 +# fixme: Noy yet ready for a build +keyserver = +else +gpg = +keyserver = +endif +if BUILD_GPGSM +sm = sm +else +sm = +endif +if BUILD_AGENT +agent = agent +else +agent = +endif +if BUILD_SCDAEMON +scd = scd +else +scd = +endif + +if HAVE_W32_SYSTEM +tests = +else +tests = tests +endif + +SUBDIRS = m4 intl gl jnlib common ${kbx} \ + ${gpg} ${keyserver} ${sm} ${agent} ${scd} tools po doc ${tests} + dist-hook: @set -e; \ for file in `cd $(top_srcdir); \ - find scripts mpi include -type f -name distfiles`; do \ + find scripts 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/NEWS b/NEWS index 2ba5ec4ea..2979ddace 100644 --- a/NEWS +++ b/NEWS @@ -1,1899 +1,337 @@ -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 byte. 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 - . - - * 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 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 - . - - * [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) +Noteworthy changes in version 1.9.23 ------------------------------------------------- - * 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) +Noteworthy changes in version 1.9.22 (2006-07-27) ------------------------------------------------- - * 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. + * Enhanced pkcs#12 support to allow import from simple keyBags. - * Support for fetching keys via finger has been added. This is - useful for setting a preferred keyserver URL like - "finger:wk@g10code.com". + * Exporting to pkcs#12 now create bag attributes so that Mozilla is + able to import the files. - * 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. + * Fixed uploading of certain keys to the smart card. -Noteworthy changes in version 1.3.90 (2004-10-01) +Noteworthy changes in version 1.9.21 (2006-06-20) ------------------------------------------------- - * 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. + * New command APDU for scdaemon to allow using it for general card + access. Might be used through gpg-connect-agent by using the SCD + prefix command. - * Support for the OpenPGP smartcard is now enabled by default. - Use the option --disable-card-support to build without support - for smartcards. + * Support for the CardMan 4040 PCMCIA reader (Linux 2.6.15 required). - * 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. + * Scdaemon does not anymore reset cards at the end of a connection. - * -K may now be used as an alias for --list-secret-keys. + * Kludge to allow use of Bundesnetzagentur issued X.509 certificates. - * HTTP Basic authentication is now supported for all HKP and HTTP - keyserver functions, either through a proxy or via direct - access. + * Added --hash=xxx option to scdaemon's PKSIGN command. + * Pkcs#12 files are now created with a MAC. This is for better + interoperability. -Noteworthy changes in version 1.3.6 (2004-05-22) ------------------------------------------------- + * Collected bug fixes and minor other changes. - * 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 - 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) +Noteworthy changes in version 1.9.20 (2005-12-20) ------------------------------------------------- - * [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. + * Importing pkcs#12 files created be recent versions of Mozilla works + again. - * 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). + * Basic support for qualified signatures. - * 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. + * New debug tool gpgparsemail. -Noteworthy changes in version 1.1.91 (2002-08-04) +Noteworthy changes in version 1.9.19 (2005-09-12) ------------------------------------------------- - * 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 Belgian eID card is now supported for signatures and ssh. + Other pkcs#15 cards should work as well. - * 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. + * Fixed bug in --export-secret-key-p12 so that certificates are again + included. -Noteworthy changes in version 1.1.90 (2002-07-01) +Noteworthy changes in version 1.9.18 (2005-08-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. + * [gpgsm] Now allows for more than one email address as well as URIs + and dnsNames in certificate request generation. A keygrip may be + given to create a request from an existing key. - * 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. + * A couple of minor bug fixes. -Noteworthy changes in version 1.0.7 (2002-04-29) +Noteworthy changes in version 1.9.17 (2005-06-20) +------------------------------------------------- + + * gpg-connect-agent has now features to handle Assuan INQUIRE + commands. + + * Internal changes for OpenPGP cards. New Assuan command WRITEKEY. + + * GNU Pth is now a hard requirement. + + * [scdaemon] Support for OpenSC has been removed. Instead a new and + straightforward pkcs#15 modules has been written. As of now it + does allows only signing using TCOS cards but we are going to + enhance it to match all the old capabilities. + + * [gpg-agent] New option --write-env-file and Assuan command + UPDATESTARTUPTTY. + + * [gpg-agent] New option --default-cache-ttl-ssh to set the TTL for + SSH passphrase caching independent from the other passphrases. + + +Noteworthy changes in version 1.9.16 (2005-04-21) +------------------------------------------------- + + * gpg-agent does now support the ssh-agent protocol and thus allows + to use the pinentry as well as the OpenPGP smartcard with ssh. + + * New tool gpg-connect-agent as a general client for the gpg-agent. + + * New tool symcryptrun as a wrapper for certain encryption tools. + + * The gpg tool is not anymore build by default because those gpg + versions available in the gnupg 1.4 series are far more matured. + + +Noteworthy changes in version 1.9.15 (2005-01-13) +------------------------------------------------- + + * Fixed passphrase caching bug. + + * Better support for CCID readers; the reader from Cherry RS 6700 USB + does now work. + + +Noteworthy changes in version 1.9.14 (2004-12-22) +------------------------------------------------- + + * [gpg-agent] New option --use-standard-socket to allow the use of a + fixed socket. gpgsm falls back to this socket if GPG_AGENT_INFO + has not been set. + + * Ported to MS Windows with some functional limitations. + + * New tool gpg-preset-passphrase. + + +Noteworthy changes in version 1.9.13 (2004-12-03) +------------------------------------------------- + + * [gpgsm] New option --prefer-system-dirmngr. + + * Minor cleanups and debugging aids. + + +Noteworthy changes in version 1.9.12 (2004-10-22) +------------------------------------------------- + + * [scdaemon] Partly rewrote the PC/SC code. + + * Removed the sc-investigate tool. It is now in a separate package + available at ftp://ftp.g10code.com/g10code/gscutils/ . + + * [gpg-agent] Fixed logging problem. + + +Noteworthy changes in version 1.9.11 (2004-10-01) +------------------------------------------------- + + * When using --import along with --with-validation, the imported + certificates are validated and only imported if they are fully + valid. + + * [gpg-agent] New option --max-cache-ttl. + + * [gpg-agent] When used without --daemon or --server, gpg-agent now + check whether a agent is already running and usable. + + * Fixed some i18n problems. + + +Noteworthy changes in version 1.9.10 (2004-07-22) +------------------------------------------------- + + * Fixed a serious bug in the checking of trusted root certificates. + + * New configure option --enable-agent-pnly allows to build and + install just the agent. + + * Fixed a problem with the log file handling. + + +Noteworthy changes in version 1.9.9 (2004-06-08) ------------------------------------------------ - * 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. + * [gpg-agent] The new option --allow-mark-trusted is now required to + allow gpg-agent to add a key to the trustlist.txt after user + confirmation. - * 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. + * Creating PKCS#10 requests does now honor the key usage. -Noteworthy changes in version 1.0.6 (2001-05-29) +Noteworthy changes in version 1.9.8 (2004-04-29) ------------------------------------------------ - * Security fix for a format string bug in the tty code. + * [scdaemon] Overhauled the internal CCID driver. - * Fixed format string bugs in all PO files. + * [scdaemon] Status files named ~/.gnupg/reader_.status are now + written when using the internal CCID driver. - * Removed Russian translation due to too many bugs. The FTP - server has an unofficial but better translation in the contrib - directory. + * [gpgsm] New commands --dump-{,secret,external}-keys to show a very + detailed view of the certificates. - * Fixed expire time calculation and keyserver access. + * The keybox gets now compressed after 3 hours and ephemeral + stored certificates are deleted after about a day. - * The usual set of minor bug fixes and enhancements. - - * non-writable keyrings are now correctly handled. + * [gpg] Usability fixes for --card-edit. Note, that this has already + been ported back to gnupg-1.3 -Noteworthy changes in version 1.0.5 (2001-04-29) +Noteworthy changes in version 1.9.7 (2004-04-06) ------------------------------------------------ - * 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. + * Instrumented the modules for gpgconf. - * 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. + * Added support for DINSIG card applications. - * 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. + * Include the smimeCapabilities attribute with signed messages. - * 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. + * Now uses the gettext domain "gnupg2" to avoid conflicts with gnupg + versions < 1.9. -Noteworthy changes in version 1.0.4 (2000-10-17) +Noteworthy changes in version 1.9.6 (2004-03-06) ------------------------------------------------ - * 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. + * Code cleanups and bug fixes. - * 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) +Noteworthy changes in version 1.9.5 (2004-02-21) ------------------------------------------------ - * Fixed problems with piping to/from other MS-Windows software + * gpg-protect-tool gets now installed into libexec as it ought to be. + Cleaned up the build system to better comply with the coding + standards. - * Expiration time of the primary key can be changed again. + * [gpgsm] The --import command is now able to autodetect pkcs#12 + files and import secret and private keys from this file format. + A new command --export-secret-key-p12 is provided to allow + exporting of secret keys in PKCS\#12 format. - * Revoked user IDs are now marked in the output of --list-key + * [gpgsm] The pinentry will now present a description of the key for + whom the passphrase is requested. - * New options --show-session-key and --override-session-key - to help the British folks to somewhat minimize the danger - of this Orwellian RIP bill. + * [gpgsm] New option --with-validation to check the validity of key + while listing it. - * New options --merge-only and --try-all-secrets. + * New option --debug-level={none,basic,advanced,expert,guru} to map + the debug flags to sensitive levels on a per program base. - * 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 +Noteworthy changes in version 1.9.4 (2004-01-30) +------------------------------------------------ - * 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 - + * Added support for the Telesec NKS 2.0 card application. -Noteworthy changes in version 1.0.2 (2000-07-12) ----------------------------------------------- + * Added simple tool addgnupghome to create .gnupg directories from + /etc/skel/.gnupg. - * Fixed expiration handling of encryption keys. + * Various minor bug fixes and cleanups; mainly gpgsm and gpg-agent + related. - * 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. +Noteworthy changes in version 1.9.3 (2003-12-23) +------------------------------------------------ - * 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 gpgsm options --{enable,disable}-ocsp to validate keys using + OCSP. This option requires a not yet released DirMngr version. + Default is disabled. - * New options --ignore-time-conflict and --lock-never. + * The --log-file option may now be used to print logs to a socket. + Prefix the socket name with "socket://" to enable this. This does + not work on all systems and falls back to stderr if there is a + problem with the socket. - * Some fixes for the W32 version. + * The options --encrypt-to and --no-encrypt-to now work the same in + gpgsm as in gpg. Note, they are also used in server mode. - * The entropy.dll is not anymore used by the W32 version but replaced - by code derived from Cryptlib. + * Duplicated recipients are now silently removed in gpgsm. - * 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. +Noteworthy changes in version 1.9.2 (2003-11-17) +------------------------------------------------ - * 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. + * On card key generation is no longer done using the --gen-key + command but from the menu provided by the new --card-edit command. - * Keygeneration now writes to the first writeable keyring or - as default to the one in the homedirectory. Prior versions - ignored all --keyring options. + * PINs are now properly cached and there are only 2 PINs visible. + The 3rd PIN (CHV2) is internally syncronized with the regular PIN. - * 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. + * All kind of other internal stuff. - * 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. +Noteworthy changes in version 1.9.1 (2003-09-06) +------------------------------------------------ - * New option --no-auto-key-retrieve to disable retrieving of - a missing public key from a keyserver, when a keyserver has been set. + * Support for OpenSC is back. scdaemon supports a --disable-opensc to + disable OpenSC use at runtime, so that PC/SC or ct-API can still be + used directly. - * Danish translation + * Rudimentary support for the SCR335 smartcard reader using an + internal driver. Requires current libusb from CVS. -Noteworthy changes in version 1.0.1 (1999-12-16) ------------------------------------ + * Bug fixes. - * New command --verify-files. New option --fast-list-mode. - * $http_proxy is now used when --honor-http-proxy is set. +Noteworthy changes in version 1.9.0 (2003-08-05) +------------------------------------------------ - * Fixed some minor bugs and the problem with conventional encrypted - packets which did use the gpg v3 partial length headers. + ====== PLEASE SEE README-alpha ======= - * Add Indonesian and Portugese translations. + * gpg has been renamed to gpg2 and gpgv to gpgv2. This is a + temporary change to allow co-existing with stable gpg versions. - * 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 + * ~/.gnupg/gpg.conf-1.9.0 is fist tried as config file before the + usual gpg.conf. - * 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. + * Removed the -k, -kv and -kvv commands. -k is now an alias to + --list-keys. New command -K as alias for --list-secret-keys. - * Passing non-ascii user IDs on the commandline should now work in all - cases. + * Removed --run-as-shm-coprocess feature. - * New keys are now generated with an additional preference to Blowfish. + * gpg does now also use libgcrypt, libgpg-error is required. - * Removed the GNU Privacy Handbook from the distribution as it will go - into a separate one. + * New gpgsm commands --call-dirmngr and --call-protect-tool. + * Changing a passphrase is now possible using "gpgsm --passwd" -Noteworthy changes in version 1.0.0 (1999-09-07) ------------------------------------ + * The content-type attribute is now recognized and created. - * Add a very preliminary version of the GNU Privacy Handbook to - the distribution (lynx doc/gph/index.html). + * The agent does now reread certain options on receiving a HUP. - * Changed the version number to GnuPG 2001 ;-) + * The pinentry is now forked for each request so that clients with + different environments are supported. When running in daemon mode + and --keep-display is not used the DISPLAY variable is ignored. + * Merged stuff from the newpg branch and started this new + development branch. -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. + Copyright 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. - * Workaround for a problem with PGP 5 detached signature in textmode. + 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. - * 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 [] - 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:". 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. + 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/NOTES b/NOTES deleted file mode 100644 index 346dfa9fb..000000000 --- a/NOTES +++ /dev/null @@ -1,46 +0,0 @@ -Checking ElGamal signatures is really slow and the reason for the long -running time on parts o my keyring. Because somekeys are also checked at startup, this is even worser. I should invalidate my self signature with algo 16 or 20. - - -SCO UnixWare/7.1.0 reported by Allan Clark for 0.9.8 - - -Some other reported cpu-vendor-os strings: - - hppa1.1-hp-hpux10.20 - mips-sgi-irix6.2 - sparc-sun-solaris5.4 - sparc-sun-sunos4.1.2 - i386-pc-sysv4.2 (USL Unixware v1.1.2) - powerpc-ibm-aix4.3.2.0 John Payne - -gpg 1.0.1 okay with MP-RAS 3.02.01 Edition 5 using gcc 2.95.2 and EGD - By - -gpg 1.0.1 okay with 4.0.1 BSDI BSD/OS 4.0 i386 - - -rndw32 tested on: - - Windows 98 4.10.1998 mit einem AMD-K6-2-450 - Michael Engels ) - - Windows 95 4.00.950a - - Windows NT 4.00.1381 - - - - -tried to compile GnuPG on AIX 4.3 on a power CPU based machine. It -doesn't work out of the box but i found a way to do so: - - PowerPC based machines: - CFLAGS="-g -O2 -mcpu=powerpc" ./configure --disable-asm --disable-dynload -+--enable-static-rnd=egd - - Power1 and Power2 machines: - CFLAGS="-g -O2 -mcpu=power" ./configure --disable-asm --disable-dynload -+--enable-static-rnd=egd - - diff --git a/OBUGS b/OBUGS deleted file mode 100644 index 226514e00..000000000 --- a/OBUGS +++ /dev/null @@ -1,102 +0,0 @@ - List of fixed bugs - -------------------- - -(format: severity: [ *] to [***], no, first reported, by, version) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -[ *] #1 - pgp263in works fine even with a source file with CR,LF but GnuPG - and pgp263in has problems if the clearsign has been created by - pgp263ia. The reason for this problem is that pgp2 sometimes - converts CR,LF to CR,CR,LF and to fix for this it hashes both - versions. I was able to reproduce such a problem, that PGP263in - was not able to verify it's own signature. - FIX: 1999-05-19 (Most cases are now handled) - -[***] #2 1999-02-21 - Problem while importing or deleting public keys in 0.9.3 - 0.9.2 - worked fine. Error message: - gpg:[stdin]: key A6A59DB9: secret key not found: public key not found - FIX: 1999-02-22 wk - -[ *] #5 - /home/jam/.gnupg/pubring.gpg: can't open gdbm file: Can't be writer - keyblock resource `/home/jam/.gnupg/pubring.gpg': file open error - OOPS in close enum_keyblocks - ignored - [gdbm is experimental and will be replaced by the new keybox code] - FIX: 1999-07-22 (Fixed the second error, there will be no fix for - the first one, because GDBM is to be replaced) - -[ *] #7 1999-02-22 0.9.3 - Conventional encryption incompatibility: - $ gpg -c --cipher-algo cast5 --compress-algo 1 --no-comment secrets.txt - Creates a file that gpg can decrypt, but PGP 5.5 has problems with it. - PGP decrypts 6416k out of 6424k, then complains with "PGP Warning", - "The keyring contains a bad (corrupted) PGP packet". The resulting - file is missing information from the front. - FIX: 1999-02-26 temporary fix in encrypt_simple() - - -[ *] #8 1999-02-25 0.9.3 - %gpg --encrypt -r kazu@iijlab.net --batch foo - gpg: Warning: using insecure memory! - gpg: 11C23F61: no info to calculate a trust probability - This creates a symmetrically encrypted message WITHOUT a session key - encrypted with public cryptographic(i.e. foo.gpg). This is probably - FIX: 199-02-26 wk - -[ **] #9 1999-02-25 - Misalignment in md5.c#md5_write. - FIX: 1999-02-26 wk - -[ **] #10 1999-03-01 - Armor detection code is broken. Direct import of keyrings is not possible. - FIX: 1999-03-02 wk - -[***] #11 1999-02-25 - "cipher algo 10 not found". - FIX: 1999-02-25 wk - -[ **] #12 1999-03-10 - gpg --list-secret-keys --with-colon SEGVs - FIX: 1999-03-10 - -[ *] #13 1999-04-05 - Trying to generate very large keys fails with a BUG in read_pool() - FIX: 1999-04-06 - - -[ *] #14 1999-04-05 - If you use --s2k-cipher-algo twofish, the the program crashes with - a BUG at line 226 of passphrase.c. - FIX: 1999-04-06 - - -[ **] #15 1999-04-05 - Hash calculation for subkey bindings is not according to rfc2440 if - a 4 byte length header is used for the subkey. - FIX: 1999-04-06 - -[***] #16 1999-03-23 - Verifying detached signatures with an empty file yields a rc of 0. - FIX: 1999-05-06 - -[ **] #17 1999-05-18 0.9.6 - Import does not detect identical user IDs. - FIX: 1999-05-22 - -[ **] #19 1999-06-11 - "trustdb transaction too large" with about 500 signatures on a key - FAEBD5FC. - FIX: 1999-07-12 (less memory requirement and increased the limit) - -[ **] #20 1999-06-16 0.9.7 - Using "addkey" in the edit menu with more than 1 subkey leads to - "out of secure memory" in some cases. - FIX: 1999-06-17 (Twofish uses too much memory and the memory - becomes fragmented - workaround is using CAST5 to protect passphrases) - -[ *] #21 1999-06-17 - Ctrl-D does not work correct for messages entered at the tty. - FIX: 1999-06-18 (Better EOF detection on terminals) - diff --git a/PROJECTS b/PROJECTS deleted file mode 100644 index d6725f7a9..000000000 --- a/PROJECTS +++ /dev/null @@ -1,46 +0,0 @@ - - * 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" 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 index b85a89a25..35832f46c 100644 --- a/README +++ b/README @@ -1,810 +1,501 @@ + The GNU Privacy Guard 2 + ========================= + Version 1.9.x - GnuPG - The GNU Privacy Guard - ------------------------------- - Version 1.4.5 - Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, - 2005, 2006 Free Software Foundation, Inc. +GnuPG 1.9 is the future version of GnuPG; it is based on some gnupg-1.3 +code and the previous newpg package. It will eventually lead to a +GnuPG 2.0 release. Note that GnuPG 1.4 and 1.9 are not always in sync +and thus features and bug fixes done in 1.4 are not necessary +available in 1.9. - 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. +You should use this GnuPG version if you want to use the gpg-agent or +gpgsm (the S/MIME variant of gpg). Note that the gpg-agent is also +helpful when using the standard gpg versions (1.4.x as well as some of +the old 1.2.x). There are no problems installing 1.4 and 1.9 +alongside; in dact we suggest to do this. - 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. +BUILD INSTRUCTIONS +================== - Intro - ----- +GnuPG 1.9 depends on the following packages: - 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) " - - 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 - - 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 - - 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 " - - * By an email address: - - "" - - * 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= - Force the use of the random byte gathering - module . 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. + libgpg-error (ftp://ftp.gnupg.org/gcrypt/libgpg-error/) + libgcrypt (ftp://ftp.gnupg.org/gcrypt/libgcrypt/) + libassuan (ftp://ftp.gnupg.org/gcrypt/alpha/libassuan/) + libksba (ftp://ftp.gnupg.org/gcrypt/alpha/libksba/) - --with-egd-socket= - 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. +If you use the configure option --enable-agent-only, libksba is not +required. + +You also need the pinentry package for most function of GnuPG; however +it is not a build requirement. pinentry is available at +ftp://ftp.gnupg.org/gcrypt/pinentry/ . + +You should get the latest versions of course, the GnuPG configure +script complains if a version is not sufficient. + +After building and installing the above packages in the order as given +above, you may now continue with GnuPG installation (you may also just +try to build GnuPG to see whether your already installed versions are +sufficient). + +As with all packages, you just have to do + + ./configure + make + make install + +(Before doing install you might need to become root.) + +If everything succeeds, you have a working GnuPG with support for +S/MIME and smartcards. Note that there is no binary gpg but a gpg2 so +that this package won't conflict with a GnuPG 1.2 or 1.3 +installation. gpg2 behaves just like gpg; it is however suggested to +keep using gpg 1.2.x or 1.3.x. gpg2 is not even build by default. + +In case of problem please ask on gpa-dev@gnupg.org for advise. Note +that this release is only expected to build on GNU and *BSD systems. + +A texinfo manual named `gnupg.info' will get installed. Some commands +and options given below. See also the section `SMARTCARD INTRO'. + + +COMMANDS +======== + +See the info documentation ("info gnupg") for a full list of commands +and options. + +gpgsm: +------ + +--learn-card + + Read information about the private keys from the smartcard and + import the certificates from there. + +--export + + Export all certificates stored in the Keybox or those specified on + the command line. When using --armor a few informational lines are + prepended before each block. + + +OPTIONS +======= + +gpgsm: +------ + +--include-certs + + Using N of -2 includes all certificate except for the Root cert, + -1 includes all certs, 0 does not include any certs, 1 includes only + the signers cert (this is the default) and all other positives + values include up to N certs starting with the signer cert. - --with-included-zlib - Forces usage of the local zlib sources. Default is - to use the (shared) library of the system. - - --with-zlib= - Look for the system zlib in DIR. - - --with-bzip2= - 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) - - - Specific problems on some machines - ---------------------------------- - - * Apple Darwin 6.1: +--policy-file - ./configure --with-libiconv-prefix=/sw + Change the default name of the policy file - * IBM RS/6000 running AIX: +--enable-policy-checks +--disable-policy-checks - 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 + By default policy checks are enabled. These options may be used to + change it. - * SVR4.2 (ESIX V4.2 cc) +--enable-crl-checks +--disable-crl-checks - Due to problems with the ESIX as, you probably want to do - CFLAGS="-O -K pentium" ./configure --disable-asm + By default the CRL checks are enabled and the DirMngr is used to + check for revoked certificates. The disable option is most useful + with an off-line connection to suppres this check. - * SunOS 4.1.4 +--agent-program - ./configure ac_cv_sys_symbol_underscore=yes + Specify an agent program to be used for secret key operations. The + default value is "../agent/gpg-agent". This is only used as a + fallback when the envrionment variable GPG_AGENT_INFO is not set or + a running agent can't be connected. + +--dirmngr-program + Specify a dirmngr program to be used for CRL checks. The default + value is "/usr/sbin/dirmngr". This is only used as a fallback when + the environment variable DIRMNGR_INFO is not set or a running + dirmngr can't be connected. - The Random Device - ----------------- +--no-secmem-warning - Random devices are available in Linux, FreeBSD and OpenBSD. - Operating systems without a random devices must use another - entropy collector. + Don't print the warning "no secure memory" - 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). +--armor + Create PEM encoded output. Default is binary output. - Creating an RPM package - ----------------------- +--base64 - 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 + Create Base-64 encoded output; i.e. PEM without the header lines. - Or use the -t (--tarbuild) option of rpm: - 1. rpm -ta gnupg-x.x.x.tar.gz +--assume-armor - The binary rpm file can now be found in /usr/src/redhat/RPMS, source - rpm in /usr/src/redhat/SRPMS + Assume the input data is PEM encoded. Default is to autodetect the + encoding but this is may fail. +--assume-base64 - Building Universal Binaries on Apple OS X - ----------------------------------------- + Assume the input data is plain base-64 encoded. - You can build a universal ("fat") binary that will work on both - PPC and Intel Macs with something like: +--assume-binary - ./configure CFLAGS="-arch ppc -arch i386" --disable-endian-check \ - --disable-dependency-tracking --disable-asm + Assume the input data is binary encoded. - 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. +--server + Run in server mode. This is used by GPGME to control gpgsm. See + the assuan specification regarding gpgsm about the used protocol. + Some options are ignored in server mode. - GnuPG 1.4 and GnuPG 1.9 - ----------------------- +--local-user - GnuPG 1.4 is the stable version of GnuPG; GnuPG 1.9 is the - development branch. However, large parts of GnuPG 1.9 are also - considered to be stable and useful. In particular the tools - "gpg-agent" (private key operations and passphrase caching) and - "gpgsm" (S/MIME cousin of "gpg") are considered stable. Both - packages (1.4.x and 1.9.x) may be installed at the same time and - it is actually suggested to do this if you need S/MIME support or - want to make use of gpg-agent. + Set the user to be used for signing. The default is the first + secret key found in the database. +--with-key-data - How to Get More Information - --------------------------- + Displays extra information with the --list-keys commands. Especially + a line tagged "grp" is printed which tells you the keygrip of a + key. This is string is for example used as the filename of the + secret key. - 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: +gpg-agent: +--------- - 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. +--pinentry-program - gnupg-users@gnupg.org For general user discussion and - help (English). + Specify the PINentry program. The default value is + "/bin/pinentry" so you most likely want to specify it. - gnupg-de@gnupg.org German speaking counterpart of - gnupg-users. +--no-grab - gnupg-ru@gnupg.org Russian speaking counterpart of - gnupg-users. + Tell the pinentry not to grab keyboard and mouse. You most likely + want to give this option during testing and development to avoid + lockups in case of bugs. + + +scdaemon: +-------- + +--ctapi-driver + + The default for Scdaemon is to use the PC/SC API currently provided + by libpcsclite.so. As an alternative the ctAPI can be used by + specify this option with the appropriate driver name + (e.g. libtowitoko.so). + +--reader-port + + This specifies the port of the chipcard reader. For PC/SC this is + currently ignored and the first PC/SC reader is used. For the + ctAPI, a number must be specified (the default is 32768 for the + first USB port). + +--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. + + +FILES +===== + +The default home directory is ~/.gnupg. It can be changed by +either the --homedir option or by setting the environment variable +GNUPGHOME. This is a list of files usually found in this directory: + +gpgsm.conf + + Options for gpgsm. Options are the same as the command line + options but don't enter the leading dashes and give arguments + without an equal sign. Blank lines and lines starting with a + hash mark as the first non white space character are ignored. + +gpg-agent.conf + + Options for gpg-agent + +scdaemon.conf + + Options for scdaemon. + +dirmngr.conf + + Options for the DirMngr which is not part of this package and + the option file will most likely be moved to /etc + +gpg.conf + + Options for gpg. Note that old versions of gpg use the + filename `options' instead of `gpg.conf'. + +gpg.conf-1.9.x + + Options for gpg; tried before gpg.conf + + +policies.txt + + A list of allowed CA policies. This file should give the + object identifiers of the policies line by line. Empty lines + and lines starting with a hash mark are ignored. + + ++++++++++ + 2.289.9.9 + ++++++++++ + +trustlist.txt + + A list of trusted certificates. The file will be created + automagically with some explaining comments. By using + gpg-agent's option --allow-mark-trusted, gpg-agent may add new + entries after user confirmation. + +random_seed + + Used internally for keeping the state of the RNG over + invocations. + +pubring.kbx + + The database file with the certificates. + +pubring.gpg + + The database file with the OpenPGP public keys. This will + eventually be merged with pubring.kbx + +secring.gpg + + The database file with the OpenPGP secret keys. This will be + removed when gpg is changed to make use of the gpg-agent. + + +private-keys-v1.d/ + + Directory holding the private keys maintained by gpg-agent. + For detailed info see agent/keyformat.txt. Note that there is + a helper tool gpg-protect-tool which may be used to protect or + unprotect keys. This is however nothing a user should care + about. + + +SOURCE FILES +============ + +Here is a list of directories with source files: + +jnlib/ utility functions +kbx/ keybox library +g10/ the gpg program here called gpg2 +sm/ the gpgsm program +agent/ the gpg-agent +scd/ the smartcard daemon +doc/ documentation + + + +HOW TO SPECIFY A USER ID +======================== + +Due to the way X.509 certificates are made up we need a few new ways +to specify a certificate (aka key in OpenPGP). In addition to the +ways a user ID can be specified with gpg, I have implemented 3 new +modes for gpgsm, here is the entire list of ways to specify a key: + + * By keyID. + + This format is deducted from the length of the string and its + content or "0x" prefix. For use with OpenPGP an exclamation mark may + be appended to force use of the specified (sub)key. + + As with v34 OpenPGP keys, the keyID of an X509 certificate are the + low 64 bits of the SHA-1 fingerprint. The use of keyIDs is just a + shortcut, for all automated processing the fingerprint should be + used. + + Examples: + + 234567C4 + 0F34E556E + 01347A56A + 0xAB123456 + + 234AABBCC34567C4 + 0F323456784E56EAB + 01AB3FED1347A5612 + 0x234AABBCC34567C4 + + * By fingerprint + + This is format is deduced from the length of the string and its + content or "0x" prefix. Note, that only the 20 byte fingerprint is + used with GPGSM (SHA-1 hash of the certificate). For use with + OpenPGP an exclamation mark may be appended to force use of the + specified (sub)key. + + Examples: + + 1234343434343434C434343434343434 + 123434343434343C3434343434343734349A3434 + 0E12343434343434343434EAB3484343434343434 + 0xE12343434343434343434EAB3484343434343434 + + * Exact match on OpenPGP user ID + + This is denoted by a leading equal sign. It does not make much + sense for X.509. + + Example: + + =Heinrich Heine + + * Exact match on an email address. + + This is indicated by enclosing the email address in the usual way + with left and right angles + + Example: + + + + * 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. + + Example: + + +Heinrich Heine duesseldorf + + * Exact match by subject's DN + + This is indicated by a leading slash, directly followed by the + rfc2253 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) rfc2253 string + + Example: + + /CN=Heinrich Heine,O=Poets,L=Paris,C=FR + + * Exact match by 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. + + Example: + + #/CN=Root Cert,O=Poets,L=Paris,C=FR + + * Exact match by 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 RFC2253 encoded DN of the issuer. See note above. + + Example: + + #4F03/CN=Root Cert,O=Poets,L=Paris,C=FR + + * Substring match + + By case insensitive substring matching. This is the default mode + but applications may want to explicitly indicate this by putting + the asterisk in front. + + Example: + + 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 rfc2253 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. + +Some of the search modes are not yet implemented ;-) + + +HOW TO IMPORT A PRIVATE KEY +=========================== +There is some limited support to import a private key from a PKCS-12 +file. + + gpgsm --import foo.p12 + +This requires that the gpg-agent is running. + + +HOW TO EXPORT A PRIVATE KEY +=========================== +There is also limited support to export a private key in PKCS-12 +format. However there is no MAC applied. + + gpgsm --export-secret-key-p12 userID >foo.p12 + + +SMARTCARD INTRO +=============== + +GPG, the OpenPGP part of GnuPG, supports the OpenPGP smartcard +(surprise!); see http://g10code.com/p-card.html and +http://www.gnupg.org/documentation/howtos.html#GnuPG-cardHOWTO . + +GPGSM, the CMS (S/MIME) part of GnuPG, supports two kinds of +smartcards. The most flexible way is to use PKCS#15 compliant cards, +however you must have build GnuPG with support for the OpenSC library. +The build process automagically detects the presence of this library +and will include support for these cards. + +The other cards we currently support are the Telesec NetKey card with +the NKS 2.0 card application and all generic DINSIG cards. + +Before GPGSM can make use of a new card it must gather some +information, like the card's serial number, the public keys and the +certificates stored on the card. Thus for a new card you need to run +the command + + gpgsm --learn-card + +once. This is also a good test to see whether your card reader is +properly installed. See below in case of error. Once this has been +done you may use the keys stored on the card in the same way you use +keys stored on the disk. gpgsm automagically knows whether a card is +required and will pop up the pinentry to ask you to insert the +correct card. + +For selecting the driver, see the options of scdaemon. A useful +debugging flag is "--debug 2048" showing the communication between +scdaemon and the reader. - 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 . - 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/README.SVN b/README.CVS similarity index 82% rename from README.SVN rename to README.CVS index bf8d00244..ae17923bd 100644 --- a/README.SVN +++ b/README.CVS @@ -1,4 +1,4 @@ -If you are building from Subversion, run the script +If you are building from CVS, run the script ./autogen.sh @@ -40,11 +40,11 @@ knowledge about the actual tools used by autgen.sh. Please don't use autopoint, libtoolize or autoreconf unless you are the current maintainer and want to update the standard configuration -files. All those files should be in the repository and only updated -manually if the maintainer decides that newer versions are required. -The maintainer should also make sure that the required version of -automake et al. are properly indicated at the top of configure.ac and -take care to copy the files and not merely use symlinks. +files. All those files should be in the CVS and only updated manually +if the maintainer decides that newer versions are required. The +maintainer should also make sure that the required version of automake +et al. are properly indicated at the top of configure.ac and take care +to copy the files and not merely use symlinks. diff --git a/THANKS b/THANKS index 4e2bca6bd..0f31642ac 100644 --- a/THANKS +++ b/THANKS @@ -1,258 +1,9 @@ -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 -Gal Quri 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 Klcker 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 Teveen j.tevessen@gmx.de -Jrg 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 Jskelinen 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 -Rmi 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 Mller 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. +Alexander Belopolsky belopolsky at mac.com +Andrew J. Schorr aschorr at telemetry-investments.com +Carl Meijer carlm at prism.co.za +Charly Avital shavital at mac.com +Kazu Yamamoto kazu at iij.ad.jp +Michael Nottebrock michaelnottebrock at gmx.net +Ray Link rlink at pitt.edu +Richard Lefebvre rick at cerca.umontreal.ca diff --git a/THOUGHTS b/THOUGHTS deleted file mode 100644 index 25707c447..000000000 --- a/THOUGHTS +++ /dev/null @@ -1,275 +0,0 @@ -How often have we to do a key lookup by mailaddress?. -can this be accomplished by an external program? - - - -What about using S-Exp to describe the interface to the ciphers instead -of simply iterating over them. This way we can easy register a name which -can be used as the "hintstr" for --load-extension. - -EGD -==== -Oh, and on embedding egd into the gpg package: I think if you just unpack it -into, say, util/egd/* then you can put something like this into configure.in: - -AC_CHECK_PROG(perl_present, perl, true, false) -if $perl_present; then - AC_PATH_PROG(PERL, perl) - (cd util/egd; $PERL Makefile.PL FULLPERL=$PERL INSTALLBIN=$sbindir) -fi -AM_CONDITIONAL(WITH_EGD, $perl_present) - -and add util/egd to the top-level Makefile directory list inside a WITH_EGD -conditional. - - * What shall we do if we have a valid subkey revocation certificate - but no subkey binding? Is this a valid but revoked key? - - * use a mmaped file for secure memory if mlock does not work and - make sure that this file is always wiped out. Is this really - more secure than swapping out to the swap disk? I don't - believe so because if an attacker has access to the physical - box (and he needs this to look at the swap area) he can also - leave a Trojan horse which is far more easier than to analyze - memory dumps. Question: Is it possible that a Unix pages - an old (left over by some other process) swap page in for - another process - this should be considered a serious design - flow/bug. - -Date: Mon, 4 Jan 1999 19:34:29 -0800 (PST) -From: Matthew Skala - -- Signing with an expired key doesn't work by default, does work with a - special option. -- Verifying a signature that appears to have been made by an expired key - after its expiry date but is otherwise good reports the signature as BAD, - preferably with a message indicating that it's a key-expiry problem rather - than a cryptographically bad signature. -- Verifying a signature from a key that is now expired, where the - signature was made before the expiry date, reports the signature as - GOOD, possibly with a warning that the key has since expired. -- Encrypting to an expired key doesn't work by default, does work with a - special option. -- Decrypting always works, if you have the appropriate secret key and - passphrase. - - - -============================== -[ "-->" indicates a comment by me (wk) ] - -Hi Werner.. - -I was looking at some of the PROJECTS items in the recent gpg CVS and wanted -to comment on one of them: - - * Add a way to override the current cipher/md implementations - by others (using extensions) - -As you know I've been thinking about how to use a PalmPilot or an iButton in -some useful way in GPG. The two things that seem reasonable are: - 1) keep the secret key in the device, only transferring it to the host - computer for the duration of the secret-key operation (sign or decrypt). - The key is never kept on disk, only in RAM. This removes the chance that - casual snooping on your office workstation will reveal your key (it - doesn't help against an active attack, but the attacker must leave a - tampered version of GPG around or otherwise get their code to run while - the key-storage device is attached to attack the key) - 2) perform the secret-key operation on the device, so the secret key never - leaves the confines of that device. There are still attacks possible, - based upon talking to the device while it is connected and trying to - convince the device (and possibly the user) that it is the real GPG, - but in general this protects the key pretty strongly. Any individual - message is still vulnerable, but that's a tradeoff of the convenience of - composing that message on a full-sized screen+keyboard (plus the added - speed of encryption) vs. the security of writing the message on a - secure device. - -I think there are a variety of ways of implementing these things, but a few -extension mechanisms in GPG should be enough to try various ways later on. - -1) pass an argument string to loadable extension modules (maybe - gpg --load-extension foofish=arg1,arg2,arg3 ?) - --> could also be achived by S-Exps - -2) allow multiple instances of the same extension module (presumably with - different arguments) - --> set an alias name when loading them -3) allow extension modules to use stdin/stdout/stderr as normal (probably - already in there), for giving feedback to the user, or possibly asking them - for a password of some sort - --> there should really be some kind of callback mechanism. - -4) have an extension to provide secret keys: - - It looks like most of the hooks for this are already in place, it just - needs an extension module which can register itself as a keyblock resource. - - I'm thinking of a module for this that is given an external program name as - an argument. When the keyblock resource is asked to enumerate its keys, it - runs the external program (first with a "0" argument, then a "1", and so on - until the program reports that no more keys are available). The external ---> better use a cookie: This way we are also stateless but have a more - general interface. - - program returns one (possibly armored) secret key block each time. The - program might have some kind of special protocol to talk to the storage - device. One thing that comes to mind is to simply include a random number - in the message sent over the serial port: the program would display this - number, the Pilot at the other end would display the number it receives, if - the user sees that both are the same they instruct the Pilot to release the - key, as basic protection against someone else asking for the key while it - is attached. More sophisticated schemes are possible depending upon how - much processing power and IO is available on the device. But the same - extension module should be able to handle as complex a scheme as one could - wish. - --> authenticate the session on startup, using DH and the mentioned - cookie/screen/keyboard authentication. - - The current keyblock-resource interface would work fine, although it - might be more convenient if a resource could be asked for a key by id - instead of enumerating all of them and then searching through the resulting - list for a match. A module that provided public keys would have to work this - way (imagine a module that could automatically do an http fetch for a - particular key.. easily-added automatic key fetching). Without that ability - to fetch by id (which would require it to fall back to the other keyblock - resources if it failed), the user's device might be asked to release the - key even though some other secret key was the one needed. - --> Right. - - -5) have an extension to perform a secret-key operation without the actual - secret key material - --> Define a clear interface to do this and in the first step write - a daemon which does exactly this. - - basically something to indicate that any decrypt or sign operations that - occur for a specific keyid should call the extension module instead. The - secret key would not be extracted (it wouldn't be available anyway). The - module is given the keyid and the MPI of the block it is supposed to sign - or decrypt. - - The module could then run an external program to do the operation. I'm - imagining a Pilot program which receives the data, asks the user if it can go - along with the operation (after displaying a hash of the request, which is - also displayed by the extension module's program to make sure the Pilot is - being asked to do the right operation), performs the signature or decryption, - then returns the data. This protocol could be made arbitrarily complex, with - a D-H key to encrypt the link, and both sides signing requests to - authenticate one to the other (although this transforms the the problem of - getting your secret key off your office workstation into the problem of - your workstation holding a key tells your Pilot that it is allowed to perform - the secret key operation, and if someone gets a hold of that key they may - be able to trick your pilot [plugged in somewhere else] to do the same thing - for them). - - This is basically red/black separation, with the Pilot or iButton having the - perimeter beyond which the red data doesn't pass. Better than the secret-key - storage device but requires a lot more power on the device (the new iButtons - with the exponentiator could do it, but it would take way too much code space - on the old ones, although they would be fine for just carrying the keys). - -The signature code might need to be extended to verify the signature you just -made, since an active intruder pretending to the the Pilot wouldn't be able to -make a valid signature (but they might sign your message with a different key -just to be annoying). - -Anyway, just wanted to share my thoughts on some possibilities. I've been -carrying this little Java iButton on my keyring for months now, looking for -something cool to do with it, and I think that secure storage for my GPG key -would be just the right application. - -cheers, - -Brian - ------BEGIN PGP SIGNATURE----- -Version: GnuPG v0.4.5 (GNU/Linux) -Comment: For info finger gcrypt@ftp.guug.de - -iD8DBQE2c5oZkDmgv9E5zEwRArAwAKDWV5fpTtbGPiMPgl2Bpp0gvhbfQgCgzJuY -AmIQTk4s62/y2zMAHDdOzK0= -=jr7m ------END PGP SIGNATURE----- - - - -About a new Keyserver (discussion with Allan Clark ): -===================== - -Some ideas: - -o the KS should verify signatures and only accept those - which are good. - -o Keep a blacklist of known bad signatures to minimize - the time needed to check them - -o Should be fast - I'm currently designing a new storage - system called keybox which takes advantage of the fact - that the keyID is highly random and can directly be - used as a hash value and this keyID is (for v4 keys) - part of the fingerprint: So it is possible to use the - fingerprint as key but do an lookup by the keyID. - -o To be used as the "public keyring" in a LAN so that there - is no need to keep one on every machine. - -o Allow more that one file for key storage. - -o Use the HKS protocol and enhance it in a way that binary - keyrings can be transmitted. (I already wrote some - http server and client code which can be used for this) - And extend it to allow reuse of a connection. - -o Keep a checksum (hash) of the entire keyblock so that a - client can easy check whether this keyblock has changed. - (keyblock = the entire key with all certificates etc.) - Transmitted in the HEAD info. - -o Allow efficient propagation of new keys and revocation - certificates. - - -Probably more things but this keyserver is not a goal for the -1.0 release. Someone should be able to fix some of the limitations -of the existing key servers (I think they bail out on some rfc2440 -packet formats). - - -DJGPP -===== -Don't use symlinks but try to do the preprocessing in the config-links script. -DJPGG has problems to distinguish betwen .s and .S becaus the FAT filesystem -is not case sensitive (Mark Elbrecht). -Well, it runs only on one architecture and therefor it might be possible -to add a special case for it, completely bypassing the symlink autselection -trick. - -Special procmail addresses -========================== - * foo+bar@example.net: Try to match the address without the "+bar". - Should be done by the MUA, but maybe we can do this. - --> Yep. Another reason to utilize a directory service or something - else for keylookup. - - - -Suggested things which I will not do: -===================================== - * Let take --help an option to select some topics. - Using grep is much easier - * Check if an object (a message, detached sign, public key, or whatever) - is signed by definite user, i.e. define user - (userid, or any other unique identification) on command line. - --> Use a script and --status-fd - - - 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/TODO b/TODO index fd0d47c17..29714dfe4 100644 --- a/TODO +++ b/TODO @@ -1,72 +1,121 @@ - * 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. + -*- outline -*- - * pause scrolling help in --edit-key and elsewhere. +* src/base64 +** Make parsing more robust +Currently we don't cope with overlong lines in the best way. +** Check that we really release the ksba reader/writer objects. - * getkey does not return revoked/expired keys - therefore it is not - possible to override it. +* sm/call-agent.c +** The protocol uses an incomplete S-expression +We should always use valid S-Exp and not just parts. +** Some code should go into import.c +** When we allow concurrent service request in gpgsm, we +might want to have an agent context for each service request +(i.e. Assuan context). - * Selection using +wordlist does not work. - What about adding a feature -word to the +wordlist search mode. +* sm/certchain.c +** When a certificate chain was sucessfully verified, make ephemeral certs used in this chain permanent. +** Try to keep certificate references somewhere + This will help with some of our caching code. We also need to test + that caching; in particular "regtp_ca_chainlen". - * Check the changes to the gpg random gatherer on all W32 platforms. +* sm/decrypt.c +** replace leading zero in integer hack by a cleaner solution - * Show more info does not work from edit->trust. We should give more - information on the user ID under question while running - --update-trustdb. +* sm/gpgsm.c +** Support --output for all commands +** mark all unimplemented commands and options. +** Implement --default-key +** support the anyPolicy semantic +** Check that we are really following the verification procedures in rfc3280. +** Implement a --card-status command. + This is useful to check whether a card is supported at all. - * 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 +* sm/keydb.c +** Check file permissions +** Check that all error code mapping is done. +** Remove the inter-module dependencies between gpgsm and keybox +** Add an source_of_key field - * Fix the bug in the mips assembler code +* agent/command.c +** Make sure that secure memory is used where appropriate - * Add a way to show the fingerprint of an key signator's keys +* agent/pkdecrypt.c, agent/pksign.c +** Don't use stdio to return results. +** Support DSA - * Concatenated encryption messages don't work corectly - only the - first one is processed. +* Move pkcs-1 encoding into libgcrypt. - * Add option to put the list of recipients (from the encryption - layer) into the signatures notation data. +* Use a MAC to protect sensitive files. + The problem here is that we need yet another key and it is unlikely + that users are willing to remember that key too. It is possible to + do this with a smartcard, though. - * --disable-asm should still assemble _udiv_qrnnd when needed +* sm/export.c +** Return an error code or a status info per user ID. - * the pubkey encrypt functions should do some sanity checks. +* scd/tlv.c + The parse_sexp fucntion should not go into this file. Check whether + we can change all S-expression handling code to make use of this + function. - * "gpg filename.tar.gz.asc" should work like --verify (-sab). +* scd +** Application context vs. reader slot + We have 2 concurrent method of tracking whether a read is in use: + Using the session_list in command.c and the lock_table in app.c. IT + would be better to do this just at one place. First we need to see + how we can support cards with multiple applications. +** Detecting a removed card works only after the ticker detected it. + We should check the card status in open-card to make this smoother. + Needs to be integrated with the status file update, though. It is + not a real problem because application will get a card removed status + and should the send a reset to try solving the problem. - * 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. +* tests +** Makefile.am + We use printf(1) to setup the library path, this is not portable. + Furthermore LD_LIBRARY_PATH is not used on all systems. It doesn't + matter for now, because we use some GNU/*BSDish features anyway. - * keyflags don't distinguish between {certify,signature}-only. +** Add a test to check the extkeyusage. - * cat foo | gpg --sign | gpg --list-packets - Does not list the signature packet. +* doc/ +** Explain how to setup a root CA key as trusted +** Explain how trustlist.txt might be managed. +** Write a script to generate man pages from texi. + In progress (yatm) - * 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. +* Windows port +** gpgsm's LISTKEYS does not yet work + Fix is to change everything to libestream +** Signals are not support + This means we can't reread a configuration +** No card status notifications. - * 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. +* sm/ +** check that we issue NO_SECKEY xxx if a -u key was not found + +* jnlib/ +** provide jnlib_malloc and try to remove all jnlib_xmalloc. + +* gpg/ +** issue a NO_SECKEY xxxx if a -u key was not found. +** Replace DIGEST_ALGO_SHA224 + We can't do that right now because it is only defined by newer + versions of libgcrypt. Changes this if we require libgcrypt 1.3 + anyway. +** skclist.c:random_is_faked + Remove the whole stuff? +** qbits + We pass a new qbit parameter to genkey - implement this in libgcrypt. + + +* common/ +** ttyio + Add completion support. +** yesno + Update to gpg 1.4.3 version diff --git a/acinclude.m4 b/acinclude.m4 index b38712f70..b8af93245 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -15,15 +15,7 @@ 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 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA dnl GNUPG_CHECK_TYPEDEF(TYPE, HAVE_NAME) dnl Check whether a typedef exists and create a #define $2 if it exists @@ -61,7 +53,6 @@ AC_DEFUN([GNUPG_CHECK_GNUMAKE], fi ]) - dnl GNUPG_CHECK_FAQPROG dnl AC_DEFUN([GNUPG_CHECK_FAQPROG], @@ -106,10 +97,11 @@ AC_DEFUN([GNUPG_CHECK_DOCBOOK_TO_TEXI], ]) + dnl GNUPG_CHECK_ENDIAN dnl define either LITTLE_ENDIAN_HOST or BIG_ENDIAN_HOST dnl -define([GNUPG_CHECK_ENDIAN], +AC_DEFUN([GNUPG_CHECK_ENDIAN], [ tmp_assumed_endian=big if test "$cross_compiling" = yes; then @@ -163,213 +155,128 @@ define([GNUPG_CHECK_ENDIAN], 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) + + +# Check for the getsockopt SO_PEERCRED +AC_DEFUN([GNUPG_SYS_SO_PEERCRED], + [ AC_MSG_CHECKING(for SO_PEERCRED) + AC_CACHE_VAL(gnupg_cv_sys_so_peercred, + [AC_TRY_COMPILE([#include ], + [struct ucred cr; + int cl = sizeof cr; + getsockopt (1, SOL_SOCKET, SO_PEERCRED, &cr, &cl);], + gnupg_cv_sys_so_peercred=yes, + gnupg_cv_sys_so_peercred=no) + ]) + AC_MSG_RESULT($gnupg_cv_sys_so_peercred) + if test $gnupg_cv_sys_so_peercred = yes; then + AC_DEFINE(HAVE_SO_PEERCRED, 1, + [Defined if SO_PEERCRED is supported (Linux)]) 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" - ;; +# GNUPG_BUILD_PROGRAM(NAME,DEFAULT) +# Add a --enable-NAME option to configure an set the +# shell variable build_NAME either to "yes" or "no". DEFAULT must +# either be "yes" or "no" and decided on the default value for +# build_NAME and whether --enable-NAME or --disable-NAME is shown with +# ./configure --help +AC_DEFUN([GNUPG_BUILD_PROGRAM], + [build_$1=$2 + m4_if([$2],[yes],[ + AC_ARG_ENABLE([$1], AC_HELP_STRING([--disable-$1], + [do not build the $1 program]), + build_$1=$enableval, build_$1=$2) + ],[ + AC_ARG_ENABLE([$1], AC_HELP_STRING([--enable-$1], + [build the $1 program]), + build_$1=$enableval, build_$1=$2) + ]) + case "$build_$1" in + no|yes) + ;; + *) + AC_MSG_ERROR([only yes or no allowed for feature --enable-$1]) + ;; + esac + ]) - 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' - ;; +# GNUPG_PTH_VERSION_CHECK(REQUIRED) +# +# If the version is sufficient, HAVE_PTH will be set to yes. +# +# Taken form the m4 macros which come with Pth +AC_DEFUN([GNUPG_PTH_VERSION_CHECK], + [ + _pth_version=`$PTH_CONFIG --version | awk 'NR==1 {print [$]3}'` + _req_version="ifelse([$1],,1.2.0,$1)" - 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="" - ;; + AC_MSG_CHECKING(for PTH - version >= $_req_version) + for _var in _pth_version _req_version; do + eval "_val=\"\$${_var}\"" + _major=`echo $_val | sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\([[ab.]]\)\([[0-9]]*\)/\1/'` + _minor=`echo $_val | sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\([[ab.]]\)\([[0-9]]*\)/\2/'` + _rtype=`echo $_val | sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\([[ab.]]\)\([[0-9]]*\)/\3/'` + _micro=`echo $_val | sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\([[ab.]]\)\([[0-9]]*\)/\4/'` + case $_rtype in + "a" ) _rtype=0 ;; + "b" ) _rtype=1 ;; + "." ) _rtype=2 ;; 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) + _hex=`echo dummy | awk '{ printf("%d%02d%1d%02d", major, minor, rtype, micro); }' \ + "major=$_major" "minor=$_minor" "rtype=$_rtype" "micro=$_micro"` + eval "${_var}_hex=\"\$_hex\"" + done + have_pth=no + if test ".$_pth_version_hex" != .; then + if test ".$_req_version_hex" != .; then + if test $_pth_version_hex -ge $_req_version_hex; then + have_pth=yes 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="" + if test $have_pth = yes; then + AC_MSG_RESULT(yes) + AC_MSG_CHECKING([whether PTH installation is sane]) + AC_CACHE_VAL(gnupg_cv_pth_is_sane,[ + _gnupg_pth_save_cflags=$CFLAGS + _gnupg_pth_save_ldflags=$LDFLAGS + _gnupg_pth_save_libs=$LIBS + CFLAGS="$CFLAGS `$PTH_CONFIG --cflags`" + LDFLAGS="$LDFLAGS `$PTH_CONFIG --ldflags`" + LIBS="$LIBS `$PTH_CONFIG --libs`" + AC_LINK_IFELSE([AC_LANG_PROGRAM([#include + ], + [[ pth_init ();]])], + gnupg_cv_pth_is_sane=yes, + gnupg_cv_pth_is_sane=no) + CFLAGS=$_gnupg_pth_save_cflags + LDFLAGS=$_gnupg_pth_save_ldflags + LIBS=$_gnupg_pth_save_libs + ]) + if test $gnupg_cv_pth_is_sane != yes; then + have_pth=no + fi + AC_MSG_RESULT($gnupg_cv_pth_is_sane) 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 + AC_MSG_RESULT(no) + 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 - #include - #include - 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 - #include - #include ],[ - 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_DEFUN([GNUPG_CHECK_MLOCK], [ AC_CHECK_FUNCS(mlock) if test "$ac_cv_func_mlock" = "no"; then AC_CHECK_HEADERS(sys/mman.h) @@ -456,274 +363,6 @@ define(GNUPG_CHECK_MLOCK, ]) -################################################################ -# 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 < $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 < 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 <> 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 "${target}" in - i386-emx-os2 | i[3456]86-pc-os2*emx | i386-pc-msdosdjgpp) - ac_cv_sys_symbol_underscore=yes - ;; - *) - if test "$cross_compiling" = yes; then - ac_cv_sys_symbol_underscore=yes - 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 < $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. @@ -748,18 +387,6 @@ if test $gnupg_cv_mkdir_takes_one_arg = yes ; then 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/agent/ChangeLog b/agent/ChangeLog new file mode 100644 index 000000000..97c7741ac --- /dev/null +++ b/agent/ChangeLog @@ -0,0 +1,1513 @@ +2006-07-29 Marcus Brinkmann + + * preset-passphrase.c (preset_passphrase): Do not strip off last + character of passphrase. + (make_hexstring): New function. + * command.c (cmd_preset_passphrase): Use parse_hexstring to syntax + check passphrase argument. Truncate passphrase at delimiter. + +2006-07-24 Werner Koch + + * minip12.c (build_key_bag): New args SHA1HASH and + KEYIDSTR. Append bag Attributes if these args are given. + (build_cert_sequence): ditto. + (p12_build): Calculate certificate hash and pass to build + functions. + +2006-07-21 Werner Koch + + * minip12.c (oid_pkcs_12_keyBag): New. + (parse_bag_encrypted_data): New arg R_RESULT. Support keybags and + return the key object. + (p12_parse): Take new arg into account. Free RESULT on error. + +2006-06-26 Werner Koch + + * gpg-agent.c (handle_signal): Print infor for SIGUSR2 only in + verbose mode. + +2006-06-22 Werner Koch + + * command-ssh.c (make_cstring): Use memcpy instead of strncpy. + (ssh_receive_mpint_list, sexp_key_extract, data_sign): Use + xtrycalloc instead of xtrymalloc followed by memset. + +2006-06-20 Werner Koch + + * minip12.c (create_final): New arg PW. Add code to calculate the + MAC. + +2006-06-09 Marcus Brinkmann + + * Makefile.am (gpg_agent_LDADD): Add $(NETLIBS). + (gpg_protect_tool_LDADD): Likewise. + (gpg_preset_passphrase_LDADD): Likewise. + +2006-04-09 Moritz Schulte + + * command-ssh.c (ssh_request_process): Removed FIXME mentioning a + possible DoS attack. + +2006-04-01 Moritz Schulte + + * command-ssh.c (ssh_identity_register): Make KEY_GRIP_RAW be 20 + instead of 21 bytes long; do not fill KEY_GRIP_RAW[20] with NUL + byte - KEY_GRIP_RAW is a raw binary string anyway. + +2006-02-09 Werner Koch + + * call-scd.c (struct scd_local_s): New field next_local. + (scd_local_list): New. + (start_scd): Put new local into list. + (agent_reset_scd): Remove it from the list. + (agent_scd_check_aliveness): Here is the actual reason why we need + all this stuff. + (agent_reset_scd): Send the new command RESTART instead of RESET. + +2005-12-16 Werner Koch + + * minip12.c (cram_octet_string): New + (p12_parse): Use it for NDEFed bags. + (parse_bag_data): Ditto. + (string_to_key, set_key_iv, crypt_block): New arg SALTLEN. + (p12_build): Use old value 8 for new arg. + (parse_bag_encrypted_data, parse_bag_data): Allow for salts of 8 + to 16 bytes. Add new arg R_CONSUMED. + +2005-11-24 Werner Koch + + * minip12.c (p12_parse): Fixed for case that the key object comes + prior to the certificate. + +2005-10-19 Werner Koch + + * divert-scd.c (getpin_cb): Hack to use it for a keypad message. + + * call-scd.c (inq_needpin): Reworked to support the new KEYPADINFO. + + * query.c (start_pinentry): Keep track of the owner. + (popup_message_thread, agent_popup_message_start) + (agent_popup_message_stop, agent_reset_query): New. + * command.c (start_command_handler): Make sure a popup window gets + closed. + +2005-10-08 Marcus Brinkmann + + * Makefile.am (gpg_protect_tool_LDADD): Add ../gl/libgnu.a. + (gpg_preset_passphrase_LDADD, t_common_ldadd): Likewise. + (gpg_agent_LDADD): Add ../gl/libgnu.a after ../common/libcommon.a. + +2005-09-16 Werner Koch + + * minip12.c (build_key_sequence, build_cert_sequence): Fixed + padding. + +2005-09-15 Moritz Schulte + + * t-protect.c (test_agent_protect): Implemented. + (main): Disable use of secure memory. + +2005-09-09 Werner Koch + + * minip12.c (p12_build): Oops, array needs to be larger for the + certificate. + (build_cert_bag): Fixed yesterdays change. + + * command-ssh.c (card_key_available): Let the card handler decide + whether the card is supported here. Also get a short serial + number to return from the card handler. + +2005-09-08 Werner Koch + + * minip12.c (build_cert_bag): Use a non constructed object. + i.e. 0x80 and not 0xa0. + +2005-08-16 Werner Koch + + * gpg-agent.c (main): Use a default file name for --write-env-file. + +2005-07-25 Werner Koch + + * findkey.c (agent_public_key_from_file): Fixed array assignment. + This was the cause for random segvs. + +2005-06-29 Werner Koch + + * command-ssh.c (data_sign): Removed empty statement. + +2005-06-21 Werner Koch + + * minip12.c (create_final): Cast size_t to ulong for printf. + (build_key_bag, build_cert_bag, build_cert_sequence): Ditto. + +2005-06-16 Werner Koch + + * protect-tool.c (make_advanced): Makde RESULT a plain char. + * call-scd.c (unescape_status_string): Need to cast unsigned char* + for strcpy. + (agent_card_pksign): Made arg R_BUF an unsigned char**. + * divert-scd.c (divert_pksign): Made SIGVAL unsigned char*. + (encode_md_for_card): Initialize R_VAL and R_LEN. + * genkey.c (store_key): Made BUF unsigned. + * protect.c (do_encryption): Ditto. + (do_encryption): Made arg PROTBEGIN unsigned. Initialize RESULT + and RESULTLEN even on error. + (merge_lists): Need to cast unsigned char * for strcpy. Initialize + RESULTand RESULTLEN even on error. + (agent_unprotect): Likewise for strtoul. + (make_shadow_info): Made P and INFO plain char. + (agent_shadow_key): Made P plain char. + +2005-06-15 Werner Koch + + * query.c (agent_get_passphrase): Made HEXSTRING a char*. + * command-ssh.c (ssh_key_grip): Made arg BUFFER unsigned. + (ssh_key_grip): Simplified. + (data_sign): Initialize variables with the definition. + (ssh_convert_key_to_blob): Make sure that BLOB and BLOB_SIZE + are set to NULL on error. Cool, gcc-4 detects uninitialized stuff + beyond function boundaries; well it can't know that we do error + proper error handling so that this was not a real error. + (file_to_buffer): Likewise for BUFFER and BUFFER_N. + (data_sign): Likewise for SIG and SIG_N. + (stream_read_byte): Set B to a value even on error. + * command.c (cmd_genkey): Changed VALUE to char. + (cmd_readkey): Cast arg for gcry_sexp_sprint. + * agent.h (struct server_control_s): Made KEYGRIP unsigned. + +2005-06-13 Werner Koch + + * command-ssh.c (start_command_handler_ssh): Reset the SCD. + +2005-06-09 Werner Koch + + * gpg-agent.c (create_socket_name): New option --max-cache-ttl-ssh. + * cache.c (housekeeping): Use it. + (agent_put_cache): Use a switch to get the default ttl so that it + is easier to add more cases. + +2005-06-06 Werner Koch + + * gpg-agent.c: New option --default-cache-ttl-ssh. + * agent.h (cache_mode_t): New. + * pksign.c (agent_pksign_do): New arg CACHE_MODE to replace the + ARG IGNORE_CACHE. Changed all callers. + (agent_pksign): Ditto. + * findkey.c (agent_key_from_file): Ditto. Canged all callers. + (unprotect): Ditto. + * command-ssh.c (data_sign): Use CACHE_MODE_SSH. + * cache.c (agent_get_cache): New arg CACHE_MODE. + (agent_put_cache): Ditto. Store it in the cache. + + * query.c (agent_query_dump_state, dump_mutex_state): New. + (unlock_pinentry): Reset the global context before releasing the + mutex. + * gpg-agent.c (handle_signal): Dump query.c info on SIGUSR1. + + * call-scd.c (agent_scd_check_aliveness): Always do a waitpid and + add a timeout to the locking. + +2005-06-03 Werner Koch + + * command.c (cmd_updatestartuptty): New. + + * gpg-agent.c: New option --write-env-file. + + * gpg-agent.c (handle_connections): Make sure that the signals we + are handling are not blocked.Block signals while creating new + threads. + +2005-06-02 Werner Koch + + * call-scd.c (agent_scd_dump_state, dump_mutex_state): New. + * gpg-agent.c (handle_signal): Print it on SIGUSR1. + (handle_connections): Include the file descriptor into the + threadnames. + +2005-06-01 Werner Koch + + * gpg-agent.c: Include setenv.h. + +2005-05-31 Werner Koch + + * agent.h (out_of_core): s/__inline__/inine. Noted by Ray Link. + +2005-05-25 Werner Koch + + * gpg-agent.c (main): Do not unset the DISPLAY when we are + continuing as child. + +2005-05-24 Werner Koch + + * call-scd.c (inq_needpin): Skip leading spaces in of PIN + description. + * divert-scd.c (getpin_cb): Enhanced to cope with description + flags. + * query.c (agent_askpin): Add arg PROMPT_TEXT. Changed all + callers. + +2005-05-21 Werner Koch + + * call-scd.c (start_scd): Don't test for an alive scdaemon here. + (agent_scd_check_aliveness): New. + * gpg-agent.c (handle_tick): Test for an alive scdaemon. + (handle_signal): Print thread info on SIGUSR1. + +2005-05-20 Werner Koch + + * protect-tool.c: New option --canonical. + (show_file): Implement it. + + * keyformat.txt: Define the created-at attribute for keys. + +2005-05-18 Werner Koch + + * divert-scd.c (ask_for_card): Removed the card reset kludge. + +2005-05-17 Werner Koch + + * call-scd.c (unlock_scd): Add new arg CTRL. Changed all callers. + (start_scd): Reoworked to allow for additional connections. + * agent.h (ctrl_t): Add local data for the SCdaemon. + * command.c (start_command_handler): Release SERVER_LOCAL. + + * gpg-agent.c (create_server_socket): Use xmalloc. + (main): Removed option --disable-pth a dummy. Removed non-pth + code path. + (cleanup_sh): Removed. Not needed anymore. + +2005-05-05 Moritz Schulte + + * command-ssh.c (ssh_key_to_buffer): Rename to ... + (ssh_key_to_protected_buffer): ... this; change callers. + Improved documentation. + Use ssh_key_grip(), where gcry_pk_get_keygrip() has been used + before. + (ssh_handler_sign_request): Removed unusued variable P. + +2005-04-20 Moritz Schulte + + * command-ssh.c (ssh_handler_request_identities): Removed + debugging code (sleep call), which was commited unintenionally. + +2005-04-20 Werner Koch + + * minip12.c (parse_bag_encrypted_data): Fix the unpadding hack. + + * gpg-agent.c: New option --disable-scdaemon. + (handle_connections): Add time event to drive ... + (handle_tick): New function. + (main): Record the parent PID. Fixed segv when using ssh and a + command. + + * call-scd.c (start_scd): Take care of this option. + +2005-04-03 Moritz Schulte + + * command-ssh.c (ssh_request_spec): New member: secret_input. + (REQUEST_SPEC_DEFINE): New argument: secret_input. + (request_specs): Add secret_input flag. + (request_spec_lookup): New function ... + (ssh_request_process): ... use it here; depending on secret_input + flag allocate secure or non-secure memory. + +2005-03-02 Moritz Schulte + + * command-ssh.c (sexp_key_extract): Removed FIXME, since + xtrymallos does set errno correctly by now. + (sexp_extract_identifier): Remove const attribute from identifier. + (ssh_handler_request_identities): Remove const attribute from + key_type; removes ugly casts and FIXME. + (sexp_key_extract): Remove const attribute from comment. + (ssh_send_key_public): Remove const attribute from + key_type/comment; removes ugly cast. + (data_sign): Remove const attribute from identifier; removes ugly + cast. + (key_secret_to_public): Remove const attribute from comment; + removes ugly cast. + (ssh_handler_sign_request): Remove const attribute from p. + (sexp_key_extract): Use make_cstring(). + (ssh_key_extract_comment): Likewise. + (ssh_key_to_buffer): Use secure memory for memory area to hold the + key S-Expression. + Added more comments. + +2005-02-25 Werner Koch + + * findkey.c (modify_description): Keep invalid % escapes, so that + %0A may pass through. + + * agent.h (server_control_s): New field USE_AUTH_CALL. + * call-scd.c (agent_card_pksign): Make use of it. + * command-ssh.c (data_sign): Set the flag. + (ssh_send_key_public): New arg OVERRIDE_COMMENT. + (card_key_available): Add new arg CARDSN. + (ssh_handler_request_identities): Use the card s/n as comment. + (sexp_key_extract): Use GCRYMPI_FMT_STD. + (data_sign): Ditto. + + * learncard.c (make_shadow_info): Moved to .. + * protect.c (make_shadow_info): .. here. Return NULL on malloc + failure. Made global. + * agent.h: Add prototype. + +2005-02-24 Werner Koch + + * call-scd.c (unescape_status_string): New. Actual a copy of + ../g10/call-agent.c + (card_getattr_cb, agent_card_getattr): New. + + * command-ssh.c (card_key_available): New. + (ssh_handler_request_identities): First see whether a card key is + available. + + * gpg-agent.c (handle_connections): Need to check for events if + select returns with -1. + +2005-02-23 Werner Koch + + * command-ssh.c (get_passphrase): Removed. + (ssh_identity_register): Partly rewritten. + (open_control_file, search_control_file, add_control_entry): New. + (ssh_handler_request_identities): Return only files listed in our + control file. + + * findkey.c (unprotect): Check for allocation error. + + * agent.h (opt): Add fields to record the startup terminal + settings. + * gpg-agent.c (main): Record them and do not force keep display + with --enable-ssh-support. + * command-ssh.c (start_command_handler_ssh): Use them here. + + * gpg-agent.c: Renamed option --ssh-support to + --enable-ssh-support. + + * command.c (cmd_readkey): New. + (register_commands): Register new command "READKEY". + + * command-ssh.c (ssh_request_process): Improved logging. + + * findkey.c (agent_write_private_key): Always use plain open. + Don't depend on an umask for permissions. + (agent_key_from_file): Factored file reading code out to .. + (read_key_file): .. new function. + (agent_public_key_from_file): New. + +2005-02-22 Werner Koch + + * command-ssh.c (stream_read_string): Removed call to abort on + memory error because the CVS version of libgcrypt makes sure + that ERRNO gets always set on error even with a faulty user + supplied function. + +2005-02-19 Moritz Schulte + + * command-ssh.c (ssh_receive_mpint_list): Slightly rewritten, do + not use elems_secret member of key_spec. + (ssh_key_type_spec): Removed member: elems_secret. + (ssh_key_types): Removed elems_secret data. + (ssh_sexp_construct): Renamed to ... + (sexp_key_construct): ... this; changed callers. + (ssh_sexp_extract): Renamed to ... + (sexp_key_extract): ... this; changed callers. + (ssh_sexp_extract_key_type): Renamed to ... + (sexp_extract_identifier): ... this; changed callers; use + make_cstring(). + Added more comments. + +2005-02-18 Moritz Schulte + + * command-ssh.c (ssh_sexp_construct): Rewritten generation of sexp + template, clarified. + (ssh_sexp_extract): Support shadowed-private-key-sexp; treat + protected-private key and shadowed-private-key as public keys. + (key_secret_to_public): Rewritten: simply use ssh_sexp_extract() + and ssh_sexp_construct(). + +2005-02-15 Werner Koch + + * findkey.c (modify_description): Don't increment OUT_LEN during + the second pass. + +2005-02-14 Moritz Schulte + + * command-ssh.c (es_read_byte): Renamed to ... + (stream_es_read_byte): ... this; changed callers. + (es_write_byte): Renamed to ... + (stream_write_byte): ... this; changed callers. + (es_read_uint32): Renamed to ... + (stream_read_uint32): ... this; changed callers. + (es_write_uint32): Renamed to ... + (stream_write_uint32): ... this; changed callers. + (es_read_data): Renamed to ... + (stream_read_data): ... this; changed callers. + (es_write_data): Renamed to ... + (stream_write_data): ... this; changed callers. + (es_read_string): Renamed to ... + (stream_read_string): ... this; changed callers. + (es_read_cstring): Renamed to ... + (stream_read_cstring): ... this; changed callers. + (es_write_string): Renamed to ... + (stream_write_string): ... this; changed callers. + (es_write_cstring): Renamed to ... + (stream_write_cstring): ... this; changed callers. + (es_read_mpi): Renamed to ... + (stream_read_mpi): ... this; changed callers. + (es_write_mpi): Renamed to ... + (stream_write_mpi): ... this; changed callers. + (es_copy): Renamed to ... + (stream_copy): ... this; changed callers. + (es_read_file): Renamed to ... + (file_to_buffer): ... this; changed callers. + (ssh_identity_register): Removed variable description_length; + changed code to use asprintf for description. + (stream_write_uint32): Do not filter out the last byte of shift + expression. + (uint32_construct): New macro ... + (stream_read_uint32): ... use it; removed unnecessary cast. + +2005-02-03 Werner Koch + + * agent.h (agent_exit): Add JNLIB_GCC_A_NR to indicate that this + function won't return. + + * gpg-agent.c (check_for_running_agent): Initialize pid to a + default value if not needed. + + * command-ssh.c: Removed stdint.h. s/byte_t/unsigned char/, + s/uint32/u32/ becuase that is what we have always used in GnuPG. + (ssh_request_specs): Moved to top of file. + (ssh_key_types): Ditto. + (make_cstring): Ditto. + (data_sign): Don't use a variable for the passphrase prompt, make + it translatable. + (ssh_request_process): + + + * findkey.c (modify_description): Renamed arguments for clarity, + polished documentation. Make comment a C-string. Fixed case of + DESCRIPTION being just "%". + (agent_key_from_file): Make sure comment string to a C-string. + + * gpg-agent.c (create_socket_name): Cleanup the implemntation, use + DIMof, agent_exit, removed superflous args and return the + allocated string as value. Documented. Changed callers. + (create_server_socket): Cleanups similar to above. Changed callers. + (cleanup_do): Renamed to .. + (remove_socket): .. this. Changed caller. + (handle_connections): The signals are to be handled in the select + and not in the accept. Test all FDs after returning from a + select. Remove the event tests from the accept calls. The select + already assured that the accept won't block. + +2005-01-29 Moritz Schulte + + * command-ssh.c (ssh_handler_request_identities) + (ssh_handler_sign_request, ssh_handler_add_identity) + (ssh_handler_remove_identity, ssh_handler_remove_all_identities) + (ssh_handler_lock, ssh_handler_unlock): Changed to return an error + code instead of a boolean. + (ssh_request_process): Changed to return a boolean instead of an + error; adjust caller. + (ssh_request_handle_t): Adjusted type. + (ssh_request_spec): New member: identifier. + (REQUEST_SPEC_DEFINE): New macro; use it for initialization of + request_specs[]. + (ssh_request_process): In debugging mode, log identifier of + handler to execute. + (start_command_handler_ssh): Moved most of the stream handling + code ... + (ssh_request_process): ... here. + +2005-01-28 Moritz Schulte + + * command-ssh.c (ssh_handler_add_identity): Pass ctrl to + ssh_identity_register(). + (ssh_identity_register): New argument: ctrl; pass ctrl to + get_passphrase(). + (get_passphrase): Pass ctrl instead of NULL to agent_askpin(). + (start_command_handler_ssh): Use agent_init_default_ctrl(); + deallocate structure members, which might be dynamically + allocated. + (lifetime_default): Removed variable. + (ssh_handler_add_identity): Fix ttl handling; renamed variable + `death' to `ttl'. + (ssh_identity_register): Fix key grip handling. + +2005-01-26 Moritz Schulte + + * command-ssh.c (ssh_handler_sign_request): Confirm to agent + protocol in case of failure. + + * command-ssh.c: New file. + + * Makefile.am (gpg_agent_SOURCES): New source file: command-ssh.c. + + * findkey.c (modify_description): New function. + (agent_key_from_file): Support comment field in key s-expressions. + + * gpg-agent.c (enum cmd_and_opt_values): New item: oSSHSupport. + (opts) New entry for oSSHSupport. + New variable: socket_name_ssh. + (cleanup_do): New function based on cleanup(). + (cleanup): Use cleanup_do() for socket_name and socket_name_ssh. + (main): New switch case for oSSHSupport. + (main): Move socket name creation code to ... + (create_socket_name): ... this new function. + (main): Use create_socket_name() for creating socket names for + socket_name and for socket_name_ssh in case ssh support is + enabled. + Move socket creation code to ... + (create_server_socket): ... this new function. + (main): Use create_server_socket() for creating sockets. + In case standard_socket is set, do not only store a socket name in + socket_name, but also in socket_name_ssh. + Generate additional environment info strings for ssh support. + Pass additional ssh socket argument to handle_connections. + (start_connection_thread_ssh): New function. + (handle_connections): Use select to multiplex between gpg-agent + and ssh-agent protocol. + + * agent.h (struct opt): New member: ssh_support. + (start_command_handler_ssh): Add prototype. + +2005-01-04 Werner Koch + + * trustlist.c (agent_marktrusted): Use "Cancel" for the first + confirmation and made the strings translatable. + + * cache.c (agent_put_cache): Fix the test for using the default + TTL. + +2004-12-21 Werner Koch + + * preset-passphrase.c (preset_passphrase): Handle --passphrase. + + * Makefile.am (gpg_preset_passphrase_LDADD): Reorder libs so that + pwquery may use stuff from jnlib. Conditionally add -lwsock2 + (gpg_protect_tool_LDADD): Ditto. + + * preset-passphrase.c (main): Use default_homedir(). + (main) [W32]: Initialize sockets. + +2004-12-21 Marcus Brinkmann + + * Makefile.am (libexec_PROGRAMS): Add gpg-preset-passphrase. + (gpg_preset_passphrase_SOURCES, gpg_preset_passphrase_LDADD): New + targets. + * agent.h (opt): New member allow_cache_passphrase. + * cache.c (housekeeping): Check if R->ttl is not negative. + (agent_put_cache): Allow ttl to be negative. + * command.c (parse_hexstring): Allow something to follow the + hexstring. + (cmd_cache_passphrase): New function. + (register_commands): Add it. + * gpg-agent.c: Handle --allow-preset-passphrase. + * preset-passphrase.c: New file. + +2004-12-21 Werner Koch + + * gpg-agent.c (main): Use default_homedir(). + * protect-tool.c (main): Ditto. + +2004-12-20 Werner Koch + + * gpg-agent.c (main) [W32]: Now that Mutexes work we can remove + the pth_init kludge. + (main): Add new options --[no-]use-standard-socket. + (check_for_running_agent): Check whether it is running on the + standard socket. + + * call-scd.c (init_membuf, put_membuf, get_membuf): Removed. We + now use the identical implementation from ../common/membuf.c. + + * pksign.c (agent_pksign): Changed arg OUTFP to OUTBUF and use + membuf functions to return the value. + * pkdecrypt.c (agent_pkdecrypt): Ditto. + * genkey.c (agent_genkey): Ditto. + * command.c (cmd_pksign, cmd_pkdecrypt, cmd_genkey): Replaced + assuan_get_data_fp() by a the membuf scheme. + (clear_outbuf, write_and_clear_outbuf): New. + +2004-12-19 Werner Koch + + * query.c (initialize_module_query): New. + * call-scd.c (initialize_module_call_scd): New. + * gpg-agent.c (main): Call them. + +2004-12-18 Werner Koch + + * gpg-agent.c (main): Remove special Pth initialize. + + * agent.h (map_assuan_err): Define in terms of + map_assuan_err_with_source. + +2004-12-17 Moritz Schulte + + * query.c: Undo change from 2004-12-05. + +2004-12-15 Werner Koch + + * gpg-agent.c [W32]: Various hacks to make it work. + + * findkey.c (agent_write_private_key) [W32]: Adjust open call. + + * call-scd.c (start_scd) [W32]: Don't check whether the daemon + didn't died. To hard to do under Windows. + (start_scd) [W32]: Disable sending of the event signal option. + + * protect-tool.c (read_file, export_p12_file) [W32]: Use setmode + to get stdout and stin into binary mode. + +2004-12-05 Moritz Schulte + + * query.c (start_pinentry): Allow CTRL be NULL. + +2004-10-22 Werner Koch + + * gpg-agent.c (parse_rereadable_options): Return "not handled" + when the log file has not beend hadled. This is will let the main + option processing continue. Fixed a bug introduced on 2004-09-4 + resulting in logging to stderr until a HUP has been given. + (main): Don't close the listen FD. + +2004-09-30 Werner Koch + + * Makefile.am: Adjusted from gettext 1.14. + +2004-09-29 Werner Koch + + * minip12.c (parse_bag_encrypted_data): Print error if a bad + passphrase has been given. + +2004-09-28 Werner Koch + + * protect.c (agent_unprotect): Fixed wiping of CLEARTEXT. Thanks + to Moritz for pointing this out. + +2004-09-25 Moritz Schulte + + * agent.h: Declare: agent_pksign_do. + (struct server_control_s): New member: raw_value. + + * pksign.c (do_encode_md): New argument: raw_value; support + generation of raw (non-pkcs1) data objects; adjust callers. + (agent_pksign_do): New function, based on code ripped + out from agent_pksign. + (agent_pksign): Use agent_pksign_do. + + * command.c (start_command_handler): Set ctrl.digest.raw_value. + +2004-09-09 Werner Koch + + * gpg-agent.c (check_for_running_agent): New. + (main): The default action is now to check for an already running + agent. + (parse_rereadable_options): Set logfile only on reread. + (main): Do not print the "is development version" note. + +2004-08-20 Werner Koch + + * gpg-agent.c: New option --max-cache-ttl. Suggested by Alexander + Belopolsky. + * cache.c (housekeeping): Use it here instead of the hardwired + default of 1 hour. + + * query.c (start_pinentry): Use a timeout for the pinentry lock. + +2004-08-18 Werner Koch + + * protect-tool.c (get_passphrase): Make sure that the default + prompts passed to gpg-agent are utf-8 encoded. Add new prompt values. + (import_p12_file, import_p12_file, export_p12_file): Changed calls + to get_passphrase so that better prompts are displayed. + (get_new_passphrase): New. + +2004-07-22 Werner Koch + + * trustlist.c (read_list): Allow colons in the fingerprint. + (headerblurb): Rephrased. + + * gpg-agent.c (handle_connections): Increase the stack size ot 256k. + +2004-06-20 Moritz Schulte + + * gpg-agent.c: Include (build fix for BSD). + +2004-05-11 Werner Koch + + * gpg-agent.c (handle_signal): Reload the trustlist on SIGHUP. + (start_connection_thread): Hack to simulate a ticker. + * trustlist.c (agent_trustlist_housekeeping) + (agent_reload_trustlist): New. Protected all global functions + here with a simple counter which is sufficient for Pth. + +2004-05-03 Werner Koch + + * gpg-agent.c: Remove help texts for options lile --lc-ctype. + (main): New option --allow-mark-trusted. + * trustlist.c (agent_marktrusted): Use it here. + +2004-04-30 Werner Koch + + * protect-tool.c: New option --enable-status-msg. + (store_private_key): Print status messages for imported keys. + (read_and_unprotect): Ditto for bad passphrase. + + * gpg-agent.c (parse_rereadable_options): New arg REREAD. Allow + changing oLogFile. + (current_logfile): New. + +2004-04-26 Werner Koch + + * call-scd.c (start_scd): Do not register an event signal if we + are running as a pipe server. + +2004-04-21 Werner Koch + + * call-scd.c (start_scd): Send event-signal option. Always check + that the scdaemon is still running. + + * gpg-agent.c (handle_signal): Do not use SIGUSR{1,2} anymore for + changing the verbosity. + +2004-04-16 Werner Koch + + * gpg-agent.c (main): Tell the logging code that we are running + detached. + +2004-04-06 Werner Koch + + * gpg-agent.c (main): Use new libgcrypt thread library register + scheme. + +2004-03-23 Marcus Brinkmann + + * gpg-agent.c (main): For now, always print the default config + file name for --gpgconf-list. + +2004-03-17 Werner Koch + + * gpg-agent.c (main) : Fixed default value quoting. + +2004-03-16 Werner Koch + + * gpg-agent.c (parse_rereadable_options): Use the new + DEFAULT_CACHE_TTL macro. + (main): Updated --gpgconf-list output. + +2004-02-21 Werner Koch + + * command.c (cmd_passwd): Take acount of a key description. + + * genkey.c (reenter_compare_cb): Do not set the error text. + (agent_protect_and_store, agent_genkey): Force a re-enter after a + non-matching passphrase. + * query.c (agent_askpin): Add new arg INITIAL_ERRTEXT; changed + all callers. + +2004-02-19 Werner Koch + + * protect-tool.c: New options --have-cert and --prompt. + (export_p12_file): Read a certificate from STDIN and pass it to + p12_build. Detect a keygrip and construct the filename in that + case. Unprotcet a key if needed. Print error messages for key + formats we can't handle. + (release_passphrase): New. + (get_passphrase): New arg PROMPTNO. Return the allocated + string. Changed all callers. + + * minip12.c: Revamped the build part. + (p12_build): New args CERT and CERTLEN. + +2004-02-18 Werner Koch + + * protect-tool.c (main): Setup the used character set. + * gpg-agent.c (main): Ditto. + + * gpg-agent.c (set_debug): New. New option --debug-level. + (main): New option --gpgconf-list. + +2004-02-17 Werner Koch + + * pksign.c (do_encode_md): Cleaned up by using gcry_sexp_build. + + * Makefile.am (gpg_protect_tool_SOURCES): Removed + simple-pwquery.[ch], as we once moved it to ../common. + +2004-02-13 Werner Koch + + * command.c (cmd_setkeydesc): New. + (register_commands): Add command SETKEYDESC. + (cmd_pksign, cmd_pkdecrypt): Use the key description. + (reset_notify): Reset the description. + * findkey.c (unprotect): Add arg DESC_TEXT. + (agent_key_from_file): Ditto. + * pksign.c (agent_pksign): Ditto. + * pkdecrypt.c (agent_pkdecrypt): Ditto. Made CIPHERTEXT an + unsigned char*. + + * protect-tool.c (main): New options --no-fail-on-exist, --homedir. + (store_private_key): Use them here. + +2004-02-12 Werner Koch + + * protect-tool.c (read_file, main): Allow reading from stdin. + + * Makefile.am: Include cmacros.am for common flags. + (libexec_PROGRAMS): Put gpg-protect-tool there. + +2004-02-10 Werner Koch + + * minip12.c (parse_bag_encrypted_data): Finished implementation. + (p12_parse): Add callback args. + * protect-tool.c (import_p12_cert_cb): New. + (import_p12_file): Use it. + +2004-02-06 Werner Koch + + * minip12.c (crypt_block): Add arg CIPHER_ALGO; changed all callers. + (set_key_iv): Add arg KEYBYTES; changed caller. + +2004-02-03 Werner Koch + + * findkey.c (agent_key_from_file): Extra paranoid wipe. + * protect.c (agent_unprotect): Ditto. + (merge_lists): Ditto. Add arg RESULTLEN. + * pkdecrypt.c (agent_pkdecrypt): Don't show the secret key even in + debug mode. + + * protect.c: Add DSA and Elgamal description. + +2004-01-29 Werner Koch + + * agent.h (server_control_s): Add connection_fd field. + * command.c (start_command_handler): Init it here. + * gpg-agent.c (agent_init_default_ctrl): and here. + * call-scd.c: Add the CTRL arg to all functions calling start_scd + and pass it to start_scd. Changed all callers + (start_scd): Keep track of the current active connection. + (agent_reset_scd): New. + * command.c (start_command_handler): Call it here. + * learncard.c (agent_handle_learn): Add arg CTRL; changed caller. + (send_cert_back): Ditto. + +2004-01-28 Werner Koch + + * trustlist.c (agent_marktrusted): Check whether the trustlist is + writable. + +2004-01-27 Werner Koch + + * sexp-parse.h: Moved to ../common. + +2004-01-24 Werner Koch + + * call-scd.c (atfork_cb): New. + (start_scd): Make sure secmem gets cleared. + * query.c (atfork_cb): New. + (start_pinentry): Make sure secmem gets cleared. + +2004-01-16 Werner Koch + + * findkey.c (agent_key_from_file): Now return an error code so + that we have more detailed error messages in the upper layers. + This fixes the handling of pinentry's cancel button. + * pksign.c (agent_pksign): Changed accordingly. + * pkdecrypt.c (agent_pkdecrypt): Ditto. + * command.c (cmd_passwd): Ditto. + +2003-12-16 Werner Koch + + * gpg-agent.c (main): Set the prefixes for assuan logging. + +2003-12-15 Werner Koch + + * protect.c (do_encryption): Use gcry_create_nonce instad of the + obsolete WEAK_RANDOM. + +2003-11-20 Werner Koch + + * sexp-parse.h (snext): Don't use atoi_1 and digitp macros, so + that this file is useful by other applications too. + +2003-10-27 Werner Koch + + * command.c (cmd_get_confirmation): New command. + +2003-08-20 Timo Schulz + + * pksign.c (do_encode_md): Allocate enough space. Cast md + byte to unsigned char to prevent sign extension. + +2003-08-14 Timo Schulz + + * pksign.c (do_encode_md): Due to the fact pkcs#1 padding + is now in Libgcrypt, use the new interface. + +2003-07-31 Werner Koch + + * Makefile.am (gpg_agent_LDADD): Added INTLLIBS. + (gpg_protect_tool_SOURCES): Added simple-pwquery.[ch] + +2003-07-27 Werner Koch + + Adjusted for gcry_mpi_print and gcry_mpi_scan API change. + +2003-07-15 Werner Koch + + * simple-pwquery.c, simple-pwquery.h: Moved to ../common. + * Makefile.am (gpg_protect_tool_LDADD): Add simple-pwquery.o. + Removed it from xx_SOURCES. + +2003-07-04 Werner Koch + + * gpg-agent.c (handle_connections): Kludge to allow use of Pth 1 + and 2. + +2003-06-30 Werner Koch + + * call-scd.c (learn_status_cb): Store the serialno in PARM. + +2003-06-26 Werner Koch + + * call-scd.c (agent_card_serialno): Don't do a RESET anymore. + +2003-06-25 Werner Koch + + * command.c (cmd_scd): New. + * call-scd.c (agent_card_scd): New. + * divert-scd.c (divert_generic_cmd): New + + * call-scd.c (agent_card_learn): New callback args SINFO. + (learn_status_cb): Pass all other status lines to the sinfo + callback. + * learncard.c (release_sinfo, sinfo_cb): New. + (agent_handle_learn): Pass the new cb to the learn function and + pass the collected information back to the client's assuan + connection. + + * gpg-agent.c (main): Moved pth_init before gcry_check_version. + +2003-06-24 Werner Koch + + * gpg-agent.c (handle_connections): Adjusted for Pth 2.0 + + Adjusted for changes in the libgcrypt API. Some more fixes for the + libgpg-error stuff. + +2003-06-04 Werner Koch + + Renamed error codes from INVALID to INV and removed _ERROR suffixes. + +2003-06-03 Werner Koch + + Changed all error codes in all files to the new libgpg-error scheme. + + * agent.h: Include gpg-error.h and errno.h + * Makefile.am: Link with libgpg-error + + * query.c: assuan.h is now a system header. + * genkey.c (agent_genkey): Fixed silly use of xmalloc by + xtrymalloc. + +2003-04-29 Werner Koch + + * command.c (register_commands): Adjusted for new Assuan semantics. + + * Makefile.am: Don't override LDFLAGS. + +2002-12-04 Werner Koch + + * gpg-agent.c: New variable config_filename. + (parse_rereadable_options): New. + (main): Use it here. Add setting of default values, set + config_filename. + (reread_configuration): Filled with actual code. + +2002-12-03 Werner Koch + + * protect-tool.c (read_key): Don't run make_canonical on a NULL + buffer. + + * command.c (parse_hexstring): New. + (cmd_sethash): Use it. + (parse_keygrip): New. + (cmd_havekey, cmd_sigkey): Use it. + (cmd_passwd): New. + * genkey.c (agent_protect_and_store): New. + (store_key): Add arg FORCE. + (agent_genkey): Pass false to this force of store_key. + +2002-11-13 Werner Koch + + * gpg-agent.c (main): Switch all messages to utf-8. + + * simple-pwquery.c (agent_send_all_options): Use $GPG_TTY and + stdin with ttyname. + + * cache.c (new_data): Uiih - /sizeof d/sizeof *d/. + +2002-11-10 Werner Koch + + * command.c (option_handler): Fix keep_tty check. + +2002-11-06 Werner Koch + + * gpg-agent.c (main): Make sure we have a default ttyname. + * command.c (option_handler): Check opt.keep_tty here + * query.c (start_pinentry): but not anymore here. + +2002-11-05 Werner Koch + + * agent.h (opt,server_control_s): Move display and lc_ variables + to the control struct so that they are per connection. + * gpg-agent.c (agent_init_default_ctrl): New. + (main): Assign those command line options to new default_* variables. + Reset DISPLAY in server mode so that tehre is no implicit default. + * command.c (start_command_handler): Initialize and deinitialize + the control values. + (option_handler): Work on the ctrl values and not on the opt. + * query.c (start_pinentry): New argument CTRL to set the display + connection specific. Changed all callers to pass this value. + (agent_askpin,agent_get_passphrase,agent_get_confirmation): Add + CTRL arg and pass it ot start_pinentry. + * command.c (cmd_get_passphrase): Pass CTRL argument. + * trustlist.c (agent_marktrusted): Add CTRL argument + * command.c (cmd_marktrusted): Pass CTRL argument + * divert-scd.c (ask_for_card): Add CTRL arg. + (divert_pksign,divert_pkdecrypt): Ditto. Changed caller. + (getpin_cb): Use OPAQUE to pass the CTRL variable. Changed both + users. + * findkey.c (unprotect): Add CTRL arg. + (agent_key_from_file): Ditto. + + * query.c (unlock_pinentry): Disconnect the pinentry so that we + start a new one for each request. This is required to support + clients with different environments (e.g. X magic cookies). + +2002-09-05 Neal H. Walfield + + * gpg-agent.c (main) [USE_GNU_PTH]: No need to call + assuan_set_io_func as assuan is smart. + +2002-09-25 Werner Koch + + * gpg-agent.c (handle_signal): Flush cache on SIGHUP. + * cache.c (agent_flush_cache): New. + + * gpg-agent.c, agent.h: Add --keep-display and --keep-tty. + * query.c (start_pinentry): Implement them. The option passing + needs more thoughts. + +2002-09-09 Werner Koch + + * gpg-agent.c (create_private_keys_directory) + (create_directories): New. + (main): Try to create a home directory. + +2002-09-04 Neal H. Walfield + + * gpg-agent.c (main): Use sigaction, not signal. + +2002-09-03 Neal H. Walfield + + * findkey.c: Include . + (agent_write_private_key): Prefer POSIX compatibity, open and + fdopen, over the simplicity of GNU extensions, fopen(file, "x"). + +2002-08-22 Werner Koch + + * query.c (agent_askpin): Provide the default desc text depending + on the pininfo. Do the basic PIN verification only when + min_digits is set. + +2002-08-21 Werner Koch + + * query.c (agent_askpin): Hack to show the right default prompt. + (agent_get_passphrase): Ditto. + + * trans.c: Removed and replaced all usages with standard _() + + * divert-scd.c (getpin_cb): Pass a more descritive text to the + pinentry. + + * Makefile.am: Renamed the binary protect-tool to gpg-protect-tool. + * protect-tool.c: Removed the note about internal use only. + + * gpg-agent.c (main): New option --daemon so that the program is + not accidently started in the background. + +2002-08-16 Werner Koch + + * call-scd.c (learn_status_cb): Handle CERTINFO status. + (agent_card_learn): Add args for certinfo cb. + * learncard.c (release_certinfo,certinfo_cb): New. + (send_cert_back): New. With factored out code from .. + (agent_handle_learn): here. Return certinfo stuff. + +2002-07-26 Werner Koch + + * gpg-agent.c (main): New option --ignore-cache-for-signing. + * command.c (option_handler): New server option + use-cache-for-signing defaulting to true. + (cmd_pksign): handle global and per session option. + * findkey.c (agent_key_from_file, unprotect): New arg + ignore_cache. Changed all callers. + * pksign.c (agent_pksign): Likewise. + +2002-06-29 Werner Koch + + * query.c (start_pinentry): Use GNUPG_DERAULT_PINENTRY. + * call-scd.c (start_scd): Use GNUPG_DEFAULT_SCDAEMON. + +2002-06-28 Werner Koch + + * protect-tool.c (export_p12_file): New. + (main): New command --p12-export. + * minip12.c (create_final,p12_build,compute_tag_length): New. + (store_tag_length): New. + +2002-06-27 Werner Koch + + * minip12.c (crypt_block): Renamed from decrypt_block, add arg to + allow encryption. + + * Makefile.am (pkglib_PROGRAMS): Put protect-tool there. + + * findkey.c (agent_write_private_key,agent_key_from_file) + (agent_key_available): Use GNUPG_PRIVATE_KEYS_DIR constant. + * gpg-agent.c (main): Use GNUPG_DEFAULT_HOMEDIR constant. + + * protect-tool.c (store_private_key): New. + (import_p12_file): Store the new file if requested. + (main): New options --force and --store. + + * gpg-agent.c (main): Set a global flag when running detached. + * query.c (start_pinentry): Pass the list of FD to keep in the + child when not running detached. + * call-scd.c (start_scd): Ditto. + +2002-06-26 Werner Koch + + * command.c (cmd_istrusted, cmd_listtrusted, cmd_marktrusted) + (cmd_pksign, cmd_pkdecrypt, cmd_genkey, cmd_get_passphrase) + (cmd_learn): Print an error message for a failed operation. + + * simple-pwquery.c, simple-pwquery.h: New. + * protect-tool. (get_passphrase): New, used to get a passphrase + from the agent if none was given on the command line. + +2002-06-25 Werner Koch + + * protect-tool.c (rsa_key_check): New. + (import_p12_file): New. + (main): New command --p12-import. + * minip12.c, minip12.h: New. + +2002-06-24 Werner Koch + + * protect-tool.c (read_file): New. + (read_key): Factored most code out to read_file. + +2002-06-17 Werner Koch + + * agent.h: Add a callback function to the pin_entry_info structure. + * query.c (agent_askpin): Use the callback to check for a correct + PIN. Removed the start_err_text argument because it is not + anymore needed; changed callers. + * findkey.c (unprotect): Replace our own check loop by a callback. + (try_unprotect_cb): New. + * genkey.c (reenter_compare_cb): New. + (agent_genkey): Use this callback here. Fixed setting of the pi2 + variable and a segv in case of an empty PIN. + + * divert-scd.c (getpin_cb): Removed some unused stuff and + explained what we still have to change. + +2002-06-12 Werner Koch + + * gpg-agent.c (main): New option --disable-pth. + +2002-06-11 Werner Koch + + * protect-tool.c: Add command --show-keygrip + (show_keygrip): New. + +2002-05-23 Werner Koch + + * call-scd.c: Seirialized all scdaeom access when using Pth. + + * cache.c: Made the cache Pth-thread-safe. + (agent_unlock_cache_entry): New. + * findkey.c (unprotect): Unlock the returned cache value. + * command.c (cmd_get_passphrase): Ditto. + + * gpg-agent.c (main): Register pth_read/write with Assuan. + +2002-05-22 Werner Koch + + * query.c: Serialized all pinentry access when using Pth. + + * gpg-agent.c (handle_signal,start_connection_thread) + (handle_connections): New + (main): Use the new Pth stuff to allow concurrent connections. + * command.c (start_command_handler): Add new arg FD so that the + fucntion can also be used for an already connected socket. + * Makefile.am: Link with Pth. + +2002-05-14 Werner Koch + + * cache.c (housekeeping, agent_put_cache): Use our time() wrapper. + +2002-04-26 Werner Koch + + * cache.c (agent_put_cache): Reinitialize the creation time and + the ttl when reusing a slot. + + * call-scd.c (start_scd): Print debug messages only with debug + flags set. + * query.c (start_pinentry): Ditto. + +2002-04-25 Marcus Brinkmann + + * agent.h (agent_get_confirmation): Replace paramter prompt with + two parameters ok and cancel. + * query.c (agent_get_confirmation): Likewise. Implement this. + * trustlist.c (agent_marktrusted): Fix invocation of + agent_get_confirmation. + * divert-scd.c (ask_for_card): Likewise. + +2002-04-24 Marcus Brinkmann + + * agent.h (struct opt): Add members display, ttyname, ttytype, + lc_ctype, and lc_messages. + * gpg-agent.c (enum cmd_and_opt_values): Add oDisplay, oTTYname, + oTTYtype, oLCctype, and LCmessages. + (main): Handle these options. + * command.c (option_handler): New function. + (register_commands): Register option handler. + * query.c (start_pinentry): Pass the various display and tty + options to the pinentry. + +2002-04-05 Werner Koch + + * protect-tool.c (show_file): New. Used as default action. + +2002-03-28 Werner Koch + + * divert-scd.c (encode_md_for_card): Don't do the pkcs-1 padding, + the scdaemon should take care of it. + (ask_for_card): Hack to not display the trailing zero. + +2002-03-11 Werner Koch + + * learncard.c (kpinfo_cb): Remove the content restrictions from + the keyID. + +2002-03-06 Werner Koch + + * learncard.c: New. + * divert-scd.c (ask_for_card): The serial number is binary so + convert it to hex here. + * findkey.c (agent_write_private_key): New. + * genkey.c (store_key): And use it here. + + * pkdecrypt.c (agent_pkdecrypt): Changed the way the diversion is done. + * divert-scd.c (divert_pkdecrypt): Changed interface and + implemented it. + +2002-03-05 Werner Koch + + * call-scd.c (inq_needpin): New. + (agent_card_pksign): Add getpin_cb args. + (agent_card_pkdecrypt): New. + +2002-03-04 Werner Koch + + * pksign.c (agent_pksign): Changed how the diversion is done. + * divert-scd.c (divert_pksign): Changed interface and implemented it. + (encode_md_for_card): New. + * call-scd.c (agent_card_pksign): New. + +2002-02-28 Werner Koch + + * pksign.c (agent_pksign): Detect whether a Smartcard is to be + used and divert the operation in this case. + * pkdecrypt.c (agent_pkdecrypt): Likewise + * findkey.c (agent_key_from_file): Add optional arg shadow_info + and have it return information about a shadowed key. + * protect.c (agent_get_shadow_info): New. + + * protect.c (snext,sskip,smatch): Moved to + * sexp-parse.h: New file. + * divert-scd.c: New. + +2002-02-27 Werner Koch + + * protect.c (agent_shadow_key): New. + + * command.c (cmd_learn): New command LEARN. + * gpg-agent.c: New option --scdaemon-program. + * call-scd.c (start_scd): New. Based on query.c + * query.c: Add 2 more arguments to all uses of assuan_transact. + +2002-02-18 Werner Koch + + * findkey.c (unprotect): Show an error message for a bad passphrase. + + * command.c (cmd_marktrusted): Implemented. + * trustlist.c (agent_marktrusted): New. + (open_list): Add APPEND arg. + + * query.c (agent_get_confirmation): New. + +2002-02-06 Werner Koch + + * cache.c (housekeeping): Fixed linking in the remove case. + +2002-02-01 Werner Koch + + * gpg-agent.c: New option --default-cache-ttl. + * cache.c (agent_put_cache): Use it. + + * cache.c: Add a few debug outputs. + + * protect.c (agent_private_key_type): New. + * agent.h: Add PRIVATE_KEY_ enums. + * findkey.c (agent_key_from_file): Use it to decide whether we + have to unprotect a key. + (unprotect): Cache the passphrase. + + * findkey.c (agent_key_from_file,agent_key_available): The key + files do now require a ".key" suffix to make a script's life + easier. + * genkey.c (store_key): Ditto. + +2002-01-31 Werner Koch + + * genkey.c (store_key): Protect the key. + (agent_genkey): Ask for the passphrase. + * findkey.c (unprotect): Actually unprotect the key. + * query.c (agent_askpin): Add an optional start_err_text. + +2002-01-30 Werner Koch + + * protect.c: New. + (hash_passphrase): Based on the GnuPG 1.0.6 version. + * protect-tool.c: New + +2002-01-29 Werner Koch + + * findkey.c (agent_key_available): New. + * command.c (cmd_havekey): New. + (register_commands): And register new command. + +2002-01-20 Werner Koch + + * command.c (cmd_get_passphrase): Remove the plus signs. + + * query.c (start_pinentry): Send no-grab option to pinentry + * gpg-agent.c (main): Move variable grab as no_grab to agent.h. + +2002-01-19 Werner Koch + + * gpg-agent.c (main): Disable core dumps. + + * cache.c: New. + * command.c (cmd_get_passphrase): Use the cache. + (cmd_clear_passphrase): Ditto. + + * gpg-agent.c: Removed unused cruft and implement the socket + based server. + (my_strusage): Take bug report address from configure.ac. + * command.c (start_command_handler): Add an argument to start as + regular server. + (start_command_handler): Enable Assuan logging. + +2002-01-15 Werner Koch + + * trustlist.c: New. + * command.c (cmd_istrusted, cmd_listtrusted, cmd_marktrusted): New. + +2002-01-07 Werner Koch + + * genkey.c: Store the secret part and return the public part. + +2002-01-03 Werner Koch + + * command.c (cmd_get_passphrase): New. + (cmd_clear_passphrase): New. + * query.c (agent_get_passphrase): New. + +2002-01-02 Werner Koch + + * genkey.c: New. + * command.c (cmd_genkey): New. + + * command.c (rc_to_assuan_status): Removed and changed all callers + to use map_to_assuan_status. + +2001-12-19 Werner Koch + + * keyformat.txt: New. + +2001-12-19 Marcus Brinkmann + + * query.c (start_pinentry): Add new argument to assuan_pipe_connect. + +2001-12-18 Werner Koch + + * Makefile.am: Use LIBGCRYPT macros + +2001-12-14 Werner Koch + + * gpg-agent.c (main): New option --batch. New option --debug-wait + n, so that it is possible to attach gdb when used in server mode. + * query.c (agent_askpin): Don't ask in batch mode. + + * command.c: Removed the conversion macros as they are now in + ../common/util.h. + +2001-12-14 Marcus Brinkmann + + * query.c (LINELENGTH): Removed. + (agent_askpin): Use ASSUAN_LINELENGTH, not LINELENGTH. + +2001-11-19 Werner Koch + + * gpg-agent.c: Removed all GUI code, removed code for old + protocol. New code to use the Assuan protocol as a server and + also to communicate with a new ask-passphrase utility. + +2000-11-22 Werner Koch + + * gpg-agent.c (main): csh support by Dan Winship, new options --sh + and --csh and set default by consulting $SHELL. + +Mon Aug 21 17:59:17 CEST 2000 Werner Koch + + * gpg-agent.c (passphrase_dialog): Cleanup the window and added the + user supplied text to the window. + (main): Fixed segv in gtk_init when used without a command to start. + + * gpg-agent.c: --flush option. + (req_flush): New. + (req_clear_passphrase): Implemented. + +Fri Aug 18 14:27:14 CEST 2000 Werner Koch + + * gpg-agent.c: New. + * Makefile.am: New. + + + Copyright 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/agent/Makefile.am b/agent/Makefile.am new file mode 100644 index 000000000..961f0bb97 --- /dev/null +++ b/agent/Makefile.am @@ -0,0 +1,90 @@ +# Copyright (C) 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. + +## Process this file with automake to produce Makefile.in + +bin_PROGRAMS = gpg-agent +libexec_PROGRAMS = gpg-protect-tool gpg-preset-passphrase +noinst_PROGRAMS = $(TESTS) + +AM_CPPFLAGS = -I$(top_srcdir)/gl -I$(top_srcdir)/common -I$(top_srcdir)/intl + +include $(top_srcdir)/am/cmacros.am + +AM_CFLAGS = $(LIBGCRYPT_CFLAGS) $(LIBASSUAN_CFLAGS) $(PTH_CFLAGS) + +gpg_agent_SOURCES = \ + gpg-agent.c agent.h \ + command.c command-ssh.c \ + query.c \ + cache.c \ + trans.c \ + findkey.c \ + pksign.c \ + pkdecrypt.c \ + genkey.c \ + protect.c \ + trustlist.c \ + divert-scd.c \ + call-scd.c \ + learncard.c + + +gpg_agent_LDADD = ../jnlib/libjnlib.a ../common/libcommon.a ../gl/libgnu.a \ + $(LIBGCRYPT_LIBS) $(PTH_LIBS) $(LIBASSUAN_LIBS) \ + -lgpg-error @LIBINTL@ $(NETLIBS) + +gpg_protect_tool_SOURCES = \ + protect-tool.c \ + protect.c \ + minip12.c minip12.h + +# Needs $(NETLIBS) for libsimple-pwquery.la. +gpg_protect_tool_LDADD = ../common/libsimple-pwquery.a \ + ../jnlib/libjnlib.a ../common/libcommon.a ../gl/libgnu.a \ + $(LIBGCRYPT_LIBS) -lgpg-error @LIBINTL@ $(NETLIBS) +if HAVE_W32_SYSTEM +gpg_protect_tool_LDADD += -lwsock32 +endif + +gpg_preset_passphrase_SOURCES = \ + preset-passphrase.c + +# Needs $(NETLIBS) for libsimple-pwquery.la. +gpg_preset_passphrase_LDADD = ../common/libsimple-pwquery.a \ + ../jnlib/libjnlib.a ../common/libcommon.a ../gl/libgnu.a \ + $(LIBGCRYPT_LIBS) -lgpg-error @LIBINTL@ $(NETLIBS) +if HAVE_W32_SYSTEM +gpg_preset_passphrase_LDADD += -lwsock32 +endif + +# +# Module tests +# +TESTS = t-protect + +t_common_ldadd = ../jnlib/libjnlib.a ../common/libcommon.a ../gl/libgnu.a \ + $(LIBGCRYPT_LIBS) -lgpg-error @LIBINTL@ + +t_protect_SOURCES = t-protect.c protect.c +t_protect_LDADD = $(t_common_ldadd) + + + + diff --git a/agent/agent.h b/agent/agent.h new file mode 100644 index 000000000..fdfe510fb --- /dev/null +++ b/agent/agent.h @@ -0,0 +1,319 @@ +/* agent.h - Global definitions for the agent + * Copyright (C) 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. + */ + +#ifndef AGENT_H +#define AGENT_H + +#ifdef GPG_ERR_SOURCE_DEFAULT +#error GPG_ERR_SOURCE_DEFAULT already defined +#endif +#define GPG_ERR_SOURCE_DEFAULT GPG_ERR_SOURCE_GPGAGENT +#include +#define map_assuan_err(a) \ + map_assuan_err_with_source (GPG_ERR_SOURCE_DEFAULT, (a)) +#include + +#include +#include "../common/util.h" +#include "../common/errors.h" +#include "membuf.h" + +/* Convenience function to be used instead of returning the old + GNUPG_Out_Of_Core. */ +static inline gpg_error_t +out_of_core (void) +{ + return gpg_error (gpg_err_code_from_errno (errno)); +} + +#define MAX_DIGEST_LEN 24 + +/* A large struct name "opt" to keep global flags */ +struct { + unsigned int debug; /* Debug flags (DBG_foo_VALUE) */ + int verbose; /* Verbosity level */ + int quiet; /* Be as quiet as possible */ + int dry_run; /* Don't change any persistent data */ + int batch; /* Batch mode */ + const char *homedir; /* Configuration directory name */ + + /* Environment setting gathered at program start or changed using the + Assuan command UPDATESTARTUPTTY. */ + char *startup_display; + char *startup_ttyname; + char *startup_ttytype; + char *startup_lc_ctype; + char *startup_lc_messages; + + + const char *pinentry_program; /* Filename of the program to start as + pinentry. */ + const char *scdaemon_program; /* Filename of the program to handle + smartcard tasks. */ + int disable_scdaemon; /* Never use the SCdaemon. */ + int no_grab; /* Don't let the pinentry grab the keyboard */ + + /* The default and maximum TTL of cache entries. */ + unsigned long def_cache_ttl; /* Default. */ + unsigned long def_cache_ttl_ssh; /* for SSH. */ + unsigned long max_cache_ttl; /* Default. */ + unsigned long max_cache_ttl_ssh; /* for SSH. */ + + + int running_detached; /* We are running detached from the tty. */ + + int ignore_cache_for_signing; + int allow_mark_trusted; + int allow_preset_passphrase; + int keep_tty; /* Don't switch the TTY (for pinentry) on request */ + int keep_display; /* Don't switch the DISPLAY (for pinentry) on request */ + int ssh_support; /* Enable ssh-agent emulation. */ +} opt; + + +#define DBG_COMMAND_VALUE 1 /* debug commands i/o */ +#define DBG_MPI_VALUE 2 /* debug mpi details */ +#define DBG_CRYPTO_VALUE 4 /* debug low level crypto */ +#define DBG_MEMORY_VALUE 32 /* debug memory allocation stuff */ +#define DBG_CACHE_VALUE 64 /* debug the caching */ +#define DBG_MEMSTAT_VALUE 128 /* show memory statistics */ +#define DBG_HASHING_VALUE 512 /* debug hashing operations */ +#define DBG_ASSUAN_VALUE 1024 + +#define DBG_COMMAND (opt.debug & DBG_COMMAND_VALUE) +#define DBG_CRYPTO (opt.debug & DBG_CRYPTO_VALUE) +#define DBG_MEMORY (opt.debug & DBG_MEMORY_VALUE) +#define DBG_CACHE (opt.debug & DBG_CACHE_VALUE) +#define DBG_HASHING (opt.debug & DBG_HASHING_VALUE) +#define DBG_ASSUAN (opt.debug & DBG_ASSUAN_VALUE) + +struct server_local_s; +struct scd_local_s; + +/* Collection of data per session (aka connection). */ +struct server_control_s +{ + /* Private data of the server (command.c). */ + struct server_local_s *server_local; + + /* Private data of the SCdaemon (call-scd.c). */ + struct scd_local_s *scd_local; + + int connection_fd; /* -1 or an identifier for the current connection. */ + + char *display; + char *ttyname; + char *ttytype; + char *lc_ctype; + char *lc_messages; + struct { + int algo; + unsigned char value[MAX_DIGEST_LEN]; + int valuelen; + int raw_value: 1; + } digest; + unsigned char keygrip[20]; + int have_keygrip; + + int use_auth_call; /* Hack to send the PKAUTH command instead of the + PKSIGN command to the scdaemon. */ +}; +typedef struct server_control_s *CTRL; +typedef struct server_control_s *ctrl_t; + + +struct pin_entry_info_s { + int min_digits; /* min. number of digits required or 0 for freeform entry */ + int max_digits; /* max. number of allowed digits allowed*/ + int max_tries; + int failed_tries; + int (*check_cb)(struct pin_entry_info_s *); /* CB used to check the PIN */ + void *check_cb_arg; /* optional argument which might be of use in the CB */ + const char *cb_errtext; /* used by the cb to displaye a specific error */ + size_t max_length; /* allocated length of the buffer */ + char pin[1]; +}; + + +enum + { + PRIVATE_KEY_UNKNOWN = 0, + PRIVATE_KEY_CLEAR = 1, + PRIVATE_KEY_PROTECTED = 2, + PRIVATE_KEY_SHADOWED = 3 + }; + + +/* Values for the cache_mode arguments. */ +typedef enum + { + CACHE_MODE_IGNORE = 0, /* Special mode to by pass the cache. */ + CACHE_MODE_ANY, /* Any mode except ignore matches. */ + CACHE_MODE_NORMAL, /* Normal cache (gpg-agent). */ + CACHE_MODE_USER, /* GET_PASSPHRASE related cache. */ + CACHE_MODE_SSH /* SSH related cache. */ + } +cache_mode_t; + + +/*-- gpg-agent.c --*/ +void agent_exit (int rc) JNLIB_GCC_A_NR; /* Also implemented in other tools */ +void agent_init_default_ctrl (struct server_control_s *ctrl); + +/*-- command.c --*/ +void start_command_handler (int, int); + +/*-- command-ssh.c --*/ +void start_command_handler_ssh (int); + +/*-- findkey.c --*/ +int agent_write_private_key (const unsigned char *grip, + const void *buffer, size_t length, int force); +gpg_error_t agent_key_from_file (ctrl_t ctrl, + const char *desc_text, + const unsigned char *grip, + unsigned char **shadow_info, + cache_mode_t cache_mode, + gcry_sexp_t *result); +gpg_error_t agent_public_key_from_file (ctrl_t ctrl, + const unsigned char *grip, + gcry_sexp_t *result); +int agent_key_available (const unsigned char *grip); + +/*-- query.c --*/ +void initialize_module_query (void); +void agent_query_dump_state (void); +void agent_reset_query (ctrl_t ctrl); +int agent_askpin (ctrl_t ctrl, + const char *desc_text, const char *prompt_text, + const char *inital_errtext, + struct pin_entry_info_s *pininfo); +int agent_get_passphrase (ctrl_t ctrl, char **retpass, + const char *desc, const char *prompt, + const char *errtext); +int agent_get_confirmation (ctrl_t ctrl, const char *desc, const char *ok, + const char *cancel); +int agent_popup_message_start (ctrl_t ctrl, const char *desc, + const char *ok_btn, const char *cancel_btn); +void agent_popup_message_stop (ctrl_t ctrl); + + +/*-- cache.c --*/ +void agent_flush_cache (void); +int agent_put_cache (const char *key, cache_mode_t cache_mode, + const char *data, int ttl); +const char *agent_get_cache (const char *key, cache_mode_t cache_mode, + void **cache_id); +void agent_unlock_cache_entry (void **cache_id); + + +/*-- pksign.c --*/ +int agent_pksign_do (ctrl_t ctrl, const char *desc_text, + gcry_sexp_t *signature_sexp, + cache_mode_t cache_mode); +int agent_pksign (ctrl_t ctrl, const char *desc_text, + membuf_t *outbuf, cache_mode_t cache_mode); + +/*-- pkdecrypt.c --*/ +int agent_pkdecrypt (ctrl_t ctrl, const char *desc_text, + const unsigned char *ciphertext, size_t ciphertextlen, + membuf_t *outbuf); + +/*-- genkey.c --*/ +int agent_genkey (ctrl_t ctrl, + const char *keyparam, size_t keyparmlen, membuf_t *outbuf); +int agent_protect_and_store (ctrl_t ctrl, gcry_sexp_t s_skey); + +/*-- protect.c --*/ +int agent_protect (const unsigned char *plainkey, const char *passphrase, + unsigned char **result, size_t *resultlen); +int agent_unprotect (const unsigned char *protectedkey, const char *passphrase, + unsigned char **result, size_t *resultlen); +int agent_private_key_type (const unsigned char *privatekey); +unsigned char *make_shadow_info (const char *serialno, const char *idstring); +int agent_shadow_key (const unsigned char *pubkey, + const unsigned char *shadow_info, + unsigned char **result); +int agent_get_shadow_info (const unsigned char *shadowkey, + unsigned char const **shadow_info); + + +/*-- trustlist.c --*/ +int agent_istrusted (const char *fpr); +int agent_listtrusted (void *assuan_context); +int agent_marktrusted (ctrl_t ctrl, const char *name, + const char *fpr, int flag); +void agent_trustlist_housekeeping (void); +void agent_reload_trustlist (void); + + +/*-- divert-scd.c --*/ +int divert_pksign (ctrl_t ctrl, + const unsigned char *digest, size_t digestlen, int algo, + const unsigned char *shadow_info, unsigned char **r_sig); +int divert_pkdecrypt (ctrl_t ctrl, + const unsigned char *cipher, + const unsigned char *shadow_info, + char **r_buf, size_t *r_len); +int divert_generic_cmd (ctrl_t ctrl, + const char *cmdline, void *assuan_context); + + +/*-- call-scd.c --*/ +void initialize_module_call_scd (void); +void agent_scd_dump_state (void); +void agent_scd_check_aliveness (void); +int agent_reset_scd (ctrl_t ctrl); +int agent_card_learn (ctrl_t ctrl, + void (*kpinfo_cb)(void*, const char *), + void *kpinfo_cb_arg, + void (*certinfo_cb)(void*, const char *), + void *certinfo_cb_arg, + void (*sinfo_cb)(void*, const char *, + size_t, const char *), + void *sinfo_cb_arg); +int agent_card_serialno (ctrl_t ctrl, char **r_serialno); +int agent_card_pksign (ctrl_t ctrl, + const char *keyid, + int (*getpin_cb)(void *, const char *, char*, size_t), + void *getpin_cb_arg, + const unsigned char *indata, size_t indatalen, + unsigned char **r_buf, size_t *r_buflen); +int agent_card_pkdecrypt (ctrl_t ctrl, + const char *keyid, + int (*getpin_cb)(void *, const char *, char*,size_t), + void *getpin_cb_arg, + const unsigned char *indata, size_t indatalen, + char **r_buf, size_t *r_buflen); +int agent_card_readcert (ctrl_t ctrl, + const char *id, char **r_buf, size_t *r_buflen); +int agent_card_readkey (ctrl_t ctrl, const char *id, unsigned char **r_buf); +gpg_error_t agent_card_getattr (ctrl_t ctrl, const char *name, char **result); +int agent_card_scd (ctrl_t ctrl, const char *cmdline, + int (*getpin_cb)(void *, const char *, char*, size_t), + void *getpin_cb_arg, void *assuan_context); + + +/*-- learncard.c --*/ +int agent_handle_learn (ctrl_t ctrl, void *assuan_context); + + +#endif /*AGENT_H*/ diff --git a/agent/cache.c b/agent/cache.c new file mode 100644 index 000000000..2f468396d --- /dev/null +++ b/agent/cache.c @@ -0,0 +1,342 @@ +/* cache.c - keep a cache of passphrases + * 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. + */ + +#include + +#include +#include +#include +#include +#include + +#include "agent.h" + +struct secret_data_s { + int totallen; /* this includes the padding */ + int datalen; /* actual data length */ + char data[1]; +}; + +typedef struct cache_item_s *ITEM; +struct cache_item_s { + ITEM next; + time_t created; + time_t accessed; + int ttl; /* max. lifetime given in seconds, -1 one means infinite */ + int lockcount; + struct secret_data_s *pw; + cache_mode_t cache_mode; + char key[1]; +}; + + +static ITEM thecache; + + +static void +release_data (struct secret_data_s *data) +{ + xfree (data); +} + +static struct secret_data_s * +new_data (const void *data, size_t length) +{ + struct secret_data_s *d; + int total; + + /* we pad the data to 32 bytes so that it get more complicated + finding something out by watching allocation patterns. This is + usally not possible but we better assume nothing about our + secure storage provider*/ + total = length + 32 - (length % 32); + + d = gcry_malloc_secure (sizeof *d + total - 1); + if (d) + { + d->totallen = total; + d->datalen = length; + memcpy (d->data, data, length); + } + return d; +} + + + +/* check whether there are items to expire */ +static void +housekeeping (void) +{ + ITEM r, rprev; + time_t current = gnupg_get_time (); + + /* First expire the actual data */ + for (r=thecache; r; r = r->next) + { + if (!r->lockcount && r->pw + && r->ttl >= 0 && r->accessed + r->ttl < current) + { + if (DBG_CACHE) + log_debug (" expired `%s' (%ds after last access)\n", + r->key, r->ttl); + release_data (r->pw); + r->pw = NULL; + r->accessed = current; + } + } + + /* Second, make sure that we also remove them based on the created stamp so + that the user has to enter it from time to time. */ + for (r=thecache; r; r = r->next) + { + unsigned long maxttl; + + switch (r->cache_mode) + { + case CACHE_MODE_SSH: maxttl = opt.max_cache_ttl_ssh; break; + default: maxttl = opt.max_cache_ttl; break; + } + if (!r->lockcount && r->pw && r->created + maxttl < current) + { + if (DBG_CACHE) + log_debug (" expired `%s' (%lus after creation)\n", + r->key, opt.max_cache_ttl); + release_data (r->pw); + r->pw = NULL; + r->accessed = current; + } + } + + /* Third, make sure that we don't have too many items in the list. + Expire old and unused entries after 30 minutes */ + for (rprev=NULL, r=thecache; r; ) + { + if (!r->pw && r->ttl >= 0 && r->accessed + 60*30 < current) + { + if (r->lockcount) + { + log_error ("can't remove unused cache entry `%s' due to" + " lockcount=%d\n", + r->key, r->lockcount); + r->accessed += 60*10; /* next error message in 10 minutes */ + rprev = r; + r = r->next; + } + else + { + ITEM r2 = r->next; + if (DBG_CACHE) + log_debug (" removed `%s' (slot not used for 30m)\n", r->key); + xfree (r); + if (!rprev) + thecache = r2; + else + rprev->next = r2; + r = r2; + } + } + else + { + rprev = r; + r = r->next; + } + } +} + + +void +agent_flush_cache (void) +{ + ITEM r; + + if (DBG_CACHE) + log_debug ("agent_flush_cache\n"); + + for (r=thecache; r; r = r->next) + { + if (!r->lockcount && r->pw) + { + if (DBG_CACHE) + log_debug (" flushing `%s'\n", r->key); + release_data (r->pw); + r->pw = NULL; + r->accessed = 0; + } + else if (r->lockcount && r->pw) + { + if (DBG_CACHE) + log_debug (" marked `%s' for flushing\n", r->key); + r->accessed = 0; + r->ttl = 0; + } + } +} + + + +/* Store DATA of length DATALEN in the cache under KEY and mark it + with a maximum lifetime of TTL seconds. If there is already data + under this key, it will be replaced. Using a DATA of NULL deletes + the entry. A TTL of 0 is replaced by the default TTL and a TTL of + -1 set infinite timeout. CACHE_MODE is stored with the cache entry + and used t select different timeouts. */ +int +agent_put_cache (const char *key, cache_mode_t cache_mode, + const char *data, int ttl) +{ + ITEM r; + + if (DBG_CACHE) + log_debug ("agent_put_cache `%s' requested ttl=%d mode=%d\n", + key, ttl, cache_mode); + housekeeping (); + + if (!ttl) + { + switch(cache_mode) + { + case CACHE_MODE_SSH: ttl = opt.def_cache_ttl_ssh; break; + default: ttl = opt.def_cache_ttl; break; + } + } + if (!ttl || cache_mode == CACHE_MODE_IGNORE) + return 0; + + for (r=thecache; r; r = r->next) + { + if (!r->lockcount && !strcmp (r->key, key)) + break; + } + if (r) + { /* replace */ + if (r->pw) + { + release_data (r->pw); + r->pw = NULL; + } + if (data) + { + r->created = r->accessed = gnupg_get_time (); + r->ttl = ttl; + r->cache_mode = cache_mode; + r->pw = new_data (data, strlen (data)+1); + if (!r->pw) + log_error ("out of core while allocating new cache item\n"); + } + } + else if (data) + { /* simply insert */ + r = xtrycalloc (1, sizeof *r + strlen (key)); + if (!r) + log_error ("out of core while allocating new cache control\n"); + else + { + strcpy (r->key, key); + r->created = r->accessed = gnupg_get_time (); + r->ttl = ttl; + r->cache_mode = cache_mode; + r->pw = new_data (data, strlen (data)+1); + if (!r->pw) + { + log_error ("out of core while allocating new cache item\n"); + xfree (r); + } + else + { + r->next = thecache; + thecache = r; + } + } + } + return 0; +} + + +/* Try to find an item in the cache. Note that we currently don't + make use of CACHE_MODE. */ +const char * +agent_get_cache (const char *key, cache_mode_t cache_mode, void **cache_id) +{ + ITEM r; + + if (cache_mode == CACHE_MODE_IGNORE) + return NULL; + + if (DBG_CACHE) + log_debug ("agent_get_cache `%s'...\n", key); + housekeeping (); + + /* first try to find one with no locks - this is an updated cache + entry: We might have entries with a lockcount and without a + lockcount. */ + for (r=thecache; r; r = r->next) + { + if (!r->lockcount && r->pw && !strcmp (r->key, key)) + { + /* put_cache does only put strings into the cache, so we + don't need the lengths */ + r->accessed = gnupg_get_time (); + if (DBG_CACHE) + log_debug ("... hit\n"); + r->lockcount++; + *cache_id = r; + return r->pw->data; + } + } + /* again, but this time get even one with a lockcount set */ + for (r=thecache; r; r = r->next) + { + if (r->pw && !strcmp (r->key, key)) + { + r->accessed = gnupg_get_time (); + if (DBG_CACHE) + log_debug ("... hit (locked)\n"); + r->lockcount++; + *cache_id = r; + return r->pw->data; + } + } + if (DBG_CACHE) + log_debug ("... miss\n"); + + *cache_id = NULL; + return NULL; +} + + +void +agent_unlock_cache_entry (void **cache_id) +{ + ITEM r; + + for (r=thecache; r; r = r->next) + { + if (r == *cache_id) + { + if (!r->lockcount) + log_error ("trying to unlock non-locked cache entry `%s'\n", + r->key); + else + r->lockcount--; + return; + } + } +} diff --git a/agent/call-scd.c b/agent/call-scd.c new file mode 100644 index 000000000..d0d24f9d5 --- /dev/null +++ b/agent/call-scd.c @@ -0,0 +1,1092 @@ +/* call-scd.c - fork of the scdaemon to do SC operations + * 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef HAVE_W32_SYSTEM +#include +#endif +#include + +#include "agent.h" +#include + +#ifdef _POSIX_OPEN_MAX +#define MAX_OPEN_FDS _POSIX_OPEN_MAX +#else +#define MAX_OPEN_FDS 20 +#endif + +/* Definition of module local data of the CTRL structure. */ +struct scd_local_s +{ + /* We keep a list of all allocated context with a an achnor at + SCD_LOCAL_LIST (see below). */ + struct scd_local_s *next_local; + + /* We need to get back to the ctrl object actually referencing this + structure. This is really an awkward way of enumerint the lcoal + contects. A much cleaner way would be to keep a global list of + ctrl objects to enumerate them. */ + ctrl_t ctrl_backlink; + + assuan_context_t ctx; /* NULL or session context for the SCdaemon + used with this connection. */ + int locked; /* This flag is used to assert proper use of + start_scd and unlock_scd. */ + +}; + + +/* Callback parameter for learn card */ +struct learn_parm_s +{ + void (*kpinfo_cb)(void*, const char *); + void *kpinfo_cb_arg; + void (*certinfo_cb)(void*, const char *); + void *certinfo_cb_arg; + void (*sinfo_cb)(void*, const char *, size_t, const char *); + void *sinfo_cb_arg; +}; + +struct inq_needpin_s +{ + assuan_context_t ctx; + int (*getpin_cb)(void *, const char *, char*, size_t); + void *getpin_cb_arg; +}; + + +/* To keep track of all active SCD contexts, we keep a linked list + anchored at this variable. */ +static struct scd_local_s *scd_local_list; + +/* A Mutex used inside the start_scd function. */ +static pth_mutex_t start_scd_lock; + +/* A malloced string with the name of the socket to be used for + additional connections. May be NULL if not provided by + SCdaemon. */ +static char *socket_name; + +/* The context of the primary connection. This is also used as a flag + to indicate whether the scdaemon has been started. */ +static assuan_context_t primary_scd_ctx; + +/* To allow reuse of the primary connection, the following flag is set + to true if the primary context has been reset and is not in use by + any connection. */ +static int primary_scd_ctx_reusable; + + + +/* Local prototypes. */ +static assuan_error_t membuf_data_cb (void *opaque, + const void *buffer, size_t length); + + + + +/* This function must be called once to initialize this module. This + has to be done before a second thread is spawned. We can't do the + static initialization because Pth emulation code might not be able + to do a static init; in particular, it is not possible for W32. */ +void +initialize_module_call_scd (void) +{ + static int initialized; + + if (!initialized) + { + if (!pth_mutex_init (&start_scd_lock)) + log_fatal ("error initializing mutex: %s\n", strerror (errno)); + initialized = 1; + } +} + + +static void +dump_mutex_state (pth_mutex_t *m) +{ + if (!(m->mx_state & PTH_MUTEX_INITIALIZED)) + log_printf ("not_initialized"); + else if (!(m->mx_state & PTH_MUTEX_LOCKED)) + log_printf ("not_locked"); + else + log_printf ("locked tid=0x%lx count=%lu", (long)m->mx_owner, m->mx_count); +} + + +/* This function may be called to print infromation pertaining to the + current state of this module to the log. */ +void +agent_scd_dump_state (void) +{ + log_info ("agent_scd_dump_state: scd_lock="); + dump_mutex_state (&start_scd_lock); + log_printf ("\n"); + log_info ("agent_scd_dump_state: primary_scd_ctx=%p pid=%ld reusable=%d\n", + primary_scd_ctx, + (long)assuan_get_pid (primary_scd_ctx), + primary_scd_ctx_reusable); + if (socket_name) + log_info ("agent_scd_dump_state: socket=`%s'\n", socket_name); +} + + +/* The unlock_scd function shall be called after having accessed the + SCD. It is currently not very useful but gives an opportunity to + keep track of connections currently calling SCD. Note that the + "lock" operation is done by the start_scd() function which must be + called and error checked before any SCD operation. CTRL is the + usual connection context and RC the error code to be passed trhough + the function. */ +static int +unlock_scd (ctrl_t ctrl, int rc) +{ + if (ctrl->scd_local->locked != 1) + { + log_error ("unlock_scd: invalid lock count (%d)\n", + ctrl->scd_local->locked); + if (!rc) + rc = gpg_error (GPG_ERR_INTERNAL); + } + ctrl->scd_local->locked = 0; + return rc; +} + +/* To make sure we leave no secrets in our image after forking of the + scdaemon, we use this callback. */ +static void +atfork_cb (void *opaque, int where) +{ + if (!where) + gcry_control (GCRYCTL_TERM_SECMEM); +} + + +/* Fork off the SCdaemon if this has not already been done. Lock the + daemon and make sure that a proper context has been setup in CTRL. + Thsi fucntion might also lock the daemon, which means that the + caller must call unlock_scd after this fucntion has returned + success and the actual Assuan transaction been done. */ +static int +start_scd (ctrl_t ctrl) +{ + gpg_error_t err = 0; + const char *pgmname; + assuan_context_t ctx; + const char *argv[3]; + int no_close_list[3]; + int i; + int rc; + + if (opt.disable_scdaemon) + return gpg_error (GPG_ERR_NOT_SUPPORTED); + + /* If this is the first call for this session, setup the local data + structure. */ + if (!ctrl->scd_local) + { + ctrl->scd_local = xtrycalloc (1, sizeof *ctrl->scd_local); + if (!ctrl->scd_local) + return gpg_error_from_errno (errno); + ctrl->scd_local->ctrl_backlink = ctrl; + ctrl->scd_local->next_local = scd_local_list; + scd_local_list = ctrl->scd_local; + } + + + /* Assert that the lock count is as expected. */ + if (ctrl->scd_local->locked) + { + log_error ("start_scd: invalid lock count (%d)\n", + ctrl->scd_local->locked); + return gpg_error (GPG_ERR_INTERNAL); + } + ctrl->scd_local->locked++; + + if (ctrl->scd_local->ctx) + return 0; /* Okay, the context is fine. We used to test for an + alive context here and do an disconnect. Now that we + have a ticker function to check for it, it is easier + not to check here but to let the connection run on an + error instead. */ + + + /* We need to protect the following code. */ + if (!pth_mutex_acquire (&start_scd_lock, 0, NULL)) + { + log_error ("failed to acquire the start_scd lock: %s\n", + strerror (errno)); + return gpg_error (GPG_ERR_INTERNAL); + } + + /* Check whether the pipe server has already been started and in + this case either reuse a lingering pipe connection or establish a + new socket based one. */ + if (primary_scd_ctx && primary_scd_ctx_reusable) + { + ctx = primary_scd_ctx; + primary_scd_ctx_reusable = 0; + if (opt.verbose) + log_info ("new connection to SCdaemon established (reusing)\n"); + goto leave; + } + + if (socket_name) + { + rc = assuan_socket_connect (&ctx, socket_name, 0); + if (rc) + { + log_error ("can't connect to socket `%s': %s\n", + socket_name, assuan_strerror (rc)); + err = gpg_error (GPG_ERR_NO_SCDAEMON); + goto leave; + } + + if (opt.verbose) + log_info ("new connection to SCdaemon established\n"); + goto leave; + } + + if (primary_scd_ctx) + { + log_info ("SCdaemon is running but won't accept further connections\n"); + err = gpg_error (GPG_ERR_NO_SCDAEMON); + goto leave; + } + + /* Nope, it has not been started. Fire it up now. */ + if (opt.verbose) + log_info ("no running SCdaemon - starting it\n"); + + if (fflush (NULL)) + { + err = gpg_error (gpg_err_code_from_errno (errno)); + log_error ("error flushing pending output: %s\n", strerror (errno)); + goto leave; + } + + if (!opt.scdaemon_program || !*opt.scdaemon_program) + opt.scdaemon_program = GNUPG_DEFAULT_SCDAEMON; + if ( !(pgmname = strrchr (opt.scdaemon_program, '/'))) + pgmname = opt.scdaemon_program; + else + pgmname++; + + argv[0] = pgmname; + argv[1] = "--multi-server"; + argv[2] = NULL; + + i=0; + if (!opt.running_detached) + { + if (log_get_fd () != -1) + no_close_list[i++] = log_get_fd (); + no_close_list[i++] = fileno (stderr); + } + no_close_list[i] = -1; + + /* Connect to the pinentry and perform initial handshaking */ + rc = assuan_pipe_connect2 (&ctx, opt.scdaemon_program, (char**)argv, + no_close_list, atfork_cb, NULL); + if (rc) + { + log_error ("can't connect to the SCdaemon: %s\n", + assuan_strerror (rc)); + err = gpg_error (GPG_ERR_NO_SCDAEMON); + goto leave; + } + + if (opt.verbose) + log_debug ("first connection to SCdaemon established\n"); + + /* Get the name of the additional socket opened by scdaemon. */ + { + membuf_t data; + unsigned char *databuf; + size_t datalen; + + xfree (socket_name); + socket_name = NULL; + init_membuf (&data, 256); + assuan_transact (ctx, "GETINFO socket_name", + membuf_data_cb, &data, NULL, NULL, NULL, NULL); + + databuf = get_membuf (&data, &datalen); + if (databuf && datalen) + { + socket_name = xtrymalloc (datalen + 1); + if (!socket_name) + log_error ("warning: can't store socket name: %s\n", + strerror (errno)); + else + { + memcpy (socket_name, databuf, datalen); + socket_name[datalen] = 0; + if (DBG_ASSUAN) + log_debug ("additional connections at `%s'\n", socket_name); + } + } + xfree (databuf); + } + + /* Tell the scdaemon we want him to send us an event signal. */ +#ifndef HAVE_W32_SYSTEM + { + char buf[100]; + + sprintf (buf, "OPTION event-signal=%d", SIGUSR2); + assuan_transact (ctx, buf, NULL, NULL, NULL, NULL, NULL, NULL); + } +#endif + + primary_scd_ctx = ctx; + primary_scd_ctx_reusable = 0; + + leave: + if (err) + { + unlock_scd (ctrl, err); + } + else + { + ctrl->scd_local->ctx = ctx; + } + if (!pth_mutex_release (&start_scd_lock)) + log_error ("failed to release the start_scd lock: %s\n", strerror (errno)); + return err; +} + + +/* Check whether the Scdaemon is still alive and clean it up if not. */ +void +agent_scd_check_aliveness (void) +{ + pth_event_t evt; + pid_t pid; + int rc; + + if (!primary_scd_ctx) + return; /* No scdaemon running. */ + + /* This is not a critical function so we use a short timeout while + acquiring the lock. */ + evt = pth_event (PTH_EVENT_TIME, pth_timeout (1, 0)); + if (!pth_mutex_acquire (&start_scd_lock, 0, evt)) + { + if (pth_event_occurred (evt)) + { + if (opt.verbose > 1) + log_info ("failed to acquire the start_scd lock while" + " doing an aliveness check: %s\n", "timeout"); + } + else + log_error ("failed to acquire the start_scd lock while" + " doing an aliveness check: %s\n", strerror (errno)); + pth_event_free (evt, PTH_FREE_THIS); + return; + } + pth_event_free (evt, PTH_FREE_THIS); + + if (primary_scd_ctx) + { + pid = assuan_get_pid (primary_scd_ctx); + if (pid != (pid_t)(-1) && pid + && ((rc=waitpid (pid, NULL, WNOHANG))==-1 || (rc == pid)) ) + { + /* Okay, scdaemon died. Disconnect the primary connection + now but take care that it won't do another wait. Also + cleanup all other connections and release their + resources. The next use will start a new daemon then. + Due to the use of the START_SCD_LOCAL we are sure that + none of these context are actually in use. */ + struct scd_local_s *sl; + + assuan_set_flag (primary_scd_ctx, ASSUAN_NO_WAITPID, 1); + assuan_disconnect (primary_scd_ctx); + + for (sl=scd_local_list; sl; sl = sl->next_local) + { + if (sl->ctx) + { + if (sl->ctx != primary_scd_ctx) + assuan_disconnect (sl->ctx); + sl->ctx = NULL; + } + } + + primary_scd_ctx = NULL; + primary_scd_ctx_reusable = 0; + + xfree (socket_name); + socket_name = NULL; + } + } + + if (!pth_mutex_release (&start_scd_lock)) + log_error ("failed to release the start_scd lock while" + " doing the aliveness check: %s\n", strerror (errno)); +} + + + +/* Reset the SCD if it has been used. Actually it is not a reset but + a cleanup of resources used by the current connection. */ +int +agent_reset_scd (ctrl_t ctrl) +{ + if (ctrl->scd_local) + { + if (ctrl->scd_local->ctx) + { + /* We can't disconnect the primary context because libassuan + does a waitpid on it and thus the system would hang. + Instead we send a reset and keep that connection for + reuse. */ + if (ctrl->scd_local->ctx == primary_scd_ctx) + { + /* Send a RESTART to the SCD. This is required for the + primary connection as a kind of virtual EOF; we don't + have another way to tell it that the next command + should be viewed as if a new connection has been + made. For the non-primary connections this is not + needed as we simply close the socket. We don't check + for an error here because the RESTART may fail for + example if the scdaemon has already been terminated. + Anyway, we need to set the reusable flag to make sure + that the aliveness check can clean it up. */ + assuan_transact (primary_scd_ctx, "RESTART", + NULL, NULL, NULL, NULL, NULL, NULL); + primary_scd_ctx_reusable = 1; + } + else + assuan_disconnect (ctrl->scd_local->ctx); + ctrl->scd_local->ctx = NULL; + } + + /* Remove the local context from our list and release it. */ + if (!scd_local_list) + BUG (); + else if (scd_local_list == ctrl->scd_local) + scd_local_list = ctrl->scd_local->next_local; + else + { + struct scd_local_s *sl; + + for (sl=scd_local_list; sl->next_local; sl = sl->next_local) + if (sl->next_local == ctrl->scd_local) + break; + if (!sl->next_local) + BUG (); + sl->next_local = ctrl->scd_local->next_local; + } + xfree (ctrl->scd_local); + ctrl->scd_local = NULL; + } + + return 0; +} + + + +/* 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. Function returns NULL to indicate + an out of memory status. */ +static char * +unescape_status_string (const unsigned char *s) +{ + char *buffer, *d; + + buffer = d = xtrymalloc (strlen ((const char*)s)+1); + if (!buffer) + return NULL; + 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; +} + + + +static AssuanError +learn_status_cb (void *opaque, const char *line) +{ + struct learn_parm_s *parm = opaque; + const char *keyword = line; + int keywordlen; + + for (keywordlen=0; *line && !spacep (line); line++, keywordlen++) + ; + while (spacep (line)) + line++; + if (keywordlen == 8 && !memcmp (keyword, "CERTINFO", keywordlen)) + { + parm->certinfo_cb (parm->certinfo_cb_arg, line); + } + else if (keywordlen == 11 && !memcmp (keyword, "KEYPAIRINFO", keywordlen)) + { + parm->kpinfo_cb (parm->kpinfo_cb_arg, line); + } + else if (keywordlen && *line) + { + parm->sinfo_cb (parm->sinfo_cb_arg, keyword, keywordlen, line); + } + + return 0; +} + +/* Perform the LEARN command and return a list of all private keys + stored on the card. */ +int +agent_card_learn (ctrl_t ctrl, + void (*kpinfo_cb)(void*, const char *), + void *kpinfo_cb_arg, + void (*certinfo_cb)(void*, const char *), + void *certinfo_cb_arg, + void (*sinfo_cb)(void*, const char *, size_t, const char *), + void *sinfo_cb_arg) +{ + int rc; + struct learn_parm_s parm; + + rc = start_scd (ctrl); + if (rc) + return rc; + + memset (&parm, 0, sizeof parm); + parm.kpinfo_cb = kpinfo_cb; + parm.kpinfo_cb_arg = kpinfo_cb_arg; + parm.certinfo_cb = certinfo_cb; + parm.certinfo_cb_arg = certinfo_cb_arg; + parm.sinfo_cb = sinfo_cb; + parm.sinfo_cb_arg = sinfo_cb_arg; + rc = assuan_transact (ctrl->scd_local->ctx, "LEARN --force", + NULL, NULL, NULL, NULL, + learn_status_cb, &parm); + if (rc) + return unlock_scd (ctrl, map_assuan_err (rc)); + + return unlock_scd (ctrl, 0); +} + + + +static AssuanError +get_serialno_cb (void *opaque, const char *line) +{ + char **serialno = opaque; + const char *keyword = line; + const char *s; + int keywordlen, n; + + for (keywordlen=0; *line && !spacep (line); line++, keywordlen++) + ; + while (spacep (line)) + line++; + + if (keywordlen == 8 && !memcmp (keyword, "SERIALNO", keywordlen)) + { + if (*serialno) + return ASSUAN_Unexpected_Status; + for (n=0,s=line; hexdigitp (s); s++, n++) + ; + if (!n || (n&1)|| !(spacep (s) || !*s) ) + return ASSUAN_Invalid_Status; + *serialno = xtrymalloc (n+1); + if (!*serialno) + return ASSUAN_Out_Of_Core; + memcpy (*serialno, line, n); + (*serialno)[n] = 0; + } + + return 0; +} + +/* Return the serial number of the card or an appropriate error. The + serial number is returned as a hexstring. */ +int +agent_card_serialno (ctrl_t ctrl, char **r_serialno) +{ + int rc; + char *serialno = NULL; + + rc = start_scd (ctrl); + if (rc) + return rc; + + rc = assuan_transact (ctrl->scd_local->ctx, "SERIALNO", + NULL, NULL, NULL, NULL, + get_serialno_cb, &serialno); + if (rc) + { + xfree (serialno); + return unlock_scd (ctrl, map_assuan_err (rc)); + } + *r_serialno = serialno; + return unlock_scd (ctrl, 0); +} + + + + +static AssuanError +membuf_data_cb (void *opaque, const void *buffer, size_t length) +{ + membuf_t *data = opaque; + + if (buffer) + put_membuf (data, buffer, length); + return 0; +} + +/* Handle the NEEDPIN inquiry. */ +static AssuanError +inq_needpin (void *opaque, const char *line) +{ + struct inq_needpin_s *parm = opaque; + char *pin; + size_t pinlen; + int rc; + + if (!strncmp (line, "NEEDPIN", 7) && (line[7] == ' ' || !line[7])) + { + line += 7; + while (*line == ' ') + line++; + + pinlen = 90; + pin = gcry_malloc_secure (pinlen); + if (!pin) + return ASSUAN_Out_Of_Core; + + rc = parm->getpin_cb (parm->getpin_cb_arg, line, pin, pinlen); + if (rc) + rc = ASSUAN_Canceled; + if (!rc) + rc = assuan_send_data (parm->ctx, pin, pinlen); + xfree (pin); + } + else if (!strncmp (line, "KEYPADINFO", 10) && (line[10] == ' ' || !line[10])) + { + size_t code; + char *endp; + + code = strtoul (line+10, &endp, 10); + line = endp; + while (*line == ' ') + line++; + + rc = parm->getpin_cb (parm->getpin_cb_arg, line, NULL, code); + if (rc) + rc = ASSUAN_Canceled; + } + else + { + log_error ("unsupported inquiry `%s'\n", line); + rc = ASSUAN_Inquire_Unknown; + } + + return rc; +} + + + +/* Create a signature using the current card */ +int +agent_card_pksign (ctrl_t ctrl, + const char *keyid, + int (*getpin_cb)(void *, const char *, char*, size_t), + void *getpin_cb_arg, + const unsigned char *indata, size_t indatalen, + unsigned char **r_buf, size_t *r_buflen) +{ + int rc, i; + char *p, line[ASSUAN_LINELENGTH]; + membuf_t data; + struct inq_needpin_s inqparm; + size_t len; + unsigned char *sigbuf; + size_t sigbuflen; + + *r_buf = NULL; + rc = start_scd (ctrl); + if (rc) + return rc; + + if (indatalen*2 + 50 > DIM(line)) + return unlock_scd (ctrl, gpg_error (GPG_ERR_GENERAL)); + + sprintf (line, "SETDATA "); + p = line + strlen (line); + for (i=0; i < indatalen ; i++, p += 2 ) + sprintf (p, "%02X", indata[i]); + rc = assuan_transact (ctrl->scd_local->ctx, line, + NULL, NULL, NULL, NULL, NULL, NULL); + if (rc) + return unlock_scd (ctrl, map_assuan_err (rc)); + + init_membuf (&data, 1024); + inqparm.ctx = ctrl->scd_local->ctx; + inqparm.getpin_cb = getpin_cb; + inqparm.getpin_cb_arg = getpin_cb_arg; + snprintf (line, DIM(line)-1, + ctrl->use_auth_call? "PKAUTH %s":"PKSIGN %s", keyid); + line[DIM(line)-1] = 0; + rc = assuan_transact (ctrl->scd_local->ctx, line, + membuf_data_cb, &data, + inq_needpin, &inqparm, + NULL, NULL); + if (rc) + { + xfree (get_membuf (&data, &len)); + return unlock_scd (ctrl, map_assuan_err (rc)); + } + sigbuf = get_membuf (&data, &sigbuflen); + + /* Create an S-expression from it which is formatted like this: + "(7:sig-val(3:rsa(1:sSIGBUFLEN:SIGBUF)))" */ + *r_buflen = 21 + 11 + sigbuflen + 4; + p = xtrymalloc (*r_buflen); + *r_buf = (unsigned char*)p; + if (!p) + return unlock_scd (ctrl, out_of_core ()); + p = stpcpy (p, "(7:sig-val(3:rsa(1:s" ); + sprintf (p, "%u:", (unsigned int)sigbuflen); + p += strlen (p); + memcpy (p, sigbuf, sigbuflen); + p += sigbuflen; + strcpy (p, ")))"); + xfree (sigbuf); + + assert (gcry_sexp_canon_len (*r_buf, *r_buflen, NULL, NULL)); + return unlock_scd (ctrl, 0); +} + +/* Decipher INDATA using the current card. Note that the returned value is */ +int +agent_card_pkdecrypt (ctrl_t ctrl, + const char *keyid, + int (*getpin_cb)(void *, const char *, char*, size_t), + void *getpin_cb_arg, + const unsigned char *indata, size_t indatalen, + char **r_buf, size_t *r_buflen) +{ + int rc, i; + char *p, line[ASSUAN_LINELENGTH]; + membuf_t data; + struct inq_needpin_s inqparm; + size_t len; + + *r_buf = NULL; + rc = start_scd (ctrl); + if (rc) + return rc; + + /* FIXME: use secure memory where appropriate */ + if (indatalen*2 + 50 > DIM(line)) + return unlock_scd (ctrl, gpg_error (GPG_ERR_GENERAL)); + + sprintf (line, "SETDATA "); + p = line + strlen (line); + for (i=0; i < indatalen ; i++, p += 2 ) + sprintf (p, "%02X", indata[i]); + rc = assuan_transact (ctrl->scd_local->ctx, line, + NULL, NULL, NULL, NULL, NULL, NULL); + if (rc) + return unlock_scd (ctrl, map_assuan_err (rc)); + + init_membuf (&data, 1024); + inqparm.ctx = ctrl->scd_local->ctx; + inqparm.getpin_cb = getpin_cb; + inqparm.getpin_cb_arg = getpin_cb_arg; + snprintf (line, DIM(line)-1, "PKDECRYPT %s", keyid); + line[DIM(line)-1] = 0; + rc = assuan_transact (ctrl->scd_local->ctx, line, + membuf_data_cb, &data, + inq_needpin, &inqparm, + NULL, NULL); + if (rc) + { + xfree (get_membuf (&data, &len)); + return unlock_scd (ctrl, map_assuan_err (rc)); + } + *r_buf = get_membuf (&data, r_buflen); + if (!*r_buf) + return unlock_scd (ctrl, gpg_error (GPG_ERR_ENOMEM)); + + return unlock_scd (ctrl, 0); +} + + + +/* Read a certificate with ID into R_BUF and R_BUFLEN. */ +int +agent_card_readcert (ctrl_t ctrl, + const char *id, char **r_buf, size_t *r_buflen) +{ + int rc; + char line[ASSUAN_LINELENGTH]; + membuf_t data; + size_t len; + + *r_buf = NULL; + rc = start_scd (ctrl); + if (rc) + return rc; + + init_membuf (&data, 1024); + snprintf (line, DIM(line)-1, "READCERT %s", id); + line[DIM(line)-1] = 0; + rc = assuan_transact (ctrl->scd_local->ctx, line, + membuf_data_cb, &data, + NULL, NULL, + NULL, NULL); + if (rc) + { + xfree (get_membuf (&data, &len)); + return unlock_scd (ctrl, map_assuan_err (rc)); + } + *r_buf = get_membuf (&data, r_buflen); + if (!*r_buf) + return unlock_scd (ctrl, gpg_error (GPG_ERR_ENOMEM)); + + return unlock_scd (ctrl, 0); +} + + + +/* Read a key with ID and return it in an allocate buffer pointed to + by r_BUF as a valid S-expression. */ +int +agent_card_readkey (ctrl_t ctrl, const char *id, unsigned char **r_buf) +{ + int rc; + char line[ASSUAN_LINELENGTH]; + membuf_t data; + size_t len, buflen; + + *r_buf = NULL; + rc = start_scd (ctrl); + if (rc) + return rc; + + init_membuf (&data, 1024); + snprintf (line, DIM(line)-1, "READKEY %s", id); + line[DIM(line)-1] = 0; + rc = assuan_transact (ctrl->scd_local->ctx, line, + membuf_data_cb, &data, + NULL, NULL, + NULL, NULL); + if (rc) + { + xfree (get_membuf (&data, &len)); + return unlock_scd (ctrl, map_assuan_err (rc)); + } + *r_buf = get_membuf (&data, &buflen); + if (!*r_buf) + return unlock_scd (ctrl, gpg_error (GPG_ERR_ENOMEM)); + + if (!gcry_sexp_canon_len (*r_buf, buflen, NULL, NULL)) + { + xfree (*r_buf); *r_buf = NULL; + return unlock_scd (ctrl, gpg_error (GPG_ERR_INV_VALUE)); + } + + return unlock_scd (ctrl, 0); +} + + + +/* Type used with the card_getattr_cb. */ +struct card_getattr_parm_s { + const char *keyword; /* Keyword to look for. */ + size_t keywordlen; /* strlen of KEYWORD. */ + char *data; /* Malloced and unescaped data. */ + int error; /* ERRNO value or 0 on success. */ +}; + +/* Callback function for agent_card_getattr. */ +static assuan_error_t +card_getattr_cb (void *opaque, const char *line) +{ + struct card_getattr_parm_s *parm = opaque; + const char *keyword = line; + int keywordlen; + + if (parm->data) + return 0; /* We want only the first occurrence. */ + + for (keywordlen=0; *line && !spacep (line); line++, keywordlen++) + ; + while (spacep (line)) + line++; + + if (keywordlen == parm->keywordlen + && !memcmp (keyword, parm->keyword, keywordlen)) + { + parm->data = unescape_status_string ((const unsigned char*)line); + if (!parm->data) + parm->error = errno; + } + + return 0; +} + + +/* Call the agent to retrieve a single line data object. On success + the object is malloced and stored at RESULT; it is guaranteed that + NULL is never stored in this case. On error an error code is + returned and NULL stored at RESULT. */ +gpg_error_t +agent_card_getattr (ctrl_t ctrl, const char *name, char **result) +{ + int err; + struct card_getattr_parm_s parm; + char line[ASSUAN_LINELENGTH]; + + *result = NULL; + + if (!*name) + return gpg_error (GPG_ERR_INV_VALUE); + + memset (&parm, 0, sizeof parm); + parm.keyword = name; + parm.keywordlen = strlen (name); + + /* We assume that NAME does not need escaping. */ + if (8 + strlen (name) > DIM(line)-1) + return gpg_error (GPG_ERR_TOO_LARGE); + stpcpy (stpcpy (line, "GETATTR "), name); + + err = start_scd (ctrl); + if (err) + return err; + + err = map_assuan_err (assuan_transact (ctrl->scd_local->ctx, line, + NULL, NULL, NULL, NULL, + card_getattr_cb, &parm)); + if (!err && parm.error) + err = gpg_error_from_errno (parm.error); + + if (!err && !parm.data) + err = gpg_error (GPG_ERR_NO_DATA); + + if (!err) + *result = parm.data; + else + xfree (parm.data); + + return unlock_scd (ctrl, err); +} + + + + +static AssuanError +pass_status_thru (void *opaque, const char *line) +{ + ASSUAN_CONTEXT ctx = opaque; + char keyword[200]; + int i; + + for (i=0; *line && !spacep (line) && i < DIM(keyword)-1; line++, i++) + keyword[i] = *line; + keyword[i] = 0; + /* truncate any remaining keyword stuff. */ + for (; *line && !spacep (line); line++) + ; + while (spacep (line)) + line++; + + assuan_write_status (ctx, keyword, line); + return 0; +} + +static AssuanError +pass_data_thru (void *opaque, const void *buffer, size_t length) +{ + ASSUAN_CONTEXT ctx = opaque; + + assuan_send_data (ctx, buffer, length); + return 0; +} + + +/* Send the line CMDLINE with command for the SCDdaemon to it and send + all status messages back. This command is used as a general quoting + mechanism to pass everything verbatim to SCDAEMOPN. The PIN + inquirey is handled inside gpg-agent. */ +int +agent_card_scd (ctrl_t ctrl, const char *cmdline, + int (*getpin_cb)(void *, const char *, char*, size_t), + void *getpin_cb_arg, void *assuan_context) +{ + int rc; + struct inq_needpin_s inqparm; + + rc = start_scd (ctrl); + if (rc) + return rc; + + inqparm.ctx = ctrl->scd_local->ctx; + inqparm.getpin_cb = getpin_cb; + inqparm.getpin_cb_arg = getpin_cb_arg; + rc = assuan_transact (ctrl->scd_local->ctx, cmdline, + pass_data_thru, assuan_context, + inq_needpin, &inqparm, + pass_status_thru, assuan_context); + if (rc) + { + return unlock_scd (ctrl, map_assuan_err (rc)); + } + + return unlock_scd (ctrl, 0); +} + + diff --git a/agent/command-ssh.c b/agent/command-ssh.c new file mode 100644 index 000000000..4e81aa2f2 --- /dev/null +++ b/agent/command-ssh.c @@ -0,0 +1,2880 @@ +/* command-ssh.c - gpg-agent's ssh-agent emulation layer + * 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. + */ + +/* Only v2 of the ssh-agent protocol is implemented. */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "agent.h" + +#include "estream.h" +#include "i18n.h" + + + +/* Request types. */ +#define SSH_REQUEST_REQUEST_IDENTITIES 11 +#define SSH_REQUEST_SIGN_REQUEST 13 +#define SSH_REQUEST_ADD_IDENTITY 17 +#define SSH_REQUEST_REMOVE_IDENTITY 18 +#define SSH_REQUEST_REMOVE_ALL_IDENTITIES 19 +#define SSH_REQUEST_LOCK 22 +#define SSH_REQUEST_UNLOCK 23 +#define SSH_REQUEST_ADD_ID_CONSTRAINED 25 + +/* Options. */ +#define SSH_OPT_CONSTRAIN_LIFETIME 1 +#define SSH_OPT_CONSTRAIN_CONFIRM 2 + +/* Response types. */ +#define SSH_RESPONSE_SUCCESS 6 +#define SSH_RESPONSE_FAILURE 5 +#define SSH_RESPONSE_IDENTITIES_ANSWER 12 +#define SSH_RESPONSE_SIGN_RESPONSE 14 + +/* Other constants. */ +#define SSH_DSA_SIGNATURE_PADDING 20 +#define SSH_DSA_SIGNATURE_ELEMS 2 +#define SPEC_FLAG_USE_PKCS1V2 (1 << 0) + + +/* The blurb we put into the header of a newly created control file. */ +static const char sshcontrolblurb[] = +"# List of allowed ssh keys. Only keys present in this file are used\n" +"# in the SSH protocol. The ssh-add tool may add new entries to this\n" +"# file to enable them; you may also add them manually. Comment\n" +"# lines, like this one, as well as empty lines are ignored. Lines do\n" +"# have a certain length limit but this is not serious limitation as\n" +"# the format of the entries is fixed and checked by gpg-agent. A\n" +"# non-comment line starts with optional white spaces, followed by the\n" +"# keygrip of the key given as 40 hex digits, optionally followed by a\n" +"# the caching TTL in seconds and another optional field for arbitrary\n" +"# flags. Prepend the keygrip with an '!' mark to disable it.\n" +"\n"; + + + +/* Macros. */ + +/* Return a new uint32 with b0 being the most significant byte and b3 + being the least significant byte. */ +#define uint32_construct(b0, b1, b2, b3) \ + ((b0 << 24) | (b1 << 16) | (b2 << 8) | b3) + + + + +/* + * Basic types. + */ + +/* Type for a request handler. */ +typedef gpg_error_t (*ssh_request_handler_t) (ctrl_t ctrl, + estream_t request, + estream_t response); + +/* Type, which is used for associating request handlers with the + appropriate request IDs. */ +typedef struct ssh_request_spec +{ + unsigned char type; + ssh_request_handler_t handler; + const char *identifier; + unsigned int secret_input; +} ssh_request_spec_t; + +/* Type for "key modifier functions", which are necessary since + OpenSSH and GnuPG treat key material slightly different. A key + modifier is called right after a new key identity has been received + in order to "sanitize" the material. */ +typedef gpg_error_t (*ssh_key_modifier_t) (const char *elems, + gcry_mpi_t *mpis); + +/* The encoding of a generated signature is dependent on the + algorithm; therefore algorithm specific signature encoding + functions are necessary. */ +typedef gpg_error_t (*ssh_signature_encoder_t) (estream_t signature_blob, + gcry_mpi_t *mpis); + +/* Type, which is used for boundling all the algorithm specific + information together in a single object. */ +typedef struct ssh_key_type_spec +{ + /* Algorithm identifier as used by OpenSSH. */ + const char *ssh_identifier; + + /* Algorithm identifier as used by GnuPG. */ + const char *identifier; + + /* List of MPI names for secret keys; order matches the one of the + agent protocol. */ + const char *elems_key_secret; + + /* List of MPI names for public keys; order matches the one of the + agent protocol. */ + const char *elems_key_public; + + /* List of MPI names for signature data. */ + const char *elems_signature; + + /* List of MPI names for secret keys; order matches the one, which + is required by gpg-agent's key access layer. */ + const char *elems_sexp_order; + + /* Key modifier function. Key modifier functions are necessary in + order to fix any inconsistencies between the representation of + keys on the SSH and on the GnuPG side. */ + ssh_key_modifier_t key_modifier; + + /* Signature encoder function. Signature encoder functions are + necessary since the encoding of signatures depends on the used + algorithm. */ + ssh_signature_encoder_t signature_encoder; + + /* Misc flags. */ + unsigned int flags; +} ssh_key_type_spec_t; + + +/* Prototypes. */ +static gpg_error_t ssh_handler_request_identities (ctrl_t ctrl, + estream_t request, + estream_t response); +static gpg_error_t ssh_handler_sign_request (ctrl_t ctrl, + estream_t request, + estream_t response); +static gpg_error_t ssh_handler_add_identity (ctrl_t ctrl, + estream_t request, + estream_t response); +static gpg_error_t ssh_handler_remove_identity (ctrl_t ctrl, + estream_t request, + estream_t response); +static gpg_error_t ssh_handler_remove_all_identities (ctrl_t ctrl, + estream_t request, + estream_t response); +static gpg_error_t ssh_handler_lock (ctrl_t ctrl, + estream_t request, + estream_t response); +static gpg_error_t ssh_handler_unlock (ctrl_t ctrl, + estream_t request, + estream_t response); + +static gpg_error_t ssh_key_modifier_rsa (const char *elems, gcry_mpi_t *mpis); +static gpg_error_t ssh_signature_encoder_rsa (estream_t signature_blob, + gcry_mpi_t *mpis); +static gpg_error_t ssh_signature_encoder_dsa (estream_t signature_blob, + gcry_mpi_t *mpis); + + + +/* Global variables. */ + + +/* Associating request types with the corresponding request + handlers. */ + +static ssh_request_spec_t request_specs[] = + { +#define REQUEST_SPEC_DEFINE(id, name, secret_input) \ + { SSH_REQUEST_##id, ssh_handler_##name, #name, secret_input } + + REQUEST_SPEC_DEFINE (REQUEST_IDENTITIES, request_identities, 1), + REQUEST_SPEC_DEFINE (SIGN_REQUEST, sign_request, 0), + REQUEST_SPEC_DEFINE (ADD_IDENTITY, add_identity, 1), + REQUEST_SPEC_DEFINE (ADD_ID_CONSTRAINED, add_identity, 1), + REQUEST_SPEC_DEFINE (REMOVE_IDENTITY, remove_identity, 0), + REQUEST_SPEC_DEFINE (REMOVE_ALL_IDENTITIES, remove_all_identities, 0), + REQUEST_SPEC_DEFINE (LOCK, lock, 0), + REQUEST_SPEC_DEFINE (UNLOCK, unlock, 0) +#undef REQUEST_SPEC_DEFINE + }; + + +/* Table holding key type specifications. */ +static ssh_key_type_spec_t ssh_key_types[] = + { + { + "ssh-rsa", "rsa", "nedupq", "en", "s", "nedpqu", + ssh_key_modifier_rsa, ssh_signature_encoder_rsa, + SPEC_FLAG_USE_PKCS1V2 + }, + { + "ssh-dss", "dsa", "pqgyx", "pqgy", "rs", "pqgyx", + NULL, ssh_signature_encoder_dsa, + 0 + }, + }; + + + + + +/* + General utility functions. + */ + +/* A secure realloc, i.e. it makes sure to allocate secure memory if A + is NULL. This is required because the standard gcry_realloc does + not know whether to allocate secure or normal if NULL is passed as + existing buffer. */ +static void * +realloc_secure (void *a, size_t n) +{ + void *p; + + if (a) + p = gcry_realloc (a, n); + else + p = gcry_malloc_secure (n); + + return p; +} + + +/* Create and return a new C-string from DATA/DATA_N (i.e.: add + NUL-termination); return NULL on OOM. */ +static char * +make_cstring (const char *data, size_t data_n) +{ + char *s; + + s = xtrymalloc (data_n + 1); + if (s) + { + memcpy (s, data, data_n); + s[data_n] = 0; + } + + return s; +} + + + + +/* + Primitive I/O functions. + */ + + +/* Read a byte from STREAM, store it in B. */ +static gpg_error_t +stream_read_byte (estream_t stream, unsigned char *b) +{ + gpg_error_t err; + int ret; + + ret = es_fgetc (stream); + if (ret == EOF) + { + if (es_ferror (stream)) + err = gpg_error_from_errno (errno); + else + err = gpg_error (GPG_ERR_EOF); + *b = 0; + } + else + { + *b = ret & 0xFF; + err = 0; + } + + return err; +} + +/* Write the byte contained in B to STREAM. */ +static gpg_error_t +stream_write_byte (estream_t stream, unsigned char b) +{ + gpg_error_t err; + int ret; + + ret = es_fputc (b, stream); + if (ret == EOF) + err = gpg_error_from_errno (errno); + else + err = 0; + + return err; +} + +/* Read a uint32 from STREAM, store it in UINT32. */ +static gpg_error_t +stream_read_uint32 (estream_t stream, u32 *uint32) +{ + unsigned char buffer[4]; + size_t bytes_read; + gpg_error_t err; + int ret; + + ret = es_read (stream, buffer, sizeof (buffer), &bytes_read); + if (ret) + err = gpg_error_from_errno (errno); + else + { + if (bytes_read != sizeof (buffer)) + err = gpg_error (GPG_ERR_EOF); + else + { + u32 n; + + n = uint32_construct (buffer[0], buffer[1], buffer[2], buffer[3]); + *uint32 = n; + err = 0; + } + } + + return err; +} + +/* Write the uint32 contained in UINT32 to STREAM. */ +static gpg_error_t +stream_write_uint32 (estream_t stream, u32 uint32) +{ + unsigned char buffer[4]; + gpg_error_t err; + int ret; + + buffer[0] = uint32 >> 24; + buffer[1] = uint32 >> 16; + buffer[2] = uint32 >> 8; + buffer[3] = uint32 >> 0; + + ret = es_write (stream, buffer, sizeof (buffer), NULL); + if (ret) + err = gpg_error_from_errno (errno); + else + err = 0; + + return err; +} + +/* Read SIZE bytes from STREAM into BUFFER. */ +static gpg_error_t +stream_read_data (estream_t stream, unsigned char *buffer, size_t size) +{ + gpg_error_t err; + size_t bytes_read; + int ret; + + ret = es_read (stream, buffer, size, &bytes_read); + if (ret) + err = gpg_error_from_errno (errno); + else + { + if (bytes_read != size) + err = gpg_error (GPG_ERR_EOF); + else + err = 0; + } + + return err; +} + +/* Write SIZE bytes from BUFFER to STREAM. */ +static gpg_error_t +stream_write_data (estream_t stream, const unsigned char *buffer, size_t size) +{ + gpg_error_t err; + int ret; + + ret = es_write (stream, buffer, size, NULL); + if (ret) + err = gpg_error_from_errno (errno); + else + err = 0; + + return err; +} + +/* Read a binary string from STREAM into STRING, store size of string + in STRING_SIZE; depending on SECURE use secure memory for + string. */ +static gpg_error_t +stream_read_string (estream_t stream, unsigned int secure, + unsigned char **string, u32 *string_size) +{ + gpg_error_t err; + unsigned char *buffer; + u32 length; + + buffer = NULL; + + /* Read string length. */ + err = stream_read_uint32 (stream, &length); + if (err) + goto out; + + /* Allocate space. */ + if (secure) + buffer = xtrymalloc_secure (length + 1); + else + buffer = xtrymalloc (length + 1); + if (! buffer) + { + err = gpg_error_from_errno (errno); + goto out; + } + + /* Read data. */ + err = stream_read_data (stream, buffer, length); + if (err) + goto out; + + /* Finalize string object. */ + buffer[length] = 0; + *string = buffer; + if (string_size) + *string_size = length; + + out: + + if (err) + xfree (buffer); + + return err; +} + +/* Read a C-string from STREAM, store copy in STRING. */ +static gpg_error_t +stream_read_cstring (estream_t stream, char **string) +{ + unsigned char *buffer; + gpg_error_t err; + + err = stream_read_string (stream, 0, &buffer, NULL); + if (err) + goto out; + + *string = (char *) buffer; + + out: + + return err; +} + + +/* Write a binary string from STRING of size STRING_N to STREAM. */ +static gpg_error_t +stream_write_string (estream_t stream, + const unsigned char *string, u32 string_n) +{ + gpg_error_t err; + + err = stream_write_uint32 (stream, string_n); + if (err) + goto out; + + err = stream_write_data (stream, string, string_n); + + out: + + return err; +} + +/* Write a C-string from STRING to STREAM. */ +static gpg_error_t +stream_write_cstring (estream_t stream, const char *string) +{ + gpg_error_t err; + + err = stream_write_string (stream, + (const unsigned char *) string, strlen (string)); + + return err; +} + +/* Read an MPI from STREAM, store it in MPINT. Depending on SECURE + use secure memory. */ +static gpg_error_t +stream_read_mpi (estream_t stream, unsigned int secure, gcry_mpi_t *mpint) +{ + unsigned char *mpi_data; + u32 mpi_data_size; + gpg_error_t err; + gcry_mpi_t mpi; + + mpi_data = NULL; + + err = stream_read_string (stream, secure, &mpi_data, &mpi_data_size); + if (err) + goto out; + + err = gcry_mpi_scan (&mpi, GCRYMPI_FMT_STD, mpi_data, mpi_data_size, NULL); + if (err) + goto out; + + *mpint = mpi; + + out: + + xfree (mpi_data); + + return err; +} + +/* Write the MPI contained in MPINT to STREAM. */ +static gpg_error_t +stream_write_mpi (estream_t stream, gcry_mpi_t mpint) +{ + unsigned char *mpi_buffer; + size_t mpi_buffer_n; + gpg_error_t err; + + mpi_buffer = NULL; + + err = gcry_mpi_aprint (GCRYMPI_FMT_STD, &mpi_buffer, &mpi_buffer_n, mpint); + if (err) + goto out; + + err = stream_write_string (stream, mpi_buffer, mpi_buffer_n); + + out: + + xfree (mpi_buffer); + + return err; +} + +/* Copy data from SRC to DST until EOF is reached. */ +static gpg_error_t +stream_copy (estream_t dst, estream_t src) +{ + char buffer[BUFSIZ]; + size_t bytes_read; + gpg_error_t err; + int ret; + + err = 0; + while (1) + { + ret = es_read (src, buffer, sizeof (buffer), &bytes_read); + if (ret || (! bytes_read)) + { + if (ret) + err = gpg_error_from_errno (errno); + break; + } + ret = es_write (dst, buffer, bytes_read, NULL); + if (ret) + { + err = gpg_error_from_errno (errno); + break; + } + } + + return err; +} + + +/* Read the content of the file specified by FILENAME into a newly + create buffer, which is to be stored in BUFFER; store length of + buffer in BUFFER_N. */ +static gpg_error_t +file_to_buffer (const char *filename, unsigned char **buffer, size_t *buffer_n) +{ + unsigned char *buffer_new; + struct stat statbuf; + estream_t stream; + gpg_error_t err; + int ret; + + *buffer = NULL; + *buffer_n = 0; + + buffer_new = NULL; + err = 0; + + stream = es_fopen (filename, "r"); + if (! stream) + { + err = gpg_error_from_errno (errno); + goto out; + } + + ret = fstat (es_fileno (stream), &statbuf); + if (ret) + { + err = gpg_error_from_errno (errno); + goto out; + } + + buffer_new = xtrymalloc (statbuf.st_size); + if (! buffer_new) + { + err = gpg_error_from_errno (errno); + goto out; + } + + err = stream_read_data (stream, buffer_new, statbuf.st_size); + if (err) + goto out; + + *buffer = buffer_new; + *buffer_n = statbuf.st_size; + + out: + + if (stream) + es_fclose (stream); + + if (err) + xfree (buffer_new); + + return err; +} + + + + +/* Open the ssh control file and create it if not available. With + APPEND passed as true the file will be opened in append mode, + otherwise in read only mode. On success a file pointer is stored + at the address of R_FP. */ +static gpg_error_t +open_control_file (FILE **r_fp, int append) +{ + gpg_error_t err; + char *fname; + FILE *fp; + + /* Note: As soon as we start to use non blocking functions here + (i.e. where Pth might switch threads) we need to employ a + mutex. */ + *r_fp = NULL; + fname = make_filename (opt.homedir, "sshcontrol", NULL); + /* FIXME: With "a+" we are not able to check whether this will will + be created and thus the blurb needs to be written first. */ + fp = fopen (fname, append? "a+":"r"); + if (!fp && errno == ENOENT) + { + /* Fixme: "x" is a GNU extension. We might want to use the es_ + functions here. */ + fp = fopen (fname, "wx"); + if (!fp) + { + err = gpg_error (gpg_err_code_from_errno (errno)); + log_error (_("can't create `%s': %s\n"), fname, gpg_strerror (err)); + xfree (fname); + return err; + } + fputs (sshcontrolblurb, fp); + fclose (fp); + fp = fopen (fname, append? "a+":"r"); + } + + if (!fp) + { + err = gpg_error (gpg_err_code_from_errno (errno)); + log_error (_("can't open `%s': %s\n"), fname, gpg_strerror (err)); + xfree (fname); + return err; + } + + *r_fp = fp; + + return 0; +} + + +/* Search the file at stream FP from the beginning until a matching + HEXGRIP is found; return success in this case and store true at + DISABLED if the found key has been disabled. */ +static gpg_error_t +search_control_file (FILE *fp, const char *hexgrip, int *disabled) +{ + int c, i; + char *p, line[256]; + + assert (strlen (hexgrip) == 40 ); + + rewind (fp); + *disabled = 0; + next_line: + do + { + if (!fgets (line, DIM(line)-1, fp) ) + { + if (feof (fp)) + return gpg_error (GPG_ERR_EOF); + return gpg_error (gpg_err_code_from_errno (errno)); + } + + if (!*line || line[strlen(line)-1] != '\n') + { + /* Eat until end of line */ + while ( (c=getc (fp)) != EOF && c != '\n') + ; + return gpg_error (*line? GPG_ERR_LINE_TOO_LONG + : GPG_ERR_INCOMPLETE_LINE); + } + + /* Allow for empty lines and spaces */ + for (p=line; spacep (p); p++) + ; + } + while (!*p || *p == '\n' || *p == '#'); + + *disabled = 0; + if (*p == '!') + { + *disabled = 1; + for (p++; spacep (p); p++) + ; + } + + for (i=0; hexdigitp (p) && i < 40; p++, i++) + if (hexgrip[i] != (*p >= 'a'? (*p & 0xdf): *p)) + goto next_line; + if (i != 40 || !(spacep (p) || *p == '\n')) + { + log_error ("invalid formatted line in ssh control file\n"); + return gpg_error (GPG_ERR_BAD_DATA); + } + + /* Fixme: Get TTL and flags. */ + + return 0; /* Okay: found it. */ +} + + + +/* Add an entry to the control file to mark the key with the keygrip + HEXGRIP as usable for SSH; i.e. it will be returned when ssh asks + for it. This function is in general used to add a key received + through the ssh-add function. We can assume that the user wants to + allow ssh using this key. */ +static gpg_error_t +add_control_entry (ctrl_t ctrl, const char *hexgrip, int ttl) +{ + gpg_error_t err; + FILE *fp; + int disabled; + + err = open_control_file (&fp, 1); + if (err) + return err; + + err = search_control_file (fp, hexgrip, &disabled); + if (err && gpg_err_code(err) == GPG_ERR_EOF) + { + struct tm *tp; + time_t atime = time (NULL); + + /* Not yet in the file - add it. Becuase the file has been + opened in append mode, we simply need to write to it. */ + tp = localtime (&atime); + fprintf (fp, "# Key added on %04d-%02d-%02d %02d:%02d:%02d\n%s %d\n", + 1900+tp->tm_year, tp->tm_mon+1, tp->tm_mday, + tp->tm_hour, tp->tm_min, tp->tm_sec, + hexgrip, ttl); + + } + fclose (fp); + return 0; +} + + + + + +/* + + MPI lists. + + */ + +/* Free the list of MPIs MPI_LIST. */ +static void +mpint_list_free (gcry_mpi_t *mpi_list) +{ + if (mpi_list) + { + unsigned int i; + + for (i = 0; mpi_list[i]; i++) + gcry_mpi_release (mpi_list[i]); + xfree (mpi_list); + } +} + +/* Receive key material MPIs from STREAM according to KEY_SPEC; + depending on SECRET expect a public key or secret key. The newly + allocated list of MPIs is stored in MPI_LIST. Returns usual error + code. */ +static gpg_error_t +ssh_receive_mpint_list (estream_t stream, int secret, + ssh_key_type_spec_t key_spec, gcry_mpi_t **mpi_list) +{ + unsigned int elems_public_n; + const char *elems_public; + unsigned int elems_n; + const char *elems; + int elem_is_secret; + gcry_mpi_t *mpis; + gpg_error_t err; + unsigned int i; + + mpis = NULL; + err = 0; + + if (secret) + elems = key_spec.elems_key_secret; + else + elems = key_spec.elems_key_public; + elems_n = strlen (elems); + + elems_public = key_spec.elems_key_public; + elems_public_n = strlen (elems_public); + + mpis = xtrycalloc (elems_n + 1, sizeof *mpis ); + if (!mpis) + { + err = gpg_error_from_errno (errno); + goto out; + } + + elem_is_secret = 0; + for (i = 0; i < elems_n; i++) + { + if (secret) + elem_is_secret = ! strchr (elems_public, elems[i]); + err = stream_read_mpi (stream, elem_is_secret, &mpis[i]); + if (err) + break; + } + if (err) + goto out; + + *mpi_list = mpis; + + out: + + if (err) + mpint_list_free (mpis); + + return err; +} + + + +/* Key modifier function for RSA. */ +static gpg_error_t +ssh_key_modifier_rsa (const char *elems, gcry_mpi_t *mpis) +{ + gcry_mpi_t p; + gcry_mpi_t q; + gcry_mpi_t u; + + if (strcmp (elems, "nedupq")) + /* Modifying only necessary for secret keys. */ + goto out; + + u = mpis[3]; + p = mpis[4]; + q = mpis[5]; + + if (gcry_mpi_cmp (p, q) > 0) + { + /* P shall be smaller then Q! Swap primes. iqmp becomes u. */ + gcry_mpi_t tmp; + + tmp = mpis[4]; + mpis[4] = mpis[5]; + mpis[5] = tmp; + } + else + /* U needs to be recomputed. */ + gcry_mpi_invm (u, p, q); + + out: + + return 0; +} + +/* Signature encoder function for RSA. */ +static gpg_error_t +ssh_signature_encoder_rsa (estream_t signature_blob, gcry_mpi_t *mpis) +{ + unsigned char *data; + size_t data_n; + gpg_error_t err; + gcry_mpi_t s; + + s = mpis[0]; + + err = gcry_mpi_aprint (GCRYMPI_FMT_USG, &data, &data_n, s); + if (err) + goto out; + + err = stream_write_string (signature_blob, data, data_n); + xfree (data); + + out: + + return err; +} + + +/* Signature encoder function for DSA. */ +static gpg_error_t +ssh_signature_encoder_dsa (estream_t signature_blob, gcry_mpi_t *mpis) +{ + unsigned char buffer[SSH_DSA_SIGNATURE_PADDING * SSH_DSA_SIGNATURE_ELEMS]; + unsigned char *data; + size_t data_n; + gpg_error_t err; + int i; + + data = NULL; + + for (i = 0; i < 2; i++) + { + err = gcry_mpi_aprint (GCRYMPI_FMT_USG, &data, &data_n, mpis[i]); + if (err) + break; + + if (data_n > SSH_DSA_SIGNATURE_PADDING) + { + err = gpg_error (GPG_ERR_INTERNAL); /* FIXME? */ + break; + } + + memset (buffer + (i * SSH_DSA_SIGNATURE_PADDING), 0, + SSH_DSA_SIGNATURE_PADDING - data_n); + memcpy (buffer + (i * SSH_DSA_SIGNATURE_PADDING) + + (SSH_DSA_SIGNATURE_PADDING - data_n), data, data_n); + + xfree (data); + data = NULL; + } + if (err) + goto out; + + err = stream_write_string (signature_blob, buffer, sizeof (buffer)); + + out: + + xfree (data); + + return err; +} + +/* + S-Expressions. + */ + + +/* This function constructs a new S-Expression for the key identified + by the KEY_SPEC, SECRET, MPIS and COMMENT, which is to be stored in + *SEXP. Returns usual error code. */ +static gpg_error_t +sexp_key_construct (gcry_sexp_t *sexp, + ssh_key_type_spec_t key_spec, int secret, + gcry_mpi_t *mpis, const char *comment) +{ + const char *key_identifier[] = { "public-key", "private-key" }; + gcry_sexp_t sexp_new; + char *sexp_template; + size_t sexp_template_n; + gpg_error_t err; + const char *elems; + size_t elems_n; + unsigned int i; + unsigned int j; + void **arg_list; + + err = 0; + sexp_new = NULL; + arg_list = NULL; + if (secret) + elems = key_spec.elems_sexp_order; + else + elems = key_spec.elems_key_public; + elems_n = strlen (elems); + + /* + Calculate size for sexp_template_n: + + "(%s(%s)(comment%s))" -> 20 + sizeof (). + + mpi: (X%m) -> 5. + + */ + sexp_template_n = 20 + (elems_n * 5); + sexp_template = xtrymalloc (sexp_template_n); + if (! sexp_template) + { + err = gpg_error_from_errno (errno); + goto out; + } + + /* Key identifier, algorithm identifier, mpis, comment. */ + arg_list = xtrymalloc (sizeof (*arg_list) * (2 + elems_n + 1)); + if (! arg_list) + { + err = gpg_error_from_errno (errno); + goto out; + } + + i = 0; + arg_list[i++] = &key_identifier[secret]; + arg_list[i++] = &key_spec.identifier; + + *sexp_template = 0; + sexp_template_n = 0; + sexp_template_n = sprintf (sexp_template + sexp_template_n, "(%%s(%%s"); + for (i = 0; i < elems_n; i++) + { + sexp_template_n += sprintf (sexp_template + sexp_template_n, "(%c%%m)", + elems[i]); + if (secret) + { + for (j = 0; j < elems_n; j++) + if (key_spec.elems_key_secret[j] == elems[i]) + break; + } + else + j = i; + arg_list[i + 2] = &mpis[j]; + } + sexp_template_n += sprintf (sexp_template + sexp_template_n, + ")(comment%%s))"); + + arg_list[i + 2] = &comment; + + err = gcry_sexp_build_array (&sexp_new, NULL, sexp_template, arg_list); + if (err) + goto out; + + *sexp = sexp_new; + + out: + + xfree (arg_list); + xfree (sexp_template); + + return err; +} + +/* This functions breaks up the key contained in the S-Expression SEXP + according to KEY_SPEC. The MPIs are bundled in a newly create + list, which is to be stored in MPIS; a newly allocated string + holding the comment will be stored in COMMENT; SECRET will be + filled with a boolean flag specifying what kind of key it is. + Returns usual error code. */ +static gpg_error_t +sexp_key_extract (gcry_sexp_t sexp, + ssh_key_type_spec_t key_spec, int *secret, + gcry_mpi_t **mpis, char **comment) +{ + gpg_error_t err; + gcry_sexp_t value_list; + gcry_sexp_t value_pair; + gcry_sexp_t comment_list; + unsigned int i; + char *comment_new; + const char *data; + size_t data_n; + int is_secret; + size_t elems_n; + const char *elems; + gcry_mpi_t *mpis_new; + gcry_mpi_t mpi; + + err = 0; + value_list = NULL; + value_pair = NULL; + comment_list = NULL; + comment_new = NULL; + mpis_new = NULL; + + data = gcry_sexp_nth_data (sexp, 0, &data_n); + if (! data) + { + err = gpg_error (GPG_ERR_INV_SEXP); + goto out; + } + + if ((data_n == 10 && !strncmp (data, "public-key", 10)) + || (data_n == 21 && !strncmp (data, "protected-private-key", 21)) + || (data_n == 20 && !strncmp (data, "shadowed-private-key", 20))) + { + is_secret = 0; + elems = key_spec.elems_key_public; + } + else if (data_n == 11 && !strncmp (data, "private-key", 11)) + { + is_secret = 1; + elems = key_spec.elems_key_secret; + } + else + { + err = gpg_error (GPG_ERR_INV_SEXP); + goto out; + } + + elems_n = strlen (elems); + mpis_new = xtrycalloc (elems_n + 1, sizeof *mpis_new ); + if (!mpis_new) + { + err = gpg_error_from_errno (errno); + goto out; + } + + value_list = gcry_sexp_find_token (sexp, key_spec.identifier, 0); + if (! value_list) + { + err = gpg_error (GPG_ERR_INV_SEXP); + goto out; + } + + for (i = 0; i < elems_n; i++) + { + value_pair = gcry_sexp_find_token (value_list, elems + i, 1); + if (! value_pair) + { + err = gpg_error (GPG_ERR_INV_SEXP); + break; + } + + /* Note that we need to use STD format; i.e. prepend a 0x00 to + indicate a positive number if the high bit is set. */ + mpi = gcry_sexp_nth_mpi (value_pair, 1, GCRYMPI_FMT_STD); + if (! mpi) + { + err = gpg_error (GPG_ERR_INV_SEXP); + break; + } + mpis_new[i] = mpi; + gcry_sexp_release (value_pair); + value_pair = NULL; + } + if (err) + goto out; + + /* We do not require a comment sublist to be present here. */ + data = NULL; + data_n = 0; + + comment_list = gcry_sexp_find_token (sexp, "comment", 0); + if (comment_list) + data = gcry_sexp_nth_data (comment_list, 1, &data_n); + if (! data) + { + data = "(none)"; + data_n = 6; + } + + comment_new = make_cstring (data, data_n); + if (! comment_new) + { + err = gpg_error_from_errno (errno); + goto out; + } + + if (secret) + *secret = is_secret; + *mpis = mpis_new; + *comment = comment_new; + + out: + + gcry_sexp_release (value_list); + gcry_sexp_release (value_pair); + gcry_sexp_release (comment_list); + + if (err) + { + xfree (comment_new); + mpint_list_free (mpis_new); + } + + return err; +} + +/* Extract the car from SEXP, and create a newly created C-string + which is to be stored in IDENTIFIER. */ +static gpg_error_t +sexp_extract_identifier (gcry_sexp_t sexp, char **identifier) +{ + char *identifier_new; + gcry_sexp_t sublist; + const char *data; + size_t data_n; + gpg_error_t err; + + identifier_new = NULL; + err = 0; + + sublist = gcry_sexp_nth (sexp, 1); + if (! sublist) + { + err = gpg_error (GPG_ERR_INV_SEXP); + goto out; + } + + data = gcry_sexp_nth_data (sublist, 0, &data_n); + if (! data) + { + err = gpg_error (GPG_ERR_INV_SEXP); + goto out; + } + + identifier_new = make_cstring (data, data_n); + if (! identifier_new) + { + err = gpg_err_code_from_errno (errno); + goto out; + } + + *identifier = identifier_new; + + out: + + gcry_sexp_release (sublist); + + return err; +} + + + +/* + + Key I/O. + +*/ + +/* Search for a key specification entry. If SSH_NAME is not NULL, + search for an entry whose "ssh_name" is equal to SSH_NAME; + otherwise, search for an entry whose "name" is equal to NAME. + Store found entry in SPEC on success, return error otherwise. */ +static gpg_error_t +ssh_key_type_lookup (const char *ssh_name, const char *name, + ssh_key_type_spec_t *spec) +{ + gpg_error_t err; + unsigned int i; + + for (i = 0; i < DIM (ssh_key_types); i++) + if ((ssh_name && (! strcmp (ssh_name, ssh_key_types[i].ssh_identifier))) + || (name && (! strcmp (name, ssh_key_types[i].identifier)))) + break; + + if (i == DIM (ssh_key_types)) + err = gpg_error (GPG_ERR_NOT_FOUND); + else + { + *spec = ssh_key_types[i]; + err = 0; + } + + return err; +} + +/* Receive a key from STREAM, according to the key specification given + as KEY_SPEC. Depending on SECRET, receive a secret or a public + key. If READ_COMMENT is true, receive a comment string as well. + Constructs a new S-Expression from received data and stores it in + KEY_NEW. Returns zero on success or an error code. */ +static gpg_error_t +ssh_receive_key (estream_t stream, gcry_sexp_t *key_new, int secret, + int read_comment, ssh_key_type_spec_t *key_spec) +{ + gpg_error_t err; + char *key_type; + char *comment; + gcry_sexp_t key; + ssh_key_type_spec_t spec; + gcry_mpi_t *mpi_list; + const char *elems; + + mpi_list = NULL; + key_type = NULL; + comment = ""; + key = NULL; + + err = stream_read_cstring (stream, &key_type); + if (err) + goto out; + + err = ssh_key_type_lookup (key_type, NULL, &spec); + if (err) + goto out; + + err = ssh_receive_mpint_list (stream, secret, spec, &mpi_list); + if (err) + goto out; + + if (read_comment) + { + err = stream_read_cstring (stream, &comment); + if (err) + goto out; + } + + if (secret) + elems = spec.elems_key_secret; + else + elems = spec.elems_key_public; + + if (spec.key_modifier) + { + err = (*spec.key_modifier) (elems, mpi_list); + if (err) + goto out; + } + + err = sexp_key_construct (&key, spec, secret, mpi_list, comment); + if (err) + goto out; + + if (key_spec) + *key_spec = spec; + *key_new = key; + + out: + + mpint_list_free (mpi_list); + xfree (key_type); + if (read_comment) + xfree (comment); + + return err; +} + +/* Converts a key of type TYPE, whose key material is given in MPIS, + into a newly created binary blob, which is to be stored in + BLOB/BLOB_SIZE. Returns zero on success or an error code. */ +static gpg_error_t +ssh_convert_key_to_blob (unsigned char **blob, size_t *blob_size, + const char *type, gcry_mpi_t *mpis) +{ + unsigned char *blob_new; + long int blob_size_new; + estream_t stream; + gpg_error_t err; + unsigned int i; + + *blob = NULL; + *blob_size = 0; + + blob_new = NULL; + stream = NULL; + err = 0; + + stream = es_mopen (NULL, 0, 0, 1, NULL, NULL, "r+"); + if (! stream) + { + err = gpg_error_from_errno (errno); + goto out; + } + + err = stream_write_cstring (stream, type); + if (err) + goto out; + + for (i = 0; mpis[i] && (! err); i++) + err = stream_write_mpi (stream, mpis[i]); + if (err) + goto out; + + blob_size_new = es_ftell (stream); + if (blob_size_new == -1) + { + err = gpg_error_from_errno (errno); + goto out; + } + + err = es_fseek (stream, 0, SEEK_SET); + if (err) + goto out; + + blob_new = xtrymalloc (blob_size_new); + if (! blob_new) + { + err = gpg_error_from_errno (errno); + goto out; + } + + err = stream_read_data (stream, blob_new, blob_size_new); + if (err) + goto out; + + *blob = blob_new; + *blob_size = blob_size_new; + + out: + + if (stream) + es_fclose (stream); + if (err) + xfree (blob_new); + + return err; +} + + +/* Write the public key KEY_PUBLIC to STREAM in SSH key format. If + OVERRIDE_COMMENT is not NULL, it will be used instead of the + comment stored in the key. */ +static gpg_error_t +ssh_send_key_public (estream_t stream, gcry_sexp_t key_public, + const char *override_comment) +{ + ssh_key_type_spec_t spec; + gcry_mpi_t *mpi_list; + char *key_type; + char *comment; + unsigned char *blob; + size_t blob_n; + gpg_error_t err; + + key_type = NULL; + mpi_list = NULL; + comment = NULL; + blob = NULL; + + err = sexp_extract_identifier (key_public, &key_type); + if (err) + goto out; + + err = ssh_key_type_lookup (NULL, key_type, &spec); + if (err) + goto out; + + err = sexp_key_extract (key_public, spec, NULL, &mpi_list, &comment); + if (err) + goto out; + + err = ssh_convert_key_to_blob (&blob, &blob_n, + spec.ssh_identifier, mpi_list); + if (err) + goto out; + + err = stream_write_string (stream, blob, blob_n); + if (err) + goto out; + + err = stream_write_cstring (stream, + override_comment? override_comment : comment); + + out: + + mpint_list_free (mpi_list); + xfree (key_type); + xfree (comment); + xfree (blob); + + return err; +} + +/* Read a public key out of BLOB/BLOB_SIZE according to the key + specification given as KEY_SPEC, storing the new key in KEY_PUBLIC. + Returns zero on success or an error code. */ +static gpg_error_t +ssh_read_key_public_from_blob (unsigned char *blob, size_t blob_size, + gcry_sexp_t *key_public, + ssh_key_type_spec_t *key_spec) +{ + estream_t blob_stream; + gpg_error_t err; + + err = 0; + + blob_stream = es_mopen (NULL, 0, 0, 1, NULL, NULL, "r+"); + if (! blob_stream) + { + err = gpg_error_from_errno (errno); + goto out; + } + + err = stream_write_data (blob_stream, blob, blob_size); + if (err) + goto out; + + err = es_fseek (blob_stream, 0, SEEK_SET); + if (err) + goto out; + + err = ssh_receive_key (blob_stream, key_public, 0, 0, key_spec); + + out: + + if (blob_stream) + es_fclose (blob_stream); + + return err; +} + + + +/* This function calculates the key grip for the key contained in the + S-Expression KEY and writes it to BUFFER, which must be large + enough to hold it. Returns usual error code. */ +static gpg_error_t +ssh_key_grip (gcry_sexp_t key, unsigned char *buffer) +{ + if (!gcry_pk_get_keygrip (key, buffer)) + return gpg_error (GPG_ERR_INTERNAL); + + return 0; +} + +/* Converts the secret key KEY_SECRET into a public key, storing it in + KEY_PUBLIC. SPEC is the according key specification. Returns zero + on success or an error code. */ +static gpg_error_t +key_secret_to_public (gcry_sexp_t *key_public, + ssh_key_type_spec_t spec, gcry_sexp_t key_secret) +{ + char *comment; + gcry_mpi_t *mpis; + gpg_error_t err; + int is_secret; + + comment = NULL; + mpis = NULL; + + err = sexp_key_extract (key_secret, spec, &is_secret, &mpis, &comment); + if (err) + goto out; + + err = sexp_key_construct (key_public, spec, 0, mpis, comment); + + out: + + mpint_list_free (mpis); + xfree (comment); + + return err; +} + + +/* Check whether a smartcard is available and whether it has a usable + key. Store a copy of that key at R_PK and return 0. If no key is + available store NULL at R_PK and return an error code. If CARDSN + is not NULL, a string with the serial number of the card will be + a malloced and stored there. */ +static gpg_error_t +card_key_available (ctrl_t ctrl, gcry_sexp_t *r_pk, char **cardsn) +{ + gpg_error_t err; + char *authkeyid; + char *serialno = NULL; + unsigned char *pkbuf; + size_t pkbuflen; + gcry_sexp_t s_pk; + unsigned char grip[20]; + + *r_pk = NULL; + if (cardsn) + *cardsn = NULL; + + /* First see whether a card is available and whether the application + is supported. */ + err = agent_card_getattr (ctrl, "$AUTHKEYID", &authkeyid); + if ( gpg_err_code (err) == GPG_ERR_CARD_REMOVED ) + { + /* Ask for the serial number to reset the card. */ + err = agent_card_serialno (ctrl, &serialno); + if (err) + { + if (opt.verbose) + log_info (_("error getting serial number of card: %s\n"), + gpg_strerror (err)); + return err; + } + log_info (_("detected card with S/N: %s\n"), serialno); + err = agent_card_getattr (ctrl, "$AUTHKEYID", &authkeyid); + } + if (err) + { + log_error (_("error getting default authentication keyID of card: %s\n"), + gpg_strerror (err)); + xfree (serialno); + return err; + } + + /* Get the S/N if we don't have it yet. Use the fast getattr method. */ + if (!serialno && (err = agent_card_getattr (ctrl, "SERIALNO", &serialno)) ) + { + log_error (_("error getting serial number of card: %s\n"), + gpg_strerror (err)); + xfree (authkeyid); + return err; + } + + /* Read the public key. */ + err = agent_card_readkey (ctrl, authkeyid, &pkbuf); + if (err) + { + if (opt.verbose) + log_info (_("no suitable card key found: %s\n"), gpg_strerror (err)); + xfree (serialno); + xfree (authkeyid); + return err; + } + + pkbuflen = gcry_sexp_canon_len (pkbuf, 0, NULL, NULL); + err = gcry_sexp_sscan (&s_pk, NULL, (char*)pkbuf, pkbuflen); + if (err) + { + log_error ("failed to build S-Exp from received card key: %s\n", + gpg_strerror (err)); + xfree (pkbuf); + xfree (serialno); + xfree (authkeyid); + return err; + } + + err = ssh_key_grip (s_pk, grip); + if (err) + { + log_debug ("error computing keygrip from received card key: %s\n", + gcry_strerror (err)); + xfree (pkbuf); + gcry_sexp_release (s_pk); + xfree (serialno); + xfree (authkeyid); + return err; + } + + if ( agent_key_available (grip) ) + { + /* (Shadow)-key is not available in our key storage. */ + unsigned char *shadow_info; + unsigned char *tmp; + + shadow_info = make_shadow_info (serialno, authkeyid); + if (!shadow_info) + { + err = gpg_error_from_errno (errno); + xfree (pkbuf); + gcry_sexp_release (s_pk); + xfree (serialno); + xfree (authkeyid); + return err; + } + err = agent_shadow_key (pkbuf, shadow_info, &tmp); + xfree (shadow_info); + if (err) + { + log_error (_("shadowing the key failed: %s\n"), gpg_strerror (err)); + xfree (pkbuf); + gcry_sexp_release (s_pk); + xfree (serialno); + xfree (authkeyid); + return err; + } + xfree (pkbuf); + pkbuf = tmp; + pkbuflen = gcry_sexp_canon_len (pkbuf, 0, NULL, NULL); + assert (pkbuflen); + + err = agent_write_private_key (grip, pkbuf, pkbuflen, 0); + if (err) + { + log_error (_("error writing key: %s\n"), gpg_strerror (err)); + xfree (pkbuf); + gcry_sexp_release (s_pk); + xfree (serialno); + xfree (authkeyid); + return err; + } + } + + if (cardsn) + { + char *dispsn; + + /* If the card handler is able to return a short serialnumber, + use that one, else use the complete serialno. */ + if (!agent_card_getattr (ctrl, "$DISPSERIALNO", &dispsn)) + { + *cardsn = xtryasprintf ("cardno:%s", dispsn); + xfree (dispsn); + } + else + *cardsn = xtryasprintf ("cardno:%s", serialno); + if (!*cardsn) + { + err = gpg_error_from_errno (errno); + xfree (pkbuf); + gcry_sexp_release (s_pk); + xfree (serialno); + xfree (authkeyid); + return err; + } + } + + xfree (pkbuf); + xfree (serialno); + xfree (authkeyid); + *r_pk = s_pk; + return 0; +} + + + + +/* + + Request handler. Each handler is provided with a CTRL context, a + REQUEST object and a RESPONSE object. The actual request is to be + read from REQUEST, the response needs to be written to RESPONSE. + +*/ + + +/* Handler for the "request_identities" command. */ +static gpg_error_t +ssh_handler_request_identities (ctrl_t ctrl, + estream_t request, estream_t response) +{ + char *key_type; + ssh_key_type_spec_t spec; + struct dirent *dir_entry; + char *key_directory; + size_t key_directory_n; + char *key_path; + unsigned char *buffer; + size_t buffer_n; + u32 key_counter; + estream_t key_blobs; + gcry_sexp_t key_secret; + gcry_sexp_t key_public; + DIR *dir; + gpg_error_t err; + int ret; + FILE *ctrl_fp = NULL; + char *cardsn; + gpg_error_t ret_err; + + /* Prepare buffer stream. */ + + key_directory = NULL; + key_secret = NULL; + key_public = NULL; + key_type = NULL; + key_path = NULL; + key_counter = 0; + buffer = NULL; + dir = NULL; + err = 0; + + key_blobs = es_mopen (NULL, 0, 0, 1, NULL, NULL, "r+"); + if (! key_blobs) + { + err = gpg_error_from_errno (errno); + goto out; + } + + /* Open key directory. */ + key_directory = make_filename (opt.homedir, GNUPG_PRIVATE_KEYS_DIR, NULL); + if (! key_directory) + { + err = gpg_err_code_from_errno (errno); + goto out; + } + key_directory_n = strlen (key_directory); + + key_path = xtrymalloc (key_directory_n + 46); + if (! key_path) + { + err = gpg_err_code_from_errno (errno); + goto out; + } + + sprintf (key_path, "%s/", key_directory); + sprintf (key_path + key_directory_n + 41, ".key"); + + dir = opendir (key_directory); + if (! dir) + { + err = gpg_err_code_from_errno (errno); + goto out; + } + + + + /* First check whether a key is currently available in the card + reader - this should be allowed even without being listed in + sshcontrol. */ + + if (!card_key_available (ctrl, &key_public, &cardsn)) + { + err = ssh_send_key_public (key_blobs, key_public, cardsn); + gcry_sexp_release (key_public); + key_public = NULL; + xfree (cardsn); + if (err) + goto out; + + key_counter++; + } + + + /* Then look at all the registered an allowed keys. */ + + + /* Fixme: We should better iterate over the control file and check + whether the key file is there. This is better in resepct to + performance if tehre are a lot of key sin our key storage. */ + /* FIXME: make sure that buffer gets deallocated properly. */ + err = open_control_file (&ctrl_fp, 0); + if (err) + goto out; + + while ( (dir_entry = readdir (dir)) ) + { + if ((strlen (dir_entry->d_name) == 44) + && (! strncmp (dir_entry->d_name + 40, ".key", 4))) + { + char hexgrip[41]; + int disabled; + + /* We do only want to return keys listed in our control + file. */ + strncpy (hexgrip, dir_entry->d_name, 40); + hexgrip[40] = 0; + if ( strlen (hexgrip) != 40 ) + continue; + if (search_control_file (ctrl_fp, hexgrip, &disabled) + || disabled) + continue; + + strncpy (key_path + key_directory_n + 1, dir_entry->d_name, 40); + + /* Read file content. */ + err = file_to_buffer (key_path, &buffer, &buffer_n); + if (err) + goto out; + + err = gcry_sexp_sscan (&key_secret, NULL, (char*)buffer, buffer_n); + if (err) + goto out; + + xfree (buffer); + buffer = NULL; + + err = sexp_extract_identifier (key_secret, &key_type); + if (err) + goto out; + + err = ssh_key_type_lookup (NULL, key_type, &spec); + if (err) + goto out; + + xfree (key_type); + key_type = NULL; + + err = key_secret_to_public (&key_public, spec, key_secret); + if (err) + goto out; + + gcry_sexp_release (key_secret); + key_secret = NULL; + + err = ssh_send_key_public (key_blobs, key_public, NULL); + if (err) + goto out; + + gcry_sexp_release (key_public); + key_public = NULL; + + key_counter++; + } + } + + ret = es_fseek (key_blobs, 0, SEEK_SET); + if (ret) + { + err = gpg_error_from_errno (errno); + goto out; + } + + out: + + /* Send response. */ + + gcry_sexp_release (key_secret); + gcry_sexp_release (key_public); + + if (! err) + { + ret_err = stream_write_byte (response, SSH_RESPONSE_IDENTITIES_ANSWER); + if (ret_err) + goto leave; + ret_err = stream_write_uint32 (response, key_counter); + if (ret_err) + goto leave; + ret_err = stream_copy (response, key_blobs); + if (ret_err) + goto leave; + } + else + { + ret_err = stream_write_byte (response, SSH_RESPONSE_FAILURE); + goto leave; + }; + + leave: + + if (key_blobs) + es_fclose (key_blobs); + if (dir) + closedir (dir); + + if (ctrl_fp) + fclose (ctrl_fp); + + free (key_directory); + xfree (key_path); + xfree (buffer); + xfree (key_type); + + return ret_err; +} + +/* This function hashes the data contained in DATA of size DATA_N + according to the message digest algorithm specified by MD_ALGORITHM + and writes the message digest to HASH, which needs to large enough + for the digest. */ +static gpg_error_t +data_hash (unsigned char *data, size_t data_n, + int md_algorithm, unsigned char *hash) +{ + gcry_md_hash_buffer (md_algorithm, hash, data, data_n); + + return 0; +} + +/* This function signs the data contained in CTRL, stores the created + signature in newly allocated memory in SIG and it's size in SIG_N; + SIG_ENCODER is the signature encoder to use. */ +static gpg_error_t +data_sign (ctrl_t ctrl, ssh_signature_encoder_t sig_encoder, + unsigned char **sig, size_t *sig_n) +{ + gpg_error_t err; + gcry_sexp_t signature_sexp = NULL; + estream_t stream = NULL; + gcry_sexp_t valuelist = NULL; + gcry_sexp_t sublist = NULL; + gcry_mpi_t sig_value = NULL; + unsigned char *sig_blob = NULL; + size_t sig_blob_n = 0; + char *identifier = NULL; + const char *identifier_raw; + size_t identifier_n; + ssh_key_type_spec_t spec; + int ret; + unsigned int i; + const char *elems; + size_t elems_n; + gcry_mpi_t *mpis = NULL; + + *sig = NULL; + *sig_n = 0; + + ctrl->use_auth_call = 1; + err = agent_pksign_do (ctrl, + _("Please enter the passphrase " + "for the ssh key%0A %c"), &signature_sexp, + CACHE_MODE_SSH); + ctrl->use_auth_call = 0; + if (err) + goto out; + + valuelist = gcry_sexp_nth (signature_sexp, 1); + if (! valuelist) + { + err = gpg_error (GPG_ERR_INV_SEXP); + goto out; + } + + stream = es_mopen (NULL, 0, 0, 1, NULL, NULL, "r+"); + if (! stream) + { + err = gpg_error_from_errno (errno); + goto out; + } + + identifier_raw = gcry_sexp_nth_data (valuelist, 0, &identifier_n); + if (! identifier_raw) + { + err = gpg_error (GPG_ERR_INV_SEXP); + goto out; + } + + identifier = make_cstring (identifier_raw, identifier_n); + if (! identifier) + { + err = gpg_error_from_errno (errno); + goto out; + } + + err = ssh_key_type_lookup (NULL, identifier, &spec); + if (err) + goto out; + + err = stream_write_cstring (stream, spec.ssh_identifier); + if (err) + goto out; + + elems = spec.elems_signature; + elems_n = strlen (elems); + + mpis = xtrycalloc (elems_n + 1, sizeof *mpis); + if (!mpis) + { + err = gpg_error_from_errno (errno); + goto out; + } + + for (i = 0; i < elems_n; i++) + { + sublist = gcry_sexp_find_token (valuelist, spec.elems_signature + i, 1); + if (! sublist) + { + err = gpg_error (GPG_ERR_INV_SEXP); + break; + } + + sig_value = gcry_sexp_nth_mpi (sublist, 1, GCRYMPI_FMT_USG); + if (! sig_value) + { + err = gpg_error (GPG_ERR_INTERNAL); /* FIXME? */ + break; + } + gcry_sexp_release (sublist); + sublist = NULL; + + mpis[i] = sig_value; + } + if (err) + goto out; + + err = (*sig_encoder) (stream, mpis); + if (err) + goto out; + + sig_blob_n = es_ftell (stream); + if (sig_blob_n == -1) + { + err = gpg_error_from_errno (errno); + goto out; + } + + sig_blob = xtrymalloc (sig_blob_n); + if (! sig_blob) + { + err = gpg_error_from_errno (errno); + goto out; + } + + ret = es_fseek (stream, 0, SEEK_SET); + if (ret) + { + err = gpg_error_from_errno (errno); + goto out; + } + + err = stream_read_data (stream, sig_blob, sig_blob_n); + if (err) + goto out; + + *sig = sig_blob; + *sig_n = sig_blob_n; + + out: + + if (err) + xfree (sig_blob); + + if (stream) + es_fclose (stream); + gcry_sexp_release (valuelist); + gcry_sexp_release (signature_sexp); + gcry_sexp_release (sublist); + mpint_list_free (mpis); + xfree (identifier); + + return err; +} + +/* Handler for the "sign_request" command. */ +static gpg_error_t +ssh_handler_sign_request (ctrl_t ctrl, estream_t request, estream_t response) +{ + gcry_sexp_t key; + ssh_key_type_spec_t spec; + unsigned char hash[MAX_DIGEST_LEN]; + unsigned int hash_n; + unsigned char key_grip[20]; + unsigned char *key_blob; + u32 key_blob_size; + unsigned char *data; + unsigned char *sig; + size_t sig_n; + u32 data_size; + u32 flags; + gpg_error_t err; + gpg_error_t ret_err; + + key_blob = NULL; + data = NULL; + sig = NULL; + key = NULL; + + /* Receive key. */ + + err = stream_read_string (request, 0, &key_blob, &key_blob_size); + if (err) + goto out; + + err = ssh_read_key_public_from_blob (key_blob, key_blob_size, &key, &spec); + if (err) + goto out; + + /* Receive data to sign. */ + err = stream_read_string (request, 0, &data, &data_size); + if (err) + goto out; + + /* FIXME? */ + err = stream_read_uint32 (request, &flags); + if (err) + goto out; + + /* Hash data. */ + hash_n = gcry_md_get_algo_dlen (GCRY_MD_SHA1); + if (! hash_n) + { + err = gpg_error (GPG_ERR_INTERNAL); + goto out; + } + err = data_hash (data, data_size, GCRY_MD_SHA1, hash); + if (err) + goto out; + + /* Calculate key grip. */ + err = ssh_key_grip (key, key_grip); + if (err) + goto out; + + /* Sign data. */ + + ctrl->digest.algo = GCRY_MD_SHA1; + memcpy (ctrl->digest.value, hash, hash_n); + ctrl->digest.valuelen = hash_n; + ctrl->digest.raw_value = ! (spec.flags & SPEC_FLAG_USE_PKCS1V2); + ctrl->have_keygrip = 1; + memcpy (ctrl->keygrip, key_grip, 20); + + err = data_sign (ctrl, spec.signature_encoder, &sig, &sig_n); + + out: + + /* Done. */ + + if (! err) + { + ret_err = stream_write_byte (response, SSH_RESPONSE_SIGN_RESPONSE); + if (ret_err) + goto leave; + ret_err = stream_write_string (response, sig, sig_n); + if (ret_err) + goto leave; + } + else + { + ret_err = stream_write_byte (response, SSH_RESPONSE_FAILURE); + if (ret_err) + goto leave; + } + + leave: + + gcry_sexp_release (key); + xfree (key_blob); + xfree (data); + xfree (sig); + + return ret_err; +} + +/* This function extracts the comment contained in the key + S-Expression KEY and stores a copy in COMMENT. Returns usual error + code. */ +static gpg_error_t +ssh_key_extract_comment (gcry_sexp_t key, char **comment) +{ + gcry_sexp_t comment_list; + char *comment_new; + const char *data; + size_t data_n; + gpg_error_t err; + + comment_list = gcry_sexp_find_token (key, "comment", 0); + if (! comment_list) + { + err = gpg_error (GPG_ERR_INV_SEXP); + goto out; + } + + data = gcry_sexp_nth_data (comment_list, 1, &data_n); + if (! data) + { + err = gpg_error (GPG_ERR_INV_SEXP); + goto out; + } + + comment_new = make_cstring (data, data_n); + if (! comment_new) + { + err = gpg_error_from_errno (errno); + goto out; + } + + *comment = comment_new; + err = 0; + + out: + + gcry_sexp_release (comment_list); + + return err; +} + +/* This function converts the key contained in the S-Expression KEY + into a buffer, which is protected by the passphrase PASSPHRASE. + Returns usual error code. */ +static gpg_error_t +ssh_key_to_protected_buffer (gcry_sexp_t key, const char *passphrase, + unsigned char **buffer, size_t *buffer_n) +{ + unsigned char *buffer_new; + unsigned int buffer_new_n; + gpg_error_t err; + + err = 0; + buffer_new_n = gcry_sexp_sprint (key, GCRYSEXP_FMT_CANON, NULL, 0); + buffer_new = xtrymalloc_secure (buffer_new_n); + if (! buffer_new) + { + err = gpg_error_from_errno (errno); + goto out; + } + + gcry_sexp_sprint (key, GCRYSEXP_FMT_CANON, buffer_new, buffer_new_n); + /* FIXME: guarantee? */ + + err = agent_protect (buffer_new, passphrase, buffer, buffer_n); + + out: + + xfree (buffer_new); + + return err; +} + + + +/* Store the ssh KEY into our local key storage and protect it after + asking for a passphrase. Cache that passphrase. TTL is the + maximum caching time for that key. If the key already exists in + our key storage, don't do anything. When entering a new key also + add an entry to the sshcontrol file. */ +static gpg_error_t +ssh_identity_register (ctrl_t ctrl, gcry_sexp_t key, int ttl) +{ + gpg_error_t err; + unsigned char key_grip_raw[20]; + char key_grip[41]; + unsigned char *buffer = NULL; + unsigned int buffer_n; + char *description = NULL; + char *comment = NULL; + unsigned int i; + struct pin_entry_info_s *pi = NULL; + + err = ssh_key_grip (key, key_grip_raw); + if (err) + goto out; + + /* Check whether the key is already in our key storage. Don't do + anything then. */ + if ( !agent_key_available (key_grip_raw) ) + goto out; /* Yes, key is available. */ + + + err = ssh_key_extract_comment (key, &comment); + if (err) + goto out; + + if ( asprintf (&description, + _("Please enter a passphrase to protect" + " the received secret key%%0A" + " %s%%0A" + "within gpg-agent's key storage"), + comment ? comment : "?") < 0) + { + err = gpg_error_from_errno (errno); + goto out; + } + + + pi = gcry_calloc_secure (1, sizeof (*pi) + 100 + 1); + if (!pi) + { + err = gpg_error_from_errno (errno); + goto out; + } + pi->max_length = 100; + pi->max_tries = 1; + err = agent_askpin (ctrl, description, NULL, NULL, pi); + if (err) + goto out; + + err = ssh_key_to_protected_buffer (key, pi->pin, &buffer, &buffer_n); + if (err) + goto out; + + /* Store this key to our key storage. */ + err = agent_write_private_key (key_grip_raw, buffer, buffer_n, 0); + if (err) + goto out; + + /* Cache this passphrase. */ + for (i = 0; i < 20; i++) + sprintf (key_grip + 2 * i, "%02X", key_grip_raw[i]); + + err = agent_put_cache (key_grip, CACHE_MODE_SSH, pi->pin, ttl); + if (err) + goto out; + + /* And add an entry to the sshcontrol file. */ + err = add_control_entry (ctrl, key_grip, ttl); + + + out: + if (pi && pi->max_length) + wipememory (pi->pin, pi->max_length); + xfree (pi); + xfree (buffer); + xfree (comment); + free (description); /* (asprintf allocated, thus regular free.) */ + + return err; +} + + +/* This function removes the key contained in the S-Expression KEY + from the local key storage, in case it exists there. Returns usual + error code. FIXME: this function is a stub. */ +static gpg_error_t +ssh_identity_drop (gcry_sexp_t key) +{ + unsigned char key_grip[21] = { 0 }; + gpg_error_t err; + + err = ssh_key_grip (key, key_grip); + if (err) + goto out; + + key_grip[sizeof (key_grip) - 1] = 0; + + /* FIXME: What to do here - forgetting the passphrase or deleting + the key from key cache? */ + + out: + + return err; +} + +/* Handler for the "add_identity" command. */ +static gpg_error_t +ssh_handler_add_identity (ctrl_t ctrl, estream_t request, estream_t response) +{ + gpg_error_t ret_err; + gpg_error_t err; + gcry_sexp_t key; + unsigned char b; + int confirm; + int ttl; + + confirm = 0; + key = NULL; + ttl = 0; + + /* FIXME? */ + err = ssh_receive_key (request, &key, 1, 1, NULL); + if (err) + goto out; + + while (1) + { + err = stream_read_byte (request, &b); + if (gpg_err_code (err) == GPG_ERR_EOF) + { + err = 0; + break; + } + + switch (b) + { + case SSH_OPT_CONSTRAIN_LIFETIME: + { + u32 n = 0; + + err = stream_read_uint32 (request, &n); + if (! err) + ttl = n; + break; + } + + case SSH_OPT_CONSTRAIN_CONFIRM: + { + confirm = 1; + break; + } + + default: + /* FIXME: log/bad? */ + break; + } + } + if (err) + goto out; + + /* FIXME: are constraints used correctly? */ + + err = ssh_identity_register (ctrl, key, ttl); + + out: + + gcry_sexp_release (key); + + if (! err) + ret_err = stream_write_byte (response, SSH_RESPONSE_SUCCESS); + else + ret_err = stream_write_byte (response, SSH_RESPONSE_FAILURE); + + return ret_err; +} + +/* Handler for the "remove_identity" command. */ +static gpg_error_t +ssh_handler_remove_identity (ctrl_t ctrl, + estream_t request, estream_t response) +{ + unsigned char *key_blob; + u32 key_blob_size; + gcry_sexp_t key; + gpg_error_t ret_err; + gpg_error_t err; + + /* Receive key. */ + + key_blob = NULL; + key = NULL; + + err = stream_read_string (request, 0, &key_blob, &key_blob_size); + if (err) + goto out; + + err = ssh_read_key_public_from_blob (key_blob, key_blob_size, &key, NULL); + if (err) + goto out; + + err = ssh_identity_drop (key); + + out: + + xfree (key_blob); + gcry_sexp_release (key); + + if (! err) + ret_err = stream_write_byte (response, SSH_RESPONSE_SUCCESS); + else + ret_err = stream_write_byte (response, SSH_RESPONSE_FAILURE); + + return ret_err; +} + +/* FIXME: stub function. Actually useful? */ +static gpg_error_t +ssh_identities_remove_all (void) +{ + gpg_error_t err; + + err = 0; + + /* FIXME: shall we remove _all_ cache entries or only those + registered through the ssh emulation? */ + + return err; +} + +/* Handler for the "remove_all_identities" command. */ +static gpg_error_t +ssh_handler_remove_all_identities (ctrl_t ctrl, + estream_t request, estream_t response) +{ + gpg_error_t ret_err; + gpg_error_t err; + + err = ssh_identities_remove_all (); + + if (! err) + ret_err = stream_write_byte (response, SSH_RESPONSE_SUCCESS); + else + ret_err = stream_write_byte (response, SSH_RESPONSE_FAILURE); + + return ret_err; +} + +/* Lock agent? FIXME: stub function. */ +static gpg_error_t +ssh_lock (void) +{ + gpg_error_t err; + + /* FIXME */ + log_error ("ssh-agent's lock command is not implemented\n"); + err = 0; + + return err; +} + +/* Unock agent? FIXME: stub function. */ +static gpg_error_t +ssh_unlock (void) +{ + gpg_error_t err; + + log_error ("ssh-agent's unlock command is not implemented\n"); + err = 0; + + return err; +} + +/* Handler for the "lock" command. */ +static gpg_error_t +ssh_handler_lock (ctrl_t ctrl, estream_t request, estream_t response) +{ + gpg_error_t ret_err; + gpg_error_t err; + + err = ssh_lock (); + + if (! err) + ret_err = stream_write_byte (response, SSH_RESPONSE_SUCCESS); + else + ret_err = stream_write_byte (response, SSH_RESPONSE_FAILURE); + + return ret_err; +} + +/* Handler for the "unlock" command. */ +static gpg_error_t +ssh_handler_unlock (ctrl_t ctrl, estream_t request, estream_t response) +{ + gpg_error_t ret_err; + gpg_error_t err; + + err = ssh_unlock (); + + if (! err) + ret_err = stream_write_byte (response, SSH_RESPONSE_SUCCESS); + else + ret_err = stream_write_byte (response, SSH_RESPONSE_FAILURE); + + return ret_err; +} + + + +/* Return the request specification for the request identified by TYPE + or NULL in case the requested request specification could not be + found. */ +static ssh_request_spec_t * +request_spec_lookup (int type) +{ + ssh_request_spec_t *spec; + unsigned int i; + + for (i = 0; i < DIM (request_specs); i++) + if (request_specs[i].type == type) + break; + if (i == DIM (request_specs)) + { + log_info ("ssh request %u is not supported\n", type); + spec = NULL; + } + else + spec = request_specs + i; + + return spec; +} + +/* Process a single request. The request is read from and the + response is written to STREAM_SOCK. Uses CTRL as context. Returns + zero in case of success, non zero in case of failure. */ +static int +ssh_request_process (ctrl_t ctrl, estream_t stream_sock) +{ + ssh_request_spec_t *spec; + estream_t response; + estream_t request; + unsigned char request_type; + gpg_error_t err; + int send_err; + int ret; + unsigned char *request_data; + u32 request_data_size; + u32 response_size; + + request_data = NULL; + response = NULL; + request = NULL; + send_err = 0; + + /* Create memory streams for request/response data. The entire + request will be stored in secure memory, since it might contain + secret key material. The response does not have to be stored in + secure memory, since we never give out secret keys. + + Note: we only have little secure memory, but there is NO + possibility of DoS here; only trusted clients are allowed to + connect to the agent. What could happen is that the agent + returns out-of-secure-memory errors on requests in case the + agent's owner floods his own agent with many large messages. + -moritz */ + + /* Retrieve request. */ + err = stream_read_string (stream_sock, 1, &request_data, &request_data_size); + if (err) + goto out; + + if (opt.verbose > 1) + log_info ("received ssh request of length %u\n", + (unsigned int)request_data_size); + + if (! request_data_size) + { + send_err = 1; + goto out; + /* Broken request; FIXME. */ + } + + request_type = request_data[0]; + spec = request_spec_lookup (request_type); + if (! spec) + { + send_err = 1; + goto out; + /* Unknown request; FIXME. */ + } + + if (spec->secret_input) + request = es_mopen (NULL, 0, 0, 1, realloc_secure, gcry_free, "r+"); + else + request = es_mopen (NULL, 0, 0, 1, gcry_realloc, gcry_free, "r+"); + if (! request) + { + err = gpg_error_from_errno (errno); + goto out; + } + ret = es_setvbuf (request, NULL, _IONBF, 0); + if (ret) + { + err = gpg_error_from_errno (errno); + goto out; + } + err = stream_write_data (request, request_data + 1, request_data_size - 1); + if (err) + goto out; + es_rewind (request); + + response = es_mopen (NULL, 0, 0, 1, NULL, NULL, "r+"); + if (! response) + { + err = gpg_error_from_errno (errno); + goto out; + } + + if (opt.verbose) + log_info ("ssh request handler for %s (%u) started\n", + spec->identifier, spec->type); + + err = (*spec->handler) (ctrl, request, response); + + if (opt.verbose) + { + if (err) + log_info ("ssh request handler for %s (%u) failed: %s\n", + spec->identifier, spec->type, gpg_strerror (err)); + else + log_info ("ssh request handler for %s (%u) ready\n", + spec->identifier, spec->type); + } + + if (err) + { + send_err = 1; + goto out; + } + + response_size = es_ftell (response); + if (opt.verbose > 1) + log_info ("sending ssh response of length %u\n", + (unsigned int)response_size); + + err = es_fseek (response, 0, SEEK_SET); + if (err) + { + send_err = 1; + goto out; + } + + err = stream_write_uint32 (stream_sock, response_size); + if (err) + { + send_err = 1; + goto out; + } + + err = stream_copy (stream_sock, response); + if (err) + goto out; + + err = es_fflush (stream_sock); + if (err) + goto out; + + out: + + if (err && es_feof (stream_sock)) + log_error ("error occured while processing request: %s\n", + gpg_strerror (err)); + + if (send_err) + { + if (opt.verbose > 1) + log_info ("sending ssh error response\n"); + err = stream_write_uint32 (stream_sock, 1); + if (err) + goto leave; + err = stream_write_byte (stream_sock, SSH_RESPONSE_FAILURE); + if (err) + goto leave; + } + + leave: + + if (request) + es_fclose (request); + if (response) + es_fclose (response); + xfree (request_data); /* FIXME? */ + + return !!err; +} + +/* Start serving client on SOCK_CLIENT. */ +void +start_command_handler_ssh (int sock_client) +{ + struct server_control_s ctrl; + estream_t stream_sock; + gpg_error_t err; + int ret; + + /* Setup control structure. */ + + memset (&ctrl, 0, sizeof (ctrl)); + agent_init_default_ctrl (&ctrl); + ctrl.connection_fd = sock_client; + + /* Because the ssh protocol does not send us information about the + the current TTY setting, we resort here to use those from startup + or those explictly set. */ + if (!ctrl.display && opt.startup_display) + ctrl.display = strdup (opt.startup_display); + if (!ctrl.ttyname && opt.startup_ttyname) + ctrl.ttyname = strdup (opt.startup_ttyname); + if (!ctrl.ttytype && opt.startup_ttytype) + ctrl.ttytype = strdup (opt.startup_ttytype); + if (!ctrl.lc_ctype && opt.startup_lc_ctype) + ctrl.lc_ctype = strdup (opt.startup_lc_ctype); + if (!ctrl.lc_messages && opt.startup_lc_messages) + ctrl.lc_messages = strdup (opt.startup_lc_messages); + + + /* Create stream from socket. */ + stream_sock = es_fdopen (sock_client, "r+"); + if (!stream_sock) + { + err = gpg_error_from_errno (errno); + log_error (_("failed to create stream from socket: %s\n"), + gpg_strerror (err)); + goto out; + } + /* We have to disable the estream buffering, because the estream + core doesn't know about secure memory. */ + ret = es_setvbuf (stream_sock, NULL, _IONBF, 0); + if (ret) + { + err = gpg_error_from_errno (errno); + log_error (_("failed to disable buffering " + "on socket stream: %s\n"), gpg_strerror (err)); + goto out; + } + + /* Main processing loop. */ + while ( !ssh_request_process (&ctrl, stream_sock) ) + ; + + /* Reset the SCD in case it has been used. */ + agent_reset_scd (&ctrl); + + + out: + if (stream_sock) + es_fclose (stream_sock); + + free (ctrl.display); + free (ctrl.ttyname); + free (ctrl.ttytype); + free (ctrl.lc_ctype); + free (ctrl.lc_messages); +} diff --git a/agent/command.c b/agent/command.c new file mode 100644 index 000000000..1f3923522 --- /dev/null +++ b/agent/command.c @@ -0,0 +1,1112 @@ +/* command.c - gpg-agent command handler + * 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. + */ + +/* FIXME: we should not use the default assuan buffering but setup + some buffering in secure mempory to protect session keys etc. */ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "agent.h" + +/* maximum allowed size of the inquired ciphertext */ +#define MAXLEN_CIPHERTEXT 4096 +/* maximum allowed size of the key parameters */ +#define MAXLEN_KEYPARAM 1024 + +#define set_error(e,t) assuan_set_error (ctx, ASSUAN_ ## e, (t)) + + +#if MAX_DIGEST_LEN < 20 +#error MAX_DIGEST_LEN shorter than keygrip +#endif + +/* Data used to associate an Assuan context with local server data */ +struct server_local_s { + ASSUAN_CONTEXT assuan_ctx; + int message_fd; + int use_cache_for_signing; + char *keydesc; /* Allocated description for the next key + operation. */ +}; + + + + + +/* Release the memory buffer MB but first wipe out the used memory. */ +static void +clear_outbuf (membuf_t *mb) +{ + void *p; + size_t n; + + p = get_membuf (mb, &n); + if (p) + { + memset (p, 0, n); + xfree (p); + } +} + + +/* Write the content of memory buffer MB as assuan data to CTX and + wipe the buffer out afterwards. */ +static gpg_error_t +write_and_clear_outbuf (assuan_context_t ctx, membuf_t *mb) +{ + assuan_error_t ae; + void *p; + size_t n; + + p = get_membuf (mb, &n); + if (!p) + return gpg_error (GPG_ERR_ENOMEM); + ae = assuan_send_data (ctx, p, n); + memset (p, 0, n); + xfree (p); + return map_assuan_err (ae); +} + + +static void +reset_notify (ASSUAN_CONTEXT ctx) +{ + ctrl_t ctrl = assuan_get_pointer (ctx); + + memset (ctrl->keygrip, 0, 20); + ctrl->have_keygrip = 0; + ctrl->digest.valuelen = 0; + + xfree (ctrl->server_local->keydesc); + ctrl->server_local->keydesc = NULL; +} + + +/* Check whether the option NAME appears in LINE */ +static int +has_option (const char *line, const char *name) +{ + const char *s; + int n = strlen (name); + + s = strstr (line, name); + return (s && (s == line || spacep (s-1)) && (!s[n] || spacep (s+n))); +} + +/* Replace all '+' by a blank. */ +static void +plus_to_blank (char *s) +{ + for (; *s; s++) + { + if (*s == '+') + *s = ' '; + } +} + + +/* Parse a hex string. Return an Assuan error code or 0 on success and the + length of the parsed string in LEN. */ +static int +parse_hexstring (ASSUAN_CONTEXT ctx, const char *string, size_t *len) +{ + const char *p; + size_t n; + + /* parse the hash value */ + for (p=string, n=0; hexdigitp (p); p++, n++) + ; + if (*p != ' ' && *p != '\t' && *p) + return set_error (Parameter_Error, "invalid hexstring"); + if ((n&1)) + return set_error (Parameter_Error, "odd number of digits"); + *len = n; + return 0; +} + +/* Parse the keygrip in STRING into the provided buffer BUF. BUF must + provide space for 20 bytes. BUF is not changed if the fucntions + returns an error. */ +static int +parse_keygrip (ASSUAN_CONTEXT ctx, const char *string, unsigned char *buf) +{ + int rc; + size_t n; + const unsigned char *p; + + rc = parse_hexstring (ctx, string, &n); + if (rc) + return rc; + n /= 2; + if (n != 20) + return set_error (Parameter_Error, "invalid length of keygrip"); + + for (p=(const unsigned char*)string, n=0; n < 20; p += 2, n++) + buf[n] = xtoi_2 (p); + + return 0; +} + + + + +/* ISTRUSTED + + Return OK when we have an entry with this fingerprint in our + trustlist */ +static int +cmd_istrusted (ASSUAN_CONTEXT ctx, char *line) +{ + int rc, n, i; + char *p; + char fpr[41]; + + /* parse the fingerprint value */ + for (p=line,n=0; hexdigitp (p); p++, n++) + ; + if (*p || !(n == 40 || n == 32)) + return set_error (Parameter_Error, "invalid fingerprint"); + i = 0; + if (n==32) + { + strcpy (fpr, "00000000"); + i += 8; + } + for (p=line; i < 40; p++, i++) + fpr[i] = *p >= 'a'? (*p & 0xdf): *p; + fpr[i] = 0; + rc = agent_istrusted (fpr); + if (!rc) + return 0; + else if (rc == -1) + return ASSUAN_Not_Trusted; + else + { + log_error ("command is_trusted failed: %s\n", gpg_strerror (rc)); + return map_to_assuan_status (rc); + } +} + +/* LISTTRUSTED + + List all entries from the trustlist */ +static int +cmd_listtrusted (ASSUAN_CONTEXT ctx, char *line) +{ + int rc = agent_listtrusted (ctx); + if (rc) + log_error ("command listtrusted failed: %s\n", gpg_strerror (rc)); + return map_to_assuan_status (rc); +} + + +/* MARKTRUSTED + + Store a new key in into the trustlist*/ +static int +cmd_marktrusted (ASSUAN_CONTEXT ctx, char *line) +{ + ctrl_t ctrl = assuan_get_pointer (ctx); + int rc, n, i; + char *p; + char fpr[41]; + int flag; + + /* parse the fingerprint value */ + for (p=line,n=0; hexdigitp (p); p++, n++) + ; + if (!spacep (p) || !(n == 40 || n == 32)) + return set_error (Parameter_Error, "invalid fingerprint"); + i = 0; + if (n==32) + { + strcpy (fpr, "00000000"); + i += 8; + } + for (p=line; i < 40; p++, i++) + fpr[i] = *p >= 'a'? (*p & 0xdf): *p; + fpr[i] = 0; + + while (spacep (p)) + p++; + flag = *p++; + if ( (flag != 'S' && flag != 'P') || !spacep (p) ) + return set_error (Parameter_Error, "invalid flag - must be P or S"); + while (spacep (p)) + p++; + + rc = agent_marktrusted (ctrl, p, fpr, flag); + if (rc) + log_error ("command marktrusted failed: %s\n", gpg_strerror (rc)); + return map_to_assuan_status (rc); +} + + + + +/* HAVEKEY + + Return success when the secret key is available */ +static int +cmd_havekey (ASSUAN_CONTEXT ctx, char *line) +{ + int rc; + unsigned char buf[20]; + + rc = parse_keygrip (ctx, line, buf); + if (rc) + return rc; + + if (agent_key_available (buf)) + return ASSUAN_No_Secret_Key; + + return 0; +} + + +/* SIGKEY + SETKEY + + Set the key used for a sign or decrypt operation */ +static int +cmd_sigkey (ASSUAN_CONTEXT ctx, char *line) +{ + int rc; + ctrl_t ctrl = assuan_get_pointer (ctx); + + rc = parse_keygrip (ctx, line, ctrl->keygrip); + if (rc) + return rc; + ctrl->have_keygrip = 1; + return 0; +} + + +/* SETKEYDESC plus_percent_escaped_string: + + Set a description to be used for the next PKSIGN or PKDECRYPT + operation if this operation requires the entry of a passphrase. If + this command is not used a default text will be used. Note, that + this description implictly selects the label used for the entry + box; if the string contains the string PIN (which in general will + not be translated), "PIN" is used, otherwise the translation of + 'passphrase" is used. The description string should not contain + blanks unless they are percent or '+' escaped. + + The description is only valid for the next PKSIGN or PKDECRYPT + operation. +*/ +static int +cmd_setkeydesc (assuan_context_t ctx, char *line) +{ + ctrl_t ctrl = assuan_get_pointer (ctx); + char *desc, *p; + + for (p=line; *p == ' '; p++) + ; + desc = p; + p = strchr (desc, ' '); + if (p) + *p = 0; /* We ignore any garbage; we might late use it for other args. */ + + if (!desc || !*desc) + return set_error (Parameter_Error, "no description given"); + + /* Note, that we only need to replace the + characters and should + leave the other escaping in place because the escaped string is + send verbatim to the pinentry which does the unescaping (but not + the + replacing) */ + plus_to_blank (desc); + + xfree (ctrl->server_local->keydesc); + ctrl->server_local->keydesc = xtrystrdup (desc); + if (!ctrl->server_local->keydesc) + return map_to_assuan_status (gpg_error_from_errno (errno)); + return 0; +} + + +/* SETHASH + + The client can use this command to tell the server about the data + (which usually is a hash) to be signed. */ +static int +cmd_sethash (ASSUAN_CONTEXT ctx, char *line) +{ + int rc; + size_t n; + char *p; + ctrl_t ctrl = assuan_get_pointer (ctx); + unsigned char *buf; + char *endp; + int algo; + + /* parse the algo number and check it */ + algo = (int)strtoul (line, &endp, 10); + for (line = endp; *line == ' ' || *line == '\t'; line++) + ; + if (!algo || gcry_md_test_algo (algo)) + return set_error (Unsupported_Algorithm, NULL); + ctrl->digest.algo = algo; + + /* parse the hash value */ + rc = parse_hexstring (ctx, line, &n); + if (rc) + return rc; + n /= 2; + if (n != 16 && n != 20 && n != 24 && n != 32) + return set_error (Parameter_Error, "unsupported length of hash"); + if (n > MAX_DIGEST_LEN) + return set_error (Parameter_Error, "hash value to long"); + + buf = ctrl->digest.value; + ctrl->digest.valuelen = n; + for (p=line, n=0; n < ctrl->digest.valuelen; p += 2, n++) + buf[n] = xtoi_2 (p); + for (; n < ctrl->digest.valuelen; n++) + buf[n] = 0; + return 0; +} + + +/* PKSIGN + + Perform the actual sign operation. Neither input nor output are + sensitive to eavesdropping. */ +static int +cmd_pksign (ASSUAN_CONTEXT ctx, char *line) +{ + int rc; + cache_mode_t cache_mode = CACHE_MODE_NORMAL; + ctrl_t ctrl = assuan_get_pointer (ctx); + membuf_t outbuf; + + if (opt.ignore_cache_for_signing) + cache_mode = CACHE_MODE_IGNORE; + else if (!ctrl->server_local->use_cache_for_signing) + cache_mode = CACHE_MODE_IGNORE; + + init_membuf (&outbuf, 512); + + rc = agent_pksign (ctrl, ctrl->server_local->keydesc, + &outbuf, cache_mode); + if (rc) + clear_outbuf (&outbuf); + else + rc = write_and_clear_outbuf (ctx, &outbuf); + if (rc) + log_error ("command pksign failed: %s\n", gpg_strerror (rc)); + xfree (ctrl->server_local->keydesc); + ctrl->server_local->keydesc = NULL; + return map_to_assuan_status (rc); +} + +/* PKDECRYPT + + Perform the actual decrypt operation. Input is not + sensitive to eavesdropping */ +static int +cmd_pkdecrypt (ASSUAN_CONTEXT ctx, char *line) +{ + int rc; + ctrl_t ctrl = assuan_get_pointer (ctx); + unsigned char *value; + size_t valuelen; + membuf_t outbuf; + + /* First inquire the data to decrypt */ + rc = assuan_inquire (ctx, "CIPHERTEXT", + &value, &valuelen, MAXLEN_CIPHERTEXT); + if (rc) + return rc; + + init_membuf (&outbuf, 512); + + rc = agent_pkdecrypt (ctrl, ctrl->server_local->keydesc, + value, valuelen, &outbuf); + xfree (value); + if (rc) + clear_outbuf (&outbuf); + else + rc = write_and_clear_outbuf (ctx, &outbuf); + if (rc) + log_error ("command pkdecrypt failed: %s\n", gpg_strerror (rc)); + xfree (ctrl->server_local->keydesc); + ctrl->server_local->keydesc = NULL; + return map_to_assuan_status (rc); +} + + +/* GENKEY + + Generate a new key, store the secret part and return the public + part. Here is an example transaction: + + C: GENKEY + S: INQUIRE KEYPARM + C: D (genkey (rsa (nbits 1024))) + C: END + S: D (public-key + S: D (rsa (n 326487324683264) (e 10001))) + S OK key created +*/ + +static int +cmd_genkey (ASSUAN_CONTEXT ctx, char *line) +{ + ctrl_t ctrl = assuan_get_pointer (ctx); + int rc; + unsigned char *value; + size_t valuelen; + membuf_t outbuf; + + /* First inquire the parameters */ + rc = assuan_inquire (ctx, "KEYPARAM", &value, &valuelen, MAXLEN_KEYPARAM); + if (rc) + return rc; + + init_membuf (&outbuf, 512); + + rc = agent_genkey (ctrl, (char*)value, valuelen, &outbuf); + xfree (value); + if (rc) + clear_outbuf (&outbuf); + else + rc = write_and_clear_outbuf (ctx, &outbuf); + if (rc) + log_error ("command genkey failed: %s\n", gpg_strerror (rc)); + return map_to_assuan_status (rc); +} + + + + +/* READKEY + + Return the public key for the given keygrip. */ +static int +cmd_readkey (assuan_context_t ctx, char *line) +{ + ctrl_t ctrl = assuan_get_pointer (ctx); + int rc; + unsigned char grip[20]; + gcry_sexp_t s_pkey = NULL; + + rc = parse_keygrip (ctx, line, grip); + if (rc) + return rc; /* Return immediately as this is already an Assuan error code.*/ + + rc = agent_public_key_from_file (ctrl, grip, &s_pkey); + if (!rc) + { + size_t len; + unsigned char *buf; + + len = gcry_sexp_sprint (s_pkey, GCRYSEXP_FMT_CANON, NULL, 0); + assert (len); + buf = xtrymalloc (len); + if (!buf) + rc = gpg_error_from_errno (errno); + else + { + len = gcry_sexp_sprint (s_pkey, GCRYSEXP_FMT_CANON, buf, len); + assert (len); + rc = assuan_send_data (ctx, buf, len); + rc = map_assuan_err (rc); + xfree (buf); + } + gcry_sexp_release (s_pkey); + } + + if (rc) + log_error ("command readkey failed: %s\n", gpg_strerror (rc)); + return map_to_assuan_status (rc); +} + + + + + + +/* GET_PASSPHRASE [ ] + + This function is usually used to ask for a passphrase to be used + for conventional encryption, but may also be used by programs which + need specal handling of passphrases. This command uses a syntax + which helps clients to use the agent with minimum effort. The + agent either returns with an error or with a OK followed by the hex + encoded passphrase. Note that the length of the strings is + implicitly limited by the maximum length of a command. +*/ + +static int +cmd_get_passphrase (ASSUAN_CONTEXT ctx, char *line) +{ + ctrl_t ctrl = assuan_get_pointer (ctx); + int rc; + const char *pw; + char *response; + char *cacheid = NULL, *desc = NULL, *prompt = NULL, *errtext = NULL; + char *p; + void *cache_marker; + + /* parse the stuff */ + for (p=line; *p == ' '; p++) + ; + cacheid = p; + p = strchr (cacheid, ' '); + if (p) + { + *p++ = 0; + while (*p == ' ') + p++; + errtext = p; + p = strchr (errtext, ' '); + if (p) + { + *p++ = 0; + while (*p == ' ') + p++; + prompt = p; + p = strchr (prompt, ' '); + if (p) + { + *p++ = 0; + while (*p == ' ') + p++; + desc = p; + p = strchr (desc, ' '); + if (p) + *p = 0; /* ignore garbage */ + } + } + } + if (!cacheid || !*cacheid || strlen (cacheid) > 50) + return set_error (Parameter_Error, "invalid length of cacheID"); + if (!desc) + return set_error (Parameter_Error, "no description given"); + + if (!strcmp (cacheid, "X")) + cacheid = NULL; + if (!strcmp (errtext, "X")) + errtext = NULL; + if (!strcmp (prompt, "X")) + prompt = NULL; + if (!strcmp (desc, "X")) + desc = NULL; + + /* Note: we store the hexified versions in the cache. */ + pw = cacheid ? agent_get_cache (cacheid, CACHE_MODE_NORMAL, &cache_marker) + : NULL; + if (pw) + { + assuan_begin_confidential (ctx); + rc = assuan_set_okay_line (ctx, pw); + agent_unlock_cache_entry (&cache_marker); + } + else + { + /* Note, that we only need to replace the + characters and + should leave the other escaping in place because the escaped + string is send verbatim to the pinentry which does the + unescaping (but not the + replacing) */ + if (errtext) + plus_to_blank (errtext); + if (prompt) + plus_to_blank (prompt); + if (desc) + plus_to_blank (desc); + + rc = agent_get_passphrase (ctrl, &response, desc, prompt, errtext); + if (!rc) + { + if (cacheid) + agent_put_cache (cacheid, CACHE_MODE_USER, response, 0); + assuan_begin_confidential (ctx); + rc = assuan_set_okay_line (ctx, response); + xfree (response); + } + } + + if (rc) + log_error ("command get_passphrase failed: %s\n", gpg_strerror (rc)); + return map_to_assuan_status (rc); +} + + +/* CLEAR_PASSPHRASE + + may be used to invalidate the cache entry for a passphrase. The + function returns with OK even when there is no cached passphrase. +*/ + +static int +cmd_clear_passphrase (ASSUAN_CONTEXT ctx, char *line) +{ + char *cacheid = NULL; + char *p; + + /* parse the stuff */ + for (p=line; *p == ' '; p++) + ; + cacheid = p; + p = strchr (cacheid, ' '); + if (p) + *p = 0; /* ignore garbage */ + if (!cacheid || !*cacheid || strlen (cacheid) > 50) + return set_error (Parameter_Error, "invalid length of cacheID"); + + agent_put_cache (cacheid, CACHE_MODE_USER, NULL, 0); + return 0; +} + + +/* GET_CONFIRMATION + + This command may be used to ask for a simple confirmation. + DESCRIPTION is displayed along with a Okay and Cancel button. This + command uses a syntax which helps clients to use the agent with + minimum effort. The agent either returns with an error or with a + OK. Note, that the length of DESCRIPTION is implicitly limited by + the maximum length of a command. DESCRIPTION should not contain + any spaces, those must be encoded either percent escaped or simply + as '+'. +*/ + +static int +cmd_get_confirmation (ASSUAN_CONTEXT ctx, char *line) +{ + ctrl_t ctrl = assuan_get_pointer (ctx); + int rc; + char *desc = NULL; + char *p; + + /* parse the stuff */ + for (p=line; *p == ' '; p++) + ; + desc = p; + p = strchr (desc, ' '); + if (p) + *p = 0; /* We ignore any garbage -may be later used for other args. */ + + if (!desc || !*desc) + return set_error (Parameter_Error, "no description given"); + + if (!strcmp (desc, "X")) + desc = NULL; + + /* Note, that we only need to replace the + characters and should + leave the other escaping in place because the escaped string is + send verbatim to the pinentry which does the unescaping (but not + the + replacing) */ + if (desc) + plus_to_blank (desc); + + rc = agent_get_confirmation (ctrl, desc, NULL, NULL); + if (rc) + log_error ("command get_confirmation failed: %s\n", gpg_strerror (rc)); + return map_to_assuan_status (rc); +} + + + +/* LEARN [--send] + + Learn something about the currently inserted smartcard. With + --send the new certificates are send back. */ +static int +cmd_learn (ASSUAN_CONTEXT ctx, char *line) +{ + ctrl_t ctrl = assuan_get_pointer (ctx); + int rc; + + rc = agent_handle_learn (ctrl, has_option (line, "--send")? ctx : NULL); + if (rc) + log_error ("command learn failed: %s\n", gpg_strerror (rc)); + return map_to_assuan_status (rc); +} + + + +/* PASSWD + + Change the passphrase/PID for the key identified by keygrip in LINE. */ +static int +cmd_passwd (ASSUAN_CONTEXT ctx, char *line) +{ + ctrl_t ctrl = assuan_get_pointer (ctx); + int rc; + unsigned char grip[20]; + gcry_sexp_t s_skey = NULL; + unsigned char *shadow_info = NULL; + + rc = parse_keygrip (ctx, line, grip); + if (rc) + return rc; /* we can't jump to leave because this is already an + Assuan error code. */ + + rc = agent_key_from_file (ctrl, ctrl->server_local->keydesc, + grip, &shadow_info, CACHE_MODE_IGNORE, &s_skey); + if (rc) + ; + else if (!s_skey) + { + log_error ("changing a smartcard PIN is not yet supported\n"); + rc = gpg_error (GPG_ERR_NOT_IMPLEMENTED); + } + else + rc = agent_protect_and_store (ctrl, s_skey); + + xfree (ctrl->server_local->keydesc); + ctrl->server_local->keydesc = NULL; + gcry_sexp_release (s_skey); + xfree (shadow_info); + if (rc) + log_error ("command passwd failed: %s\n", gpg_strerror (rc)); + return map_to_assuan_status (rc); +} + +/* PRESET_PASSPHRASE + + Set the cached passphrase/PIN for the key identified by the keygrip + to passwd for the given time, where -1 means infinite and 0 means + the default (currently only a timeout of -1 is allowed, which means + to never expire it). If passwd is not provided, ask for it via the + pinentry module. */ +static int +cmd_preset_passphrase (ASSUAN_CONTEXT ctx, char *line) +{ + int rc; + unsigned char grip[20]; + char *grip_clear = NULL; + char *passphrase = NULL; + int ttl; + size_t len; + + if (!opt.allow_preset_passphrase) + return gpg_error (GPG_ERR_NOT_SUPPORTED); + + rc = parse_keygrip (ctx, line, grip); + if (rc) + return rc; + + /* FIXME: parse_keygrip should return a tail pointer. */ + grip_clear = line; + while (*line && (*line != ' ' && *line != '\t')) + line++; + if (!*line) + return map_to_assuan_status (gpg_error (GPG_ERR_MISSING_VALUE)); + *line = '\0'; + line++; + while (*line && (*line == ' ' || *line == '\t')) + line++; + + /* Currently, only infinite timeouts are allowed. */ + ttl = -1; + if (line[0] != '-' || line[1] != '1') + return map_to_assuan_status (gpg_error (GPG_ERR_NOT_IMPLEMENTED)); + line++; + line++; + while (!(*line != ' ' && *line != '\t')) + line++; + + /* Syntax check the hexstring. */ + rc = parse_hexstring (ctx, line, &len); + if (rc) + return rc; + line[len] = '\0'; + + /* If there is a passphrase, use it. Currently, a passphrase is + required. */ + if (*line) + passphrase = line; + else + return map_to_assuan_status (gpg_error (GPG_ERR_NOT_IMPLEMENTED)); + + rc = agent_put_cache (grip_clear, CACHE_MODE_ANY, passphrase, ttl); + + if (rc) + log_error ("command preset_passwd failed: %s\n", gpg_strerror (rc)); + + return map_to_assuan_status (rc); +} + + +/* SCD + + This is a general quote command to redirect everything to the + SCDAEMON. */ +static int +cmd_scd (ASSUAN_CONTEXT ctx, char *line) +{ + ctrl_t ctrl = assuan_get_pointer (ctx); + int rc; + + rc = divert_generic_cmd (ctrl, line, ctx); + + return map_to_assuan_status (rc); +} + + + +/* UPDATESTARTUPTTY + + Set startup TTY and X DISPLAY variables to the values of this + session. This command is useful to pull future pinentries to + another screen. It is only required because there is no way in the + ssh-agent protocol to convey this information. */ +static int +cmd_updatestartuptty (assuan_context_t ctx, char *line) +{ + ctrl_t ctrl = assuan_get_pointer (ctx); + + xfree (opt.startup_display); opt.startup_display = NULL; + xfree (opt.startup_ttyname); opt.startup_ttyname = NULL; + xfree (opt.startup_ttytype); opt.startup_ttytype = NULL; + xfree (opt.startup_lc_ctype); opt.startup_lc_ctype = NULL; + xfree (opt.startup_lc_messages); opt.startup_lc_messages = NULL; + + if (ctrl->display) + opt.startup_display = xtrystrdup (ctrl->display); + if (ctrl->ttyname) + opt.startup_ttyname = xtrystrdup (ctrl->ttyname); + if (ctrl->ttytype) + opt.startup_ttytype = xtrystrdup (ctrl->ttytype); + if (ctrl->lc_ctype) + opt.startup_lc_ctype = xtrystrdup (ctrl->lc_ctype); + if (ctrl->lc_messages) + opt.startup_lc_messages = xtrystrdup (ctrl->lc_messages); + + return 0; +} + + + +static int +option_handler (ASSUAN_CONTEXT ctx, const char *key, const char *value) +{ + ctrl_t ctrl = assuan_get_pointer (ctx); + + if (!strcmp (key, "display")) + { + if (ctrl->display) + free (ctrl->display); + ctrl->display = strdup (value); + if (!ctrl->display) + return ASSUAN_Out_Of_Core; + } + else if (!strcmp (key, "ttyname")) + { + if (!opt.keep_tty) + { + if (ctrl->ttyname) + free (ctrl->ttyname); + ctrl->ttyname = strdup (value); + if (!ctrl->ttyname) + return ASSUAN_Out_Of_Core; + } + } + else if (!strcmp (key, "ttytype")) + { + if (!opt.keep_tty) + { + if (ctrl->ttytype) + free (ctrl->ttytype); + ctrl->ttytype = strdup (value); + if (!ctrl->ttytype) + return ASSUAN_Out_Of_Core; + } + } + else if (!strcmp (key, "lc-ctype")) + { + if (ctrl->lc_ctype) + free (ctrl->lc_ctype); + ctrl->lc_ctype = strdup (value); + if (!ctrl->lc_ctype) + return ASSUAN_Out_Of_Core; + } + else if (!strcmp (key, "lc-messages")) + { + if (ctrl->lc_messages) + free (ctrl->lc_messages); + ctrl->lc_messages = strdup (value); + if (!ctrl->lc_messages) + return ASSUAN_Out_Of_Core; + } + else if (!strcmp (key, "use-cache-for-signing")) + ctrl->server_local->use_cache_for_signing = *value? atoi (value) : 0; + else + return ASSUAN_Invalid_Option; + + return 0; +} + + +/* Tell the assuan library about our commands */ +static int +register_commands (ASSUAN_CONTEXT ctx) +{ + static struct { + const char *name; + int (*handler)(ASSUAN_CONTEXT, char *line); + } table[] = { + { "ISTRUSTED", cmd_istrusted }, + { "HAVEKEY", cmd_havekey }, + { "SIGKEY", cmd_sigkey }, + { "SETKEY", cmd_sigkey }, + { "SETKEYDESC", cmd_setkeydesc }, + { "SETHASH", cmd_sethash }, + { "PKSIGN", cmd_pksign }, + { "PKDECRYPT", cmd_pkdecrypt }, + { "GENKEY", cmd_genkey }, + { "READKEY", cmd_readkey }, + { "GET_PASSPHRASE", cmd_get_passphrase }, + { "PRESET_PASSPHRASE", cmd_preset_passphrase }, + { "CLEAR_PASSPHRASE", cmd_clear_passphrase }, + { "GET_CONFIRMATION", cmd_get_confirmation }, + { "LISTTRUSTED", cmd_listtrusted }, + { "MARKTRUSTED", cmd_marktrusted }, + { "LEARN", cmd_learn }, + { "PASSWD", cmd_passwd }, + { "INPUT", NULL }, + { "OUTPUT", NULL }, + { "SCD", cmd_scd }, + { "UPDATESTARTUPTTY", cmd_updatestartuptty }, + { NULL } + }; + int i, rc; + + for (i=0; table[i].name; i++) + { + rc = assuan_register_command (ctx, table[i].name, table[i].handler); + if (rc) + return rc; + } + assuan_register_reset_notify (ctx, reset_notify); + assuan_register_option_handler (ctx, option_handler); + return 0; +} + + +/* Startup the server. If LISTEN_FD and FD is given as -1, this is a simple + piper server, otherwise it is a regular server */ +void +start_command_handler (int listen_fd, int fd) +{ + int rc; + ASSUAN_CONTEXT ctx; + struct server_control_s ctrl; + + memset (&ctrl, 0, sizeof ctrl); + agent_init_default_ctrl (&ctrl); + + if (listen_fd == -1 && fd == -1) + { + int filedes[2]; + + filedes[0] = 0; + filedes[1] = 1; + rc = assuan_init_pipe_server (&ctx, filedes); + } + else if (listen_fd != -1) + { + rc = assuan_init_socket_server (&ctx, listen_fd); + } + else + { + rc = assuan_init_connected_socket_server (&ctx, fd); + ctrl.connection_fd = fd; + } + if (rc) + { + log_error ("failed to initialize the server: %s\n", + assuan_strerror(rc)); + agent_exit (2); + } + rc = register_commands (ctx); + if (rc) + { + log_error ("failed to register commands with Assuan: %s\n", + assuan_strerror(rc)); + agent_exit (2); + } + + assuan_set_pointer (ctx, &ctrl); + ctrl.server_local = xcalloc (1, sizeof *ctrl.server_local); + ctrl.server_local->assuan_ctx = ctx; + ctrl.server_local->message_fd = -1; + ctrl.server_local->use_cache_for_signing = 1; + ctrl.digest.raw_value = 0; + + if (DBG_ASSUAN) + assuan_set_log_stream (ctx, log_get_stream ()); + + for (;;) + { + rc = assuan_accept (ctx); + if (rc == -1) + { + break; + } + else if (rc) + { + log_info ("Assuan accept problem: %s\n", assuan_strerror (rc)); + break; + } + + rc = assuan_process (ctx); + if (rc) + { + log_info ("Assuan processing failed: %s\n", assuan_strerror (rc)); + continue; + } + } + + /* Reset the SCD if needed. */ + agent_reset_scd (&ctrl); + + /* Reset the pinentry (in case of popup messages). */ + agent_reset_query (&ctrl); + + assuan_deinit_server (ctx); + if (ctrl.display) + free (ctrl.display); + if (ctrl.ttyname) + free (ctrl.ttyname); + if (ctrl.ttytype) + free (ctrl.ttytype); + if (ctrl.lc_ctype) + free (ctrl.lc_ctype); + if (ctrl.lc_messages) + free (ctrl.lc_messages); + xfree (ctrl.server_local); +} + diff --git a/agent/divert-scd.c b/agent/divert-scd.c new file mode 100644 index 000000000..3dc7984e6 --- /dev/null +++ b/agent/divert-scd.c @@ -0,0 +1,418 @@ +/* divert-scd.c - divert operations to the scdaemon + * 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. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "agent.h" +#include "sexp-parse.h" +#include "i18n.h" + + +static int +ask_for_card (CTRL ctrl, const unsigned char *shadow_info, char **r_kid) +{ + int rc, i; + const unsigned char *s; + size_t n; + char *serialno; + int no_card = 0; + char *desc; + char *want_sn, *want_kid; + int want_sn_displen; + + *r_kid = NULL; + s = shadow_info; + if (*s != '(') + return gpg_error (GPG_ERR_INV_SEXP); + s++; + n = snext (&s); + if (!n) + return gpg_error (GPG_ERR_INV_SEXP); + want_sn = xtrymalloc (n*2+1); + if (!want_sn) + return out_of_core (); + for (i=0; i < n; i++) + sprintf (want_sn+2*i, "%02X", s[i]); + s += n; + /* We assume that a 20 byte serial number is a standard one which + seems to have the property to have a zero in the last nibble. We + don't display this '0' because it may confuse the user */ + want_sn_displen = strlen (want_sn); + if (want_sn_displen == 20 && want_sn[19] == '0') + want_sn_displen--; + + n = snext (&s); + if (!n) + return gpg_error (GPG_ERR_INV_SEXP); + want_kid = xtrymalloc (n+1); + if (!want_kid) + { + gpg_error_t tmperr = out_of_core (); + xfree (want_sn); + return tmperr; + } + memcpy (want_kid, s, n); + want_kid[n] = 0; + + for (;;) + { + rc = agent_card_serialno (ctrl, &serialno); + if (!rc) + { + log_debug ("detected card with S/N %s\n", serialno); + i = strcmp (serialno, want_sn); + xfree (serialno); + serialno = NULL; + if (!i) + { + xfree (want_sn); + *r_kid = want_kid; + return 0; /* yes, we have the correct card */ + } + } + else if (gpg_err_code (rc) == GPG_ERR_CARD_NOT_PRESENT) + { + log_debug ("no card present\n"); + rc = 0; + no_card = 1; + } + else + { + log_error ("error accesing card: %s\n", gpg_strerror (rc)); + } + + if (!rc) + { + if (asprintf (&desc, + "%s:%%0A%%0A" + " \"%.*s\"", + no_card? "Please insert the card with serial number" + : "Please remove the current card and " + "insert the one with serial number", + want_sn_displen, want_sn) < 0) + { + rc = out_of_core (); + } + else + { + rc = agent_get_confirmation (ctrl, desc, NULL, NULL); + free (desc); + } + } + if (rc) + { + xfree (want_sn); + xfree (want_kid); + return rc; + } + } +} + + +/* Put the DIGEST into an DER encoded container and return it in R_VAL. */ +static int +encode_md_for_card (const unsigned char *digest, size_t digestlen, int algo, + unsigned char **r_val, size_t *r_len) +{ + unsigned char *frame; + unsigned char asn[100]; + size_t asnlen; + + *r_val = NULL; + *r_len = 0; + + asnlen = DIM(asn); + if (gcry_md_algo_info (algo, GCRYCTL_GET_ASNOID, asn, &asnlen)) + { + log_error ("no object identifier for algo %d\n", algo); + return gpg_error (GPG_ERR_INTERNAL); + } + + frame = xtrymalloc (asnlen + digestlen); + if (!frame) + return out_of_core (); + memcpy (frame, asn, asnlen); + memcpy (frame+asnlen, digest, digestlen); + if (DBG_CRYPTO) + log_printhex ("encoded hash:", frame, asnlen+digestlen); + + *r_val = frame; + *r_len = asnlen+digestlen; + return 0; +} + + +/* Callback used to ask for the PIN which should be set into BUF. The + buf has been allocated by the caller and is of size MAXBUF which + includes the terminating null. The function should return an UTF-8 + string with the passphrase, the buffer may optionally be padded + with arbitrary characters. + + INFO gets displayed as part of a generic string. However if the + first character of INFO is a vertical bar all up to the next + verical bar are considered flags and only everything after the + second vertical bar gets displayed as the full prompt. + + Flags: + + 'N' = New PIN, this requests a second prompt to repeat the the + PIN. If the PIN is not correctly repeated it starts from + all over. + 'A' = The PIN is an Admin PIN, SO-PIN, PUK or alike. + + Example: + + "|AN|Please enter the new security officer's PIN" + + The text "Please ..." will get displayed and the flags 'A' and 'N' + are considered. + */ +static int +getpin_cb (void *opaque, const char *info, char *buf, size_t maxbuf) +{ + struct pin_entry_info_s *pi; + int rc; + ctrl_t ctrl = opaque; + const char *ends, *s; + int any_flags = 0; + int newpin = 0; + const char *again_text = NULL; + const char *prompt = "PIN"; + + if (buf && maxbuf < 2) + return gpg_error (GPG_ERR_INV_VALUE); + + /* Parse the flags. */ + if (info && *info =='|' && (ends=strchr (info+1, '|'))) + { + for (s=info+1; s < ends; s++) + { + if (*s == 'A') + prompt = _("Admin PIN"); + else if (*s == 'N') + newpin = 1; + } + info = ends+1; + any_flags = 1; + } + else if (info && *info == '|') + log_debug ("pin_cb called without proper PIN info hack\n"); + + /* If BUF has been passed as NULL, we are in keypad mode: The + callback opens the popup and immediatley returns. */ + if (!buf) + { + if (maxbuf == 0) /* Close the pinentry. */ + { + agent_popup_message_stop (ctrl); + rc = 0; + } + else if (maxbuf == 1) /* Open the pinentry. */ + { + rc = agent_popup_message_start (ctrl, info, NULL, NULL); + } + else + rc = gpg_error (GPG_ERR_INV_VALUE); + return rc; + } + + /* FIXME: keep PI and TRIES in OPAQUE. Frankly this is a whole + mess because we should call the card's verify function from the + pinentry check pin CB. */ + again: + pi = gcry_calloc_secure (1, sizeof (*pi) + maxbuf + 10); + if (!pi) + return gpg_error_from_errno (errno); + pi->max_length = maxbuf-1; + pi->min_digits = 0; /* we want a real passphrase */ + pi->max_digits = 8; + pi->max_tries = 3; + + if (any_flags) + { + rc = agent_askpin (ctrl, info, prompt, again_text, pi); + again_text = NULL; + if (!rc && newpin) + { + struct pin_entry_info_s *pi2; + pi2 = gcry_calloc_secure (1, sizeof (*pi) + maxbuf + 10); + if (!pi2) + { + rc = gpg_error_from_errno (errno); + xfree (pi); + return rc; + } + pi2->max_length = maxbuf-1; + pi2->min_digits = 0; + pi2->max_digits = 8; + pi2->max_tries = 1; + rc = agent_askpin (ctrl, _("Repeat this PIN"), prompt, NULL, pi2); + if (!rc && strcmp (pi->pin, pi2->pin)) + { + again_text = N_("PIN not correctly repeated; try again"); + xfree (pi2); + xfree (pi); + goto again; + } + xfree (pi2); + } + } + else + { + char *desc; + if ( asprintf (&desc, + _("Please enter the PIN%s%s%s to unlock the card"), + info? " (`":"", + info? info:"", + info? "')":"") < 0) + desc = NULL; + rc = agent_askpin (ctrl, desc?desc:info, prompt, NULL, pi); + free (desc); + } + + if (!rc) + { + strncpy (buf, pi->pin, maxbuf-1); + buf[maxbuf-1] = 0; + } + xfree (pi); + return rc; +} + + + + +int +divert_pksign (CTRL ctrl, + const unsigned char *digest, size_t digestlen, int algo, + const unsigned char *shadow_info, unsigned char **r_sig) +{ + int rc; + char *kid; + size_t siglen; + unsigned char *sigval; + unsigned char *data; + size_t ndata; + + rc = ask_for_card (ctrl, shadow_info, &kid); + if (rc) + return rc; + + rc = encode_md_for_card (digest, digestlen, algo, + &data, &ndata); + if (rc) + return rc; + + rc = agent_card_pksign (ctrl, kid, getpin_cb, ctrl, + data, ndata, &sigval, &siglen); + if (!rc) + *r_sig = sigval; + xfree (data); + xfree (kid); + + return rc; +} + + +/* Decrypt the the value given asn an S-expression in CIPHER using the + key identified by SHADOW_INFO and return the plaintext in an + allocated buffer in R_BUF. */ +int +divert_pkdecrypt (CTRL ctrl, + const unsigned char *cipher, + const unsigned char *shadow_info, + char **r_buf, size_t *r_len) +{ + int rc; + char *kid; + const unsigned char *s; + size_t n; + const unsigned char *ciphertext; + size_t ciphertextlen; + char *plaintext; + size_t plaintextlen; + + s = cipher; + if (*s != '(') + return gpg_error (GPG_ERR_INV_SEXP); + s++; + n = snext (&s); + if (!n) + return gpg_error (GPG_ERR_INV_SEXP); + if (!smatch (&s, n, "enc-val")) + return gpg_error (GPG_ERR_UNKNOWN_SEXP); + if (*s != '(') + return gpg_error (GPG_ERR_UNKNOWN_SEXP); + s++; + n = snext (&s); + if (!n) + return gpg_error (GPG_ERR_INV_SEXP); + if (!smatch (&s, n, "rsa")) + return gpg_error (GPG_ERR_UNSUPPORTED_ALGORITHM); + if (*s != '(') + return gpg_error (GPG_ERR_UNKNOWN_SEXP); + s++; + n = snext (&s); + if (!n) + return gpg_error (GPG_ERR_INV_SEXP); + if (!smatch (&s, n, "a")) + return gpg_error (GPG_ERR_UNKNOWN_SEXP); + n = snext (&s); + if (!n) + return gpg_error (GPG_ERR_UNKNOWN_SEXP); + ciphertext = s; + ciphertextlen = n; + + rc = ask_for_card (ctrl, shadow_info, &kid); + if (rc) + return rc; + + rc = agent_card_pkdecrypt (ctrl, kid, getpin_cb, ctrl, + ciphertext, ciphertextlen, + &plaintext, &plaintextlen); + if (!rc) + { + *r_buf = plaintext; + *r_len = plaintextlen; + } + xfree (kid); + return rc; +} + + +int +divert_generic_cmd (CTRL ctrl, const char *cmdline, void *assuan_context) +{ + return agent_card_scd (ctrl, cmdline, getpin_cb, ctrl, assuan_context); +} + + + + + diff --git a/agent/findkey.c b/agent/findkey.c new file mode 100644 index 000000000..3f793e5dd --- /dev/null +++ b/agent/findkey.c @@ -0,0 +1,732 @@ +/* findkey.c - locate the secret key + * 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "agent.h" + +/* Helper to pass data to the check callback of the unprotect function. */ +struct try_unprotect_arg_s { + const unsigned char *protected_key; + unsigned char *unprotected_key; +}; + + +/* Write an S-expression formatted key to our key storage. With FORCE + pased as true an existsing key with the given GRIP will get + overwritten. */ +int +agent_write_private_key (const unsigned char *grip, + const void *buffer, size_t length, int force) +{ + int i; + char *fname; + FILE *fp; + char hexgrip[40+4+1]; + int fd; + + for (i=0; i < 20; i++) + sprintf (hexgrip+2*i, "%02X", grip[i]); + strcpy (hexgrip+40, ".key"); + + fname = make_filename (opt.homedir, GNUPG_PRIVATE_KEYS_DIR, hexgrip, NULL); + + if (!force && !access (fname, F_OK)) + { + log_error ("secret key file `%s' already exists\n", fname); + xfree (fname); + return gpg_error (GPG_ERR_GENERAL); + } + + /* In FORCE mode we would like to create FNAME but only if it does + not already exist. We cannot make this guarantee just using + POSIX (GNU provides the "x" opentype for fopen, however, this is + not portable). Thus, we use the more flexible open function and + then use fdopen to obtain a stream. */ + fd = open (fname, force? (O_CREAT | O_TRUNC | O_WRONLY) + : (O_CREAT | O_EXCL | O_WRONLY), + S_IRUSR | S_IWUSR +#ifndef HAVE_W32_SYSTEM + | S_IRGRP +#endif + ); + if (fd < 0) + fp = NULL; + else + { + fp = fdopen (fd, "wb"); + if (!fp) + { + int save_e = errno; + close (fd); + errno = save_e; + } + } + + if (!fp) + { + gpg_error_t tmperr = gpg_error (gpg_err_code_from_errno (errno)); + log_error ("can't create `%s': %s\n", fname, strerror (errno)); + xfree (fname); + return tmperr; + } + + if (fwrite (buffer, length, 1, fp) != 1) + { + gpg_error_t tmperr = gpg_error (gpg_err_code_from_errno (errno)); + log_error ("error writing `%s': %s\n", fname, strerror (errno)); + fclose (fp); + remove (fname); + xfree (fname); + return tmperr; + } + if ( fclose (fp) ) + { + gpg_error_t tmperr = gpg_error (gpg_err_code_from_errno (errno)); + log_error ("error closing `%s': %s\n", fname, strerror (errno)); + remove (fname); + xfree (fname); + return tmperr; + } + + xfree (fname); + return 0; +} + + +/* Callback function to try the unprotection from the passpharse query + code. */ +static int +try_unprotect_cb (struct pin_entry_info_s *pi) +{ + struct try_unprotect_arg_s *arg = pi->check_cb_arg; + size_t dummy; + + assert (!arg->unprotected_key); + return agent_unprotect (arg->protected_key, pi->pin, + &arg->unprotected_key, &dummy); +} + + +/* Modify a Key description, replacing certain special format + characters. List of currently supported replacements: + + %% - Replaced by a single % + %c - Replaced by the content of COMMENT. + + The functions returns 0 on success or an error code. On success a + newly allocated string is stored at the address of RESULT. + */ +static gpg_error_t +modify_description (const char *in, const char *comment, char **result) +{ + size_t comment_length; + size_t in_len; + size_t out_len; + char *out; + size_t i; + int special, pass; + + comment_length = strlen (comment); + in_len = strlen (in); + + /* First pass calculates the length, second pass does the actual + copying. */ + out = NULL; + out_len = 0; + for (pass=0; pass < 2; pass++) + { + special = 0; + for (i = 0; i < in_len; i++) + { + if (special) + { + special = 0; + switch (in[i]) + { + case '%': + if (out) + *out++ = '%'; + else + out_len++; + break; + + case 'c': /* Comment. */ + if (out) + { + memcpy (out, comment, comment_length); + out += comment_length; + } + else + out_len += comment_length; + break; + + default: /* Invalid special sequences are kept as they are. */ + if (out) + { + *out++ = '%'; + *out++ = in[i]; + } + else + out_len+=2; + break; + } + } + else if (in[i] == '%') + special = 1; + else + { + if (out) + *out++ = in[i]; + else + out_len++; + } + } + + if (!pass) + { + *result = out = xtrymalloc (out_len + 1); + if (!out) + return gpg_error_from_errno (errno); + } + } + + *out = 0; + assert (*result + out_len == out); + return 0; +} + + + +/* Unprotect the canconical encoded S-expression key in KEYBUF. GRIP + should be the hex encoded keygrip of that key to be used with the + caching mechanism. DESC_TEXT may be set to override the default + description used for the pinentry. */ +static int +unprotect (ctrl_t ctrl, const char *desc_text, + unsigned char **keybuf, const unsigned char *grip, + cache_mode_t cache_mode) +{ + struct pin_entry_info_s *pi; + struct try_unprotect_arg_s arg; + int rc, i; + unsigned char *result; + size_t resultlen; + char hexgrip[40+1]; + + for (i=0; i < 20; i++) + sprintf (hexgrip+2*i, "%02X", grip[i]); + hexgrip[40] = 0; + + /* First try to get it from the cache - if there is none or we can't + unprotect it, we fall back to ask the user */ + if (cache_mode != CACHE_MODE_IGNORE) + { + void *cache_marker; + const char *pw; + + pw = agent_get_cache (hexgrip, cache_mode, &cache_marker); + if (pw) + { + rc = agent_unprotect (*keybuf, pw, &result, &resultlen); + agent_unlock_cache_entry (&cache_marker); + if (!rc) + { + xfree (*keybuf); + *keybuf = result; + return 0; + } + rc = 0; + } + } + + pi = gcry_calloc_secure (1, sizeof (*pi) + 100); + if (!pi) + return gpg_error_from_errno (errno); + pi->max_length = 100; + pi->min_digits = 0; /* we want a real passphrase */ + pi->max_digits = 8; + pi->max_tries = 3; + pi->check_cb = try_unprotect_cb; + arg.protected_key = *keybuf; + arg.unprotected_key = NULL; + pi->check_cb_arg = &arg; + + rc = agent_askpin (ctrl, desc_text, NULL, NULL, pi); + if (!rc) + { + assert (arg.unprotected_key); + agent_put_cache (hexgrip, cache_mode, pi->pin, 0); + xfree (*keybuf); + *keybuf = arg.unprotected_key; + } + xfree (pi); + return rc; +} + + +/* Read the key identified by GRIP from the private key directory and + return it as an gcrypt S-expression object in RESULT. On failure + returns an error code and stores NULL at RESULT. */ +static gpg_error_t +read_key_file (const unsigned char *grip, gcry_sexp_t *result) +{ + int i, rc; + char *fname; + FILE *fp; + struct stat st; + unsigned char *buf; + size_t buflen, erroff; + gcry_sexp_t s_skey; + char hexgrip[40+4+1]; + + *result = NULL; + + for (i=0; i < 20; i++) + sprintf (hexgrip+2*i, "%02X", grip[i]); + strcpy (hexgrip+40, ".key"); + + fname = make_filename (opt.homedir, GNUPG_PRIVATE_KEYS_DIR, hexgrip, NULL); + fp = fopen (fname, "rb"); + if (!fp) + { + rc = gpg_error_from_errno (errno); + log_error ("can't open `%s': %s\n", fname, strerror (errno)); + xfree (fname); + return rc; + } + + if (fstat (fileno(fp), &st)) + { + rc = gpg_error_from_errno (errno); + log_error ("can't stat `%s': %s\n", fname, strerror (errno)); + xfree (fname); + fclose (fp); + return rc; + } + + buflen = st.st_size; + buf = xtrymalloc (buflen+1); + if (!buf || fread (buf, buflen, 1, fp) != 1) + { + rc = gpg_error_from_errno (errno); + log_error ("error reading `%s': %s\n", fname, strerror (errno)); + xfree (fname); + fclose (fp); + xfree (buf); + return rc; + } + + /* Convert the file into a gcrypt S-expression object. */ + rc = gcry_sexp_sscan (&s_skey, &erroff, (char*)buf, buflen); + xfree (fname); + fclose (fp); + xfree (buf); + if (rc) + { + log_error ("failed to build S-Exp (off=%u): %s\n", + (unsigned int)erroff, gpg_strerror (rc)); + return rc; + } + *result = s_skey; + return 0; +} + + +/* Return the secret key as an S-Exp in RESULT after locating it using + the grip. Returns NULL in RESULT if the operation should be + diverted to a token; SHADOW_INFO will point then to an allocated + S-Expression with the shadow_info part from the file. CACHE_MODE + defines now the cache shall be used. DESC_TEXT may be set to + present a custom description for the pinentry. */ +gpg_error_t +agent_key_from_file (ctrl_t ctrl, const char *desc_text, + const unsigned char *grip, unsigned char **shadow_info, + cache_mode_t cache_mode, gcry_sexp_t *result) +{ + int rc; + unsigned char *buf; + size_t len, buflen, erroff; + gcry_sexp_t s_skey; + int got_shadow_info = 0; + + *result = NULL; + if (shadow_info) + *shadow_info = NULL; + + rc = read_key_file (grip, &s_skey); + if (rc) + return rc; + + /* For use with the protection functions we also need the key as an + canonical encoded S-expression in abuffer. Create this buffer + now. */ + len = gcry_sexp_sprint (s_skey, GCRYSEXP_FMT_CANON, NULL, 0); + assert (len); + buf = xtrymalloc (len); + if (!buf) + { + rc = gpg_error_from_errno (errno); + gcry_sexp_release (s_skey); + return rc; + } + len = gcry_sexp_sprint (s_skey, GCRYSEXP_FMT_CANON, buf, len); + assert (len); + + + switch (agent_private_key_type (buf)) + { + case PRIVATE_KEY_CLEAR: + break; /* no unprotection needed */ + case PRIVATE_KEY_PROTECTED: + { + gcry_sexp_t comment_sexp; + size_t comment_length; + char *desc_text_final; + const char *comment = NULL; + + /* Note, that we will take the comment as a C string for + display purposes; i.e. all stuff beyond a Nul character is + ignored. */ + comment_sexp = gcry_sexp_find_token (s_skey, "comment", 0); + if (comment_sexp) + comment = gcry_sexp_nth_data (comment_sexp, 1, &comment_length); + if (!comment) + { + comment = ""; + comment_length = 0; + } + + desc_text_final = NULL; + if (desc_text) + { + if (comment[comment_length]) + { + /* Not a C-string; create one. We might here allocate + more than actually displayed but well, that + shouldn't be a problem. */ + char *tmp = xtrymalloc (comment_length+1); + if (!tmp) + rc = gpg_error_from_errno (errno); + else + { + memcpy (tmp, comment, comment_length); + tmp[comment_length] = 0; + rc = modify_description (desc_text, tmp, &desc_text_final); + xfree (tmp); + } + } + else + rc = modify_description (desc_text, comment, &desc_text_final); + } + + if (!rc) + { + rc = unprotect (ctrl, desc_text_final, &buf, grip, cache_mode); + if (rc) + log_error ("failed to unprotect the secret key: %s\n", + gpg_strerror (rc)); + } + + gcry_sexp_release (comment_sexp); + xfree (desc_text_final); + } + break; + case PRIVATE_KEY_SHADOWED: + if (shadow_info) + { + const unsigned char *s; + size_t n; + + rc = agent_get_shadow_info (buf, &s); + if (!rc) + { + n = gcry_sexp_canon_len (s, 0, NULL,NULL); + assert (n); + *shadow_info = xtrymalloc (n); + if (!*shadow_info) + rc = out_of_core (); + else + { + memcpy (*shadow_info, s, n); + rc = 0; + got_shadow_info = 1; + } + } + if (rc) + log_error ("get_shadow_info failed: %s\n", gpg_strerror (rc)); + } + else + rc = gpg_error (GPG_ERR_UNUSABLE_SECKEY); + break; + default: + log_error ("invalid private key format\n"); + rc = gpg_error (GPG_ERR_BAD_SECKEY); + break; + } + gcry_sexp_release (s_skey); + s_skey = NULL; + if (rc || got_shadow_info) + { + xfree (buf); + return rc; + } + + buflen = gcry_sexp_canon_len (buf, 0, NULL, NULL); + rc = gcry_sexp_sscan (&s_skey, &erroff, (char*)buf, buflen); + wipememory (buf, buflen); + xfree (buf); + if (rc) + { + log_error ("failed to build S-Exp (off=%u): %s\n", + (unsigned int)erroff, gpg_strerror (rc)); + return rc; + } + + *result = s_skey; + return 0; +} + + + +/* Return the public key for the keygrip GRIP. The result is stored + at RESULT. This function extracts the public key from the private + key database. On failure an error code is returned and NULL stored + at RESULT. */ +gpg_error_t +agent_public_key_from_file (ctrl_t ctrl, + const unsigned char *grip, + gcry_sexp_t *result) +{ + int i, idx, rc; + gcry_sexp_t s_skey; + const char *algoname; + gcry_sexp_t uri_sexp, comment_sexp; + const char *uri, *comment; + size_t uri_length, comment_length; + char *format, *p; + void *args[4+2+2+1]; /* Size is max. # of elements + 2 for uri + 2 + for comment + end-of-list. */ + int argidx; + gcry_sexp_t list, l2; + const char *name; + const char *s; + size_t n; + const char *elems; + gcry_mpi_t *array; + + *result = NULL; + + rc = read_key_file (grip, &s_skey); + if (rc) + return rc; + + list = gcry_sexp_find_token (s_skey, "shadowed-private-key", 0 ); + if (!list) + list = gcry_sexp_find_token (s_skey, "protected-private-key", 0 ); + if (!list) + list = gcry_sexp_find_token (s_skey, "private-key", 0 ); + if (!list) + { + log_error ("invalid private key format\n"); + gcry_sexp_release (s_skey); + return gpg_error (GPG_ERR_BAD_SECKEY); + } + + l2 = gcry_sexp_cadr (list); + gcry_sexp_release (list); + list = l2; + name = gcry_sexp_nth_data (list, 0, &n); + if (n==3 && !memcmp (name, "rsa", 3)) + { + algoname = "rsa"; + elems = "ne"; + } + else if (n==3 && !memcmp (name, "dsa", 3)) + { + algoname = "dsa"; + elems = "pqgy"; + } + else if (n==3 && !memcmp (name, "elg", 3)) + { + algoname = "elg"; + elems = "pgy"; + } + else + { + log_error ("unknown private key algorithm\n"); + gcry_sexp_release (list); + gcry_sexp_release (s_skey); + return gpg_error (GPG_ERR_BAD_SECKEY); + } + + /* Allocate an array for the parameters and copy them out of the + secret key. FIXME: We should have a generic copy function. */ + array = xtrycalloc (strlen(elems) + 1, sizeof *array); + if (!array) + { + rc = gpg_error_from_errno (errno); + gcry_sexp_release (list); + gcry_sexp_release (s_skey); + return rc; + } + + for (idx=0, s=elems; *s; s++, idx++ ) + { + l2 = gcry_sexp_find_token (list, s, 1); + if (!l2) + { + /* Required parameter not found. */ + for (i=0; i +#include +#include +#include +#include +#include +#include + +#include "agent.h" +#include "i18n.h" + +static int +store_key (gcry_sexp_t private, const char *passphrase, int force) +{ + int rc; + unsigned char *buf; + size_t len; + unsigned char grip[20]; + + if ( !gcry_pk_get_keygrip (private, grip) ) + { + log_error ("can't calculate keygrip\n"); + return gpg_error (GPG_ERR_GENERAL); + } + + len = gcry_sexp_sprint (private, GCRYSEXP_FMT_CANON, NULL, 0); + assert (len); + buf = gcry_malloc_secure (len); + if (!buf) + return out_of_core (); + len = gcry_sexp_sprint (private, GCRYSEXP_FMT_CANON, buf, len); + assert (len); + + if (passphrase) + { + unsigned char *p; + + rc = agent_protect (buf, passphrase, &p, &len); + if (rc) + { + xfree (buf); + return rc; + } + xfree (buf); + buf = p; + } + + rc = agent_write_private_key (grip, buf, len, force); + xfree (buf); + return rc; +} + +/* Callback function to compare the first entered PIN with the one + currently being entered. */ +static int +reenter_compare_cb (struct pin_entry_info_s *pi) +{ + const char *pin1 = pi->check_cb_arg; + + if (!strcmp (pin1, pi->pin)) + return 0; /* okay */ + return -1; +} + + + +/* Generate a new keypair according to the parameters given in + KEYPARAM */ +int +agent_genkey (CTRL ctrl, const char *keyparam, size_t keyparamlen, + membuf_t *outbuf) +{ + gcry_sexp_t s_keyparam, s_key, s_private, s_public; + struct pin_entry_info_s *pi, *pi2; + int rc; + size_t len; + char *buf; + + rc = gcry_sexp_sscan (&s_keyparam, NULL, keyparam, keyparamlen); + if (rc) + { + log_error ("failed to convert keyparam: %s\n", gpg_strerror (rc)); + return gpg_error (GPG_ERR_INV_DATA); + } + + /* Get the passphrase now, cause key generation may take a while. */ + { + const char *text1 = _("Please enter the passphrase to%0A" + "to protect your new key"); + const char *text2 = _("Please re-enter this passphrase"); + const char *initial_errtext = NULL; + + pi = gcry_calloc_secure (2, sizeof (*pi) + 100); + pi2 = pi + (sizeof *pi + 100); + pi->max_length = 100; + pi->max_tries = 3; + pi2->max_length = 100; + pi2->max_tries = 3; + pi2->check_cb = reenter_compare_cb; + pi2->check_cb_arg = pi->pin; + + next_try: + rc = agent_askpin (ctrl, text1, NULL, initial_errtext, pi); + initial_errtext = NULL; + if (!rc) + { + rc = agent_askpin (ctrl, text2, NULL, NULL, pi2); + if (rc == -1) + { /* The re-entered one did not match and the user did not + hit cancel. */ + initial_errtext = _("does not match - try again"); + goto next_try; + } + } + if (rc) + return rc; + if (!*pi->pin) + { + xfree (pi); + pi = NULL; /* User does not want a passphrase. */ + } + } + + rc = gcry_pk_genkey (&s_key, s_keyparam ); + gcry_sexp_release (s_keyparam); + if (rc) + { + log_error ("key generation failed: %s\n", gpg_strerror (rc)); + xfree (pi); + return rc; + } + + /* break out the parts */ + s_private = gcry_sexp_find_token (s_key, "private-key", 0); + if (!s_private) + { + log_error ("key generation failed: invalid return value\n"); + gcry_sexp_release (s_key); + xfree (pi); + return gpg_error (GPG_ERR_INV_DATA); + } + s_public = gcry_sexp_find_token (s_key, "public-key", 0); + if (!s_public) + { + log_error ("key generation failed: invalid return value\n"); + gcry_sexp_release (s_private); + gcry_sexp_release (s_key); + xfree (pi); + return gpg_error (GPG_ERR_INV_DATA); + } + gcry_sexp_release (s_key); s_key = NULL; + + /* store the secret key */ + if (DBG_CRYPTO) + log_debug ("storing private key\n"); + rc = store_key (s_private, pi? pi->pin:NULL, 0); + xfree (pi); pi = NULL; + gcry_sexp_release (s_private); + if (rc) + { + gcry_sexp_release (s_public); + return rc; + } + + /* return the public key */ + if (DBG_CRYPTO) + log_debug ("returning public key\n"); + len = gcry_sexp_sprint (s_public, GCRYSEXP_FMT_CANON, NULL, 0); + assert (len); + buf = xtrymalloc (len); + if (!buf) + { + gpg_error_t tmperr = out_of_core (); + gcry_sexp_release (s_private); + gcry_sexp_release (s_public); + return tmperr; + } + len = gcry_sexp_sprint (s_public, GCRYSEXP_FMT_CANON, buf, len); + assert (len); + put_membuf (outbuf, buf, len); + gcry_sexp_release (s_public); + xfree (buf); + + return 0; +} + + + +/* Apply a new passpahrse to the key S_SKEY and store it. */ +int +agent_protect_and_store (CTRL ctrl, gcry_sexp_t s_skey) +{ + struct pin_entry_info_s *pi, *pi2; + int rc; + + { + const char *text1 = _("Please enter the new passphrase"); + const char *text2 = _("Please re-enter this passphrase"); + const char *initial_errtext = NULL; + + pi = gcry_calloc_secure (2, sizeof (*pi) + 100); + pi2 = pi + (sizeof *pi + 100); + pi->max_length = 100; + pi->max_tries = 3; + pi2->max_length = 100; + pi2->max_tries = 3; + pi2->check_cb = reenter_compare_cb; + pi2->check_cb_arg = pi->pin; + + next_try: + rc = agent_askpin (ctrl, text1, NULL, initial_errtext, pi); + if (!rc) + { + rc = agent_askpin (ctrl, text2, NULL, NULL, pi2); + if (rc == -1) + { /* The re-entered one did not match and the user did not + hit cancel. */ + initial_errtext = _("does not match - try again"); + goto next_try; + } + } + if (rc) + return rc; + if (!*pi->pin) + { + xfree (pi); + pi = NULL; /* User does not want a passphrase. */ + } + } + + rc = store_key (s_skey, pi? pi->pin:NULL, 1); + xfree (pi); + return 0; +} diff --git a/agent/gpg-agent.c b/agent/gpg-agent.c new file mode 100644 index 000000000..24e0b588b --- /dev/null +++ b/agent/gpg-agent.c @@ -0,0 +1,1686 @@ +/* gpg-agent.c - The GnuPG Agent + * Copyright (C) 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 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef HAVE_W32_SYSTEM +#include +#include +#endif /*HAVE_W32_SYSTEM*/ +#include +#include +#include + +#define JNLIB_NEED_LOG_LOGV +#include "agent.h" +#include /* Malloc hooks */ + +#include "i18n.h" +#include "sysutils.h" +#ifdef HAVE_W32_SYSTEM +#include "../jnlib/w32-afunix.h" +#endif +#include "setenv.h" + + +enum cmd_and_opt_values +{ aNull = 0, + oCsh = 'c', + oQuiet = 'q', + oSh = 's', + oVerbose = 'v', + + oNoVerbose = 500, + aGPGConfList, + oOptions, + oDebug, + oDebugAll, + oDebugLevel, + oDebugWait, + oNoGreeting, + oNoOptions, + oHomedir, + oNoDetach, + oNoGrab, + oLogFile, + oServer, + oDaemon, + oBatch, + + oPinentryProgram, + oDisplay, + oTTYname, + oTTYtype, + oLCctype, + oLCmessages, + oScdaemonProgram, + oDefCacheTTL, + oDefCacheTTLSSH, + oMaxCacheTTL, + oMaxCacheTTLSSH, + oUseStandardSocket, + oNoUseStandardSocket, + + oIgnoreCacheForSigning, + oAllowMarkTrusted, + oAllowPresetPassphrase, + oKeepTTY, + oKeepDISPLAY, + oSSHSupport, + oDisableScdaemon, + oWriteEnvFile +}; + + + +static ARGPARSE_OPTS opts[] = { + + { aGPGConfList, "gpgconf-list", 256, "@" }, + + { 301, NULL, 0, N_("@Options:\n ") }, + + { oServer, "server", 0, N_("run in server mode (foreground)") }, + { oDaemon, "daemon", 0, N_("run in daemon mode (background)") }, + { oVerbose, "verbose", 0, N_("verbose") }, + { oQuiet, "quiet", 0, N_("be somewhat more quiet") }, + { oSh, "sh", 0, N_("sh-style command output") }, + { oCsh, "csh", 0, N_("csh-style command output") }, + { oOptions, "options" , 2, N_("|FILE|read options from FILE")}, + { oDebug, "debug" ,4|16, "@"}, + { oDebugAll, "debug-all" ,0, "@"}, + { oDebugLevel, "debug-level" ,2, "@"}, + { oDebugWait,"debug-wait",1, "@"}, + { oNoDetach, "no-detach" ,0, N_("do not detach from the console")}, + { oNoGrab, "no-grab" ,0, N_("do not grab keyboard and mouse")}, + { oLogFile, "log-file" ,2, N_("use a log file for the server")}, + { oUseStandardSocket, "use-standard-socket", 0, + N_("use a standard location for the socket")}, + { oNoUseStandardSocket, "no-use-standard-socket", 0, "@"}, + + { oPinentryProgram, "pinentry-program", 2 , + N_("|PGM|use PGM as the PIN-Entry program") }, + { oScdaemonProgram, "scdaemon-program", 2 , + N_("|PGM|use PGM as the SCdaemon program") }, + { oDisableScdaemon, "disable-scdaemon", 0, N_("do not use the SCdaemon") }, + + { oDisplay, "display", 2, "@" }, + { oTTYname, "ttyname", 2, "@" }, + { oTTYtype, "ttytype", 2, "@" }, + { oLCctype, "lc-ctype", 2, "@" }, + { oLCmessages, "lc-messages", 2, "@" }, + { oKeepTTY, "keep-tty", 0, N_("ignore requests to change the TTY")}, + { oKeepDISPLAY, "keep-display", + 0, N_("ignore requests to change the X display")}, + + { oDefCacheTTL, "default-cache-ttl", 4, + N_("|N|expire cached PINs after N seconds")}, + { oDefCacheTTLSSH, "default-cache-ttl-ssh", 4, "@" }, + { oMaxCacheTTL, "max-cache-ttl", 4, "@" }, + { oMaxCacheTTLSSH, "max-cache-ttl-ssh", 4, "@" }, + { oIgnoreCacheForSigning, "ignore-cache-for-signing", 0, + N_("do not use the PIN cache when signing")}, + { oAllowMarkTrusted, "allow-mark-trusted", 0, + N_("allow clients to mark keys as \"trusted\"")}, + { oAllowPresetPassphrase, "allow-preset-passphrase", 0, + N_("allow presetting passphrase")}, + { oSSHSupport, "enable-ssh-support", 0, N_("enable ssh-agent emulation") }, + { oWriteEnvFile, "write-env-file", 2|8, + N_("|FILE|write environment settings also to FILE")}, + {0} +}; + + +#define DEFAULT_CACHE_TTL (10*60) /* 10 minutes */ +#define DEFAULT_CACHE_TTL_SSH (30*60) /* 30 minutes */ +#define MAX_CACHE_TTL (120*60) /* 2 hours */ + + +/* flag to indicate that a shutdown was requested */ +static int shutdown_pending; + + +/* It is possible that we are currently running under setuid permissions */ +static int maybe_setuid = 1; + +/* Name of the communication socket used for native gpg-agent requests. */ +static char *socket_name; + +/* Name of the communication socket used for ssh-agent-emulation. */ +static char *socket_name_ssh; + +/* Default values for options passed to the pinentry. */ +static char *default_display; +static char *default_ttyname; +static char *default_ttytype; +static char *default_lc_ctype; +static char *default_lc_messages; + +/* Name of a config file, which will be reread on a HUP if it is not NULL. */ +static char *config_filename; + +/* Helper to implement --debug-level */ +static const char *debug_level; + +/* Keep track of the current log file so that we can avoid updating + the log file after a SIGHUP if it didn't changed. Malloced. */ +static char *current_logfile; + +/* The handle_tick() function may test whether a parent is still + running. We record the PID of the parent here or -1 if it should be + watched. */ +static pid_t parent_pid = (pid_t)(-1); + + +/* + Local prototypes. + */ + +static char *create_socket_name (int use_standard_socket, + char *standard_name, char *template); +static int create_server_socket (int is_standard_name, const char *name); +static void create_directories (void); + +static void handle_connections (int listen_fd, int listen_fd_ssh); +static int check_for_running_agent (int); + +/* Pth wrapper function definitions. */ +GCRY_THREAD_OPTION_PTH_IMPL; + + + + +/* + Functions. + */ + + +static const char * +my_strusage (int level) +{ + const char *p; + switch (level) + { + case 11: p = "gpg-agent (GnuPG)"; + break; + case 13: p = VERSION; break; + case 17: p = PRINTABLE_OS_NAME; break; + case 19: p = _("Please report bugs to <" PACKAGE_BUGREPORT ">.\n"); + break; + case 1: + case 40: p = _("Usage: gpg-agent [options] (-h for help)"); + break; + case 41: p = _("Syntax: gpg-agent [options] [command [args]]\n" + "Secret key management for GnuPG\n"); + break; + + default: p = NULL; + } + return p; +} + + + +static void +i18n_init (void) +{ +#ifdef USE_SIMPLE_GETTEXT + set_gettext_file( PACKAGE_GT ); +#else +#ifdef ENABLE_NLS + setlocale (LC_ALL, ""); + bindtextdomain (PACKAGE_GT, LOCALEDIR); + textdomain (PACKAGE_GT); +#endif +#endif +} + + + +/* Used by gcry for logging */ +static void +my_gcry_logger (void *dummy, int level, const char *fmt, va_list arg_ptr) +{ + /* translate the log levels */ + switch (level) + { + case GCRY_LOG_CONT: level = JNLIB_LOG_CONT; break; + case GCRY_LOG_INFO: level = JNLIB_LOG_INFO; break; + case GCRY_LOG_WARN: level = JNLIB_LOG_WARN; break; + case GCRY_LOG_ERROR:level = JNLIB_LOG_ERROR; break; + case GCRY_LOG_FATAL:level = JNLIB_LOG_FATAL; break; + case GCRY_LOG_BUG: level = JNLIB_LOG_BUG; break; + case GCRY_LOG_DEBUG:level = JNLIB_LOG_DEBUG; break; + default: level = JNLIB_LOG_ERROR; break; + } + log_logv (level, fmt, arg_ptr); +} + + +/* Setup the debugging. With the global variable DEBUG_LEVEL set to NULL + only the active debug flags are propagated to the subsystems. With + DEBUG_LEVEL set, a specific set of debug flags is set; thus overriding + all flags already set. Note that we don't fail here, because it is + important to keep gpg-agent running even after re-reading the + options due to a SIGHUP. */ +static void +set_debug (void) +{ + if (!debug_level) + ; + else if (!strcmp (debug_level, "none")) + opt.debug = 0; + else if (!strcmp (debug_level, "basic")) + opt.debug = DBG_ASSUAN_VALUE; + else if (!strcmp (debug_level, "advanced")) + opt.debug = DBG_ASSUAN_VALUE|DBG_COMMAND_VALUE; + else if (!strcmp (debug_level, "expert")) + opt.debug = (DBG_ASSUAN_VALUE|DBG_COMMAND_VALUE + |DBG_CACHE_VALUE); + else if (!strcmp (debug_level, "guru")) + opt.debug = ~0; + else + { + log_error (_("invalid debug-level `%s' given\n"), debug_level); + opt.debug = 0; /* Reset debugging, so that prior debug + statements won't have an undesired effect. */ + } + + if (opt.debug && !opt.verbose) + opt.verbose = 1; + if (opt.debug && opt.quiet) + opt.quiet = 0; + + if (opt.debug & DBG_MPI_VALUE) + gcry_control (GCRYCTL_SET_DEBUG_FLAGS, 2); + if (opt.debug & DBG_CRYPTO_VALUE ) + gcry_control (GCRYCTL_SET_DEBUG_FLAGS, 1); + gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose); +} + + +/* Helper for cleanup to remove one socket with NAME. */ +static void +remove_socket (char *name) +{ + if (name && *name) + { + char *p; + + remove (name); + p = strrchr (name, '/'); + if (p) + { + *p = 0; + rmdir (name); + *p = '/'; + } + *name = 0; + } +} + +static void +cleanup (void) +{ + remove_socket (socket_name); + remove_socket (socket_name_ssh); +} + + + +/* Handle options which are allowed to be reset after program start. + Return true when the current option in PARGS could be handled and + false if not. As a special feature, passing a value of NULL for + PARGS, resets the options to the default. REREAD should be set + true if it is not the initial option parsing. */ +static int +parse_rereadable_options (ARGPARSE_ARGS *pargs, int reread) +{ + if (!pargs) + { /* reset mode */ + opt.quiet = 0; + opt.verbose = 0; + opt.debug = 0; + opt.no_grab = 0; + opt.pinentry_program = NULL; + opt.scdaemon_program = NULL; + opt.def_cache_ttl = DEFAULT_CACHE_TTL; + opt.def_cache_ttl_ssh = DEFAULT_CACHE_TTL_SSH; + opt.max_cache_ttl = MAX_CACHE_TTL; + opt.max_cache_ttl_ssh = MAX_CACHE_TTL; + opt.ignore_cache_for_signing = 0; + opt.allow_mark_trusted = 0; + opt.disable_scdaemon = 0; + return 1; + } + + switch (pargs->r_opt) + { + case oQuiet: opt.quiet = 1; break; + case oVerbose: opt.verbose++; break; + + case oDebug: opt.debug |= pargs->r.ret_ulong; break; + case oDebugAll: opt.debug = ~0; break; + case oDebugLevel: debug_level = pargs->r.ret_str; break; + + case oLogFile: + if (!reread) + return 0; /* not handeld */ + if (!current_logfile || !pargs->r.ret_str + || strcmp (current_logfile, pargs->r.ret_str)) + { + log_set_file (pargs->r.ret_str); + xfree (current_logfile); + current_logfile = xtrystrdup (pargs->r.ret_str); + } + break; + + case oNoGrab: opt.no_grab = 1; break; + + case oPinentryProgram: opt.pinentry_program = pargs->r.ret_str; break; + case oScdaemonProgram: opt.scdaemon_program = pargs->r.ret_str; break; + case oDisableScdaemon: opt.disable_scdaemon = 1; break; + + case oDefCacheTTL: opt.def_cache_ttl = pargs->r.ret_ulong; break; + case oDefCacheTTLSSH: opt.def_cache_ttl_ssh = pargs->r.ret_ulong; break; + case oMaxCacheTTL: opt.max_cache_ttl = pargs->r.ret_ulong; break; + case oMaxCacheTTLSSH: opt.max_cache_ttl_ssh = pargs->r.ret_ulong; break; + + case oIgnoreCacheForSigning: opt.ignore_cache_for_signing = 1; break; + + case oAllowMarkTrusted: opt.allow_mark_trusted = 1; break; + + case oAllowPresetPassphrase: opt.allow_preset_passphrase = 1; break; + + default: + return 0; /* not handled */ + } + + return 1; /* handled */ +} + + +int +main (int argc, char **argv ) +{ + ARGPARSE_ARGS pargs; + int orig_argc; + int may_coredump; + char **orig_argv; + FILE *configfp = NULL; + char *configname = NULL; + const char *shell; + unsigned configlineno; + int parse_debug = 0; + int default_config =1; + int greeting = 0; + int nogreeting = 0; + int pipe_server = 0; + int is_daemon = 0; + int nodetach = 0; + int csh_style = 0; + char *logfile = NULL; + int debug_wait = 0; + int gpgconf_list = 0; + int standard_socket = 0; + gpg_error_t err; + const char *env_file_name = NULL; + + set_strusage (my_strusage); + gcry_control (GCRYCTL_SUSPEND_SECMEM_WARN); + /* Please note that we may running SUID(ROOT), so be very CAREFUL + when adding any stuff between here and the call to INIT_SECMEM() + somewhere after the option parsing */ + log_set_prefix ("gpg-agent", JNLIB_LOG_WITH_PREFIX|JNLIB_LOG_WITH_PID); + + /* Try to auto set the character set. */ + set_native_charset (NULL); + + i18n_init (); + + /* Libgcrypt requires us to register the threading model first. + Note that this will also do the pth_init. */ + err = gcry_control (GCRYCTL_SET_THREAD_CBS, &gcry_threads_pth); + if (err) + { + log_fatal ("can't register GNU Pth with Libgcrypt: %s\n", + gpg_strerror (err)); + } + + + /* Check that the libraries are suitable. Do it here because + the option parsing may need services of the library. */ + if (!gcry_check_version (NEED_LIBGCRYPT_VERSION) ) + { + log_fatal( _("libgcrypt is too old (need %s, have %s)\n"), + NEED_LIBGCRYPT_VERSION, gcry_check_version (NULL) ); + } + + assuan_set_malloc_hooks (gcry_malloc, gcry_realloc, gcry_free); + assuan_set_assuan_log_stream (log_get_stream ()); + assuan_set_assuan_log_prefix (log_get_prefix (NULL)); + + gcry_set_log_handler (my_gcry_logger, NULL); + gcry_control (GCRYCTL_USE_SECURE_RNDPOOL); + + may_coredump = disable_core_dumps (); + + /* Set default options. */ + parse_rereadable_options (NULL, 0); /* Reset them to default values. */ +#ifdef HAVE_W32_SYSTEM + standard_socket = 1; /* Under Windows we always use a standard + socket. */ +#endif + + shell = getenv ("SHELL"); + if (shell && strlen (shell) >= 3 && !strcmp (shell+strlen (shell)-3, "csh") ) + csh_style = 1; + + opt.homedir = default_homedir (); + + /* Record some of the original environment strings. */ + opt.startup_display = getenv ("DISPLAY"); + if (opt.startup_display) + opt.startup_display = xstrdup (opt.startup_display); + opt.startup_ttyname = ttyname (0); + if (opt.startup_ttyname) + opt.startup_ttyname = xstrdup (opt.startup_ttyname); + opt.startup_ttytype = getenv ("TERM"); + if (opt.startup_ttytype) + opt.startup_ttytype = xstrdup (opt.startup_ttytype); + /* Fixme: Better use the locale function here. */ + opt.startup_lc_ctype = getenv ("LC_CTYPE"); + if (opt.startup_lc_ctype) + opt.startup_lc_ctype = xstrdup (opt.startup_lc_ctype); + opt.startup_lc_messages = getenv ("LC_MESSAGES"); + if (opt.startup_lc_messages) + opt.startup_lc_messages = xstrdup (opt.startup_lc_messages); + + /* 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) + opt.homedir = pargs.r.ret_str; + } + + /* initialize the secure memory. */ + gcry_control (GCRYCTL_INIT_SECMEM, 16384, 0); + maybe_setuid = 0; + + /* + Now we are now working under our real uid + */ + + if (default_config) + configname = make_filename (opt.homedir, "gpg-agent.conf", NULL ); + + argc = orig_argc; + argv = orig_argv; + pargs.argc = &argc; + pargs.argv = &argv; + pargs.flags= 1; /* do not remove the args */ + next_pass: + if (configname) + { + configlineno = 0; + configfp = fopen (configname, "r"); + 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) ); + 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) ) + { + if (parse_rereadable_options (&pargs, 0)) + continue; /* Already handled */ + switch (pargs.r_opt) + { + case aGPGConfList: gpgconf_list = 1; break; + case oBatch: opt.batch=1; break; + + case oDebugWait: debug_wait = pargs.r.ret_int; 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 oNoGreeting: nogreeting = 1; break; + case oNoVerbose: opt.verbose = 0; break; + case oNoOptions: break; /* no-options */ + case oHomedir: opt.homedir = pargs.r.ret_str; break; + case oNoDetach: nodetach = 1; break; + case oLogFile: logfile = pargs.r.ret_str; break; + case oCsh: csh_style = 1; break; + case oSh: csh_style = 0; break; + case oServer: pipe_server = 1; break; + case oDaemon: is_daemon = 1; break; + + case oDisplay: default_display = xstrdup (pargs.r.ret_str); break; + case oTTYname: default_ttyname = xstrdup (pargs.r.ret_str); break; + case oTTYtype: default_ttytype = xstrdup (pargs.r.ret_str); break; + case oLCctype: default_lc_ctype = xstrdup (pargs.r.ret_str); break; + case oLCmessages: default_lc_messages = xstrdup (pargs.r.ret_str); + break; + + case oUseStandardSocket: standard_socket = 1; break; + case oNoUseStandardSocket: standard_socket = 0; break; + + case oKeepTTY: opt.keep_tty = 1; break; + case oKeepDISPLAY: opt.keep_display = 1; break; + + case oSSHSupport: opt.ssh_support = 1; break; + case oWriteEnvFile: + if (pargs.r_type) + env_file_name = pargs.r.ret_str; + else + env_file_name = make_filename ("~/.gpg-agent-info", NULL); + break; + + default : pargs.err = configfp? 1:2; break; + } + } + if (configfp) + { + fclose( configfp ); + configfp = NULL; + /* Keep a copy of the name so that it can be read on SIGHUP. */ + config_filename = configname; + configname = NULL; + goto next_pass; + } + xfree (configname); + configname = NULL; + if (log_get_errorcount(0)) + exit(2); + 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 + /* We don't want to print it here because gpg-agent is useful of its + own and quite matured. */ + /*log_info ("NOTE: this is a development version!\n");*/ +#endif + + set_debug (); + + if (atexit (cleanup)) + { + log_error ("atexit failed\n"); + cleanup (); + exit (1); + } + + initialize_module_query (); + initialize_module_call_scd (); + + /* Try to create missing directories. */ + create_directories (); + + if (debug_wait && pipe_server) + { + log_debug ("waiting for debugger - my pid is %u .....\n", + (unsigned int)getpid()); + sleep (debug_wait); + log_debug ("... okay\n"); + } + + if (gpgconf_list) + { + char *filename; + + /* List options and default values in the GPG Conf format. */ + + /* The following list is taken from gnupg/tools/gpgconf-comp.c. */ + /* Option flags. YOU MUST NOT CHANGE THE NUMBERS OF THE EXISTING + FLAGS, AS THEY ARE PART OF THE EXTERNAL INTERFACE. */ +#define GC_OPT_FLAG_NONE 0UL + /* The RUNTIME flag for an option indicates that the option can be + changed at runtime. */ +#define GC_OPT_FLAG_RUNTIME (1UL << 3) + /* The DEFAULT flag for an option indicates that the option has a + default value. */ +#define GC_OPT_FLAG_DEFAULT (1UL << 4) + /* The DEF_DESC flag for an option indicates that the option has a + default, which is described by the value of the default field. */ +#define GC_OPT_FLAG_DEF_DESC (1UL << 5) + /* The NO_ARG_DESC flag for an option indicates that the argument has + a default, which is described by the value of the ARGDEF field. */ +#define GC_OPT_FLAG_NO_ARG_DESC (1UL << 6) + + filename = make_filename (opt.homedir, "gpg-agent.conf", NULL ); + printf ("gpgconf-gpg-agent.conf:%lu:\"%s\n", + GC_OPT_FLAG_DEFAULT, filename); + xfree (filename); + + printf ("verbose:%lu:\n" + "quiet:%lu:\n" + "debug-level:%lu:\"none:\n" + "log-file:%lu:\n", + GC_OPT_FLAG_NONE|GC_OPT_FLAG_RUNTIME, + GC_OPT_FLAG_NONE|GC_OPT_FLAG_RUNTIME, + GC_OPT_FLAG_DEFAULT|GC_OPT_FLAG_RUNTIME, + GC_OPT_FLAG_NONE|GC_OPT_FLAG_RUNTIME ); + printf ("default-cache-ttl:%lu:%d:\n", + GC_OPT_FLAG_DEFAULT|GC_OPT_FLAG_RUNTIME, DEFAULT_CACHE_TTL ); + printf ("no-grab:%lu:\n", + GC_OPT_FLAG_NONE|GC_OPT_FLAG_RUNTIME); + printf ("ignore-cache-for-signing:%lu:\n", + GC_OPT_FLAG_NONE|GC_OPT_FLAG_RUNTIME); + printf ("allow-mark-trusted:%lu:\n", + GC_OPT_FLAG_NONE|GC_OPT_FLAG_RUNTIME); + printf ("disable-scdaemon:%lu:\n", + GC_OPT_FLAG_NONE|GC_OPT_FLAG_RUNTIME); + + agent_exit (0); + } + + /* If this has been called without any options, we merely check + whether an agent is already running. We do this here so that we + don't clobber a logfile but print it directly to stderr. */ + if (!pipe_server && !is_daemon) + { + log_set_prefix (NULL, JNLIB_LOG_WITH_PREFIX); + check_for_running_agent (0); + agent_exit (0); + } + +#ifdef ENABLE_NLS + /* gpg-agent usually does not output any messages because it runs in + the background. For log files it is acceptable to have messages + always encoded in utf-8. We switch here to utf-8, so that + commands like --help still give native messages. It is far + easier to switch only once instead of for every message and it + actually helps when more then one thread is active (avoids an + extra copy step). */ + bind_textdomain_codeset (PACKAGE_GT, "UTF-8"); +#endif + + /* Now start with logging to a file if this is desired. */ + if (logfile) + { + log_set_file (logfile); + log_set_prefix (NULL, (JNLIB_LOG_WITH_PREFIX + |JNLIB_LOG_WITH_TIME + |JNLIB_LOG_WITH_PID)); + current_logfile = xstrdup (logfile); + } + + /* Make sure that we have a default ttyname. */ + if (!default_ttyname && ttyname (1)) + default_ttyname = xstrdup (ttyname (1)); + if (!default_ttytype && getenv ("TERM")) + default_ttytype = xstrdup (getenv ("TERM")); + + + if (pipe_server) + { /* this is the simple pipe based server */ + start_command_handler (-1, -1); + } + else if (!is_daemon) + ; /* NOTREACHED */ + else + { /* Regular server mode */ + int fd; + int fd_ssh; + pid_t pid; + + /* Remove the DISPLAY variable so that a pinentry does not + default to a specific display. There is still a default + display when gpg-agent was started using --display or a + client requested this using an OPTION command. Note, that we + don't do this when running in reverse daemon mode (i.e. when + exec the program given as arguments). */ +#ifndef HAVE_W32_SYSTEM + if (!opt.keep_display && !argc) + unsetenv ("DISPLAY"); +#endif + + + /* Create the sockets. */ + socket_name = create_socket_name (standard_socket, + "S.gpg-agent", + "/tmp/gpg-XXXXXX/S.gpg-agent"); + if (opt.ssh_support) + socket_name_ssh = create_socket_name (standard_socket, + "S.gpg-agent.ssh", + "/tmp/gpg-XXXXXX/S.gpg-agent.ssh"); + + fd = create_server_socket (standard_socket, socket_name); + if (opt.ssh_support) + fd_ssh = create_server_socket (standard_socket, socket_name_ssh); + else + fd_ssh = -1; + + /* If we are going to exec a program in the parent, we record + the PID, so that the child may check whether the program is + still alive. */ + if (argc) + parent_pid = getpid (); + + fflush (NULL); +#ifdef HAVE_W32_SYSTEM + pid = getpid (); + printf ("set GPG_AGENT_INFO=%s;%lu;1\n", socket_name, (ulong)pid); +#else /*!HAVE_W32_SYSTEM*/ + pid = fork (); + if (pid == (pid_t)-1) + { + log_fatal ("fork failed: %s\n", strerror (errno) ); + exit (1); + } + else if (pid) + { /* We are the parent */ + char *infostr, *infostr_ssh_sock, *infostr_ssh_pid; + + close (fd); + + /* Create the info string: :: */ + if (asprintf (&infostr, "GPG_AGENT_INFO=%s:%lu:1", + socket_name, (ulong)pid ) < 0) + { + log_error ("out of core\n"); + kill (pid, SIGTERM); + exit (1); + } + if (opt.ssh_support) + { + if (asprintf (&infostr_ssh_sock, "SSH_AUTH_SOCK=%s", + socket_name_ssh) < 0) + { + log_error ("out of core\n"); + kill (pid, SIGTERM); + exit (1); + } + if (asprintf (&infostr_ssh_pid, "SSH_AGENT_PID=%u", + pid) < 0) + { + log_error ("out of core\n"); + kill (pid, SIGTERM); + exit (1); + } + } + + *socket_name = 0; /* Don't let cleanup() remove the socket - + the child should do this from now on */ + if (opt.ssh_support) + *socket_name_ssh = 0; + + if (env_file_name) + { + FILE *fp; + + fp = fopen (env_file_name, "w"); + if (!fp) + log_error (_("error creating `%s': %s\n"), + env_file_name, strerror (errno)); + else + { + fputs (infostr, fp); + putc ('\n', fp); + if (opt.ssh_support) + { + fputs (infostr_ssh_sock, fp); + putc ('\n', fp); + fputs (infostr_ssh_pid, fp); + putc ('\n', fp); + } + fclose (fp); + } + } + + + if (argc) + { /* Run the program given on the commandline. */ + if (putenv (infostr)) + { + log_error ("failed to set environment: %s\n", + strerror (errno) ); + kill (pid, SIGTERM ); + exit (1); + } + if (opt.ssh_support && putenv (infostr_ssh_sock)) + { + log_error ("failed to set environment: %s\n", + strerror (errno) ); + kill (pid, SIGTERM ); + exit (1); + } + if (opt.ssh_support && putenv (infostr_ssh_pid)) + { + log_error ("failed to set environment: %s\n", + strerror (errno) ); + kill (pid, SIGTERM ); + exit (1); + } + execvp (argv[0], argv); + log_error ("failed to run the command: %s\n", strerror (errno)); + kill (pid, SIGTERM); + exit (1); + } + else + { + /* Print the environment string, so that the caller can use + shell's eval to set it */ + if (csh_style) + { + *strchr (infostr, '=') = ' '; + printf ("setenv %s\n", infostr); + if (opt.ssh_support) + { + *strchr (infostr_ssh_sock, '=') = ' '; + printf ("setenv %s\n", infostr_ssh_sock); + *strchr (infostr_ssh_pid, '=') = ' '; + printf ("setenv %s\n", infostr_ssh_pid); + } + } + else + { + printf ( "%s; export GPG_AGENT_INFO;\n", infostr); + if (opt.ssh_support) + { + printf ("%s; export SSH_AUTH_SOCK;\n", infostr_ssh_sock); + printf ("%s; export SSH_AGENT_PID;\n", infostr_ssh_pid); + } + } + free (infostr); /* (Note that a vanilla free is here correct.) */ + if (opt.ssh_support) + { + free (infostr_ssh_sock); + free (infostr_ssh_pid); + } + exit (0); + } + /*NOTREACHED*/ + } /* End parent */ + + /* + This is the child + */ + + /* Detach from tty and put process into a new session */ + if (!nodetach ) + { + int i; + unsigned int oldflags; + + /* Close stdin, stdout and stderr unless it is the log stream */ + for (i=0; i <= 2; i++) + { + if (!log_test_fd (i) && i != fd ) + close (i); + } + if (setsid() == -1) + { + log_error ("setsid() failed: %s\n", strerror(errno) ); + cleanup (); + exit (1); + } + + log_get_prefix (&oldflags); + log_set_prefix (NULL, oldflags | JNLIB_LOG_RUN_DETACHED); + opt.running_detached = 1; + } + + if (chdir("/")) + { + log_error ("chdir to / failed: %s\n", strerror (errno)); + exit (1); + } + + { + struct sigaction sa; + + sa.sa_handler = SIG_IGN; + sigemptyset (&sa.sa_mask); + sa.sa_flags = 0; + sigaction (SIGPIPE, &sa, NULL); + } +#endif /*!HAVE_W32_SYSTEM*/ + + handle_connections (fd, opt.ssh_support ? fd_ssh : -1); + close (fd); + } + + return 0; +} + +void +agent_exit (int rc) +{ + /*FIXME: update_random_seed_file();*/ +#if 1 + /* at this time a bit annoying */ + if (opt.debug & DBG_MEMSTAT_VALUE) + { + gcry_control( GCRYCTL_DUMP_MEMORY_STATS ); + gcry_control( GCRYCTL_DUMP_RANDOM_STATS ); + } + if (opt.debug) + gcry_control (GCRYCTL_DUMP_SECMEM_STATS ); +#endif + gcry_control (GCRYCTL_TERM_SECMEM ); + rc = rc? rc : log_get_errorcount(0)? 2 : 0; + exit (rc); +} + + +void +agent_init_default_ctrl (struct server_control_s *ctrl) +{ + ctrl->connection_fd = -1; + + /* Note we ignore malloc errors because we can't do much about it + and the request will fail anyway shortly after this + initialization. */ + if (ctrl->display) + free (ctrl->display); + ctrl->display = default_display? strdup (default_display) : NULL; + + if (ctrl->ttyname) + free (ctrl->ttyname); + ctrl->ttyname = default_ttyname? strdup (default_ttyname) : NULL; + + if (ctrl->ttytype) + free (ctrl->ttytype); + ctrl->ttytype = default_ttytype? strdup (default_ttytype) : NULL; + + if (ctrl->lc_ctype) + free (ctrl->lc_ctype); + ctrl->lc_ctype = default_lc_ctype? strdup (default_lc_ctype) : NULL; + + if (ctrl->lc_messages) + free (ctrl->lc_messages); + ctrl->lc_messages = default_lc_messages? strdup (default_lc_messages) : NULL; +} + + +/* Reread parts of the configuration. Note, that this function is + obviously not thread-safe and should only be called from the PTH + signal handler. + + Fixme: Due to the way the argument parsing works, we create a + memory leak here for all string type arguments. There is currently + no clean way to tell whether the memory for the argument has been + allocated or points into the process' original arguments. Unless + we have a mechanism to tell this, we need to live on with this. */ +static void +reread_configuration (void) +{ + ARGPARSE_ARGS pargs; + FILE *fp; + unsigned int configlineno = 0; + int dummy; + + if (!config_filename) + return; /* No config file. */ + + fp = fopen (config_filename, "r"); + if (!fp) + { + log_error (_("option file `%s': %s\n"), + config_filename, strerror(errno) ); + return; + } + + parse_rereadable_options (NULL, 1); /* Start from the default values. */ + + memset (&pargs, 0, sizeof pargs); + dummy = 0; + pargs.argc = &dummy; + pargs.flags = 1; /* do not remove the args */ + while (optfile_parse (fp, config_filename, &configlineno, &pargs, opts) ) + { + if (pargs.r_opt < -1) + pargs.err = 1; /* Print a warning. */ + else /* Try to parse this option - ignore unchangeable ones. */ + parse_rereadable_options (&pargs, 1); + } + fclose (fp); + set_debug (); +} + + + + +/* Create a name for the socket. With USE_STANDARD_SOCKET given as + true using STANDARD_NAME in the home directory or if given has + false from the mkdir type name TEMPLATE. In the latter case a + unique name in a unique new directory will be created. In both + cases check for valid characters as well as against a maximum + allowed length for a unix domain socket is done. The function + terminates the process in case of an error. Retunrs: Pointer to an + allcoated string with the absolute name of the socket used. */ +static char * +create_socket_name (int use_standard_socket, + char *standard_name, char *template) +{ + char *name, *p; + + if (use_standard_socket) + name = make_filename (opt.homedir, standard_name, NULL); + else + { + name = xstrdup (template); + p = strrchr (name, '/'); + if (!p) + BUG (); + *p = 0; + if (!mkdtemp (name)) + { + log_error (_("can't create directory `%s': %s\n"), + name, strerror (errno)); + agent_exit (2); + } + *p = '/'; + } + + if (strchr (name, PATHSEP_C)) + { + log_error (("`%s' are not allowed in the socket name\n"), PATHSEP_S); + agent_exit (2); + } + if (strlen (name) + 1 >= DIMof (struct sockaddr_un, sun_path) ) + { + log_error (_("name of socket too long\n")); + agent_exit (2); + } + return name; +} + + + +/* Create a Unix domain socket with NAME. IS_STANDARD_NAME indicates + whether a non-random socket is used. Returns the filedescriptor or + terminates the process in case of an error. */ +static int +create_server_socket (int is_standard_name, const char *name) +{ + struct sockaddr_un *serv_addr; + socklen_t len; + int fd; + int rc; + +#ifdef HAVE_W32_SYSTEM + fd = _w32_sock_new (AF_UNIX, SOCK_STREAM, 0); +#else + fd = socket (AF_UNIX, SOCK_STREAM, 0); +#endif + if (fd == -1) + { + log_error (_("can't create socket: %s\n"), strerror (errno)); + agent_exit (2); + } + + serv_addr = xmalloc (sizeof (*serv_addr)); + memset (serv_addr, 0, sizeof *serv_addr); + serv_addr->sun_family = AF_UNIX; + assert (strlen (name) + 1 < sizeof (serv_addr->sun_path)); + strcpy (serv_addr->sun_path, name); + len = (offsetof (struct sockaddr_un, sun_path) + + strlen (serv_addr->sun_path) + 1); + +#ifdef HAVE_W32_SYSTEM + rc = _w32_sock_bind (fd, (struct sockaddr*) serv_addr, len); + if (is_standard_name && rc == -1 ) + { + remove (name); + rc = bind (fd, (struct sockaddr*) serv_addr, len); + } +#else + rc = bind (fd, (struct sockaddr*) serv_addr, len); + if (is_standard_name && rc == -1 && errno == EADDRINUSE) + { + remove (name); + rc = bind (fd, (struct sockaddr*) serv_addr, len); + } +#endif + if (rc == -1) + { + log_error (_("error binding socket to `%s': %s\n"), + serv_addr->sun_path, strerror (errno)); + close (fd); + agent_exit (2); + } + + if (listen (fd, 5 ) == -1) + { + log_error (_("listen() failed: %s\n"), strerror (errno)); + close (fd); + agent_exit (2); + } + + if (opt.verbose) + log_info (_("listening on socket `%s'\n"), serv_addr->sun_path); + + return fd; +} + + +/* Check that the directory for storing the private keys exists and + create it if not. This function won't fail as it is only a + convenience function and not strictly necessary. */ +static void +create_private_keys_directory (const char *home) +{ + char *fname; + struct stat statbuf; + + fname = make_filename (home, GNUPG_PRIVATE_KEYS_DIR, NULL); + if (stat (fname, &statbuf) && errno == ENOENT) + { +#ifdef HAVE_W32_SYSTEM /*FIXME: Setup proper permissions. */ + if (!CreateDirectory (fname, NULL)) + log_error (_("can't create directory `%s': %s\n"), + fname, w32_strerror (-1) ); +#else + if (mkdir (fname, S_IRUSR|S_IWUSR|S_IXUSR )) + log_error (_("can't create directory `%s': %s\n"), + fname, strerror (errno) ); +#endif + else if (!opt.quiet) + log_info (_("directory `%s' created\n"), fname); + } + xfree (fname); +} + +/* Create the directory only if the supplied directory name is the + same as the default one. This way we avoid to create arbitrary + directories when a non-default home directory is used. To cope + with HOME, we compare only the suffix if we see that the default + homedir does start with a tilde. We don't stop here in case of + problems because other functions will throw an error anyway.*/ +static void +create_directories (void) +{ + struct stat statbuf; + const char *defhome = GNUPG_DEFAULT_HOMEDIR; + char *home; + + home = make_filename (opt.homedir, NULL); + if ( stat (home, &statbuf) ) + { + if (errno == ENOENT) + { + if ( (*defhome == '~' + && (strlen (home) >= strlen (defhome+1) + && !strcmp (home + strlen(home) + - strlen (defhome+1), defhome+1))) + || (*defhome != '~' && !strcmp (home, defhome) ) + ) + { +#ifdef HAVE_W32_SYSTEM + if (!CreateDirectory (home, NULL)) + log_error (_("can't create directory `%s': %s\n"), + home, w32_strerror (-1) ); +#else + if (mkdir (home, S_IRUSR|S_IWUSR|S_IXUSR )) + log_error (_("can't create directory `%s': %s\n"), + home, strerror (errno) ); +#endif + else + { + if (!opt.quiet) + log_info (_("directory `%s' created\n"), home); + create_private_keys_directory (home); + } + } + } + else + log_error (_("stat() failed for `%s': %s\n"), home, strerror (errno)); + } + else if ( !S_ISDIR(statbuf.st_mode)) + { + log_error (_("can't use `%s' as home directory\n"), home); + } + else /* exists and is a directory. */ + { + create_private_keys_directory (home); + } + xfree (home); +} + + + +/* This is the worker for the ticker. It is called every few seconds + and may only do fast operations. */ +static void +handle_tick (void) +{ + /* Check whether the scdaemon has died and cleanup in this case. */ + agent_scd_check_aliveness (); + + /* If we are running as a child of another process, check whether + the parent is still alive and shutdown if not. */ +#ifndef HAVE_W32_SYSTEM + if (parent_pid != (pid_t)(-1)) + { + if (kill (parent_pid, 0)) + { + shutdown_pending = 2; + log_info ("parent process died - shutting down\n"); + log_info ("%s %s stopped\n", strusage(11), strusage(13) ); + cleanup (); + agent_exit (0); + } + } +#endif /*HAVE_W32_SYSTEM*/ +} + + +static void +handle_signal (int signo) +{ + switch (signo) + { +#ifndef HAVE_W32_SYSTEM + case SIGHUP: + log_info ("SIGHUP received - " + "re-reading configuration and flushing cache\n"); + agent_flush_cache (); + reread_configuration (); + agent_reload_trustlist (); + break; + + case SIGUSR1: + log_info ("SIGUSR1 received - printing internal information:\n"); + pth_ctrl (PTH_CTRL_DUMPSTATE, log_get_stream ()); + agent_query_dump_state (); + agent_scd_dump_state (); + break; + + case SIGUSR2: + if (opt.verbose) + log_info ("SIGUSR2 received - checking smartcard status\n"); + break; + + case SIGTERM: + if (!shutdown_pending) + log_info ("SIGTERM received - shutting down ...\n"); + else + log_info ("SIGTERM received - still %ld running threads\n", + pth_ctrl( PTH_CTRL_GETTHREADS )); + shutdown_pending++; + if (shutdown_pending > 2) + { + log_info ("shutdown forced\n"); + log_info ("%s %s stopped\n", strusage(11), strusage(13) ); + cleanup (); + agent_exit (0); + } + break; + + case SIGINT: + log_info ("SIGINT received - immediate shutdown\n"); + log_info( "%s %s stopped\n", strusage(11), strusage(13)); + cleanup (); + agent_exit (0); + break; +#endif + default: + log_info ("signal %d received - no action defined\n", signo); + } +} + + +/* This is the standard connection thread's main function. */ +static void * +start_connection_thread (void *arg) +{ + int fd = (int)arg; + + if (opt.verbose) + log_info (_("handler 0x%lx for fd %d started\n"), + (long)pth_self (), fd); + + /* FIXME: Move this housekeeping into a ticker function. Calling it + for each connection should work but won't work anymore if our + clients start to keep connections. */ + agent_trustlist_housekeeping (); + + start_command_handler (-1, fd); + if (opt.verbose) + log_info (_("handler 0x%lx for fd %d terminated\n"), + (long)pth_self (), fd); + + return NULL; +} + + +/* This is the ssh connection thread's main function. */ +static void * +start_connection_thread_ssh (void *arg) +{ + int fd = (int)arg; + + if (opt.verbose) + log_info (_("ssh handler 0x%lx for fd %d started\n"), + (long)pth_self (), fd); + + agent_trustlist_housekeeping (); + + start_command_handler_ssh (fd); + if (opt.verbose) + log_info (_("ssh handler 0x%lx for fd %d terminated\n"), + (long)pth_self (), fd); + + return NULL; +} + + +/* Connection handler loop. Wait for coecntion requests and spawn a + thread after accepting a connection. */ +static void +handle_connections (int listen_fd, int listen_fd_ssh) +{ + pth_attr_t tattr; + pth_event_t ev, time_ev; + sigset_t sigs; + int signo; + struct sockaddr_un paddr; + socklen_t plen; + fd_set fdset, read_fdset; + int ret; + int fd; + + tattr = pth_attr_new(); + pth_attr_set (tattr, PTH_ATTR_JOINABLE, 0); + pth_attr_set (tattr, PTH_ATTR_STACK_SIZE, 256*1024); + +#ifndef HAVE_W32_SYSTEM /* fixme */ + /* Make sure that the signals we are going to handle are not blocked + and create an event object for them. */ + sigemptyset (&sigs ); + sigaddset (&sigs, SIGHUP); + sigaddset (&sigs, SIGUSR1); + sigaddset (&sigs, SIGUSR2); + sigaddset (&sigs, SIGINT); + sigaddset (&sigs, SIGTERM); + pth_sigmask (SIG_UNBLOCK, &sigs, NULL); + ev = pth_event (PTH_EVENT_SIGS, &sigs, &signo); +#else + ev = NULL; +#endif + time_ev = NULL; + + FD_ZERO (&fdset); + FD_SET (listen_fd, &fdset); + if (listen_fd_ssh != -1) + FD_SET (listen_fd_ssh, &fdset); + + for (;;) + { + sigset_t oldsigs; + + if (shutdown_pending) + { + if (pth_ctrl (PTH_CTRL_GETTHREADS) == 1) + break; /* ready */ + + /* Do not accept anymore connections and wait for existing + connections to terminate */ + signo = 0; + pth_wait (ev); + if (pth_event_occurred (ev) && signo) + handle_signal (signo); + continue; + } + + /* Create a timeout event if needed. */ + if (!time_ev) + time_ev = pth_event (PTH_EVENT_TIME, pth_timeout (2, 0)); + + /* POSIX says that fd_set should be implemented as a structure, + thus a simple assignment is fine to copy the entire set. */ + read_fdset = fdset; + + if (time_ev) + pth_event_concat (ev, time_ev, NULL); + ret = pth_select_ev (FD_SETSIZE, &read_fdset, NULL, NULL, NULL, ev); + if (time_ev) + pth_event_isolate (time_ev); + + if (ret == -1) + { + if (pth_event_occurred (ev) + || (time_ev && pth_event_occurred (time_ev))) + { + if (pth_event_occurred (ev)) + handle_signal (signo); + if (time_ev && pth_event_occurred (time_ev)) + { + pth_event_free (time_ev, PTH_FREE_ALL); + time_ev = NULL; + handle_tick (); + } + continue; + } + log_error (_("pth_select failed: %s - waiting 1s\n"), + strerror (errno)); + pth_sleep (1); + continue; + } + + if (pth_event_occurred (ev)) + { + handle_signal (signo); + } + + if (time_ev && pth_event_occurred (time_ev)) + { + pth_event_free (time_ev, PTH_FREE_ALL); + time_ev = NULL; + handle_tick (); + } + + + /* We now might create new threads and because we don't want any + signals - we are handling here - to be delivered to a new + thread. Thus we need to block those signals. */ + pth_sigmask (SIG_BLOCK, &sigs, &oldsigs); + + if (FD_ISSET (listen_fd, &read_fdset)) + { + plen = sizeof paddr; + fd = pth_accept (listen_fd, (struct sockaddr *)&paddr, &plen); + if (fd == -1) + { + log_error ("accept failed: %s\n", strerror (errno)); + } + else + { + char threadname[50]; + snprintf (threadname, sizeof threadname-1, + "conn fd=%d (gpg)", fd); + threadname[sizeof threadname -1] = 0; + pth_attr_set (tattr, PTH_ATTR_NAME, threadname); + if (!pth_spawn (tattr, start_connection_thread, (void*)fd)) + { + log_error ("error spawning connection handler: %s\n", + strerror (errno) ); + close (fd); + } + } + fd = -1; + } + + if (listen_fd_ssh != -1 && FD_ISSET (listen_fd_ssh, &read_fdset)) + { + plen = sizeof paddr; + fd = pth_accept (listen_fd_ssh, (struct sockaddr *)&paddr, &plen); + if (fd == -1) + { + log_error ("accept failed for ssh: %s\n", strerror (errno)); + } + else + { + char threadname[50]; + snprintf (threadname, sizeof threadname-1, + "conn fd=%d (ssh)", fd); + threadname[sizeof threadname -1] = 0; + pth_attr_set (tattr, PTH_ATTR_NAME, threadname); + + if (!pth_spawn (tattr, start_connection_thread_ssh, (void*)fd)) + { + log_error ("error spawning ssh connection handler: %s\n", + strerror (errno) ); + close (fd); + } + } + fd = -1; + } + + /* Restore the signal mask. */ + pth_sigmask (SIG_SETMASK, &oldsigs, NULL); + + } + + pth_event_free (ev, PTH_FREE_ALL); + if (time_ev) + pth_event_free (time_ev, PTH_FREE_ALL); + cleanup (); + log_info (_("%s %s stopped\n"), strusage(11), strusage(13)); +} + + +/* Figure out whether an agent is available and running. Prints an + error if not. Usually started with MODE 0. */ +static int +check_for_running_agent (int mode) +{ + int rc; + char *infostr, *p; + assuan_context_t ctx; + int prot, pid; + + if (!mode) + { + infostr = getenv ("GPG_AGENT_INFO"); + if (!infostr || !*infostr) + { + if (!check_for_running_agent (1)) + return 0; /* Okay, its running on the standard socket. */ + log_error (_("no gpg-agent running in this session\n")); + return -1; + } + + infostr = xstrdup (infostr); + if ( !(p = strchr (infostr, PATHSEP_C)) || p == infostr) + { + xfree (infostr); + if (!check_for_running_agent (1)) + return 0; /* Okay, its running on the standard socket. */ + log_error (_("malformed GPG_AGENT_INFO environment variable\n")); + return -1; + } + + *p++ = 0; + pid = atoi (p); + while (*p && *p != PATHSEP_C) + p++; + prot = *p? atoi (p+1) : 0; + if (prot != 1) + { + xfree (infostr); + log_error (_("gpg-agent protocol version %d is not supported\n"), + prot); + if (!check_for_running_agent (1)) + return 0; /* Okay, its running on the standard socket. */ + return -1; + } + } + else /* MODE != 0 */ + { + infostr = make_filename (opt.homedir, "S.gpg-agent", NULL); + pid = (pid_t)(-1); + } + + + rc = assuan_socket_connect (&ctx, infostr, pid); + xfree (infostr); + if (rc) + { + if (!mode && !check_for_running_agent (1)) + return 0; /* Okay, its running on the standard socket. */ + + if (!mode) + log_error ("can't connect to the agent: %s\n", assuan_strerror (rc)); + return -1; + } + + if (!opt.quiet) + log_info ("gpg-agent running and available\n"); + + assuan_disconnect (ctx); + return 0; +} diff --git a/agent/keyformat.txt b/agent/keyformat.txt new file mode 100644 index 000000000..2fa53adba --- /dev/null +++ b/agent/keyformat.txt @@ -0,0 +1,174 @@ +keyformat.txt (wk 2001-12-18) +----------------------------- + + +Some notes on the format of the secret keys used with gpg-agent. + +Location of keys +================ +The secret keys[1] are stored on a per file basis in a directory below +the ~/.gnupg home directory. This directory is named + + private-keys-v1.d + +and should have permissions 700. + +The secret keys are stored in files with a name matching the +hexadecimal representation of the keygrip[2]. + +Unprotected Private Key Format +============================== +The content of the file is an S-Expression like the ones used with +Libgcrypt. Here is an example of an unprotected file: + +(private-key + (rsa + (n #00e0ce9..[some bytes not shown]..51#) + (e #010001#) + (d #046129F..[some bytes not shown]..81#) + (p #00e861b..[some bytes not shown]..f1#) + (q #00f7a7c..[some bytes not shown]..61#) + (u #304559a..[some bytes not shown]..9b#) + ) + (created-at timestamp) + (uri http://foo.bar x-foo:whatever_you_want) + (comment whatever) +) + +"comment", "created-at" and "uri" are optional. "comment" is +currently used to keep track of ssh key comments. "created-at" is used +to keep track of the creation time stamp used with OpenPGP keys; it is +optional but required for some operations to calculate the fingerprint +of the key. This timestamp should be a string with the number of +seconds since Epoch or an ISO time string (yyyymmddThhmmss). + +Actually this form should not be used for regular purposes and only +accepted by gpg-agent with the configuration option: +--allow-non-canonical-key-format. The regular way to represent the +keys is in canonical representation[3]: + +(private-key + (rsa + (n #00e0ce9..[some bytes not shown]..51#) + (e #010001#) + (d #046129F..[some bytes not shown]..81#) + (p #00e861b..[some bytes not shown]..f1#) + (q #00f7a7c..[some bytes not shown]..61#) + (u #304559a..[some bytes not shown]..9b#) + ) + (uri http://foo.bar x-foo:whatever_you_want) +) + + +Protected Private Key Format +============================== +A protected key is like this: + +(protected-private-key + (rsa + (n #00e0ce9..[some bytes not shown]..51#) + (e #010001#) + (protected mode (parms) encrypted_octet_string) + ) + (uri http://foo.bar x-foo:whatever_you_want) + (comment whatever) +) + + +In this scheme the encrypted_octet_string is encrypted according to +the algorithm described after the keyword protected; most protection +algorithms need some parameters, which are given in a list before the +encrypted_octet_string. The result of the decryption process is a +list of the secret key parameters. + +The only available protection mode for now is + + openpgp-s2k3-sha1-aes-cbc + +which describes an algorithm using using AES in CBC mode for +encryption, SHA-1 for integrity protection and the String to Key +algorithm 3 from OpenPGP (rfc2440). + +Example: + +(protected openpgp-s2k3-sha1-aes-cbc + ((sha1 16byte_salt no_of_iterations) 16byte_iv) + encrypted_octet_string +) + +The encrypted_octet string should yield this S-Exp (in canonical +representation) after decryption: + +( + ( + (d #046129F..[some bytes not shown]..81#) + (p #00e861b..[some bytes not shown]..f1#) + (q #00f7a7c..[some bytes not shown]..61#) + (u #304559a..[some bytes not shown]..9b#) + ) + (hash sha1 #...[hashvalue]...#) +) + +For padding reasons, random bytes are appended to this list - they can +easily be stripped by looking for the end of the list. + +The hash is calculated on the concatenation of the public key and +secret key parameter lists: i.e it is required to hash the +concatenation of these 6 canonical encoded lists for RSA, including +the parenthesis and the algorithm keyword. + +(rsa + (n #00e0ce9..[some bytes not shown]..51#) + (e #010001#) + (d #046129F..[some bytes not shown]..81#) + (p #00e861b..[some bytes not shown]..f1#) + (q #00f7a7c..[some bytes not shown]..61#) + (u #304559a..[some bytes not shown]..9b#) +) + +After decryption the hash must be recalculated and compared against +the stored one - If they don't match the integrity of the key is not +given. + + +Shadowed Private Key Format +============================ +To keep track of keys stored on IC cards we use a third format for +private kyes which are called shadow keys as they are only a reference +to keys stored on a token: + +(shadowed-private-key + (rsa + (n #00e0ce9..[some bytes not shown]..51#) + (e #010001#) + (shadowed protocol (info)) + ) + (uri http://foo.bar x-foo:whatever_you_want) + (comment whatever) +) + +The currently used protocol is "ti-v1" (token info version 1). The +second list with the information has this layout: + +(card_serial_number id_string_of_key) + +More items may be added to the list. + + + + + + +Notes: +====== +[1] I usually use the terms private and secret key exchangeable but prefer the +term secret key because it can be visually be better distinguished +from the term public key. + +[2] The keygrip is a unique identifier for a key pair, it is +independent of any protocol, so that the same key can be used with +different protocols. PKCS-15 calls this a subjectKeyHash; it can be +calculated using Libgcrypt's gcry_pk_get_keygrip (). + +[3] Even when canonical representation are required we will show the +S-expression here in a more readable representation. diff --git a/agent/learncard.c b/agent/learncard.c new file mode 100644 index 000000000..8ddf4ee54 --- /dev/null +++ b/agent/learncard.c @@ -0,0 +1,436 @@ +/* learncard.c - Handle the LEARN command + * Copyright (C) 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 +#include +#include +#include +#include +#include +#include +#include +#include + +#include "agent.h" +#include + +/* Structures used by the callback mechanism to convey information + pertaining to key pairs. */ +struct keypair_info_s { + struct keypair_info_s *next; + int no_cert; + char *id; /* points into grip */ + char hexgrip[1]; /* The keygrip (i.e. a hash over the public key + parameters) formatted as a hex string. + Allocated somewhat large to also act as + memeory for the above ID field. */ +}; +typedef struct keypair_info_s *KEYPAIR_INFO; + +struct kpinfo_cb_parm_s { + int error; + KEYPAIR_INFO info; +}; + + + +/* Structures used by the callback mechanism to convey information + pertaining to certificates. */ +struct certinfo_s { + struct certinfo_s *next; + int type; + int done; + char id[1]; +}; +typedef struct certinfo_s *CERTINFO; + +struct certinfo_cb_parm_s { + int error; + CERTINFO info; +}; + + +/* Structures used by the callback mechanism to convey assuan status + lines. */ +struct sinfo_s { + struct sinfo_s *next; + char *data; /* Points into keyword. */ + char keyword[1]; +}; +typedef struct sinfo_s *SINFO; + +struct sinfo_cb_parm_s { + int error;; + SINFO info; +}; + + +/* Destructor for key information objects. */ +static void +release_keypair_info (KEYPAIR_INFO info) +{ + while (info) + { + KEYPAIR_INFO tmp = info->next; + xfree (info); + info = tmp; + } +} + +/* Destructor for certificate information objects. */ +static void +release_certinfo (CERTINFO info) +{ + while (info) + { + CERTINFO tmp = info->next; + xfree (info); + info = tmp; + } +} + +/* Destructor for status information objects. */ +static void +release_sinfo (SINFO info) +{ + while (info) + { + SINFO tmp = info->next; + xfree (info); + info = tmp; + } +} + + + +/* This callback is used by agent_card_learn and passed the content of + all KEYPAIRINFO lines. It merely stores this data away */ +static void +kpinfo_cb (void *opaque, const char *line) +{ + struct kpinfo_cb_parm_s *parm = opaque; + KEYPAIR_INFO item; + char *p; + + if (parm->error) + return; /* no need to gather data after an error coccured */ + item = xtrycalloc (1, sizeof *item + strlen (line)); + if (!item) + { + parm->error = out_of_core (); + return; + } + strcpy (item->hexgrip, line); + for (p = item->hexgrip; hexdigitp (p); p++) + ; + if (p == item->hexgrip && *p == 'X' && spacep (p+1)) + { + item->no_cert = 1; + p++; + } + else if ((p - item->hexgrip) != 40 || !spacep (p)) + { /* not a 20 byte hex keygrip or not followed by a space */ + parm->error = gpg_error (GPG_ERR_INV_RESPONSE); + xfree (item); + return; + } + *p++ = 0; + while (spacep (p)) + p++; + item->id = p; + while (*p && !spacep (p)) + p++; + if (p == item->id) + { /* invalid ID string */ + parm->error = gpg_error (GPG_ERR_INV_RESPONSE); + xfree (item); + return; + } + *p = 0; /* ignore trailing stuff */ + + /* store it */ + item->next = parm->info; + parm->info = item; +} + + +/* This callback is used by agent_card_learn and passed the content of + all CERTINFO lines. It merely stores this data away */ +static void +certinfo_cb (void *opaque, const char *line) +{ + struct certinfo_cb_parm_s *parm = opaque; + CERTINFO item; + int type; + char *p, *pend; + + if (parm->error) + return; /* no need to gather data after an error coccured */ + + type = strtol (line, &p, 10); + while (spacep (p)) + p++; + for (pend = p; *pend && !spacep (pend); pend++) + ; + if (p == pend || !*p) + { + parm->error = gpg_error (GPG_ERR_INV_RESPONSE); + return; + } + *pend = 0; /* ignore trailing stuff */ + + item = xtrycalloc (1, sizeof *item + strlen (p)); + if (!item) + { + parm->error = out_of_core (); + return; + } + item->type = type; + strcpy (item->id, p); + /* store it */ + item->next = parm->info; + parm->info = item; +} + + +/* This callback is used by agent_card_learn and passed the content of + all SINFO lines. It merely stores this data away */ +static void +sinfo_cb (void *opaque, const char *keyword, size_t keywordlen, + const char *data) +{ + struct sinfo_cb_parm_s *sparm = opaque; + SINFO item; + + if (sparm->error) + return; /* no need to gather data after an error coccured */ + + item = xtrycalloc (1, sizeof *item + keywordlen + 1 + strlen (data)); + if (!item) + { + sparm->error = out_of_core (); + return; + } + memcpy (item->keyword, keyword, keywordlen); + item->data = item->keyword + keywordlen; + *item->data = 0; + item->data++; + strcpy (item->data, data); + /* store it */ + item->next = sparm->info; + sparm->info = item; +} + + + +static int +send_cert_back (ctrl_t ctrl, const char *id, void *assuan_context) +{ + int rc; + char *derbuf; + size_t derbuflen; + + rc = agent_card_readcert (ctrl, id, &derbuf, &derbuflen); + if (rc) + { + log_error ("error reading certificate: %s\n", + gpg_strerror (rc)); + return rc; + } + + rc = assuan_send_data (assuan_context, derbuf, derbuflen); + xfree (derbuf); + if (!rc) + rc = assuan_send_data (assuan_context, NULL, 0); + if (!rc) + rc = assuan_write_line (assuan_context, "END"); + if (rc) + { + log_error ("sending certificate failed: %s\n", + assuan_strerror (rc)); + return map_assuan_err (rc); + } + return 0; +} + +/* Perform the learn operation. If ASSUAN_CONTEXT is not NULL all new + certificates are send back via Assuan. */ +int +agent_handle_learn (ctrl_t ctrl, void *assuan_context) +{ + int rc; + struct kpinfo_cb_parm_s parm; + struct certinfo_cb_parm_s cparm; + struct sinfo_cb_parm_s sparm; + char *serialno = NULL; + KEYPAIR_INFO item; + SINFO sitem; + unsigned char grip[20]; + char *p; + int i; + static int certtype_list[] = { + 101, /* trusted */ + 102, /* useful */ + 100, /* regular */ + /* We don't include 110 here because gpgsm can't handle it. */ + -1 /* end of list */ + }; + + + memset (&parm, 0, sizeof parm); + memset (&cparm, 0, sizeof cparm); + memset (&sparm, 0, sizeof sparm); + + /* Check whether a card is present and get the serial number */ + rc = agent_card_serialno (ctrl, &serialno); + if (rc) + goto leave; + + /* Now gather all the available info. */ + rc = agent_card_learn (ctrl, kpinfo_cb, &parm, certinfo_cb, &cparm, + sinfo_cb, &sparm); + if (!rc && (parm.error || cparm.error || sparm.error)) + rc = parm.error? parm.error : cparm.error? cparm.error : sparm.error; + if (rc) + { + log_debug ("agent_card_learn failed: %s\n", gpg_strerror (rc)); + goto leave; + } + + log_info ("card has S/N: %s\n", serialno); + + /* Pass on all the collected status information. */ + if (assuan_context) + { + for (sitem = sparm.info; sitem; sitem = sitem->next) + { + assuan_write_status (assuan_context, sitem->keyword, sitem->data); + } + } + + /* Write out the certificates in a standard order. */ + for (i=0; certtype_list[i] != -1; i++) + { + CERTINFO citem; + for (citem = cparm.info; citem; citem = citem->next) + { + if (certtype_list[i] != citem->type) + continue; + + if (opt.verbose) + log_info (" id: %s (type=%d)\n", + citem->id, citem->type); + + if (assuan_context) + { + rc = send_cert_back (ctrl, citem->id, assuan_context); + if (rc) + goto leave; + citem->done = 1; + } + } + } + + for (item = parm.info; item; item = item->next) + { + unsigned char *pubkey, *shdkey; + size_t n; + + if (opt.verbose) + log_info (" id: %s (grip=%s)\n", item->id, item->hexgrip); + + if (item->no_cert) + continue; /* No public key yet available. */ + + for (p=item->hexgrip, i=0; i < 20; p += 2, i++) + grip[i] = xtoi_2 (p); + + if (!agent_key_available (grip)) + continue; /* The key is already available. */ + + /* Unknown key - store it. */ + rc = agent_card_readkey (ctrl, item->id, &pubkey); + if (rc) + { + log_debug ("agent_card_readkey failed: %s\n", gpg_strerror (rc)); + goto leave; + } + + { + unsigned char *shadow_info = make_shadow_info (serialno, item->id); + if (!shadow_info) + { + rc = gpg_error (GPG_ERR_ENOMEM); + xfree (pubkey); + goto leave; + } + rc = agent_shadow_key (pubkey, shadow_info, &shdkey); + xfree (shadow_info); + } + xfree (pubkey); + if (rc) + { + log_error ("shadowing the key failed: %s\n", gpg_strerror (rc)); + goto leave; + } + n = gcry_sexp_canon_len (shdkey, 0, NULL, NULL); + assert (n); + + rc = agent_write_private_key (grip, shdkey, n, 0); + xfree (shdkey); + if (rc) + { + log_error ("error writing key: %s\n", gpg_strerror (rc)); + goto leave; + } + + if (opt.verbose) + log_info ("stored\n"); + + if (assuan_context) + { + CERTINFO citem; + + /* only send the certificate if we have not done so before */ + for (citem = cparm.info; citem; citem = citem->next) + { + if (!strcmp (citem->id, item->id)) + break; + } + if (!citem) + { + rc = send_cert_back (ctrl, item->id, assuan_context); + if (rc) + goto leave; + } + } + } + + + leave: + xfree (serialno); + release_keypair_info (parm.info); + release_certinfo (cparm.info); + release_sinfo (sparm.info); + return rc; +} + + diff --git a/agent/minip12.c b/agent/minip12.c new file mode 100644 index 000000000..536170856 --- /dev/null +++ b/agent/minip12.c @@ -0,0 +1,2176 @@ +/* minip12.c - A minimal pkcs-12 implementation. + * Copyright (C) 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. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include +#include +#include +#include +#include + +#ifdef TEST +#include +#include +#include +#endif + +#include "../jnlib/logging.h" +#include "minip12.h" + +#ifndef DIM +#define DIM(v) (sizeof(v)/sizeof((v)[0])) +#endif + +enum +{ + UNIVERSAL = 0, + APPLICATION = 1, + CONTEXT = 2, + PRIVATE = 3 +}; + + +enum +{ + 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 +}; + + +static unsigned char const oid_data[9] = { + 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x01 }; +static unsigned char const oid_encryptedData[9] = { + 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x06 }; +static unsigned char const oid_pkcs_12_keyBag[11] = { + 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x0C, 0x0A, 0x01, 0x01 }; +static unsigned char const oid_pkcs_12_pkcs_8ShroudedKeyBag[11] = { + 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x0C, 0x0A, 0x01, 0x02 }; +static unsigned char const oid_pkcs_12_CertBag[11] = { + 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x0C, 0x0A, 0x01, 0x03 }; +static unsigned char const oid_pkcs_12_CrlBag[11] = { + 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x0C, 0x0A, 0x01, 0x04 }; + +static unsigned char const oid_pbeWithSHAAnd3_KeyTripleDES_CBC[10] = { + 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x0C, 0x01, 0x03 }; +static unsigned char const oid_pbeWithSHAAnd40BitRC2_CBC[10] = { + 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x0C, 0x01, 0x06 }; +static unsigned char const oid_x509Certificate_for_pkcs_12[10] = { + 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x16, 0x01 }; + + +static unsigned char const oid_rsaEncryption[9] = { + 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01 }; + + +static unsigned char const data_3desiter2048[30] = { + 0x30, 0x1C, 0x06, 0x0A, 0x2A, 0x86, 0x48, 0x86, + 0xF7, 0x0D, 0x01, 0x0C, 0x01, 0x03, 0x30, 0x0E, + 0x04, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x02, 0x02, 0x08, 0x00 }; +#define DATA_3DESITER2048_SALT_OFF 18 + +static unsigned char const data_rc2iter2048[30] = { + 0x30, 0x1C, 0x06, 0x0A, 0x2A, 0x86, 0x48, 0x86, + 0xF7, 0x0D, 0x01, 0x0C, 0x01, 0x06, 0x30, 0x0E, + 0x04, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x02, 0x02, 0x08, 0x00 }; +#define DATA_RC2ITER2048_SALT_OFF 18 + +static unsigned char const data_mactemplate[51] = { + 0x30, 0x31, 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, + 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05, 0x00, 0x04, + 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x08, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x02, + 0x02, 0x08, 0x00 }; +#define DATA_MACTEMPLATE_MAC_OFF 17 +#define DATA_MACTEMPLATE_SALT_OFF 39 + +static unsigned char const data_attrtemplate[106] = { + 0x31, 0x7c, 0x30, 0x55, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x14, 0x31, + 0x48, 0x1e, 0x46, 0x00, 0x47, 0x00, 0x6e, 0x00, + 0x75, 0x00, 0x50, 0x00, 0x47, 0x00, 0x20, 0x00, + 0x65, 0x00, 0x78, 0x00, 0x70, 0x00, 0x6f, 0x00, + 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, + 0x20, 0x00, 0x63, 0x00, 0x65, 0x00, 0x72, 0x00, + 0x74, 0x00, 0x69, 0x00, 0x66, 0x00, 0x69, 0x00, + 0x63, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, + 0x20, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, + 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, + 0x66, 0x30, 0x23, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x15, 0x31, 0x16, + 0x04, 0x14 }; /* Need to append SHA-1 digest. */ +#define DATA_ATTRTEMPLATE_KEYID_OFF 73 + +struct buffer_s +{ + unsigned char *buffer; + size_t length; +}; + + +struct tag_info +{ + int class; + int is_constructed; + unsigned long tag; + unsigned long length; /* length part of the TLV */ + int nhdr; + int ndef; /* It is an indefinite length */ +}; + + +/* Parse the buffer at the address BUFFER which is of SIZE and return + the tag and the length part from the TLV triplet. Update BUFFER + and SIZE on success. Checks that the encoded length does not + exhaust the length of the provided buffer. */ +static int +parse_tag (unsigned char const **buffer, size_t *size, struct tag_info *ti) +{ + int c; + unsigned long tag; + const unsigned char *buf = *buffer; + size_t length = *size; + + ti->length = 0; + ti->ndef = 0; + ti->nhdr = 0; + + /* Get the tag */ + if (!length) + return -1; /* premature eof */ + c = *buf++; length--; + ti->nhdr++; + + ti->class = (c & 0xc0) >> 6; + ti->is_constructed = !!(c & 0x20); + tag = c & 0x1f; + + if (tag == 0x1f) + { + tag = 0; + do + { + tag <<= 7; + if (!length) + return -1; /* premature eof */ + c = *buf++; length--; + ti->nhdr++; + tag |= c & 0x7f; + } + while (c & 0x80); + } + ti->tag = tag; + + /* Get the length */ + if (!length) + return -1; /* prematureeof */ + c = *buf++; length--; + ti->nhdr++; + + if ( !(c & 0x80) ) + ti->length = c; + else if (c == 0x80) + ti->ndef = 1; + else if (c == 0xff) + return -1; /* forbidden length value */ + else + { + unsigned long len = 0; + int count = c & 0x7f; + + for (; count; count--) + { + len <<= 8; + if (!length) + return -1; /* premature_eof */ + c = *buf++; length--; + ti->nhdr++; + len |= c & 0xff; + } + ti->length = len; + } + + if (ti->class == UNIVERSAL && !ti->tag) + ti->length = 0; + + if (ti->length > length) + return -1; /* data larger than buffer. */ + + *buffer = buf; + *size = length; + return 0; +} + + +/* Given an ASN.1 chunk of a structure like: + + 24 NDEF: OCTET STRING -- This is not passed to us + 04 1: OCTET STRING -- INPUT point s to here + : 30 + 04 1: OCTET STRING + : 80 + [...] + 04 2: OCTET STRING + : 00 00 + : } -- This denotes a Null tag and are the last + -- two bytes in INPUT. + + Create a new buffer with the content of that octet string. INPUT + is the orginal buffer with a length as stored at LENGTH. Returns + NULL on error or a new malloced buffer with the length of this new + buffer stored at LENGTH and the number of bytes parsed from input + are added to the value stored at INPUT_CONSUMED. INPUT_CONSUMED is + allowed to be passed as NULL if the caller is not interested in + this value. */ +static unsigned char * +cram_octet_string (const unsigned char *input, size_t *length, + size_t *input_consumed) +{ + const unsigned char *s = input; + size_t n = *length; + unsigned char *output, *d; + struct tag_info ti; + + /* Allocate output buf. We know that it won't be longer than the + input buffer. */ + d = output = gcry_malloc (n); + if (!output) + goto bailout; + + for (;;) + { + if (parse_tag (&s, &n, &ti)) + goto bailout; + if (ti.class == UNIVERSAL && ti.tag == TAG_OCTET_STRING + && !ti.ndef && !ti.is_constructed) + { + memcpy (d, s, ti.length); + s += ti.length; + d += ti.length; + n -= ti.length; + } + else if (ti.class == UNIVERSAL && !ti.tag && !ti.is_constructed) + break; /* Ready */ + else + goto bailout; + } + + + *length = d - output; + if (input_consumed) + *input_consumed += s - input; + return output; + + bailout: + if (input_consumed) + *input_consumed += s - input; + gcry_free (output); + return NULL; +} + + + +static int +string_to_key (int id, char *salt, size_t saltlen, int iter, const char *pw, + int req_keylen, unsigned char *keybuf) +{ + int rc, i, j; + gcry_md_hd_t md; + gcry_mpi_t num_b1 = NULL; + int pwlen; + unsigned char hash[20], buf_b[64], buf_i[128], *p; + size_t cur_keylen; + size_t n; + + cur_keylen = 0; + pwlen = strlen (pw); + if (pwlen > 63/2) + { + log_error ("password too long\n"); + return -1; + } + + if (saltlen < 8) + { + log_error ("salt too short\n"); + return -1; + } + + /* Store salt and password in BUF_I */ + p = buf_i; + for(i=0; i < 64; i++) + *p++ = salt [i%saltlen]; + for(i=j=0; i < 64; i += 2) + { + *p++ = 0; + *p++ = pw[j]; + if (++j > pwlen) /* Note, that we include the trailing zero */ + j = 0; + } + + for (;;) + { + rc = gcry_md_open (&md, GCRY_MD_SHA1, 0); + if (rc) + { + log_error ( "gcry_md_open failed: %s\n", gpg_strerror (rc)); + return rc; + } + for(i=0; i < 64; i++) + gcry_md_putc (md, id); + gcry_md_write (md, buf_i, 128); + memcpy (hash, gcry_md_read (md, 0), 20); + gcry_md_close (md); + for (i=1; i < iter; i++) + gcry_md_hash_buffer (GCRY_MD_SHA1, hash, hash, 20); + + for (i=0; i < 20 && cur_keylen < req_keylen; i++) + keybuf[cur_keylen++] = hash[i]; + if (cur_keylen == req_keylen) + { + gcry_mpi_release (num_b1); + return 0; /* ready */ + } + + /* need more bytes. */ + for(i=0; i < 64; i++) + buf_b[i] = hash[i % 20]; + rc = gcry_mpi_scan (&num_b1, GCRYMPI_FMT_USG, buf_b, 64, &n); + if (rc) + { + log_error ( "gcry_mpi_scan failed: %s\n", gpg_strerror (rc)); + return -1; + } + gcry_mpi_add_ui (num_b1, num_b1, 1); + for (i=0; i < 128; i += 64) + { + gcry_mpi_t num_ij; + + rc = gcry_mpi_scan (&num_ij, GCRYMPI_FMT_USG, buf_i + i, 64, &n); + if (rc) + { + log_error ( "gcry_mpi_scan failed: %s\n", + gpg_strerror (rc)); + return -1; + } + gcry_mpi_add (num_ij, num_ij, num_b1); + gcry_mpi_clear_highbit (num_ij, 64*8); + rc = gcry_mpi_print (GCRYMPI_FMT_USG, buf_i + i, 64, &n, num_ij); + if (rc) + { + log_error ( "gcry_mpi_print failed: %s\n", + gpg_strerror (rc)); + return -1; + } + gcry_mpi_release (num_ij); + } + } +} + + +static int +set_key_iv (gcry_cipher_hd_t chd, char *salt, size_t saltlen, int iter, + const char *pw, int keybytes) +{ + unsigned char keybuf[24]; + int rc; + + assert (keybytes == 5 || keybytes == 24); + if (string_to_key (1, salt, saltlen, iter, pw, keybytes, keybuf)) + return -1; + rc = gcry_cipher_setkey (chd, keybuf, keybytes); + if (rc) + { + log_error ( "gcry_cipher_setkey failed: %s\n", gpg_strerror (rc)); + return -1; + } + + if (string_to_key (2, salt, saltlen, iter, pw, 8, keybuf)) + return -1; + rc = gcry_cipher_setiv (chd, keybuf, 8); + if (rc) + { + log_error ("gcry_cipher_setiv failed: %s\n", gpg_strerror (rc)); + return -1; + } + return 0; +} + + +static void +crypt_block (unsigned char *buffer, size_t length, char *salt, size_t saltlen, + int iter, const char *pw, int cipher_algo, int encrypt) +{ + gcry_cipher_hd_t chd; + int rc; + + rc = gcry_cipher_open (&chd, cipher_algo, GCRY_CIPHER_MODE_CBC, 0); + if (rc) + { + log_error ( "gcry_cipher_open failed: %s\n", gpg_strerror(rc)); + wipememory (buffer, length); + return; + } + if (set_key_iv (chd, salt, saltlen, iter, pw, + cipher_algo == GCRY_CIPHER_RFC2268_40? 5:24)) + { + wipememory (buffer, length); + goto leave; + } + + rc = encrypt? gcry_cipher_encrypt (chd, buffer, length, NULL, 0) + : gcry_cipher_decrypt (chd, buffer, length, NULL, 0); + + if (rc) + { + wipememory (buffer, length); + log_error ( "en/de-crytion failed: %s\n", gpg_strerror (rc)); + goto leave; + } + + leave: + gcry_cipher_close (chd); +} + + + +/* Note: If R_RESULT is passed as NULL, a key object as already be + processed and thus we need to skip it here. */ +static int +parse_bag_encrypted_data (const unsigned char *buffer, size_t length, + int startoffset, size_t *r_consumed, const char *pw, + void (*certcb)(void*, const unsigned char*, size_t), + void *certcbarg, gcry_mpi_t **r_result) +{ + struct tag_info ti; + const unsigned char *p = buffer; + const unsigned char *p_start = buffer; + size_t n = length; + const char *where; + char salt[16]; + size_t saltlen; + unsigned int iter; + unsigned char *plain = NULL; + int bad_pass = 0; + unsigned char *cram_buffer = NULL; + size_t consumed = 0; /* Number of bytes consumed from the orginal buffer. */ + int is_3des = 0; + gcry_mpi_t *result = NULL; + int result_count; + + if (r_result) + *r_result = NULL; + where = "start"; + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (ti.class != CONTEXT || ti.tag) + goto bailout; + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (ti.tag != TAG_SEQUENCE) + goto bailout; + + where = "bag.encryptedData.version"; + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (ti.tag != TAG_INTEGER || ti.length != 1 || *p != 0) + goto bailout; + p++; n--; + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (ti.tag != TAG_SEQUENCE) + goto bailout; + + where = "bag.encryptedData.data"; + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (ti.tag != TAG_OBJECT_ID || ti.length != DIM(oid_data) + || memcmp (p, oid_data, DIM(oid_data))) + goto bailout; + p += DIM(oid_data); + n -= DIM(oid_data); + + where = "bag.encryptedData.keyinfo"; + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (ti.class || ti.tag != TAG_SEQUENCE) + goto bailout; + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (!ti.class && ti.tag == TAG_OBJECT_ID + && ti.length == DIM(oid_pbeWithSHAAnd40BitRC2_CBC) + && !memcmp (p, oid_pbeWithSHAAnd40BitRC2_CBC, + DIM(oid_pbeWithSHAAnd40BitRC2_CBC))) + { + p += DIM(oid_pbeWithSHAAnd40BitRC2_CBC); + n -= DIM(oid_pbeWithSHAAnd40BitRC2_CBC); + } + else if (!ti.class && ti.tag == TAG_OBJECT_ID + && ti.length == DIM(oid_pbeWithSHAAnd3_KeyTripleDES_CBC) + && !memcmp (p, oid_pbeWithSHAAnd3_KeyTripleDES_CBC, + DIM(oid_pbeWithSHAAnd3_KeyTripleDES_CBC))) + { + p += DIM(oid_pbeWithSHAAnd3_KeyTripleDES_CBC); + n -= DIM(oid_pbeWithSHAAnd3_KeyTripleDES_CBC); + is_3des = 1; + } + else + goto bailout; + + where = "rc2or3des-params"; + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (ti.class || ti.tag != TAG_SEQUENCE) + goto bailout; + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (ti.class || ti.tag != TAG_OCTET_STRING + || ti.length < 8 || ti.length > 16 ) + goto bailout; + saltlen = ti.length; + memcpy (salt, p, saltlen); + p += saltlen; + n -= saltlen; + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (ti.class || ti.tag != TAG_INTEGER || !ti.length ) + goto bailout; + for (iter=0; ti.length; ti.length--) + { + iter <<= 8; + iter |= (*p++) & 0xff; + n--; + } + + where = "rc2or3des-ciphertext"; + if (parse_tag (&p, &n, &ti)) + goto bailout; + + consumed = p - p_start; + if (ti.class == CONTEXT && ti.tag == 0 && ti.is_constructed && ti.ndef) + { + /* Mozilla exported certs now come with single byte chunks of + octect strings. (Mozilla Firefox 1.0.4). Arghh. */ + where = "cram-rc2or3des-ciphertext"; + cram_buffer = cram_octet_string ( p, &n, &consumed); + if (!cram_buffer) + goto bailout; + p = p_start = cram_buffer; + if (r_consumed) + *r_consumed = consumed; + r_consumed = NULL; /* Ugly hack to not update that value any further. */ + ti.length = n; + } + else if (ti.class == CONTEXT && ti.tag == 0 && ti.length ) + ; + else + goto bailout; + + log_info ("%lu bytes of %s encrypted text\n",ti.length,is_3des?"3DES":"RC2"); + + plain = gcry_malloc_secure (ti.length); + if (!plain) + { + log_error ("error allocating decryption buffer\n"); + goto bailout; + } + memcpy (plain, p, ti.length); + crypt_block (plain, ti.length, salt, saltlen, + iter, pw, + is_3des? GCRY_CIPHER_3DES : GCRY_CIPHER_RFC2268_40, + 0); + n = ti.length; + startoffset = 0; + p_start = p = plain; + +/* { */ +/* # warning debug code is enabled */ +/* FILE *fp = fopen ("tmp-rc2-plain.der", "wb"); */ +/* if (!fp || fwrite (p, n, 1, fp) != 1) */ +/* exit (2); */ +/* fclose (fp); */ +/* } */ + + where = "outer.outer.seq"; + if (parse_tag (&p, &n, &ti)) + { + bad_pass = 1; + goto bailout; + } + if (ti.class || ti.tag != TAG_SEQUENCE) + { + bad_pass = 1; + goto bailout; + } + + if (parse_tag (&p, &n, &ti)) + { + bad_pass = 1; + goto bailout; + } + + /* Loop over all certificates inside the bag. */ + while (n) + { + int iscrlbag = 0; + int iskeybag = 0; + + where = "certbag.nextcert"; + if (ti.class || ti.tag != TAG_SEQUENCE) + goto bailout; + + where = "certbag.objectidentifier"; + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (ti.class || ti.tag != TAG_OBJECT_ID) + goto bailout; + if ( ti.length == DIM(oid_pkcs_12_CertBag) + && !memcmp (p, oid_pkcs_12_CertBag, DIM(oid_pkcs_12_CertBag))) + { + p += DIM(oid_pkcs_12_CertBag); + n -= DIM(oid_pkcs_12_CertBag); + } + else if ( ti.length == DIM(oid_pkcs_12_CrlBag) + && !memcmp (p, oid_pkcs_12_CrlBag, DIM(oid_pkcs_12_CrlBag))) + { + p += DIM(oid_pkcs_12_CrlBag); + n -= DIM(oid_pkcs_12_CrlBag); + iscrlbag = 1; + } + else if ( ti.length == DIM(oid_pkcs_12_keyBag) + && !memcmp (p, oid_pkcs_12_keyBag, DIM(oid_pkcs_12_keyBag))) + { + /* The TrustedMIME plugin for MS Outlook started to create + files with just one outer 3DES encrypted container and + inside the certificates as well as the key. */ + p += DIM(oid_pkcs_12_keyBag); + n -= DIM(oid_pkcs_12_keyBag); + iskeybag = 1; + } + else + goto bailout; + + where = "certbag.before.certheader"; + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (ti.class != CONTEXT || ti.tag) + goto bailout; + if (iscrlbag) + { + log_info ("skipping unsupported crlBag\n"); + p += ti.length; + n -= ti.length; + } + else if (iskeybag && (result || !r_result)) + { + log_info ("one keyBag already processed; skipping this one\n"); + p += ti.length; + n -= ti.length; + } + else if (iskeybag) + { + int len; + + log_info ("processing simple keyBag\n"); + + /* Fixme: This code is duplicated from parse_bag_data. */ + if (parse_tag (&p, &n, &ti) || ti.class || ti.tag != TAG_SEQUENCE) + goto bailout; + if (parse_tag (&p, &n, &ti) || ti.class || ti.tag != TAG_INTEGER + || ti.length != 1 || *p) + goto bailout; + p++; n--; + if (parse_tag (&p, &n, &ti) || ti.class || ti.tag != TAG_SEQUENCE) + goto bailout; + len = ti.length; + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (len < ti.nhdr) + goto bailout; + len -= ti.nhdr; + if (ti.class || ti.tag != TAG_OBJECT_ID + || ti.length != DIM(oid_rsaEncryption) + || memcmp (p, oid_rsaEncryption, + DIM(oid_rsaEncryption))) + goto bailout; + p += DIM (oid_rsaEncryption); + n -= DIM (oid_rsaEncryption); + if (len < ti.length) + goto bailout; + len -= ti.length; + if (n < len) + goto bailout; + p += len; + n -= len; + if ( parse_tag (&p, &n, &ti) + || ti.class || ti.tag != TAG_OCTET_STRING) + goto bailout; + if ( parse_tag (&p, &n, &ti) + || ti.class || ti.tag != TAG_SEQUENCE) + goto bailout; + len = ti.length; + + result = gcry_calloc (10, sizeof *result); + if (!result) + { + log_error ( "error allocating result array\n"); + goto bailout; + } + result_count = 0; + + where = "reading.keybag.key-parameters"; + for (result_count = 0; len && result_count < 9;) + { + if ( parse_tag (&p, &n, &ti) + || ti.class || ti.tag != TAG_INTEGER) + goto bailout; + if (len < ti.nhdr) + goto bailout; + len -= ti.nhdr; + if (len < ti.length) + goto bailout; + len -= ti.length; + if (!result_count && ti.length == 1 && !*p) + ; /* ignore the very first one if it is a 0 */ + else + { + int rc; + + rc = gcry_mpi_scan (result+result_count, GCRYMPI_FMT_USG, p, + ti.length, NULL); + if (rc) + { + log_error ("error parsing key parameter: %s\n", + gpg_strerror (rc)); + goto bailout; + } + result_count++; + } + p += ti.length; + n -= ti.length; + } + if (len) + goto bailout; + } + else + { + log_info ("processing certBag\n"); + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (ti.class || ti.tag != TAG_SEQUENCE) + goto bailout; + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (ti.class || ti.tag != TAG_OBJECT_ID + || ti.length != DIM(oid_x509Certificate_for_pkcs_12) + || memcmp (p, oid_x509Certificate_for_pkcs_12, + DIM(oid_x509Certificate_for_pkcs_12))) + goto bailout; + p += DIM(oid_x509Certificate_for_pkcs_12); + n -= DIM(oid_x509Certificate_for_pkcs_12); + + where = "certbag.before.octetstring"; + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (ti.class != CONTEXT || ti.tag) + goto bailout; + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (ti.class || ti.tag != TAG_OCTET_STRING || ti.ndef) + goto bailout; + + /* Return the certificate. */ + if (certcb) + certcb (certcbarg, p, ti.length); + + p += ti.length; + n -= ti.length; + } + + /* Ugly hack to cope with the padding: Forget about the rest if + that is less or equal to the cipher's block length. We can + reasonable assume that all valid data will be longer than + just one block. */ + if (n <= 8) + n = 0; + + /* Skip the optional SET with the pkcs12 cert attributes. */ + if (n) + { + where = "bag.attributes"; + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (!ti.class && ti.tag == TAG_SEQUENCE) + ; /* No attributes. */ + else if (!ti.class && ti.tag == TAG_SET && !ti.ndef) + { /* The optional SET. */ + p += ti.length; + n -= ti.length; + if (n <= 8) + n = 0; + if (n && parse_tag (&p, &n, &ti)) + goto bailout; + } + else + goto bailout; + } + } + + if (r_consumed) + *r_consumed = consumed; + gcry_free (plain); + gcry_free (cram_buffer); + if (r_result) + *r_result = result; + return 0; + + bailout: + if (result) + { + int i; + + for (i=0; result[i]; i++) + gcry_mpi_release (result[i]); + gcry_free (result); + } + if (r_consumed) + *r_consumed = consumed; + gcry_free (plain); + gcry_free (cram_buffer); + log_error ("encryptedData error at \"%s\", offset %u\n", + where, (p - p_start)+startoffset); + if (bad_pass) + { + /* Note, that the following string might be used by other programs + to check for a bad passphrase; it should therefore not be + translated or changed. */ + log_error ("possibly bad passphrase given\n"); + } + return -1; +} + +static gcry_mpi_t * +parse_bag_data (const unsigned char *buffer, size_t length, int startoffset, + size_t *r_consumed, const char *pw) +{ + int rc; + struct tag_info ti; + const unsigned char *p = buffer; + const unsigned char *p_start = buffer; + size_t n = length; + const char *where; + char salt[16]; + size_t saltlen; + unsigned int iter; + int len; + unsigned char *plain = NULL; + gcry_mpi_t *result = NULL; + int result_count, i; + unsigned char *cram_buffer = NULL; + size_t consumed = 0; /* Number of bytes consumed from the orginal buffer. */ + + where = "start"; + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (ti.class != CONTEXT || ti.tag) + goto bailout; + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (ti.class || ti.tag != TAG_OCTET_STRING) + goto bailout; + + consumed = p - p_start; + if (ti.is_constructed && ti.ndef) + { + /* Mozilla exported certs now come with single byte chunks of + octect strings. (Mozilla Firefox 1.0.4). Arghh. */ + where = "cram-data.outersegs"; + cram_buffer = cram_octet_string ( p, &n, &consumed); + if (!cram_buffer) + goto bailout; + p = p_start = cram_buffer; + if (r_consumed) + *r_consumed = consumed; + r_consumed = NULL; /* Ugly hack to not update that value any further. */ + } + + + where = "data.outerseqs"; + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (ti.class || ti.tag != TAG_SEQUENCE) + goto bailout; + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (ti.class || ti.tag != TAG_SEQUENCE) + goto bailout; + + where = "data.objectidentifier"; + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (ti.class || ti.tag != TAG_OBJECT_ID + || ti.length != DIM(oid_pkcs_12_pkcs_8ShroudedKeyBag) + || memcmp (p, oid_pkcs_12_pkcs_8ShroudedKeyBag, + DIM(oid_pkcs_12_pkcs_8ShroudedKeyBag))) + goto bailout; + p += DIM(oid_pkcs_12_pkcs_8ShroudedKeyBag); + n -= DIM(oid_pkcs_12_pkcs_8ShroudedKeyBag); + + where = "shrouded,outerseqs"; + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (ti.class != CONTEXT || ti.tag) + goto bailout; + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (ti.class || ti.tag != TAG_SEQUENCE) + goto bailout; + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (ti.class || ti.tag != TAG_SEQUENCE) + goto bailout; + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (ti.class || ti.tag != TAG_OBJECT_ID + || ti.length != DIM(oid_pbeWithSHAAnd3_KeyTripleDES_CBC) + || memcmp (p, oid_pbeWithSHAAnd3_KeyTripleDES_CBC, + DIM(oid_pbeWithSHAAnd3_KeyTripleDES_CBC))) + goto bailout; + p += DIM(oid_pbeWithSHAAnd3_KeyTripleDES_CBC); + n -= DIM(oid_pbeWithSHAAnd3_KeyTripleDES_CBC); + + where = "3des-params"; + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (ti.class || ti.tag != TAG_SEQUENCE) + goto bailout; + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (ti.class || ti.tag != TAG_OCTET_STRING + || ti.length < 8 || ti.length > 16) + goto bailout; + saltlen = ti.length; + memcpy (salt, p, saltlen); + p += saltlen; + n -= saltlen; + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (ti.class || ti.tag != TAG_INTEGER || !ti.length ) + goto bailout; + for (iter=0; ti.length; ti.length--) + { + iter <<= 8; + iter |= (*p++) & 0xff; + n--; + } + + where = "3des-ciphertext"; + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (ti.class || ti.tag != TAG_OCTET_STRING || !ti.length ) + goto bailout; + + log_info ("%lu bytes of 3DES encrypted text\n", ti.length); + + plain = gcry_malloc_secure (ti.length); + if (!plain) + { + log_error ("error allocating decryption buffer\n"); + goto bailout; + } + memcpy (plain, p, ti.length); + consumed += p - p_start + ti.length; + crypt_block (plain, ti.length, salt, saltlen, iter, pw, GCRY_CIPHER_3DES, 0); + n = ti.length; + startoffset = 0; + p_start = p = plain; + +/* { */ +/* # warning debug code is enabled */ +/* FILE *fp = fopen ("tmp-rc2-plain-key.der", "wb"); */ +/* if (!fp || fwrite (p, n, 1, fp) != 1) */ +/* exit (2); */ +/* fclose (fp); */ +/* } */ + + + where = "decrypted-text"; + if (parse_tag (&p, &n, &ti) || ti.class || ti.tag != TAG_SEQUENCE) + goto bailout; + if (parse_tag (&p, &n, &ti) || ti.class || ti.tag != TAG_INTEGER + || ti.length != 1 || *p) + goto bailout; + p++; n--; + if (parse_tag (&p, &n, &ti) || ti.class || ti.tag != TAG_SEQUENCE) + goto bailout; + len = ti.length; + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (len < ti.nhdr) + goto bailout; + len -= ti.nhdr; + if (ti.class || ti.tag != TAG_OBJECT_ID + || ti.length != DIM(oid_rsaEncryption) + || memcmp (p, oid_rsaEncryption, + DIM(oid_rsaEncryption))) + goto bailout; + p += DIM (oid_rsaEncryption); + n -= DIM (oid_rsaEncryption); + if (len < ti.length) + goto bailout; + len -= ti.length; + if (n < len) + goto bailout; + p += len; + n -= len; + if (parse_tag (&p, &n, &ti) || ti.class || ti.tag != TAG_OCTET_STRING) + goto bailout; + if (parse_tag (&p, &n, &ti) || ti.class || ti.tag != TAG_SEQUENCE) + goto bailout; + len = ti.length; + + result = gcry_calloc (10, sizeof *result); + if (!result) + { + log_error ( "error allocating result array\n"); + goto bailout; + } + result_count = 0; + + where = "reading.key-parameters"; + for (result_count=0; len && result_count < 9;) + { + if (parse_tag (&p, &n, &ti) || ti.class || ti.tag != TAG_INTEGER) + goto bailout; + if (len < ti.nhdr) + goto bailout; + len -= ti.nhdr; + if (len < ti.length) + goto bailout; + len -= ti.length; + if (!result_count && ti.length == 1 && !*p) + ; /* ignore the very first one if it is a 0 */ + else + { + rc = gcry_mpi_scan (result+result_count, GCRYMPI_FMT_USG, p, + ti.length, NULL); + if (rc) + { + log_error ("error parsing key parameter: %s\n", + gpg_strerror (rc)); + goto bailout; + } + result_count++; + } + p += ti.length; + n -= ti.length; + } + if (len) + goto bailout; + + gcry_free (cram_buffer); + if (r_consumed) + *r_consumed = consumed; + return result; + + bailout: + gcry_free (plain); + if (result) + { + for (i=0; result[i]; i++) + gcry_mpi_release (result[i]); + gcry_free (result); + } + gcry_free (cram_buffer); + log_error ( "data error at \"%s\", offset %u\n", + where, (p - buffer) + startoffset); + if (r_consumed) + *r_consumed = consumed; + return NULL; +} + + +/* Parse a PKCS12 object and return an array of MPI representing the + secret key parameters. This is a very limited implementation in + that it is only able to look for 3DES encoded encryptedData and + tries to extract the first private key object it finds. In case of + an error NULL is returned. CERTCB and CERRTCBARG are used to pass + X.509 certificates back to the caller. */ +gcry_mpi_t * +p12_parse (const unsigned char *buffer, size_t length, const char *pw, + void (*certcb)(void*, const unsigned char*, size_t), + void *certcbarg) +{ + struct tag_info ti; + const unsigned char *p = buffer; + const unsigned char *p_start = buffer; + size_t n = length; + const char *where; + int bagseqlength, len; + int bagseqndef, lenndef; + gcry_mpi_t *result = NULL; + unsigned char *cram_buffer = NULL; + + where = "pfx"; + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (ti.tag != TAG_SEQUENCE) + goto bailout; + + where = "pfxVersion"; + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (ti.tag != TAG_INTEGER || ti.length != 1 || *p != 3) + goto bailout; + p++; n--; + + where = "authSave"; + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (ti.tag != TAG_SEQUENCE) + goto bailout; + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (ti.tag != TAG_OBJECT_ID || ti.length != DIM(oid_data) + || memcmp (p, oid_data, DIM(oid_data))) + goto bailout; + p += DIM(oid_data); + n -= DIM(oid_data); + + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (ti.class != CONTEXT || ti.tag) + goto bailout; + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (ti.class != UNIVERSAL || ti.tag != TAG_OCTET_STRING) + goto bailout; + + if (ti.is_constructed && ti.ndef) + { + /* Mozilla exported certs now come with single byte chunks of + octect strings. (Mozilla Firefox 1.0.4). Arghh. */ + where = "cram-bags"; + cram_buffer = cram_octet_string ( p, &n, NULL); + if (!cram_buffer) + goto bailout; + p = p_start = cram_buffer; + } + + where = "bags"; + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (ti.class != UNIVERSAL || ti.tag != TAG_SEQUENCE) + goto bailout; + bagseqndef = ti.ndef; + bagseqlength = ti.length; + while (bagseqlength || bagseqndef) + { +/* log_debug ( "at offset %u\n", (p - p_start)); */ + where = "bag-sequence"; + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (bagseqndef && ti.class == UNIVERSAL && !ti.tag && !ti.is_constructed) + break; /* Ready */ + if (ti.class != UNIVERSAL || ti.tag != TAG_SEQUENCE) + goto bailout; + + if (!bagseqndef) + { + if (bagseqlength < ti.nhdr) + goto bailout; + bagseqlength -= ti.nhdr; + if (bagseqlength < ti.length) + goto bailout; + bagseqlength -= ti.length; + } + lenndef = ti.ndef; + len = ti.length; + + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (lenndef) + len = ti.nhdr; + else + len -= ti.nhdr; + + if (ti.tag == TAG_OBJECT_ID && ti.length == DIM(oid_encryptedData) + && !memcmp (p, oid_encryptedData, DIM(oid_encryptedData))) + { + size_t consumed = 0; + + p += DIM(oid_encryptedData); + n -= DIM(oid_encryptedData); + if (!lenndef) + len -= DIM(oid_encryptedData); + where = "bag.encryptedData"; + if (parse_bag_encrypted_data (p, n, (p - p_start), &consumed, pw, + certcb, certcbarg, + result? NULL : &result)) + goto bailout; + if (lenndef) + len += consumed; + } + else if (ti.tag == TAG_OBJECT_ID && ti.length == DIM(oid_data) + && !memcmp (p, oid_data, DIM(oid_data))) + { + if (result) + { + log_info ("already got an key object, skipping this one\n"); + p += ti.length; + n -= ti.length; + } + else + { + size_t consumed = 0; + + p += DIM(oid_data); + n -= DIM(oid_data); + if (!lenndef) + len -= DIM(oid_data); + result = parse_bag_data (p, n, (p - p_start), &consumed, pw); + if (!result) + goto bailout; + if (lenndef) + len += consumed; + } + } + else + { + log_info ("unknown bag type - skipped\n"); + p += ti.length; + n -= ti.length; + } + + if (len < 0 || len > n) + goto bailout; + p += len; + n -= len; + if (lenndef) + { + /* Need to skip the Null Tag. */ + if (parse_tag (&p, &n, &ti)) + goto bailout; + if (!(ti.class == UNIVERSAL && !ti.tag && !ti.is_constructed)) + goto bailout; + } + } + + gcry_free (cram_buffer); + return result; + bailout: + log_error ("error at \"%s\", offset %u\n", where, (p - p_start)); + if (result) + { + int i; + + for (i=0; result[i]; i++) + gcry_mpi_release (result[i]); + gcry_free (result); + } + gcry_free (cram_buffer); + return NULL; +} + + + +static size_t +compute_tag_length (size_t n) +{ + int needed = 0; + + if (n < 128) + needed += 2; /* tag and one length byte */ + else if (n < 256) + needed += 3; /* tag, number of length bytes, 1 length byte */ + else if (n < 65536) + needed += 4; /* tag, number of length bytes, 2 length bytes */ + else + { + log_error ("object too larger to encode\n"); + return 0; + } + return needed; +} + +static unsigned char * +store_tag_length (unsigned char *p, int tag, size_t n) +{ + if (tag == TAG_SEQUENCE) + tag |= 0x20; /* constructed */ + + *p++ = tag; + if (n < 128) + *p++ = n; + else if (n < 256) + { + *p++ = 0x81; + *p++ = n; + } + else if (n < 65536) + { + *p++ = 0x82; + *p++ = n >> 8; + *p++ = n; + } + + return p; +} + + +/* Create the final PKCS-12 object from the sequences contained in + SEQLIST. PW is the password. That array is terminated with an NULL + object. */ +static unsigned char * +create_final (struct buffer_s *sequences, const char *pw, size_t *r_length) +{ + int i; + size_t needed = 0; + size_t len[8], n; + unsigned char *macstart; + size_t maclen; + unsigned char *result, *p; + size_t resultlen; + char salt[8]; + unsigned char keybuf[20]; + gcry_md_hd_t md; + int rc; + int with_mac = 1; + + + /* 9 steps to create the pkcs#12 Krampf. */ + + /* 8. The MAC. */ + /* We add this at step 0. */ + + /* 7. All the buffers. */ + for (i=0; sequences[i].buffer; i++) + needed += sequences[i].length; + + /* 6. This goes into a sequences. */ + len[6] = needed; + n = compute_tag_length (needed); + needed += n; + + /* 5. Encapsulate all in an octet string. */ + len[5] = needed; + n = compute_tag_length (needed); + needed += n; + + /* 4. And tag it with [0]. */ + len[4] = needed; + n = compute_tag_length (needed); + needed += n; + + /* 3. Prepend an data OID. */ + needed += 2 + DIM (oid_data); + + /* 2. Put all into a sequences. */ + len[2] = needed; + n = compute_tag_length (needed); + needed += n; + + /* 1. Prepend the version integer 3. */ + needed += 3; + + /* 0. And the final outer sequence. */ + if (with_mac) + needed += DIM (data_mactemplate); + len[0] = needed; + n = compute_tag_length (needed); + needed += n; + + /* Allocate a buffer. */ + result = gcry_malloc (needed); + if (!result) + { + log_error ("error allocating buffer\n"); + return NULL; + } + p = result; + + /* 0. Store the very outer sequence. */ + p = store_tag_length (p, TAG_SEQUENCE, len[0]); + + /* 1. Store the version integer 3. */ + *p++ = TAG_INTEGER; + *p++ = 1; + *p++ = 3; + + /* 2. Store another sequence. */ + p = store_tag_length (p, TAG_SEQUENCE, len[2]); + + /* 3. Store the data OID. */ + p = store_tag_length (p, TAG_OBJECT_ID, DIM (oid_data)); + memcpy (p, oid_data, DIM (oid_data)); + p += DIM (oid_data); + + /* 4. Next comes a context tag. */ + p = store_tag_length (p, 0xa0, len[4]); + + /* 5. And an octet string. */ + p = store_tag_length (p, TAG_OCTET_STRING, len[5]); + + /* 6. And the inner sequence. */ + macstart = p; + p = store_tag_length (p, TAG_SEQUENCE, len[6]); + + /* 7. Append all the buffers. */ + for (i=0; sequences[i].buffer; i++) + { + memcpy (p, sequences[i].buffer, sequences[i].length); + p += sequences[i].length; + } + + if (with_mac) + { + /* Intermezzo to compute the MAC. */ + maclen = p - macstart; + gcry_randomize (salt, 8, GCRY_STRONG_RANDOM); + if (string_to_key (3, salt, 8, 2048, pw, 20, keybuf)) + { + gcry_free (result); + return NULL; + } + rc = gcry_md_open (&md, GCRY_MD_SHA1, GCRY_MD_FLAG_HMAC); + if (rc) + { + log_error ("gcry_md_open failed: %s\n", gpg_strerror (rc)); + gcry_free (result); + return NULL; + } + rc = gcry_md_setkey (md, keybuf, 20); + if (rc) + { + log_error ("gcry_md_setkey failed: %s\n", gpg_strerror (rc)); + gcry_md_close (md); + gcry_free (result); + return NULL; + } + gcry_md_write (md, macstart, maclen); + + /* 8. Append the MAC template and fix it up. */ + memcpy (p, data_mactemplate, DIM (data_mactemplate)); + memcpy (p + DATA_MACTEMPLATE_SALT_OFF, salt, 8); + memcpy (p + DATA_MACTEMPLATE_MAC_OFF, gcry_md_read (md, 0), 20); + p += DIM (data_mactemplate); + gcry_md_close (md); + } + + /* Ready. */ + resultlen = p - result; + if (needed != resultlen) + log_debug ("length mismatch: %lu, %lu\n", + (unsigned long)needed, (unsigned long)resultlen); + + *r_length = resultlen; + return result; +} + + +/* Build a DER encoded SEQUENCE with the key: + + SEQUENCE { + INTEGER 0 + SEQUENCE { + OBJECT IDENTIFIER rsaEncryption (1 2 840 113549 1 1 1) + NULL + } + OCTET STRING, encapsulates { + SEQUENCE { + INTEGER 0 + INTEGER + INTEGER + INTEGER + INTEGER + INTEGER + INTEGER + INTEGER + INTEGER + } + } + } +*/ + +static unsigned char * +build_key_sequence (gcry_mpi_t *kparms, size_t *r_length) +{ + int rc, i; + size_t needed, n; + unsigned char *plain, *p; + size_t plainlen; + size_t outseqlen, oidseqlen, octstrlen, inseqlen; + + needed = 3; /* The version(?) integer of value 0. */ + for (i=0; kparms[i]; i++) + { + n = 0; + rc = gcry_mpi_print (GCRYMPI_FMT_STD, NULL, 0, &n, kparms[i]); + if (rc) + { + log_error ("error formatting parameter: %s\n", gpg_strerror (rc)); + return NULL; + } + needed += n; + n = compute_tag_length (n); + if (!n) + return NULL; + needed += n; + } + if (i != 8) + { + log_error ("invalid paramters for p12_build\n"); + return NULL; + } + /* Now this all goes into a sequence. */ + inseqlen = needed; + n = compute_tag_length (needed); + if (!n) + return NULL; + needed += n; + /* Encapsulate all into an octet string. */ + octstrlen = needed; + n = compute_tag_length (needed); + if (!n) + return NULL; + needed += n; + /* Prepend the object identifier sequence. */ + oidseqlen = 2 + DIM (oid_rsaEncryption) + 2; + needed += 2 + oidseqlen; + /* The version number. */ + needed += 3; + /* And finally put the whole thing into a sequence. */ + outseqlen = needed; + n = compute_tag_length (needed); + if (!n) + return NULL; + needed += n; + + /* allocate 8 extra bytes for padding */ + plain = gcry_malloc_secure (needed+8); + if (!plain) + { + log_error ("error allocating encryption buffer\n"); + return NULL; + } + + /* And now fill the plaintext buffer. */ + p = plain; + p = store_tag_length (p, TAG_SEQUENCE, outseqlen); + /* Store version. */ + *p++ = TAG_INTEGER; + *p++ = 1; + *p++ = 0; + /* Store object identifier sequence. */ + p = store_tag_length (p, TAG_SEQUENCE, oidseqlen); + p = store_tag_length (p, TAG_OBJECT_ID, DIM (oid_rsaEncryption)); + memcpy (p, oid_rsaEncryption, DIM (oid_rsaEncryption)); + p += DIM (oid_rsaEncryption); + *p++ = TAG_NULL; + *p++ = 0; + /* Start with the octet string. */ + p = store_tag_length (p, TAG_OCTET_STRING, octstrlen); + p = store_tag_length (p, TAG_SEQUENCE, inseqlen); + /* Store the key parameters. */ + *p++ = TAG_INTEGER; + *p++ = 1; + *p++ = 0; + for (i=0; kparms[i]; i++) + { + n = 0; + rc = gcry_mpi_print (GCRYMPI_FMT_STD, NULL, 0, &n, kparms[i]); + if (rc) + { + log_error ("oops: error formatting parameter: %s\n", + gpg_strerror (rc)); + gcry_free (plain); + return NULL; + } + p = store_tag_length (p, TAG_INTEGER, n); + + n = plain + needed - p; + rc = gcry_mpi_print (GCRYMPI_FMT_STD, p, n, &n, kparms[i]); + if (rc) + { + log_error ("oops: error storing parameter: %s\n", + gpg_strerror (rc)); + gcry_free (plain); + return NULL; + } + p += n; + } + + plainlen = p - plain; + assert (needed == plainlen); + /* Append some pad characters; we already allocated extra space. */ + n = 8 - plainlen % 8; + for (i=0; i < n; i++, plainlen++) + *p++ = n; + + *r_length = plainlen; + return plain; +} + + + +static unsigned char * +build_key_bag (unsigned char *buffer, size_t buflen, char *salt, + const unsigned char *sha1hash, const char *keyidstr, + size_t *r_length) +{ + size_t len[11], needed; + unsigned char *p, *keybag; + size_t keybaglen; + + /* Walk 11 steps down to collect the info: */ + + /* 10. The data goes into an octet string. */ + needed = compute_tag_length (buflen); + needed += buflen; + + /* 9. Prepend the algorithm identifier. */ + needed += DIM (data_3desiter2048); + + /* 8. Put a sequence around. */ + len[8] = needed; + needed += compute_tag_length (needed); + + /* 7. Prepend a [0] tag. */ + len[7] = needed; + needed += compute_tag_length (needed); + + /* 6b. The attributes which are appended at the end. */ + if (sha1hash) + needed += DIM (data_attrtemplate) + 20; + + /* 6. Prepend the shroudedKeyBag OID. */ + needed += 2 + DIM (oid_pkcs_12_pkcs_8ShroudedKeyBag); + + /* 5+4. Put all into two sequences. */ + len[5] = needed; + needed += compute_tag_length ( needed); + len[4] = needed; + needed += compute_tag_length (needed); + + /* 3. This all goes into an octet string. */ + len[3] = needed; + needed += compute_tag_length (needed); + + /* 2. Prepend another [0] tag. */ + len[2] = needed; + needed += compute_tag_length (needed); + + /* 1. Prepend the data OID. */ + needed += 2 + DIM (oid_data); + + /* 0. Prepend another sequence. */ + len[0] = needed; + needed += compute_tag_length (needed); + + /* Now that we have all length information, allocate a buffer. */ + p = keybag = gcry_malloc (needed); + if (!keybag) + { + log_error ("error allocating buffer\n"); + return NULL; + } + + /* Walk 11 steps up to store the data. */ + + /* 0. Store the first sequence. */ + p = store_tag_length (p, TAG_SEQUENCE, len[0]); + + /* 1. Store the data OID. */ + p = store_tag_length (p, TAG_OBJECT_ID, DIM (oid_data)); + memcpy (p, oid_data, DIM (oid_data)); + p += DIM (oid_data); + + /* 2. Store a [0] tag. */ + p = store_tag_length (p, 0xa0, len[2]); + + /* 3. And an octet string. */ + p = store_tag_length (p, TAG_OCTET_STRING, len[3]); + + /* 4+5. Two sequences. */ + p = store_tag_length (p, TAG_SEQUENCE, len[4]); + p = store_tag_length (p, TAG_SEQUENCE, len[5]); + + /* 6. Store the shroudedKeyBag OID. */ + p = store_tag_length (p, TAG_OBJECT_ID, + DIM (oid_pkcs_12_pkcs_8ShroudedKeyBag)); + memcpy (p, oid_pkcs_12_pkcs_8ShroudedKeyBag, + DIM (oid_pkcs_12_pkcs_8ShroudedKeyBag)); + p += DIM (oid_pkcs_12_pkcs_8ShroudedKeyBag); + + /* 7. Store a [0] tag. */ + p = store_tag_length (p, 0xa0, len[7]); + + /* 8. Store a sequence. */ + p = store_tag_length (p, TAG_SEQUENCE, len[8]); + + /* 9. Now for the pre-encoded algorithm identifier and the salt. */ + memcpy (p, data_3desiter2048, DIM (data_3desiter2048)); + memcpy (p + DATA_3DESITER2048_SALT_OFF, salt, 8); + p += DIM (data_3desiter2048); + + /* 10. And the octet string with the encrypted data. */ + p = store_tag_length (p, TAG_OCTET_STRING, buflen); + memcpy (p, buffer, buflen); + p += buflen; + + /* Append the attributes whose length we calculated at step 2b. */ + if (sha1hash) + { + int i; + + memcpy (p, data_attrtemplate, DIM (data_attrtemplate)); + for (i=0; i < 8; i++) + p[DATA_ATTRTEMPLATE_KEYID_OFF+2*i+1] = keyidstr[i]; + p += DIM (data_attrtemplate); + memcpy (p, sha1hash, 20); + p += 20; + } + + + keybaglen = p - keybag; + if (needed != keybaglen) + log_debug ("length mismatch: %lu, %lu\n", + (unsigned long)needed, (unsigned long)keybaglen); + + *r_length = keybaglen; + return keybag; +} + + +static unsigned char * +build_cert_bag (unsigned char *buffer, size_t buflen, char *salt, + size_t *r_length) +{ + size_t len[9], needed; + unsigned char *p, *certbag; + size_t certbaglen; + + /* Walk 9 steps down to collect the info: */ + + /* 8. The data goes into an octet string. */ + needed = compute_tag_length (buflen); + needed += buflen; + + /* 7. The algorithm identifier. */ + needed += DIM (data_rc2iter2048); + + /* 6. The data OID. */ + needed += 2 + DIM (oid_data); + + /* 5. A sequence. */ + len[5] = needed; + needed += compute_tag_length ( needed); + + /* 4. An integer. */ + needed += 3; + + /* 3. A sequence. */ + len[3] = needed; + needed += compute_tag_length (needed); + + /* 2. A [0] tag. */ + len[2] = needed; + needed += compute_tag_length (needed); + + /* 1. The encryptedData OID. */ + needed += 2 + DIM (oid_encryptedData); + + /* 0. The first sequence. */ + len[0] = needed; + needed += compute_tag_length (needed); + + /* Now that we have all length information, allocate a buffer. */ + p = certbag = gcry_malloc (needed); + if (!certbag) + { + log_error ("error allocating buffer\n"); + return NULL; + } + + /* Walk 9 steps up to store the data. */ + + /* 0. Store the first sequence. */ + p = store_tag_length (p, TAG_SEQUENCE, len[0]); + + /* 1. Store the encryptedData OID. */ + p = store_tag_length (p, TAG_OBJECT_ID, DIM (oid_encryptedData)); + memcpy (p, oid_encryptedData, DIM (oid_encryptedData)); + p += DIM (oid_encryptedData); + + /* 2. Store a [0] tag. */ + p = store_tag_length (p, 0xa0, len[2]); + + /* 3. Store a sequence. */ + p = store_tag_length (p, TAG_SEQUENCE, len[3]); + + /* 4. Store the integer 0. */ + *p++ = TAG_INTEGER; + *p++ = 1; + *p++ = 0; + + /* 5. Store a sequence. */ + p = store_tag_length (p, TAG_SEQUENCE, len[5]); + + /* 6. Store the data OID. */ + p = store_tag_length (p, TAG_OBJECT_ID, DIM (oid_data)); + memcpy (p, oid_data, DIM (oid_data)); + p += DIM (oid_data); + + /* 7. Now for the pre-encoded algorithm identifier and the salt. */ + memcpy (p, data_rc2iter2048, DIM (data_rc2iter2048)); + memcpy (p + DATA_RC2ITER2048_SALT_OFF, salt, 8); + p += DIM (data_rc2iter2048); + + /* 8. And finally the [0] tag with the encrypted data. */ + p = store_tag_length (p, 0x80, buflen); + memcpy (p, buffer, buflen); + p += buflen; + certbaglen = p - certbag; + + if (needed != certbaglen) + log_debug ("length mismatch: %lu, %lu\n", + (unsigned long)needed, (unsigned long)certbaglen); + + *r_length = certbaglen; + return certbag; +} + + +static unsigned char * +build_cert_sequence (unsigned char *buffer, size_t buflen, + const unsigned char *sha1hash, const char *keyidstr, + size_t *r_length) +{ + size_t len[8], needed, n; + unsigned char *p, *certseq; + size_t certseqlen; + int i; + + assert (strlen (keyidstr) == 8); + + /* Walk 8 steps down to collect the info: */ + + /* 7. The data goes into an octet string. */ + needed = compute_tag_length (buflen); + needed += buflen; + + /* 6. A [0] tag. */ + len[6] = needed; + needed += compute_tag_length (needed); + + /* 5. An OID. */ + needed += 2 + DIM (oid_x509Certificate_for_pkcs_12); + + /* 4. A sequence. */ + len[4] = needed; + needed += compute_tag_length (needed); + + /* 3. A [0] tag. */ + len[3] = needed; + needed += compute_tag_length (needed); + + /* 2b. The attributes which are appended at the end. */ + if (sha1hash) + needed += DIM (data_attrtemplate) + 20; + + /* 2. An OID. */ + needed += 2 + DIM (oid_pkcs_12_CertBag); + + /* 1. A sequence. */ + len[1] = needed; + needed += compute_tag_length (needed); + + /* 0. The first sequence. */ + len[0] = needed; + needed += compute_tag_length (needed); + + /* Now that we have all length information, allocate a buffer. */ + p = certseq = gcry_malloc (needed + 8 /*(for padding)*/); + if (!certseq) + { + log_error ("error allocating buffer\n"); + return NULL; + } + + /* Walk 8 steps up to store the data. */ + + /* 0. Store the first sequence. */ + p = store_tag_length (p, TAG_SEQUENCE, len[0]); + + /* 1. Store the second sequence. */ + p = store_tag_length (p, TAG_SEQUENCE, len[1]); + + /* 2. Store the pkcs12-cert-bag OID. */ + p = store_tag_length (p, TAG_OBJECT_ID, DIM (oid_pkcs_12_CertBag)); + memcpy (p, oid_pkcs_12_CertBag, DIM (oid_pkcs_12_CertBag)); + p += DIM (oid_pkcs_12_CertBag); + + /* 3. Store a [0] tag. */ + p = store_tag_length (p, 0xa0, len[3]); + + /* 4. Store a sequence. */ + p = store_tag_length (p, TAG_SEQUENCE, len[4]); + + /* 5. Store the x509Certificate OID. */ + p = store_tag_length (p, TAG_OBJECT_ID, + DIM (oid_x509Certificate_for_pkcs_12)); + memcpy (p, oid_x509Certificate_for_pkcs_12, + DIM (oid_x509Certificate_for_pkcs_12)); + p += DIM (oid_x509Certificate_for_pkcs_12); + + /* 6. Store a [0] tag. */ + p = store_tag_length (p, 0xa0, len[6]); + + /* 7. And the octet string with the actual certificate. */ + p = store_tag_length (p, TAG_OCTET_STRING, buflen); + memcpy (p, buffer, buflen); + p += buflen; + + /* Append the attributes whose length we calculated at step 2b. */ + if (sha1hash) + { + memcpy (p, data_attrtemplate, DIM (data_attrtemplate)); + for (i=0; i < 8; i++) + p[DATA_ATTRTEMPLATE_KEYID_OFF+2*i+1] = keyidstr[i]; + p += DIM (data_attrtemplate); + memcpy (p, sha1hash, 20); + p += 20; + } + + certseqlen = p - certseq; + if (needed != certseqlen) + log_debug ("length mismatch: %lu, %lu\n", + (unsigned long)needed, (unsigned long)certseqlen); + + /* Append some pad characters; we already allocated extra space. */ + n = 8 - certseqlen % 8; + for (i=0; i < n; i++, certseqlen++) + *p++ = n; + + *r_length = certseqlen; + return certseq; +} + + +/* Expect the RSA key parameters in KPARMS and a password in + PW. Create a PKCS structure from it and return it as well as the + length in R_LENGTH; return NULL in case of an error. */ +unsigned char * +p12_build (gcry_mpi_t *kparms, unsigned char *cert, size_t certlen, + const char *pw, size_t *r_length) +{ + unsigned char *buffer; + size_t n, buflen; + char salt[8]; + struct buffer_s seqlist[3]; + int seqlistidx = 0; + unsigned char sha1hash[20]; + char keyidstr[8+1]; + + n = buflen = 0; /* (avoid compiler warning). */ + memset (sha1hash, 0, 20); + *keyidstr = 0; + + if (cert && certlen) + { + /* Calculate the hash value we need for the bag attributes. */ + gcry_md_hash_buffer (GCRY_MD_SHA1, sha1hash, cert, certlen); + sprintf (keyidstr, "%02x%02x%02x%02x", + sha1hash[16], sha1hash[17], sha1hash[18], sha1hash[19]); + + /* Encode the certificate. */ + buffer = build_cert_sequence (cert, certlen, sha1hash, keyidstr, + &buflen); + if (!buffer) + goto failure; + + /* Encrypt it. */ + gcry_randomize (salt, 8, GCRY_STRONG_RANDOM); + crypt_block (buffer, buflen, salt, 8, 2048, pw, + GCRY_CIPHER_RFC2268_40, 1); + + /* Encode the encrypted stuff into a bag. */ + seqlist[seqlistidx].buffer = build_cert_bag (buffer, buflen, salt, &n); + seqlist[seqlistidx].length = n; + gcry_free (buffer); + buffer = NULL; + if (!seqlist[seqlistidx].buffer) + goto failure; + seqlistidx++; + } + + + if (kparms) + { + /* Encode the key. */ + buffer = build_key_sequence (kparms, &buflen); + if (!buffer) + goto failure; + + /* Encrypt it. */ + gcry_randomize (salt, 8, GCRY_STRONG_RANDOM); + crypt_block (buffer, buflen, salt, 8, 2048, pw, GCRY_CIPHER_3DES, 1); + + /* Encode the encrypted stuff into a bag. */ + if (cert && certlen) + seqlist[seqlistidx].buffer = build_key_bag (buffer, buflen, salt, + sha1hash, keyidstr, &n); + else + seqlist[seqlistidx].buffer = build_key_bag (buffer, buflen, salt, + NULL, NULL, &n); + seqlist[seqlistidx].length = n; + gcry_free (buffer); + buffer = NULL; + if (!seqlist[seqlistidx].buffer) + goto failure; + seqlistidx++; + } + + seqlist[seqlistidx].buffer = NULL; + seqlist[seqlistidx].length = 0; + + buffer = create_final (seqlist, pw, &buflen); + + failure: + for ( ; seqlistidx; seqlistidx--) + gcry_free (seqlist[seqlistidx].buffer); + + *r_length = buffer? buflen : 0; + return buffer; +} + + +#ifdef TEST + +static void +cert_cb (void *opaque, const unsigned char *cert, size_t certlen) +{ + printf ("got a certificate of %u bytes length\n", certlen); +} + +int +main (int argc, char **argv) +{ + FILE *fp; + struct stat st; + unsigned char *buf; + size_t buflen; + gcry_mpi_t *result; + + if (argc != 3) + { + fprintf (stderr, "usage: testp12 file passphrase\n"); + return 1; + } + + gcry_control (GCRYCTL_DISABLE_SECMEM, NULL); + gcry_control (GCRYCTL_INITIALIZATION_FINISHED, NULL); + + fp = fopen (argv[1], "rb"); + if (!fp) + { + fprintf (stderr, "can't open `%s': %s\n", argv[1], strerror (errno)); + return 1; + } + + if (fstat (fileno(fp), &st)) + { + fprintf (stderr, "can't stat `%s': %s\n", argv[1], strerror (errno)); + return 1; + } + + buflen = st.st_size; + buf = gcry_malloc (buflen+1); + if (!buf || fread (buf, buflen, 1, fp) != 1) + { + fprintf (stderr, "error reading `%s': %s\n", argv[1], strerror (errno)); + return 1; + } + fclose (fp); + + result = p12_parse (buf, buflen, argv[2], cert_cb, NULL); + if (result) + { + int i, rc; + unsigned char *tmpbuf; + + for (i=0; result[i]; i++) + { + rc = gcry_mpi_aprint (GCRYMPI_FMT_HEX, &tmpbuf, + NULL, result[i]); + if (rc) + printf ("%d: [error printing number: %s]\n", + i, gpg_strerror (rc)); + else + { + printf ("%d: %s\n", i, tmpbuf); + gcry_free (tmpbuf); + } + } + } + + return 0; + +} + +/* +Local Variables: +compile-command: "gcc -Wall -O0 -g -DTEST=1 -o minip12 minip12.c ../jnlib/libjnlib.a -L /usr/local/lib -lgcrypt -lgpg-error" +End: +*/ +#endif /* TEST */ diff --git a/agent/minip12.h b/agent/minip12.h new file mode 100644 index 000000000..6275f9ccb --- /dev/null +++ b/agent/minip12.h @@ -0,0 +1,37 @@ +/* minip12.h - Global definitions for the minimal pkcs-12 implementation. + * 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. + */ + +#ifndef MINIP12_H +#define MINIP12_H + +#include + +gcry_mpi_t *p12_parse (const unsigned char *buffer, size_t length, + const char *pw, + void (*certcb)(void*, const unsigned char*, size_t), + void *certcbarg); + +unsigned char *p12_build (gcry_mpi_t *kparms, + unsigned char *cert, size_t certlen, + const char *pw, size_t *r_length); + + +#endif /*MINIP12_H*/ diff --git a/agent/pkdecrypt.c b/agent/pkdecrypt.c new file mode 100644 index 000000000..f61f0f844 --- /dev/null +++ b/agent/pkdecrypt.c @@ -0,0 +1,142 @@ +/* pkdecrypt.c - public key decryption (well, acually using a secret key) + * 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 +#include +#include +#include +#include +#include +#include +#include +#include + +#include "agent.h" + + +/* DECRYPT the stuff in ciphertext which is expected to be a S-Exp. + Try to get the key from CTRL and write the decoded stuff back to + OUTFP. */ +int +agent_pkdecrypt (CTRL ctrl, const char *desc_text, + const unsigned char *ciphertext, size_t ciphertextlen, + membuf_t *outbuf) +{ + gcry_sexp_t s_skey = NULL, s_cipher = NULL, s_plain = NULL; + unsigned char *shadow_info = NULL; + int rc; + char *buf = NULL; + size_t len; + + if (!ctrl->have_keygrip) + { + log_error ("speculative decryption not yet supported\n"); + rc = gpg_error (GPG_ERR_NO_SECKEY); + goto leave; + } + + rc = gcry_sexp_sscan (&s_cipher, NULL, (char*)ciphertext, ciphertextlen); + if (rc) + { + log_error ("failed to convert ciphertext: %s\n", gpg_strerror (rc)); + rc = gpg_error (GPG_ERR_INV_DATA); + goto leave; + } + + if (DBG_CRYPTO) + { + log_printhex ("keygrip:", ctrl->keygrip, 20); + log_printhex ("cipher: ", ciphertext, ciphertextlen); + } + rc = agent_key_from_file (ctrl, desc_text, + ctrl->keygrip, &shadow_info, + CACHE_MODE_NORMAL, &s_skey); + if (rc) + { + log_error ("failed to read the secret key\n"); + goto leave; + } + + if (!s_skey) + { /* divert operation to the smartcard */ + + if (!gcry_sexp_canon_len (ciphertext, ciphertextlen, NULL, NULL)) + { + rc = gpg_error (GPG_ERR_INV_SEXP); + goto leave; + } + + rc = divert_pkdecrypt (ctrl, ciphertext, shadow_info, &buf, &len ); + if (rc) + { + log_error ("smartcard decryption failed: %s\n", gpg_strerror (rc)); + goto leave; + } + /* FIXME: Change the protocol to return a complete S-expression + and not just a part. */ + { + char tmpbuf[50]; + + sprintf (tmpbuf, "%u:", (unsigned int)len); + put_membuf (outbuf, tmpbuf, strlen (tmpbuf)); + put_membuf (outbuf, buf, len); + put_membuf (outbuf, "", 1); + } + } + else + { /* No smartcard, but a private key */ +/* if (DBG_CRYPTO ) */ +/* { */ +/* log_debug ("skey: "); */ +/* gcry_sexp_dump (s_skey); */ +/* } */ + + rc = gcry_pk_decrypt (&s_plain, s_cipher, s_skey); + if (rc) + { + log_error ("decryption failed: %s\n", gpg_strerror (rc)); + goto leave; + } + + if (DBG_CRYPTO) + { + log_debug ("plain: "); + gcry_sexp_dump (s_plain); + } + len = gcry_sexp_sprint (s_plain, GCRYSEXP_FMT_CANON, NULL, 0); + assert (len); + buf = xmalloc (len); + len = gcry_sexp_sprint (s_plain, GCRYSEXP_FMT_CANON, buf, len); + assert (len); + put_membuf (outbuf, buf, len); + } + + + leave: + gcry_sexp_release (s_skey); + gcry_sexp_release (s_plain); + gcry_sexp_release (s_cipher); + xfree (buf); + xfree (shadow_info); + return rc; +} + + diff --git a/agent/pksign.c b/agent/pksign.c new file mode 100644 index 000000000..9863f9de0 --- /dev/null +++ b/agent/pksign.c @@ -0,0 +1,205 @@ +/* pksign.c - public key signing (well, actually using a secret key) + * Copyright (C) 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 +#include +#include +#include +#include +#include +#include +#include +#include + +#include "agent.h" + + +static int +do_encode_md (const byte * md, size_t mdlen, int algo, gcry_sexp_t * r_hash, + int raw_value) +{ + gcry_sexp_t hash; + int rc; + + if (! raw_value) + { + const char *s; + char tmp[16+1]; + int i; + + s = gcry_md_algo_name (algo); + if (s && strlen (s) < 16) + { + for (i=0; i < strlen (s); i++) + tmp[i] = tolower (s[i]); + tmp[i] = '\0'; + } + + rc = gcry_sexp_build (&hash, NULL, + "(data (flags pkcs1) (hash %s %b))", + tmp, mdlen, md); + } + else + { + gcry_mpi_t mpi; + + rc = gcry_mpi_scan (&mpi, GCRYMPI_FMT_USG, md, mdlen, NULL); + if (! rc) + { + rc = gcry_sexp_build (&hash, NULL, + "(data (flags raw) (value %m))", + mpi); + gcry_mpi_release (mpi); + } + + } + + *r_hash = hash; + return rc; +} + + +/* SIGN whatever information we have accumulated in CTRL and return + the signature S-Expression. */ +int +agent_pksign_do (ctrl_t ctrl, const char *desc_text, + gcry_sexp_t *signature_sexp, cache_mode_t cache_mode) +{ + gcry_sexp_t s_skey = NULL, s_sig = NULL; + unsigned char *shadow_info = NULL; + unsigned int rc = 0; /* FIXME: gpg-error? */ + + if (! ctrl->have_keygrip) + return gpg_error (GPG_ERR_NO_SECKEY); + + rc = agent_key_from_file (ctrl, desc_text, ctrl->keygrip, + &shadow_info, cache_mode, &s_skey); + if (rc) + { + log_error ("failed to read the secret key\n"); + goto leave; + } + + if (!s_skey) + { + /* Divert operation to the smartcard */ + + unsigned char *buf = NULL; + size_t len = 0; + + rc = divert_pksign (ctrl, + ctrl->digest.value, + ctrl->digest.valuelen, + ctrl->digest.algo, + shadow_info, &buf); + if (rc) + { + log_error ("smartcard signing failed: %s\n", gpg_strerror (rc)); + goto leave; + } + len = gcry_sexp_canon_len (buf, 0, NULL, NULL); + assert (len); + + rc = gcry_sexp_sscan (&s_sig, NULL, (char*)buf, len); + xfree (buf); + if (rc) + { + log_error ("failed to convert sigbuf returned by divert_pksign " + "into S-Exp: %s", gpg_strerror (rc)); + goto leave; + } + } + else + { + /* No smartcard, but a private key */ + + gcry_sexp_t s_hash = NULL; + + /* put the hash into a sexp */ + rc = do_encode_md (ctrl->digest.value, + ctrl->digest.valuelen, + ctrl->digest.algo, + &s_hash, + ctrl->digest.raw_value); + if (rc) + goto leave; + + if (DBG_CRYPTO) + { + log_debug ("skey: "); + gcry_sexp_dump (s_skey); + } + + /* sign */ + rc = gcry_pk_sign (&s_sig, s_hash, s_skey); + gcry_sexp_release (s_hash); + if (rc) + { + log_error ("signing failed: %s\n", gpg_strerror (rc)); + goto leave; + } + + if (DBG_CRYPTO) + { + log_debug ("result: "); + gcry_sexp_dump (s_sig); + } + } + + leave: + + *signature_sexp = s_sig; + + gcry_sexp_release (s_skey); + xfree (shadow_info); + + return rc; +} + +/* SIGN whatever information we have accumulated in CTRL and write it + back to OUTFP. */ +int +agent_pksign (ctrl_t ctrl, const char *desc_text, + membuf_t *outbuf, cache_mode_t cache_mode) +{ + gcry_sexp_t s_sig = NULL; + char *buf = NULL; + size_t len = 0; + int rc = 0; + + rc = agent_pksign_do (ctrl, desc_text, &s_sig, cache_mode); + if (rc) + goto leave; + + len = gcry_sexp_sprint (s_sig, GCRYSEXP_FMT_CANON, NULL, 0); + assert (len); + buf = xmalloc (len); + len = gcry_sexp_sprint (s_sig, GCRYSEXP_FMT_CANON, buf, len); + assert (len); + + put_membuf (outbuf, buf, len); + + leave: + gcry_sexp_release (s_sig); + xfree (buf); + + return rc; +} diff --git a/agent/preset-passphrase.c b/agent/preset-passphrase.c new file mode 100644 index 000000000..f876b0647 --- /dev/null +++ b/agent/preset-passphrase.c @@ -0,0 +1,337 @@ +/* preset-passphrase.c - A tool to preset a passphrase. + * 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. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_LOCALE_H +#include +#endif +#ifdef HAVE_LANGINFO_CODESET +#include +#endif +#ifdef HAVE_DOSISH_SYSTEM +#include /* for setmode() */ +#endif +#ifdef HAVE_W32_SYSTEM +#include /* To initialize the sockets. fixme */ +#endif + +#define JNLIB_NEED_LOG_LOGV +#include "agent.h" +#include "minip12.h" +#include "simple-pwquery.h" +#include "i18n.h" +#include "sysutils.h" + + +enum cmd_and_opt_values +{ aNull = 0, + oVerbose = 'v', + oPassphrase = 'P', + + oPreset = 'c', + oForget = 'f', + + oNoVerbose = 500, + + oHomedir, + +aTest }; + + +static const char *opt_homedir; +static const char *opt_passphrase; + +static ARGPARSE_OPTS opts[] = { + + { 301, NULL, 0, N_("@Options:\n ") }, + + { oVerbose, "verbose", 0, "verbose" }, + { oPassphrase, "passphrase", 2, "|STRING|use passphrase STRING" }, + { oPreset, "preset", 256, "preset passphrase"}, + { oForget, "forget", 256, "forget passphrase"}, + + { oHomedir, "homedir", 2, "@" }, + {0} +}; + + +static const char * +my_strusage (int level) +{ + const char *p; + switch (level) + { + case 11: p = "gpg-preset-passphrase (GnuPG)"; + break; + case 13: p = VERSION; break; + case 17: p = PRINTABLE_OS_NAME; break; + case 19: p = _("Please report bugs to <" PACKAGE_BUGREPORT ">.\n"); + break; + case 1: + case 40: + p = _("Usage: gpg-preset-passphrase [options] KEYGRIP (-h for help)\n"); + break; + case 41: + p = _("Syntax: gpg-preset-passphrase [options] KEYGRIP\n" + "Password cache maintenance\n"); + break; + + default: p = NULL; + } + return p; +} + + + +static void +i18n_init (void) +{ +#ifdef USE_SIMPLE_GETTEXT + set_gettext_file( PACKAGE_GT ); +#else +#ifdef ENABLE_NLS + setlocale (LC_ALL, ""); + bindtextdomain (PACKAGE_GT, LOCALEDIR); + textdomain (PACKAGE_GT); +#endif +#endif +} + + +static gpg_error_t +map_spwq_error (int err) +{ + switch (err) + { + case 0: + return 0; + case SPWQ_OUT_OF_CORE: + return gpg_error_from_errno (ENOMEM); + case SPWQ_IO_ERROR: + return gpg_error_from_errno (EIO); + case SPWQ_PROTOCOL_ERROR: + return gpg_error (GPG_ERR_PROTOCOL_VIOLATION); + case SPWQ_ERR_RESPONSE: + return gpg_error (GPG_ERR_INV_RESPONSE); + case SPWQ_NO_AGENT: + return gpg_error (GPG_ERR_NO_AGENT); + case SPWQ_SYS_ERROR: + return gpg_error_from_errno (errno); + case SPWQ_GENERAL_ERROR: + default: + return gpg_error (GPG_ERR_GENERAL); + } +} + + +/* Percent-Escape special characters. The string is valid until the + next invocation of the function. */ +static char * +make_hexstring (const char *src) +{ + int len = 2 * strlen (src) + 1; + char *dst; + char *res; + + res = dst = malloc (len); + if (!dst) + { + log_error ("can not escape string: %s\n", + gpg_strerror (gpg_error_from_errno (errno))); + return NULL; + } + +#define _tohex(nr) ((nr) < 10 ? ((nr) + '0') : (((nr) - 10) + 'A')) +#define tohex1(p) _tohex (*((unsigned char *) p) & 15) +#define tohex2(p) _tohex ((*((unsigned char *) p) >> 4) & 15) + + while (*src) + { + *(dst++) = tohex2 (src); + *(dst++) = tohex1 (src); + src++; + } + *dst = '\0'; + return res; +} + + +static void +preset_passphrase (const char *keygrip) +{ + int rc; + char *line; + /* FIXME: Use secure memory. */ + char passphrase[500]; + char *passphrase_esc; + + if (!opt_passphrase) + { + rc = read (0, passphrase, sizeof (passphrase) - 1); + if (rc < 0) + { + log_error ("reading passphrase failed: %s\n", + gpg_strerror (gpg_error_from_errno (errno))); + return; + } + passphrase[rc] = '\0'; + line = strchr (passphrase, '\n'); + if (line) + { + if (line > passphrase && line[-1] == '\r') + line--; + *line = '\0'; + } + + /* FIXME: How to handle empty passwords? */ + } + + passphrase_esc = make_hexstring (opt_passphrase + ? opt_passphrase : passphrase); + if (!passphrase_esc) + { + /* Error message printed by callee. */ + return; + } + + rc = asprintf (&line, "PRESET_PASSPHRASE %s -1 %s\n", keygrip, + passphrase_esc); + wipememory (passphrase_esc, strlen (passphrase_esc)); + free (passphrase_esc); + + if (rc < 0) + { + log_error ("caching passphrase failed: %s\n", + gpg_strerror (gpg_error_from_errno (errno))); + return; + } + if (!opt_passphrase) + wipememory (passphrase, sizeof (passphrase)); + + rc = map_spwq_error (simple_query (line)); + if (rc) + { + log_error ("caching passphrase failed: %s\n", gpg_strerror (rc)); + return; + } + + wipememory (line, strlen (line)); + free (line); +} + + +static void +forget_passphrase (const char *keygrip) +{ + int rc; + char *line; + + rc = asprintf (&line, "CLEAR_PASSPHRASE %s\n", keygrip); + if (rc < 0) + { + log_error ("clearing passphrase failed: %s\n", + gpg_strerror (gpg_error_from_errno (errno))); + return; + } + free (line); +} + + +int +main (int argc, char **argv) +{ + ARGPARSE_ARGS pargs; + int cmd = 0; + const char *keygrip = NULL; + + set_strusage (my_strusage); + log_set_prefix ("gpg-preset-passphrase", 1); + + /* Try to auto set the character set. */ + set_native_charset (NULL); + +#ifdef HAVE_W32_SYSTEM + /* Fixme: Need to initialize the Windows sockets: This should be + moved to another place and we should make sure that it won't get + doen twice, like when Pth is used too. */ + { + WSADATA wsadat; + WSAStartup (0x202, &wsadat); + } +#endif + + i18n_init (); + + opt_homedir = default_homedir (); + + pargs.argc = &argc; + pargs.argv = &argv; + pargs.flags= 1; /* (do not remove the args) */ + while (arg_parse (&pargs, opts) ) + { + switch (pargs.r_opt) + { + case oVerbose: opt.verbose++; break; + case oHomedir: opt_homedir = pargs.r.ret_str; break; + + case oPreset: cmd = oPreset; break; + case oForget: cmd = oForget; break; + case oPassphrase: opt_passphrase = pargs.r.ret_str; break; + + default : pargs.err = 2; break; + } + } + if (log_get_errorcount(0)) + exit(2); + + if (argc == 1) + keygrip = *argv; + else + usage (1); + + if (cmd == oPreset) + preset_passphrase (keygrip); + else if (cmd == oForget) + forget_passphrase (keygrip); + else + log_error ("one of the options --preset or --forget must be given\n"); + + agent_exit (0); + return 8; /*NOTREACHED*/ +} + + +void +agent_exit (int rc) +{ + rc = rc? rc : log_get_errorcount(0)? 2 : 0; + exit (rc); +} diff --git a/agent/protect-tool.c b/agent/protect-tool.c new file mode 100644 index 000000000..bb14ca1e1 --- /dev/null +++ b/agent/protect-tool.c @@ -0,0 +1,1356 @@ +/* protect-tool.c - A tool to test the secret key protection + * Copyright (C) 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 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_LOCALE_H +#include +#endif +#ifdef HAVE_LANGINFO_CODESET +#include +#endif +#ifdef HAVE_DOSISH_SYSTEM +#include /* for setmode() */ +#endif + +#define JNLIB_NEED_LOG_LOGV +#include "agent.h" +#include "minip12.h" +#include "simple-pwquery.h" +#include "i18n.h" +#include "sysutils.h" + + +enum cmd_and_opt_values +{ aNull = 0, + oVerbose = 'v', + oArmor = 'a', + oPassphrase = 'P', + + oProtect = 'p', + oUnprotect = 'u', + + oNoVerbose = 500, + oShadow, + oShowShadowInfo, + oShowKeygrip, + oCanonical, + + oP12Import, + oP12Export, + oStore, + oForce, + oHaveCert, + oNoFailOnExist, + oHomedir, + oPrompt, + oStatusMsg, + +aTest }; + +struct rsa_secret_key_s + { + gcry_mpi_t n; /* public modulus */ + gcry_mpi_t e; /* public exponent */ + gcry_mpi_t d; /* exponent */ + gcry_mpi_t p; /* prime p. */ + gcry_mpi_t q; /* prime q. */ + gcry_mpi_t u; /* inverse of p mod q. */ + }; + + +static const char *opt_homedir; +static int opt_armor; +static int opt_canonical; +static int opt_store; +static int opt_force; +static int opt_no_fail_on_exist; +static int opt_have_cert; +static const char *opt_passphrase; +static char *opt_prompt; +static int opt_status_msg; + +static char *get_passphrase (int promptno); +static char *get_new_passphrase (int promptno); +static void release_passphrase (char *pw); +static int store_private_key (const unsigned char *grip, + const void *buffer, size_t length, int force); + + +static ARGPARSE_OPTS opts[] = { + + { 301, NULL, 0, N_("@Options:\n ") }, + + { oVerbose, "verbose", 0, "verbose" }, + { oArmor, "armor", 0, "write output in advanced format" }, + { oCanonical, "canonical", 0, "write output in canonical format" }, + { oPassphrase, "passphrase", 2, "|STRING|use passphrase STRING" }, + { oProtect, "protect", 256, "protect a private key"}, + { oUnprotect, "unprotect", 256, "unprotect a private key"}, + { oShadow, "shadow", 256, "create a shadow entry for a public key"}, + { oShowShadowInfo, "show-shadow-info", 256, "return the shadow info"}, + { oShowKeygrip, "show-keygrip", 256, "show the \"keygrip\""}, + + { oP12Import, "p12-import", 256, "import a PKCS-12 encoded private key"}, + { oP12Export, "p12-export", 256, "export a private key PKCS-12 encoded"}, + { oHaveCert, "have-cert", 0, "certificate to export provided on STDIN"}, + { oStore, "store", 0, "store the created key in the appropriate place"}, + { oForce, "force", 0, "force overwriting"}, + { oNoFailOnExist, "no-fail-on-exist", 0, "@" }, + { oHomedir, "homedir", 2, "@" }, + { oPrompt, "prompt", 2, "|ESCSTRING|use ESCSTRING as prompt in pinentry"}, + { oStatusMsg, "enable-status-msg", 0, "@"}, + {0} +}; + +static const char * +my_strusage (int level) +{ + const char *p; + switch (level) + { + case 11: p = "gpg-protect-tool (GnuPG)"; + break; + case 13: p = VERSION; break; + case 17: p = PRINTABLE_OS_NAME; break; + case 19: p = _("Please report bugs to <" PACKAGE_BUGREPORT ">.\n"); + break; + case 1: + case 40: p = _("Usage: gpg-protect-tool [options] (-h for help)\n"); + break; + case 41: p = _("Syntax: gpg-protect-tool [options] [args]]\n" + "Secret key maintenance tool\n"); + break; + + default: p = NULL; + } + return p; +} + + + +static void +i18n_init (void) +{ +#ifdef USE_SIMPLE_GETTEXT + set_gettext_file( PACKAGE_GT ); +#else +#ifdef ENABLE_NLS + setlocale (LC_ALL, ""); + bindtextdomain (PACKAGE_GT, LOCALEDIR); + textdomain (PACKAGE_GT); +#endif +#endif +} + + + +/* Used by gcry for logging */ +static void +my_gcry_logger (void *dummy, int level, const char *fmt, va_list arg_ptr) +{ + /* translate the log levels */ + switch (level) + { + case GCRY_LOG_CONT: level = JNLIB_LOG_CONT; break; + case GCRY_LOG_INFO: level = JNLIB_LOG_INFO; break; + case GCRY_LOG_WARN: level = JNLIB_LOG_WARN; break; + case GCRY_LOG_ERROR:level = JNLIB_LOG_ERROR; break; + case GCRY_LOG_FATAL:level = JNLIB_LOG_FATAL; break; + case GCRY_LOG_BUG: level = JNLIB_LOG_BUG; break; + case GCRY_LOG_DEBUG:level = JNLIB_LOG_DEBUG; break; + default: level = JNLIB_LOG_ERROR; break; } + log_logv (level, fmt, arg_ptr); +} + + +/* static void */ +/* print_mpi (const char *text, gcry_mpi_t a) */ +/* { */ +/* char *buf; */ +/* void *bufaddr = &buf; */ +/* int rc; */ + +/* rc = gcry_mpi_aprint (GCRYMPI_FMT_HEX, bufaddr, NULL, a); */ +/* if (rc) */ +/* log_info ("%s: [error printing number: %s]\n", text, gpg_strerror (rc)); */ +/* else */ +/* { */ +/* log_info ("%s: %s\n", text, buf); */ +/* gcry_free (buf); */ +/* } */ +/* } */ + + + +static unsigned char * +make_canonical (const char *fname, const char *buf, size_t buflen) +{ + int rc; + size_t erroff, len; + gcry_sexp_t sexp; + unsigned char *result; + + rc = gcry_sexp_sscan (&sexp, &erroff, buf, buflen); + if (rc) + { + log_error ("invalid S-Expression in `%s' (off=%u): %s\n", + fname, (unsigned int)erroff, gpg_strerror (rc)); + return NULL; + } + len = gcry_sexp_sprint (sexp, GCRYSEXP_FMT_CANON, NULL, 0); + assert (len); + result = xmalloc (len); + len = gcry_sexp_sprint (sexp, GCRYSEXP_FMT_CANON, result, len); + assert (len); + gcry_sexp_release (sexp); + return result; +} + +static char * +make_advanced (const unsigned char *buf, size_t buflen) +{ + int rc; + size_t erroff, len; + gcry_sexp_t sexp; + char *result; + + rc = gcry_sexp_sscan (&sexp, &erroff, (const char*)buf, buflen); + if (rc) + { + log_error ("invalid canonical S-Expression (off=%u): %s\n", + (unsigned int)erroff, gpg_strerror (rc)); + return NULL; + } + len = gcry_sexp_sprint (sexp, GCRYSEXP_FMT_ADVANCED, NULL, 0); + assert (len); + result = xmalloc (len); + len = gcry_sexp_sprint (sexp, GCRYSEXP_FMT_ADVANCED, result, len); + assert (len); + gcry_sexp_release (sexp); + return result; +} + + +static char * +read_file (const char *fname, size_t *r_length) +{ + FILE *fp; + char *buf; + size_t buflen; + + if (!strcmp (fname, "-")) + { + size_t nread, bufsize = 0; + + fp = stdin; +#ifdef HAVE_DOSISH_SYSTEM + setmode ( fileno(fp) , O_BINARY ); +#endif + buf = NULL; + buflen = 0; +#define NCHUNK 8192 + do + { + bufsize += NCHUNK; + if (!buf) + buf = xmalloc (bufsize); + else + buf = xrealloc (buf, bufsize); + + nread = fread (buf+buflen, 1, NCHUNK, fp); + if (nread < NCHUNK && ferror (fp)) + { + log_error ("error reading `[stdin]': %s\n", strerror (errno)); + xfree (buf); + return NULL; + } + buflen += nread; + } + while (nread == NCHUNK); +#undef NCHUNK + + } + else + { + struct stat st; + + fp = fopen (fname, "rb"); + if (!fp) + { + log_error ("can't open `%s': %s\n", fname, strerror (errno)); + return NULL; + } + + if (fstat (fileno(fp), &st)) + { + log_error ("can't stat `%s': %s\n", fname, strerror (errno)); + fclose (fp); + return NULL; + } + + buflen = st.st_size; + buf = xmalloc (buflen+1); + if (fread (buf, buflen, 1, fp) != 1) + { + log_error ("error reading `%s': %s\n", fname, strerror (errno)); + fclose (fp); + xfree (buf); + return NULL; + } + fclose (fp); + } + + *r_length = buflen; + return buf; +} + + +static unsigned char * +read_key (const char *fname) +{ + char *buf; + size_t buflen; + unsigned char *key; + + buf = read_file (fname, &buflen); + if (!buf) + return NULL; + key = make_canonical (fname, buf, buflen); + xfree (buf); + return key; +} + + + +static void +read_and_protect (const char *fname) +{ + int rc; + unsigned char *key; + unsigned char *result; + size_t resultlen; + char *pw; + + key = read_key (fname); + if (!key) + return; + + pw = get_passphrase (1); + rc = agent_protect (key, pw, &result, &resultlen); + release_passphrase (pw); + xfree (key); + if (rc) + { + log_error ("protecting the key failed: %s\n", gpg_strerror (rc)); + return; + } + + if (opt_armor) + { + char *p = make_advanced (result, resultlen); + xfree (result); + if (!p) + return; + result = (unsigned char*)p; + resultlen = strlen (p); + } + + fwrite (result, resultlen, 1, stdout); + xfree (result); +} + + +static void +read_and_unprotect (const char *fname) +{ + int rc; + unsigned char *key; + unsigned char *result; + size_t resultlen; + char *pw; + + key = read_key (fname); + if (!key) + return; + + rc = agent_unprotect (key, (pw=get_passphrase (1)), &result, &resultlen); + release_passphrase (pw); + xfree (key); + if (rc) + { + if (opt_status_msg) + log_info ("[PROTECT-TOOL:] bad-passphrase\n"); + log_error ("unprotecting the key failed: %s\n", gpg_strerror (rc)); + return; + } + + if (opt_armor) + { + char *p = make_advanced (result, resultlen); + xfree (result); + if (!p) + return; + result = (unsigned char*)p; + resultlen = strlen (p); + } + + fwrite (result, resultlen, 1, stdout); + xfree (result); +} + + + +static void +read_and_shadow (const char *fname) +{ + int rc; + unsigned char *key; + unsigned char *result; + size_t resultlen; + unsigned char dummy_info[] = "(8:313233342:43)"; + + key = read_key (fname); + if (!key) + return; + + rc = agent_shadow_key (key, dummy_info, &result); + xfree (key); + if (rc) + { + log_error ("shadowing the key failed: %s\n", gpg_strerror (rc)); + return; + } + resultlen = gcry_sexp_canon_len (result, 0, NULL,NULL); + assert (resultlen); + + if (opt_armor) + { + char *p = make_advanced (result, resultlen); + xfree (result); + if (!p) + return; + result = (unsigned char*)p; + resultlen = strlen (p); + } + + fwrite (result, resultlen, 1, stdout); + xfree (result); +} + +static void +show_shadow_info (const char *fname) +{ + int rc; + unsigned char *key; + const unsigned char *info; + size_t infolen; + + key = read_key (fname); + if (!key) + return; + + rc = agent_get_shadow_info (key, &info); + xfree (key); + if (rc) + { + log_error ("get_shadow_info failed: %s\n", gpg_strerror (rc)); + return; + } + infolen = gcry_sexp_canon_len (info, 0, NULL,NULL); + assert (infolen); + + if (opt_armor) + { + char *p = make_advanced (info, infolen); + if (!p) + return; + fwrite (p, strlen (p), 1, stdout); + xfree (p); + } + else + fwrite (info, infolen, 1, stdout); +} + + +static void +show_file (const char *fname) +{ + unsigned char *key; + size_t keylen; + char *p; + + key = read_key (fname); + if (!key) + return; + + keylen = gcry_sexp_canon_len (key, 0, NULL,NULL); + assert (keylen); + + if (opt_canonical) + { + fwrite (key, keylen, 1, stdout); + } + else + { + p = make_advanced (key, keylen); + if (p) + { + fwrite (p, strlen (p), 1, stdout); + xfree (p); + } + } + xfree (key); +} + +static void +show_keygrip (const char *fname) +{ + unsigned char *key; + gcry_sexp_t private; + unsigned char grip[20]; + int i; + + key = read_key (fname); + if (!key) + return; + + if (gcry_sexp_new (&private, key, 0, 0)) + { + log_error ("gcry_sexp_new failed\n"); + return; + } + xfree (key); + + if (!gcry_pk_get_keygrip (private, grip)) + { + log_error ("can't calculate keygrip\n"); + return; + } + gcry_sexp_release (private); + + for (i=0; i < 20; i++) + printf ("%02X", grip[i]); + putchar ('\n'); +} + + +static int +rsa_key_check (struct rsa_secret_key_s *skey) +{ + int err = 0; + gcry_mpi_t t = gcry_mpi_snew (0); + gcry_mpi_t t1 = gcry_mpi_snew (0); + gcry_mpi_t t2 = gcry_mpi_snew (0); + gcry_mpi_t phi = gcry_mpi_snew (0); + + /* check that n == p * q */ + gcry_mpi_mul (t, skey->p, skey->q); + if (gcry_mpi_cmp( t, skey->n) ) + { + log_error ("RSA oops: n != p * q\n"); + err++; + } + + /* check that p is less than q */ + if (gcry_mpi_cmp (skey->p, skey->q) > 0) + { + gcry_mpi_t tmp; + + log_info ("swapping secret primes\n"); + tmp = gcry_mpi_copy (skey->p); + gcry_mpi_set (skey->p, skey->q); + gcry_mpi_set (skey->q, tmp); + gcry_mpi_release (tmp); + /* and must recompute u of course */ + gcry_mpi_invm (skey->u, skey->p, skey->q); + } + + /* check that e divides neither p-1 nor q-1 */ + gcry_mpi_sub_ui (t, skey->p, 1 ); + gcry_mpi_div (NULL, t, t, skey->e, 0); + if (!gcry_mpi_cmp_ui( t, 0) ) + { + log_error ("RSA oops: e divides p-1\n"); + err++; + } + gcry_mpi_sub_ui (t, skey->q, 1); + gcry_mpi_div (NULL, t, t, skey->e, 0); + if (!gcry_mpi_cmp_ui( t, 0)) + { + log_info ( "RSA oops: e divides q-1\n" ); + err++; + } + + /* check that d is correct. */ + gcry_mpi_sub_ui (t1, skey->p, 1); + gcry_mpi_sub_ui (t2, skey->q, 1); + gcry_mpi_mul (phi, t1, t2); + gcry_mpi_invm (t, skey->e, phi); + if (gcry_mpi_cmp (t, skey->d)) + { /* no: try universal exponent. */ + gcry_mpi_gcd (t, t1, t2); + gcry_mpi_div (t, NULL, phi, t, 0); + gcry_mpi_invm (t, skey->e, t); + if (gcry_mpi_cmp (t, skey->d)) + { + log_error ("RSA oops: bad secret exponent\n"); + err++; + } + } + + /* check for correctness of u */ + gcry_mpi_invm (t, skey->p, skey->q); + if (gcry_mpi_cmp (t, skey->u)) + { + log_info ( "RSA oops: bad u parameter\n"); + err++; + } + + if (err) + log_info ("RSA secret key check failed\n"); + + gcry_mpi_release (t); + gcry_mpi_release (t1); + gcry_mpi_release (t2); + gcry_mpi_release (phi); + + return err? -1:0; +} + + +/* A callback used by p12_parse to return a certificate. */ +static void +import_p12_cert_cb (void *opaque, const unsigned char *cert, size_t certlen) +{ + struct b64state state; + gpg_error_t err, err2; + + err = b64enc_start (&state, stdout, "CERTIFICATE"); + if (!err) + err = b64enc_write (&state, cert, certlen); + err2 = b64enc_finish (&state); + if (!err) + err = err2; + if (err) + log_error ("error writing armored certificate: %s\n", gpg_strerror (err)); +} + +static void +import_p12_file (const char *fname) +{ + char *buf; + unsigned char *result; + size_t buflen, resultlen; + int i; + int rc; + gcry_mpi_t *kparms; + struct rsa_secret_key_s sk; + gcry_sexp_t s_key; + unsigned char *key; + unsigned char grip[20]; + char *pw; + + /* fixme: we should release some stuff on error */ + + buf = read_file (fname, &buflen); + if (!buf) + return; + + kparms = p12_parse ((unsigned char*)buf, buflen, (pw=get_passphrase (2)), + import_p12_cert_cb, NULL); + release_passphrase (pw); + xfree (buf); + if (!kparms) + { + log_error ("error parsing or decrypting the PKCS-12 file\n"); + return; + } + for (i=0; kparms[i]; i++) + ; + if (i != 8) + { + log_error ("invalid structure of private key\n"); + return; + } + + +/* print_mpi (" n", kparms[0]); */ +/* print_mpi (" e", kparms[1]); */ +/* print_mpi (" d", kparms[2]); */ +/* print_mpi (" p", kparms[3]); */ +/* print_mpi (" q", kparms[4]); */ +/* print_mpi ("dmp1", kparms[5]); */ +/* print_mpi ("dmq1", kparms[6]); */ +/* print_mpi (" u", kparms[7]); */ + + sk.n = kparms[0]; + sk.e = kparms[1]; + sk.d = kparms[2]; + sk.q = kparms[3]; + sk.p = kparms[4]; + sk.u = kparms[7]; + if (rsa_key_check (&sk)) + return; +/* print_mpi (" n", sk.n); */ +/* print_mpi (" e", sk.e); */ +/* print_mpi (" d", sk.d); */ +/* print_mpi (" p", sk.p); */ +/* print_mpi (" q", sk.q); */ +/* print_mpi (" u", sk.u); */ + + /* Create an S-expresion from the parameters. */ + rc = gcry_sexp_build (&s_key, NULL, + "(private-key(rsa(n%m)(e%m)(d%m)(p%m)(q%m)(u%m)))", + sk.n, sk.e, sk.d, sk.p, sk.q, sk.u, NULL); + for (i=0; i < 8; i++) + gcry_mpi_release (kparms[i]); + gcry_free (kparms); + if (rc) + { + log_error ("failed to created S-expression from key: %s\n", + gpg_strerror (rc)); + return; + } + + /* Compute the keygrip. */ + if (!gcry_pk_get_keygrip (s_key, grip)) + { + log_error ("can't calculate keygrip\n"); + return; + } + log_info ("keygrip: "); + for (i=0; i < 20; i++) + log_printf ("%02X", grip[i]); + log_printf ("\n"); + + /* Convert to canonical encoding. */ + buflen = gcry_sexp_sprint (s_key, GCRYSEXP_FMT_CANON, NULL, 0); + assert (buflen); + key = gcry_xmalloc_secure (buflen); + buflen = gcry_sexp_sprint (s_key, GCRYSEXP_FMT_CANON, key, buflen); + assert (buflen); + gcry_sexp_release (s_key); + + + rc = agent_protect (key, (pw=get_new_passphrase (4)), &result, &resultlen); + release_passphrase (pw); + xfree (key); + if (rc) + { + log_error ("protecting the key failed: %s\n", gpg_strerror (rc)); + return; + } + + if (opt_armor) + { + char *p = make_advanced (result, resultlen); + xfree (result); + if (!p) + return; + result = (unsigned char*)p; + resultlen = strlen (p); + } + + if (opt_store) + store_private_key (grip, result, resultlen, opt_force); + else + fwrite (result, resultlen, 1, stdout); + + xfree (result); +} + + + +static gcry_mpi_t * +sexp_to_kparms (gcry_sexp_t sexp) +{ + gcry_sexp_t list, l2; + const char *name; + const char *s; + size_t n; + int i, idx; + const char *elems; + gcry_mpi_t *array; + + list = gcry_sexp_find_token (sexp, "private-key", 0 ); + if(!list) + return NULL; + l2 = gcry_sexp_cadr (list); + gcry_sexp_release (list); + list = l2; + name = gcry_sexp_nth_data (list, 0, &n); + if(!name || n != 3 || memcmp (name, "rsa", 3)) + { + gcry_sexp_release (list); + return NULL; + } + + /* Parameter names used with RSA. */ + elems = "nedpqu"; + array = xcalloc (strlen(elems) + 1, sizeof *array); + for (idx=0, s=elems; *s; s++, idx++ ) + { + l2 = gcry_sexp_find_token (list, s, 1); + if (!l2) + { + for (i=0; i 1) + usage (1); + + if (opt_prompt) + opt_prompt = percent_plus_unescape_string (xstrdup (opt_prompt)); + + if (cmd == oProtect) + read_and_protect (fname); + else if (cmd == oUnprotect) + read_and_unprotect (fname); + else if (cmd == oShadow) + read_and_shadow (fname); + else if (cmd == oShowShadowInfo) + show_shadow_info (fname); + else if (cmd == oShowKeygrip) + show_keygrip (fname); + else if (cmd == oP12Import) + import_p12_file (fname); + else if (cmd == oP12Export) + export_p12_file (fname); + else + show_file (fname); + + agent_exit (0); + return 8; /*NOTREACHED*/ +} + +void +agent_exit (int rc) +{ + rc = rc? rc : log_get_errorcount(0)? 2 : 0; + exit (rc); +} + + +/* Return the passphrase string and ask the agent if it has not been + set from the command line PROMPTNO select the prompt to display: + 0 = default + 1 = taken from the option --prompt + 2 = for unprotecting a pkcs#12 object + 3 = for protecting a new pkcs#12 object + 4 = for protecting an imported pkcs#12 in our system + 5 = reenter the passphrase + When adding 100 to the values, a "does not match - try again" errro message is shown. +*/ +static char * +get_passphrase (int promptno) +{ + char *pw; + int err; + const char *desc; +#ifdef HAVE_LANGINFO_CODESET + char *orig_codeset = NULL; +#endif + int error_msgno; + + + if (opt_passphrase) + return xstrdup (opt_passphrase); + + error_msgno = promptno / 100; + promptno %= 100; + +#ifdef ENABLE_NLS + /* The Assuan agent protocol requires us to transmit utf-8 strings */ + orig_codeset = bind_textdomain_codeset (PACKAGE_GT, NULL); +#ifdef HAVE_LANGINFO_CODESET + if (!orig_codeset) + orig_codeset = nl_langinfo (CODESET); +#endif + if (orig_codeset && !strcmp (orig_codeset, "UTF-8")) + orig_codeset = NULL; + 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_GT, "utf-8")) + orig_codeset = NULL; + } +#endif + + if (promptno == 1 && opt_prompt) + desc = opt_prompt; + else if (promptno == 2) + desc = _("Please enter the passphrase to unprotect the " + "PKCS#12 object."); + else if (promptno == 3) + desc = _("Please enter the passphrase to protect the " + "new PKCS#12 object."); + else if (promptno == 4) + desc = _("Please enter the passphrase to protect the " + "imported object within the GnuPG system."); + else if (promptno == 5) + desc = _("Please re-enter this passphrase"); + else + desc = _("Please enter the passphrase or the PIN\n" + "needed to complete this operation."); + + pw = simple_pwquery (NULL, + error_msgno == 1? _("does not match - try again"):NULL, + _("Passphrase:"), desc, &err); + +#ifdef ENABLE_NLS + if (orig_codeset) + { + bind_textdomain_codeset (PACKAGE_GT, orig_codeset); + xfree (orig_codeset); + } +#endif + + if (!pw) + { + if (err) + log_error (_("error while asking for the passphrase: %s\n"), + gpg_strerror (err)); + else + log_info (_("cancelled\n")); + agent_exit (0); + } + + return pw; +} + + +/* Same as get_passphrase but requests it a second time and compares + it to the one entered the first time. */ +static char * +get_new_passphrase (int promptno) +{ + char *pw; + int i, secondpromptno; + + pw = get_passphrase (promptno); + if (!pw) + return NULL; /* Canceled. */ + if (!*pw) + return pw; /* Empty passphrase - no need to as for repeating it. */ + + secondpromptno = 5; + for (i=0; i < 3; i++) + { + char *pw2 = get_passphrase (secondpromptno); + if (!pw2) + { + xfree (pw); + return NULL; /* Canceled. */ + } + if (!strcmp (pw, pw2)) + { + xfree (pw2); + return pw; /* Okay. */ + } + secondpromptno = 105; + xfree (pw2); + } + xfree (pw); + return NULL; /* 3 times repeated wrong - cancel. */ +} + + + +static void +release_passphrase (char *pw) +{ + if (pw) + { + wipememory (pw, strlen (pw)); + xfree (pw); + } +} + +static int +store_private_key (const unsigned char *grip, + const void *buffer, size_t length, int force) +{ + int i; + char *fname; + FILE *fp; + char hexgrip[40+4+1]; + + for (i=0; i < 20; i++) + sprintf (hexgrip+2*i, "%02X", grip[i]); + strcpy (hexgrip+40, ".key"); + + fname = make_filename (opt_homedir, GNUPG_PRIVATE_KEYS_DIR, hexgrip, NULL); + if (force) + fp = fopen (fname, "wb"); + else + { + if (!access (fname, F_OK)) + { + if (opt_status_msg) + log_info ("[PROTECT-TOOL:] secretkey-exists\n"); + if (opt_no_fail_on_exist) + log_info ("secret key file `%s' already exists\n", fname); + else + log_error ("secret key file `%s' already exists\n", fname); + xfree (fname); + return opt_no_fail_on_exist? 0 : -1; + } + fp = fopen (fname, "wbx"); /* FIXME: the x is a GNU extension - let + configure check whether this actually + works */ + } + + if (!fp) + { + log_error ("can't create `%s': %s\n", fname, strerror (errno)); + xfree (fname); + return -1; + } + + if (fwrite (buffer, length, 1, fp) != 1) + { + log_error ("error writing `%s': %s\n", fname, strerror (errno)); + fclose (fp); + remove (fname); + xfree (fname); + return -1; + } + if ( fclose (fp) ) + { + log_error ("error closing `%s': %s\n", fname, strerror (errno)); + remove (fname); + xfree (fname); + return -1; + } + log_info ("secret key stored as `%s'\n", fname); + + if (opt_status_msg) + log_info ("[PROTECT-TOOL:] secretkey-stored\n"); + + xfree (fname); + return 0; +} diff --git a/agent/protect.c b/agent/protect.c new file mode 100644 index 000000000..19f6ccbc6 --- /dev/null +++ b/agent/protect.c @@ -0,0 +1,1024 @@ +/* protect.c - Un/Protect a secret key + * 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. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "agent.h" + +#include "sexp-parse.h" + +#define PROT_CIPHER GCRY_CIPHER_AES +#define PROT_CIPHER_STRING "aes" +#define PROT_CIPHER_KEYLEN (128/8) + + +/* A table containing the information needed to create a protected + private key */ +static struct { + const char *algo; + const char *parmlist; + int prot_from, prot_to; +} protect_info[] = { + { "rsa", "nedpqu", 2, 5 }, + { "dsa", "pqgyx", 4, 4 }, + { "elg", "pgyx", 3, 3 }, + { NULL } +}; + + +static int +hash_passphrase (const char *passphrase, int hashalgo, + int s2kmode, + const unsigned char *s2ksalt, unsigned long s2kcount, + unsigned char *key, size_t keylen); + + + +/* Calculate the MIC for a private key S-Exp. SHA1HASH should point to + a 20 byte buffer. This function is suitable for any algorithms. */ +static int +calculate_mic (const unsigned char *plainkey, unsigned char *sha1hash) +{ + const unsigned char *hash_begin, *hash_end; + const unsigned char *s; + size_t n; + + s = plainkey; + if (*s != '(') + return gpg_error (GPG_ERR_INV_SEXP); + s++; + n = snext (&s); + if (!n) + return gpg_error (GPG_ERR_INV_SEXP); + if (!smatch (&s, n, "private-key")) + return gpg_error (GPG_ERR_UNKNOWN_SEXP); + if (*s != '(') + return gpg_error (GPG_ERR_UNKNOWN_SEXP); + hash_begin = s; + s++; + n = snext (&s); + if (!n) + return gpg_error (GPG_ERR_INV_SEXP); + s += n; /* skip over the algorithm name */ + + while (*s == '(') + { + s++; + n = snext (&s); + if (!n) + return gpg_error (GPG_ERR_INV_SEXP); + s += n; + n = snext (&s); + if (!n) + return gpg_error (GPG_ERR_INV_SEXP); + s += n; + if ( *s != ')' ) + return gpg_error (GPG_ERR_INV_SEXP); + s++; + } + if (*s != ')') + return gpg_error (GPG_ERR_INV_SEXP); + s++; + hash_end = s; + + gcry_md_hash_buffer (GCRY_MD_SHA1, sha1hash, + hash_begin, hash_end - hash_begin); + + return 0; +} + + + +/* Encrypt the parameter block starting at PROTBEGIN with length + PROTLEN using the utf8 encoded key PASSPHRASE and return the entire + encrypted block in RESULT or return with an error code. SHA1HASH + is the 20 byte SHA-1 hash required for the integrity code. + + The parameter block is expected to be an incomplete S-Expression of + the form (example in advanced format): + + (d #046129F..[some bytes not shown]..81#) + (p #00e861b..[some bytes not shown]..f1#) + (q #00f7a7c..[some bytes not shown]..61#) + (u #304559a..[some bytes not shown]..9b#) + + the returned block is the S-Expression: + + (protected mode (parms) encrypted_octet_string) + +*/ +static int +do_encryption (const unsigned char *protbegin, size_t protlen, + const char *passphrase, const unsigned char *sha1hash, + unsigned char **result, size_t *resultlen) +{ + gcry_cipher_hd_t hd; + const char *modestr = "openpgp-s2k3-sha1-" PROT_CIPHER_STRING "-cbc"; + int blklen, enclen, outlen; + unsigned char *iv = NULL; + int rc; + char *outbuf = NULL; + char *p; + int saltpos, ivpos, encpos; + + *resultlen = 0; + *result = NULL; + + rc = gcry_cipher_open (&hd, PROT_CIPHER, GCRY_CIPHER_MODE_CBC, + GCRY_CIPHER_SECURE); + if (rc) + return rc; + + + /* We need to work on a copy of the data because this makes it + easier to add the trailer and the padding and more important we + have to prefix the text with 2 parenthesis, so we have to + allocate enough space for: + + (()(4:hash4:sha120:)) + padding + + We always append a full block of random bytes as padding but + encrypt only what is needed for a full blocksize */ + blklen = gcry_cipher_get_algo_blklen (PROT_CIPHER); + outlen = 2 + protlen + 2 + 6 + 6 + 23 + 2 + blklen; + enclen = outlen/blklen * blklen; + outbuf = gcry_malloc_secure (outlen); + if (!outbuf) + rc = out_of_core (); + if (!rc) + { + /* Allocate random bytes to be used as IV, padding and s2k salt. */ + iv = xtrymalloc (blklen*2+8); + if (!iv) + rc = gpg_error (GPG_ERR_ENOMEM); + gcry_create_nonce (iv, blklen*2+8); + rc = gcry_cipher_setiv (hd, iv, blklen); + } + if (!rc) + { + unsigned char *key; + size_t keylen = PROT_CIPHER_KEYLEN; + + key = gcry_malloc_secure (keylen); + if (!key) + rc = out_of_core (); + else + { + rc = hash_passphrase (passphrase, GCRY_MD_SHA1, + 3, iv+2*blklen, 96, key, keylen); + if (!rc) + rc = gcry_cipher_setkey (hd, key, keylen); + xfree (key); + } + } + if (!rc) + { + p = outbuf; + *p++ = '('; + *p++ = '('; + memcpy (p, protbegin, protlen); + p += protlen; + memcpy (p, ")(4:hash4:sha120:", 17); + p += 17; + memcpy (p, sha1hash, 20); + p += 20; + *p++ = ')'; + *p++ = ')'; + memcpy (p, iv+blklen, blklen); + p += blklen; + assert ( p - outbuf == outlen); + rc = gcry_cipher_encrypt (hd, outbuf, enclen, NULL, 0); + } + gcry_cipher_close (hd); + if (rc) + { + xfree (iv); + xfree (outbuf); + return rc; + } + + /* Now allocate the buffer we want to return. This is + + (protected openpgp-s2k3-sha1-aes-cbc + ((sha1 salt no_of_iterations) 16byte_iv) + encrypted_octet_string) + + in canoncical format of course. We use asprintf and %n modifier + and spaces as palceholders. */ + asprintf (&p, + "(9:protected%d:%s((4:sha18:%n_8bytes_2:96)%d:%n%*s)%d:%n%*s)", + (int)strlen (modestr), modestr, + &saltpos, + blklen, &ivpos, blklen, "", + enclen, &encpos, enclen, ""); + if (p) + { /* asprintf does not use our malloc system */ + char *psave = p; + p = xtrymalloc (strlen (psave)+1); + if (p) + strcpy (p, psave); + free (psave); + } + if (!p) + { + gpg_error_t tmperr = out_of_core (); + xfree (iv); + xfree (outbuf); + return tmperr; + } + *resultlen = strlen (p); + *result = (unsigned char*)p; + memcpy (p+saltpos, iv+2*blklen, 8); + memcpy (p+ivpos, iv, blklen); + memcpy (p+encpos, outbuf, enclen); + xfree (iv); + xfree (outbuf); + return 0; +} + + + +/* Protect the key encoded in canonical format in PLAINKEY. We assume + a valid S-Exp here. */ +int +agent_protect (const unsigned char *plainkey, const char *passphrase, + unsigned char **result, size_t *resultlen) +{ + int rc; + const unsigned char *s; + const unsigned char *hash_begin, *hash_end; + const unsigned char *prot_begin, *prot_end, *real_end; + size_t n; + int c, infidx, i; + unsigned char hashvalue[20]; + unsigned char *protected; + size_t protectedlen; + int depth = 0; + unsigned char *p; + + s = plainkey; + if (*s != '(') + return gpg_error (GPG_ERR_INV_SEXP); + depth++; + s++; + n = snext (&s); + if (!n) + return gpg_error (GPG_ERR_INV_SEXP); + if (!smatch (&s, n, "private-key")) + return gpg_error (GPG_ERR_UNKNOWN_SEXP); + if (*s != '(') + return gpg_error (GPG_ERR_UNKNOWN_SEXP); + depth++; + hash_begin = s; + s++; + n = snext (&s); + if (!n) + return gpg_error (GPG_ERR_INV_SEXP); + + for (infidx=0; protect_info[infidx].algo + && !smatch (&s, n, protect_info[infidx].algo); infidx++) + ; + if (!protect_info[infidx].algo) + return gpg_error (GPG_ERR_UNSUPPORTED_ALGORITHM); + + prot_begin = prot_end = NULL; + for (i=0; (c=protect_info[infidx].parmlist[i]); i++) + { + if (i == protect_info[infidx].prot_from) + prot_begin = s; + if (*s != '(') + return gpg_error (GPG_ERR_INV_SEXP); + depth++; + s++; + n = snext (&s); + if (!n) + return gpg_error (GPG_ERR_INV_SEXP); + if (n != 1 || c != *s) + return gpg_error (GPG_ERR_INV_SEXP); + s += n; + n = snext (&s); + if (!n) + return gpg_error (GPG_ERR_INV_SEXP); + s +=n; /* skip value */ + if (*s != ')') + return gpg_error (GPG_ERR_INV_SEXP); + depth--; + if (i == protect_info[infidx].prot_to) + prot_end = s; + s++; + } + if (*s != ')' || !prot_begin || !prot_end ) + return gpg_error (GPG_ERR_INV_SEXP); + depth--; + hash_end = s; + s++; + /* skip to the end of the S-exp */ + assert (depth == 1); + rc = sskip (&s, &depth); + if (rc) + return rc; + assert (!depth); + real_end = s-1; + + gcry_md_hash_buffer (GCRY_MD_SHA1, hashvalue, + hash_begin, hash_end - hash_begin + 1); + + rc = do_encryption (prot_begin, prot_end - prot_begin + 1, + passphrase, hashvalue, + &protected, &protectedlen); + if (rc) + return rc; + + /* Now create the protected version of the key. Note that the 10 + extra bytes are for for the inserted "protected-" string (the + beginning of the plaintext reads: "((11:private-key(" ). */ + *resultlen = (10 + + (prot_begin-plainkey) + + protectedlen + + (real_end-prot_end)); + *result = p = xtrymalloc (*resultlen); + if (!p) + { + gpg_error_t tmperr = out_of_core (); + xfree (protected); + return tmperr; + } + memcpy (p, "(21:protected-", 14); + p += 14; + memcpy (p, plainkey+4, prot_begin - plainkey - 4); + p += prot_begin - plainkey - 4; + memcpy (p, protected, protectedlen); + p += protectedlen; + memcpy (p, prot_end+1, real_end - prot_end); + p += real_end - prot_end; + assert ( p - *result == *resultlen); + xfree (protected); + return 0; +} + + +/* Do the actual decryption and check the return list for consistency. */ +static int +do_decryption (const unsigned char *protected, size_t protectedlen, + const char *passphrase, + const unsigned char *s2ksalt, unsigned long s2kcount, + const unsigned char *iv, size_t ivlen, + unsigned char **result) +{ + int rc = 0; + int blklen; + gcry_cipher_hd_t hd; + unsigned char *outbuf; + size_t reallen; + + blklen = gcry_cipher_get_algo_blklen (PROT_CIPHER); + if (protectedlen < 4 || (protectedlen%blklen)) + return gpg_error (GPG_ERR_CORRUPTED_PROTECTION); + + rc = gcry_cipher_open (&hd, PROT_CIPHER, GCRY_CIPHER_MODE_CBC, + GCRY_CIPHER_SECURE); + if (rc) + return rc; + + outbuf = gcry_malloc_secure (protectedlen); + if (!outbuf) + rc = out_of_core (); + if (!rc) + rc = gcry_cipher_setiv (hd, iv, ivlen); + if (!rc) + { + unsigned char *key; + size_t keylen = PROT_CIPHER_KEYLEN; + + key = gcry_malloc_secure (keylen); + if (!key) + rc = out_of_core (); + else + { + rc = hash_passphrase (passphrase, GCRY_MD_SHA1, + 3, s2ksalt, s2kcount, key, keylen); + if (!rc) + rc = gcry_cipher_setkey (hd, key, keylen); + xfree (key); + } + } + if (!rc) + rc = gcry_cipher_decrypt (hd, outbuf, protectedlen, + protected, protectedlen); + gcry_cipher_close (hd); + if (rc) + { + xfree (outbuf); + return rc; + } + /* Do a quick check first. */ + if (*outbuf != '(' && outbuf[1] != '(') + { + xfree (outbuf); + return gpg_error (GPG_ERR_BAD_PASSPHRASE); + } + /* Check that we have a consistent S-Exp. */ + reallen = gcry_sexp_canon_len (outbuf, protectedlen, NULL, NULL); + if (!reallen || (reallen + blklen < protectedlen) ) + { + xfree (outbuf); + return gpg_error (GPG_ERR_BAD_PASSPHRASE); + } + *result = outbuf; + return 0; +} + + +/* Merge the parameter list contained in CLEARTEXT with the original + protect lists PROTECTEDKEY by replacing the list at REPLACEPOS. + Return the new list in RESULT and the MIC value in the 20 byte + buffer SHA1HASH. */ +static int +merge_lists (const unsigned char *protectedkey, + size_t replacepos, + const unsigned char *cleartext, + unsigned char *sha1hash, + unsigned char **result, size_t *resultlen) +{ + size_t n, newlistlen; + unsigned char *newlist, *p; + const unsigned char *s; + const unsigned char *startpos, *endpos; + int i, rc; + + *result = NULL; + *resultlen = 0; + + if (replacepos < 26) + return gpg_error (GPG_ERR_BUG); + + /* Estimate the required size of the resulting list. We have a large + safety margin of >20 bytes (MIC hash from CLEARTEXT and the + removed "protected-" */ + newlistlen = gcry_sexp_canon_len (protectedkey, 0, NULL, NULL); + if (!newlistlen) + return gpg_error (GPG_ERR_BUG); + n = gcry_sexp_canon_len (cleartext, 0, NULL, NULL); + if (!n) + return gpg_error (GPG_ERR_BUG); + newlistlen += n; + newlist = gcry_malloc_secure (newlistlen); + if (!newlist) + return out_of_core (); + + /* Copy the initial segment */ + strcpy ((char*)newlist, "(11:private-key"); + p = newlist + 15; + memcpy (p, protectedkey+15+10, replacepos-15-10); + p += replacepos-15-10; + + /* copy the cleartext */ + s = cleartext; + if (*s != '(' && s[1] != '(') + return gpg_error (GPG_ERR_BUG); /*we already checked this */ + s += 2; + startpos = s; + while ( *s == '(' ) + { + s++; + n = snext (&s); + if (!n) + goto invalid_sexp; + s += n; + n = snext (&s); + if (!n) + goto invalid_sexp; + s += n; + if ( *s != ')' ) + goto invalid_sexp; + s++; + } + if ( *s != ')' ) + goto invalid_sexp; + endpos = s; + s++; + /* short intermezzo: Get the MIC */ + if (*s != '(') + goto invalid_sexp; + s++; + n = snext (&s); + if (!smatch (&s, n, "hash")) + goto invalid_sexp; + n = snext (&s); + if (!smatch (&s, n, "sha1")) + goto invalid_sexp; + n = snext (&s); + if (n != 20) + goto invalid_sexp; + memcpy (sha1hash, s, 20); + s += n; + if (*s != ')') + goto invalid_sexp; + /* end intermezzo */ + + /* append the parameter list */ + memcpy (p, startpos, endpos - startpos); + p += endpos - startpos; + + /* skip overt the protected list element in the original list */ + s = protectedkey + replacepos; + assert (*s == '('); + s++; + i = 1; + rc = sskip (&s, &i); + if (rc) + goto failure; + startpos = s; + i = 2; /* we are inside this level */ + rc = sskip (&s, &i); + if (rc) + goto failure; + assert (s[-1] == ')'); + endpos = s; /* one behind the end of the list */ + + /* append the rest */ + memcpy (p, startpos, endpos - startpos); + p += endpos - startpos; + + /* ready */ + *result = newlist; + *resultlen = newlistlen; + return 0; + + failure: + wipememory (newlist, newlistlen); + xfree (newlist); + return rc; + + invalid_sexp: + wipememory (newlist, newlistlen); + xfree (newlist); + return gpg_error (GPG_ERR_INV_SEXP); +} + + + +/* Unprotect the key encoded in canonical format. We assume a valid + S-Exp here. */ +int +agent_unprotect (const unsigned char *protectedkey, const char *passphrase, + unsigned char **result, size_t *resultlen) +{ + int rc; + const unsigned char *s; + size_t n; + int infidx, i; + unsigned char sha1hash[20], sha1hash2[20]; + const unsigned char *s2ksalt; + unsigned long s2kcount; + const unsigned char *iv; + const unsigned char *prot_begin; + unsigned char *cleartext; + unsigned char *final; + size_t finallen; + + s = protectedkey; + if (*s != '(') + return gpg_error (GPG_ERR_INV_SEXP); + s++; + n = snext (&s); + if (!n) + return gpg_error (GPG_ERR_INV_SEXP); + if (!smatch (&s, n, "protected-private-key")) + return gpg_error (GPG_ERR_UNKNOWN_SEXP); + if (*s != '(') + return gpg_error (GPG_ERR_UNKNOWN_SEXP); + s++; + n = snext (&s); + if (!n) + return gpg_error (GPG_ERR_INV_SEXP); + + for (infidx=0; protect_info[infidx].algo + && !smatch (&s, n, protect_info[infidx].algo); infidx++) + ; + if (!protect_info[infidx].algo) + return gpg_error (GPG_ERR_UNSUPPORTED_ALGORITHM); + + /* Now find the list with the protected information. Here is an + example for such a list: + (protected openpgp-s2k3-sha1-aes-cbc + ((sha1 ) ) + ) + */ + for (;;) + { + if (*s != '(') + return gpg_error (GPG_ERR_INV_SEXP); + prot_begin = s; + s++; + n = snext (&s); + if (!n) + return gpg_error (GPG_ERR_INV_SEXP); + if (smatch (&s, n, "protected")) + break; + s += n; + i = 1; + rc = sskip (&s, &i); + if (rc) + return rc; + } + /* found */ + n = snext (&s); + if (!n) + return gpg_error (GPG_ERR_INV_SEXP); + if (!smatch (&s, n, "openpgp-s2k3-sha1-" PROT_CIPHER_STRING "-cbc")) + return gpg_error (GPG_ERR_UNSUPPORTED_PROTECTION); + if (*s != '(' || s[1] != '(') + return gpg_error (GPG_ERR_INV_SEXP); + s += 2; + n = snext (&s); + if (!n) + return gpg_error (GPG_ERR_INV_SEXP); + if (!smatch (&s, n, "sha1")) + return gpg_error (GPG_ERR_UNSUPPORTED_PROTECTION); + n = snext (&s); + if (n != 8) + return gpg_error (GPG_ERR_CORRUPTED_PROTECTION); + s2ksalt = s; + s += n; + n = snext (&s); + if (!n) + return gpg_error (GPG_ERR_CORRUPTED_PROTECTION); + /* We expect a list close as next, so we can simply use strtoul() + here. We might want to check that we only have digits - but this + is nothing we should worry about */ + if (s[n] != ')' ) + return gpg_error (GPG_ERR_INV_SEXP); + s2kcount = strtoul ((const char*)s, NULL, 10); + if (!s2kcount) + return gpg_error (GPG_ERR_CORRUPTED_PROTECTION); + s += n; + s++; /* skip list end */ + + n = snext (&s); + if (n != 16) /* Wrong blocksize for IV (we support only aes-128). */ + return gpg_error (GPG_ERR_CORRUPTED_PROTECTION); + iv = s; + s += n; + if (*s != ')' ) + return gpg_error (GPG_ERR_INV_SEXP); + s++; + n = snext (&s); + if (!n) + return gpg_error (GPG_ERR_INV_SEXP); + + rc = do_decryption (s, n, + passphrase, s2ksalt, s2kcount, + iv, 16, + &cleartext); + if (rc) + return rc; + + rc = merge_lists (protectedkey, prot_begin-protectedkey, cleartext, + sha1hash, &final, &finallen); + /* Albeit cleartext has been allocated in secure memory and thus + xfree will wipe it out, we do an extra wipe just in case + somethings goes badly wrong. */ + wipememory (cleartext, n); + xfree (cleartext); + if (rc) + return rc; + + rc = calculate_mic (final, sha1hash2); + if (!rc && memcmp (sha1hash, sha1hash2, 20)) + rc = gpg_error (GPG_ERR_CORRUPTED_PROTECTION); + if (rc) + { + wipememory (final, finallen); + xfree (final); + return rc; + } + + *result = final; + *resultlen = gcry_sexp_canon_len (final, 0, NULL, NULL); + return 0; +} + +/* Check the type of the private key, this is one of the constants: + PRIVATE_KEY_UNKNOWN if we can't figure out the type (this is the + value 0), PRIVATE_KEY_CLEAR for an unprotected private key. + PRIVATE_KEY_PROTECTED for an protected private key or + PRIVATE_KEY_SHADOWED for a sub key where the secret parts are stored + elsewhere. */ +int +agent_private_key_type (const unsigned char *privatekey) +{ + const unsigned char *s; + size_t n; + + s = privatekey; + if (*s != '(') + return PRIVATE_KEY_UNKNOWN; + s++; + n = snext (&s); + if (!n) + return PRIVATE_KEY_UNKNOWN; + if (smatch (&s, n, "protected-private-key")) + return PRIVATE_KEY_PROTECTED; + if (smatch (&s, n, "shadowed-private-key")) + return PRIVATE_KEY_SHADOWED; + if (smatch (&s, n, "private-key")) + return PRIVATE_KEY_CLEAR; + return PRIVATE_KEY_UNKNOWN; +} + + + +/* Transform a passphrase into a suitable key of length KEYLEN and + store this key in the caller provided buffer KEY. The caller must + provide an HASHALGO, a valid S2KMODE (see rfc-2440) and depending on + that mode an S2KSALT of 8 random bytes and an S2KCOUNT (a suitable + value is 96). + + Returns an error code on failure. */ +static int +hash_passphrase (const char *passphrase, int hashalgo, + int s2kmode, + const unsigned char *s2ksalt, + unsigned long s2kcount, + unsigned char *key, size_t keylen) +{ + int rc; + gcry_md_hd_t md; + int pass, i; + int used = 0; + int pwlen = strlen (passphrase); + + if ( (s2kmode != 0 && s2kmode != 1 && s2kmode != 3) + || !hashalgo || !keylen || !key || !passphrase) + return gpg_error (GPG_ERR_INV_VALUE); + if ((s2kmode == 1 ||s2kmode == 3) && !s2ksalt) + return gpg_error (GPG_ERR_INV_VALUE); + + rc = gcry_md_open (&md, hashalgo, GCRY_MD_FLAG_SECURE); + if (rc) + return rc; + + for (pass=0; used < keylen; pass++) + { + if (pass) + { + gcry_md_reset (md); + for (i=0; i < pass; i++) /* preset the hash context */ + gcry_md_putc (md, 0); + } + + if (s2kmode == 1 || s2kmode == 3) + { + int len2 = pwlen + 8; + unsigned long count = len2; + + if (s2kmode == 3) + { + count = (16ul + (s2kcount & 15)) << ((s2kcount >> 4) + 6); + if (count < len2) + count = len2; + } + + while (count > len2) + { + gcry_md_write (md, s2ksalt, 8); + gcry_md_write (md, passphrase, pwlen); + count -= len2; + } + if (count < 8) + gcry_md_write (md, s2ksalt, count); + else + { + gcry_md_write (md, s2ksalt, 8); + count -= 8; + gcry_md_write (md, passphrase, count); + } + } + else + gcry_md_write (md, passphrase, pwlen); + + gcry_md_final (md); + i = gcry_md_get_algo_dlen (hashalgo); + if (i > keylen - used) + i = keylen - used; + memcpy (key+used, gcry_md_read (md, hashalgo), i); + used += i; + } + gcry_md_close(md); + return 0; +} + + + + +/* Create an canonical encoded S-expression with the shadow info from + a card's SERIALNO and the IDSTRING. */ +unsigned char * +make_shadow_info (const char *serialno, const char *idstring) +{ + const char *s; + char *info, *p; + char numbuf[21]; + int n; + + for (s=serialno, n=0; *s && s[1]; s += 2) + n++; + + info = p = xtrymalloc (1 + 21 + n + + 21 + strlen (idstring) + 1 + 1); + if (!info) + return NULL; + *p++ = '('; + sprintf (numbuf, "%d:", n); + p = stpcpy (p, numbuf); + for (s=serialno; *s && s[1]; s += 2) + *(unsigned char *)p++ = xtoi_2 (s); + sprintf (numbuf, "%d:", strlen (idstring)); + p = stpcpy (p, numbuf); + p = stpcpy (p, idstring); + *p++ = ')'; + *p = 0; + return (unsigned char *)info; +} + + + +/* Create a shadow key from a public key. We use the shadow protocol + "ti-v1" and insert the S-expressionn SHADOW_INFO. The resulting + S-expression is returned in an allocated buffer RESULT will point + to. The input parameters are expected to be valid canonicalized + S-expressions */ +int +agent_shadow_key (const unsigned char *pubkey, + const unsigned char *shadow_info, + unsigned char **result) +{ + const unsigned char *s; + const unsigned char *point; + size_t n; + int depth = 0; + char *p; + size_t pubkey_len = gcry_sexp_canon_len (pubkey, 0, NULL,NULL); + size_t shadow_info_len = gcry_sexp_canon_len (shadow_info, 0, NULL,NULL); + + if (!pubkey_len || !shadow_info_len) + return gpg_error (GPG_ERR_INV_VALUE); + s = pubkey; + if (*s != '(') + return gpg_error (GPG_ERR_INV_SEXP); + depth++; + s++; + n = snext (&s); + if (!n) + return gpg_error (GPG_ERR_INV_SEXP); + if (!smatch (&s, n, "public-key")) + return gpg_error (GPG_ERR_UNKNOWN_SEXP); + if (*s != '(') + return gpg_error (GPG_ERR_UNKNOWN_SEXP); + depth++; + s++; + n = snext (&s); + if (!n) + return gpg_error (GPG_ERR_INV_SEXP); + s += n; /* skip over the algorithm name */ + + while (*s != ')') + { + if (*s != '(') + return gpg_error (GPG_ERR_INV_SEXP); + depth++; + s++; + n = snext (&s); + if (!n) + return gpg_error (GPG_ERR_INV_SEXP); + s += n; + n = snext (&s); + if (!n) + return gpg_error (GPG_ERR_INV_SEXP); + s +=n; /* skip value */ + if (*s != ')') + return gpg_error (GPG_ERR_INV_SEXP); + depth--; + s++; + } + point = s; /* insert right before the point */ + depth--; + s++; + assert (depth == 1); + + /* Calculate required length by taking in account: the "shadowed-" + prefix, the "shadowed", "t1-v1" as well as some parenthesis */ + n = 12 + pubkey_len + 1 + 3+8 + 2+5 + shadow_info_len + 1; + *result = xtrymalloc (n); + p = (char*)*result; + if (!p) + return out_of_core (); + p = stpcpy (p, "(20:shadowed-private-key"); + /* (10:public-key ...)*/ + memcpy (p, pubkey+14, point - (pubkey+14)); + p += point - (pubkey+14); + p = stpcpy (p, "(8:shadowed5:t1-v1"); + memcpy (p, shadow_info, shadow_info_len); + p += shadow_info_len; + *p++ = ')'; + memcpy (p, point, pubkey_len - (point - pubkey)); + p += pubkey_len - (point - pubkey); + + return 0; +} + +/* Parse a canonical encoded shadowed key and return a pointer to the + inner list with the shadow_info */ +int +agent_get_shadow_info (const unsigned char *shadowkey, + unsigned char const **shadow_info) +{ + const unsigned char *s; + size_t n; + int depth = 0; + + s = shadowkey; + if (*s != '(') + return gpg_error (GPG_ERR_INV_SEXP); + depth++; + s++; + n = snext (&s); + if (!n) + return gpg_error (GPG_ERR_INV_SEXP); + if (!smatch (&s, n, "shadowed-private-key")) + return gpg_error (GPG_ERR_UNKNOWN_SEXP); + if (*s != '(') + return gpg_error (GPG_ERR_UNKNOWN_SEXP); + depth++; + s++; + n = snext (&s); + if (!n) + return gpg_error (GPG_ERR_INV_SEXP); + s += n; /* skip over the algorithm name */ + + for (;;) + { + if (*s == ')') + return gpg_error (GPG_ERR_UNKNOWN_SEXP); + if (*s != '(') + return gpg_error (GPG_ERR_INV_SEXP); + depth++; + s++; + n = snext (&s); + if (!n) + return gpg_error (GPG_ERR_INV_SEXP); + if (smatch (&s, n, "shadowed")) + break; + s += n; + n = snext (&s); + if (!n) + return gpg_error (GPG_ERR_INV_SEXP); + s +=n; /* skip value */ + if (*s != ')') + return gpg_error (GPG_ERR_INV_SEXP); + depth--; + s++; + } + /* Found the shadowed list, S points to the protocol */ + n = snext (&s); + if (!n) + return gpg_error (GPG_ERR_INV_SEXP); + if (smatch (&s, n, "t1-v1")) + { + if (*s != '(') + return gpg_error (GPG_ERR_INV_SEXP); + *shadow_info = s; + } + else + return gpg_error (GPG_ERR_UNSUPPORTED_PROTOCOL); + return 0; +} + diff --git a/agent/query.c b/agent/query.c new file mode 100644 index 000000000..0516bec03 --- /dev/null +++ b/agent/query.c @@ -0,0 +1,704 @@ +/* query.c - fork of the pinentry to query stuff from the user + * 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. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef HAVE_W32_SYSTEM +#include +#endif +#include + +#include "agent.h" +#include "i18n.h" +#include + +#ifdef _POSIX_OPEN_MAX +#define MAX_OPEN_FDS _POSIX_OPEN_MAX +#else +#define MAX_OPEN_FDS 20 +#endif + + +/* Because access to the pinentry must be serialized (it is and shall + be a global mutual dialog) we should better timeout further + requests after some time. 2 minutes seem to be a reasonable + time. */ +#define LOCK_TIMEOUT (1*60) + +/* The assuan context of the current pinentry. */ +static assuan_context_t entry_ctx; + +/* The control variable of the connection owning the current pinentry. + This is only valid if ENTRY_CTX is not NULL. Note, that we care + only about the value of the pointer and that it should never be + dereferenced. */ +static ctrl_t entry_owner; + +/* A mutex used to serialize access to the pinentry. */ +static pth_mutex_t entry_lock; + +/* The thread ID of the popup working thread. */ +static pth_t popup_tid; + +/* A flag used in communication between the popup working thread and + its stop function. */ +static int popup_finished; + + + +/* Data to be passed to our callbacks, */ +struct entry_parm_s +{ + int lines; + size_t size; + unsigned char *buffer; +}; + + + + +/* This function must be called once to initialize this module. This + has to be done before a second thread is spawned. We can't do the + static initialization because Pth emulation code might not be able + to do a static init; in particular, it is not possible for W32. */ +void +initialize_module_query (void) +{ + static int initialized; + + if (!initialized) + { + if (pth_mutex_init (&entry_lock)) + initialized = 1; + } +} + + + +static void +dump_mutex_state (pth_mutex_t *m) +{ + if (!(m->mx_state & PTH_MUTEX_INITIALIZED)) + log_printf ("not_initialized"); + else if (!(m->mx_state & PTH_MUTEX_LOCKED)) + log_printf ("not_locked"); + else + log_printf ("locked tid=0x%lx count=%lu", (long)m->mx_owner, m->mx_count); +} + + +/* This function may be called to print infromation pertaining to the + current state of this module to the log. */ +void +agent_query_dump_state (void) +{ + log_info ("agent_query_dump_state: entry_lock="); + dump_mutex_state (&entry_lock); + log_printf ("\n"); + log_info ("agent_query_dump_state: entry_ctx=%p pid=%ld popup_tid=%p\n", + entry_ctx, (long)assuan_get_pid (entry_ctx), popup_tid); +} + +/* Called to make sure that a popup window owned by the current + connection gets closed. */ +void +agent_reset_query (ctrl_t ctrl) +{ + if (entry_ctx && popup_tid && entry_owner == ctrl) + { + agent_popup_message_stop (ctrl); + } +} + + +/* Unlock the pinentry so that another thread can start one and + disconnect that pinentry - we do this after the unlock so that a + stalled pinentry does not block other threads. Fixme: We should + have a timeout in Assuan for the disconnect operation. */ +static int +unlock_pinentry (int rc) +{ + assuan_context_t ctx = entry_ctx; + + entry_ctx = NULL; + if (!pth_mutex_release (&entry_lock)) + { + log_error ("failed to release the entry lock\n"); + if (!rc) + rc = gpg_error (GPG_ERR_INTERNAL); + } + assuan_disconnect (ctx); + return rc; +} + + +/* To make sure we leave no secrets in our image after forking of the + pinentry, we use this callback. */ +static void +atfork_cb (void *opaque, int where) +{ + if (!where) + gcry_control (GCRYCTL_TERM_SECMEM); +} + + +/* Fork off the pin entry if this has not already been done. Note, + that this function must always be used to aquire the lock for the + pinentry - we will serialize _all_ pinentry calls. + */ +static int +start_pinentry (ctrl_t ctrl) +{ + int rc; + const char *pgmname; + ASSUAN_CONTEXT ctx; + const char *argv[5]; + int no_close_list[3]; + int i; + pth_event_t evt; + + evt = pth_event (PTH_EVENT_TIME, pth_timeout (LOCK_TIMEOUT, 0)); + if (!pth_mutex_acquire (&entry_lock, 0, evt)) + { + if (pth_event_occurred (evt)) + rc = gpg_error (GPG_ERR_TIMEOUT); + else + rc = gpg_error (GPG_ERR_INTERNAL); + pth_event_free (evt, PTH_FREE_THIS); + log_error (_("failed to acquire the pinentry lock: %s\n"), + gpg_strerror (rc)); + return rc; + } + pth_event_free (evt, PTH_FREE_THIS); + + entry_owner = ctrl; + + if (entry_ctx) + return 0; + + if (opt.verbose) + log_info ("starting a new PIN Entry\n"); + + if (fflush (NULL)) + { + gpg_error_t tmperr = gpg_error (gpg_err_code_from_errno (errno)); + log_error ("error flushing pending output: %s\n", strerror (errno)); + return unlock_pinentry (tmperr); + } + + if (!opt.pinentry_program || !*opt.pinentry_program) + opt.pinentry_program = GNUPG_DEFAULT_PINENTRY; + if ( !(pgmname = strrchr (opt.pinentry_program, '/'))) + pgmname = opt.pinentry_program; + else + pgmname++; + + argv[0] = pgmname; + if (ctrl->display && !opt.keep_display) + { + argv[1] = "--display"; + argv[2] = ctrl->display; + argv[3] = NULL; + } + else + argv[1] = NULL; + + i=0; + if (!opt.running_detached) + { + if (log_get_fd () != -1) + no_close_list[i++] = log_get_fd (); + no_close_list[i++] = fileno (stderr); + } + no_close_list[i] = -1; + + /* Connect to the pinentry and perform initial handshaking */ + rc = assuan_pipe_connect2 (&ctx, opt.pinentry_program, (char**)argv, + no_close_list, atfork_cb, NULL); + if (rc) + { + log_error ("can't connect to the PIN entry module: %s\n", + assuan_strerror (rc)); + return unlock_pinentry (gpg_error (GPG_ERR_NO_PIN_ENTRY)); + } + entry_ctx = ctx; + + if (DBG_ASSUAN) + log_debug ("connection to PIN entry established\n"); + + rc = assuan_transact (entry_ctx, + opt.no_grab? "OPTION no-grab":"OPTION grab", + NULL, NULL, NULL, NULL, NULL, NULL); + if (rc) + return unlock_pinentry (map_assuan_err (rc)); + if (ctrl->ttyname) + { + char *optstr; + if (asprintf (&optstr, "OPTION ttyname=%s", ctrl->ttyname) < 0 ) + return unlock_pinentry (out_of_core ()); + rc = assuan_transact (entry_ctx, optstr, NULL, NULL, NULL, NULL, NULL, + NULL); + free (optstr); + if (rc) + return unlock_pinentry (map_assuan_err (rc)); + } + if (ctrl->ttytype) + { + char *optstr; + if (asprintf (&optstr, "OPTION ttytype=%s", ctrl->ttytype) < 0 ) + return unlock_pinentry (out_of_core ()); + rc = assuan_transact (entry_ctx, optstr, NULL, NULL, NULL, NULL, NULL, + NULL); + if (rc) + return unlock_pinentry (map_assuan_err (rc)); + } + if (ctrl->lc_ctype) + { + char *optstr; + if (asprintf (&optstr, "OPTION lc-ctype=%s", ctrl->lc_ctype) < 0 ) + return unlock_pinentry (out_of_core ()); + rc = assuan_transact (entry_ctx, optstr, NULL, NULL, NULL, NULL, NULL, + NULL); + if (rc) + return unlock_pinentry (map_assuan_err (rc)); + } + if (ctrl->lc_messages) + { + char *optstr; + if (asprintf (&optstr, "OPTION lc-messages=%s", ctrl->lc_messages) < 0 ) + return unlock_pinentry (out_of_core ()); + rc = assuan_transact (entry_ctx, optstr, NULL, NULL, NULL, NULL, NULL, + NULL); + if (rc) + return unlock_pinentry (map_assuan_err (rc)); + } + return 0; +} + + +static AssuanError +getpin_cb (void *opaque, const void *buffer, size_t length) +{ + struct entry_parm_s *parm = opaque; + + if (!buffer) + return 0; + + /* we expect the pin to fit on one line */ + if (parm->lines || length >= parm->size) + return ASSUAN_Too_Much_Data; + + /* fixme: we should make sure that the assuan buffer is allocated in + secure memory or read the response byte by byte */ + memcpy (parm->buffer, buffer, length); + parm->buffer[length] = 0; + parm->lines++; + return 0; +} + + +static int +all_digitsp( const char *s) +{ + for (; *s && *s >= '0' && *s <= '9'; s++) + ; + return !*s; +} + + + +/* Call the Entry and ask for the PIN. We do check for a valid PIN + number here and repeat it as long as we have invalid formed + numbers. */ +int +agent_askpin (ctrl_t ctrl, + const char *desc_text, const char *prompt_text, + const char *initial_errtext, + struct pin_entry_info_s *pininfo) +{ + int rc; + char line[ASSUAN_LINELENGTH]; + struct entry_parm_s parm; + const char *errtext = NULL; + int is_pin = 0; + + if (opt.batch) + return 0; /* fixme: we should return BAD PIN */ + + if (!pininfo || pininfo->max_length < 1) + return gpg_error (GPG_ERR_INV_VALUE); + if (!desc_text && pininfo->min_digits) + desc_text = _("Please enter your PIN, so that the secret key " + "can be unlocked for this session"); + else if (!desc_text) + desc_text = _("Please enter your passphrase, so that the secret key " + "can be unlocked for this session"); + + if (prompt_text) + is_pin = !!strstr (prompt_text, "PIN"); + else + is_pin = desc_text && strstr (desc_text, "PIN"); + + rc = start_pinentry (ctrl); + if (rc) + return rc; + + snprintf (line, DIM(line)-1, "SETDESC %s", desc_text); + line[DIM(line)-1] = 0; + rc = assuan_transact (entry_ctx, line, NULL, NULL, NULL, NULL, NULL, NULL); + if (rc) + return unlock_pinentry (map_assuan_err (rc)); + + snprintf (line, DIM(line)-1, "SETPROMPT %s", + prompt_text? prompt_text : is_pin? "PIN:" : "Passphrase:"); + line[DIM(line)-1] = 0; + rc = assuan_transact (entry_ctx, line, NULL, NULL, NULL, NULL, NULL, NULL); + if (rc) + return unlock_pinentry (map_assuan_err (rc)); + + + if (initial_errtext) + { + snprintf (line, DIM(line)-1, "SETERROR %s", initial_errtext); + line[DIM(line)-1] = 0; + rc = assuan_transact (entry_ctx, line, + NULL, NULL, NULL, NULL, NULL, NULL); + if (rc) + return unlock_pinentry (map_assuan_err (rc)); + } + + for (;pininfo->failed_tries < pininfo->max_tries; pininfo->failed_tries++) + { + memset (&parm, 0, sizeof parm); + parm.size = pininfo->max_length; + parm.buffer = (unsigned char*)pininfo->pin; + + if (errtext) + { + /* fixme: should we show the try count? It must be translated */ + snprintf (line, DIM(line)-1, "SETERROR %s (try %d of %d)", + errtext, pininfo->failed_tries+1, pininfo->max_tries); + line[DIM(line)-1] = 0; + rc = assuan_transact (entry_ctx, line, + NULL, NULL, NULL, NULL, NULL, NULL); + if (rc) + return unlock_pinentry (map_assuan_err (rc)); + errtext = NULL; + } + + rc = assuan_transact (entry_ctx, "GETPIN", getpin_cb, &parm, + NULL, NULL, NULL, NULL); + if (rc == ASSUAN_Too_Much_Data) + errtext = is_pin? _("PIN too long") + : _("Passphrase too long"); + else if (rc) + return unlock_pinentry (map_assuan_err (rc)); + + if (!errtext && pininfo->min_digits) + { + /* do some basic checks on the entered PIN. */ + if (!all_digitsp (pininfo->pin)) + errtext = _("Invalid characters in PIN"); + else if (pininfo->max_digits + && strlen (pininfo->pin) > pininfo->max_digits) + errtext = _("PIN too long"); + else if (strlen (pininfo->pin) < pininfo->min_digits) + errtext = _("PIN too short"); + } + + if (!errtext && pininfo->check_cb) + { + /* More checks by utilizing the optional callback. */ + pininfo->cb_errtext = NULL; + rc = pininfo->check_cb (pininfo); + if (rc == -1 && pininfo->cb_errtext) + errtext = pininfo->cb_errtext; + else if (gpg_err_code (rc) == GPG_ERR_BAD_PASSPHRASE + || gpg_err_code (rc) == GPG_ERR_BAD_PIN) + errtext = (is_pin? _("Bad PIN") + : _("Bad Passphrase")); + else if (rc) + return unlock_pinentry (map_assuan_err (rc)); + } + + if (!errtext) + return unlock_pinentry (0); /* okay, got a PIN or passphrase */ + } + + return unlock_pinentry (gpg_error (pininfo->min_digits? GPG_ERR_BAD_PIN + : GPG_ERR_BAD_PASSPHRASE)); +} + + + +/* Ask for the passphrase using the supplied arguments. The + passphrase is returned in RETPASS as an hex encoded string to be + freed by the caller */ +int +agent_get_passphrase (ctrl_t ctrl, + char **retpass, const char *desc, const char *prompt, + const char *errtext) +{ + + int rc; + char line[ASSUAN_LINELENGTH]; + struct entry_parm_s parm; + unsigned char *p; + char *hexstring; + int i; + + *retpass = NULL; + if (opt.batch) + return gpg_error (GPG_ERR_BAD_PASSPHRASE); + + rc = start_pinentry (ctrl); + if (rc) + return rc; + + if (!prompt) + prompt = desc && strstr (desc, "PIN")? "PIN": _("Passphrase"); + + + if (desc) + snprintf (line, DIM(line)-1, "SETDESC %s", desc); + else + snprintf (line, DIM(line)-1, "RESET"); + line[DIM(line)-1] = 0; + rc = assuan_transact (entry_ctx, line, NULL, NULL, NULL, NULL, NULL, NULL); + if (rc) + return unlock_pinentry (map_assuan_err (rc)); + + snprintf (line, DIM(line)-1, "SETPROMPT %s", prompt); + line[DIM(line)-1] = 0; + rc = assuan_transact (entry_ctx, line, NULL, NULL, NULL, NULL, NULL, NULL); + if (rc) + return unlock_pinentry (map_assuan_err (rc)); + + if (errtext) + { + snprintf (line, DIM(line)-1, "SETERROR %s", errtext); + line[DIM(line)-1] = 0; + rc = assuan_transact (entry_ctx, line, NULL, NULL, NULL, NULL, NULL, NULL); + if (rc) + return unlock_pinentry (map_assuan_err (rc)); + } + + memset (&parm, 0, sizeof parm); + parm.size = ASSUAN_LINELENGTH/2 - 5; + parm.buffer = gcry_malloc_secure (parm.size+10); + if (!parm.buffer) + return unlock_pinentry (out_of_core ()); + + assuan_begin_confidential (entry_ctx); + rc = assuan_transact (entry_ctx, "GETPIN", getpin_cb, &parm, NULL, NULL, NULL, NULL); + if (rc) + { + xfree (parm.buffer); + return unlock_pinentry (map_assuan_err (rc)); + } + + hexstring = gcry_malloc_secure (strlen ((char*)parm.buffer)*2+1); + if (!hexstring) + { + gpg_error_t tmperr = out_of_core (); + xfree (parm.buffer); + return unlock_pinentry (tmperr); + } + + for (i=0, p=parm.buffer; *p; p++, i += 2) + sprintf (hexstring+i, "%02X", *p); + + xfree (parm.buffer); + *retpass = hexstring; + return unlock_pinentry (0); +} + + + +/* Pop up the PIN-entry, display the text and the prompt and ask the + user to confirm this. We return 0 for success, ie. the user + confirmed it, GPG_ERR_NOT_CONFIRMED for what the text says or an + other error. */ +int +agent_get_confirmation (ctrl_t ctrl, + const char *desc, const char *ok, const char *cancel) +{ + int rc; + char line[ASSUAN_LINELENGTH]; + + rc = start_pinentry (ctrl); + if (rc) + return rc; + + if (desc) + snprintf (line, DIM(line)-1, "SETDESC %s", desc); + else + snprintf (line, DIM(line)-1, "RESET"); + line[DIM(line)-1] = 0; + rc = assuan_transact (entry_ctx, line, NULL, NULL, NULL, NULL, NULL, NULL); + if (rc) + return unlock_pinentry (map_assuan_err (rc)); + + if (ok) + { + snprintf (line, DIM(line)-1, "SETOK %s", ok); + line[DIM(line)-1] = 0; + rc = assuan_transact (entry_ctx, line, NULL, NULL, NULL, NULL, NULL, NULL); + if (rc) + return unlock_pinentry (map_assuan_err (rc)); + } + if (cancel) + { + snprintf (line, DIM(line)-1, "SETCANCEL %s", cancel); + line[DIM(line)-1] = 0; + rc = assuan_transact (entry_ctx, line, NULL, NULL, NULL, NULL, NULL, NULL); + if (rc) + return unlock_pinentry (map_assuan_err (rc)); + } + + rc = assuan_transact (entry_ctx, "CONFIRM", NULL, NULL, NULL, NULL, NULL, NULL); + return unlock_pinentry (map_assuan_err (rc)); +} + + +/* The thread running the popup message. */ +static void * +popup_message_thread (void *arg) +{ + assuan_transact (entry_ctx, "CONFIRM", NULL, NULL, NULL, NULL, NULL, NULL); + popup_finished = 1; + return NULL; +} + + +/* Pop up a message window similar to the confirm one but keep it open + until agent_popup_message_stop has been called. It is crucial for + the caller to make sure that the stop function gets called as soon + as the message is not anymore required becuase the message is + system modal and all other attempts to use the pinentry will fail + (after a timeout). */ +int +agent_popup_message_start (ctrl_t ctrl, const char *desc, + const char *ok_btn, const char *cancel_btn) +{ + int rc; + char line[ASSUAN_LINELENGTH]; + pth_attr_t tattr; + + rc = start_pinentry (ctrl); + if (rc) + return rc; + + if (desc) + snprintf (line, DIM(line)-1, "SETDESC %s", desc); + else + snprintf (line, DIM(line)-1, "RESET"); + line[DIM(line)-1] = 0; + rc = assuan_transact (entry_ctx, line, NULL, NULL, NULL, NULL, NULL, NULL); + if (rc) + return unlock_pinentry (map_assuan_err (rc)); + + if (ok_btn) + { + snprintf (line, DIM(line)-1, "SETOK %s", ok_btn); + line[DIM(line)-1] = 0; + rc = assuan_transact (entry_ctx, line, NULL,NULL,NULL,NULL,NULL,NULL); + if (rc) + return unlock_pinentry (map_assuan_err (rc)); + } + if (cancel_btn) + { + snprintf (line, DIM(line)-1, "SETCANCEL %s", cancel_btn); + line[DIM(line)-1] = 0; + rc = assuan_transact (entry_ctx, line, NULL,NULL,NULL,NULL,NULL,NULL); + if (rc) + return unlock_pinentry (map_assuan_err (rc)); + } + + tattr = pth_attr_new(); + pth_attr_set (tattr, PTH_ATTR_JOINABLE, 1); + pth_attr_set (tattr, PTH_ATTR_STACK_SIZE, 256*1024); + pth_attr_set (tattr, PTH_ATTR_NAME, "popup-message"); + + popup_finished = 0; + popup_tid = pth_spawn (tattr, popup_message_thread, NULL); + if (!popup_tid) + { + rc = gpg_error_from_errno (errno); + log_error ("error spawning popup message handler: %s\n", + strerror (errno) ); + pth_attr_destroy (tattr); + return unlock_pinentry (rc); + } + pth_attr_destroy (tattr); + + return 0; +} + +/* Close a popup window. */ +void +agent_popup_message_stop (ctrl_t ctrl) +{ + int rc; + pid_t pid; + + if (!popup_tid || !entry_ctx) + { + log_debug ("agent_popup_message_stop called with no active popup\n"); + return; + } + + pid = assuan_get_pid (entry_ctx); + if (pid == (pid_t)(-1)) + ; /* No pid available can't send a kill. */ + else if (popup_finished) + ; /* Already finished and ready for joining. */ + else if (pid && ((rc=waitpid (pid, NULL, WNOHANG))==-1 || (rc == pid)) ) + { /* The daemon already died. No need to send a kill. However + because we already waited for the process, we need to tell + assuan that it should not wait again (done by + unlock_pinentry). */ + if (rc == pid) + assuan_set_flag (entry_ctx, ASSUAN_NO_WAITPID, 1); + } + else + kill (pid, SIGINT); + + /* Now wait for the thread to terminate. */ + rc = pth_join (popup_tid, NULL); + if (!rc) + log_debug ("agent_popup_message_stop: pth_join failed: %s\n", + strerror (errno)); + popup_tid = NULL; + entry_owner = NULL; + + /* Now we can close the connection. */ + unlock_pinentry (0); +} + + diff --git a/agent/t-protect.c b/agent/t-protect.c new file mode 100644 index 000000000..9ddd49414 --- /dev/null +++ b/agent/t-protect.c @@ -0,0 +1,309 @@ +/* t-protect.c - Module tests for protect.c + * 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 +#include +#include +#include +#include + +#include "agent.h" + + +#define pass() do { ; } while(0) +#define fail() do { fprintf (stderr, "%s:%d: test failed\n",\ + __FILE__,__LINE__); \ + exit (1); \ + } while(0) + + +static void +test_agent_protect (void) +{ + /* Protect the key encoded in canonical format in PLAINKEY. We assume + a valid S-Exp here. */ + + unsigned int i; + int ret; + struct key_spec + { + const char *string; + }; + /* Valid RSA key. */ + struct key_spec key_rsa_valid = + { + "\x28\x31\x31\x3A\x70\x72\x69\x76\x61\x74\x65\x2D\x6B\x65\x79\x28\x33\x3A\x72\x73" + "\x61\x28\x31\x3A\x6E\x31\x32\x39\x3A\x00\xB6\xB5\x09\x59\x6A\x9E\xCA\xBC\x93\x92" + "\x12\xF8\x91\xE6\x56\xA6\x26\xBA\x07\xDA\x85\x21\xA9\xCA\xD4\xC0\x8E\x64\x0C\x04" + "\x05\x2F\xBB\x87\xF4\x24\xEF\x1A\x02\x75\xA4\x8A\x92\x99\xAC\x9D\xB6\x9A\xBE\x3D" + "\x01\x24\xE6\xC7\x56\xB1\xF7\xDF\xB9\xB8\x42\xD6\x25\x1A\xEA\x6E\xE8\x53\x90\x49" + "\x5C\xAD\xA7\x3D\x67\x15\x37\xFC\xE5\x85\x0A\x93\x2F\x32\xBA\xB6\x0A\xB1\xAC\x1F" + "\x85\x2C\x1F\x83\xC6\x25\xE7\xA7\xD7\x0C\xDA\x9E\xF1\x6D\x5C\x8E\x47\x73\x9D\x77" + "\xDF\x59\x26\x1A\xBE\x84\x54\x80\x7F\xF4\x41\xE1\x43\xFB\xD3\x7F\x85\x45\x29\x28" + "\x31\x3A\x65\x33\x3A\x01\x00\x01\x29\x28\x31\x3A\x64\x31\x32\x38\x3A\x07\x7A\xD3" + "\xDE\x28\x42\x45\xF4\x80\x6A\x1B\x82\xB7\x9E\x61\x6F\xBD\xE8\x21\xC8\x2D\x69\x1A" + "\x65\x66\x5E\x57\xB5\xFA\xD3\xF3\x4E\x67\xF4\x01\xE7\xBD\x2E\x28\x69\x9E\x89\xD9" + "\xC4\x96\xCF\x82\x19\x45\xAE\x83\xAC\x7A\x12\x31\x17\x6A\x19\x6B\xA6\x02\x7E\x77" + "\xD8\x57\x89\x05\x5D\x50\x40\x4A\x7A\x2A\x95\xB1\x51\x2F\x91\xF1\x90\xBB\xAE\xF7" + "\x30\xED\x55\x0D\x22\x7D\x51\x2F\x89\xC0\xCD\xB3\x1A\xC0\x6F\xA9\xA1\x95\x03\xDD" + "\xF6\xB6\x6D\x0B\x42\xB9\x69\x1B\xFD\x61\x40\xEC\x17\x20\xFF\xC4\x8A\xE0\x0C\x34" + "\x79\x6D\xC8\x99\xE5\x29\x28\x31\x3A\x70\x36\x35\x3A\x00\xD5\x86\xC7\x8E\x5F\x1B" + "\x4B\xF2\xE7\xCD\x7A\x04\xCA\x09\x19\x11\x70\x6F\x19\x78\x8B\x93\xE4\x4E\xE2\x0A" + "\xAF\x46\x2E\x83\x63\xE9\x8A\x72\x25\x3E\xD8\x45\xCC\xBF\x24\x81\xBB\x35\x1E\x85" + "\x57\xC8\x5B\xCF\xFF\x0D\xAB\xDB\xFF\x8E\x26\xA7\x9A\x09\x38\x09\x6F\x27\x29\x28" + "\x31\x3A\x71\x36\x35\x3A\x00\xDB\x0C\xDF\x60\xF2\x6F\x2A\x29\x6C\x88\xD6\xBF\x9F" + "\x8E\x5B\xE4\x5C\x0D\xDD\x71\x3C\x96\xCC\x73\xEB\xCB\x48\xB0\x61\x74\x09\x43\xF2" + "\x1D\x2A\x93\xD6\xE4\x2A\x72\x11\xE7\xF0\x2A\x95\xDC\xED\x6C\x39\x0A\x67\xAD\x21" + "\xEC\xF7\x39\xAE\x8A\x0C\xA4\x6F\xF2\xEB\xB3\x29\x28\x31\x3A\x75\x36\x34\x3A\x33" + "\x14\x91\x95\xF1\x69\x12\xDB\x20\xA4\x8D\x02\x0D\xBC\x3B\x9E\x38\x81\xB3\x9D\x72" + "\x2B\xF7\x93\x78\xF6\x34\x0F\x43\x14\x8A\x6E\x9F\xC5\xF5\x3E\x28\x53\xB7\x38\x7B" + "\xA4\x44\x3B\xA5\x3A\x52\xFC\xA8\x17\x3D\xE6\xE8\x5B\x42\xF9\x78\x3D\x4A\x78\x17" + "\xD0\x68\x0B\x29\x29\x29\x00" + }; + /* This RSA key is missing the last closing brace. */ + struct key_spec key_rsa_bogus_0 = + { + "\x28\x31\x31\x3A\x70\x72\x69\x76\x61\x74\x65\x2D\x6B\x65\x79\x28\x33\x3A\x72\x73" + "\x61\x28\x31\x3A\x6E\x31\x32\x39\x3A\x00\xB6\xB5\x09\x59\x6A\x9E\xCA\xBC\x93\x92" + "\x12\xF8\x91\xE6\x56\xA6\x26\xBA\x07\xDA\x85\x21\xA9\xCA\xD4\xC0\x8E\x64\x0C\x04" + "\x05\x2F\xBB\x87\xF4\x24\xEF\x1A\x02\x75\xA4\x8A\x92\x99\xAC\x9D\xB6\x9A\xBE\x3D" + "\x01\x24\xE6\xC7\x56\xB1\xF7\xDF\xB9\xB8\x42\xD6\x25\x1A\xEA\x6E\xE8\x53\x90\x49" + "\x5C\xAD\xA7\x3D\x67\x15\x37\xFC\xE5\x85\x0A\x93\x2F\x32\xBA\xB6\x0A\xB1\xAC\x1F" + "\x85\x2C\x1F\x83\xC6\x25\xE7\xA7\xD7\x0C\xDA\x9E\xF1\x6D\x5C\x8E\x47\x73\x9D\x77" + "\xDF\x59\x26\x1A\xBE\x84\x54\x80\x7F\xF4\x41\xE1\x43\xFB\xD3\x7F\x85\x45\x29\x28" + "\x31\x3A\x65\x33\x3A\x01\x00\x01\x29\x28\x31\x3A\x64\x31\x32\x38\x3A\x07\x7A\xD3" + "\xDE\x28\x42\x45\xF4\x80\x6A\x1B\x82\xB7\x9E\x61\x6F\xBD\xE8\x21\xC8\x2D\x69\x1A" + "\x65\x66\x5E\x57\xB5\xFA\xD3\xF3\x4E\x67\xF4\x01\xE7\xBD\x2E\x28\x69\x9E\x89\xD9" + "\xC4\x96\xCF\x82\x19\x45\xAE\x83\xAC\x7A\x12\x31\x17\x6A\x19\x6B\xA6\x02\x7E\x77" + "\xD8\x57\x89\x05\x5D\x50\x40\x4A\x7A\x2A\x95\xB1\x51\x2F\x91\xF1\x90\xBB\xAE\xF7" + "\x30\xED\x55\x0D\x22\x7D\x51\x2F\x89\xC0\xCD\xB3\x1A\xC0\x6F\xA9\xA1\x95\x03\xDD" + "\xF6\xB6\x6D\x0B\x42\xB9\x69\x1B\xFD\x61\x40\xEC\x17\x20\xFF\xC4\x8A\xE0\x0C\x34" + "\x79\x6D\xC8\x99\xE5\x29\x28\x31\x3A\x70\x36\x35\x3A\x00\xD5\x86\xC7\x8E\x5F\x1B" + "\x4B\xF2\xE7\xCD\x7A\x04\xCA\x09\x19\x11\x70\x6F\x19\x78\x8B\x93\xE4\x4E\xE2\x0A" + "\xAF\x46\x2E\x83\x63\xE9\x8A\x72\x25\x3E\xD8\x45\xCC\xBF\x24\x81\xBB\x35\x1E\x85" + "\x57\xC8\x5B\xCF\xFF\x0D\xAB\xDB\xFF\x8E\x26\xA7\x9A\x09\x38\x09\x6F\x27\x29\x28" + "\x31\x3A\x71\x36\x35\x3A\x00\xDB\x0C\xDF\x60\xF2\x6F\x2A\x29\x6C\x88\xD6\xBF\x9F" + "\x8E\x5B\xE4\x5C\x0D\xDD\x71\x3C\x96\xCC\x73\xEB\xCB\x48\xB0\x61\x74\x09\x43\xF2" + "\x1D\x2A\x93\xD6\xE4\x2A\x72\x11\xE7\xF0\x2A\x95\xDC\xED\x6C\x39\x0A\x67\xAD\x21" + "\xEC\xF7\x39\xAE\x8A\x0C\xA4\x6F\xF2\xEB\xB3\x29\x28\x31\x3A\x75\x36\x34\x3A\x33" + "\x14\x91\x95\xF1\x69\x12\xDB\x20\xA4\x8D\x02\x0D\xBC\x3B\x9E\x38\x81\xB3\x9D\x72" + "\x2B\xF7\x93\x78\xF6\x34\x0F\x43\x14\x8A\x6E\x9F\xC5\xF5\x3E\x28\x53\xB7\x38\x7B" + "\xA4\x44\x3B\xA5\x3A\x52\xFC\xA8\x17\x3D\xE6\xE8\x5B\x42\xF9\x78\x3D\x4A\x78\x17" + "\xD0\x68\x0B\x29\x29\x00" + }; + /* This RSA key is the `e' value. */ + struct key_spec key_rsa_bogus_1 = + { + "\x28\x31\x31\x3A\x70\x72\x69\x76\x61\x74\x65\x2D\x6B\x65\x79\x28\x33\x3A\x72\x73" + "\x61\x28\x31\x3A\x6E\x31\x32\x39\x3A\x00\xA8\x80\xB6\x71\xF4\x95\x9F\x49\x84\xED" + "\xC1\x1D\x5F\xFF\xED\x14\x7B\x9C\x6A\x62\x0B\x7B\xE2\x3E\x41\x48\x49\x85\xF5\x64" + "\x50\x04\x9D\x30\xFC\x84\x1F\x01\xC3\xC3\x15\x03\x48\x6D\xFE\x59\x0B\xB0\xD0\x3E" + "\x68\x8A\x05\x7A\x62\xB0\xB9\x6E\xC5\xD2\xA8\xEE\x0C\x6B\xDE\x5E\x3D\x8E\xE8\x8F" + "\xB3\xAE\x86\x99\x7E\xDE\x2B\xC2\x4D\x60\x51\xDB\xB1\x2C\xD0\x38\xEC\x88\x62\x3E" + "\xA9\xDD\x11\x53\x04\x17\xE4\xF2\x07\x50\xDC\x44\xED\x14\xF5\x0B\xAB\x9C\xBC\x24" + "\xC6\xCB\xAD\x0F\x05\x25\x94\xE2\x73\xEB\x14\xD5\xEE\x5E\x18\xF0\x40\x31\x29\x28" + "\x31\x3A\x64\x31\x32\x38\x3A\x40\xD0\x55\x9D\x2A\xA7\xBC\xBF\xE2\x3E\x33\x98\x71" + "\x7B\x37\x3D\xB8\x38\x57\xA1\x43\xEA\x90\x81\x42\xCA\x23\xE1\xBF\x9C\xA8\xBC\xC5" + "\x9B\xF8\x9D\x77\x71\xCD\xD3\x85\x8B\x20\x3A\x92\xE9\xBC\x79\xF3\xF7\xF5\x6D\x15" + "\xA3\x58\x3F\xC2\xEB\xED\x72\xD4\xE0\xCF\xEC\xB3\xEC\xEB\x09\xEA\x1E\x72\x6A\xBA" + "\x95\x82\x2C\x7E\x30\x95\x66\x3F\xA8\x2D\x40\x0F\x7A\x12\x4E\xF0\x71\x0F\x97\xDB" + "\x81\xE4\x39\x6D\x24\x58\xFA\xAB\x3A\x36\x73\x63\x01\x77\x42\xC7\x9A\xEA\x87\xDA" + "\x93\x8F\x6C\x64\xAD\x9E\xF0\xCA\xA2\x89\xA4\x0E\xB3\x25\x73\x29\x28\x31\x3A\x70" + "\x36\x35\x3A\x00\xC3\xF7\x37\x3F\x9D\x93\xEC\xC7\x5E\x4C\xB5\x73\x29\x62\x35\x80" + "\xC6\x7C\x1B\x1E\x68\x5F\x92\x56\x77\x0A\xE2\x8E\x95\x74\x87\xA5\x2F\x83\x2D\xF7" + "\xA1\xC2\x78\x54\x18\x6E\xDE\x35\xF0\x9F\x7A\xCA\x80\x5C\x83\x5C\x44\xAD\x8B\xE7" + "\x5B\xE2\x63\x7D\x6A\xC7\x98\x97\x29\x28\x31\x3A\x71\x36\x35\x3A\x00\xDC\x1F\xB1" + "\xB3\xD8\x13\xE0\x09\x19\xFD\x1C\x58\xA1\x2B\x02\xB4\xC8\xF2\x1C\xE7\xF9\xC6\x3B" + "\x68\xB9\x72\x43\x86\xEF\xA9\x94\x68\x02\xEF\x7D\x77\xE0\x0A\xD1\xD7\x48\xFD\xCD" + "\x98\xDA\x13\x8A\x76\x48\xD4\x0F\x63\x28\xFA\x01\x1B\xF3\xC7\x15\xB8\x53\x22\x7E" + "\x77\x29\x28\x31\x3A\x75\x36\x35\x3A\x00\xB3\xBB\x4D\xEE\x5A\xAF\xD0\xF2\x56\x8A" + "\x10\x2D\x6F\x4B\x2D\x76\x49\x9B\xE9\xA8\x60\x5D\x9E\x7E\x50\x86\xF1\xA1\x0F\x28" + "\x9B\x7B\xE8\xDD\x1F\x87\x4E\x79\x7B\x50\x12\xA7\xB4\x8B\x52\x38\xEC\x7C\xBB\xB9" + "\x55\x87\x11\x1C\x74\xE7\x7F\xA0\xBA\xE3\x34\x5D\x61\xBF\x29\x29\x29\x00" + }; + + struct + { + const char *key; + const char *passphrase; + int no_result_expected; + int compare_results; + unsigned char *result_expected; + size_t resultlen_expected; + int ret_expected; + unsigned char *result; + size_t resultlen; + } specs[] = + { + /* Invalid S-Expressions */ + /* - non-NULL */ + { "", + "passphrase", 1, 0, NULL, 0, GPG_ERR_INV_SEXP, NULL, 0 }, + /* - NULL; disabled, this segfaults */ + //{ NULL, + // "passphrase", 1, NULL, 0, GPG_ERR_INV_SEXP, NULL, 0 }, + + /* Valid and invalid keys. */ + { key_rsa_valid.string, + "passphrase", 0, 0, NULL, 0, 0, NULL, 0 }, + { key_rsa_bogus_0.string, + "passphrase", 0, 0, NULL, 0, GPG_ERR_INV_SEXP, NULL, 0 }, + { key_rsa_bogus_1.string, + "passphrase", 0, 0, NULL, 0, GPG_ERR_INV_SEXP, NULL, 0 }, + + /* FIXME: add more test data. */ + }; + + for (i = 0; i < DIM (specs); i++) + { + ret = agent_protect ((const unsigned char*)specs[i].key, + specs[i].passphrase, + &specs[i].result, &specs[i].resultlen); + if (gpg_err_code (ret) != specs[i].ret_expected) + { + printf ("agent_protect() returned `%i/%s'; expected `%i/%s'\n", + ret, gpg_strerror (ret), + specs[i].ret_expected, gpg_strerror (specs[i].ret_expected)); + abort (); + } + + if (specs[i].no_result_expected) + { + assert (! specs[i].result); + assert (! specs[i].resultlen); + } + else + { + if (specs[i].compare_results) + { + assert (specs[i].resultlen == specs[i].resultlen_expected); + if (specs[i].result_expected) + assert (! memcmp (specs[i].result, specs[i].result_expected, + specs[i].resultlen)); + else + assert (! specs[i].result); + } + xfree (specs[i].result); + } + } +} + + +static void +test_agent_unprotect (void) +{ + /* Unprotect the key encoded in canonical format. We assume a valid + S-Exp here. */ +/* int */ +/* agent_unprotect (const unsigned char *protectedkey, const char *passphrase, */ +/* unsigned char **result, size_t *resultlen) */ +} + + +static void +test_agent_private_key_type (void) +{ +/* Check the type of the private key, this is one of the constants: + PRIVATE_KEY_UNKNOWN if we can't figure out the type (this is the + value 0), PRIVATE_KEY_CLEAR for an unprotected private key. + PRIVATE_KEY_PROTECTED for an protected private key or + PRIVATE_KEY_SHADOWED for a sub key where the secret parts are stored + elsewhere. */ +/* int */ +/* agent_private_key_type (const unsigned char *privatekey) */ +} + + +static void +test_make_shadow_info (void) +{ +#if 0 + static struct + { + const char *snstr; + const char *idstr; + const char *expected; + } data[] = { + { "", "", NULL }, + + }; + int i; + unsigned char *result; + + for (i=0; i < DIM(data); i++) + { + result = make_shadow_info (data[i].snstr, data[i].idstr); + if (!result && !data[i].expected) + pass (); + else if (!result && data[i].expected) + fail (); + else if (!data[i].expected) + fail (); + /* fixme: Need to compare the result but also need to check + proper S-expression syntax. */ + } +#endif +} + + + +static void +test_agent_shadow_key (void) +{ +/* Create a shadow key from a public key. We use the shadow protocol + "ti-v1" and insert the S-expressionn SHADOW_INFO. The resulting + S-expression is returned in an allocated buffer RESULT will point + to. The input parameters are expected to be valid canonicalized + S-expressions */ +/* int */ +/* agent_shadow_key (const unsigned char *pubkey, */ +/* const unsigned char *shadow_info, */ +/* unsigned char **result) */ +} + + +static void +test_agent_get_shadow_info (void) +{ +/* Parse a canonical encoded shadowed key and return a pointer to the + inner list with the shadow_info */ +/* int */ +/* agent_get_shadow_info (const unsigned char *shadowkey, */ +/* unsigned char const **shadow_info) */ +} + + + + +int +main (int argc, char **argv) +{ + gcry_control (GCRYCTL_DISABLE_SECMEM); + + test_agent_protect (); + test_agent_unprotect (); + test_agent_private_key_type (); + test_make_shadow_info (); + test_agent_shadow_key (); + test_agent_get_shadow_info (); + + return 0; +} diff --git a/util/memrchr.c b/agent/trans.c similarity index 57% rename from util/memrchr.c rename to agent/trans.c index 5621f7323..5eb7d25c0 100644 --- a/util/memrchr.c +++ b/agent/trans.c @@ -1,5 +1,5 @@ -/* memrchr.c - libc replacement function - * Copyright (C) 2005 Free Software Foundation, Inc. +/* trans.c - translatable strings + * Copyright (C) 2001 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -19,31 +19,25 @@ * 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. -*/ +/* To avoid any problems with the gettext implementation (there used + to be some vulnerabilities in the last years and the use of + external files is a minor security problem in itself), we use our + own simple translation stuff */ #include +#include +#include +#include #include +#include +#include +#include +#include -/* There are many ways to optimize this, but this is a simple - unoptimized implementation. */ -void * -memrchr(const void *s, int c, size_t n) +#include "agent.h" + +const char * +trans (const char *text) { - const unsigned char *start=s,*end=s; - - end+=n-1; - - while(end>=start) - { - if(*end==c) - return (void *)end; - else - end--; - } - - return NULL; + return text; } diff --git a/agent/trustlist.c b/agent/trustlist.c new file mode 100644 index 000000000..d234af692 --- /dev/null +++ b/agent/trustlist.c @@ -0,0 +1,418 @@ +/* trustlist.c - Maintain the list of trusted keys + * Copyright (C) 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 +#include +#include +#include +#include +#include +#include +#include +#include + +#include "agent.h" +#include /* fixme: need a way to avoid assuan calls here */ +#include "i18n.h" + +static const char headerblurb[] = +"# This is the list of trusted keys. Comment lines, like this one, as\n" +"# well as empty lines are ignored. The entire file may be integrity\n" +"# protected by the use of a MAC, so changing the file does not make\n" +"# sense without the knowledge of the MAC key. Lines do have a length\n" +"# limit but this is not serious limitation as the format of the\n" +"# entries is fixed and checked by gpg-agent: A non-comment line starts\n" +"# with optional white spaces, followed by the SHA-1 fingerpint in hex,\n" +"# optionally followed by a flag character which my either be 'P', 'S'\n" +"# or '*'. Additional data, delimited by white space, is ignored.\n" +"#\n" +"# NOTE: You should give the gpg-agent a HUP after editing this file.\n" +"\n"; + + +static FILE *trustfp; +static int trustfp_used; /* Counter to track usage of TRUSTFP. */ +static int reload_trustlist_pending; + + +static int +open_list (int append) +{ + char *fname; + + fname = make_filename (opt.homedir, "trustlist.txt", NULL); + trustfp = fopen (fname, append? "a+":"r"); + if (!trustfp && errno == ENOENT) + { + trustfp = fopen (fname, "wx"); + if (!trustfp) + { + gpg_error_t tmperr = gpg_error (gpg_err_code_from_errno (errno)); + log_error ("can't create `%s': %s\n", fname, strerror (errno)); + xfree (fname); + return tmperr; + } + fputs (headerblurb, trustfp); + fclose (trustfp); + trustfp = fopen (fname, append? "a+":"r"); + } + + if (!trustfp) + { + gpg_error_t tmperr = gpg_error (gpg_err_code_from_errno (errno)); + log_error ("can't open `%s': %s\n", fname, strerror (errno)); + xfree (fname); + return tmperr; + } + + /*FIXME: check the MAC */ + + return 0; +} + + + +/* Read the trustlist and return entry by entry. KEY must point to a + buffer of at least 41 characters. KEYFLAG does return either 'P', + 'S' or '*'. + + Reading a valid entry return 0, EOF returns -1 any other error + returns the appropriate error code. */ +static int +read_list (char *key, int *keyflag) +{ + int rc; + int c, i, j; + char *p, line[256]; + + if (!trustfp) + { + rc = open_list (0); + if (rc) + return rc; + } + + do + { + if (!fgets (line, DIM(line)-1, trustfp) ) + { + if (feof (trustfp)) + return -1; + return gpg_error (gpg_err_code_from_errno (errno)); + } + + if (!*line || line[strlen(line)-1] != '\n') + { + /* eat until end of line */ + while ( (c=getc (trustfp)) != EOF && c != '\n') + ; + return gpg_error (*line? GPG_ERR_LINE_TOO_LONG + : GPG_ERR_INCOMPLETE_LINE); + } + + /* Allow for empty lines and spaces */ + for (p=line; spacep (p); p++) + ; + } + while (!*p || *p == '\n' || *p == '#'); + + for (i=j=0; (p[i] == ':' || hexdigitp (p+i)) && j < 40; i++) + if ( p[i] != ':' ) + key[j++] = p[i] >= 'a'? (p[i] & 0xdf): p[i]; + key[j] = 0; + if (j!=40 || !(spacep (p+i) || p[i] == '\n')) + { + log_error ("invalid formatted fingerprint in trustlist\n"); + return gpg_error (GPG_ERR_BAD_DATA); + } + assert (p[i]); + if (p[i] == '\n') + *keyflag = '*'; + else + { + i++; + if ( p[i] == 'P' || p[i] == 'p') + *keyflag = 'P'; + else if ( p[i] == 'S' || p[i] == 's') + *keyflag = 'S'; + else if ( p[i] == '*') + *keyflag = '*'; + else + { + log_error ("invalid keyflag in trustlist\n"); + return gpg_error (GPG_ERR_BAD_DATA); + } + i++; + if ( !(spacep (p+i) || p[i] == '\n')) + { + log_error ("invalid keyflag in trustlist\n"); + return gpg_error (GPG_ERR_BAD_DATA); + } + } + + return 0; +} + +/* Check whether the given fpr is in our trustdb. We expect FPR to be + an all uppercase hexstring of 40 characters. */ +int +agent_istrusted (const char *fpr) +{ + int rc; + static char key[41]; + int keyflag; + + trustfp_used++; + if (trustfp) + rewind (trustfp); + while (!(rc=read_list (key, &keyflag))) + { + if (!strcmp (key, fpr)) + { + trustfp_used--; + return 0; + } + } + if (rc != -1) + { + /* Error in the trustdb - close it to give the user a chance for + correction */ + if (trustfp) + fclose (trustfp); + trustfp = NULL; + } + trustfp_used--; + return rc; +} + + +/* Write all trust entries to FP. */ +int +agent_listtrusted (void *assuan_context) +{ + int rc; + static char key[51]; + int keyflag; + + trustfp_used++; + if (trustfp) + rewind (trustfp); + while (!(rc=read_list (key, &keyflag))) + { + key[40] = ' '; + key[41] = keyflag; + key[42] = '\n'; + assuan_send_data (assuan_context, key, 43); + assuan_send_data (assuan_context, NULL, 0); /* flush */ + } + if (rc == -1) + rc = 0; + if (rc) + { + /* Error in the trustdb - close it to give the user a chance for + correction */ + if (trustfp) + fclose (trustfp); + trustfp = NULL; + } + trustfp_used--; + return rc; +} + + +/* Insert the given fpr into our trustdb. We expect FPR to be an all + uppercase hexstring of 40 characters. FLAG is either 'P' or 'C'. + This function does first check whether that key has alreay been put + into the trustdb and returns success in this case. Before a FPR + actually gets inserted, the user is asked by means of the pin-entry + whether this is actual wants he want to do. +*/ +int +agent_marktrusted (CTRL ctrl, const char *name, const char *fpr, int flag) +{ + int rc; + static char key[41]; + int keyflag; + char *desc; + char *fname; + + /* Check whether we are at all allowed to modify the trustlist. + This is useful so that the trustlist may be a symlink to a global + trustlist with only admin priviliges to modify it. Of course + this is not a secure way of denying access, but it avoids the + usual clicking on an Okay buttun thing most users are used to. */ + fname = make_filename (opt.homedir, "trustlist.txt", NULL); + rc = access (fname, W_OK); + if (rc && errno != ENOENT) + { + xfree (fname); + return gpg_error (GPG_ERR_EPERM); + } + xfree (fname); + + trustfp_used++; + if (trustfp) + rewind (trustfp); + while (!(rc=read_list (key, &keyflag))) + { + if (!strcmp (key, fpr)) + return 0; + } + if (trustfp) + fclose (trustfp); + trustfp = NULL; + if (rc != -1) + { + trustfp_used--; + return rc; /* Error in the trustlist. */ + } + + /* This feature must explicitly been enabled. */ + if (!opt.allow_mark_trusted) + { + trustfp_used--; + return gpg_error (GPG_ERR_NOT_SUPPORTED); + } + + /* Insert a new one. */ + if (asprintf (&desc, + /* TRANSLATORS: This prompt is shown by the Pinentry + and has one special property: A "%%0A" is used by + Pinentry to insert a line break. The double + percent sign is actually needed because it is also + a printf format string. If you need to insert a + plain % sign, you need to encode it as "%%25". The + second "%s" gets replaced by a hexdecimal + fingerprint string whereas the first one receives + the name as store in the certificate. */ + _("Please verify that the certificate identified as:%%0A" + " \"%s\"%%0A" + "has the fingerprint:%%0A" + " %s"), name, fpr) < 0 ) + { + trustfp_used--; + return out_of_core (); + } + + /* TRANSLATORS: "Correct" is the label of a button and intended to + be hit if the fingerprint matches the one of the CA. The other + button is "the default "Cancel" of the Pinentry. */ + rc = agent_get_confirmation (ctrl, desc, _("Correct"), NULL); + free (desc); + if (rc) + { + trustfp_used--; + return rc; + } + + if (asprintf (&desc, + /* TRANSLATORS: This prompt is shown by the Pinentry + and has one special property: A "%%0A" is used by + Pinentry to insert a line break. The double + percent sign is actually needed because it is also + a printf format string. If you need to insert a + plain % sign, you need to encode it as "%%25". The + "%s" gets replaced by the name as store in the + certificate. */ + _("Do you ultimately trust%%0A" + " \"%s\"%%0A" + "to correctly certify user certificates?"), + name) < 0 ) + { + trustfp_used--; + return out_of_core (); + } + rc = agent_get_confirmation (ctrl, desc, _("Yes"), _("No")); + free (desc); + if (rc) + { + trustfp_used--; + return rc; + } + + /* Now check again to avoid duplicates. Also open in append mode now. */ + rc = open_list (1); + if (rc) + { + trustfp_used--; + return rc; + } + rewind (trustfp); + while (!(rc=read_list (key, &keyflag))) + { + if (!strcmp (key, fpr)) + { + trustfp_used--; + return 0; + } + } + if (rc != -1) + { + if (trustfp) + fclose (trustfp); + trustfp = NULL; + trustfp_used--; + return rc; /* Error in the trustlist. */ + } + rc = 0; + + /* Append the key. */ + fflush (trustfp); + fputs ("\n# ", trustfp); + print_sanitized_string (trustfp, name, 0); + fprintf (trustfp, "\n%s %c\n", fpr, flag); + if (ferror (trustfp)) + rc = gpg_error (gpg_err_code_from_errno (errno)); + + /* close because we are in append mode */ + if (fclose (trustfp)) + rc = gpg_error (gpg_err_code_from_errno (errno)); + trustfp = NULL; + trustfp_used--; + return rc; +} + + +void +agent_trustlist_housekeeping (void) +{ + if (reload_trustlist_pending && !trustfp_used) + { + if (trustfp) + { + fclose (trustfp); + trustfp = NULL; + } + reload_trustlist_pending = 0; + } +} + + +/* Not all editors are editing files in place, thus a changes + trustlist.txt won't be recognozed if we keep the file descriptor + open. This function may be used to explicitly close that file + descriptor, which will force a reopen in turn. */ +void +agent_reload_trustlist (void) +{ + reload_trustlist_pending = 1; + agent_trustlist_housekeeping (); +} diff --git a/am/cmacros.am b/am/cmacros.am new file mode 100644 index 000000000..7b449e2c0 --- /dev/null +++ b/am/cmacros.am @@ -0,0 +1,47 @@ +# cmacros.am - C macro definitions +# 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. + +localedir = $(datadir)/locale + +AM_CPPFLAGS += -DLOCALEDIR=\"$(localedir)\" + +if ! HAVE_DOSISH_SYSTEM +AM_CPPFLAGS += -DGNUPG_BINDIR="\"$(bindir)\"" \ + -DGNUPG_LIBEXECDIR="\"$(libexecdir)\"" \ + -DGNUPG_LIBDIR="\"$(libdir)/@PACKAGE@\"" \ + -DGNUPG_DATADIR="\"$(datadir)/@PACKAGE@\"" \ + -DGNUPG_SYSCONFDIR="\"$(sysconfdir)/@PACKAGE@\"" +endif + +if GNUPG_AGENT_PGM +AM_CPPFLAGS += -DGNUPG_DEFAULT_AGENT="\"@GNUPG_AGENT_PGM@\"" +endif +if GNUPG_PINENTRY_PGM +AM_CPPFLAGS += -DGNUPG_DEFAULT_PINENTRY="\"@GNUPG_PINENTRY_PGM@\"" +endif +if GNUPG_SCDAEMON_PGM +AM_CPPFLAGS += -DGNUPG_DEFAULT_SCDAEMON="\"@GNUPG_SCDAEMON_PGM@\"" +endif +if GNUPG_DIRMNGR_PGM +AM_CPPFLAGS += -DGNUPG_DEFAULT_DIRMNGR="\"@GNUPG_DIRMNGR_PGM@\"" +endif +if GNUPG_PROTECT_TOOL_PGM +AM_CPPFLAGS += -DGNUPG_DEFAULT_PROTECT_TOOL="\"@GNUPG_PROTECT_TOOL_PGM@\"" +endif diff --git a/artwork/README b/artwork/README new file mode 100644 index 000000000..990fed62e --- /dev/null +++ b/artwork/README @@ -0,0 +1,2 @@ +These is a collection of graphics used in connection with GnuPG. It +is not part of GnuPG proper. [wk 2004-09-11] diff --git a/artwork/ascii-key b/artwork/ascii-key new file mode 100644 index 000000000..3540f7eec --- /dev/null +++ b/artwork/ascii-key @@ -0,0 +1,5 @@ + + .-. +( )====GnuPG + `-' + diff --git a/artwork/gnu-head-sm.jpg b/artwork/gnu-head-sm.jpg new file mode 100644 index 000000000..2a9746a25 Binary files /dev/null and b/artwork/gnu-head-sm.jpg differ diff --git a/artwork/gnu1.jpg b/artwork/gnu1.jpg new file mode 100644 index 000000000..5637bcc17 Binary files /dev/null and b/artwork/gnu1.jpg differ diff --git a/artwork/gnu5.png b/artwork/gnu5.png new file mode 100644 index 000000000..e1cd68f97 Binary files /dev/null and b/artwork/gnu5.png differ diff --git a/artwork/gnud.png b/artwork/gnud.png new file mode 100644 index 000000000..73a72bbcf Binary files /dev/null and b/artwork/gnud.png differ diff --git a/artwork/gnue.png b/artwork/gnue.png new file mode 100644 index 000000000..881889cfc Binary files /dev/null and b/artwork/gnue.png differ diff --git a/artwork/gnue2.png b/artwork/gnue2.png new file mode 100644 index 000000000..7cd20d690 Binary files /dev/null and b/artwork/gnue2.png differ diff --git a/artwork/gnupg-1.0-available-now.png b/artwork/gnupg-1.0-available-now.png new file mode 100644 index 000000000..f5adeb9fa Binary files /dev/null and b/artwork/gnupg-1.0-available-now.png differ diff --git a/artwork/gnupg-1.0-ist-da.png b/artwork/gnupg-1.0-ist-da.png new file mode 100644 index 000000000..2438cf74f Binary files /dev/null and b/artwork/gnupg-1.0-ist-da.png differ diff --git a/artwork/gnupg-badge-openpgp.cdr.gz b/artwork/gnupg-badge-openpgp.cdr.gz new file mode 100644 index 000000000..b50f28645 Binary files /dev/null and b/artwork/gnupg-badge-openpgp.cdr.gz differ diff --git a/artwork/gnupg-badge-openpgp.eps.gz b/artwork/gnupg-badge-openpgp.eps.gz new file mode 100644 index 000000000..aa76f193e Binary files /dev/null and b/artwork/gnupg-badge-openpgp.eps.gz differ diff --git a/artwork/gnupg-badge-openpgp.jpg b/artwork/gnupg-badge-openpgp.jpg new file mode 100644 index 000000000..fc4b2a8dd Binary files /dev/null and b/artwork/gnupg-badge-openpgp.jpg differ diff --git a/artwork/gnupg-logo-black.jpg b/artwork/gnupg-logo-black.jpg new file mode 100644 index 000000000..fb7173749 Binary files /dev/null and b/artwork/gnupg-logo-black.jpg differ diff --git a/artwork/gnupg-logo-cia.jpg b/artwork/gnupg-logo-cia.jpg new file mode 100644 index 000000000..9ced3c077 Binary files /dev/null and b/artwork/gnupg-logo-cia.jpg differ diff --git a/artwork/gnupg-logo-cia2.jpg b/artwork/gnupg-logo-cia2.jpg new file mode 100644 index 000000000..fc4b2a8dd Binary files /dev/null and b/artwork/gnupg-logo-cia2.jpg differ diff --git a/artwork/gnurieg.png b/artwork/gnurieg.png new file mode 100644 index 000000000..0de179a9d Binary files /dev/null and b/artwork/gnurieg.png differ diff --git a/artwork/gpglogo.eps.gz b/artwork/gpglogo.eps.gz new file mode 100644 index 000000000..6b8616bf9 Binary files /dev/null and b/artwork/gpglogo.eps.gz differ diff --git a/artwork/gpglogo.fig b/artwork/gpglogo.fig new file mode 100644 index 000000000..bed127833 --- /dev/null +++ b/artwork/gpglogo.fig @@ -0,0 +1,36 @@ +#FIG 3.2 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 32 #414541 +0 33 #8e8e8e +0 34 #414541 +0 35 #8e8e8e +0 36 #8e8e8e +6 91 46 7785 7740 +1 3 0 2 0 7 100 0 -1 0.000 1 0.0000 3938 3893 3832 3832 3938 3893 7763 4118 +1 3 0 2 0 7 100 0 -1 0.000 1 0.0000 3938 3893 2959 2959 3938 3893 6863 4343 +2 5 0 1 0 -1 100 0 -1 0.000 0 0 -1 0 0 5 + 0 tmp/gnu1.jpg + 1628 2303 6248 2303 6248 5633 1628 5633 1628 2303 +4 0 0 100 0 30 40 0.0000 4 450 480 3713 743 N\001 +4 0 0 100 0 30 40 0.2618 4 450 465 2918 908 G\001 +4 0 0 100 0 30 40 6.0214 4 450 450 4527 791 U\001 +4 0 0 100 0 30 40 6.0214 4 330 330 3046 7398 c\001 +4 0 0 100 0 30 40 0.8727 4 330 285 6684 6299 r\001 +4 0 0 100 0 30 40 0.0000 4 465 390 3668 7493 y\001 +4 0 0 100 0 30 40 5.9341 4 330 345 2488 7193 a\001 +4 0 0 100 0 30 40 5.7596 4 330 390 1944 6889 v\001 +4 0 0 100 0 30 40 5.4978 4 465 195 1562 6609 i\001 +4 0 0 100 0 30 40 5.4105 4 330 285 1198 6206 r\001 +4 0 0 100 0 30 40 5.3233 4 450 375 826 5724 P\001 +4 0 0 100 0 30 40 0.5236 4 330 390 5681 7140 u\001 +4 0 0 100 0 30 40 0.6981 4 330 345 6247 6739 a\001 +4 0 0 100 0 30 40 1.0472 4 465 390 7039 5909 d\001 +4 0 0 100 0 30 40 0.3491 4 450 465 5031 7399 G\001 +-6 diff --git a/artwork/gpglogo.jpg b/artwork/gpglogo.jpg new file mode 100644 index 000000000..3fff990a1 Binary files /dev/null and b/artwork/gpglogo.jpg differ diff --git a/artwork/tl-gnu1.jpg b/artwork/tl-gnu1.jpg new file mode 100644 index 000000000..c3842ea87 Binary files /dev/null and b/artwork/tl-gnu1.jpg differ diff --git a/autogen.sh b/autogen.sh index 41ae4e272..aaf0d0ea4 100755 --- a/autogen.sh +++ b/autogen.sh @@ -1,5 +1,164 @@ -#!/bin/sh +#! /bin/sh +# Run this to generate all the initial makefiles, etc. +# +# Copyright (C) 2003 g10 Code GmbH +# +# This file is free software; as a special exception the author gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -autogen_sh="`dirname $0`/scripts/autogen.sh" -exec $autogen_sh $* +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 + +# ***** W32 build script ******* +# Used to cross-compile for Windows. +if test "$1" = "--build-w32"; then + tmp=`dirname $0` + tsdir=`cd "$tmp"; 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` + + [ -z "$w32root" ] && w32root="$HOME/w32root" + echo "Using $w32root as standard install directory" >&2 + + # See whether we have the Debian cross compiler package or the + # old mingw32/cpd system + if i586-mingw32msvc-gcc --version >/dev/null 2>&1 ; then + host=i586-mingw32msvc + crossbindir=/usr/$host/bin + else + host=i386--mingw32 + if ! mingw32 --version >/dev/null; then + echo "We need at least version 0.3 of MingW32/CPD" >&2 + exit 1 + fi + crossbindir=`mingw32 --install-dir`/bin + # Old autoconf version required us to setup the environment + # with the proper tool names. + CC=`mingw32 --get-path gcc` + CPP=`mingw32 --get-path cpp` + AR=`mingw32 --get-path ar` + RANLIB=`mingw32 --get-path ranlib` + export CC CPP AR RANLIB + fi + + if [ -f "$tsdir/config.log" ]; then + if ! head $tsdir/config.log | grep "$host" >/dev/null; then + echo "Pease run a 'make distclean' first" >&2 + exit 1 + fi + fi + + ./configure --enable-maintainer-mode --prefix=${w32root} \ + --host=i586-mingw32msvc --build=${build} \ + --with-gpg-error-prefix=${w32root} \ + --with-ksba-prefix=${w32root} \ + --with-libgcrypt-prefix=${w32root} \ + --with-libassuan-prefix=${w32root} \ + --with-zlib=${w32root} \ + --with-pth-prefix=${w32root} \ + --disable-gpg + rc=$? + # Ugly hack to overcome a gettext problem. Someone should look into + # gettext to figure out why the po directory is not ignored as it used + # to be. + [ $rc = 0 ] && touch $tsdir/po/all + exit $rc +fi +# ***** end W32 build script ******* + + + + +# 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 $autoconf_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 < - - * sigs.test, mds.test: Add tests for SHA-224, SHA-384, and - SHA-512. - -2006-04-11 Werner Koch - - * armor.test: New. - -2006-03-09 Werner Koch - - * defs.inc: Removed Basishm by proper redirection. - -2006-03-06 Werner Koch - - * 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 - - * verify.test: New. - -2005-06-21 Werner Koch - - * conventional.test (algos): Uhh ohh, cut+paste error and not - tested. - -2005-06-02 Werner Koch - - * conventional.test: have_cipher_algo now requires uppercase - algorithm names. Changed. Noted by John R. Shannon. - -2004-02-09 David Shaw - - * clearsig.test, sigs.test: Properly detect RSA being missing, and - use the proper key for doing an RSA test. - -2003-12-31 David Shaw - - * 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 - - * 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 - - * options: Remove emulate-md-encode-bug. - -2003-11-27 Werner Koch - - * Makefile.am (TESTS): Temporary remove tests using ElG signatures. - -2003-09-04 David Shaw - - * mds.test, sigs.test: Remove TIGER/192 and make SHA-256 optional - (since it might not be compiled in). - -2003-07-10 David Shaw - - * Makefile.am: Add --no-permission-warning to avoid spurious - warning when importing demo keys. - -2003-05-27 Werner Koch - - * Makefile.am (CLEANFILES): Add gpg.conf - -2003-05-26 David Shaw - - * 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 - - * 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 - - * Makefile.am: Add gpg_dearmor to all targets where it is used. - Noted by Andreas Haumer. - -2002-04-19 Werner Koch - - * signencrypt-dsa.test, sigs-dsa.test: Don't check with MD5 as - this is not valid with DSA signatures. - -2001-12-22 Werner Koch - - * options.in: Add no-permission-warning. - -2001-12-21 Werner Koch - - * Makefile.am (distclean-local): prefix mkdemodirs with srcdir - (DISTCLEANFILES): Add random_seed. - -2001-12-19 Werner Koch - - * options.in: Remove load-extension tiger - * Makefile.am (./options): append it if there is such a module. - -2001-10-23 Werner Koch - - * defs.inc, Makefile.am: Do not use $srcdir when invoking gpg. - Write the logfile to the current directory. - -2001-09-28 Werner Koch - - * 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 - - * genkey1024.test: Simplified by using a parameter file. - -2001-05-30 Werner Koch - - * multisig.test (IFS): Reset IFS just before the test. - -2001-04-30 Werner Koch - - * multisig.test: Add an set +x to avoid ksh problems - -2001-04-28 Werner Koch - - * run-gpg.patterns: a v3 test key expired yesterday, suppress the - messages. - -2001-03-27 Werner Koch - - * 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 - - * Makefile.am: Import the pubdemo.asc file - - * sigs.test (hash_algo_list): s/tiger/tiger192/ - -2001-03-19 Werner Koch - - * 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 - - * multisig.test: new - * Makefile.am (TESTS): Added. - -2000-10-18 Werner Koch - - * conventional-mdc.test: Add Rijndael and fix for empty plain texts. - -Thu Feb 10 17:39:44 CET 2000 Werner Koch - - * mkdemodirs: Fixed the --clean loop. - -Thu Jan 13 19:31:58 CET 2000 Werner Koch - - * 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 - - * defs.inc: set LC_ALL empty - -Wed Aug 4 10:34:18 CEST 1999 Werner Koch - - * defs.inc (echo_n): New and used instead of /bin/echo "\c" - -Sun Apr 18 10:11:28 CEST 1999 Werner Koch - - * mkdemodirs: New - * signdemokey: New. - * Makefile.am (distclean-local): New. - -Wed Mar 17 13:09:03 CET 1999 Werner Koch - - * mds.test: replaced the "echo -n" - -Mon Mar 8 20:47:17 CET 1999 Werner Koch - - * pubdemo.asc, secdemo.asc: New. - -Fri Feb 19 15:49:15 CET 1999 Werner Koch - - * genkey1024.test: Be really quiet. - -1999-01-01 Geoff Keating - - * Makefile.am (CLEANFILES): Also delete trustdb and any leftover - lockfiles. - -Fri Nov 27 15:30:24 CET 1998 Werner Koch - - * 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 deleted file mode 100644 index d5218f736..000000000 --- a/checks/Makefile.am +++ /dev/null @@ -1,100 +0,0 @@ -# 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/armdetach.test b/checks/armdetach.test deleted file mode 100755 index c445d6ce6..000000000 --- a/checks/armdetach.test +++ /dev/null @@ -1,11 +0,0 @@ -#!/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 deleted file mode 100755 index f1958424c..000000000 --- a/checks/armdetachm.test +++ /dev/null @@ -1,9 +0,0 @@ -#!/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 deleted file mode 100755 index 356d1bda7..000000000 --- a/checks/armencrypt.test +++ /dev/null @@ -1,11 +0,0 @@ -#!/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 deleted file mode 100755 index d18c56b7e..000000000 --- a/checks/armencryptp.test +++ /dev/null @@ -1,12 +0,0 @@ -#!/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 deleted file mode 100755 index 2efcf3260..000000000 --- a/checks/armor.test +++ /dev/null @@ -1,181 +0,0 @@ -#!/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 deleted file mode 100755 index 24b9575ad..000000000 --- a/checks/armsignencrypt.test +++ /dev/null @@ -1,13 +0,0 @@ -#!/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 deleted file mode 100755 index aecc06429..000000000 --- a/checks/armsigs.test +++ /dev/null @@ -1,11 +0,0 @@ -#!/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 deleted file mode 100755 index 8217f2f49..000000000 --- a/checks/clearsig.test +++ /dev/null @@ -1,102 +0,0 @@ -#!/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 <y <y <y <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 <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 deleted file mode 100755 index 95a6ba476..000000000 --- a/checks/conventional-mdc.test +++ /dev/null @@ -1,42 +0,0 @@ -#!/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 deleted file mode 100755 index 2fd273028..000000000 --- a/checks/conventional.test +++ /dev/null @@ -1,37 +0,0 @@ -#!/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 deleted file mode 100755 index 6dc7dc459..000000000 --- a/checks/decrypt-dsa.test +++ /dev/null @@ -1,10 +0,0 @@ -#!/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 deleted file mode 100755 index aab416750..000000000 --- a/checks/decrypt.test +++ /dev/null @@ -1,10 +0,0 @@ -#!/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 deleted file mode 100755 index 98a6c3f76..000000000 --- a/checks/defs.inc +++ /dev/null @@ -1,162 +0,0 @@ -# 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 deleted file mode 100755 index 6a3ae05c5..000000000 --- a/checks/detach.test +++ /dev/null @@ -1,10 +0,0 @@ -#!/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 deleted file mode 100755 index dc60bb239..000000000 --- a/checks/detachm.test +++ /dev/null @@ -1,9 +0,0 @@ -#!/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 deleted file mode 100755 index 0c6333c21..000000000 --- a/checks/encrypt-dsa.test +++ /dev/null @@ -1,41 +0,0 @@ -#!/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 deleted file mode 100755 index 44f26a17a..000000000 --- a/checks/encrypt.test +++ /dev/null @@ -1,40 +0,0 @@ -#!/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 deleted file mode 100755 index 7df24efec..000000000 --- a/checks/encryptp.test +++ /dev/null @@ -1,10 +0,0 @@ -#!/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 deleted file mode 100755 index 48d02da32..000000000 --- a/checks/genkey1024.test +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/sh - -. $srcdir/defs.inc || exit 3 - -../g10/gpg --quiet --batch --quick-random --homedir . --gen-key <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 deleted file mode 100755 index d6b7d7c4c..000000000 --- a/checks/mkdemodirs +++ /dev/null @@ -1,37 +0,0 @@ -#!/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 deleted file mode 100755 index ece6f22da..000000000 --- a/checks/multisig.test +++ /dev/null @@ -1,145 +0,0 @@ -#!/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 /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 /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 deleted file mode 100644 index 7060a6610..000000000 --- a/checks/options +++ /dev/null @@ -1,5 +0,0 @@ -no-greeting -no-secmem-warning -no-permission-warning -batch -no-auto-check-trustdb diff --git a/checks/pgp263-test.pub.asc b/checks/pgp263-test.pub.asc deleted file mode 100644 index 53310d778..000000000 --- a/checks/pgp263-test.pub.asc +++ /dev/null @@ -1,14 +0,0 @@ -Type Bits/KeyID Date User ID -pub 888/A50283F1 2001/11/08 pgp2.6.3-test-key - ------BEGIN PGP PUBLIC KEY BLOCK----- -Version: 2.6.3a - -mQB8AzvqRosAAAEDeNMKLJMJQeGC2RG5Nec6R2mzC12N1wGLiYYJCsmSQd1Y8mht -A2Sc+4k/q5+l6GHtfqUR/RTCIIudAZUzrQVIMhHDKF+5de9lsE5QxQS1u43QGVCb -/9IYrOLOizYQ2pkBtD9LCrf7W2DccMEkpQKD8QAFE7QRcGdwMi42LjMtdGVzdC1r -ZXmJAIQDBRA76kaL3HDBJKUCg/EBAZMoA3Yqqdix6B2RAzywi9bKSLqwAFVL+MMw -W+BnYeBXF9u+bPpQvtyxgi0vx8F9r84B3HAhZNEjBWODF6vctIQhXhAhXIniDTSj -HNzQ/+nbWnebQn18XUV2SdM1PzMOblD+nISte7+WUfWzlD7YUJPkFPw= -=b498 ------END PGP PUBLIC KEY BLOCK----- diff --git a/checks/pgp263-test.sec.asc b/checks/pgp263-test.sec.asc deleted file mode 100644 index 78992e3b7..000000000 --- a/checks/pgp263-test.sec.asc +++ /dev/null @@ -1,18 +0,0 @@ -Type Bits/KeyID Date User ID -sec 888/A50283F1 2001/11/08 pgp2.6.3-test-key - ------BEGIN PGP SECRET KEY BLOCK----- -Version: 2.6.3a - -lQGdAzvqRosAAAEDeNMKLJMJQeGC2RG5Nec6R2mzC12N1wGLiYYJCsmSQd1Y8mht -A2Sc+4k/q5+l6GHtfqUR/RTCIIudAZUzrQVIMhHDKF+5de9lsE5QxQS1u43QGVCb -/9IYrOLOizYQ2pkBtD9LCrf7W2DccMEkpQKD8QAFEwADd0Kk5aeyFM3zbPgfikkE -7iFg9h2LG3nARmA4wAnCZaQ3CS5zRHCdXOf5KLkm6xFza1yMat4iWx6ULvuuNpIc -RmkHccyXYkRi3Hvacd5A9VCNw1UKtCdaCKgacsfplU0s1xYWGZd4J8Jg8boSfW5W -gwG8Dc9R20HHno8uD2vfr5rg8ElWvbFyJI/j4eCVAd+NYAGNvB8I3VP38IIYcavh -YYcGjrpxbGVRybsBvA9IJltpGaVulxwpeCp5NecCGgoAUsN4Ktf42Pg7HXDlQL6r -Xs/YggMztj4NzEgBHXAOLShdKKhDAbEByVSKXZD9A8J+RejXBl6VbuJmD/5qOvph -GAPKS3ahPDj8438HyD7yIDLYYVRKfxjWHLubc46Pgui0EXBncDIuNi4zLXRlc3Qt -a2V5 -=l/aV ------END PGP SECRET KEY BLOCK----- diff --git a/checks/plain-1-pgp.asc b/checks/plain-1-pgp.asc deleted file mode 100644 index 9a83dcfa0..000000000 --- a/checks/plain-1-pgp.asc +++ /dev/null @@ -1,27 +0,0 @@ -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 deleted file mode 100644 index f62fb15df..000000000 --- a/checks/plain-1.asc +++ /dev/null @@ -1,26 +0,0 @@ ------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 deleted file mode 100644 index 973b29395..000000000 --- a/checks/plain-1o.asc +++ /dev/null @@ -1,28 +0,0 @@ ------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 deleted file mode 100644 index 5a774a634..000000000 --- a/checks/plain-2.asc +++ /dev/null @@ -1,31 +0,0 @@ ------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 deleted file mode 100644 index 562e5f06e..000000000 --- a/checks/plain-2o.asc +++ /dev/null @@ -1,36 +0,0 @@ ------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 deleted file mode 100644 index b2206aee5..000000000 --- a/checks/plain-3.asc +++ /dev/null @@ -1,13 +0,0 @@ ------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 deleted file mode 100644 index 409b9c2e4..000000000 --- a/checks/plain-3o.asc +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100644 index d550f1af7..000000000 --- a/checks/pubdemo.asc +++ /dev/null @@ -1,566 +0,0 @@ -26 demo keys: - -pub 1024D/68697734 1999-03-08 Alpha Test (demo key) -uid Alice (demo key) -uid Alfa Test (demo key) -sub 1024g/46A871F8 1999-03-08 -pub 1024D/1AFDAB6C 1999-03-08 Charlie Test (demo key) -sub 1024g/BC43DA60 1999-03-08 -pub 1024D/FAEF6D1B 1999-03-08 Echo Test (demo key) -uid Eve (demo key) -uid Echelon (demo key) -sub 1024g/7272144D 1999-03-08 -pub 1024D/8FC282E6 1999-03-08 Golf Test (demo key) -sub 1024g/9DCAD354 1999-03-08 -pub 1024D/04259677 1999-03-08 India Test (demo key) -sub 1024g/61F76C73 1999-03-08 -pub 1024D/43C2D0C7 1999-03-08 Kilo Test (demo key) -sub 1024g/9AF64D02 1999-03-08 -pub 1024D/A9E3B0B2 1999-03-08 Bravo Test (demo key) -uid Bob (demo key) -sub 1024g/E29BA37F 1999-03-08 -pub 1024D/EB9DC9E6 1999-03-08 Delta Test (demo key) -sub 1024g/B0C45424 1999-03-08 -pub 1024D/7372E243 1999-03-08 Foxtrot Test (demo key) -sub 1024g/EE45198E 1999-03-08 -pub 1024D/34C6E3F1 1999-03-08 Hotel Test (demo key) -sub 1024g/D622AD0A 1999-03-08 -pub 1024D/D2699313 1999-03-08 Juliet Test (demo key) -sub 1024g/35F8F136 1999-03-08 -pub 1024D/B79103F8 1999-03-08 Lima Test (demo key) -sub 1024g/FE56350C 1999-03-08 -pub 1024D/BE5CF886 1999-03-08 Mike Test (demo key) -uid Mallory (demo key) -sub 1024g/4F31EAE8 1999-03-08 -pub 1024D/30CEC684 1999-03-08 November Test (demo key) -sub 1024g/8B70E472 1999-03-08 -pub 1024D/6D9732AC 1999-03-08 Oscar Test (demo key) -sub 1024g/2681619F 1999-03-08 -pub 1024D/3FF13206 1999-03-08 Papa test (demo key) -sub 1024g/63330D9C 1999-03-08 -pub 1024D/3C661C84 1999-03-08 Quebec Test (demo key) -sub 1024g/A029ACF4 1999-03-08 -pub 1024D/777FBED3 1999-03-08 Romeo Test (demo key) -sub 1024g/11D102EA 1999-03-08 -pub 1024D/A3AE3EA1 1999-03-08 Sierra Test (demo key) -sub 1024g/0F1B50B4 1999-03-08 -pub 1024D/85A81F38 1999-03-08 Tango Test (demo key) -sub 1024g/101C0402 1999-03-08 -pub 1024D/653244D6 1999-03-08 Uniform Test (demo key) -sub 1024g/5522BDB9 1999-03-08 -pub 1024D/61F04784 1999-03-08 Victor Test (demo key) -sub 1024g/07287134 1999-03-08 -pub 1024D/EC67DBDE 1999-03-08 Whisky Test (demo key) -sub 1024g/FD6E27F6 1999-03-08 -pub 1024D/567FB34A 1999-03-08 XRay Test (demo key) -sub 1024g/41E408BE 1999-03-08 -pub 1024D/4B11B25F 1999-03-08 Yankee Test (demo key) -sub 1024g/F7B080AD 1999-03-08 -pub 1024D/54ACD246 1999-03-08 Zulu Test (demo key) -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 deleted file mode 100644 index a091e0e63..000000000 --- a/checks/pubring.asc +++ /dev/null @@ -1,720 +0,0 @@ ------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 deleted file mode 100644 index e8eaabb93..000000000 --- a/checks/pubring.pkr.asc +++ /dev/null @@ -1,28 +0,0 @@ -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 - - ------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 deleted file mode 100755 index 72ab27f41..000000000 --- a/checks/seat.test +++ /dev/null @@ -1,11 +0,0 @@ -#!/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 deleted file mode 100644 index 343453c45..000000000 --- a/checks/secdemo.asc +++ /dev/null @@ -1,737 +0,0 @@ -26 demo keys (passphrase is "abc"): - -sec 1024D/68697734 1999-03-08 Alpha Test (demo key) -uid Alice (demo key) -uid Alfa Test (demo key) -ssb 1024g/46A871F8 1999-03-08 -sec 1024D/1AFDAB6C 1999-03-08 Charlie Test (demo key) -ssb 1024g/BC43DA60 1999-03-08 -sec 1024D/FAEF6D1B 1999-03-08 Echo Test (demo key) -uid Eve (demo key) -uid Echelon (demo key) -ssb 1024g/7272144D 1999-03-08 -sec 1024D/8FC282E6 1999-03-08 Golf Test (demo key) -ssb 1024g/9DCAD354 1999-03-08 -sec 1024D/04259677 1999-03-08 India Test (demo key) -ssb 1024g/61F76C73 1999-03-08 -sec 1024D/43C2D0C7 1999-03-08 Kilo Test (demo key) -ssb 1024g/9AF64D02 1999-03-08 -sec 1024D/A9E3B0B2 1999-03-08 Bravo Test (demo key) -uid Bob (demo key) -ssb 1024g/E29BA37F 1999-03-08 -sec 1024D/EB9DC9E6 1999-03-08 Delta Test (demo key) -ssb 1024g/B0C45424 1999-03-08 -sec 1024D/7372E243 1999-03-08 Foxtrot Test (demo key) -ssb 1024g/EE45198E 1999-03-08 -sec 1024D/34C6E3F1 1999-03-08 Hotel Test (demo key) -ssb 1024g/D622AD0A 1999-03-08 -sec 1024D/D2699313 1999-03-08 Juliet Test (demo key) -ssb 1024g/35F8F136 1999-03-08 -sec 1024D/B79103F8 1999-03-08 Lima Test (demo key) -ssb 1024g/FE56350C 1999-03-08 -sec 1024D/BE5CF886 1999-03-08 Mike Test (demo key) -uid Mallory (demo key) -ssb 1024g/4F31EAE8 1999-03-08 -sec 1024D/30CEC684 1999-03-08 November Test (demo key) -ssb 1024g/8B70E472 1999-03-08 -sec 1024D/6D9732AC 1999-03-08 Oscar Test (demo key) -ssb 1024g/2681619F 1999-03-08 -sec 1024D/3FF13206 1999-03-08 Papa test (demo key) -ssb 1024g/63330D9C 1999-03-08 -sec 1024D/3C661C84 1999-03-08 Quebec Test (demo key) -ssb 1024g/A029ACF4 1999-03-08 -sec 1024D/777FBED3 1999-03-08 Romeo Test (demo key) -ssb 1024g/11D102EA 1999-03-08 -sec 1024D/A3AE3EA1 1999-03-08 Sierra Test (demo key) -ssb 1024g/0F1B50B4 1999-03-08 -sec 1024D/85A81F38 1999-03-08 Tango Test (demo key) -ssb 1024g/101C0402 1999-03-08 -sec 1024D/653244D6 1999-03-08 Uniform Test (demo key) -ssb 1024g/5522BDB9 1999-03-08 -sec 1024D/61F04784 1999-03-08 Victor Test (demo key) -ssb 1024g/07287134 1999-03-08 -sec 1024D/EC67DBDE 1999-03-08 Whisky Test (demo key) -ssb 1024g/FD6E27F6 1999-03-08 -sec 1024D/567FB34A 1999-03-08 XRay Test (demo key) -ssb 1024g/41E408BE 1999-03-08 -sec 1024D/4B11B25F 1999-03-08 Yankee Test (demo key) -ssb 1024g/F7B080AD 1999-03-08 -sec 1024D/54ACD246 1999-03-08 Zulu Test (demo key) -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 deleted file mode 100644 index 99e02ca6f..000000000 --- a/checks/secring.asc +++ /dev/null @@ -1,73 +0,0 @@ -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) -ssb 1024g/47BE2775 2003-12-31 - -sec 1024D/C40FDECF 2003-12-31 Test two (no pp) -ssb 1024g/B27907AA 2003-12-31 - -sec 1024R/ECABF51D 2003-12-31 Test three (no pp) - ------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 deleted file mode 100644 index 0081b59c1..000000000 --- a/checks/secring.skr.asc +++ /dev/null @@ -1,27 +0,0 @@ -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 - -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 deleted file mode 100755 index e387446c2..000000000 --- a/checks/signdemokey +++ /dev/null @@ -1,16 +0,0 @@ -#!/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 deleted file mode 100755 index 41bf83164..000000000 --- a/checks/signencrypt-dsa.test +++ /dev/null @@ -1,22 +0,0 @@ -#!/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 deleted file mode 100755 index 1d05990fc..000000000 --- a/checks/signencrypt.test +++ /dev/null @@ -1,13 +0,0 @@ -#!/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 deleted file mode 100755 index 2294cf55a..000000000 --- a/checks/sigs-dsa.test +++ /dev/null @@ -1,22 +0,0 @@ -#!/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 deleted file mode 100755 index 2c3be5cf5..000000000 --- a/checks/sigs.test +++ /dev/null @@ -1,52 +0,0 @@ -#!/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 deleted file mode 100755 index bfd7baa0d..000000000 --- a/checks/verify.test +++ /dev/null @@ -1,252 +0,0 @@ -#!/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 <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 deleted file mode 100755 index f1fd7284f..000000000 --- a/checks/version.test +++ /dev/null @@ -1,9 +0,0 @@ -#!/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 deleted file mode 100644 index 94849a647..000000000 --- a/cipher/ChangeLog +++ /dev/null @@ -1,1290 +0,0 @@ -2006-06-28 David Shaw - - * rsa.c (generate): Use e=65537 for new RSA keys. - -2006-04-20 David Shaw - - * 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 - - * 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 - - * 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 - - * 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 - - * random.c (lock_seed_file): Build even when not used. - -2006-02-09 Werner Koch - - * random.c (lock_seed_file): New. - (read_seed_file, update_random_seed_file): Use it. - (random_disable_locking): New. - -2005-12-06 David Shaw - - * 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 - - * 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 - - * random.c: Fix prototype of the fast random gatherer. Noted by - Joe Vender. - -2005-03-23 Werner Koch - - * 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 - - * primegen.c (is_prime): Free A2. Noted by pmike2001@mail.ru. - Fixes #423. - -2004-11-30 David Shaw - - * md.c (string_to_digest_algo): Allow read/write SHA384 and - SHA512. - -2004-11-03 Timo Schulz - - * idea-stub.c (dlopen, dlsym): Use w32_strerror instead of - just showing the error number. - -2004-10-14 Werner Koch - - * rndunix.c (start_gatherer) [ENABLE_SELINUX_HACKS]: Don't allow - logging. - -2004-10-12 David Shaw - - * 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 - - * rsa.c (rsa_generate): Return the dummy list of factors only if - the caller asked for it. - -2004-05-20 David Shaw - - * dsa.c (verify): s/exp/exponent/ to fix a compiler warning. From - Werner on stable branch. - -2004-01-16 David Shaw - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * primegen.c (gen_prime): Bail out if NBITS is zero. This is - Debian bug #213989 reported by Max . - -2003-09-04 David Shaw - - * 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 - - * 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 - - * random.c (getfnc_gather_random): Don't check NAME_OF_DEV_RANDOM - twice. Use NAME_OF_DEV_URANDOM. - -2003-05-24 David Shaw - - * 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 - - * 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 - - * md.c (md_start_debug): Need to open the file in binary mode. - -2003-02-21 David Shaw - - * cipher.c (setup_cipher_table): #ifdef all optional ciphers. - - * md.c (load_digest_module): #ifdef all optional digests. - -2003-02-11 David Shaw - - * 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 - - * 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 - - * 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 - - * 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 - - * rndriscos.c (rndriscos_gather_random): Use riscos_load_module() - to load CryptRandom module. - -2002-10-12 Werner Koch - - * 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 - - * tiger.c (tiger_get_info): Select the OID to use for TIGER at - compile time. - -2002-09-27 David Shaw - - * Makefile.am, md.c (load_digest_module): TIGER is now always - enabled. - -2002-09-26 Werner Koch - - * 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 - - * rndw32.c (SIZEOF_DISK_PERFORMANCE_STRUCT): Increased to 256. - -2002-09-12 Stefan Bellon - - * rand-internal.h (rndriscos_gather_random): Added prototype. - -2002-08-30 Werner Koch - - * 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 - - * primegen.c (generate_elg_prime): Return all factors for mode 1. - Bug reported by Bob Mathews. - -2002-08-12 Werner Koch - - * 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 - - * Makefile.am, md.c (load_digest_module): Allow switching TIGER on - and off via configure. - -2002-08-07 David Shaw - - * 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 - - * 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 - - * 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 - - * 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 - - 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 - - * random.c: "warning" -> "WARNING" - -2002-07-02 Werner Koch - - * 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 - - * 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 - - * md.c (md_start_debug): Use EXTSEP_S instead of ".". - -2002-04-24 Werner Koch - - * tiger.c (tiger_final): Removed superfluous token pasting operators. - * md5.c (md5_final): Ditto. - -2002-04-22 Stefan Bellon - - * rndriscos.c (func_table): Made func a function pointer. - (init_device): Improved loading of CryptRandom module. - -2002-04-18 Werner Koch - - * 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 - - * 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 - - * 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 - - * 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 - - * random.c (mix_pool): Carry an extra failsafe_digest buffer - around to make the function more robust. - -2002-02-08 Werner Koch - - * 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 - - * rndriscos.c [__riscos__]: Updated include file name. - -2001-12-21 Werner Koch - - * Makefile.am (DISCLEANFILES): Add construct.c - -2001-12-19 Werner Koch - - * rndw32.c [CYGWIN32]: Include winioctl.h. By Disastry. - -2001-11-08 Werner Koch - - * 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 - - * Makefile.am: Need to use $(EXEEXT) where approriate. - -2001-09-09 Werner Koch - - * rsa.c (rsa_get_info): s/usage/r_usage/ to avoid shadow warnings. - -2001-08-24 Werner Koch - - * md.c (md_write): Made buf arg const. - -2001-08-22 Werner Koch - - * random.c (fast_random_poll): Don't use gethrtime if it is broken. - -2001-08-20 Werner Koch - - Applied patches from Stefan Bellon 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 - - * 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 - - * 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 - - * 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 - - * random.c (fast_random_poll): Do not check the return code of - getrusage. - -2001-04-17 Werner Koch - - * rndunix.c: Add a signal.h header to avoid warnings on Solaris 7 - and 8. - -2001-04-16 Werner Koch - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * random.c: Always include time.h - standard requirement. Thanks - to James Troup. - -2001-01-18 Werner Koch - - * rndw32.c: Fixed typo and wrong ifdef for VER_PLATFORM* macro - -2001-01-12 Werner Koch - - * 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 - - * rndegd.c (gather_random): Fixed default socket to be '=entropy'. - Thanks to Tomasz Kozlowski. - -2000-10-12 Werner Koch - - * rijndael.c: New. - * cipher.c: Add Rijndael support. - -Wed Oct 4 15:50:18 CEST 2000 Werner Koch - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * rndw32.c: Started with alternative code to replace entropy.dll - -Thu May 18 11:38:54 CEST 2000 Werner Koch - - * 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 - - * twofish.c (twofish_get_info): Fixed warning about cast. - -Tue Mar 28 14:26:58 CEST 2000 Werner Koch - - * random.c [MINGW32]: Include process.h for getpid. - -Thu Mar 2 15:37:46 CET 2000 Werner Koch - - * 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 - - * twofish.c (twofish_get_info): Add some const to the casts. By Martin - Kahlert. - -Mon Feb 14 14:30:20 CET 2000 Werner Koch - - (update_random_seed_file): Silently ignore update request when pool - is not filled. - -Fri Feb 11 17:44:40 CET 2000 Werner Koch - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * rndw32.c (gather_random): Handle PCP_SEEDER_TOO_SMALL. - -Sat Oct 9 20:34:41 CEST 1999 Werner Koch - - * Makefile.am: Tweaked module build and removed libtool - -Fri Oct 8 20:32:01 CEST 1999 Werner Koch - - * rndw32.c (load_and_init_winseed): Use the Registry to locate the DLL - -Mon Oct 4 21:23:04 CEST 1999 Werner Koch - - * md.c (md_reset): Clear finalized; thanks to Ulf Moeller for - fixing this bug. - -Sat Sep 18 12:51:51 CEST 1999 Werner Koch - - * Makefile.am: Never compile mingw32 as module - -Wed Sep 15 14:39:59 CEST 1999 Michael Roth - - * 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 - - * rndw32.c: New. - -Mon Sep 13 10:51:29 CEST 1999 Werner Koch - - * 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 - - * Makefile.am: Fixed seds for latest egcc. By Ollivier Robert. - -Mon Sep 6 19:59:08 CEST 1999 Werner Koch - - * des.c (selftest): Add some testpattern - -Mon Aug 30 20:38:33 CEST 1999 Werner Koch - - * 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 - - * md5.c (md5_final): Fix for a SCO cpp bug. - -Thu Jul 15 10:15:35 CEST 1999 Werner Koch - - * 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 - - * Makefile.am: Support for libtool. - -Fri Jul 2 11:45:54 CEST 1999 Werner Koch - - * 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 - - * 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 - - * 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 - - * 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 - - * dynload.c (register_internal_cipher_extension): Minor init fix. - -Tue May 4 15:47:53 CEST 1999 Werner Koch - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * rndlinux.c (tty_printf) [IS_MODULE]: Removed. - - * rndegd.c (gather_random): Some fixes. - -Wed Mar 17 13:09:03 CET 1999 Werner Koch - - * rndegd.c (do_read): New. - (gather_random): Changed the implementation. - -Mon Mar 8 20:47:17 CET 1999 Werner Koch - - * dynload.c (DLSYM_NEEDS_UNDERSCORE): Renamed. - -Fri Feb 26 17:55:41 CET 1999 Werner Koch - - * md.c: Nearly a total rewrote. - -Wed Feb 24 11:07:27 CET 1999 Werner Koch - - * cipher.c (context): Fixed alignment - * md.c: Ditto. - - * rndegd.c: New - -Mon Feb 22 20:04:00 CET 1999 Werner Koch - - * rndegd.c: New. - -Wed Feb 10 17:15:39 CET 1999 Werner Koch - - * 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 - - * rndunix.c (gather_random): Fix to avoid infinite loop. - -Sun Jan 17 11:04:33 CET 1999 Werner Koch - - * 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 - - * 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 - - * 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 - - * 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 - - * rndunix.c (start_gatherer): Fixed stupid ==/= bug - -1998-12-31 Geoff Keating - - * des.c (is_weak_key): Rewrite loop end condition. - -Tue Dec 29 14:41:47 CET 1998 Werner Koch - - * random.c: add unistd.h for getpid(). - (RAND_MAX): Fallback value for Sun. - -Wed Dec 23 17:12:24 CET 1998 Werner Koch - - * md.c (md_copy): Reset debug. - -Mon Dec 14 21:18:49 CET 1998 Werner Koch - - * 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 - - * 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 - - * 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 - - * 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 - -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 deleted file mode 100644 index 0aef60579..000000000 --- a/cipher/Makefile.am +++ /dev/null @@ -1,75 +0,0 @@ -# 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/algorithms.h b/cipher/algorithms.h deleted file mode 100644 index 65346fea3..000000000 --- a/cipher/algorithms.h +++ /dev/null @@ -1,141 +0,0 @@ -/* 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/blowfish.c b/cipher/blowfish.c deleted file mode 100644 index 1a1ce5678..000000000 --- a/cipher/blowfish.c +++ /dev/null @@ -1,619 +0,0 @@ -/* 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 -#include -#include -#include -#include -#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 deleted file mode 100644 index 043aa7aed..000000000 --- a/cipher/cast5.c +++ /dev/null @@ -1,646 +0,0 @@ -/* 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 -#include -#include -#include -#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 deleted file mode 100644 index 311919fe1..000000000 --- a/cipher/cipher.c +++ /dev/null @@ -1,715 +0,0 @@ -/* 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 -#include -#include -#include -#include -#include -#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 deleted file mode 100644 index 6ad799395..000000000 --- a/cipher/des.c +++ /dev/null @@ -1,1022 +0,0 @@ -/* 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 , 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 -#include -#include /* 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<> 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 -#include -#include -#include -#include -#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/dynload.c b/cipher/dynload.c deleted file mode 100644 index 05d82f623..000000000 --- a/cipher/dynload.c +++ /dev/null @@ -1,104 +0,0 @@ -/* 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 -#include -#include -#include -#include -#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 deleted file mode 100644 index 3c37a283e..000000000 --- a/cipher/elgamal.c +++ /dev/null @@ -1,510 +0,0 @@ -/* 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 -#include -#include -#include -#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 deleted file mode 100644 index 416f49cc5..000000000 --- a/cipher/elgamal.h +++ /dev/null @@ -1,35 +0,0 @@ -/* 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/gost.c b/cipher/gost.c deleted file mode 100644 index 1b6be38c5..000000000 --- a/cipher/gost.c +++ /dev/null @@ -1,77 +0,0 @@ -/* gost.c - GOST encryption - * Copyright (C) 1998 Free Software Foundation, Inc. - * - * The description of GOST (and the used S-boxes) are taken from: - * Bruce Schneier: Applied Cryptography. John Wiley & Sons, 1996. - * ISBN 0-471-11709-9. . - * - * This file is part of GnuPG. - * - * GnuPG is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * GnuPG is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public 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 -#include -#include -#include -#include "util.h" -#include "types.h" -#include "gost.h" - -#error don't use this - - -void -gost_setkey( GOST_context *c, byte *key ) -{ -} - -void -gost_setiv( GOST_context *c, byte *iv ) -{ -} - - -void -gost_encode( GOST_context *c, byte *outbuf, byte *inbuf, unsigned nblocks ) -{ -} - - -void -gost_decode( GOST_context *c, byte *outbuf, byte *inbuf, unsigned nblocks ) -{ -} - - -static void -cfbshift( byte *iv, byte *buf, unsigned count) -{ -} - - - -void -gost_encode_cfb( GOST_context *c, byte *outbuf, byte *inbuf, unsigned nbytes) -{ -} - - -void -gost_decode_cfb( GOST_context *c, byte *outbuf, byte *inbuf, unsigned nbytes) -{ -} - diff --git a/cipher/gost.h b/cipher/gost.h deleted file mode 100644 index bbe8bc522..000000000 --- a/cipher/gost.h +++ /dev/null @@ -1,47 +0,0 @@ -/* gost.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_GOST_H -#define G10_GOST_H - -#include "types.h" - -#define GOST_KEYSIZE 16 -#define GOST_BLOCKSIZE 8 -#define GOST_ROUNDS 8 -#define GOST_KEYLEN (6*GOST_ROUNDS+4) - -typedef struct { - u16 ek[GOST_KEYLEN]; - u16 dk[GOST_KEYLEN]; - byte iv[GOST_BLOCKSIZE]; -} GOST_context; - -void gost_setkey( GOST_context *c, byte *key ); -void gost_setiv( GOST_context *c, byte *iv ); -void gost_encode( GOST_context *c, byte *out, byte *in, unsigned nblocks ); -void gost_decode( GOST_context *c, byte *out, byte *in, unsigned nblocks ); -void gost_encode_cfb( GOST_context *c, byte *outbuf, - byte *inbuf, unsigned nbytes); -void gost_decode_cfb( GOST_context *c, byte *outbuf, - byte *inbuf, unsigned nbytes); - - -#endif /*G10_GOST_H*/ diff --git a/cipher/idea-stub.c b/cipher/idea-stub.c deleted file mode 100644 index 55b5cb506..000000000 --- a/cipher/idea-stub.c +++ /dev/null @@ -1,182 +0,0 @@ -/* 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 -#include -#include -#include -#include -#ifdef HAVE_DL_DLOPEN -#include -#endif -#ifdef _WIN32 -#include -#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 deleted file mode 100644 index 8faf20831..000000000 --- a/cipher/md.c +++ /dev/null @@ -1,530 +0,0 @@ -/* 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 -#include -#include -#include -#include -#include -#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 deleted file mode 100644 index 270e3fe3e..000000000 --- a/cipher/md5.c +++ /dev/null @@ -1,366 +0,0 @@ -/* 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 , 1995. */ -/* Heavily modified for GnuPG by */ - -/* 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 -#include -#include -#include -#include -#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 deleted file mode 100644 index 0662d39e0..000000000 --- a/cipher/primegen.c +++ /dev/null @@ -1,594 +0,0 @@ -/* 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 -#include -#include -#include -#include -#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 deleted file mode 100644 index d6d1ff1f2..000000000 --- a/cipher/pubkey.c +++ /dev/null @@ -1,577 +0,0 @@ -/* 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 -#include -#include -#include -#include -#include -#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 deleted file mode 100644 index cb398877a..000000000 --- a/cipher/rand-internal.h +++ /dev/null @@ -1,39 +0,0 @@ -/* 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 deleted file mode 100644 index 3c25a2b22..000000000 --- a/cipher/random.c +++ /dev/null @@ -1,838 +0,0 @@ -/* 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 -#include -#include -#include -#include -#include -#include -#ifndef _WIN32 -#include -#endif -#include -#include -#include -#include -#ifdef HAVE_GETHRTIME -#include -#endif -#ifdef HAVE_GETTIMEOFDAY -#include -#endif -#ifdef HAVE_TIMES -#include -#endif -#ifdef HAVE_GETRUSAGE -#include -#endif -#ifdef _WIN32 -#include -#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 deleted file mode 100644 index 0f26d999b..000000000 --- a/cipher/random.h +++ /dev/null @@ -1,43 +0,0 @@ -/* 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 deleted file mode 100644 index e52e01e96..000000000 --- a/cipher/rijndael.c +++ /dev/null @@ -1,2206 +0,0 @@ -/* 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. - *------------------------------------------ - */ - -#include -#include -#include -#include /* 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; - - -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 -}; - - - -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 -} - - - -/* 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 - - - - -/* 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)); -} - -/* 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/rmd160.c b/cipher/rmd160.c deleted file mode 100644 index 7a7230f38..000000000 --- a/cipher/rmd160.c +++ /dev/null @@ -1,588 +0,0 @@ -/* 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 -#include -#include -#include -#include -#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/rmd160test.c b/cipher/rmd160test.c deleted file mode 100644 index 94912269b..000000000 --- a/cipher/rmd160test.c +++ /dev/null @@ -1,63 +0,0 @@ -/* rmd160test.c - ripe md160 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 -#include -#include -#include - -#include "util.h" -#include "rmd.h" - -static void -usage(void) -{ - fprintf(stderr, "usage: rmd160test\n"); - exit(1); -} - - -int -main(int argc, char **argv) -{ - RMDHANDLE rmdhd; - int i, n; - byte buf[100], *p; - - if( argc > 1 ) - usage(); - - rmdhd = rmd160_open(0); -#if 1 - while( (n = fread( buf, 1, 100, stdin )) > 0 ) - rmd160_write(rmdhd, buf, n); -#else - for(i=0; i < 1000000; i++ ) - rmd160_putchar(rmdhd, 'a'); -#endif - p = rmd160_final(rmdhd); - for(i=0; i < 20; i++, p++ ) - printf("%02x", *p ); - putchar('\n'); - - rmd160_close(rmdhd); - return 0; -} diff --git a/cipher/rndegd.c b/cipher/rndegd.c deleted file mode 100644 index e6646a243..000000000 --- a/cipher/rndegd.c +++ /dev/null @@ -1,225 +0,0 @@ -/* 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#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 deleted file mode 100644 index c6f646c63..000000000 --- a/cipher/rndlinux.c +++ /dev/null @@ -1,160 +0,0 @@ -/* 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 -#include -#include -#include -#include -#include -#include -#include -#ifdef HAVE_GETTIMEOFDAY -#include -#endif -#include -#include -#include -#if 0 -#include -#include -#include -#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/rndriscos.c b/cipher/rndriscos.c deleted file mode 100644 index 5565e1fee..000000000 --- a/cipher/rndriscos.c +++ /dev/null @@ -1,72 +0,0 @@ -/* rndriscos.c - raw random number for RISC OS - * 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. - */ - -#include - -#ifdef USE_RNDRISCOS - -#include -#include -#include -#include "util.h" - - -static const char * const cryptrandom_path[] = { - "GnuPG:CryptRandom", - "GnuPG:CryptRand", - "System:310.Modules.CryptRandom", - "System:310.Modules.CryptRand", - "System:Modules.CryptRandom", - "System:Modules.CryptRand", - NULL -}; - -/**************** - * Get the random bytes from module - */ -int -rndriscos_gather_random(void (*add)(const void*, size_t, int), int requester, - size_t length, int level) -{ - static int rndriscos_initialized = 0; - int n, nbytes; - byte buffer[768]; - - if (!rndriscos_initialized) - rndriscos_initialized = riscos_load_module("CryptRandom", - cryptrandom_path, 1); - - while (length) { - nbytes = length < sizeof(buffer) ? length : sizeof(buffer); - - for (n = 0; n < nbytes; ++n) - if (_swix(CryptRandom_Byte, _OUT(0), &buffer[n])) - g10_log_fatal("CryptRandom module isn't working as expected!\n"); - - (*add)(buffer, n, requester); - length -= n; - } - wipememory(buffer, sizeof(buffer)); /* burn the buffer */ - - return 0; /* success */ -} - -#endif /*USE_RNDRISCOS */ diff --git a/cipher/rndunix.c b/cipher/rndunix.c deleted file mode 100644 index 3cc71cf0b..000000000 --- a/cipher/rndunix.c +++ /dev/null @@ -1,869 +0,0 @@ -/**************************************************************************** - * * - * * - * 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, 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 -#include -#include -#include -#include - -/* 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 -#include -#include -#ifndef __QNX__ -#include -#include -#endif /* __QNX__ */ -#include /* SCO and SunOS need this before resource.h */ -#ifndef __QNX__ -#include -#endif /* __QNX__ */ -#if defined( _AIX ) || defined( __QNX__ ) -#include -#endif /* _AIX || __QNX__ */ -#ifndef __QNX__ -#include -#include -#include -#endif /* __QNX__ */ -#include -#include /* Verschiedene komische Typen */ -#if defined( __hpux ) && ( OS_VERSION == 9 ) -#include -#endif /* __hpux 9.x, after that it's in unistd.h */ -#include -/* #include */ -#ifdef __QNX__ -#include -#include -#endif /* __QNX__ */ -#include - -#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 deleted file mode 100644 index f81f1c191..000000000 --- a/cipher/rndw32.c +++ /dev/null @@ -1,699 +0,0 @@ -/* 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, 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 -#include -#include -#include -#include -#include - -#include - - -#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 deleted file mode 100644 index 0b00e215e..000000000 --- a/cipher/rsa.c +++ /dev/null @@ -1,487 +0,0 @@ -/* 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 -#include -#include -#include -#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 deleted file mode 100644 index e6ea42356..000000000 --- a/cipher/rsa.h +++ /dev/null @@ -1,36 +0,0 @@ -/* 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 deleted file mode 100644 index d150fad1e..000000000 --- a/cipher/sha1.c +++ /dev/null @@ -1,359 +0,0 @@ -/* 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 -#include -#include -#include -#include -#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 deleted file mode 100644 index 240307356..000000000 --- a/cipher/sha256.c +++ /dev/null @@ -1,379 +0,0 @@ -/* 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 -#include -#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 deleted file mode 100644 index 523579d25..000000000 --- a/cipher/sha512.c +++ /dev/null @@ -1,430 +0,0 @@ -/* 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 -#include -#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 deleted file mode 100644 index b110fbbd1..000000000 --- a/cipher/smallprime.c +++ /dev/null @@ -1,115 +0,0 @@ -/* 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 -#include -#include -#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 deleted file mode 100644 index 2feccdf61..000000000 --- a/cipher/twofish.c +++ /dev/null @@ -1,1034 +0,0 @@ -/* Twofish for GPG - * By Matthew Skala , 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. */ - -#include -#include -#include -#include /* 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; - -/* 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 -}; - -/* 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} -}; - -/* 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 -}; - - -/* 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) - - -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; -} - - - -/* 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 - -/* 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*)); -} - -/* 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*)); -} - -/* 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; -} - -/* 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 -#include -#include - -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/common/ChangeLog b/common/ChangeLog new file mode 100644 index 000000000..36a733a7f --- /dev/null +++ b/common/ChangeLog @@ -0,0 +1,577 @@ +2006-05-23 Werner Koch + + * gettime.c (isotimestamp): New. + + * ttyio.c (tty_get_ttyname): Posixly correct usage of ctermid. + + * dns-cert.c: New. Taken from 1.4.3's util/cert.c. + * dns-cert.h: New. + +2006-05-22 Werner Koch + + * pka.c: New. Taked from 1.4.3. + * pka.h: New. + * Makefile.am: Added pka. + +2006-05-19 Werner Koch + + * yesno.c (answer_is_yes_no_default, answer_is_yes_no_quit): + Updated from 1.4.3. + (answer_is_okay_cancel): new. From 1.4.3. + + * miscellaneous.c (match_multistr): New. Taken from 1.4.3. + + * ttyio.c (tty_enable_completion, tty_disable_completion): New + dummy functions. + * ttyio.h: Add prototypes and stubs. + +2006-04-19 Werner Koch + + * iobuf.c (iobuf_get_fd): New. Taken from 1.4.3. + (iobuf_is_pipe_filename): New. + (pop_filter): Made static. + (iobuf_skip_rest): New. Orginal patch by Florian + Weimer. Added new argument PARTIAL. + (block_filter): Remove the old gpg indeterminate length mode. + (block_filter): Properly handle a partial body stream + that ends with a 5-byte length that happens to be zero. + (iobuf_set_block_mode, iobuf_in_block_mode): Removed as + superfluous. + (iobuf_get_filelength): New arg OVERFLOW. + (iobuf_get_filelength) [W32]: Use GetFileSizeEx if available + * miscellaneous.c (is_file_compressed): Take care of OVERFLOW. + +2006-04-18 Werner Koch + + * homedir.c (w32_shgetfolderpath): New. Taken from gpg 1.4.3. + (default_homedir): Use it. + +2005-10-08 Marcus Brinkmann + + * signal.c (get_signal_name): Check value of HAVE_DECL_SYS_SIGLIST + instead of just if it is defined. + +2005-09-28 Marcus Brinkmann + + * Makefile.am (AM_CFLAGS): Add $(LIBASSUAN_CFLAGS). + +2005-07-04 Marcus Brinkmann + + * simple-pwquery.h (simple_pwclear): New prototype. + * simple-pwquery.c (simple_pwclear): New function. + +2005-06-15 Werner Koch + + * miscellaneous.c (make_printable_string): Made P a void*. + + * sexputil.c (keygrip_from_canon_sexp, cmp_simple_canon_sexp): + Fixed signed/unsigned pointer mismatch. + (make_simple_sexp_from_hexstr): Ditto. This is all too ugly; I + wonder why gcc-4's default is to warn about them and forcing us to + use cast the warning away. + * iobuf.c (block_filter): Ditto. + (iobuf_flush): Ditto. + (iobuf_read_line): Ditto. + (iobuf_read): Make BUFFER a void *. + (iobuf_write): Make BUFFER a const void *. + * ttyio.c (tty_print_utf8_string2): Ditto. + * estream.c (estream_cookie_mem): Make MEMORY unsigned char*. + (es_write): Make BUFFER a void *. + (es_writen): Ditto. + (es_func_fd_read, es_func_fd_write, es_func_mem_read) + (es_func_mem_write): Ditto. + (es_read, es_readn): Ditto. + (es_func_mem_write): Made MEMORY_NEW an unsigned char *. + * estream.h (es_cookie_read_function_t) + (es_cookie_write_function_t): Changed buffer arg to void*. + +2005-06-03 Werner Koch + + * estream.c: Use HAVE_CONFIG_H and not USE_CONFIG_H! + (es_func_fd_read, es_func_fd_write): Protect against EINTR. + +2005-06-01 Werner Koch + + * Makefile.am (AM_CPPFLAGS): Added. + + * util.h: Add some includes for gnulib. + (ttyname, isascii): Define them inline. + * fseeko.c, ftello.c: Removed. + * strsep.c, mkdtemp.c: Removed. + * ttyname.c, isascii.c: Removed. + +2005-05-31 Werner Koch + + * dynload.h: s/__inline__/inline/. + +2005-05-13 Werner Koch + + * signal.c (got_fatal_signal): Print the signal number if we can't + get a name for it. + (get_signal_name): Return NULL if no name is available. Fixed + conditional for sys_siglist to the correct one. + +2005-04-17 Werner Koch + + * sexputil.c (cmp_simple_canon_sexp): New. + (make_simple_sexp_from_hexstr): New. + +2005-04-07 Werner Koch + + * sexputil.c: New. + +2005-04-11 Marcus Brinkmann + + * simple-pwquery.c (simple_pwquery): Use spwq_secure_free. + +2005-03-03 Werner Koch + + * Makefile.am (AM_CFLAGS): Added PTH_CFLAGS. Noted by Kazu Yamamoto. + +2005-02-25 Werner Koch + + * xasprintf.c (xtryasprintf): New. + +2005-01-26 Moritz Schulte + + * Makefile.am (libcommon_a_SOURCES): New source files: estream.c, + estream.h. + * estream.c, estream.h: New files. + +2005-01-03 Werner Koch + + * asshelp.c (send_pinentry_environment): Fixed changed from + 2004-12-18; cut+paste error for lc-messages. + +2004-12-21 Werner Koch + + * simple-pwquery.c (agent_open) [W32]: Implement for W32. + (readline) [W32]: Use recv instead of read. + (writen) [W32]: Use send instead of write. + (my_stpcpy): Define a stpcpy replacement so that this file + continues to be self-contained. + (agent_send_all_options) [W32]: Don't call ttyname. + +2004-12-21 Marcus Brinkmann + + * simple-pwquery.h (simple_query): Add prototype. + * simple-pwquery.c (simple_query): New function. + +2004-12-21 Werner Koch + + * signal.c (got_fatal_signal, got_usr_signal) + (got_fatal_signal) [DOSISH]: Don't build. + * simple-gettext.c: Include sysutils.h + + * homedir.c: New. Use CSIDL_APPDATA for W32 as the default home + directory. + * Makefile.am (libcommon_a_SOURCES): Add it. + (EXTRA_DIST): Removed mkerror and mkerrtok. + +2004-12-20 Werner Koch + + * sysutils.h [W32]: Define sleep. + * util.h: Add prototype for mkdtemp. + + * membuf.c (put_membuf): Wipe out buffer after a failed realloc. + +2004-12-19 Werner Koch + + * maperror.c (map_assuan_err_with_source): Oops, args were swapped. + +2004-12-18 Werner Koch + + * maperror.c (map_assuan_err): Renamed to .. + (map_assuan_err_with_source): .. this and add arg SOURCE.c + * asshelp.c (send_pinentry_environment, send_one_option): Add arg + ERRSOURCE. + +2004-12-15 Werner Koch + + * sysutils.h [W32]: Prototypes for registry functions. + * w32reg.c: Include sysutils.h + + * simple-pwquery.c [W32]: Dummy code to allow a build. + + * exechelp.c [W32]: Implemented for W32 . + + * ttyname.c: New. + + * asshelp.c (send_one_option): New. + (send_pinentry_environment): Cleaned up and made sure that empty + values are not send. + +2004-12-07 Werner Koch + + * asshelp.c (send_pinentry_environment) [W32]: Do not use ttyname. + +2004-12-06 Werner Koch + + * exechelp.h, exechelp.c: New. Based on code from ../sm/import.c. + +2004-12-03 Werner Koch + + * strsep.c: Fixed copyright comments. + +2004-11-26 Werner Koch + + * simple-gettext.c: New taken from gnupg 1.3.x + + * simple-pwquery.c [_WIN32]: Include winsock2.h. + (agent_open): Disable it until we have our AF_UNIX implementation + ready. + * fseeko.c, ftello.c: Include sys/types for the sake of W32. + +2004-11-23 Werner Koch + + * b64enc.c: Include stdio.h and string.h + +2004-08-18 Werner Koch + + * simple-pwquery.c (simple_pwquery): Handle gpg-error style return + code for canceled. + +2004-07-20 Werner Koch + + * maperror.c: Removed header ksba.h. Not required anymore. + +2004-06-14 Werner Koch + + * xreadline.c: New. Based on the iobuf_read_line function. + +2004-05-12 Werner Koch + + * util.h (xtrycalloc_secure,xtrymalloc_secure): New. + +2004-05-11 Werner Koch + + * sysutils.c (disable_core_dumps): Only set the current limit. + (enable_core_dumps): New. + +2004-04-13 Werner Koch + + * simple-pwquery.c (copy_and_escape): Relaxed quoting. + +2004-04-05 Werner Koch + + * errors.h (STATUS_NEWSIG): New. + +2004-03-11 Werner Koch + + * dynload.h [__MINGW32__]: Define RTLD_LAZY. + +2004-03-09 Werner Koch + + * maperror.c (map_assuan_err): Map the Locale_Problem item. + +2004-03-03 Werner Koch + + * asshelp.c, asshelp.h: New. + (send_pinentry_environment): New. Code taken from ../sm/call-agent.c. + +2004-02-19 Werner Koch + + * simple-pwquery.c (agent_open): Don't mangle INFOSTR. + +2004-02-17 Werner Koch + + * simple-pwquery.c (agent_open): Ignore an empty GPG_AGENT_INFO. + + * errors.h: Added STATUS_IMPORT_OK. + +2004-02-10 Werner Koch + + * b64enc.c: New. Based on code from ../sm/base64.c. + +2004-01-30 Marcus Brinkmann + + * Makefile.am (libcommon_a_SOURCES): Add xasprintf.c. + * miscellaneous.c (xasprintf): Moved to ... + * xasprintf (xasprintf): ... here. New file. + This allows to use xasprintf without sucking in gpg-error. + +2004-01-27 Werner Koch + + * sexp-parse.h: New; moved from../agent. + + * util.h (xtoi_4): New. + +2003-12-23 Werner Koch + + * maperror.c (map_assuan_err): Prepared for a new error code. + +2003-12-17 Werner Koch + + * gettime.c (asctimestamp): Add a note on a non-avoidable gcc warning. + + * util.h [!HAVE_VASPRINTF]: Add printf format attribute to the + replacement function. + + * miscellaneous.c (xasprintf): New. + +2003-11-14 Werner Koch + + * mkdtemp.c (mkdtemp): Use gcry_create_nonce. + + * cryptmiss.c: Removed. + +2003-11-13 Werner Koch + + * util.h (vasprintf): Also fixed the prototype. + + * vasprintf.c (vasprintf): ARGS should not be a pointer. Fixed + segv on Solaris. Reported by Andrew J. Schorr. + +2003-11-12 Werner Koch + + * maperror.c (map_ksba_err, map_gcry_err, map_kbx_err): Removed. + +2003-10-31 Werner Koch + + * util.h (gnupg_isotime_t): New. + (gnupg_copy_time): New. + + * gettime.c (gnupg_get_isotime): New. + +2003-09-23 Werner Koch + + * iobuf.c (check_special_filename): Replaced is isdigit by digitp + to avoid passing negative values and potential locale problems. + Problem noted by Christian Biere. + + * util.h (ascii_isspace): New. + +2003-09-18 Werner Koch + + * ttyio.c (tty_fprintf): New. + (tty_print_string, tty_print_utf8_string2) + (tty_print_utf8_string): Made P argument const byte*. + +2003-08-20 Marcus Brinkmann + + * maperror.c (map_ksba_err): Map -1. Use gpg_err_make to set + the error source. + +2003-08-14 Timo Schulz + + * dynload.h. New. W32 wrapper around the dynload mechanism. + +2003-07-15 Werner Koch + + * simple-pwquery.c, simple-pwquery.h: New; moved from ../agent. + * Makefile.am (libsimple_pwquery_a_LIBADD): New. + +2003-06-25 Werner Koch + + * maperror.c (map_to_assuan_status): Directly map 0 to 0. + +2003-06-17 Werner Koch + + * gettime.c (scan_isodatestr,add_days_to_timestamp,strtimevalue) + (strtimestamp,asctimestamp): New. Code taken from gnupg 1.3.2 + mischelp.c. + + * yesno.c: New. Code taken from gnupg 1.3.2 mischelp.c + + * miscellaneous.c: New. + + * util.h: Include utf8conf.h + +2003-06-16 Werner Koch + + * gettime.c (make_timestamp): New. + + * ttyio.c: New. Taken from gnupg 1.2. + * ttyio.h: Move from ../include. + +2003-06-13 Werner Koch + + * util.h (seterr): Removed macro. + (xmalloc_secure,xcalloc_secure): New. + +2003-06-11 Werner Koch + + * iobuf.c (iobuf_writebyte,iobuf_write): Return error code from + iobuf_flush. + (iobuf_writestr): Ditto. + +2003-06-10 Werner Koch + + * iobuf.c, iobuf.h: New. Taken from current gnupg 1.3 CVS. Run + indent on it and adjusted error handling to libgpg-error style. + Replaced IOBUF by iobuf_t. Renamed malloc functions. + +2003-06-04 Werner Koch + + * errors.h: Removed all error codes. We keep the status codes for + now. + * Makefile.am: Do not create errors.c anymore; remove it from the + sources. + + * maperror.c: Don't include error.h. Change all error codes to + libgpg-error style. + (map_assuan_err): Changed to new Assuan error code convention. + (map_to_assuan_status): Likewise. + (map_gcry_err,map_kbx_err): Not needed. For now dummy functions. + + * membuf.c, membuf.h: New. Code taken from ../sm/call-agent.h. + * Makefile.am: Added above. + +2003-04-29 Werner Koch + + * util.h (fopencokokie): Removed prototype and struct. + + * fopencookie.c: Removed. + + * maperror.c: Use system assuan.h + +2002-10-31 Neal H. Walfield + + * isascii.c: New file. + * putc_unlocked.c: Likewise. + +2002-10-28 Neal H. Walfield + + * signal.c (caught_fatal_sig): Remove superfluous zero + initializer. + (caught_sigusr1): Likewise. + +2002-09-04 Neal H. Walfield + + * vasprintf.c (vasprintf) [va_copy]: Use va_copy. + [!va_copy && __va_copy]: Use __va_copy. + [!va_copy && !__va_copy]: Only now fall back to using memcpy. + +2002-08-21 Werner Koch + + * errors.h: Added STATUS_IMPORT_PROBLEM. + +2002-08-20 Werner Koch + + * vasprintf.c: Hack to handle NULL for %s. + +2002-08-09 Werner Koch + + * signal.c: New. Taken from GnuPG 1.1.91. + +2002-07-23 Werner Koch + + * util.h (_IO_cookie_io_functions_t): Fixed typo. Noted by + Richard Lefebvre. + +2002-07-22 Werner Koch + + * fseeko.c, ftello.c: New. + +2002-06-28 Werner Koch + + * maperror.c (map_to_assuan_status): Map more errorcodes to Bad + Certificate. + +2002-06-26 Werner Koch + + * maperror.c (map_to_assuan_status): Map EOF to No_Data_Available. + +2002-06-10 Werner Koch + + * errors.h (gnupg_error_token): Add new prototype. + (STATUS_ERROR): New. + + * mkerrtok: New. + * Makefile.am: Use it to create the new error token function. + +2002-06-04 Werner Koch + + * maperror.c (map_to_assuan_status): Map Bad_CA_Certificate. + +2002-05-23 Werner Koch + + * no-pth.c, Makefile.am: Removed. + +2002-05-22 Werner Koch + + * mkdtemp.c: Replaced byte by unsigned char because it is no longer + defined in gcrypt.h. + +2002-05-21 Werner Koch + + * maperror.c (map_gcry_err): Add libgcrypt's new S-expression errors. + (map_ksba_err): Add a few mappings. + +2002-05-14 Werner Koch + + * gettime.c: New. + +2002-05-03 Werner Koch + + * errors.h: Added STARUS_EXPSIG and STATUS_EXPKEYSIG. + +2002-04-15 Werner Koch + + * cryptmiss.c: New. + +2002-02-14 Werner Koch + + * maperror.c: Add more assuan<->gnupg mappings. + +2002-02-12 Werner Koch + + * fopencookie.c: Dummy function. + + * vasprintf.c: New. Taken from binutils-2.9.1 and dropped all non + ANSI-C stuff. Merged with asprintf version. + + * no-pth.c: New. + +2002-01-23 Werner Koch + + * mkdtemp.c: Copied from gnupg-1.0.6c and changed to use libgcrypt. + +2002-01-19 Werner Koch + + * sysutils.c: New. This is the misc.c file from gnupg 1.0.6 with + the OpenPGP stuff removed. + * sysutils.h: New. + +2002-01-15 Werner Koch + + * maperror.c: Add mapping for Not_Trusted. + +2002-01-11 Werner Koch + + * maperror.c (map_assuan_err): Codes for CRL + +2002-01-08 Werner Koch + + * util.h (spacep): New. + +2002-01-02 Werner Koch + + * maperror.c (map_to_assuan_status): New. Merged from ../agent + and ../sm. + +2001-12-20 Werner Koch + + * maperror.c (map_gcry_err): Add some mappings. + +2001-12-18 Werner Koch + + * Makefile.am (AM_CPPFLAGS): Include flags for gcrypt and ksba + +2001-12-14 Werner Koch + + * util.h (digitp, hexdigitp): New ctype like macros. + (atoi_1,atoi_2,atoi_4,xtoi_1,xtoi_2): New. + + + Copyright 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/common/Makefile.am b/common/Makefile.am new file mode 100644 index 000000000..085440bb3 --- /dev/null +++ b/common/Makefile.am @@ -0,0 +1,60 @@ +# Makefile for common gnupg modules +# 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. + +## Process this file with automake to produce Makefile.in + +noinst_LIBRARIES = libcommon.a libsimple-pwquery.a + +AM_CPPFLAGS = -I$(top_srcdir)/gl + +AM_CFLAGS = $(LIBGCRYPT_CFLAGS) $(LIBASSUAN_CFLAGS) $(KSBA_CFLAGS) \ + $(PTH_CFLAGS) + +libcommon_a_SOURCES = \ + util.h i18n.h \ + errors.h \ + sexp-parse.h \ + sexputil.c \ + maperror.c \ + sysutils.c sysutils.h \ + homedir.c \ + gettime.c \ + yesno.c \ + b64enc.c \ + miscellaneous.c \ + xasprintf.c \ + xreadline.c \ + membuf.c membuf.h \ + iobuf.c iobuf.h \ + ttyio.c ttyio.h \ + asshelp.c asshelp.h \ + exechelp.c exechelp.h \ + simple-gettext.c \ + w32reg.c \ + signal.c \ + dynload.h \ + estream.c estream.h \ + dns-cert.c dns-cert.h \ + pka.c pka.h + + +libsimple_pwquery_a_SOURCES = \ + simple-pwquery.c simple-pwquery.h asshelp.c asshelp.h + diff --git a/common/README b/common/README new file mode 100644 index 000000000..a90224bab --- /dev/null +++ b/common/README @@ -0,0 +1,11 @@ +Stuff used by several modules of GnuPG. + +These directories use it: + +gpg +sm +agent + +These directories don't use it: + +kbx \ No newline at end of file diff --git a/common/asshelp.c b/common/asshelp.c new file mode 100644 index 000000000..1da899522 --- /dev/null +++ b/common/asshelp.c @@ -0,0 +1,169 @@ +/* asshelp.c - Helper functions for Assuan + * Copyright (C) 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 +#include +#include +#include +#include +#include +#ifdef HAVE_LOCALE_H +#include +#endif + +#include "util.h" + +#include "asshelp.h" + + +static gpg_error_t +send_one_option (assuan_context_t ctx, gpg_err_source_t errsource, + const char *name, const char *value) +{ + gpg_error_t err; + char *optstr; + + if (!value || !*value) + err = 0; /* Avoid sending empty strings. */ + else if (asprintf (&optstr, "OPTION %s=%s", name, value ) < 0) + err = gpg_error_from_errno (errno); + else + { + assuan_error_t ae; + + ae = assuan_transact (ctx, optstr, NULL, NULL, NULL, NULL, NULL, NULL); + err = ae? map_assuan_err_with_source (errsource, ae) : 0; + free (optstr); + } + + return err; +} + + +/* Send the assuan commands pertaining to the pinenry environment. The + OPT_* arguments are optional and may be used to override the + defaults taken from the current locale. */ +gpg_error_t +send_pinentry_environment (assuan_context_t ctx, + gpg_err_source_t errsource, + const char *opt_display, + const char *opt_ttyname, + const char *opt_ttytype, + const char *opt_lc_ctype, + const char *opt_lc_messages) +{ + gpg_error_t err = 0; + char *dft_display = NULL; + char *dft_ttyname = NULL; + char *dft_ttytype = NULL; + char *old_lc = NULL; + char *dft_lc = NULL; + + /* Send the DISPLAY variable. */ + dft_display = getenv ("DISPLAY"); + if (opt_display || dft_display) + { + err = send_one_option (ctx, errsource, "display", + opt_display ? opt_display : dft_display); + if (err) + return err; + } + + /* Send the name of the TTY. */ + if (!opt_ttyname) + { + dft_ttyname = getenv ("GPG_TTY"); + if ((!dft_ttyname || !*dft_ttyname) && ttyname (0)) + dft_ttyname = ttyname (0); + } + if (opt_ttyname || dft_ttyname) + { + err = send_one_option (ctx, errsource, "ttyname", + opt_ttyname ? opt_ttyname : dft_ttyname); + if (err) + return err; + } + + /* Send the type of the TTY. */ + dft_ttytype = getenv ("TERM"); + if (opt_ttytype || (dft_ttyname && dft_ttytype)) + { + err = send_one_option (ctx, errsource, "ttytype", + opt_ttyname ? opt_ttytype : dft_ttytype); + if (err) + return err; + } + + /* Send the value for LC_CTYPE. */ +#if defined(HAVE_SETLOCALE) && defined(LC_CTYPE) + old_lc = setlocale (LC_CTYPE, NULL); + if (old_lc) + { + old_lc = strdup (old_lc); + if (!old_lc) + return gpg_error_from_errno (errno); + } + dft_lc = setlocale (LC_CTYPE, ""); +#endif + if (opt_lc_ctype || (dft_ttyname && dft_lc)) + { + err = send_one_option (ctx, errsource, "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); + free (old_lc); + } +#endif + if (err) + return err; + + /* Send the value for LC_MESSAGES. */ +#if defined(HAVE_SETLOCALE) && defined(LC_MESSAGES) + old_lc = setlocale (LC_MESSAGES, NULL); + if (old_lc) + { + old_lc = strdup (old_lc); + if (!old_lc) + return gpg_error_from_errno (errno); + } + dft_lc = setlocale (LC_MESSAGES, ""); +#endif + if (opt_lc_messages || (dft_ttyname && dft_lc)) + { + err = send_one_option (ctx, errsource, "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); + free (old_lc); + } +#endif + if (err) + return err; + + return 0; +} + diff --git a/common/asshelp.h b/common/asshelp.h new file mode 100644 index 000000000..9f4b5806b --- /dev/null +++ b/common/asshelp.h @@ -0,0 +1,38 @@ +/* asshelp.h - Helper functions for Assuan + * 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 GNUPG_COMMON_ASSHELP_H +#define GNUPG_COMMON_ASSHELP_H + +#include +#include + +gpg_error_t +send_pinentry_environment (assuan_context_t ctx, + gpg_err_source_t errsource, + const char *opt_display, + const char *opt_ttyname, + const char *opt_ttytype, + const char *opt_lc_ctype, + const char *opt_lc_messages); + + +#endif /*GNUPG_COMMON_ASSHELP_H*/ diff --git a/common/b64enc.c b/common/b64enc.c new file mode 100644 index 000000000..bfc49deb6 --- /dev/null +++ b/common/b64enc.c @@ -0,0 +1,214 @@ +/* b64enc.c - Simple Base64 encoder. + * Copyright (C) 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 +#include +#include +#include +#include +#include + +#include "i18n.h" +#include "util.h" + +#define B64ENC_DID_HEADER 1 +#define B64ENC_DID_TRAILER 2 +#define B64ENC_NO_LINEFEEDS 16 + + +/* The base-64 character list */ +static unsigned char bintoasc[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789+/"; + +/* Prepare for base-64 writing to the stream FP. If TITLE is not NULL + and not an empty string, this string will be used as the title for + the armor lines, with TITLE being an empty string, we don't write + the header lines and furthermore even don't write any linefeeds. + With TITLE beeing NULL, we merely don't write header but make sure + that lines are not too long. Note, that we don't write any output + unless at least one byte get written using b64enc_write. */ +gpg_error_t +b64enc_start (struct b64state *state, FILE *fp, const char *title) +{ + memset (state, 0, sizeof *state); + state->fp = fp; + if (title && !*title) + state->flags |= B64ENC_NO_LINEFEEDS; + else if (title) + { + state->title = xtrystrdup (title); + if (!state->title) + return gpg_error_from_errno (errno); + } + return 0; +} + + +/* Write NBYTES from BUFFER to the Base 64 stream identified by + STATE. With BUFFER and NBYTES being 0, merely do a fflush on the + stream. */ +gpg_error_t +b64enc_write (struct b64state *state, const void *buffer, size_t nbytes) +{ + unsigned char radbuf[4]; + int idx, quad_count; + const unsigned char *p; + FILE *fp = state->fp; + + + if (!nbytes) + { + if (buffer && fflush (fp)) + goto write_error; + return 0; + } + + if (!(state->flags & B64ENC_DID_HEADER)) + { + if (state->title) + { + if ( fputs ("-----BEGIN ", fp) == EOF + || fputs (state->title, fp) == EOF + || fputs ("-----\n", fp) == EOF) + goto write_error; + } + state->flags |= B64ENC_DID_HEADER; + } + + idx = state->idx; + quad_count = state->quad_count; + assert (idx < 4); + memcpy (radbuf, state->radbuf, idx); + + for (p=buffer; nbytes; p++, nbytes--) + { + radbuf[idx++] = *p; + if (idx > 2) + { + char tmp[4]; + + tmp[0] = bintoasc[(*radbuf >> 2) & 077]; + tmp[1] = bintoasc[(((*radbuf<<4)&060)|((radbuf[1] >> 4)&017))&077]; + tmp[2] = bintoasc[(((radbuf[1]<<2)&074)|((radbuf[2]>>6)&03))&077]; + tmp[3] = bintoasc[radbuf[2]&077]; + for (idx=0; idx < 4; idx++) + putc (tmp[idx], fp); + idx = 0; + if (ferror (fp)) + goto write_error; + if (++quad_count >= (64/4)) + { + quad_count = 0; + if (!(state->flags & B64ENC_NO_LINEFEEDS) + && fputs ("\n", fp) == EOF) + goto write_error; + } + } + } + memcpy (state->radbuf, radbuf, idx); + state->idx = idx; + state->quad_count = quad_count; + return 0; + + write_error: + return gpg_error_from_errno (errno); +} + +gpg_error_t +b64enc_finish (struct b64state *state) +{ + gpg_error_t err = 0; + unsigned char radbuf[4]; + int idx, quad_count; + FILE *fp; + + if (!(state->flags & B64ENC_DID_HEADER)) + goto cleanup; + + /* Flush the base64 encoding */ + fp = state->fp; + idx = state->idx; + quad_count = state->quad_count; + assert (idx < 4); + memcpy (radbuf, state->radbuf, idx); + + if (idx) + { + char tmp[4]; + + tmp[0] = bintoasc[(*radbuf>>2)&077]; + if (idx == 1) + { + tmp[1] = bintoasc[((*radbuf << 4) & 060) & 077]; + tmp[2] = '='; + tmp[3] = '='; + } + else + { + tmp[1] = bintoasc[(((*radbuf<<4)&060)|((radbuf[1]>>4)&017))&077]; + tmp[2] = bintoasc[((radbuf[1] << 2) & 074) & 077]; + tmp[3] = '='; + } + for (idx=0; idx < 4; idx++) + putc (tmp[idx], fp); + idx = 0; + if (ferror (fp)) + goto write_error; + + if (++quad_count >= (64/4)) + { + quad_count = 0; + if (!(state->flags & B64ENC_NO_LINEFEEDS) + && fputs ("\n", fp) == EOF) + goto write_error; + } + } + + /* Finish the last line and write the trailer. */ + if (quad_count + && !(state->flags & B64ENC_NO_LINEFEEDS) + && fputs ("\n", fp) == EOF) + goto write_error; + + if (state->title) + { + if ( fputs ("-----END ", fp) == EOF + || fputs (state->title, fp) == EOF + || fputs ("-----\n", fp) == EOF) + goto write_error; + } + + goto cleanup; + + write_error: + err = gpg_error_from_errno (errno); + + cleanup: + if (state->title) + { + xfree (state->title); + state->title = NULL; + } + state->fp = NULL; + return err; +} + diff --git a/util/cert.c b/common/dns-cert.c similarity index 91% rename from util/cert.c rename to common/dns-cert.c index 1b3390b80..8dfcb9724 100644 --- a/util/cert.c +++ b/common/dns-cert.c @@ -1,4 +1,4 @@ -/* cert.c - DNS CERT code +/* dns-cert.c - DNS CERT code * Copyright (C) 2005, 2006 Free Software Foundation, Inc. * * This file is part of GNUPG. @@ -22,18 +22,19 @@ #include #include #ifdef USE_DNS_CERT -#ifdef _WIN32 -#include -#else -#include -#include -#include -#endif +# ifdef HAVE_W32_SYSTEM +# include +# else +# include +# include +# include +# endif #include -#include "memory.h" #endif -#include "iobuf.h" + #include "util.h" +#include "iobuf.h" +#include "dns-cert.h" /* Not every installation has gotten around to supporting CERTs yet... */ @@ -41,14 +42,14 @@ #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) +get_dns_cert (const char *name,size_t max_size,IOBUF *iobuf, + unsigned char **fpr,size_t *fpr_len,char **url) { +#ifdef USE_DNS_CERT unsigned char *answer; int r,ret=-1; u16 count; @@ -181,18 +182,12 @@ get_cert(const char *name,size_t max_size,IOBUF *iobuf, 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 } -#endif + /* Test with simon.josefsson.org */ @@ -214,7 +209,7 @@ main(int argc,char *argv[]) printf("CERT lookup on %s\n",argv[1]); - rc=get_cert(argv[1],16384,&iobuf,&fpr,&fpr_len,&url); + rc=get_dns_cert (argv[1],16384,&iobuf,&fpr,&fpr_len,&url); if(rc==-1) printf("error\n"); else if(rc==0) diff --git a/common/dns-cert.h b/common/dns-cert.h new file mode 100644 index 000000000..47e0d5a2d --- /dev/null +++ b/common/dns-cert.h @@ -0,0 +1,28 @@ +/* dns-cert.h - DNS CERT definition + * 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. + */ +#ifndef GNUPG_COMMON_DNS_CERT_H +#define GNUPG_COMMON_DNS_CERT_H + +int get_dns_cert (const char *name, size_t max_size, IOBUF *iobuf, + unsigned char **fpr, size_t *fpr_len, char **url); + + +#endif /*GNUPG_COMMON_DNS_CERT_H*/ diff --git a/include/dynload.h b/common/dynload.h similarity index 81% rename from include/dynload.h rename to common/dynload.h index acdf5c879..9b67fa9ed 100644 --- a/include/dynload.h +++ b/common/dynload.h @@ -21,23 +21,22 @@ #ifndef GNUPG_DYNLOAD_H #define GNUPG_DYNLOAD_H -#if defined (ENABLE_CARD_SUPPORT) || defined(_WIN32) -#ifndef _WIN32 +#ifndef __MINGW32__ #include #else #include #define RTLD_LAZY 0 -static __inline__ void * +static inline void * dlopen (const char * name, int flag) { void * hd = LoadLibrary (name); return hd; } -static __inline__ void * -dlsym (void * hd, const char * sym) +static inline void * +dlsym (void *hd, const char *sym) { if (hd && sym) { @@ -50,23 +49,24 @@ dlsym (void * hd, const char * sym) } -static __inline__ const char * +static inline const char * dlerror (void) { - return w32_strerror (0); + static char buf[32]; + sprintf (buf, "ec=%lu", GetLastError ()); + return buf; } -static __inline__ int +static inline int dlclose (void * hd) { if (hd) { - FreeLibrary (hd); + CloseHandle (hd); return 0; } return -1; } -#endif /*_WIN32*/ -#endif /*ENABLE_CARD_SUPPORT||_WIN32*/ +#endif /*__MINGW32__*/ #endif /*GNUPG_DYNLOAD_H*/ diff --git a/common/errors.h b/common/errors.h new file mode 100644 index 000000000..131891f65 --- /dev/null +++ b/common/errors.h @@ -0,0 +1,113 @@ +/* errors.h - Globally used error codes + * 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 GNUPG_COMMON_ERRORS_H +#define GNUPG_COMMON_ERRORS_H + +#include "util.h" + +/* Status codes - fixme: should go into another file */ +enum { + STATUS_ENTER, + STATUS_LEAVE, + STATUS_ABORT, + STATUS_GOODSIG, + STATUS_BADSIG, + STATUS_ERRSIG, + STATUS_BADARMOR, + STATUS_RSA_OR_IDEA, + STATUS_SIGEXPIRED, + STATUS_KEYREVOKED, + STATUS_TRUST_UNDEFINED, + STATUS_TRUST_NEVER, + STATUS_TRUST_MARGINAL, + STATUS_TRUST_FULLY, + STATUS_TRUST_ULTIMATE, + + STATUS_SHM_INFO, + STATUS_SHM_GET, + STATUS_SHM_GET_BOOL, + STATUS_SHM_GET_HIDDEN, + + STATUS_NEED_PASSPHRASE, + STATUS_VALIDSIG, + STATUS_SIG_ID, + STATUS_ENC_TO, + STATUS_NODATA, + STATUS_BAD_PASSPHRASE, + STATUS_NO_PUBKEY, + STATUS_NO_SECKEY, + STATUS_NEED_PASSPHRASE_SYM, + STATUS_DECRYPTION_FAILED, + STATUS_DECRYPTION_OKAY, + STATUS_MISSING_PASSPHRASE, + STATUS_GOOD_PASSPHRASE, + STATUS_GOODMDC, + STATUS_BADMDC, + STATUS_ERRMDC, + STATUS_IMPORTED, + STATUS_IMPORT_OK, + STATUS_IMPORT_PROBLEM, + STATUS_IMPORT_RES, + STATUS_FILE_START, + STATUS_FILE_DONE, + STATUS_FILE_ERROR, + + STATUS_BEGIN_DECRYPTION, + STATUS_END_DECRYPTION, + STATUS_BEGIN_ENCRYPTION, + STATUS_END_ENCRYPTION, + + STATUS_DELETE_PROBLEM, + STATUS_GET_BOOL, + STATUS_GET_LINE, + STATUS_GET_HIDDEN, + STATUS_GOT_IT, + STATUS_PROGRESS, + STATUS_SIG_CREATED, + STATUS_SESSION_KEY, + STATUS_NOTATION_NAME, + STATUS_NOTATION_DATA, + STATUS_POLICY_URL, + STATUS_BEGIN_STREAM, + STATUS_END_STREAM, + STATUS_KEY_CREATED, + STATUS_USERID_HIN, + STATUS_UNEXPECTED, + STATUS_INV_RECP, + STATUS_NO_RECP, + STATUS_ALREADY_SIGNED, + + STATUS_EXPSIG, + STATUS_EXPKEYSIG, + + STATUS_TRUNCATED, + STATUS_ERROR, + STATUS_NEWSIG +}; + + +/*-- errors.c (build by mkerror and mkerrtok) --*/ +const char *gnupg_strerror (int err); +const char *gnupg_error_token (int err); + + +#endif /*GNUPG_COMMON_ERRORS_H*/ diff --git a/common/estream.c b/common/estream.c new file mode 100644 index 000000000..c2030371b --- /dev/null +++ b/common/estream.c @@ -0,0 +1,2615 @@ +/* estream.c - Extended stream I/O/ Library + * Copyright (C) 2004 g10 Code GmbH + * + * This file is part of Libestream. + * + * Libestream is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation; either version 2 of the License, + * or (at your option) any later version. + * + * Libestream is distributed in the hope that 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 General Public License + * along with Libestream; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + */ + +#ifdef USE_ESTREAM_SUPPORT_H +# include +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_PTH +# include +#endif + +#ifndef HAVE_MKSTEMP +int mkstemp (char *template); +#endif + +#ifndef HAVE_MEMRCHR +void *memrchr (const void *block, int c, size_t size); +#endif + +#include + + + +/* Generally used types. */ + +typedef void *(*func_realloc_t) (void *mem, size_t size); +typedef void (*func_free_t) (void *mem); + + + +/* Buffer management layer. */ + +#define BUFFER_BLOCK_SIZE BUFSIZ +#define BUFFER_UNREAD_SIZE 16 + + + +/* Macros. */ + +#define BUFFER_ROUND_TO_BLOCK(size, block_size) \ + (((size) + (block_size - 1)) / block_size) + + + +/* Locking. */ + +#ifdef HAVE_PTH + +typedef pth_mutex_t estream_mutex_t; +# define ESTREAM_MUTEX_INITIALIZER PTH_MUTEX_INIT +# define ESTREAM_MUTEX_LOCK(mutex) \ + pth_mutex_acquire (&(mutex), 0, NULL) +# define ESTREAM_MUTEX_UNLOCK(mutex) \ + pth_mutex_release (&(mutex)) +# define ESTREAM_MUTEX_TRYLOCK(mutex) \ + ((pth_mutex_acquire (&(mutex), 1, NULL) == TRUE) ? 0 : -1) +# define ESTREAM_MUTEX_INITIALIZE(mutex) \ + pth_mutex_init (&(mutex)) +# define ESTREAM_THREADING_INIT() ((pth_init () == TRUE) ? 0 : -1) + +#else + +typedef void *estream_mutex_t; +# define ESTREAM_MUTEX_INITIALIZER NULL +# define ESTREAM_MUTEX_LOCK(mutex) (void) 0 +# define ESTREAM_MUTEX_UNLOCK(mutex) (void) 0 +# define ESTREAM_MUTEX_TRYLOCK(mutex) 0 +# define ESTREAM_MUTEX_INITIALIZE(mutex) (void) 0 +# define ESTREAM_THREADING_INIT() 0 + +#endif + +/* Memory allocator functions. */ + +#define MEM_ALLOC malloc +#define MEM_REALLOC realloc +#define MEM_FREE free + +/* Primitive system I/O. */ + +#ifdef HAVE_PTH +# define ESTREAM_SYS_READ pth_read +# define ESTREAM_SYS_WRITE pth_write +#else +# define ESTREAM_SYS_READ read +# define ESTREAM_SYS_WRITE write +#endif + +/* Misc definitions. */ + +#define ES_DEFAULT_OPEN_MODE (S_IRUSR | S_IWUSR) + +#define ES_FLAG_WRITING ES__FLAG_WRITING + +/* An internal stream object. */ + +struct estream_internal +{ + unsigned char buffer[BUFFER_BLOCK_SIZE]; + unsigned char unread_buffer[BUFFER_UNREAD_SIZE]; + estream_mutex_t lock; /* Lock. */ + void *cookie; /* Cookie. */ + void *opaque; /* Opaque data. */ + unsigned int flags; /* Flags. */ + off_t offset; + es_cookie_read_function_t func_read; + es_cookie_write_function_t func_write; + es_cookie_seek_function_t func_seek; + es_cookie_close_function_t func_close; + int strategy; + int fd; + struct + { + unsigned int err: 1; + unsigned int eof: 1; + } indicators; + unsigned int deallocate_buffer: 1; +}; + +typedef struct estream_internal *estream_internal_t; + +#define ESTREAM_LOCK(stream) ESTREAM_MUTEX_LOCK (stream->intern->lock) +#define ESTREAM_UNLOCK(stream) ESTREAM_MUTEX_UNLOCK (stream->intern->lock) +#define ESTREAM_TRYLOCK(stream) ESTREAM_MUTEX_TRYLOCK (stream->intern->lock) + +/* Stream list. */ + +typedef struct estream_list *estream_list_t; + +struct estream_list +{ + estream_t car; + estream_list_t cdr; + estream_list_t *prev_cdr; +}; + +static estream_list_t estream_list; +#ifdef HAVE_PTH +static estream_mutex_t estream_list_lock = ESTREAM_MUTEX_INITIALIZER; +#endif + +#define ESTREAM_LIST_LOCK ESTREAM_MUTEX_LOCK (estream_list_lock) +#define ESTREAM_LIST_UNLOCK ESTREAM_MUTEX_UNLOCK (estream_list_lock) + +#ifndef EOPNOTSUPP +# define EOPNOTSUPP ENOSYS +#endif + + + + +/* Macros. */ + +/* Calculate array dimension. */ +#define DIM(array) (sizeof (array) / sizeof (*array)) + +/* Evaluate EXPRESSION, setting VARIABLE to the return code, if + VARIABLE is zero. */ +#define SET_UNLESS_NONZERO(variable, tmp_variable, expression) \ + do \ + { \ + tmp_variable = expression; \ + if ((! variable) && tmp_variable) \ + variable = tmp_variable; \ + } \ + while (0) + +/* + * List manipulation. + */ + +/* Add STREAM to the list of registered stream objects. */ +static int +es_list_add (estream_t stream) +{ + estream_list_t list_obj; + int ret; + + list_obj = MEM_ALLOC (sizeof (*list_obj)); + if (! list_obj) + ret = -1; + else + { + ESTREAM_LIST_LOCK; + list_obj->car = stream; + list_obj->cdr = estream_list; + list_obj->prev_cdr = &estream_list; + if (estream_list) + estream_list->prev_cdr = &list_obj->cdr; + estream_list = list_obj; + ESTREAM_LIST_UNLOCK; + ret = 0; + } + + return ret; +} + +/* Remove STREAM from the list of registered stream objects. */ +static void +es_list_remove (estream_t stream) +{ + estream_list_t list_obj; + + ESTREAM_LIST_LOCK; + for (list_obj = estream_list; list_obj; list_obj = list_obj->cdr) + if (list_obj->car == stream) + { + *list_obj->prev_cdr = list_obj->cdr; + if (list_obj->cdr) + list_obj->cdr->prev_cdr = list_obj->prev_cdr; + MEM_FREE (list_obj); + break; + } + ESTREAM_LIST_UNLOCK; +} + +/* Type of an stream-iterator-function. */ +typedef int (*estream_iterator_t) (estream_t stream); + +/* Iterate over list of registered streams, calling ITERATOR for each + of them. */ +static int +es_list_iterate (estream_iterator_t iterator) +{ + estream_list_t list_obj; + int ret = 0; + + ESTREAM_LIST_LOCK; + for (list_obj = estream_list; list_obj; list_obj = list_obj->cdr) + ret |= (*iterator) (list_obj->car); + ESTREAM_LIST_UNLOCK; + + return ret; +} + + + +/* + * Initialization. + */ + +static int +es_init_do (void) +{ + int err; + + err = ESTREAM_THREADING_INIT (); + + return err; +} + + + +/* + * I/O methods. + */ + +/* Implementation of Memory I/O. */ + +/* Cookie for memory objects. */ +typedef struct estream_cookie_mem +{ + unsigned int flags; /* Open flags. */ + unsigned char *memory; /* Data. */ + size_t memory_size; /* Size of MEMORY. */ + size_t offset; /* Current offset in MEMORY. */ + size_t data_len; /* Length of data in MEMORY. */ + size_t block_size; /* Block size. */ + unsigned int grow: 1; /* MEMORY is allowed to grow. */ + unsigned int append_zero: 1; /* Append zero after data. */ + unsigned int dont_free: 1; /* Append zero after data. */ + char **ptr; + size_t *size; + func_realloc_t func_realloc; + func_free_t func_free; +} *estream_cookie_mem_t; + +/* Create function for memory objects. */ +static int +es_func_mem_create (void *ES__RESTRICT *ES__RESTRICT cookie, + unsigned char *ES__RESTRICT data, size_t data_n, + size_t data_len, + size_t block_size, unsigned int grow, + unsigned int append_zero, unsigned int dont_free, + char **ptr, size_t *size, + func_realloc_t func_realloc, func_free_t func_free, + unsigned int flags) +{ + estream_cookie_mem_t mem_cookie; + int err; + + mem_cookie = MEM_ALLOC (sizeof (*mem_cookie)); + if (! mem_cookie) + err = -1; + else + { + mem_cookie->flags = flags; + mem_cookie->memory = data; + mem_cookie->memory_size = data_n; + mem_cookie->offset = 0; + mem_cookie->data_len = data_len; + mem_cookie->block_size = block_size; + mem_cookie->grow = grow ? 1 : 0; + mem_cookie->append_zero = append_zero ? 1 : 0; + mem_cookie->dont_free = dont_free ? 1 : 0; + mem_cookie->ptr = ptr; + mem_cookie->size = size; + mem_cookie->func_realloc = func_realloc ? func_realloc : MEM_REALLOC; + mem_cookie->func_free = func_free ? func_free : MEM_FREE; + mem_cookie->offset = 0; + *cookie = mem_cookie; + err = 0; + } + + return err; +} + +/* Read function for memory objects. */ +static ssize_t +es_func_mem_read (void *cookie, void *buffer, size_t size) +{ + estream_cookie_mem_t mem_cookie = cookie; + ssize_t ret; + + if (size > mem_cookie->data_len - mem_cookie->offset) + size = mem_cookie->data_len - mem_cookie->offset; + + if (size) + { + memcpy (buffer, mem_cookie->memory + mem_cookie->offset, size); + mem_cookie->offset += size; + } + + ret = size; + + return ret; +} + +/* Write function for memory objects. */ +static ssize_t +es_func_mem_write (void *cookie, const void *buffer, size_t size) +{ + estream_cookie_mem_t mem_cookie = cookie; + func_realloc_t func_realloc = mem_cookie->func_realloc; + unsigned char *memory_new; + size_t newsize; + ssize_t ret; + int err; + + if (size) + { + /* Regular write. */ + + if (mem_cookie->flags & O_APPEND) + /* Append to data. */ + mem_cookie->offset = mem_cookie->data_len; + + if (! mem_cookie->grow) + if (size > mem_cookie->memory_size - mem_cookie->offset) + size = mem_cookie->memory_size - mem_cookie->offset; + + err = 0; + + while (size > (mem_cookie->memory_size - mem_cookie->offset)) + { + memory_new = (*func_realloc) (mem_cookie->memory, + mem_cookie->memory_size + + mem_cookie->block_size); + if (! memory_new) + { + err = -1; + break; + } + else + { + if (mem_cookie->memory != memory_new) + mem_cookie->memory = memory_new; + mem_cookie->memory_size += mem_cookie->block_size; + } + } + if (err) + goto out; + + if (size) + { + memcpy (mem_cookie->memory + mem_cookie->offset, buffer, size); + if (mem_cookie->offset + size > mem_cookie->data_len) + mem_cookie->data_len = mem_cookie->offset + size; + mem_cookie->offset += size; + } + } + else + { + /* Flush. */ + + err = 0; + if (mem_cookie->append_zero) + { + if (mem_cookie->data_len >= mem_cookie->memory_size) + { + newsize = BUFFER_ROUND_TO_BLOCK (mem_cookie->data_len + 1, + mem_cookie->block_size) + * mem_cookie->block_size; + + memory_new = (*func_realloc) (mem_cookie->memory, newsize); + if (! memory_new) + { + err = -1; + goto out; + } + + if (mem_cookie->memory != memory_new) + mem_cookie->memory = memory_new; + mem_cookie->memory_size = newsize; + } + + mem_cookie->memory[mem_cookie->data_len + 1] = 0; + } + + /* Return information to user if necessary. */ + if (mem_cookie->ptr) + *mem_cookie->ptr = (char *) mem_cookie->memory; + if (mem_cookie->size) + *mem_cookie->size = mem_cookie->data_len; + } + + out: + + if (err) + ret = -1; + else + ret = size; + + return ret; +} + +/* Seek function for memory objects. */ +static int +es_func_mem_seek (void *cookie, off_t *offset, int whence) +{ + estream_cookie_mem_t mem_cookie = cookie; + off_t pos_new; + int err = 0; + + switch (whence) + { + case SEEK_SET: + pos_new = *offset; + break; + + case SEEK_CUR: + pos_new = mem_cookie->offset += *offset; + break; + + case SEEK_END: + pos_new = mem_cookie->data_len += *offset; + break; + + default: + /* Never reached. */ + pos_new = 0; + } + + if (pos_new > mem_cookie->memory_size) + { + /* Grow buffer if possible. */ + + if (mem_cookie->grow) + { + func_realloc_t func_realloc = mem_cookie->func_realloc; + size_t newsize; + void *p; + + newsize = BUFFER_ROUND_TO_BLOCK (pos_new, mem_cookie->block_size); + p = (*func_realloc) (mem_cookie->memory, newsize); + if (! p) + { + err = -1; + goto out; + } + else + { + if (mem_cookie->memory != p) + mem_cookie->memory = p; + mem_cookie->memory_size = newsize; + } + } + else + { + errno = EINVAL; + err = -1; + goto out; + } + } + + if (pos_new > mem_cookie->data_len) + /* Fill spare space with zeroes. */ + memset (mem_cookie->memory + mem_cookie->data_len, + 0, pos_new - mem_cookie->data_len); + + mem_cookie->offset = pos_new; + *offset = pos_new; + + out: + + return err; +} + +/* Destroy function for memory objects. */ +static int +es_func_mem_destroy (void *cookie) +{ + estream_cookie_mem_t mem_cookie = cookie; + func_free_t func_free = mem_cookie->func_free; + + if (! mem_cookie->dont_free) + (*func_free) (mem_cookie->memory); + MEM_FREE (mem_cookie); + + return 0; +} + +static es_cookie_io_functions_t estream_functions_mem = + { + es_func_mem_read, + es_func_mem_write, + es_func_mem_seek, + es_func_mem_destroy, + }; + +/* Implementation of fd I/O. */ + +/* Cookie for fd objects. */ +typedef struct estream_cookie_fd +{ + int fd; +} *estream_cookie_fd_t; + +/* Create function for fd objects. */ +static int +es_func_fd_create (void **cookie, int fd, unsigned int flags) +{ + estream_cookie_fd_t fd_cookie; + int err; + + fd_cookie = MEM_ALLOC (sizeof (*fd_cookie)); + if (! fd_cookie) + err = -1; + else + { + fd_cookie->fd = fd; + *cookie = fd_cookie; + err = 0; + } + + return err; +} + +/* Read function for fd objects. */ +static ssize_t +es_func_fd_read (void *cookie, void *buffer, size_t size) + +{ + estream_cookie_fd_t file_cookie = cookie; + ssize_t bytes_read; + + do + bytes_read = ESTREAM_SYS_READ (file_cookie->fd, buffer, size); + while (bytes_read == -1 && errno == EINTR); + + return bytes_read; +} + +/* Write function for fd objects. */ +static ssize_t +es_func_fd_write (void *cookie, const void *buffer, size_t size) + +{ + estream_cookie_fd_t file_cookie = cookie; + ssize_t bytes_written; + + do + bytes_written = ESTREAM_SYS_WRITE (file_cookie->fd, buffer, size); + while (bytes_written == -1 && errno == EINTR); + + return bytes_written; +} + +/* Seek function for fd objects. */ +static int +es_func_fd_seek (void *cookie, off_t *offset, int whence) +{ + estream_cookie_fd_t file_cookie = cookie; + off_t offset_new; + int err; + + offset_new = lseek (file_cookie->fd, *offset, whence); + if (offset_new == -1) + err = -1; + else + { + *offset = offset_new; + err = 0; + } + + return err; +} + +/* Destroy function for fd objects. */ +static int +es_func_fd_destroy (void *cookie) +{ + estream_cookie_fd_t fd_cookie = cookie; + int err; + + if (fd_cookie) + { + err = close (fd_cookie->fd); + MEM_FREE (fd_cookie); + } + else + err = 0; + + return err; +} + +static es_cookie_io_functions_t estream_functions_fd = + { + es_func_fd_read, + es_func_fd_write, + es_func_fd_seek, + es_func_fd_destroy + }; + +/* Implementation of file I/O. */ + +/* Create function for file objects. */ +static int +es_func_file_create (void **cookie, int *filedes, + const char *path, unsigned int flags) +{ + estream_cookie_fd_t file_cookie; + int err; + int fd; + + err = 0; + fd = -1; + + file_cookie = MEM_ALLOC (sizeof (*file_cookie)); + if (! file_cookie) + { + err = -1; + goto out; + } + + fd = open (path, flags, ES_DEFAULT_OPEN_MODE); + if (fd == -1) + { + err = -1; + goto out; + } + + file_cookie->fd = fd; + *cookie = file_cookie; + *filedes = fd; + + out: + + if (err) + MEM_FREE (file_cookie); + + return err; +} + +static es_cookie_io_functions_t estream_functions_file = + { + es_func_fd_read, + es_func_fd_write, + es_func_fd_seek, + es_func_fd_destroy + }; + + + +/* Stream primitives. */ + +static int +es_convert_mode (const char *mode, unsigned int *flags) +{ + struct + { + const char *mode; + unsigned int flags; + } mode_flags[] = { { "r", + O_RDONLY }, + { "rb", + O_RDONLY }, + { "w", + O_WRONLY | O_TRUNC | O_CREAT }, + { "wb", + O_WRONLY | O_TRUNC | O_CREAT }, + { "a", + O_WRONLY | O_APPEND | O_CREAT }, + { "ab", + O_WRONLY | O_APPEND | O_CREAT }, + { "r+", + O_RDWR }, + { "rb+", + O_RDWR }, + { "r+b", + O_RDONLY | O_WRONLY }, + { "w+", + O_RDWR | O_TRUNC | O_CREAT }, + { "wb+", + O_RDWR | O_TRUNC | O_CREAT }, + { "w+b", + O_RDWR | O_TRUNC | O_CREAT }, + { "a+", + O_RDWR | O_CREAT | O_APPEND }, + { "ab+", + O_RDWR | O_CREAT | O_APPEND }, + { "a+b", + O_RDWR | O_CREAT | O_APPEND } }; + unsigned int i; + int err; + + for (i = 0; i < DIM (mode_flags); i++) + if (! strcmp (mode_flags[i].mode, mode)) + break; + if (i == DIM (mode_flags)) + { + errno = EINVAL; + err = -1; + } + else + { + err = 0; + *flags = mode_flags[i].flags; + } + + return err; +} + + + +/* + * Low level stream functionality. + */ + +static int +es_fill (estream_t stream) +{ + size_t bytes_read = 0; + int err; + + if (!stream->intern->func_read) + { + errno = EOPNOTSUPP; + err = -1; + } + else + { + es_cookie_read_function_t func_read = stream->intern->func_read; + ssize_t ret; + + ret = (*func_read) (stream->intern->cookie, + stream->buffer, stream->buffer_size); + if (ret == -1) + { + bytes_read = 0; + err = -1; + } + else + { + bytes_read = ret; + err = 0; + } + } + + if (err) + stream->intern->indicators.err = 1; + else if (!bytes_read) + stream->intern->indicators.eof = 1; + + stream->intern->offset += stream->data_len; + stream->data_len = bytes_read; + stream->data_offset = 0; + + return err; +} + +static int +es_flush (estream_t stream) +{ + es_cookie_write_function_t func_write = stream->intern->func_write; + int err; + + assert (stream->flags & ES_FLAG_WRITING); + + if (stream->data_offset) + { + size_t bytes_written; + size_t data_flushed; + ssize_t ret; + + if (! func_write) + { + err = EOPNOTSUPP; + goto out; + } + + /* Note: to prevent an endless loop caused by user-provided + write-functions that pretend to have written more bytes than + they were asked to write, we have to check for + "(stream->data_offset - data_flushed) > 0" instead of + "stream->data_offset - data_flushed". */ + + data_flushed = 0; + err = 0; + + while ((((ssize_t) (stream->data_offset - data_flushed)) > 0) && (! err)) + { + ret = (*func_write) (stream->intern->cookie, + stream->buffer + data_flushed, + stream->data_offset - data_flushed); + if (ret == -1) + { + bytes_written = 0; + err = -1; + } + else + bytes_written = ret; + + data_flushed += bytes_written; + if (err) + break; + } + + stream->data_flushed += data_flushed; + if (stream->data_offset == data_flushed) + { + stream->intern->offset += stream->data_offset; + stream->data_offset = 0; + stream->data_flushed = 0; + + /* Propagate flush event. */ + (*func_write) (stream->intern->cookie, NULL, 0); + } + } + else + err = 0; + + out: + + if (err) + stream->intern->indicators.err = 1; + + return err; +} + +/* Discard buffered data for STREAM. */ +static void +es_empty (estream_t stream) +{ + assert (! (stream->flags & ES_FLAG_WRITING)); + stream->data_len = 0; + stream->data_offset = 0; + stream->unread_data_len = 0; +} + +/* Initialize STREAM. */ +static void +es_initialize (estream_t stream, + void *cookie, int fd, es_cookie_io_functions_t functions) +{ + stream->intern->cookie = cookie; + stream->intern->opaque = NULL; + stream->intern->offset = 0; + stream->intern->func_read = functions.func_read; + stream->intern->func_write = functions.func_write; + stream->intern->func_seek = functions.func_seek; + stream->intern->func_close = functions.func_close; + stream->intern->strategy = _IOFBF; + stream->intern->fd = fd; + stream->intern->indicators.err = 0; + stream->intern->indicators.eof = 0; + stream->intern->deallocate_buffer = 0; + + stream->data_len = 0; + stream->data_offset = 0; + stream->data_flushed = 0; + stream->unread_data_len = 0; + stream->flags = 0; +} + +/* Deinitialize STREAM. */ +static int +es_deinitialize (estream_t stream) +{ + es_cookie_close_function_t func_close; + int err, tmp_err; + + func_close = stream->intern->func_close; + + err = 0; + if (stream->flags & ES_FLAG_WRITING) + SET_UNLESS_NONZERO (err, tmp_err, es_flush (stream)); + if (func_close) + SET_UNLESS_NONZERO (err, tmp_err, (*func_close) (stream->intern->cookie)); + + return err; +} + +/* Create a new stream object, initialize it. */ +static int +es_create (estream_t *stream, void *cookie, int fd, + es_cookie_io_functions_t functions) +{ + estream_internal_t stream_internal_new; + estream_t stream_new; + int err; + + stream_new = NULL; + stream_internal_new = NULL; + + stream_new = MEM_ALLOC (sizeof (*stream_new)); + if (! stream_new) + { + err = -1; + goto out; + } + + stream_internal_new = MEM_ALLOC (sizeof (*stream_internal_new)); + if (! stream_internal_new) + { + err = -1; + goto out; + } + + stream_new->buffer = stream_internal_new->buffer; + stream_new->buffer_size = sizeof (stream_internal_new->buffer); + stream_new->unread_buffer = stream_internal_new->unread_buffer; + stream_new->unread_buffer_size = sizeof (stream_internal_new->unread_buffer); + stream_new->intern = stream_internal_new; + + ESTREAM_MUTEX_INITIALIZE (stream_new->intern->lock); + es_initialize (stream_new, cookie, fd, functions); + + err = es_list_add (stream_new); + if (err) + goto out; + + *stream = stream_new; + + out: + + if (err) + { + if (stream_new) + { + es_deinitialize (stream_new); + MEM_FREE (stream_new); + } + } + + return err; +} + +/* Deinitialize a stream object and destroy it. */ +static int +es_destroy (estream_t stream) +{ + int err = 0; + + if (stream) + { + es_list_remove (stream); + err = es_deinitialize (stream); + MEM_FREE (stream->intern); + MEM_FREE (stream); + } + + return err; +} + +/* Try to read BYTES_TO_READ bytes FROM STREAM into BUFFER in + unbuffered-mode, storing the amount of bytes read in + *BYTES_READ. */ +static int +es_read_nbf (estream_t ES__RESTRICT stream, + unsigned char *ES__RESTRICT buffer, + size_t bytes_to_read, size_t *ES__RESTRICT bytes_read) +{ + es_cookie_read_function_t func_read = stream->intern->func_read; + size_t data_read; + ssize_t ret; + int err; + + data_read = 0; + err = 0; + + while (bytes_to_read - data_read) + { + ret = (*func_read) (stream->intern->cookie, + buffer + data_read, bytes_to_read - data_read); + if (ret == -1) + { + err = -1; + break; + } + else if (ret) + data_read += ret; + else + break; + } + + stream->intern->offset += data_read; + *bytes_read = data_read; + + return err; +} + +/* Try to read BYTES_TO_READ bytes FROM STREAM into BUFFER in + fully-buffered-mode, storing the amount of bytes read in + *BYTES_READ. */ +static int +es_read_fbf (estream_t ES__RESTRICT stream, + unsigned char *ES__RESTRICT buffer, + size_t bytes_to_read, size_t *ES__RESTRICT bytes_read) +{ + size_t data_available; + size_t data_to_read; + size_t data_read; + int err; + + data_read = 0; + err = 0; + + while ((bytes_to_read - data_read) && (! err)) + { + if (stream->data_offset == stream->data_len) + { + /* Nothing more to read in current container, try to + fill container with new data. */ + err = es_fill (stream); + if (! err) + if (! stream->data_len) + /* Filling did not result in any data read. */ + break; + } + + if (! err) + { + /* Filling resulted in some new data. */ + + data_to_read = bytes_to_read - data_read; + data_available = stream->data_len - stream->data_offset; + if (data_to_read > data_available) + data_to_read = data_available; + + memcpy (buffer + data_read, + stream->buffer + stream->data_offset, data_to_read); + stream->data_offset += data_to_read; + data_read += data_to_read; + } + } + + *bytes_read = data_read; + + return err; +} + +/* Try to read BYTES_TO_READ bytes FROM STREAM into BUFFER in + line-buffered-mode, storing the amount of bytes read in + *BYTES_READ. */ +static int +es_read_lbf (estream_t ES__RESTRICT stream, + unsigned char *ES__RESTRICT buffer, + size_t bytes_to_read, size_t *ES__RESTRICT bytes_read) +{ + int err; + + err = es_read_fbf (stream, buffer, bytes_to_read, bytes_read); + + return err; +} + +/* Try to read BYTES_TO_READ bytes FROM STREAM into BUFFER, storing + *the amount of bytes read in BYTES_READ. */ +static int +es_readn (estream_t ES__RESTRICT stream, + void *ES__RESTRICT buffer_arg, + size_t bytes_to_read, size_t *ES__RESTRICT bytes_read) +{ + unsigned char *buffer = (unsigned char *)buffer_arg; + size_t data_read_unread, data_read; + int err; + + data_read_unread = 0; + data_read = 0; + err = 0; + + if (stream->flags & ES_FLAG_WRITING) + { + /* Switching to reading mode -> flush output. */ + err = es_flush (stream); + if (err) + goto out; + stream->flags &= ~ES_FLAG_WRITING; + } + + /* Read unread data first. */ + while ((bytes_to_read - data_read_unread) && stream->unread_data_len) + { + buffer[data_read_unread] + = stream->unread_buffer[stream->unread_data_len - 1]; + stream->unread_data_len--; + data_read_unread++; + } + + switch (stream->intern->strategy) + { + case _IONBF: + err = es_read_nbf (stream, + buffer + data_read_unread, + bytes_to_read - data_read_unread, &data_read); + break; + case _IOLBF: + err = es_read_lbf (stream, + buffer + data_read_unread, + bytes_to_read - data_read_unread, &data_read); + break; + case _IOFBF: + err = es_read_fbf (stream, + buffer + data_read_unread, + bytes_to_read - data_read_unread, &data_read); + break; + } + + out: + + if (bytes_read) + *bytes_read = data_read_unread + data_read; + + return err; +} + +/* Try to unread DATA_N bytes from DATA into STREAM, storing the + amount of bytes succesfully unread in *BYTES_UNREAD. */ +static void +es_unreadn (estream_t ES__RESTRICT stream, + const unsigned char *ES__RESTRICT data, size_t data_n, + size_t *ES__RESTRICT bytes_unread) +{ + size_t space_left; + + space_left = stream->unread_buffer_size - stream->unread_data_len; + + if (data_n > space_left) + data_n = space_left; + + if (! data_n) + goto out; + + memcpy (stream->unread_buffer + stream->unread_data_len, data, data_n); + stream->unread_data_len += data_n; + stream->intern->indicators.eof = 0; + + out: + + if (bytes_unread) + *bytes_unread = data_n; +} + +/* Seek in STREAM. */ +static int +es_seek (estream_t ES__RESTRICT stream, off_t offset, int whence, + off_t *ES__RESTRICT offset_new) +{ + es_cookie_seek_function_t func_seek = stream->intern->func_seek; + int err, ret; + off_t off; + + if (! func_seek) + { + errno = EOPNOTSUPP; + err = -1; + goto out; + } + + if (stream->flags & ES_FLAG_WRITING) + { + /* Flush data first in order to prevent flushing it to the wrong + offset. */ + err = es_flush (stream); + if (err) + goto out; + stream->flags &= ~ES_FLAG_WRITING; + } + + off = offset; + if (whence == SEEK_CUR) + { + off = off - stream->data_len + stream->data_offset; + off -= stream->unread_data_len; + } + + ret = (*func_seek) (stream->intern->cookie, &off, whence); + if (ret == -1) + { + err = -1; + goto out; + } + + err = 0; + es_empty (stream); + + if (offset_new) + *offset_new = off; + + stream->intern->indicators.eof = 0; + stream->intern->offset = off; + + out: + + if (err) + stream->intern->indicators.err = 1; + + return err; +} + +/* Write BYTES_TO_WRITE bytes from BUFFER into STREAM in + unbuffered-mode, storing the amount of bytes written in + *BYTES_WRITTEN. */ +static int +es_write_nbf (estream_t ES__RESTRICT stream, + const unsigned char *ES__RESTRICT buffer, + size_t bytes_to_write, size_t *ES__RESTRICT bytes_written) +{ + es_cookie_write_function_t func_write = stream->intern->func_write; + size_t data_written; + ssize_t ret; + int err; + + if (bytes_to_write && (! func_write)) + { + err = EOPNOTSUPP; + goto out; + } + + data_written = 0; + err = 0; + + while (bytes_to_write - data_written) + { + ret = (*func_write) (stream->intern->cookie, + buffer + data_written, + bytes_to_write - data_written); + if (ret == -1) + { + err = -1; + break; + } + else + data_written += ret; + } + + stream->intern->offset += data_written; + *bytes_written = data_written; + + out: + + return err; +} + +/* Write BYTES_TO_WRITE bytes from BUFFER into STREAM in + fully-buffered-mode, storing the amount of bytes written in + *BYTES_WRITTEN. */ +static int +es_write_fbf (estream_t ES__RESTRICT stream, + const unsigned char *ES__RESTRICT buffer, + size_t bytes_to_write, size_t *ES__RESTRICT bytes_written) +{ + size_t space_available; + size_t data_to_write; + size_t data_written; + int err; + + data_written = 0; + err = 0; + + while ((bytes_to_write - data_written) && (! err)) + { + if (stream->data_offset == stream->buffer_size) + /* Container full, flush buffer. */ + err = es_flush (stream); + + if (! err) + { + /* Flushing resulted in empty container. */ + + data_to_write = bytes_to_write - data_written; + space_available = stream->buffer_size - stream->data_offset; + if (data_to_write > space_available) + data_to_write = space_available; + + memcpy (stream->buffer + stream->data_offset, + buffer + data_written, data_to_write); + stream->data_offset += data_to_write; + data_written += data_to_write; + } + } + + *bytes_written = data_written; + + return err; +} + + +/* Write BYTES_TO_WRITE bytes from BUFFER into STREAM in + line-buffered-mode, storing the amount of bytes written in + *BYTES_WRITTEN. */ +static int +es_write_lbf (estream_t ES__RESTRICT stream, + const unsigned char *ES__RESTRICT buffer, + size_t bytes_to_write, size_t *ES__RESTRICT bytes_written) +{ + size_t data_flushed = 0; + size_t data_buffered = 0; + unsigned char *nlp; + int err = 0; + + nlp = memrchr (buffer, '\n', bytes_to_write); + if (nlp) + { + /* Found a newline, directly write up to (including) this + character. */ + err = es_flush (stream); + if (!err) + err = es_write_nbf (stream, buffer, nlp - buffer + 1, &data_flushed); + } + + if (!err) + { + /* Write remaining data fully buffered. */ + err = es_write_fbf (stream, buffer + data_flushed, + bytes_to_write - data_flushed, &data_buffered); + } + + *bytes_written = data_flushed + data_buffered; + return err; +} + + +/* Write BYTES_TO_WRITE bytes from BUFFER into STREAM in, storing the + amount of bytes written in BYTES_WRITTEN. */ +static int +es_writen (estream_t ES__RESTRICT stream, + const void *ES__RESTRICT buffer, + size_t bytes_to_write, size_t *ES__RESTRICT bytes_written) +{ + size_t data_written; + int err; + + data_written = 0; + err = 0; + + if (! (stream->flags & ES_FLAG_WRITING)) + { + /* Switching to writing mode -> discard input data and seek to + position at which reading has stopped. */ + + err = es_seek (stream, 0, SEEK_CUR, NULL); + if (err) + { + if (errno == ESPIPE) + err = 0; + else + goto out; + } + } + + switch (stream->intern->strategy) + { + case _IONBF: + err = es_write_nbf (stream, buffer, bytes_to_write, &data_written); + break; + + case _IOLBF: + err = es_write_lbf (stream, buffer, bytes_to_write, &data_written); + break; + + case _IOFBF: + err = es_write_fbf (stream, buffer, bytes_to_write, &data_written); + break; + } + + out: + + if (bytes_written) + *bytes_written = data_written; + if (data_written) + if (! (stream->flags & ES_FLAG_WRITING)) + stream->flags |= ES_FLAG_WRITING; + + return err; +} + + +static int +es_peek (estream_t ES__RESTRICT stream, unsigned char **ES__RESTRICT data, + size_t *ES__RESTRICT data_len) +{ + int err; + + if (stream->flags & ES_FLAG_WRITING) + { + /* Switching to reading mode -> flush output. */ + err = es_flush (stream); + if (err) + goto out; + stream->flags &= ~ES_FLAG_WRITING; + } + + if (stream->data_offset == stream->data_len) + { + /* Refill container. */ + err = es_fill (stream); + if (err) + goto out; + } + + if (data) + *data = stream->buffer + stream->data_offset; + if (data_len) + *data_len = stream->data_len - stream->data_offset; + err = 0; + + out: + + return err; +} + + +/* Skip SIZE bytes of input data contained in buffer. */ +static int +es_skip (estream_t stream, size_t size) +{ + int err; + + if (stream->data_offset + size > stream->data_len) + { + errno = EINVAL; + err = -1; + } + else + { + stream->data_offset += size; + err = 0; + } + + return err; +} + + +static int +es_read_line (estream_t ES__RESTRICT stream, size_t max_length, + char *ES__RESTRICT *ES__RESTRICT line, + size_t *ES__RESTRICT line_length) +{ + size_t space_left; + size_t line_size; + estream_t line_stream; + char *line_new; + void *line_stream_cookie; + char *newline; + unsigned char *data; + size_t data_len; + int err; + + line_new = NULL; + line_stream = NULL; + line_stream_cookie = NULL; + + err = es_func_mem_create (&line_stream_cookie, NULL, 0, 0, BUFFER_BLOCK_SIZE, + 1, 0, 0, NULL, 0, MEM_REALLOC, MEM_FREE, O_RDWR); + if (err) + goto out; + + err = es_create (&line_stream, line_stream_cookie, -1, + estream_functions_mem); + if (err) + goto out; + + space_left = max_length; + line_size = 0; + while (1) + { + if (max_length && (space_left == 1)) + break; + + err = es_peek (stream, &data, &data_len); + if (err || (! data_len)) + break; + + if (data_len > (space_left - 1)) + data_len = space_left - 1; + + newline = memchr (data, '\n', data_len); + if (newline) + { + data_len = (newline - (char *) data) + 1; + err = es_write (line_stream, data, data_len, NULL); + if (! err) + { + space_left -= data_len; + line_size += data_len; + es_skip (stream, data_len); + break; + } + } + else + { + err = es_write (line_stream, data, data_len, NULL); + if (! err) + { + space_left -= data_len; + line_size += data_len; + es_skip (stream, data_len); + } + } + if (err) + break; + } + if (err) + goto out; + + /* Complete line has been written to line_stream. */ + + if ((max_length > 1) && (! line_size)) + { + stream->intern->indicators.eof = 1; + goto out; + } + + err = es_seek (line_stream, 0, SEEK_SET, NULL); + if (err) + goto out; + + if (! *line) + { + line_new = MEM_ALLOC (line_size + 1); + if (! line_new) + { + err = -1; + goto out; + } + } + else + line_new = *line; + + err = es_read (line_stream, line_new, line_size, NULL); + if (err) + goto out; + + line_new[line_size] = '\0'; + + if (! *line) + *line = line_new; + if (line_length) + *line_length = line_size; + + out: + + if (line_stream) + es_destroy (line_stream); + else if (line_stream_cookie) + es_func_mem_destroy (line_stream_cookie); + + if (err) + { + if (! *line) + MEM_FREE (line_new); + stream->intern->indicators.err = 1; + } + + return err; +} + + +static int +es_print (estream_t ES__RESTRICT stream, + const char *ES__RESTRICT format, va_list ap) +{ + char data[BUFFER_BLOCK_SIZE]; + size_t bytes_written; + size_t bytes_read; + FILE *tmp_stream; + int err; + + bytes_written = 0; + tmp_stream = NULL; + err = 0; + + tmp_stream = tmpfile (); + if (! tmp_stream) + { + err = errno; + goto out; + } + + err = vfprintf (tmp_stream, format, ap); + if (err < 0) + goto out; + + err = fseek (tmp_stream, 0, SEEK_SET); + if (err) + goto out; + + while (1) + { + bytes_read = fread (data, 1, sizeof (data), tmp_stream); + if (ferror (tmp_stream)) + { + err = -1; + break; + } + + err = es_writen (stream, data, bytes_read, NULL); + if (err) + break; + else + bytes_written += bytes_read; + if (feof (tmp_stream)) + break; + } + if (err) + goto out; + + out: + + if (tmp_stream) + fclose (tmp_stream); + + return err ? -1 : bytes_written; +} + + +static void +es_set_indicators (estream_t stream, int ind_err, int ind_eof) +{ + if (ind_err != -1) + stream->intern->indicators.err = ind_err ? 1 : 0; + if (ind_eof != -1) + stream->intern->indicators.eof = ind_eof ? 1 : 0; +} + + +static int +es_get_indicator (estream_t stream, int ind_err, int ind_eof) +{ + int ret = 0; + + if (ind_err) + ret = stream->intern->indicators.err; + else if (ind_eof) + ret = stream->intern->indicators.eof; + + return ret; +} + + +static int +es_set_buffering (estream_t ES__RESTRICT stream, + char *ES__RESTRICT buffer, int mode, size_t size) +{ + int err; + + /* Flush or empty buffer depending on mode. */ + if (stream->flags & ES_FLAG_WRITING) + { + err = es_flush (stream); + if (err) + goto out; + } + else + es_empty (stream); + + es_set_indicators (stream, -1, 0); + + /* Free old buffer in case that was allocated by this function. */ + if (stream->intern->deallocate_buffer) + { + stream->intern->deallocate_buffer = 0; + MEM_FREE (stream->buffer); + stream->buffer = NULL; + } + + if (mode == _IONBF) + stream->buffer_size = 0; + else + { + void *buffer_new; + + if (buffer) + buffer_new = buffer; + else + { + buffer_new = MEM_ALLOC (size); + if (! buffer_new) + { + err = -1; + goto out; + } + } + + stream->buffer = buffer_new; + stream->buffer_size = size; + if (! buffer) + stream->intern->deallocate_buffer = 1; + } + stream->intern->strategy = mode; + err = 0; + + out: + + return err; +} + + +static off_t +es_offset_calculate (estream_t stream) +{ + off_t offset; + + offset = stream->intern->offset + stream->data_offset; + if (offset < stream->unread_data_len) + /* Offset undefined. */ + offset = 0; + else + offset -= stream->unread_data_len; + + return offset; +} + + +static void +es_opaque_ctrl (estream_t ES__RESTRICT stream, void *ES__RESTRICT opaque_new, + void **ES__RESTRICT opaque_old) +{ + if (opaque_old) + *opaque_old = stream->intern->opaque; + if (opaque_new) + stream->intern->opaque = opaque_new; +} + + +static int +es_get_fd (estream_t stream) +{ + return stream->intern->fd; +} + + + +/* API. */ + +int +es_init (void) +{ + int err; + + err = es_init_do (); + + return err; +} + +estream_t +es_fopen (const char *ES__RESTRICT path, const char *ES__RESTRICT mode) +{ + unsigned int flags; + int create_called; + estream_t stream; + void *cookie; + int err; + int fd; + + stream = NULL; + cookie = NULL; + create_called = 0; + + err = es_convert_mode (mode, &flags); + if (err) + goto out; + + err = es_func_file_create (&cookie, &fd, path, flags); + if (err) + goto out; + + create_called = 1; + err = es_create (&stream, cookie, fd, estream_functions_file); + if (err) + goto out; + + out: + + if (err && create_called) + (*estream_functions_file.func_close) (cookie); + + return stream; +} + + +estream_t +es_mopen (unsigned char *ES__RESTRICT data, size_t data_n, size_t data_len, + unsigned int grow, + func_realloc_t func_realloc, func_free_t func_free, + const char *ES__RESTRICT mode) +{ + unsigned int flags; + int create_called; + estream_t stream; + void *cookie; + int err; + + cookie = 0; + stream = NULL; + create_called = 0; + + err = es_convert_mode (mode, &flags); + if (err) + goto out; + + err = es_func_mem_create (&cookie, data, data_n, data_len, + BUFFER_BLOCK_SIZE, grow, 0, 0, + NULL, 0, func_realloc, func_free, flags); + if (err) + goto out; + + create_called = 1; + err = es_create (&stream, cookie, -1, estream_functions_mem); + + out: + + if (err && create_called) + (*estream_functions_mem.func_close) (cookie); + + return stream; +} + + +estream_t +es_open_memstream (char **ptr, size_t *size) +{ + unsigned int flags; + int create_called; + estream_t stream; + void *cookie; + int err; + + flags = O_RDWR; + create_called = 0; + stream = NULL; + cookie = 0; + + err = es_func_mem_create (&cookie, NULL, 0, 0, + BUFFER_BLOCK_SIZE, 1, 1, 1, + ptr, size, MEM_REALLOC, MEM_FREE, flags); + if (err) + goto out; + + create_called = 1; + err = es_create (&stream, cookie, -1, estream_functions_mem); + + out: + + if (err && create_called) + (*estream_functions_mem.func_close) (cookie); + + return stream; +} + + +estream_t +es_fopencookie (void *ES__RESTRICT cookie, + const char *ES__RESTRICT mode, + es_cookie_io_functions_t functions) +{ + unsigned int flags; + estream_t stream; + int err; + + stream = NULL; + flags = 0; + + err = es_convert_mode (mode, &flags); + if (err) + goto out; + + err = es_create (&stream, cookie, -1, functions); + if (err) + goto out; + + out: + + return stream; +} + + +estream_t +es_fdopen (int filedes, const char *mode) +{ + unsigned int flags; + int create_called; + estream_t stream; + void *cookie; + int err; + + stream = NULL; + cookie = NULL; + create_called = 0; + + err = es_convert_mode (mode, &flags); + if (err) + goto out; + + err = es_func_fd_create (&cookie, filedes, flags); + if (err) + goto out; + + create_called = 1; + err = es_create (&stream, cookie, filedes, estream_functions_fd); + + out: + + if (err && create_called) + (*estream_functions_fd.func_close) (cookie); + + return stream; +} + + +estream_t +es_freopen (const char *ES__RESTRICT path, const char *ES__RESTRICT mode, + estream_t ES__RESTRICT stream) +{ + int err; + + if (path) + { + unsigned int flags; + int create_called; + void *cookie; + int fd; + + cookie = NULL; + create_called = 0; + + ESTREAM_LOCK (stream); + + es_deinitialize (stream); + + err = es_convert_mode (mode, &flags); + if (err) + goto leave; + + err = es_func_file_create (&cookie, &fd, path, flags); + if (err) + goto leave; + + create_called = 1; + es_initialize (stream, cookie, fd, estream_functions_file); + + leave: + + if (err) + { + if (create_called) + es_func_fd_destroy (cookie); + + es_destroy (stream); + stream = NULL; + } + else + ESTREAM_UNLOCK (stream); + } + else + { + /* FIXME? We don't support re-opening at the moment. */ + errno = EINVAL; + es_deinitialize (stream); + es_destroy (stream); + stream = NULL; + } + + return stream; +} + + +int +es_fclose (estream_t stream) +{ + int err; + + err = es_destroy (stream); + + return err; +} + +int +es_fileno_unlocked (estream_t stream) +{ + return es_get_fd (stream); +} + + +void +es_flockfile (estream_t stream) +{ + ESTREAM_LOCK (stream); +} + + +int +es_ftrylockfile (estream_t stream) +{ + return ESTREAM_TRYLOCK (stream); +} + + +void +es_funlockfile (estream_t stream) +{ + ESTREAM_UNLOCK (stream); +} + + +int +es_fileno (estream_t stream) +{ + int ret; + + ESTREAM_LOCK (stream); + ret = es_fileno_unlocked (stream); + ESTREAM_UNLOCK (stream); + + return ret; +} + + +int +es_feof_unlocked (estream_t stream) +{ + return es_get_indicator (stream, 0, 1); +} + + +int +es_feof (estream_t stream) +{ + int ret; + + ESTREAM_LOCK (stream); + ret = es_feof_unlocked (stream); + ESTREAM_UNLOCK (stream); + + return ret; +} + + +int +es_ferror_unlocked (estream_t stream) +{ + return es_get_indicator (stream, 1, 0); +} + + +int +es_ferror (estream_t stream) +{ + int ret; + + ESTREAM_LOCK (stream); + ret = es_ferror_unlocked (stream); + ESTREAM_UNLOCK (stream); + + return ret; +} + + +void +es_clearerr_unlocked (estream_t stream) +{ + es_set_indicators (stream, 0, 0); +} + + +void +es_clearerr (estream_t stream) +{ + ESTREAM_LOCK (stream); + es_clearerr_unlocked (stream); + ESTREAM_UNLOCK (stream); +} + + +int +es_fflush (estream_t stream) +{ + int err; + + if (stream) + { + ESTREAM_LOCK (stream); + if (stream->flags & ES_FLAG_WRITING) + err = es_flush (stream); + else + { + es_empty (stream); + err = 0; + } + ESTREAM_UNLOCK (stream); + } + else + err = es_list_iterate (es_fflush); + + return err ? EOF : 0; +} + + +int +es_fseek (estream_t stream, long int offset, int whence) +{ + int err; + + ESTREAM_LOCK (stream); + err = es_seek (stream, offset, whence, NULL); + ESTREAM_UNLOCK (stream); + + return err; +} + + +int +es_fseeko (estream_t stream, off_t offset, int whence) +{ + int err; + + ESTREAM_LOCK (stream); + err = es_seek (stream, offset, whence, NULL); + ESTREAM_UNLOCK (stream); + + return err; +} + + +long int +es_ftell (estream_t stream) +{ + long int ret; + + ESTREAM_LOCK (stream); + ret = es_offset_calculate (stream); + ESTREAM_UNLOCK (stream); + + return ret; +} + + +off_t +es_ftello (estream_t stream) +{ + off_t ret = -1; + + ESTREAM_LOCK (stream); + ret = es_offset_calculate (stream); + ESTREAM_UNLOCK (stream); + + return ret; +} + + +void +es_rewind (estream_t stream) +{ + ESTREAM_LOCK (stream); + es_seek (stream, 0L, SEEK_SET, NULL); + es_set_indicators (stream, 0, -1); + ESTREAM_UNLOCK (stream); +} + + +int +_es_getc_underflow (estream_t stream) +{ + int err; + unsigned char c; + size_t bytes_read; + + err = es_readn (stream, &c, 1, &bytes_read); + + return (err || (! bytes_read)) ? EOF : c; +} + + +int +_es_putc_overflow (int c, estream_t stream) +{ + unsigned char d = c; + int err; + + err = es_writen (stream, &d, 1, NULL); + + return err ? EOF : c; +} + + +int +es_fgetc (estream_t stream) +{ + int ret; + + ESTREAM_LOCK (stream); + ret = es_getc_unlocked (stream); + ESTREAM_UNLOCK (stream); + + return ret; +} + + +int +es_fputc (int c, estream_t stream) +{ + int ret; + + ESTREAM_LOCK (stream); + ret = es_putc_unlocked (c, stream); + ESTREAM_UNLOCK (stream); + + return ret; +} + + +int +es_ungetc (int c, estream_t stream) +{ + unsigned char data = (unsigned char) c; + size_t data_unread; + + ESTREAM_LOCK (stream); + es_unreadn (stream, &data, 1, &data_unread); + ESTREAM_UNLOCK (stream); + + return data_unread ? c : EOF; +} + + +int +es_read (estream_t ES__RESTRICT stream, + void *ES__RESTRICT buffer, size_t bytes_to_read, + size_t *ES__RESTRICT bytes_read) +{ + int err; + + if (bytes_to_read) + { + ESTREAM_LOCK (stream); + err = es_readn (stream, buffer, bytes_to_read, bytes_read); + ESTREAM_UNLOCK (stream); + } + else + err = 0; + + return err; +} + + +int +es_write (estream_t ES__RESTRICT stream, + const void *ES__RESTRICT buffer, size_t bytes_to_write, + size_t *ES__RESTRICT bytes_written) +{ + int err; + + if (bytes_to_write) + { + ESTREAM_LOCK (stream); + err = es_writen (stream, buffer, bytes_to_write, bytes_written); + ESTREAM_UNLOCK (stream); + } + else + err = 0; + + return err; +} + + +size_t +es_fread (void *ES__RESTRICT ptr, size_t size, size_t nitems, + estream_t ES__RESTRICT stream) +{ + size_t ret, bytes; + int err; + + if (size * nitems) + { + ESTREAM_LOCK (stream); + err = es_readn (stream, ptr, size * nitems, &bytes); + ESTREAM_UNLOCK (stream); + + ret = bytes / size; + } + else + ret = 0; + + return ret; +} + + +size_t +es_fwrite (const void *ES__RESTRICT ptr, size_t size, size_t nitems, + estream_t ES__RESTRICT stream) +{ + size_t ret, bytes; + int err; + + if (size * nitems) + { + ESTREAM_LOCK (stream); + err = es_writen (stream, ptr, size * nitems, &bytes); + ESTREAM_UNLOCK (stream); + + ret = bytes / size; + } + else + ret = 0; + + return ret; +} + + +char * +es_fgets (char *ES__RESTRICT s, int n, estream_t ES__RESTRICT stream) +{ + char *ret = NULL; + + if (n) + { + int err; + + ESTREAM_LOCK (stream); + err = es_read_line (stream, n, &s, NULL); + ESTREAM_UNLOCK (stream); + if (! err) + ret = s; + } + + return ret; +} + + +int +es_fputs (const char *ES__RESTRICT s, estream_t ES__RESTRICT stream) +{ + size_t length; + int err; + + length = strlen (s); + ESTREAM_LOCK (stream); + err = es_writen (stream, s, length, NULL); + ESTREAM_UNLOCK (stream); + + return err ? EOF : 0; +} + + +ssize_t +es_getline (char *ES__RESTRICT *ES__RESTRICT lineptr, size_t *ES__RESTRICT n, + estream_t ES__RESTRICT stream) +{ + char *line = NULL; + size_t line_n = 0; + int err; + + ESTREAM_LOCK (stream); + err = es_read_line (stream, 0, &line, &line_n); + ESTREAM_UNLOCK (stream); + if (err) + goto out; + + if (*n) + { + /* Caller wants us to use his buffer. */ + + if (*n < (line_n + 1)) + { + /* Provided buffer is too small -> resize. */ + + void *p; + + p = MEM_REALLOC (*lineptr, line_n + 1); + if (! p) + err = -1; + else + { + if (*lineptr != p) + *lineptr = p; + } + } + + if (! err) + { + memcpy (*lineptr, line, line_n + 1); + if (*n != line_n) + *n = line_n; + } + MEM_FREE (line); + } + else + { + /* Caller wants new buffers. */ + *lineptr = line; + *n = line_n; + } + + out: + + return err ? err : line_n; +} + + +int +es_vfprintf (estream_t ES__RESTRICT stream, const char *ES__RESTRICT format, + va_list ap) +{ + int ret; + + ESTREAM_LOCK (stream); + ret = es_print (stream, format, ap); + ESTREAM_UNLOCK (stream); + + return ret; +} + + +int +es_fprintf (estream_t ES__RESTRICT stream, + const char *ES__RESTRICT format, ...) +{ + int ret; + + va_list ap; + va_start (ap, format); + ESTREAM_LOCK (stream); + ret = es_print (stream, format, ap); + ESTREAM_UNLOCK (stream); + va_end (ap); + + return ret; +} + +static int +tmpfd (void) +{ + FILE *fp; + int fp_fd; + int fd; + + fp = NULL; + fd = -1; + + fp = tmpfile (); + if (! fp) + goto out; + + fp_fd = fileno (fp); + fd = dup (fp_fd); + + out: + + if (fp) + fclose (fp); + + return fd; +} + +estream_t +es_tmpfile (void) +{ + unsigned int flags; + int create_called; + estream_t stream; + void *cookie; + int err; + int fd; + + create_called = 0; + stream = NULL; + flags = O_RDWR | O_TRUNC | O_CREAT; + cookie = NULL; + + fd = tmpfd (); + if (fd == -1) + { + err = -1; + goto out; + } + + err = es_func_fd_create (&cookie, fd, flags); + if (err) + goto out; + + create_called = 1; + err = es_create (&stream, cookie, fd, estream_functions_fd); + + out: + + if (err) + { + if (create_called) + es_func_fd_destroy (cookie); + else if (fd != -1) + close (fd); + stream = NULL; + } + + return stream; +} + + +int +es_setvbuf (estream_t ES__RESTRICT stream, + char *ES__RESTRICT buf, int type, size_t size) +{ + int err; + + if (((type == _IOFBF) || (type == _IOLBF) || (type == _IONBF)) + && (! ((! size) && (type != _IONBF)))) + { + ESTREAM_LOCK (stream); + err = es_set_buffering (stream, buf, type, size); + ESTREAM_UNLOCK (stream); + } + else + { + errno = EINVAL; + err = -1; + } + + return err; +} + + +void +es_setbuf (estream_t ES__RESTRICT stream, char *ES__RESTRICT buf) +{ + ESTREAM_LOCK (stream); + es_set_buffering (stream, buf, buf ? _IOFBF : _IONBF, BUFSIZ); + ESTREAM_UNLOCK (stream); +} + +void +es_opaque_set (estream_t stream, void *opaque) +{ + ESTREAM_LOCK (stream); + es_opaque_ctrl (stream, opaque, NULL); + ESTREAM_UNLOCK (stream); +} + + +void * +es_opaque_get (estream_t stream) +{ + void *opaque; + + ESTREAM_LOCK (stream); + es_opaque_ctrl (stream, NULL, &opaque); + ESTREAM_UNLOCK (stream); + + return opaque; +} diff --git a/common/estream.h b/common/estream.h new file mode 100644 index 000000000..a9b4847c8 --- /dev/null +++ b/common/estream.h @@ -0,0 +1,203 @@ +/* estream.h - Extended stream I/O/ Library + * Copyright (C) 2004 g10 Code GmbH + * + * This file is part of Libestream. + * + * Libestream is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation; either version 2 of the License, + * or (at your option) any later version. + * + * Libestream is distributed in the hope that 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 General Public License + * along with Libestream; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + */ + +#ifndef ESTREAM_H +#define ESTREAM_H + +#include +#include +#include + + +/* Forward declaration for the (opaque) internal type. */ +struct estream_internal; + +/* The definition of this struct is entirely private. You must not + use it for anything. It is only here so some functions can be + implemented as macros. */ +struct es__stream +{ + /* The layout of this struct must never change. It may be grown, + but only if all functions which access the new members are + versioned. */ + + /* A pointer to the stream buffer. */ + unsigned char *buffer; + + /* The size of the buffer in bytes. */ + size_t buffer_size; + + /* The length of the usable data in the buffer, only valid when in + read mode (see flags). */ + size_t data_len; + + /* The current position of the offset pointer, valid in read and + write mode. */ + size_t data_offset; + + size_t data_flushed; + unsigned char *unread_buffer; + size_t unread_buffer_size; + + /* The number of unread bytes. */ + size_t unread_data_len; + + /* Various flags. */ +#define ES__FLAG_WRITING (1 << 0) + unsigned int flags; + + /* A pointer to our internal data for this stream. */ + struct estream_internal *intern; +}; + +/* The opaque type for an estream. */ +typedef struct es__stream *estream_t; + + +typedef ssize_t (*es_cookie_read_function_t) (void *cookie, + void *buffer, size_t size); +typedef ssize_t (*es_cookie_write_function_t) (void *cookie, + const void *buffer, + size_t size); +typedef int (*es_cookie_seek_function_t) (void *cookie, + off_t *pos, int whence); +typedef int (*es_cookie_close_function_t) (void *cookie); + +typedef struct es_cookie_io_functions +{ + es_cookie_read_function_t func_read; + es_cookie_write_function_t func_write; + es_cookie_seek_function_t func_seek; + es_cookie_close_function_t func_close; +} es_cookie_io_functions_t; + + +#ifndef ES__RESTRICT +# if defined __GNUC__ && defined __GNUC_MINOR__ +# if (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 92)) +# define ES__RESTRICT __restrict__ +# endif +# endif +#endif +#ifndef ES__RESTRICT +# define ES__RESTRICT +#endif + +int es_init (void); + +estream_t es_fopen (const char *ES__RESTRICT path, + const char *ES__RESTRICT mode); +estream_t es_mopen (unsigned char *ES__RESTRICT data, + size_t data_n, size_t data_len, + unsigned int grow, + void *(*func_realloc) (void *mem, size_t size), + void (*func_free) (void *mem), + const char *ES__RESTRICT mode); +estream_t es_open_memstream (char **ptr, size_t *size); +estream_t es_fdopen (int filedes, const char *mode); +estream_t es_freopen (const char *ES__RESTRICT path, + const char *ES__RESTRICT mode, + estream_t ES__RESTRICT stream); +estream_t es_fopencookie (void *ES__RESTRICT cookie, + const char *ES__RESTRICT mode, + es_cookie_io_functions_t functions); +int es_fclose (estream_t stream); +int es_fileno (estream_t stream); +int es_fileno_unlocked (estream_t stream); + +void es_flockfile (estream_t stream); +int es_ftrylockfile (estream_t stream); +void es_funlockfile (estream_t stream); + +int es_feof (estream_t stream); +int es_feof_unlocked (estream_t stream); +int es_ferror (estream_t stream); +int es_ferror_unlocked (estream_t stream); +void es_clearerr (estream_t stream); +void es_clearerr_unlocked (estream_t stream); + +int es_fflush (estream_t stream); +int es_fseek (estream_t stream, long int offset, int whence); +int es_fseeko (estream_t stream, off_t offset, int whence); +long int es_ftell (estream_t stream); +off_t es_ftello (estream_t stream); +void es_rewind (estream_t stream); + +int es_fgetc (estream_t stream); +int es_fputc (int c, estream_t stream); + +int _es_getc_underflow (estream_t stream); +int _es_putc_overflow (int c, estream_t stream); + +#define es_getc_unlocked(stream) \ + (((! ((stream)->flags & 1)) \ + && ((stream)->data_offset < (stream)->data_len) \ + && (! (stream)->unread_data_len)) \ + ? ((int) (stream)->buffer[((stream)->data_offset)++]) \ + : _es_getc_underflow ((stream))) + +#define es_putc_unlocked(c, stream) \ + ((((stream)->flags & 1) \ + && ((stream)->data_offset < (stream)->buffer_size) \ + && (c != '\n')) \ + ? ((int) ((stream)->buffer[((stream)->data_offset)++] = (c))) \ + : _es_putc_overflow ((c), (stream))) + +#define es_getc(stream) es_fgetc (stream) +#define es_putc(c, stream) es_fputc (c, stream) + +int es_ungetc (int c, estream_t stream); + +int es_read (estream_t ES__RESTRICT stream, + void *ES__RESTRICT buffer, size_t bytes_to_read, + size_t *ES__RESTRICT bytes_read); +int es_write (estream_t ES__RESTRICT stream, + const void *ES__RESTRICT buffer, size_t bytes_to_write, + size_t *ES__RESTRICT bytes_written); + +size_t es_fread (void *ES__RESTRICT ptr, size_t size, size_t nitems, + estream_t ES__RESTRICT stream); +size_t es_fwrite (const void *ES__RESTRICT ptr, size_t size, size_t memb, + estream_t ES__RESTRICT stream); + +char *es_fgets (char *ES__RESTRICT s, int n, estream_t ES__RESTRICT stream); +int es_fputs (const char *ES__RESTRICT s, estream_t ES__RESTRICT stream); + +ssize_t es_getline (char *ES__RESTRICT *ES__RESTRICT lineptr, + size_t *ES__RESTRICT n, + estream_t stream); + +int es_fprintf (estream_t ES__RESTRICT stream, + const char *ES__RESTRICT format, ...); +int es_vfprintf (estream_t ES__RESTRICT stream, + const char *ES__RESTRICT format, va_list ap); + +int es_setvbuf (estream_t ES__RESTRICT stream, + char *ES__RESTRICT buf, int mode, size_t size); +void es_setbuf (estream_t ES__RESTRICT stream, char *ES__RESTRICT buf); + +estream_t es_tmpfile (void); + +void es_opaque_set (estream_t ES__RESTRICT stream, void *ES__RESTRICT opaque); +void *es_opaque_get (estream_t stream); + +#endif /*ESTREAM_H*/ + diff --git a/common/exechelp.c b/common/exechelp.c new file mode 100644 index 000000000..e64b69022 --- /dev/null +++ b/common/exechelp.c @@ -0,0 +1,483 @@ +/* exechelp.c - fork and exec helpers + * 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. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#ifdef USE_GNU_PTH +#include +#endif +#ifndef HAVE_W32_SYSTEM +#include +#endif + +#include "util.h" +#include "i18n.h" +#include "exechelp.h" + +/* Define to 1 do enable debugging. */ +#define DEBUG_W32_SPAWN 1 + + +#ifdef _POSIX_OPEN_MAX +#define MAX_OPEN_FDS _POSIX_OPEN_MAX +#else +#define MAX_OPEN_FDS 20 +#endif + +/* We have the usual problem here: Some modules are linked against pth + and some are not. However we want to use pth_fork and pth_waitpid + here. Using a weak symbol works but is not portable - we should + provide a an explicit dummy pth module instead of using the + pragma. */ +#ifndef _WIN32 +#pragma weak pth_fork +#pragma weak pth_waitpid +#endif + + +#ifdef HAVE_W32_SYSTEM +/* We assume that a HANDLE can be represented by an int which should + be true for all i386 systems (HANDLE is defined as void *) and + these are the only systems for which Windows is available. Further + we assume that -1 denotes an invalid handle. */ +# define fd_to_handle(a) ((HANDLE)(a)) +# define handle_to_fd(a) ((int)(a)) +# define pid_to_handle(a) ((HANDLE)(a)) +# define handle_to_pid(a) ((int)(a)) +#endif + + +#ifdef HAVE_W32_SYSTEM +/* Build a command line for use with W32's CreateProcess. On success + CMDLINE gets the address of a newly allocated string. */ +static gpg_error_t +build_w32_commandline (const char *pgmname, const char **argv, char **cmdline) +{ + int i, n; + const char *s; + char *buf, *p; + + *cmdline = NULL; + n = strlen (pgmname); + for (i=0; (s=argv[i]); i++) + { + n += strlen (s) + 1 + 2; /* (1 space, 2 quoting */ + for (; *s; s++) + if (*s == '\"') + n++; /* Need to double inner quotes. */ + } + n++; + + buf = p = xtrymalloc (n); + if (!buf) + return gpg_error_from_errno (errno); + + /* fixme: PGMNAME may not contain spaces etc. */ + p = stpcpy (p, pgmname); + for (i=0; argv[i]; i++) + { + if (!*argv[i]) /* Empty string. */ + p = stpcpy (p, " \"\""); + else if (strpbrk (argv[i], " \t\n\v\f\"")) + { + p = stpcpy (p, " \""); + for (s=argv[i]; *s; s++) + { + *p++ = *s; + if (*s == '\"') + *p++ = *s; + } + *p++ = '\"'; + *p = 0; + } + else + p = stpcpy (stpcpy (p, " "), argv[i]); + } + + *cmdline= buf; + return 0; +} +#endif /*HAVE_W32_SYSTEM*/ + + +#ifdef HAVE_W32_SYSTEM +/* Create pipe where the write end is inheritable. */ +static int +create_inheritable_pipe (int filedes[2]) +{ + HANDLE r, w, h; + SECURITY_ATTRIBUTES sec_attr; + + memset (&sec_attr, 0, sizeof sec_attr ); + sec_attr.nLength = sizeof sec_attr; + sec_attr.bInheritHandle = FALSE; + + if (!CreatePipe (&r, &w, &sec_attr, 0)) + return -1; + + if (!DuplicateHandle (GetCurrentProcess(), w, + GetCurrentProcess(), &h, 0, + TRUE, DUPLICATE_SAME_ACCESS )) + { + log_error ("DuplicateHandle failed: %s\n", w32_strerror (-1)); + CloseHandle (r); + CloseHandle (w); + return -1; + } + CloseHandle (w); + w = h; + + filedes[0] = handle_to_fd (r); + filedes[1] = handle_to_fd (w); + return 0; +} +#endif /*HAVE_W32_SYSTEM*/ + + + +/* Fork and exec the PGMNAME, connect the file descriptor of INFILE to + stdin, write the output to OUTFILE, return a new stream in + STATUSFILE for stderr and the pid of the process in PID. The + arguments for the process are expected in the NULL terminated array + ARGV. The program name itself should not be included there. if + PREEXEC is not NULL, that function will be called right before the + exec. + + Returns 0 on success or an error code. */ +gpg_error_t +gnupg_spawn_process (const char *pgmname, const char *argv[], + FILE *infile, FILE *outfile, + void (*preexec)(void), + FILE **statusfile, pid_t *pid) +{ +#ifdef HAVE_W32_SYSTEM + gpg_error_t err; + SECURITY_ATTRIBUTES sec_attr; + PROCESS_INFORMATION pi = + { + NULL, /* Returns process handle. */ + 0, /* Returns primary thread handle. */ + 0, /* Returns pid. */ + 0 /* Returns tid. */ + }; + STARTUPINFO si; + int cr_flags; + char *cmdline; + int fd, fdout, rp[2]; + + /* Setup return values. */ + *statusfile = NULL; + *pid = (pid_t)(-1); + fflush (infile); + rewind (infile); + fd = _get_osfhandle (fileno (infile)); + fdout = _get_osfhandle (fileno (outfile)); + if (fd == -1 || fdout == -1) + log_fatal ("no file descriptor for file passed to gnupg_spawn_process\n"); + + /* Prepare security attributes. */ + memset (&sec_attr, 0, sizeof sec_attr ); + sec_attr.nLength = sizeof sec_attr; + sec_attr.bInheritHandle = FALSE; + + /* Build the command line. */ + err = build_w32_commandline (pgmname, argv, &cmdline); + if (err) + return err; + + /* Create a pipe. */ + if (create_inheritable_pipe (rp)) + { + err = gpg_error (GPG_ERR_GENERAL); + log_error (_("error creating a pipe: %s\n"), gpg_strerror (err)); + xfree (cmdline); + return err; + } + + /* Start the process. Note that we can't run the PREEXEC function + because this would change our own environment. */ + memset (&si, 0, sizeof si); + si.cb = sizeof (si); + si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; + si.wShowWindow = DEBUG_W32_SPAWN? SW_SHOW : SW_MINIMIZE; + si.hStdInput = fd_to_handle (fd); + si.hStdOutput = fd_to_handle (fdout); + si.hStdError = fd_to_handle (rp[1]); + + cr_flags = (CREATE_DEFAULT_ERROR_MODE + | GetPriorityClass (GetCurrentProcess ()) + | CREATE_SUSPENDED); + log_debug ("CreateProcess, path=`%s' cmdline=`%s'\n", pgmname, cmdline); + if (!CreateProcess (pgmname, /* Program to start. */ + cmdline, /* Command line arguments. */ + &sec_attr, /* Process security attributes. */ + &sec_attr, /* Thread security attributes. */ + TRUE, /* Inherit handles. */ + cr_flags, /* Creation flags. */ + NULL, /* Environment. */ + NULL, /* Use current drive/directory. */ + &si, /* Startup information. */ + &pi /* Returns process information. */ + )) + { + log_error ("CreateProcess failed: %s\n", w32_strerror (-1)); + xfree (cmdline); + CloseHandle (fd_to_handle (rp[0])); + CloseHandle (fd_to_handle (rp[1])); + return gpg_error (GPG_ERR_GENERAL); + } + xfree (cmdline); + cmdline = NULL; + + /* Close the other end of the pipe. */ + CloseHandle (fd_to_handle (rp[1])); + + log_debug ("CreateProcess ready: hProcess=%p hThread=%p" + " dwProcessID=%d dwThreadId=%d\n", + pi.hProcess, pi.hThread, + (int) pi.dwProcessId, (int) pi.dwThreadId); + + /* Process ha been created suspended; resume it now. */ + ResumeThread (pi.hThread); + CloseHandle (pi.hThread); + + { + int x; + + x = _open_osfhandle (rp[0], 0); + if (x == -1) + log_error ("failed to translate osfhandle %p\n", (void*)rp[0] ); + else + { + log_debug ("_open_osfhandle %p yields %d\n", (void*)fd, x ); + *statusfile = fdopen (x, "r"); + } + } + if (!*statusfile) + { + err = gpg_error_from_errno (errno); + log_error (_("can't fdopen pipe for reading: %s\n"), gpg_strerror (err)); + CloseHandle (pi.hProcess); + return err; + } + + *pid = handle_to_pid (pi.hProcess); + return 0; + +#else /* !HAVE_W32_SYSTEM */ + gpg_error_t err; + int fd, fdout, rp[2]; + + *statusfile = NULL; + *pid = (pid_t)(-1); + fflush (infile); + rewind (infile); + fd = fileno (infile); + fdout = fileno (outfile); + if (fd == -1 || fdout == -1) + log_fatal ("no file descriptor for file passed to gnupg_spawn_process\n"); + + if (pipe (rp) == -1) + { + err = gpg_error_from_errno (errno); + log_error (_("error creating a pipe: %s\n"), strerror (errno)); + return err; + } + +#ifdef USE_GNU_PTH + *pid = pth_fork? pth_fork () : fork (); +#else + *pid = fork (); +#endif + if (*pid == (pid_t)(-1)) + { + err = gpg_error_from_errno (errno); + log_error (_("error forking process: %s\n"), strerror (errno)); + close (rp[0]); + close (rp[1]); + return err; + } + + if (!*pid) + { + /* Child. */ + char **arg_list; + int n, i, j; + + /* Create the command line argument array. */ + for (i=0; argv[i]; i++) + ; + arg_list = xcalloc (i+2, sizeof *arg_list); + arg_list[0] = strrchr (pgmname, '/'); + if (arg_list[0]) + arg_list[0]++; + else + arg_list[0] = xstrdup (pgmname); + for (i=0,j=1; argv[i]; i++, j++) + arg_list[j] = (char*)argv[i]; + + /* Connect the infile to stdin. */ + if (fd != 0 && dup2 (fd, 0) == -1) + log_fatal ("dup2 stdin failed: %s\n", strerror (errno)); + + /* Connect the outfile to stdout. */ + if (fdout != 1 && dup2 (fdout, 1) == -1) + log_fatal ("dup2 stdout failed: %s\n", strerror (errno)); + + /* Connect stderr to our pipe. */ + if (rp[1] != 2 && dup2 (rp[1], 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; + + if (preexec) + preexec (); + execv (pgmname, arg_list); + /* No way to print anything, as we have closed all streams. */ + _exit (127); + } + + /* Parent. */ + close (rp[1]); + + *statusfile = fdopen (rp[0], "r"); + if (!*statusfile) + { + err = gpg_error_from_errno (errno); + log_error (_("can't fdopen pipe for reading: %s\n"), strerror (errno)); + kill (*pid, SIGTERM); + *pid = (pid_t)(-1); + return err; + } + + return 0; +#endif /* !HAVE_W32_SYSTEM */ +} + + +/* Wait for the process identified by PID to terminate. PGMNAME should + be the same as suplieed to the spawn fucntion and is only used for + diagnostics. Returns 0 if the process succeded, GPG_ERR_GENERAL for + any failures of the spawned program or other error codes.*/ +gpg_error_t +gnupg_wait_process (const char *pgmname, pid_t pid) +{ + gpg_err_code_t ec; + +#ifdef HAVE_W32_SYSTEM + HANDLE proc = fd_to_handle (pid); + int code; + DWORD exc; + + if (pid == (pid_t)(-1)) + return gpg_error (GPG_ERR_INV_VALUE); + + /* FIXME: We should do a pth_waitpid here. However this has not yet + been implemented. A special W32 pth system call would even be + better. */ + code = WaitForSingleObject (proc, INFINITE); + switch (code) + { + case WAIT_FAILED: + log_error (_("waiting for process %d to terminate failed: %s\n"), + (int)pid, w32_strerror (-1)); + ec = GPG_ERR_GENERAL; + break; + + case WAIT_OBJECT_0: + if (!GetExitCodeProcess (proc, &exc)) + { + log_error (_("error getting exit code of process %d: %s\n"), + (int)pid, w32_strerror (-1) ); + ec = GPG_ERR_GENERAL; + } + else if (exc) + { + log_error (_("error running `%s': exit status %d\n"), + pgmname, (int)exc ); + ec = GPG_ERR_GENERAL; + } + else + ec = 0; + break; + + default: + log_error ("WaitForSingleObject returned unexpected " + "code %d for pid %d\n", code, (int)pid ); + ec = GPG_ERR_GENERAL; + break; + } + +#else /* !HAVE_W32_SYSTEM */ + int i, status; + + if (pid == (pid_t)(-1)) + return gpg_error (GPG_ERR_INV_VALUE); + +#ifdef USE_GNU_PTH + i = pth_waitpid ? pth_waitpid (pid, &status, 0) : waitpid (pid, &status, 0); +#else + while ( (i=waitpid (pid, &status, 0)) == -1 && errno == EINTR) + ; +#endif + if (i == (pid_t)(-1)) + { + log_error (_("waiting for process %d to terminate failed: %s\n"), + (int)pid, strerror (errno)); + ec = gpg_err_code_from_errno (errno); + } + else if (WIFEXITED (status) && WEXITSTATUS (status) == 127) + { + log_error (_("error running `%s': probably not installed\n"), pgmname); + ec = GPG_ERR_CONFIGURATION; + } + else if (WIFEXITED (status) && WEXITSTATUS (status)) + { + log_error (_("error running `%s': exit status %d\n"), pgmname, + WEXITSTATUS (status)); + ec = GPG_ERR_GENERAL; + } + else if (!WIFEXITED (status)) + { + log_error (_("error running `%s': terminated\n"), pgmname); + ec = GPG_ERR_GENERAL; + } + else + ec = 0; +#endif /* !HAVE_W32_SYSTEM */ + + return gpg_err_make (GPG_ERR_SOURCE_DEFAULT, ec); + +} + diff --git a/common/exechelp.h b/common/exechelp.h new file mode 100644 index 000000000..1df029b7e --- /dev/null +++ b/common/exechelp.h @@ -0,0 +1,46 @@ +/* exechelp.h - Definitions for the fork and exec helpers + * 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 GNUPG_COMMON_EXECHELP_H +#define GNUPG_COMMON_EXECHELP_H + + + +/* Fork and exec the PGMNAME, connect the file descriptor of INFILE to + stdin, write the output to OUTFILE, return a new stream in + STATUSFILE for stderr and the pid of the process in PID. The + arguments for the process are expected in the NULL terminated array + ARGV. The program name itself should not be included there. if + PREEXEC is not NULL, that function will be called right before the + exec. Returns 0 on success or an error code. */ +gpg_error_t gnupg_spawn_process (const char *pgmname, const char *argv[], + FILE *infile, FILE *outfile, + void (*preexec)(void), + FILE **statusfile, pid_t *pid); + +/* Wait for the process identified by PID to terminate. PGMNAME should + be the same as suplieed to the spawn fucntion and is only used for + diagnostics. Returns 0 if the process succeded, GPG_ERR_GENERAL for + any failures of the spawned program or other error codes.*/ +gpg_error_t gnupg_wait_process (const char *pgmname, pid_t pid); + + +#endif /*GNUPG_COMMON_EXECHELP_H*/ diff --git a/common/gettime.c b/common/gettime.c new file mode 100644 index 000000000..c4ea3283a --- /dev/null +++ b/common/gettime.c @@ -0,0 +1,305 @@ +/* gettime.c - Wrapper for time functions + * Copyright (C) 1998, 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 +#include +#include +#ifdef HAVE_LANGINFO_H +#include +#endif + +#include "util.h" + +static unsigned long timewarp; +static enum { NORMAL = 0, FROZEN, FUTURE, PAST } timemode; + +/* Wrapper for the time(3). We use this here so we can fake the time + for tests */ +time_t +gnupg_get_time () +{ + time_t current = time (NULL); + if (timemode == NORMAL) + return current; + else if (timemode == FROZEN) + return timewarp; + else if (timemode == FUTURE) + return current + timewarp; + else + return current - timewarp; +} + + +/* Return the current time (possibly faked) in ISO format. */ +void +gnupg_get_isotime (gnupg_isotime_t timebuf) +{ + time_t atime = gnupg_get_time (); + + if (atime < 0) + *timebuf = 0; + else + { + struct tm *tp; +#ifdef HAVE_GMTIME_R + struct tm tmbuf; + + tp = gmtime_r (&atime, &tmbuf); +#else + tp = gmtime (&atime); +#endif + sprintf (timebuf,"%04d%02d%02dT%02d%02d%02d", + 1900 + tp->tm_year, tp->tm_mon+1, tp->tm_mday, + tp->tm_hour, tp->tm_min, tp->tm_sec); + } +} + + +/* set the time to NEWTIME so that gnupg_get_time returns a time + starting with this one. With FREEZE set to 1 the returned time + will never change. Just for completeness, a value of (time_t)-1 + for NEWTIME gets you back to rality. Note that this is obviously + not thread-safe but this is not required. */ +void +gnupg_set_time (time_t newtime, int freeze) +{ + time_t current = time (NULL); + + if ( newtime == (time_t)-1 || current == newtime) + { + timemode = NORMAL; + timewarp = 0; + } + else if (freeze) + { + timemode = FROZEN; + timewarp = current; + } + else if (newtime > current) + { + timemode = FUTURE; + timewarp = newtime - current; + } + else + { + timemode = PAST; + timewarp = current - newtime; + } +} + +/* Returns true when we are in timewarp mode */ +int +gnupg_faked_time_p (void) +{ + return timemode; +} + + +/* This function is used by gpg because OpenPGP defines the timestamp + as an unsigned 32 bit value. */ +u32 +make_timestamp (void) +{ + time_t t = gnupg_get_time (); + + if (t == (time_t)-1) + log_fatal ("gnupg_get_time() failed\n"); + return (u32)t; +} + + + +/**************** + * 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; +} + + +u32 +add_days_to_timestamp( u32 stamp, u16 days ) +{ + return stamp + days*86400L; +} + + +/**************** + * 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"); + /* NOTE: gcc -Wformat-noliteral will complain here. I have + found no way to suppress this warning .*/ + 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, "%c %Z", tp ); +#endif + buffer[DIM(buffer)-1] = 0; +#else + mem2str( buffer, asctime(tp), DIM(buffer) ); +#endif + return buffer; +} + + + + + + + + + + + + + + diff --git a/common/homedir.c b/common/homedir.c new file mode 100644 index 000000000..39d6dce20 --- /dev/null +++ b/common/homedir.c @@ -0,0 +1,126 @@ +/* homedir.c - Setup the home directory. + * Copyright (C) 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 +#include +#include +#include + +#ifdef HAVE_W32_SYSTEM +#include +#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 +#endif /*HAVE_W32_SYSTEM*/ + + + +#include "util.h" +#include "sysutils.h" + + +/* 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. */ +const char * +default_homedir (void) +{ + const 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 services might be better than to let + them do it manually. A security conscious user will anyway + use the registry entry to have better control. */ + if (w32_shgetfolderpath (NULL, CSIDL_APPDATA|CSIDL_FLAG_CREATE, + NULL, 0, path) >= 0) + { + char *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_DEFAULT_HOMEDIR; + + return dir; +} diff --git a/cipher/dsa.h b/common/i18n.h similarity index 54% rename from cipher/dsa.h rename to common/i18n.h index 6902b548c..0187ba265 100644 --- a/cipher/dsa.h +++ b/common/i18n.h @@ -1,5 +1,5 @@ -/* dsa.h - DSA signature algorithm - * Copyright (C) 1998 Free Software Foundation, Inc. +/* i18n.h + * Copyright (C) 1998, 2001 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -19,15 +19,30 @@ * USA. */ -#ifndef G10_DSA_H -#define G10_DSA_H +#ifndef GNUPG_COMMON_I18N_H +#define GNUPG_COMMON_I18N_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 ); +#ifdef USE_SIMPLE_GETTEXT + int set_gettext_file( const char *filename ); + const char *gettext( const char *msgid ); +# define _(a) gettext (a) +# define N_(a) (a) +#else +# ifdef HAVE_LOCALE_H +# include +# endif +# ifdef ENABLE_NLS +# include +# 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_DSA_H*/ +#endif /*GNUPG_COMMON_I18N_H*/ diff --git a/common/iobuf.c b/common/iobuf.c new file mode 100644 index 000000000..8f7374f8c --- /dev/null +++ b/common/iobuf.c @@ -0,0 +1,2467 @@ +/* iobuf.c - file handling + * Copyright (C) 1998, 1999, 2000, 2001, 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_DOSISH_SYSTEM +#include +#endif +#ifdef __riscos__ +#include +#include +#endif /* __riscos__ */ + +#include "memory.h" +#include "util.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_t a); +static int translate_file_handle (int fd, int for_write); + +#ifndef FILE_FILTER_USES_STDIO + +/* + * Invalidate (i.e. close) a cached iobuf + */ +static void +fd_cache_invalidate (const char *fname) +{ + CLOSE_CACHE cc; + + assert (fname); + if (DBG_IOBUF) + log_debug ("fd_cache_invalidate (%s)\n", fname); + + for (cc = close_cache; cc; cc = cc->next) + { + if (cc->fp != INVALID_FP && !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 && !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 = xcalloc (1, 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 && !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: ec=%d\n", + fp, (int) GetLastError ()); + 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 + * GPG_ERR_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_t 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) + { + rc = gpg_error_from_errno (errno); + log_error ("%s: read error: %s\n", a->fname, strerror (errno)); + } + *ret_len = nbytes; + } + } + else if (control == IOBUFCTRL_FLUSH) + { + if (size) + { + clearerr (f); + nbytes = fwrite (buf, 1, size, f); + if (ferror (f)) + { + rc = gpg_error_from_errno (errno); + log_error ("%s: write error: %s\n", a->fname, strerror (errno)); + } + } + *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)) + { + int ec = (int) GetLastError (); + if (ec != ERROR_BROKEN_PIPE) + { + rc = gpg_error_from_errno (ec); + log_error ("%s: read error: ec=%d\n", a->fname, ec); + } + } + 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) + { + rc = gpg_error_from_errno (errno); + log_error ("%s: read error: %s\n", + a->fname, strerror (errno)); + } + } + 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)) + { + int ec = (int) GetLastError (); + rc = gpg_error_from_errno (ec); + log_error ("%s: write error: ec=%d\n", a->fname, ec); + 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) + { + rc = gpg_error_from_errno (errno); + log_error ("%s: write error: %s\n", a->fname, strerror (errno)); + } + 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_t 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 (); + rc = gpg_error_from_errno (ec); + log_error ("socket read error: ec=%d\n", ec); + } + 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 (); + rc = gpg_error_from_errno (ec); + log_error ("socket write error: ec=%d\n", ec); + 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_t chain, byte * buffer, + size_t * ret_len) +{ + block_filter_ctx_t *a = opaque; + char *buf = (char *)buffer; + 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 = GPG_ERR_BAD_DATA; + 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 = GPG_ERR_BAD_DATA; + 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 = GPG_ERR_BAD_DATA; + 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 = GPG_ERR_BAD_DATA; + } + 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 = gpg_error_from_errno (errno); + a->buflen = 0; + nbytes -= n; + } + if ((n = nbytes) > blen) + n = blen; + if (n && iobuf_write (chain, p, n)) + rc = gpg_error_from_errno (errno); + 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 = gpg_error_from_errno (errno); + } + 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_t 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_t 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_t +iobuf_alloc (int use, size_t bufsize) +{ + iobuf_t a; + static int number = 0; + + a = xcalloc (1, 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_t a) +{ + iobuf_t 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", gpg_strerror (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", gpg_strerror (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_t a) +{ + const char *s; + iobuf_t 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_t +iobuf_temp () +{ + iobuf_t a; + + a = iobuf_alloc (3, 8192); + + return a; +} + +iobuf_t +iobuf_temp_with_content (const char *buffer, size_t length) +{ + iobuf_t 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 form "-&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_t +iobuf_open (const char *fname) +{ + iobuf_t 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, 8192); + 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_t +iobuf_fdopen (int fd, const char *mode) +{ + iobuf_t 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, 8192); + 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_t +iobuf_sockopen (int fd, const char *mode) +{ + iobuf_t a; +#ifdef _WIN32 + sock_filter_ctx_t *scx; + size_t len; + + a = iobuf_alloc (strchr (mode, 'w') ? 2 : 1, 8192); + 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_t +iobuf_create (const char *fname) +{ + iobuf_t 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, 8192); + 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_t +iobuf_append (const char *fname) +{ + iobuf_t 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, 8192); + fcx = m_alloc (sizeof *fcx + strlen (fname)); + fcx->fp = fp; + strcpy (fcx->fname, fname); + a->real_fname = m_strdup (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_t +iobuf_openrw (const char *fname) +{ + iobuf_t 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, 8192); + 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_t 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 : "?"); + if (!a && !intval && ptrval) + { +#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_t a, + int (*f) (void *opaque, int control, + iobuf_t chain, byte * buf, size_t * len), + void *ov) +{ + return iobuf_push_filter2 (a, f, ov, 0); +} + +int +iobuf_push_filter2 (iobuf_t a, + int (*f) (void *opaque, int control, + iobuf_t chain, byte * buf, size_t * len), + void *ov, int rel_ov) +{ + iobuf_t 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", gpg_strerror (rc)); + return rc; +} + +/**************** + * Remove an i/o filter. + */ +static int +pop_filter (iobuf_t a, int (*f) (void *opaque, int control, + iobuf_t chain, byte * buf, size_t * len), + void *ov) +{ + iobuf_t 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", gpg_strerror (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", gpg_strerror (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_t 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_t 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 = gpg_error_from_errno (errno); + } + 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", gpg_strerror (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_t 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 = rc; + + 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_t a) +{ + size_t len; + int rc; + + if (a->directfp) + return 0; + + if (a->use == 3) + { /* increase the temp buffer */ + unsigned char *newbuf; + size_t newsize = a->d.size + 8192; + + 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 = GPG_ERR_INTERNAL; + } + else if (rc) + a->error = rc; + a->d.len = 0; + + return rc; +} + + +/**************** + * Read a byte from the iobuf; returns -1 on EOF + */ +int +iobuf_readbyte (iobuf_t 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_t a, void *buffer, unsigned int buflen) +{ + unsigned char *buf = (unsigned char *)buffer; + 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_t 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_t a, unsigned int c) +{ + int rc; + + if (a->directfp) + BUG (); + + if (a->d.len == a->d.size) + if ((rc=iobuf_flush (a))) + return rc; + + assert (a->d.len < a->d.size); + a->d.buf[a->d.len++] = c; + return 0; +} + + +int +iobuf_write (iobuf_t a, const void *buffer, unsigned int buflen) +{ + const unsigned char *buf = (const unsigned char *)buffer; + int rc; + + 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) + { + rc = iobuf_flush (a); + if (rc) + return rc; + } + } + while (buflen); + return 0; +} + + +int +iobuf_writestr (iobuf_t a, const char *buf) +{ + int rc; + + for (; *buf; buf++) + if ((rc=iobuf_writebyte (a, *buf))) + return rc; + return 0; +} + + + +/**************** + * copy the contents of TEMP to A. + */ +int +iobuf_write_temp (iobuf_t a, iobuf_t 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_t 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_t 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_t 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_t 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_t 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_t a) +{ + return a->ntotal + a->nbytes; +} + + +#if !defined(HAVE_FSEEKO) && !defined(fseeko) + +#ifdef HAVE_LIMITS_H +# include +#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_t 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: ec=%d\n", + b->fp, (int) GetLastError ()); + 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_t 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_t 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_t a, size_t len) +{ + block_filter_ctx_t *ctx = xcalloc (1, 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 int +iobuf_read_line (iobuf_t a, byte ** addr_of_buffer, + unsigned *length_of_buffer, unsigned *max_length) +{ + int c; + char *buffer = (char *)*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 = (unsigned char *)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 = (unsigned char *)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: ec=%d\n", + fd, (int) GetLastError ()); + + fd = x; + } +#endif +#endif + return fd; +} + + +void +iobuf_skip_rest (iobuf_t 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/common/iobuf.h b/common/iobuf.h new file mode 100644 index 000000000..a3dd7f1c5 --- /dev/null +++ b/common/iobuf.h @@ -0,0 +1,174 @@ +/* iobuf.h - I/O buffer + * 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. + */ + +#ifndef GNUPG_COMMON_IOBUF_H +#define GNUPG_COMMON_IOBUF_H + +#include "../include/types.h" /* fixme: should be moved elsewhere. */ + + +#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_t; +typedef struct iobuf_struct *IOBUF; /* Compatibility with gpg 1.4. */ + +/* 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_t chain, byte * buf, size_t * len); + void *filter_ov; /* value for opaque */ + int filter_ov_owner; + char *real_fname; + iobuf_t 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_t iobuf_alloc (int use, size_t bufsize); +iobuf_t iobuf_temp (void); +iobuf_t iobuf_temp_with_content (const char *buffer, size_t length); +iobuf_t iobuf_open (const char *fname); +iobuf_t iobuf_fdopen (int fd, const char *mode); +iobuf_t iobuf_sockopen (int fd, const char *mode); +iobuf_t iobuf_create (const char *fname); +iobuf_t iobuf_append (const char *fname); +iobuf_t iobuf_openrw (const char *fname); +int iobuf_ioctl (iobuf_t a, int cmd, int intval, void *ptrval); +int iobuf_close (iobuf_t iobuf); +int iobuf_cancel (iobuf_t iobuf); + +int iobuf_push_filter (iobuf_t a, int (*f) (void *opaque, int control, + iobuf_t chain, byte * buf, + size_t * len), void *ov); +int iobuf_push_filter2 (iobuf_t a, + int (*f) (void *opaque, int control, iobuf_t chain, + byte * buf, size_t * len), void *ov, + int rel_ov); +int iobuf_flush (iobuf_t a); +void iobuf_clear_eof (iobuf_t a); +#define iobuf_set_error(a) do { (a)->error = 1; } while(0) +#define iobuf_error(a) ((a)->error) + +void iobuf_set_limit (iobuf_t a, off_t nlimit); + +off_t iobuf_tell (iobuf_t a); +int iobuf_seek (iobuf_t a, off_t newpos); + +int iobuf_readbyte (iobuf_t a); +int iobuf_read (iobuf_t a, void *buf, unsigned buflen); +unsigned iobuf_read_line (iobuf_t a, byte ** addr_of_buffer, + unsigned *length_of_buffer, unsigned *max_length); +int iobuf_peek (iobuf_t a, byte * buf, unsigned buflen); +int iobuf_writebyte (iobuf_t a, unsigned c); +int iobuf_write (iobuf_t a, const void *buf, unsigned buflen); +int iobuf_writestr (iobuf_t a, const char *buf); + +void iobuf_flush_temp (iobuf_t temp); +int iobuf_write_temp (iobuf_t a, iobuf_t temp); +size_t iobuf_temp_to_buffer (iobuf_t a, byte * buffer, size_t buflen); +void iobuf_unget_and_close_temp (iobuf_t a, iobuf_t temp); + +off_t iobuf_get_filelength (iobuf_t a, int *overflow); +#define IOBUF_FILELENGTH_LIMIT 0xffffffff +int iobuf_get_fd (iobuf_t a); +const char *iobuf_get_real_fname (iobuf_t a); +const char *iobuf_get_fname (iobuf_t a); + +void iobuf_set_partial_block_mode (iobuf_t a, size_t len); + +int iobuf_translate_file_handle (int fd, int for_write); + +void iobuf_skip_rest (iobuf_t a, unsigned long n, int partial); + + +/* 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 ) + +#endif /*GNUPG_COMMON_IOBUF_H*/ diff --git a/util/isascii.c b/common/isascii.c similarity index 100% rename from util/isascii.c rename to common/isascii.c diff --git a/common/maperror.c b/common/maperror.c new file mode 100644 index 000000000..06546b501 --- /dev/null +++ b/common/maperror.c @@ -0,0 +1,105 @@ +/* maperror.c - Error mapping + * 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. + */ + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "util.h" +#include "errors.h" + + +/* Map Assuan error code ERR to an GPG_ERR_ code. We need to + distinguish between genuine (and legacy) Assuan error codes and + application error codes shared with all GnuPG modules. The rule is + simple: All errors with a gpg_err_source of UNKNOWN are genuine + Assuan codes all others are passed verbatim through. */ +gpg_error_t +map_assuan_err_with_source (int source, int err) +{ + gpg_err_code_t ec; + + if (gpg_err_source (err)) + return err; + + switch (err) + { + case -1: ec = GPG_ERR_EOF; break; + case 0: ec = 0; break; + + case ASSUAN_Canceled: ec = GPG_ERR_CANCELED; break; + case ASSUAN_Invalid_Index: ec = GPG_ERR_INV_INDEX; break; + + case ASSUAN_Not_Implemented: ec = GPG_ERR_NOT_IMPLEMENTED; break; + case ASSUAN_Server_Fault: ec = GPG_ERR_ASSUAN_SERVER_FAULT; break; + case ASSUAN_No_Public_Key: ec = GPG_ERR_NO_PUBKEY; break; + case ASSUAN_No_Secret_Key: ec = GPG_ERR_NO_SECKEY; break; + + case ASSUAN_Cert_Revoked: ec = GPG_ERR_CERT_REVOKED; break; + case ASSUAN_No_CRL_For_Cert: ec = GPG_ERR_NO_CRL_KNOWN; break; + case ASSUAN_CRL_Too_Old: ec = GPG_ERR_CRL_TOO_OLD; break; + + case ASSUAN_Not_Trusted: ec = GPG_ERR_NOT_TRUSTED; break; + + case ASSUAN_Card_Error: ec = GPG_ERR_CARD; break; + case ASSUAN_Invalid_Card: ec = GPG_ERR_INV_CARD; break; + case ASSUAN_No_PKCS15_App: ec = GPG_ERR_NO_PKCS15_APP; break; + case ASSUAN_Card_Not_Present: ec= GPG_ERR_CARD_NOT_PRESENT; break; + case ASSUAN_Not_Confirmed: ec = GPG_ERR_NOT_CONFIRMED; break; + case ASSUAN_Invalid_Id: ec = GPG_ERR_INV_ID; break; + + case ASSUAN_Locale_Problem: ec = GPG_ERR_LOCALE_PROBLEM; break; + + default: + ec = err < 100? GPG_ERR_ASSUAN_SERVER_FAULT : GPG_ERR_ASSUAN; + break; + } + return gpg_err_make (source, ec); +} + +/* Map GPG_xERR_xx error codes to Assuan status codes */ +int +map_to_assuan_status (int rc) +{ + gpg_err_code_t ec = gpg_err_code (rc); + gpg_err_source_t es = gpg_err_source (rc); + + if (!rc) + return 0; + if (!es) + { + es = GPG_ERR_SOURCE_USER_4; /* This should not happen, but we + need to make sure to pass a new + Assuan errorcode along. */ + log_debug ("map_to_assuan_status called with no error source\n"); + } + + if (ec == -1) + ec = GPG_ERR_NO_DATA; /* That used to be ASSUAN_No_Data_Available. */ + + return gpg_err_make (es, ec); +} diff --git a/util/membuf.c b/common/membuf.c similarity index 81% rename from util/membuf.c rename to common/membuf.c index 44347fa1b..2d35fefab 100644 --- a/util/membuf.c +++ b/common/membuf.c @@ -22,7 +22,8 @@ #include #include #include -#include + +#include "membuf.h" #include "util.h" @@ -39,7 +40,7 @@ init_membuf (membuf_t *mb, int initiallen) mb->len = 0; mb->size = initiallen; mb->out_of_core = 0; - mb->buf = xmalloc (initiallen); + mb->buf = xtrymalloc (initiallen); if (!mb->buf) mb->out_of_core = errno; } @@ -56,7 +57,17 @@ put_membuf (membuf_t *mb, const void *buf, size_t len) char *p; mb->size += len + 1024; - p = xrealloc (mb->buf, mb->size); + p = xtryrealloc (mb->buf, mb->size); + if (!p) + { + mb->out_of_core = errno; + /* Wipe out what we already accumulated. This is required + in case we are storing sensitive data here. The membuf + API does not provide another way to cleanup after an + error. */ + memset (mb->buf, 0, mb->len); + return; + } mb->buf = p; } memcpy (mb->buf + mb->len, buf, len); diff --git a/common/membuf.h b/common/membuf.h new file mode 100644 index 000000000..9033be61e --- /dev/null +++ b/common/membuf.h @@ -0,0 +1,42 @@ +/* membuf.h - 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. + */ + +#ifndef GNUPG_COMMON_MEMBUF_H +#define GNUPG_COMMON_MEMBUF_H + +/* 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); + + +#endif /*GNUPG_COMMON_MEMBUF_H*/ diff --git a/common/miscellaneous.c b/common/miscellaneous.c new file mode 100644 index 000000000..da74f65bc --- /dev/null +++ b/common/miscellaneous.c @@ -0,0 +1,151 @@ +/* miscellaneous.c - Stuff not fitting elsewhere + * Copyright (C) 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 +#include +#include + +#include "util.h" +#include "iobuf.h" + + +/* Decide whether the filename is stdout or a real filename and return + * an appropriate string. */ +const char * +print_fname_stdout (const char *s) +{ + if( !s || (*s == '-' && !s[1]) ) + return "[stdout]"; + return s; +} + + +/* Decide whether the filename is stdin or a real filename and return + * an appropriate string. */ +const char * +print_fname_stdin (const char *s) +{ + if( !s || (*s == '-' && !s[1]) ) + return "[stdin]"; + return s; +} + +/* fixme: Globally replace it by print_sanitized_buffer. */ +void +print_string( FILE *fp, const byte *p, size_t n, int delim ) +{ + print_sanitized_buffer (fp, p, n, delim); +} + +void +print_utf8_string2 ( FILE *fp, const byte *p, size_t n, int delim ) +{ + print_sanitized_utf8_buffer (fp, p, n, delim); +} + +void +print_utf8_string( FILE *fp, const byte *p, size_t n ) +{ + print_utf8_string2 (fp, p, n, 0); +} + +char * +make_printable_string (const void *p, size_t n, int delim ) +{ + return sanitize_buffer (p, n, delim); +} + + +/* + * Check if the file is compressed. + */ +int +is_file_compressed (const char *s, int *ret_rc) +{ + iobuf_t 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 = gpg_error_from_errno (errno); + return 0; + } + + if ( iobuf_get_filelength( a, &overflow ) < 4 && !overflow) { + *ret_rc = 0; + goto leave; + } + + if ( iobuf_read( a, buf, 4 ) == -1 ) { + *ret_rc = a->error; + 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; +} + + +/* 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/common/mkerrors b/common/mkerrors new file mode 100755 index 000000000..994c61352 --- /dev/null +++ b/common/mkerrors @@ -0,0 +1,73 @@ +#!/bin/sh +# mkerrors - Extract error strings from errors.h +# and create C source for gnupg_strerror +# 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. + +cat < +#include +#include "errors.h" + +/** + * gnupg_strerror: + * @err: Error code + * + * This function returns a textual representaion of the given + * errorcode. 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 * +gnupg_strerror (int err) +{ + const char *s; + static char buf[25]; + + switch (err) + { +EOF + +awk ' +/GNUPG_No_Error/ { okay=1 } +!okay {next} +/}/ { exit 0 } +/GNUPG_[A-Za-z_]*/ { print_code($1) } + + +function print_code( s ) +{ +printf " case %s: s=\"", s ; +gsub(/_/, " ", s ); +printf "%s\"; break;\n", tolower(substr(s,7)); +} +' + +cat < + +/* Return the length of the next S-Exp part and update the pointer to + the first data byte. 0 is returned on error */ +static inline size_t +snext (unsigned char const **buf) +{ + const unsigned char *s; + int n; + + s = *buf; + for (n=0; *s && *s != ':' && (*s >= '0' && *s <= '9'); s++) + n = n*10 + (*s - '0'); + if (!n || *s != ':') + return 0; /* we don't allow empty lengths */ + *buf = s+1; + return n; +} + +/* Skip over the S-Expression BUF points to and update BUF to point to + the chacter right behind. DEPTH gives the initial number of open + lists and may be passed as a positive number to skip over the + remainder of an S-Expression if the current position is somewhere + in an S-Expression. The function may return an error code if it + encounters an impossible conditions */ +static inline gpg_error_t +sskip (unsigned char const **buf, int *depth) +{ + const unsigned char *s = *buf; + size_t n; + int d = *depth; + + while (d > 0) + { + if (*s == '(') + { + d++; + s++; + } + else if (*s == ')') + { + d--; + s++; + } + else + { + if (!d) + return gpg_error (GPG_ERR_INV_SEXP); + n = snext (&s); + if (!n) + return gpg_error (GPG_ERR_INV_SEXP); + s += n; + } + } + *buf = s; + *depth = d; + return 0; +} + + +/* Check whether the the string at the address BUF points to matches + the token. Return true on match and update BUF to point behind the + token. Return false and dont update tha buffer if it does not + match. */ +static inline int +smatch (unsigned char const **buf, size_t buflen, const char *token) +{ + size_t toklen = strlen (token); + + if (buflen != toklen || memcmp (*buf, token, toklen)) + return 0; + *buf += toklen; + return 1; +} + +#endif /*SEXP_PARSE_H*/ diff --git a/common/sexputil.c b/common/sexputil.c new file mode 100644 index 000000000..fe0870c56 --- /dev/null +++ b/common/sexputil.c @@ -0,0 +1,145 @@ +/* sexputil.c - Utility fnctions for S-expressions. + * 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. + */ + +/* This file implements a few utility functions useful when working + with canonical encrypted S-expresions (i.e. not the S-exprssion + objects from libgcrypt). */ + +#include +#include +#include +#include +#include +#include +#ifdef HAVE_LOCALE_H +#include +#endif + +#include "util.h" + + +/* Return the so called "keygrip" which is the SHA-1 hash of the + public key parameters expressed in a way depended on the algorithm. + + KEY is expected to be an canonical encoded S-expression with a + public or private key. KEYLEN is the length of that buffer. + + GRIP must be at least 20 bytes long On success 0 is return, on + error an aerror code. */ +gpg_error_t +keygrip_from_canon_sexp (const unsigned char *key, size_t keylen, + unsigned char *grip) +{ + gpg_error_t err; + gcry_sexp_t sexp; + + if (!grip) + return gpg_error (GPG_ERR_INV_VALUE); + err = gcry_sexp_sscan (&sexp, NULL, (const char *)key, keylen); + if (err) + return err; + if (!gcry_pk_get_keygrip (sexp, grip)) + err = gpg_error (GPG_ERR_INTERNAL); + gcry_sexp_release (sexp); + return err; +} + + +/* Compare two simple S-expressions like "(3:foo)". Returns 0 if they + are identical or !0 if they are not. Not that this function can't + be used for sorting. */ +int +cmp_simple_canon_sexp (const unsigned char *a_orig, + const unsigned char *b_orig) +{ + const char *a = (const char *)a_orig; + const char *b = (const char *)b_orig; + unsigned long n1, n2; + char *endp; + + if (!a && !b) + return 0; /* Both are NULL, they are identical. */ + if (!a || !b) + return 1; /* One is NULL, they are not identical. */ + if (*a != '(' || *b != '(') + log_bug ("invalid S-exp in cmp_simple_canon_sexp\n"); + + a++; + n1 = strtoul (a, &endp, 10); + a = endp; + b++; + n2 = strtoul (b, &endp, 10); + b = endp; + + if (*a != ':' || *b != ':' ) + log_bug ("invalid S-exp in cmp_simple_canon_sexp\n"); + if (n1 != n2) + return 1; /* Not the same. */ + + for (a++, b++; n1; n1--, a++, b++) + if (*a != *b) + return 1; /* Not the same. */ + return 0; +} + + +/* Create a simple S-expression from the hex string at LIBNE. Returns + a newly allocated buffer with that canonical encoded S-expression + or NULL in case of an error. On return the number of characters + scanned in LINE will be stored at NSCANNED. This fucntions stops + converting at the first character not representing a hexdigit. Odd + numbers of hex digits are allowed; a leading zero is then + assumed. If no characters have been found, NULL is returned.*/ +unsigned char * +make_simple_sexp_from_hexstr (const char *line, size_t *nscanned) +{ + size_t n, len; + const char *s; + unsigned char *buf; + unsigned char *p; + char numbuf[50]; + + for (n=0, s=line; hexdigitp (s); s++, n++) + ; + if (nscanned) + *nscanned = n; + if (!n) + return NULL; + len = ((n+1) & ~0x01)/2; + sprintf (numbuf, "(%u:", (unsigned int)len); + buf = xtrymalloc (strlen (numbuf) + len + 1 + 1); + if (!buf) + return NULL; + p = (unsigned char *)stpcpy ((char *)buf, numbuf); + s = line; + if ((n&1)) + { + *p++ = xtoi_1 (s); + s++; + n--; + } + for (; n > 1; n -=2, s += 2) + *p++ = xtoi_2 (s); + *p++ = ')'; + *p = 0; /* (Not really neaded.) */ + + return buf; +} diff --git a/common/signal.c b/common/signal.c new file mode 100644 index 000000000..0c79214b2 --- /dev/null +++ b/common/signal.c @@ -0,0 +1,259 @@ +/* signal.c - signal handling + * 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 +#include +#include +#include +#include +#include +#include +#include + +#include "util.h" + + +#ifndef HAVE_DOSISH_SYSTEM +static volatile int caught_fatal_sig; +static volatile int caught_sigusr1; +#endif +static void (*cleanup_fnc)(void); + + +#ifndef HAVE_DOSISH_SYSTEM +static void +init_one_signal (int sig, RETSIGTYPE (*handler)(int), int check_ign ) +{ +# ifdef HAVE_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 +} +#endif /*!HAVE_DOSISH_SYSTEM*/ + +#ifndef HAVE_DOSISH_SYSTEM +static const char * +get_signal_name( int signum ) +{ + /* Note that we can't use strsignal(), because it is not + reentrant. */ +#if HAVE_DECL_SYS_SIGLIST && defined(NSIG) + return (signum >= 0 && signum < NSIG) ? sys_siglist[signum] : "?"; +#else + return NULL; +#endif +} +#endif /*!HAVE_DOSISH_SYSTEM*/ + +#ifndef HAVE_DOSISH_SYSTEM +static RETSIGTYPE +got_fatal_signal (int sig) +{ + const char *s; + + if (caught_fatal_sig) + raise (sig); + caught_fatal_sig = 1; + + if (cleanup_fnc) + cleanup_fnc (); + /* Better don't translate these messages. */ + write (2, "\n", 1 ); + s = log_get_prefix (NULL); + if (s) + write(2, s, strlen (s)); + write (2, ": signal ", 9 ); + s = get_signal_name(sig); + if (s) + write (2, s, strlen(s) ); + else + { + /* We are in a signal handler so we can't use any kind of printf + even not sprintf. USe a straightforward algorithm. */ + if (sig < 0 || sig >= 100000) + write (2, "?", 1); + else + { + int i, any=0; + + for (i=10000; i; i /= 10) + { + if (sig >= i || ((any || i==1) && !(sig/i))) + { + write (2, "0123456789"+(sig/i), 1); + if ((sig/i)) + any = 1; + sig %= i; + } + } + } + } + write (2, " caught ... exiting\n", 20); + + /* Reset action to default action and raise signal again */ + init_one_signal (sig, SIG_DFL, 0); + /* Fixme: remove_lockfiles ();*/ +#ifdef __riscos__ + close_fds (); +#endif /* __riscos__ */ + raise( sig ); +} +#endif /*!HAVE_DOSISH_SYSTEM*/ + +#ifndef HAVE_DOSISH_SYSTEM +static RETSIGTYPE +got_usr_signal (int sig) +{ + caught_sigusr1 = 1; +} +#endif /*!HAVE_DOSISH_SYSTEM*/ + +void +gnupg_init_signals (int mode, void (*fast_cleanup)(void)) +{ + assert (!mode); + + cleanup_fnc = fast_cleanup; +#ifndef HAVE_DOSISH_SYSTEM + 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 ); +#endif +} + +void +gnupg_pause_on_sigusr (int which) +{ +#ifndef HAVE_DOSISH_SYSTEM +# ifdef HAVE_SIGPROCMASK + 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; + sigrelease(SIGUSR1); +# endif /*!HAVE_SIGPROCMASK*/ +#endif +} + + +static void +do_block( int block ) +{ +#ifndef HAVE_DOSISH_SYSTEM + static int is_blocked; +#ifdef HAVE_SIGPROCMASK + 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*/ + static void (*disposition[MAXSIG])(); + int sig; + + if (block) + { + if (is_blocked) + log_bug("signals are already blocked\n"); + for (sig=1; sig < MAXSIG; 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 < MAXSIG; sig++) { + sigset (sig, disposition[sig]); + } + is_blocked = 0; + } +#endif /*!HAVE_SIGPROCMASK*/ +#endif /*HAVE_DOSISH_SYSTEM*/ +} + + +void +gnupg_block_all_signals () +{ + do_block(1); +} + +void +gnupg_unblock_all_signals () +{ + do_block(0); +} diff --git a/util/simple-gettext.c b/common/simple-gettext.c similarity index 80% rename from util/simple-gettext.c rename to common/simple-gettext.c index 3249775bf..56a305fd8 100644 --- a/util/simple-gettext.c +++ b/common/simple-gettext.c @@ -1,6 +1,5 @@ /* simple-gettext.c - a simplified version of gettext. - * Copyright (C) 1995, 1996, 1997, 1999, - * 2005 Free Software Foundation, Inc. + * Copyright (C) 1995, 1996, 1997, 1999 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -40,9 +39,9 @@ #include #include #include -#include "types.h" -#include "util.h" +#include "util.h" +#include "sysutils.h" /* The magic number of the GNU message catalog format. */ #define MAGIC 0x950412de @@ -233,14 +232,13 @@ load_domain( const char *filename ) /**************** - * 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(). + * Set the file used for translations. Pass a NULL to disable + * translation. A new filename may be set at anytime. + * WARNING: After changing the filename you should not access any data + * retrieved by gettext(). */ int -set_gettext_file ( const char *filename, const char *regkey ) +set_gettext_file( const char *filename ) { struct loaded_domain *domain = NULL; @@ -255,57 +253,30 @@ set_gettext_file ( const char *filename, const char *regkey ) /* absolute path - use it as is */ domain = load_domain( filename ); } - else if (regkey) { /* Standard. */ - char *instdir, *langid, *fname; + else { /* relative path - append ".mo" and get dir from the environment */ + char *buf = NULL; + char *dir; 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: "/.nls/.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); + dir = read_w32_registry_string( NULL, + "Control Panel\\Mingw32\\NLS", + "MODir" ); + if( dir && (buf=malloc(strlen(dir)+strlen(filename)+1+3+1)) ) { + strcpy(stpcpy(stpcpy(stpcpy( buf, dir),"\\"), filename),".mo"); + /* Better make sure that we don't mix forward and + backward slashes. It seems that some Windoze + versions don't accept this. */ + for (p=buf; *p; p++) + { + if (*p == '/') + *p = '\\'; + } + domain = load_domain( buf ); + free(buf); + } + free(dir); } - - if (!domain) + if( !domain ) return -1; } diff --git a/common/simple-pwquery.c b/common/simple-pwquery.c new file mode 100644 index 000000000..e405c1ec0 --- /dev/null +++ b/common/simple-pwquery.c @@ -0,0 +1,630 @@ +/* simple-pwquery.c - A simple password query client for gpg-agent + * Copyright (C) 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. + */ + +/* This module is intended as a standalone client implementation to + gpg-agent's GET_PASSPHRASE command. In particular it does not use + the Assuan library and can only cope with an already running + gpg-agent. Some stuff is configurable in the header file. */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include +#include +#include +#include +#include +#ifdef HAVE_W32_SYSTEM +#include +#else +#include +#include +#endif +#ifdef HAVE_LOCALE_H +#include +#endif +#ifdef HAVE_W32_SYSTEM +#include "../jnlib/w32-afunix.h" +#endif + + +#define SIMPLE_PWQUERY_IMPLEMENTATION 1 +#include "simple-pwquery.h" + +#if defined(SPWQ_USE_LOGGING) && !defined(HAVE_JNLIB_LOGGING) +# undef SPWQ_USE_LOGGING +#endif + +#ifndef _ +#define _(a) (a) +#endif + +#if !defined (hexdigitp) && !defined (xtoi_2) +#define digitp(p) (*(p) >= '0' && *(p) <= '9') +#define hexdigitp(a) (digitp (a) \ + || (*(a) >= 'A' && *(a) <= 'F') \ + || (*(a) >= 'a' && *(a) <= 'f')) +#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)) +#endif + + + + + + +#ifndef HAVE_STPCPY +static char * +my_stpcpy(char *a,const char *b) +{ + while( *b ) + *a++ = *b++; + *a = 0; + + return (char*)a; +} +#define stpcpy(a,b) my_stpcpy((a), (b)) +#endif + + + +/* 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) + { +#ifdef HAVE_W32_SYSTEM + nwritten = send (fd, buf, nleft, 0); +#else + nwritten = write (fd, buf, nleft); +#endif + if (nwritten < 0) + { + if (errno == EINTR) + nwritten = 0; + else { +#ifdef SPWQ_USE_LOGGING + log_error ("write failed: %s\n", strerror (errno)); +#endif + return SPWQ_IO_ERROR; + } + } + nleft -= nwritten; + buf = (const char*)buf + nwritten; + } + + return 0; +} + + +/* Read an entire line and return number of bytes read. */ +static int +readline (int fd, char *buf, size_t buflen) +{ + size_t nleft = buflen; + char *p; + int nread = 0; + + while (nleft > 0) + { +#ifdef HAVE_W32_SYSTEM + int n = recv (fd, buf, nleft, 0); +#else + int n = read (fd, buf, nleft); +#endif + if (n < 0) + { + if (errno == EINTR) + continue; + return -(SPWQ_IO_ERROR); + } + else if (!n) + { + return -(SPWQ_PROTOCOL_ERROR); /* incomplete line */ + } + p = buf; + nleft -= n; + buf += n; + nread += n; + + for (; n && *p != '\n'; n--, p++) + ; + if (n) + { + break; /* at least one full line available - that's enough. + This function is just a simple implementation, so + it is okay to forget about pending bytes */ + } + } + + return nread; +} + + +/* Send an option to the agent */ +static int +agent_send_option (int fd, const char *name, const char *value) +{ + char buf[200]; + int nread; + char *line; + int i; + + line = spwq_malloc (7 + strlen (name) + 1 + strlen (value) + 2); + if (!line) + return SPWQ_OUT_OF_CORE; + strcpy (stpcpy (stpcpy (stpcpy ( + stpcpy (line, "OPTION "), name), "="), value), "\n"); + i = writen (fd, line, strlen (line)); + spwq_free (line); + if (i) + return i; + + /* get response */ + nread = readline (fd, buf, DIM(buf)-1); + if (nread < 0) + return -nread; + if (nread < 3) + return SPWQ_PROTOCOL_ERROR; + + if (buf[0] == 'O' && buf[1] == 'K' && (buf[2] == ' ' || buf[2] == '\n')) + return 0; /* okay */ + + return SPWQ_ERR_RESPONSE; +} + + +/* Send all available options to the agent. */ +static int +agent_send_all_options (int fd) +{ + char *dft_display = NULL; + char *dft_ttyname = NULL; + char *dft_ttytype = NULL; + int rc = 0; + + dft_display = getenv ("DISPLAY"); + if (dft_display) + { + if ((rc = agent_send_option (fd, "display", dft_display))) + return rc; + } + + dft_ttyname = getenv ("GPG_TTY"); +#ifndef HAVE_W32_SYSTEM + if ((!dft_ttyname || !*dft_ttyname) && ttyname (0)) + dft_ttyname = ttyname (0); +#endif + if (dft_ttyname && *dft_ttyname) + { + if ((rc=agent_send_option (fd, "ttyname", dft_ttyname))) + return rc; + } + + dft_ttytype = getenv ("TERM"); + if (dft_ttyname && dft_ttytype) + { + if ((rc = agent_send_option (fd, "ttytype", dft_ttytype))) + return rc; + } + +#if defined(HAVE_SETLOCALE) + { + char *old_lc = NULL; + char *dft_lc = NULL; + +#if defined(LC_CTYPE) + old_lc = setlocale (LC_CTYPE, NULL); + if (old_lc) + { + char *p = spwq_malloc (strlen (old_lc)+1); + if (!p) + return SPWQ_OUT_OF_CORE; + strcpy (p, old_lc); + old_lc = p; + } + dft_lc = setlocale (LC_CTYPE, ""); + if (dft_ttyname && dft_lc) + rc = agent_send_option (fd, "lc-ctype", dft_lc); + if (old_lc) + { + setlocale (LC_CTYPE, old_lc); + spwq_free (old_lc); + } + if (rc) + return rc; +#endif + +#if defined(LC_MESSAGES) + old_lc = setlocale (LC_MESSAGES, NULL); + if (old_lc) + { + char *p = spwq_malloc (strlen (old_lc)+1); + if (!p) + return SPWQ_OUT_OF_CORE; + strcpy (p, old_lc); + old_lc = p; + } + dft_lc = setlocale (LC_MESSAGES, ""); + if (dft_ttyname && dft_lc) + rc = agent_send_option (fd, "lc-messages", dft_lc); + if (old_lc) + { + setlocale (LC_MESSAGES, old_lc); + spwq_free (old_lc); + } + if (rc) + return rc; +#endif + } +#endif /*HAVE_SETLOCALE*/ + + return 0; +} + + + +/* Try to open a connection to the agent, send all options and return + the file descriptor for the connection. Return -1 in case of + error. */ +static int +agent_open (int *rfd) +{ + int rc; + int fd; + char *infostr, *p; + struct sockaddr_un client_addr; + size_t len; + int prot; + char line[200]; + int nread; + + *rfd = -1; + infostr = getenv ( "GPG_AGENT_INFO" ); + if ( !infostr || !*infostr ) + { +#ifdef SPWQ_USE_LOGGING + log_error (_("gpg-agent is not available in this session\n")); +#endif + return SPWQ_NO_AGENT; + } + p = spwq_malloc (strlen (infostr)+1); + if (!p) + return SPWQ_OUT_OF_CORE; + strcpy (p, infostr); + infostr = p; + + if ( !(p = strchr ( infostr, PATHSEP_C)) || p == infostr + || (p-infostr)+1 >= sizeof client_addr.sun_path ) + { +#ifdef SPWQ_USE_LOGGING + log_error ( _("malformed GPG_AGENT_INFO environment variable\n")); +#endif + return SPWQ_NO_AGENT; + } + *p++ = 0; + + while (*p && *p != PATHSEP_C) + p++; + prot = *p? atoi (p+1) : 0; + if ( prot != 1) + { +#ifdef SPWQ_USE_LOGGING + log_error (_("gpg-agent protocol version %d is not supported\n"),prot); +#endif + return SPWQ_PROTOCOL_ERROR; + } + +#ifdef HAVE_W32_SYSTEM + fd = _w32_sock_new (AF_UNIX, SOCK_STREAM, 0); +#else + fd = socket (AF_UNIX, SOCK_STREAM, 0); +#endif + if (fd == -1) + { +#ifdef SPWQ_USE_LOGGING + log_error ("can't create socket: %s\n", strerror(errno) ); +#endif + return SPWQ_SYS_ERROR; + } + + memset (&client_addr, 0, sizeof client_addr); + client_addr.sun_family = AF_UNIX; + strcpy (client_addr.sun_path, infostr); + len = (offsetof (struct sockaddr_un, sun_path) + + strlen(client_addr.sun_path) + 1); + +#ifdef HAVE_W32_SYSTEM + rc = _w32_sock_connect (fd, (struct sockaddr*)&client_addr, len ); +#else + rc = connect (fd, (struct sockaddr*)&client_addr, len ); +#endif + if (rc == -1) + { +#ifdef SPWQ_USE_LOGGING + log_error ( _("can't connect to `%s': %s\n"), infostr, strerror (errno)); +#endif + close (fd ); + return SPWQ_IO_ERROR; + } + + nread = readline (fd, line, DIM(line)); + if (nread < 3 || !(line[0] == 'O' && line[1] == 'K' + && (line[2] == '\n' || line[2] == ' ')) ) + { +#ifdef SPWQ_USE_LOGGING + log_error ( _("communication problem with gpg-agent\n")); +#endif + close (fd ); + return SPWQ_PROTOCOL_ERROR; + } + + rc = agent_send_all_options (fd); + if (rc) + { +#ifdef SPWQ_USE_LOGGING + log_error (_("problem setting the gpg-agent options\n")); +#endif + close (fd); + return rc; + } + + *rfd = fd; + return 0; +} + + +/* Copy text to BUFFER and escape as required. Return a pointer to + the end of the new buffer. Note that BUFFER must be large enough + to keep the entire text; allocataing it 3 times the size of TEXT + is sufficient. */ +static char * +copy_and_escape (char *buffer, const char *text) +{ + int i; + const unsigned char *s = (unsigned char *)text; + char *p = buffer; + + + for (i=0; s[i]; i++) + { + if (s[i] < ' ' || s[i] == '+') + { + sprintf (p, "%%%02X", s[i]); + p += 3; + } + else if (s[i] == ' ') + *p++ = '+'; + else + *p++ = s[i]; + } + return p; +} + + +/* Ask the gpg-agent for a passphrase and present the user with a + DESCRIPTION, a PROMPT and optiaonlly with a TRYAGAIN extra text. + If a CACHEID is not NULL it is used to locate the passphrase in in + the cache and store it under this ID. If ERRORCODE is not NULL it + should point a variable receiving an errorcode; thsi errocode might + be 0 if the user canceled the operation. The function returns NULL + to indicate an error. */ +char * +simple_pwquery (const char *cacheid, + const char *tryagain, + const char *prompt, + const char *description, + int *errorcode) +{ + int fd = -1; + int nread; + char *result = NULL; + char *pw = NULL; + char *p; + int rc, i; + + rc = agent_open (&fd); + if (rc) + goto leave; + + if (!cacheid) + cacheid = "X"; + if (!tryagain) + tryagain = "X"; + if (!prompt) + prompt = "X"; + if (!description) + description = "X"; + + { + char *line; + /* We allocate 3 times the needed space so that there is enough + space for escaping. */ + line = spwq_malloc (15 + + 3*strlen (cacheid) + 1 + + 3*strlen (tryagain) + 1 + + 3*strlen (prompt) + 1 + + 3*strlen (description) + 1 + + 2); + if (!line) + { + rc = SPWQ_OUT_OF_CORE; + goto leave; + } + strcpy (line, "GET_PASSPHRASE "); + p = line+15; + p = copy_and_escape (p, cacheid); + *p++ = ' '; + p = copy_and_escape (p, tryagain); + *p++ = ' '; + p = copy_and_escape (p, prompt); + *p++ = ' '; + p = copy_and_escape (p, description); + *p++ = '\n'; + rc = writen (fd, line, p - line); + spwq_free (line); + if (rc) + goto leave; + } + + /* get response */ + pw = spwq_secure_malloc (500); + nread = readline (fd, pw, 499); + if (nread < 0) + { + rc = -nread; + goto leave; + } + if (nread < 3) + { + rc = SPWQ_PROTOCOL_ERROR; + goto leave; + } + + if (pw[0] == 'O' && pw[1] == 'K' && pw[2] == ' ') + { /* we got a passphrase - convert it back from hex */ + size_t pwlen = 0; + + for (i=3; i < nread && hexdigitp (pw+i); i+=2) + pw[pwlen++] = xtoi_2 (pw+i); + pw[pwlen] = 0; /* make a C String */ + result = pw; + pw = NULL; + } + else if ((nread > 7 && !memcmp (pw, "ERR 111", 7) + && (pw[7] == ' ' || pw[7] == '\n') ) + || ((nread > 4 && !memcmp (pw, "ERR ", 4) + && (strtoul (pw+4, NULL, 0) & 0xffff) == 99)) ) + { + /* 111 is the old Assuan code for canceled which might still + be in use by old installations. 99 is GPG_ERR_CANCELED as + used by modern gpg-agents; 0xffff is used to mask out the + error source. */ +#ifdef SPWQ_USE_LOGGING + log_info (_("canceled by user\n") ); +#endif + *errorcode = 0; /* canceled */ + } + else + { +#ifdef SPWQ_USE_LOGGING + log_error (_("problem with the agent\n")); +#endif + rc = SPWQ_ERR_RESPONSE; + } + + leave: + if (errorcode) + *errorcode = rc; + if (fd != -1) + close (fd); + if (pw) + spwq_secure_free (pw); + return result; +} + + +/* Ask the gpg-agent to clear the passphrase for the cache ID CACHEID. */ +int +simple_pwclear (const char *cacheid) +{ + char line[500]; + char *p; + + /* We need not more than 50 characters for the command and the + terminating nul. */ + if (strlen (cacheid) * 3 > sizeof (line) - 50) + return SPWQ_PROTOCOL_ERROR; + + strcpy (line, "CLEAR_PASSPHRASE "); + p = line + 17; + p = copy_and_escape (p, cacheid); + *p++ = '\n'; + *p++ = '\0'; + + return simple_query (line); +} + + +/* Perform the simple query QUERY (which must be new-line and 0 + terminated) and return the error code. */ +int +simple_query (const char *query) +{ + int fd = -1; + int nread; + char response[500]; + int rc; + + rc = agent_open (&fd); + if (rc) + goto leave; + + rc = writen (fd, query, strlen (query)); + if (rc) + goto leave; + + /* get response */ + nread = readline (fd, response, 499); + if (nread < 0) + { + rc = -nread; + goto leave; + } + if (nread < 3) + { + rc = SPWQ_PROTOCOL_ERROR; + goto leave; + } + + if (response[0] == 'O' && response[1] == 'K') + /* OK, do nothing. */; + else if ((nread > 7 && !memcmp (response, "ERR 111", 7) + && (response[7] == ' ' || response[7] == '\n') ) + || ((nread > 4 && !memcmp (response, "ERR ", 4) + && (strtoul (response+4, NULL, 0) & 0xffff) == 99)) ) + { + /* 111 is the old Assuan code for canceled which might still + be in use by old installations. 99 is GPG_ERR_CANCELED as + used by modern gpg-agents; 0xffff is used to mask out the + error source. */ +#ifdef SPWQ_USE_LOGGING + log_info (_("canceled by user\n") ); +#endif + } + else + { +#ifdef SPWQ_USE_LOGGING + log_error (_("problem with the agent\n")); +#endif + rc = SPWQ_ERR_RESPONSE; + } + + leave: + if (fd != -1) + close (fd); + return rc; +} diff --git a/common/simple-pwquery.h b/common/simple-pwquery.h new file mode 100644 index 000000000..5b941d06f --- /dev/null +++ b/common/simple-pwquery.h @@ -0,0 +1,76 @@ +/* simple-pwquery.c - A simple password query cleint for gpg-agent + * 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. + */ + +#ifndef SIMPLE_PWQUERY_H +#define SIMPLE_PWQUERY_H + +#ifdef SIMPLE_PWQUERY_IMPLEMENTATION /* Begin configuration stuff. */ + +/* Include whatever files you need. */ +#include +#include "../jnlib/logging.h" + +/* Try to write error message using the standard log mechanism. The + current implementation requires that the HAVE_JNLIB_LOGGING is also + defined. */ +#define SPWQ_USE_LOGGING 1 + +/* Memory allocation functions used by the implementation. Note, that + the returned value is expected to be freed with + spwq_secure_free. */ +#define spwq_malloc(a) gcry_malloc (a) +#define spwq_free(a) gcry_free (a) +#define spwq_secure_malloc(a) gcry_malloc_secure (a) +#define spwq_secure_free(a) gcry_free (a) + + +#endif /*SIMPLE_PWQUERY_IMPLEMENTATION*/ /* End configuration stuff. */ + + +/* Ask the gpg-agent for a passphrase and present the user with a + DESCRIPTION, a PROMPT and optiaonlly with a TRYAGAIN extra text. + If a CACHEID is not NULL it is used to locate the passphrase in in + the cache and store it under this ID. If ERRORCODE is not NULL it + should point a variable receiving an errorcode; this errocode might + be 0 if the user canceled the operation. The function returns NULL + to indicate an error. */ +char *simple_pwquery (const char *cacheid, + const char *tryagain, + const char *prompt, + const char *description, + int *errorcode); + +/* Ask the gpg-agent to clear the passphrase for the cache ID CACHEID. */ +int simple_pwclear (const char *cacheid); + +/* Perform the simple query QUERY (which must be new-line and 0 + terminated) and return the error code. */ +int simple_query (const char *query); + +#define SPWQ_OUT_OF_CORE 1 +#define SPWQ_IO_ERROR 2 +#define SPWQ_PROTOCOL_ERROR 3 +#define SPWQ_ERR_RESPONSE 4 +#define SPWQ_NO_AGENT 5 +#define SPWQ_SYS_ERROR 6 +#define SPWQ_GENERAL_ERROR 7 + +#endif /*SIMPLE_PWQUERY_H*/ diff --git a/common/sysutils.c b/common/sysutils.c new file mode 100644 index 000000000..3e52cdaa3 --- /dev/null +++ b/common/sysutils.c @@ -0,0 +1,231 @@ +/* sysutils.c - system helpers + * 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 +#include +#include +#include +#include +#include +#ifdef HAVE_STAT +#include +#endif +#if defined(__linux__) && defined(__alpha__) && __GLIBC__ < 2 + #include + #include +#endif +#ifdef HAVE_SETRLIMIT + #include + #include + #include +#endif +#include "util.h" +#include "i18n.h" + +#include "sysutils.h" + +#if defined(__linux__) && defined(__alpha__) && __GLIBC__ < 2 +#warning using trap_unaligned +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 (void) +{ +#ifdef HAVE_DOSISH_SYSTEM + return 0; +#else +# ifdef HAVE_SETRLIMIT + struct rlimit limit; + + /* We only set the current limit unless we were not able to + retrieve the old value. */ + if (getrlimit (RLIMIT_CORE, &limit)) + limit.rlim_max = 0; + limit.rlim_cur = 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 +} + +int +enable_core_dumps (void) +{ +#ifdef HAVE_DOSISH_SYSTEM + return 0; +#else +# ifdef HAVE_SETRLIMIT + struct rlimit limit; + + if (getrlimit (RLIMIT_CORE, &limit)) + return 1; + limit.rlim_cur = limit.rlim_max; + setrlimit (RLIMIT_CORE, &limit); + return 1; /* We always return true because trhis function is + merely a debugging aid. */ +# endif + return 1; +#endif +} + + + +/* 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; +} + + +#if 0 /* not yet needed - Note that this will require inclusion of + cmacros.am in Makefile.am */ +int +check_permissions(const char *path,int extension,int checkonly) +{ +#if defined(HAVE_STAT) && !defined(HAVE_DOSISH_SYSTEM) + char *tmppath; + struct stat statbuf; + int ret=1; + int isdir=0; + + if(opt.no_perm_warn) + return 0; + + if(extension && path[0]!=DIRSEP_C) + { + if(strchr(path,DIRSEP_C)) + tmppath=make_filename(path,NULL); + else + tmppath=make_filename(GNUPG_LIBDIR,path,NULL); + } + else + tmppath=m_strdup(path); + + /* It's okay if the file doesn't exist */ + if(stat(tmppath,&statbuf)!=0) + { + ret=0; + goto end; + } + + isdir=S_ISDIR(statbuf.st_mode); + + /* Per-user files must be owned by the user. Extensions must be + owned by the user or root. */ + if((!extension && statbuf.st_uid != getuid()) || + (extension && statbuf.st_uid!=0 && statbuf.st_uid!=getuid())) + { + if(!checkonly) + log_info(_("Warning: unsafe ownership on %s \"%s\"\n"), + isdir?"directory":extension?"extension":"file",path); + goto end; + } + + /* This works for both directories and files - basically, we don't + care what the owner permissions are, so long as the group and + other permissions are 0 for per-user files, and non-writable for + extensions. */ + if((extension && (statbuf.st_mode & (S_IWGRP|S_IWOTH)) !=0) || + (!extension && (statbuf.st_mode & (S_IRWXG|S_IRWXO)) != 0)) + { + char *dir; + + /* However, if the directory the directory/file is in is owned + by the user and is 700, then this is not a problem. + 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,&statbuf)==0 && statbuf.st_uid==getuid() && + S_ISDIR(statbuf.st_mode) && (statbuf.st_mode & (S_IRWXG|S_IRWXO))==0) + { + xfree (dir); + ret=0; + goto end; + } + + m_free(dir); + + if(!checkonly) + log_info(_("Warning: unsafe permissions on %s \"%s\"\n"), + isdir?"directory":extension?"extension":"file",path); + goto end; + } + + ret=0; + + end: + m_free(tmppath); + + return ret; + +#endif /* HAVE_STAT && !HAVE_DOSISH_SYSTEM */ + + return 0; +} +#endif diff --git a/common/sysutils.h b/common/sysutils.h new file mode 100644 index 000000000..c40dbfaa9 --- /dev/null +++ b/common/sysutils.h @@ -0,0 +1,47 @@ +/* sysutils.h - System utility functions for Gnupg + * 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. + */ + +#ifndef GNUPG_COMMON_SYSUTILS_H +#define GNUPG_COMMON_SYSUTILS_H + +void trap_unaligned (void); +int disable_core_dumps (void); +int enable_core_dumps (void); +const unsigned char *get_session_marker (size_t *rlen); +int check_permissions (const char *path,int extension,int checkonly); + +#ifdef HAVE_W32_SYSTEM +/* Windows declares sleep as obsolete, but provides a definition for + _sleep but non for the still existing sleep. */ +#define sleep(a) _sleep ((a)) + +/*-- 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); + +#endif /*HAVE_W32_SYSTEM*/ + + + + +#endif /*GNUPG_COMMON_SYSUTILS_H*/ diff --git a/util/ttyio.c b/common/ttyio.c similarity index 80% rename from util/ttyio.c rename to common/ttyio.c index 97b160ef2..38883afa5 100644 --- a/util/ttyio.c +++ b/common/ttyio.c @@ -1,6 +1,6 @@ /* ttyio.c - tty i/O functions - * Copyright (C) 1998, 1999, 2000, 2001, 2002, - * 2004 Free Software Foundation, Inc. + * Copyright (C) 1998,1999,2000,2001,2002,2003, + * 2004, 2006 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -42,7 +42,7 @@ #ifdef _WIN32 /* use the odd Win32 functions */ #include #ifdef HAVE_TCGETATTR -#error windows and termios +#error mingw32 and termios #endif #endif #include @@ -52,6 +52,7 @@ #include #endif + #include "util.h" #include "memory.h" #include "ttyio.h" @@ -100,18 +101,27 @@ tty_get_ttyname (void) if (!got_name) { const char *s; + /* Note that despite our checks for these macros the function is + not necessarily thread save. We mainly do this for + portability reasons, in case L_ctermid is not defined. */ +# if defined(_POSIX_THREAD_SAFE_FUNCTIONS) || defined(_POSIX_TRHEADS) + char buffer[L_ctermid]; + s = ctermid (buffer); +# else s = ctermid (NULL); +# endif if (s) name = strdup (s); got_name = 1; } -#endif - /* Assume the standard tty on memory error or when there is no - ctermid. */ +#endif /*HAVE_CTERMID*/ + /* Assume the standard tty on memory error or when tehre is no + certmid. */ return name? name : "/dev/tty"; } + #ifdef HAVE_TCGETATTR static void cleanup(void) @@ -141,15 +151,15 @@ init_ttyfp(void) 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)); + log_fatal("open(CONOUT$) failed: rc=%d", (int)GetLastError() ); 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)); + if( con.in == INVALID_HANDLE_VALUE ) + log_fatal("open(CONIN$) failed: rc=%d", (int)GetLastError() ); } SetConsoleMode(con.in, DEF_INPMODE ); SetConsoleMode(con.out, DEF_OUTMODE ); @@ -157,17 +167,12 @@ init_ttyfp(void) #elif defined(__EMX__) ttyfp = stdout; /* Fixme: replace by the real functions: see wklib */ #else - ttyfp = batchmode? stderr : fopen( tty_get_ttyname (), "r+"); + ttyfp = batchmode? stderr : fopen (tty_get_ttyname (), "r+"); if( !ttyfp ) { - log_error("cannot open `%s': %s\n", - tty_get_ttyname (), strerror(errno) ); + 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 ); @@ -175,33 +180,35 @@ init_ttyfp(void) initialized = 1; } + #ifdef HAVE_LIBREADLINE void tty_enable_completion(rl_completion_func_t *completer) { - if( no_terminal ) - return; +/* if( no_terminal ) */ +/* return; */ - if( !initialized ) - init_ttyfp(); +/* if( !initialized ) */ +/* init_ttyfp(); */ - rl_attempted_completion_function=completer; - rl_inhibit_completion=0; +/* rl_attempted_completion_function=completer; */ +/* rl_inhibit_completion=0; */ } void tty_disable_completion(void) { - if( no_terminal ) - return; +/* if( no_terminal ) */ +/* return; */ - if( !initialized ) - init_ttyfp(); +/* if( !initialized ) */ +/* init_ttyfp(); */ - rl_inhibit_completion=1; +/* rl_inhibit_completion=1; */ } #endif /*HAVE_LIBREADLINE*/ + int tty_batchmode( int onoff ) { @@ -241,10 +248,10 @@ tty_printf( const char *fmt, ... ) if( !buf ) log_bug("vasprintf() failed\n"); - if (!WriteConsoleA (con.out, buf, n, &nwritten, NULL)) - log_fatal ("WriteConsole failed: %s", w32_strerror (0)); + if( !WriteConsoleA( con.out, buf, n, &nwritten, NULL ) ) + log_fatal("WriteConsole failed: rc=%d", (int)GetLastError() ); if( n != nwritten ) - log_fatal ("WriteConsole failed: %d != %d\n", n, (int)nwritten ); + log_fatal("WriteConsole failed: %d != %d\n", n, (int)nwritten ); last_prompt_len += n; xfree (buf); } @@ -256,7 +263,7 @@ tty_printf( const char *fmt, ... ) } -/* Same as tty_printf but if FP is not NULL, behave like the standard +/* Same as tty_printf but if FP is not NULL, behave like a regualr fprintf. */ void tty_fprintf (FILE *fp, const char *fmt, ... ) @@ -288,10 +295,10 @@ tty_fprintf (FILE *fp, const char *fmt, ... ) 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); + if( !WriteConsoleA( con.out, buf, n, &nwritten, NULL ) ) + log_fatal("WriteConsole failed: rc=%d", (int)GetLastError() ); + if( n != nwritten ) + log_fatal("WriteConsole failed: %d != %d\n", n, (int)nwritten ); last_prompt_len += n; xfree (buf); } @@ -307,7 +314,7 @@ tty_fprintf (FILE *fp, const char *fmt, ... ) * Print a string, but filter all control characters out. */ void -tty_print_string( const byte *p, size_t n ) +tty_print_string ( const byte *p, size_t n ) { if (no_terminal) return; @@ -345,7 +352,7 @@ tty_print_string( const byte *p, size_t n ) } void -tty_print_utf8_string2 (const byte *p, size_t n, size_t max_n ) +tty_print_utf8_string2( const byte *p, size_t n, size_t max_n ) { size_t i; char *buf; @@ -359,7 +366,7 @@ tty_print_utf8_string2 (const byte *p, size_t n, size_t max_n ) break; } if( i < n ) { - buf = utf8_to_native( p, n, 0 ); + buf = utf8_to_native( (const char *)p, n, 0 ); if( max_n && (strlen( buf ) > max_n )) { buf[max_n] = 0; } @@ -405,20 +412,19 @@ do_get( const char *prompt, int hidden ) init_ttyfp(); last_prompt_len = 0; - buf = xmalloc(n=50); + tty_printf( "%s", prompt ); + 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( !ReadConsoleA( con.in, cbuf, 1, &nread, NULL ) ) + log_fatal("ReadConsole failed: rc=%d", (int)GetLastError() ); if( !nread ) continue; if( *cbuf == '\n' ) @@ -436,7 +442,7 @@ do_get( const char *prompt, int hidden ) continue; if( !(i < n-1) ) { n += 50; - buf = xrealloc( buf, n ); + buf = xrealloc (buf, n); } buf[i++] = c; } @@ -445,7 +451,6 @@ do_get( const char *prompt, int hidden ) SetConsoleMode(con.in, DEF_INPMODE ); #elif defined(__riscos__) - tty_printf( "%s", prompt ); do { c = riscos_getchar(); if (c == 0xa || c == 0xd) { /* Return || Enter */ @@ -475,7 +480,7 @@ do_get( const char *prompt, int hidden ) } if(!(i < n-1)) { n += 50; - buf = xrealloc(buf, n); + buf = xrealloc (buf, n); } buf[i++] = c; if (!hidden) { @@ -500,8 +505,6 @@ do_get( const char *prompt, int hidden ) #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' ) { @@ -519,7 +522,7 @@ do_get( const char *prompt, int hidden ) continue; if( !(i < n-1) ) { n += 50; - buf = xrealloc( buf, n ); + buf = xrealloc (buf, n ); } buf[i++] = c; } @@ -545,40 +548,7 @@ do_get( const char *prompt, int hidden ) 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 ); + return do_get( prompt, 0 ); } char * diff --git a/include/ttyio.h b/common/ttyio.h similarity index 60% rename from include/ttyio.h rename to common/ttyio.h index 2c52fc3e9..32d159863 100644 --- a/include/ttyio.h +++ b/common/ttyio.h @@ -1,5 +1,5 @@ /* ttyio.h - * Copyright (C) 1998, 1999, 2000, 2001, 2005 Free Software Foundation, Inc. + * Copyright (C) 1998, 1999, 2000, 2001, 2003 Free Software Foundation, Inc. * * This file is part of GNUPG. * @@ -18,8 +18,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. */ -#ifndef G10_TTYIO_H -#define G10_TTYIO_H +#ifndef GNUPG_COMMON_TTYIO_H +#define GNUPG_COMMON_TTYIO_H #ifdef HAVE_LIBREADLINE #include @@ -27,23 +27,24 @@ #endif const char *tty_get_ttyname (void); -int tty_batchmode( int onoff ); +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))); +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, ... ); +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); +void tty_print_string (const unsigned char *p, size_t n); +void tty_print_utf8_string (const unsigned char *p, size_t n); +void tty_print_utf8_string2 (const unsigned char *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); @@ -56,4 +57,5 @@ void tty_disable_completion(void); #define tty_disable_completion() #endif -#endif /*G10_TTYIO_H*/ + +#endif /*GNUPG_COMMON_TTYIO_H*/ diff --git a/common/util.h b/common/util.h new file mode 100644 index 000000000..29106bf9c --- /dev/null +++ b/common/util.h @@ -0,0 +1,209 @@ +/* util.h - Utility functions for GnuPG + * Copyright (C) 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 GNUPG_COMMON_UTIL_H +#define GNUPG_COMMON_UTIL_H + +#include /* We need this for the memory function protos. */ +#include /* We need time_t. */ +#include /* we need gpg-error_t. */ + +/* Common GNUlib includes (-I ../gl/). */ +#include "strpbrk.h" +#include "strsep.h" +#include "vasprintf.h" + + +/* Hash function used with libksba. */ +#define HASH_FNC ((void (*)(void *, const void*,size_t))gcry_md_write) + +/* get all the stuff from jnlib */ +#include "../jnlib/logging.h" +#include "../jnlib/argparse.h" +#include "../jnlib/stringhelp.h" +#include "../jnlib/mischelp.h" +#include "../jnlib/strlist.h" +#include "../jnlib/dotlock.h" +#include "../jnlib/utf8conv.h" + +/* Handy malloc macros - please use only them. */ +#define xtrymalloc(a) gcry_malloc ((a)) +#define xtrymalloc_secure(a) gcry_malloc_secure ((a)) +#define xtrycalloc(a,b) gcry_calloc ((a),(b)) +#define xtrycalloc_secure(a,b) gcry_calloc_secure ((a),(b)) +#define xtryrealloc(a,b) gcry_realloc ((a),(b)) +#define xtrystrdup(a) gcry_strdup ((a)) +#define xfree(a) gcry_free ((a)) + +#define xmalloc(a) gcry_xmalloc ((a)) +#define xmalloc_secure(a) gcry_xmalloc_secure ((a)) +#define xcalloc(a,b) gcry_xcalloc ((a),(b)) +#define xcalloc_secure(a,b) gcry_xcalloc_secure ((a),(b)) +#define xrealloc(a,b) gcry_xrealloc ((a),(b)) +#define xstrdup(a) gcry_xstrdup ((a)) + +/* For compatibility with gpg 1.4 we also define these: */ +#define xmalloc_clear(a) gcry_xcalloc (1, (a)) +#define xmalloc_secure_clear(a) gcry_xcalloc_secure (1, (a)) + + +/* A type to hold the ISO time. Note that this this is the same as + the the KSBA type ksba_isotime_t. */ +typedef char gnupg_isotime_t[16]; + + +/*-- maperror.c --*/ +int map_kbx_err (int err); +gpg_error_t map_assuan_err_with_source (int source, int err); +int map_to_assuan_status (int rc); + +/*-- gettime.c --*/ +time_t gnupg_get_time (void); +void gnupg_get_isotime (gnupg_isotime_t timebuf); +void gnupg_set_time (time_t newtime, int freeze); +int gnupg_faked_time_p (void); +u32 make_timestamp (void); +u32 scan_isodatestr (const char *string); +u32 add_days_to_timestamp (u32 stamp, u16 days); +const char *strtimevalue (u32 stamp); +const char *strtimestamp (u32 stamp); /* GMT */ +const char *isotimestamp (u32 stamp); /* GMT */ +const char *asctimestamp (u32 stamp); /* localized */ + + +/* Copy one iso ddate to another, this is inline so that we can do a + sanity check. */ +static inline void +gnupg_copy_time (gnupg_isotime_t d, const gnupg_isotime_t s) +{ + if (*s && (strlen (s) != 15 || s[8] != 'T')) + BUG(); + strcpy (d, s); +} + + +/*-- signal.c --*/ +void gnupg_init_signals (int mode, void (*fast_cleanup)(void)); +void gnupg_pause_on_sigusr (int which); +void gnupg_block_all_signals (void); +void gnupg_unblock_all_signals (void); + +/*-- yesno.c --*/ +int answer_is_yes (const char *s); +int answer_is_yes_no_default (const char *s, int def_answer); +int answer_is_yes_no_quit (const char *s); +int answer_is_okay_cancel (const char *s, int def_answer); + +/*-- xreadline.c --*/ +ssize_t read_line (FILE *fp, + char **addr_of_buffer, size_t *length_of_buffer, + size_t *max_length); + + +/*-- b64enc.c --*/ +struct b64state +{ + unsigned int flags; + int idx; + int quad_count; + FILE *fp; + char *title; + unsigned char radbuf[4]; +}; +gpg_error_t b64enc_start (struct b64state *state, FILE *fp, const char *title); +gpg_error_t b64enc_write (struct b64state *state, + const void *buffer, size_t nbytes); +gpg_error_t b64enc_finish (struct b64state *state); + +/*-- sexputil.c */ +gpg_error_t keygrip_from_canon_sexp (const unsigned char *key, size_t keylen, + unsigned char *grip); +int cmp_simple_canon_sexp (const unsigned char *a, const unsigned char *b); +unsigned char *make_simple_sexp_from_hexstr (const char *line, + size_t *nscanned); + +/*-- homedir.c --*/ +const char *default_homedir (void); + + +/*-- miscellaneous.c --*/ + +/* Same as asprintf but return an allocated buffer suitable to be + freed using xfree. This function simply dies on memory failure, + thus no extra check is required. */ +char *xasprintf (const char *fmt, ...) JNLIB_GCC_A_PRINTF(1,2); +/* Same as asprintf but return an allocated buffer suitable to be + freed using xfree. This function returns NULL on memory failure and + sets errno. */ +char *xtryasprintf (const char *fmt, ...) JNLIB_GCC_A_PRINTF(1,2); + +const char *print_fname_stdout (const char *s); +const char *print_fname_stdin (const char *s); +void print_string (FILE *fp, const byte *p, size_t n, int delim); +void print_utf8_string2 ( FILE *fp, const byte *p, size_t n, int delim); +void print_utf8_string (FILE *fp, const byte *p, size_t n); +char *make_printable_string (const void *p, size_t n, int delim); + +int is_file_compressed (const char *s, int *ret_rc); + +int match_multistr (const char *multistr,const char *match); + + +/*-- Simple replacement functions. */ +#ifndef HAVE_TTYNAME +/* Systems without ttyname (W32) will merely return NULL. */ +static inline char * +ttyname (int fd) +{ + return NULL +}; +#endif /* !HAVE_TTYNAME */ + +#ifndef HAVE_ISASCII +static inline int +isascii (int c) +{ + return (((c) & ~0x7f) == 0); +} +#endif /* !HAVE_ISASCII */ + +/*-- Macros to replace ctype ones to 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')) + /* 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') + +/* 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)) +#define xtoi_4(p) ((xtoi_2(p) * 256) + xtoi_2((p)+2)) + + + +#endif /*GNUPG_COMMON_UTIL_H*/ diff --git a/common/vasprintf.c b/common/vasprintf.c new file mode 100644 index 000000000..4bed8de66 --- /dev/null +++ b/common/vasprintf.c @@ -0,0 +1,169 @@ +/* Like vsprintf but provides a pointer to malloc'd storage, which must + be freed by the caller. + Copyright (C) 1994, 2002 Free Software Foundation, Inc. + +This file is part of the libiberty library. +Libiberty 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. + +Libiberty is distributed in the hope that 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 libiberty; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 51 Franklin Street, +Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include +#include +#include +#include + +#ifdef TEST +int global_total_width; +#endif + +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; + +#ifdef va_copy + va_copy (ap, args); +#else +#ifdef __va_copy + __va_copy (ap, args); +#else + memcpy (&ap, args, sizeof (va_list)); +#endif /* __va_copy */ +#endif /* va_copy */ + + while (*p != '\0') + { + if (*p++ == '%') + { + while (strchr ("-+ #0", *p)) + ++p; + if (*p == '*') + { + ++p; + total_width += abs (va_arg (ap, int)); + } + else + total_width += strtoul (p, (char**)&p, 10); + if (*p == '.') + { + ++p; + if (*p == '*') + { + ++p; + total_width += abs (va_arg (ap, int)); + } + else + total_width += strtoul (p, (char**)&p, 10); + } + 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; + break; + case 's': + { + char *tmp = va_arg (ap, char *); + if (tmp) + total_width += strlen (tmp); + else /* in case the vsprintf does prints a text */ + total_width += 25; /* e.g. "(null pointer reference)" */ + } + break; + case 'p': + case 'n': + (void) va_arg (ap, char *); + break; + } + } + } +#ifdef TEST + global_total_width = total_width; +#endif + *result = malloc (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; +} + + +#ifdef TEST +void +checkit (const char* format, ...) +{ + va_list args; + char *result; + + va_start (args, format); + vasprintf (&result, format, args); + if (strlen (result) < global_total_width) + printf ("PASS: "); + else + printf ("FAIL: "); + printf ("%d %s\n", global_total_width, result); +} + +int +main (void) +{ + checkit ("%d", 0x12345678); + checkit ("%200d", 5); + checkit ("%.300d", 6); + checkit ("%100.150d", 7); + checkit ("%s", "jjjjjjjjjiiiiiiiiiiiiiiioooooooooooooooooppppppppppppaa\n\ +777777777777777777333333333333366666666666622222222222777777777777733333"); + checkit ("%f%s%d%s", 1.0, "foo", 77, "asdjffffffffffffffiiiiiiiiiiixxxxx"); +} +#endif /* TEST */ diff --git a/util/w32reg.c b/common/w32reg.c similarity index 88% rename from util/w32reg.c rename to common/w32reg.c index f65c9542c..84308e916 100644 --- a/util/w32reg.c +++ b/common/w32reg.c @@ -1,5 +1,5 @@ /* w32reg.c - MS-Windows Registry access - * Copyright (C) 1999, 2002, 2005 Free Software Foundation, Inc. + * Copyright (C) 1999, 2002 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -20,7 +20,7 @@ */ #include -#if defined (_WIN32) || defined (__CYGWIN32__) +#ifdef HAVE_W32_SYSTEM /* This module is only used in this environment */ #include @@ -28,8 +28,9 @@ #include #include #include + #include "util.h" -#include "memory.h" +#include "sysutils.h" static HKEY get_root_key(const char *root) @@ -62,7 +63,7 @@ get_root_key(const char *root) * 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()!!! + * the usual m_free()!!! */ char * read_w32_registry_string( const char *root, const char *dir, const char *name ) @@ -78,22 +79,14 @@ read_w32_registry_string( const char *root, const char *dir, const char *name ) { if (root) return NULL; /* no need for a RegClose, so return direct */ - /* It seems to be common practise to fall back to HKLM. */ + /* It seems to be common practise to fall back to HLM. */ 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; - } + if( RegQueryValueEx( key_handle, name, 0, NULL, NULL, &nbytes ) ) + goto leave; result = malloc( (n1=nbytes+1) ); if( !result ) goto leave; @@ -178,4 +171,4 @@ write_w32_registry_string(const char *root, const char *dir, return 0; } -#endif /* __MINGW32__ || __CYGWIN32__ */ +#endif /*HAVE_W32_SYSTEM*/ diff --git a/common/xasprintf.c b/common/xasprintf.c new file mode 100644 index 000000000..75ae18072 --- /dev/null +++ b/common/xasprintf.c @@ -0,0 +1,63 @@ +/* xasprintf.c + * 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. + */ + +#include +#include +#include + +#include "util.h" +#include "iobuf.h" + +/* Same as asprintf but return an allocated buffer suitable to be + freed using xfree. This function simply dies on memory failure, + thus no extra check is required. */ +char * +xasprintf (const char *fmt, ...) +{ + va_list ap; + char *buf, *p; + + va_start (ap, fmt); + if (vasprintf (&buf, fmt, ap) < 0) + log_fatal ("asprintf failed: %s\n", strerror (errno)); + va_end (ap); + p = xstrdup (buf); + free (buf); + return p; +} + +/* Same as above but return NULL on memory failure. */ +char * +xtryasprintf (const char *fmt, ...) +{ + int rc; + va_list ap; + char *buf, *p; + + va_start (ap, fmt); + rc = vasprintf (&buf, fmt, ap); + va_end (ap); + if (rc < 0) + return NULL; + p = xtrystrdup (buf); + free (buf); + return p; +} diff --git a/common/xreadline.c b/common/xreadline.c new file mode 100644 index 000000000..8400df330 --- /dev/null +++ b/common/xreadline.c @@ -0,0 +1,117 @@ +/* xreadline.c - fgets replacement function + * Copyright (C) 1999, 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 +#include +#include +#include + +#include "util.h" + + +/* Same as fgets() but if the provided buffer is too short a larger + one will be allocated. This is similar to getline. A line is + considered a byte stream ending in a LF. + + If MAX_LENGTH is not NULL, it shall point to a value with the + maximum allowed allocation. + + Returns the length of the line. EOF is indicated by a line of + length zero. A truncated line is indicated my setting the value at + MAX_LENGTH to 0. If the returned value is less then 0 not enough + memory was enable and ERRNO is set accordingly. + + If a line has been truncated, the file pointer is moved forward to + the end of the line so that the next read start with the next + line. Note that MAX_LENGTH must be re-initialzied in this case.. + + Note: The returned buffer is allocated with enough extra space to + append a CR,LF,Nul + */ +ssize_t +read_line (FILE *fp, + char **addr_of_buffer, size_t *length_of_buffer, + size_t *max_length) +{ + int c; + char *buffer = *addr_of_buffer; + size_t length = *length_of_buffer; + size_t nbytes = 0; + size_t maxlen = max_length? *max_length : 0; + char *p; + + if (!buffer) + { /* No buffer given - allocate a new one. */ + length = 256; + buffer = xtrymalloc (length); + *addr_of_buffer = buffer; + if (!buffer) + { + *length_of_buffer = 0; + if (max_length) + *max_length = 0; + return -1; + } + *length_of_buffer = length; + } + + length -= 3; /* Reserve 3 bytes for CR,LF,EOL. */ + p = buffer; + while ((c = getc (fp)) != EOF) + { + if (nbytes == length) + { /* Enlarge the buffer. */ + if (maxlen && length > maxlen) /* But not beyond our limit. */ + { + /* Skip the rest of the line. */ + while (c != '\n' && (c=getc (fp)) != EOF) + ; + *p++ = '\n'; /* Always append a LF (we reserved some space). */ + nbytes++; + if (max_length) + *max_length = 0; /* Indicate truncation. */ + break; /* the while loop. */ + } + length += 3; /* Adjust for the reserved bytes. */ + length += length < 1024? 256 : 1024; + *addr_of_buffer = xtryrealloc (buffer, length); + if (!*addr_of_buffer) + { + int save_errno = errno; + xfree (buffer); + *length_of_buffer = *max_length = 0; + errno = save_errno; + return -1; + } + buffer = *addr_of_buffer; + *length_of_buffer = length; + length -= 3; + p = buffer + nbytes; + } + *p++ = c; + nbytes++; + if (c == '\n') + break; + } + *p = 0; /* Make sure the line is a string. */ + + return nbytes; +} diff --git a/common/yesno.c b/common/yesno.c new file mode 100644 index 000000000..9ca513740 --- /dev/null +++ b/common/yesno.c @@ -0,0 +1,139 @@ +/* yesno.c - Yes/No questions + * 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. + */ + +#include +#include +#include + +#include "i18n.h" +#include "util.h" + +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 compare 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"); + + /* Note: we have to use a local dependent compare here. */ + 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 compare. */ + 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; +} + diff --git a/configure.ac b/configure.ac index 4b54751bc..e93fcb8aa 100644 --- a/configure.ac +++ b/configure.ac @@ -1,278 +1,166 @@ -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.) +# configure.ac - for GnuPG 1.9 +# 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. -AC_PREREQ(2.59) +# Process this file with autoconf to produce a configure script. +AC_PREREQ(2.52) 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.5]) -m4_define([my_issvn], [no]) +m4_define([my_version], [1.9.23]) +m4_define([my_issvn], [yes]) + 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)])) + || echo 'Revision: 0')|sed -n '/^Revision:/ {s/[^0-9]//gp;q}')])) AC_INIT([gnupg], my_version[]m4_if(my_issvn,[yes],[-svn[]svn_revision]), - [bug-gnupg@gnu.org]) + [gnupg-devel@gnupg.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 +development_version=yes +NEED_GPG_ERROR_VERSION=1.0 + +NEED_LIBGCRYPT_API=1 +NEED_LIBGCRYPT_VERSION=1.1.94 + +NEED_LIBASSUAN_VERSION=0.6.10 + +NEED_KSBA_VERSION=0.9.13 + + +PACKAGE=$PACKAGE_NAME +PACKAGE_GT=${PACKAGE_NAME}2 +VERSION=$PACKAGE_VERSION AC_CONFIG_AUX_DIR(scripts) -AC_CONFIG_SRCDIR(g10/gpg.c) -AC_CANONICAL_HOST -AM_INIT_AUTOMAKE([std-options]) +AC_CONFIG_SRCDIR(sm/gpgsm.c) AM_CONFIG_HEADER(config.h) +AC_CANONICAL_TARGET() +AM_INIT_AUTOMAKE($PACKAGE, $VERSION) +AB_INIT 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] ) +# Some status variables to give feedback at the end of a configure run +have_gpg_error=no +have_libgcrypt=no +have_libassuan=no +have_ksba=no +have_pth=no -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]) +GNUPG_BUILD_PROGRAM(gpg, no) +GNUPG_BUILD_PROGRAM(gpgsm, yes) +GNUPG_BUILD_PROGRAM(agent, yes) +GNUPG_BUILD_PROGRAM(scdaemon, yes) +GNUPG_BUILD_PROGRAM(symcryptrun, no) -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) +AC_SUBST(PACKAGE) +AC_SUBST(PACKAGE_GT) +AC_SUBST(VERSION) +AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of this package]) +AC_DEFINE_UNQUOTED(PACKAGE_GT, "$PACKAGE_GT", + [Name of this package for gettext]) +AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version of this package]) +AC_DEFINE_UNQUOTED(PACKAGE_BUGREPORT, "$PACKAGE_BUGREPORT", + [Bug report address]) +AC_DEFINE_UNQUOTED(NEED_LIBGCRYPT_VERSION, "$NEED_LIBGCRYPT_VERSION", + [Required version of Libgcrypt]) +AC_DEFINE_UNQUOTED(NEED_KSBA_VERSION, "$NEED_KSBA_VERSION", + [Required version of Libksba]) -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) +# The default is to use the modules from this package and the few +# other packages in a standard place; i.e where this package gets +# installed. With these options it is possible to override these +# ${prefix} depended values with fixed paths, which can't be replaced +# at make time. See also am/cmacros.am and the defaults in AH_BOTTOM. +AC_ARG_WITH(agent-pgm, + [ --with-agent-pgm=PATH Use PATH as the default for the agent)], + GNUPG_AGENT_PGM="$withval", GNUPG_AGENT_PGM="" ) +AC_SUBST(GNUPG_AGENT_PGM) +AM_CONDITIONAL(GNUPG_AGENT_PGM, test -n "$GNUPG_AGENT_PGM") +show_gnupg_agent_pgm="(default)" +test -n "$GNUPG_AGENT_PGM" && show_gnupg_agent_pgm="$GNUPG_AGENT_PGM" -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_ARG_WITH(pinentry-pgm, + [ --with-pinentry-pgm=PATH Use PATH as the default for the pinentry)], + GNUPG_PINENTRY_PGM="$withval", GNUPG_PINENTRY_PGM="" ) +AC_SUBST(GNUPG_PINENTRY_PGM) +AM_CONDITIONAL(GNUPG_PINENTRY_PGM, test -n "$GNUPG_PINENTRY_PGM") +show_gnupg_pinentry_pgm="(default)" +test -n "$GNUPG_PINENTRY_PGM" && show_gnupg_pinentry_pgm="$GNUPG_PINENTRY_PGM" -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) +AC_ARG_WITH(scdaemon-pgm, + [ --with-scdaemon-pgm=PATH Use PATH as the default for the scdaemon)], + GNUPG_SCDAEMON_PGM="$withval", GNUPG_SCDAEMON_PGM="" ) +AC_SUBST(GNUPG_SCDAEMON_PGM) +AM_CONDITIONAL(GNUPG_SCDAEMON_PGM, test -n "$GNUPG_SCDAEMON_PGM") +show_gnupg_scdaemon_pgm="(default)" +test -n "$GNUPG_SCDAEMON_PGM" && show_gnupg_scdaemon_pgm="$GNUPG_SCDAEMON_PGM" -dnl See if we are disabling any algorithms or features for a smaller -dnl binary -try_extensions=no +AC_ARG_WITH(dirmngr-pgm, + [ --with-dirmngr-pgm=PATH Use PATH as the default for the dirmngr)], + GNUPG_DIRMNGR_PGM="$withval", GNUPG_DIRMNGR_PGM="" ) +AC_SUBST(GNUPG_DIRMNGR_PGM) +AM_CONDITIONAL(GNUPG_DIRMNGR_PGM, test -n "$GNUPG_DIRMNGR_PGM") +show_gnupg_dirmngr_pgm="(default)" +test -n "$GNUPG_DIRMNGR_PGM" && show_gnupg_dirmngr_pgm="$GNUPG_DIRMNGR_PGM" -use_rsa=yes -use_idea=yes -use_cast5=yes -use_blowfish=yes -use_aes=yes -use_twofish=yes -use_sha256=yes -use_sha512=yes +AC_ARG_WITH(protect-tool-pgm, + [ --with-protect-tool-pgm=PATH Use PATH as the default for the protect-tool)], + GNUPG_PROTECT_TOOL_PGM="$withval", GNUPG_PROTECT_TOOL_PGM="" ) +AC_SUBST(GNUPG_PROTECT_TOOL_PGM) +AM_CONDITIONAL(GNUPG_PROTECT_TOOL_PGM, test -n "$GNUPG_PROTECT_TOOL_PGM") +show_gnupg_protect_tool_pgm="(default)" +test -n "$GNUPG_PROTECT_TOOL_PGM" \ + && show_gnupg_protect_tool_pgm="$GNUPG_PROTECT_TOOL_PGM" + + + +# Some folks want to use only the agent form this packet. Make it +# easier for them by providing the configure option +# --enable-only-agent. +AC_ARG_ENABLE(agent-only, + AC_HELP_STRING([--enable-agent-only],[build only the gpg-agent]), + build_agent_only=$enableval) + + +# Allow disabling of bzib2 support. +# It is defined only after we confirm the library is available later 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]), - 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) + +# Configure option to allow or disallow execution of external +# programs, like a photo viewer. AC_MSG_CHECKING([whether to enable external program execution]) AC_ARG_ENABLE(exec, AC_HELP_STRING([--disable-exec],[disable all external program execution]), @@ -316,56 +204,38 @@ if test "$use_exec" = yes ; then 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) + [ --disable-ldap disable LDAP keyserver interface], + 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) + [ --disable-hkp disable HKP keyserver interface], + 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) + if test "$try_hkp" = yes ; then + AC_SUBST(GPGKEYS_HKP,"gpgkeys_hkp$EXEEXT") + fi 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) + [ --disable-mailto disable email keyserver interface], + try_mailto=$enableval, try_mailto=yes) 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) + [ --disable-keyserver-path disable the exec-path option for keyserver helpers], + [if test "$enableval" = no ; then + AC_DEFINE(DISABLE_KEYSERVER_PATH,1,[define to disable exec-path for keyserver helpers]) + 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 @@ -392,6 +262,8 @@ 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 @@ -401,43 +273,100 @@ AC_ARG_WITH(capabilities, [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 +/* Some global constants. */ +#ifdef HAVE_DRIVE_LETTERS +#define GNUPG_DEFAULT_HOMEDIR "c:/gnupg" +#elif defined(__VMS) +#define GNUPG_DEFAULT_HOMEDIR "/SYS\$LOGIN/gnupg" #else -#error "No endianness found" -#endif +#define GNUPG_DEFAULT_HOMEDIR "~/.gnupg" +#endif +#define GNUPG_PRIVATE_KEYS_DIR "private-keys-v1.d" + +/* Tell libgcrypt not to use its own libgpg-error implementation. */ +#define USE_LIBGPG_ERROR 1 + +/* This is the major version number of GnuPG so that + source included files can test for this. Note, that\ + we use 2 here even for GnuPG 1.9.x. */ +#define GNUPG_MAJOR_VERSION 2 + +/* Now to separate file name parts. + Please note that the string version must not contain more + than one character because the code assumes strlen()==1 */ +#ifdef HAVE_DOSISH_SYSTEM +#define DIRSEP_C '\\' +#define DIRSEP_S "\\" +#define EXTSEP_C '.' +#define EXTSEP_S "." +#define PATHSEP_C ';' +#define PATHSEP_S ";" +#define EXEEXT_S ".exe" +#else +#define DIRSEP_C '/' +#define DIRSEP_S "/" +#define EXTSEP_C '.' +#define EXTSEP_S "." +#define PATHSEP_C ':' +#define PATHSEP_S ":" +#define EXEEXT_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 '-' + +/* For some systems (DOS currently), we hardcode the path here. For + POSIX systems the values are constructed by the Makefiles, so that + the values may be overridden by the make invocations; this is to + comply with the GNU coding standards. */ +#ifdef HAVE_DRIVE_LETTERS +#define GNUPG_BINDIR "c:\\gnupg" +#define GNUPG_LIBEXECDIR "c:\\gnupg" +#define GNUPG_LIBDIR "c:\\gnupg" +#define GNUPG_DATADIR "c:\\gnupg" +#endif + +/* Setup the hardwired names of modules. */ +#ifndef GNUPG_DEFAULT_AGENT +#define GNUPG_DEFAULT_AGENT ( GNUPG_BINDIR DIRSEP_S "gpg-agent" EXEEXT_S ) +#endif +#ifndef GNUPG_DEFAULT_PINENTRY +#define GNUPG_DEFAULT_PINENTRY ( GNUPG_BINDIR DIRSEP_S "pinentry" EXEEXT_S ) +#endif +#ifndef GNUPG_DEFAULT_SCDAEMON +#define GNUPG_DEFAULT_SCDAEMON ( GNUPG_BINDIR DIRSEP_S "scdaemon" EXEEXT_S ) +#endif +#ifndef GNUPG_DEFAULT_DIRMNGR +#define GNUPG_DEFAULT_DIRMNGR ( GNUPG_BINDIR DIRSEP_S "dirmngr" EXEEXT_S ) +#endif +#ifndef GNUPG_DEFAULT_PROTECT_TOOL +#define GNUPG_DEFAULT_PROTECT_TOOL \ + ( GNUPG_LIBEXECDIR DIRSEP_S "gpg-protect-tool" EXEEXT_S ) +#endif + + +/* Derive some other constants. */ #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 +/* Temporary hacks to avoid requring a libgpg-error update. */ +#if !HAVE_DECL_GPG_ERR_LOCKED +#define GPG_ERR_LOCKED 173 +#endif -#include "g10defs.h" - -#endif /*GNUPG_CONFIG_H_INCLUDED*/ ]) AM_MAINTAINER_MODE -dnl Checks for programs. - +# Checks for programs. AC_PROG_MAKE_SET AM_SANITY_CHECK missing_dir=`cd $ac_aux_dir && pwd` @@ -446,26 +375,27 @@ 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_AWK AC_PROG_CC AC_PROG_CPP +AC_PROG_INSTALL +AC_PROG_LN_S +AC_PROG_MAKE_SET AC_PROG_RANLIB AC_CHECK_TOOL(AR, ar, :) AC_PATH_PROG(PERL,"perl") AC_ISC_POSIX +gl_EARLY 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 -MPI_OPT_FLAGS="" try_gettext=yes have_dosish_system=no -need_dlopen=yes +have_w32_system=no case "${host}" in *-mingw32*) # special stuff for Windoze NT @@ -478,15 +408,9 @@ case "${host}" in [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 + have_w32_system=yes 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 @@ -494,7 +418,6 @@ case "${host}" in AC_DEFINE(HAVE_DRIVE_LETTERS) have_dosish_system=yes try_gettext="no" - agent_support=no ;; i?86-*-msdosdjgpp*) @@ -503,9 +426,14 @@ case "${host}" in AC_DEFINE(HAVE_DRIVE_LETTERS) have_dosish_system=yes try_gettext="no" - agent_support=no ;; + *-*-freebsd*) + # FreeBSD + CPPFLAGS="$CPPFLAGS -I/usr/local/include" + LDFLAGS="$LDFLAGS -L/usr/local/lib" + ;; + *-*-hpux*) if test -z "$GCC" ; then CFLAGS="$CFLAGS -Ae -D_HPUX_SOURCE" @@ -520,11 +448,11 @@ case "${host}" in ;; *-dec-osf5*) if test -z "$GCC" ; then - # Use the newer compiler `-msg_disable ptrmismatch1' to + # Use the newer compiler `-msg_disable ptrmismatch' 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" + CFLAGS="$CFLAGS -msg_disable ptrmismatch" fi ;; m68k-atari-mint) @@ -535,34 +463,143 @@ 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 + [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]) +if test "$have_w32_system" = yes; then + AC_DEFINE(HAVE_W32_SYSTEM,1, [Defined if we run on a W32 API based system]) fi +AM_CONDITIONAL(HAVE_W32_SYSTEM, test "$have_w32_system" = yes) -AC_SUBST(MPI_OPT_FLAGS) -GNUPG_SYS_SYMBOL_UNDERSCORE - -dnl These need to go after AC_PROG_CC so that $EXEEXT is defined - +# 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") +# +# Checks for libraries. +# + + +# +# libgpg-error is a library with error codes shared between GnuPG +# related projects. +# +AM_PATH_GPG_ERROR("$NEED_GPG_ERROR_VERSION", + have_gpg_error=yes,have_gpg_error=no) +_tmp_gpg_error_save_cflags="$CFLAGS" +CFLAGS="$CFLAGS $GPG_ERROR_CFLAGS" +AC_CHECK_DECLS(GPG_ERR_LOCKED,,,[#include ]) +CFLAGS="${_tmp_gpg_error_save_cflags}" + + +# +# Libgcrypt is our generic crypto library +# +AM_PATH_LIBGCRYPT("$NEED_LIBGCRYPT_API:$NEED_LIBGCRYPT_VERSION", + have_libgcrypt=yes,have_libgcrypt=no) + + +# +# libassuan is used for IPC +# +AM_PATH_LIBASSUAN("$NEED_LIBASSUAN_VERSION", + have_libassuan=yes,have_libassuan=no) + + +# +# libksba is our X.509 support library +# +AM_PATH_KSBA("$NEED_KSBA_VERSION",have_ksba=yes,have_ksba=no) +# fixme: Remove the following test and require newer libksba instead. +_ksba_save_libs=$LIBS +LIBS=$KSBA_LIBS +AC_CHECK_FUNCS(ksba_dn_teststr) +LIBS=$_ksba_save_libs + +# +# libusb allows us to use the integrated CCID smartcard reader driver. +# +AC_CHECK_LIB(usb, usb_bulk_write, + [ LIBUSB_LIBS="$LIBUSB_LIBS -lusb" + AC_DEFINE(HAVE_LIBUSB,1, + [defined if libusb is available]) + ]) +AC_SUBST(LIBUSB_LIBS) +AC_CHECK_FUNCS(usb_create_match) + +# +# Check wether it is necessary to link against libdl. +# +LIBS="" +AC_SEARCH_LIBS(dlopen, c dl,,,) +DL_LIBS=$LIBS +AC_SUBST(DL_LIBS) + +# +# Checks for symcryptrun: +# + +# libutil has openpty() and login_tty(). +AC_CHECK_LIB(util, openpty, + [ LIBUTIL_LIBS="$LIBUTIL_LIBS -lutil" + AC_DEFINE(HAVE_LIBUTIL,1, + [defined if libutil is available]) + ]) +AC_SUBST(LIBUTIL_LIBS) + +# shred is used to clean temporary plain text files. +AC_PATH_PROG(SHRED, shred, /usr/bin/shred) +AC_DEFINE_UNQUOTED(SHRED, + "${SHRED}", [defines the filename of the shred program]) + + +# +# Check whether the (highly desirable) GNU Pth library is available +# Note, that we include a Pth emulation for W32. +# +AC_ARG_WITH(pth-prefix, + AC_HELP_STRING([--with-pth-prefix=PFX], + [prefix where GNU Pth is installed (optional)]), + pth_config_prefix="$withval", pth_config_prefix="") +if test x$pth_config_prefix != x ; then + PTH_CONFIG="$pth_config_prefix/bin/pth-config" fi +AC_PATH_PROG(PTH_CONFIG, pth-config, no) +if test "$have_w32_system" = no; then + if test "$PTH_CONFIG" = "no"; then + AC_MSG_WARN([[ +*** +*** To support concurrent access to the gpg-agent and the SCdaemon +*** we need the support of the GNU Portable Threads Library. +*** Download it from ftp://ftp.gnu.org/gnu/pth/ +*** On a Debian GNU/Linux system you might want to try +*** apt-get install libpth-dev +***]]) + else + GNUPG_PTH_VERSION_CHECK(1.3.7) + if test $have_pth = yes; then + PTH_CFLAGS=`$PTH_CONFIG --cflags` + PTH_LIBS=`$PTH_CONFIG --ldflags` + PTH_LIBS="$PTH_LIBS `$PTH_CONFIG --libs --all`" + AC_DEFINE(USE_GNU_PTH, 1, + [Defined if the GNU Portable Thread Library should be used]) + AC_DEFINE(HAVE_PTH, 1, + [Defined if the GNU Pth is available]) + fi + fi +else + have_pth=yes + PTH_CFLAGS="" + PTH_LIBS="" + AC_DEFINE(USE_GNU_PTH, 1) + AC_DEFINE(HAVE_PTH, 1) +fi +AC_SUBST(PTH_CFLAGS) +AC_SUBST(PTH_LIBS) + 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 @@ -574,107 +611,124 @@ AC_CHECK_FUNC(gethostbyname, , AC_CHECK_LIB(nsl, gethostbyname, 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. +dnl Now try for the resolver functions so we can use DNS SRV -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-srv, + AC_HELP_STRING([--disable-dns-srv],[disable the use of DNS SRV in HKP]), + use_dns_srv=$enableval,use_dns_srv=yes) -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) - -if test x"$use_dns_pka" = xyes || test x"$use_dns_srv" = xyes || test x"$use_dns_cert" = xyes; then - _dns_save_libs=$LIBS +if test x"$try_hkp" = xyes && test x"$use_dns_srv" = xyes ; then + _srv_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(__res_query,resolv bind,,use_dns_srv=no)) AC_SEARCH_LIBS(dn_expand,resolv bind,, - AC_SEARCH_LIBS(__dn_expand,resolv bind,,have_resolver=no)) + AC_SEARCH_LIBS(__dn_expand,resolv bind,,use_dns_srv=no)) AC_SEARCH_LIBS(dn_skipname,resolv bind,, - AC_SEARCH_LIBS(__dn_skipname,resolv bind,,have_resolver=no)) + AC_SEARCH_LIBS(__dn_skipname,resolv bind,,use_dns_srv=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 -#include -#include -#include ], -[[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 -#include -#include -#include ], -[[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 + if test x"$use_dns_srv" = xyes ; then + AC_DEFINE(USE_DNS_SRV,1,[define to use DNS SRV]) + SRVLIBS=$LIBS else - use_dns_srv=no - use_dns_pka=no - use_dns_cert=no + AC_MSG_WARN([Resolver functions not found. Disabling DNS SRV.]) fi - - LIBS=$_dns_save_libs + LIBS=$_srv_save_libs fi -AC_SUBST(DNSLIBS) +AC_SUBST(SRVLIBS) -AM_CONDITIONAL(USE_DNS_SRV, test x"$use_dns_srv" = xyes) - -# Check for LDAP +# Try and link a LDAP test program to weed out unusable LDAP +# libraries. -lldap [-llber [-lresolv]] is for OpenLDAP. OpenLDAP in +# general is terrible with creating weird dependencies. If all else +# fails, the user can play guess-the-dependency by using something +# like ./configure LDAPLIBS="-Lfoo -lbar" if test "$try_ldap" = yes ; then - GNUPG_CHECK_LDAP($NETLIBS) + for MY_LDAPLIBS in ${LDAPLIBS+"$LDAPLIBS"} "-lldap" "-lldap -llber" "-lldap -llber -lresolv"; do + _ldap_save_libs=$LIBS + LIBS="$MY_LDAPLIBS $NETLIBS $LIBS" + + AC_MSG_CHECKING([whether LDAP via \"$MY_LDAPLIBS\" is present and sane]) + AC_TRY_LINK([#include ],[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 +#include ],[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=$MY_LDAPLIBS + GPGKEYS_LDAP="gpgkeys_ldap$EXEEXT" + + AC_MSG_CHECKING([whether LDAP supports ldap_get_option]) + + if test "$gnupg_cv_func_ldap_init" = yes ; then + AC_TRY_LINK([#include ], + [ldap_get_option((void *)0,0,(void *)0);], + [gnupg_cv_func_ldap_get_option=yes], + [gnupg_cv_func_ldap_get_option=no]) + else + AC_TRY_LINK([#include +#include ],[ldap_get_option((void *)0,0,(void *)0);], + [gnupg_cv_func_ldap_get_option=yes], + [gnupg_cv_func_ldap_get_option=no]) + fi + + AC_MSG_RESULT([$gnupg_cv_func_ldap_get_option]) + + if test "$gnupg_cv_func_ldap_get_option" = yes ; then + AC_DEFINE(HAVE_LDAP_GET_OPTION,1,[Define if the LDAP library has ldap_get_option]) + else + AC_MSG_CHECKING([whether LDAP supports ld_errno]) + + if test "$gnupg_cv_func_ldap_init" = yes ; then + AC_TRY_COMPILE([#include ], + [LDAP *ldap; ldap->ld_errno;], + [gnupg_cv_func_ldap_ld_errno=yes], + [gnupg_cv_func_ldap_ld_errno=no]) + else + AC_TRY_LINK([#include +#include ],[LDAP *ldap; ldap->ld_errno;], + [gnupg_cv_func_ldap_ld_errno=yes], + [gnupg_cv_func_ldap_ld_errno=no]) + fi + + 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 fi +AC_SUBST(GPGKEYS_LDAP) +AC_SUBST(LDAPLIBS) + + # 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) +# fixme: need to add this +#LIBCURL_CHECK_CONFIG([yes],,,[fake_curl=yes]) +#AM_CONDITIONAL(FAKE_CURL,test x"$fake_curl" = xyes) +AM_CONDITIONAL(FAKE_CURL,1) # Generic, for us, means curl @@ -716,7 +770,7 @@ case "${host}" in ;; i?86-*-msdosdjgpp*) PRINTABLE_OS_NAME="MSDOS/DJGPP" - try_extensions=no + try_dynload=no ;; *-linux*) PRINTABLE_OS_NAME="GNU/Linux" @@ -729,26 +783,6 @@ 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]) @@ -765,83 +799,20 @@ else 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. +# Checks for header files. AC_HEADER_STDC -AC_CHECK_HEADERS([unistd.h langinfo.h termio.h locale.h getopt.h pwd.h]) +AC_CHECK_HEADERS(string.h unistd.h langinfo.h termio.h locale.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. +# 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_ENDIAN GNUPG_CHECK_TYPEDEF(byte, HAVE_BYTE_TYPEDEF) GNUPG_CHECK_TYPEDEF(ushort, HAVE_USHORT_TYPEDEF) @@ -853,16 +824,17 @@ 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 ],[ +# fixme: really needed in gnupg? I think it is only useful in libcgrypt. +AC_CACHE_CHECK([for UINT64_C],[gnupg_cv_uint64_c_works], + AC_COMPILE_IFELSE(AC_LANG_PROGRAM([#include 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" \ @@ -871,47 +843,53 @@ if test "$ac_cv_sizeof_unsigned_short" = "0" \ fi dnl Do we have any 64-bit data types? -if test x"$use_sha512" = xyes \ - && test "$ac_cv_sizeof_unsigned_int" != "8" \ +if 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 + && test "$ac_cv_sizeof_uint64_t" != "8"; then + AC_MSG_WARN([No 64-bit types. Disabling SHA-384, and SHA-512]) +else + if test x"$use_sha512" = xyes ; then + AC_SUBST(SHA512_O,sha512.o) + AC_DEFINE(USE_SHA512,1,[Define to include the SHA-384 and SHA-512 digests]) + fi fi -if test x"$use_sha512" = xyes ; then - AC_DEFINE(USE_SHA512,1,[Define to include the SHA-384 and SHA-512 digests]) -fi +# fixme: do we really need this - it should be encapsulated in libassuan +GNUPG_SYS_SO_PEERCRED -AM_CONDITIONAL(USE_SHA512, test x"$use_sha512" = xyes) - -dnl Checks for library functions. -AC_CHECK_DECLS(getpagesize) +# Checks for library functions. AC_FUNC_FSEEKO AC_FUNC_VPRINTF AC_FUNC_FORK AC_CHECK_FUNCS(strerror stpcpy strsep strlwr tcgetattr strtoul mmap) -AC_CHECK_FUNCS(strcasecmp strncasecmp ctermid times unsetenv getpwnam getpwuid) +AC_CHECK_FUNCS(strcasecmp strncasecmp ctermid times gmtime_r) 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) +AC_CHECK_FUNCS(fseeko ftello ttyname isascii) AC_CHECK_TYPES([struct sigaction, sigset_t],,,[#include ]) -# 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. +# gnulib checks +gl_SOURCE_BASE(gl) +gl_M4_BASE(gl/m4) +gl_MODULES(setenv strsep mkdtemp vasprintf xsize) +gl_INIT + +# These are needed by libjnlib - fixme: we should have macros for them +AC_CHECK_FUNCS(memicmp stpcpy strlwr strtoul memmove stricmp strtol) +AC_CHECK_FUNCS(getrusage setrlimit stat setlocale) +AC_CHECK_FUNCS(flockfile funlockfile fopencookie funopen) -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 # +# fixme: Do we need this - iirc, this is only used by libgcrypt. +# AC_CACHE_CHECK([for gethrtime], [gnupg_cv_func_gethrtime], [AC_TRY_LINK([#include ],[ @@ -950,13 +928,9 @@ GNUPG_FUNC_MKDIR_TAKES_ONE_ARG dnl dnl Check whether we can use Linux capabilities as requested dnl +# fixme: Still required? +# 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 @@ -983,134 +957,12 @@ 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) +[ --disable-regex do not handle regular expressions in trust sigs], + use_regex=$enableval, use_regex=yes) AC_MSG_RESULT($use_regex) if test "$use_regex" = yes ; then @@ -1142,24 +994,22 @@ main() { regex_t blah ; regmatch_t p; p.rm_eo = p.rm_eo; return regcomp(&blah, " 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 ]) + AC_DEFINE(USE_GNU_REGEX,1,[ Define if you want to use the included regex lib ]) + AC_SUBST(REGEX_O,regex.o) 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, +# +# Do we have zlib? Must do it here because Solaris failed +# when compiling a conftest (due to the "-lz" from LIBS). +# Note that we combine zlib and bzlib2 in ZLIBS. +# +_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" @@ -1167,22 +1017,15 @@ else fi ]) - AC_CHECK_HEADER(zlib.h, +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 +# +# Check whether we can support bzip2 +# if test "$use_bzip2" = yes ; then _cppflags="${CPPFLAGS}" _ldflags="${LDFLAGS}" @@ -1195,10 +1038,9 @@ if test "$use_bzip2" = yes ; then 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. - + # 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, @@ -1212,15 +1054,16 @@ if test "$use_bzip2" = yes ; then CPPFLAGS=${_cppflags} LDFLAGS=${_ldflags},[#include ]) 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 +# See wether we want to run the long test suite. +AC_ARG_WITH(pkits-tests, + AC_HELP_STRING([--with-pkits-tests],[run the PKITS based tests]), + [run_pkits_tests=$withval], [run_pkits_tests=no]) +AM_CONDITIONAL(RUN_PKITS_TESTS, test "$run_pkits_tests" = "yes") + # Allow users to append something to the version string without # flagging it as development version. The user version parts is @@ -1240,170 +1083,205 @@ fi AM_CONDITIONAL(CROSS_COMPILING, test x$cross_compiling = xyes) +GNUPG_CHECK_GNUMAKE -# add some extra libs here so that previous tests don't fail for +# 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 +if test "$have_w32_system" = yes; then + W32LIBS="-lwsock32" +fi + + +if test "$GCC" = yes; then + if test "$USE_MAINTAINER_MODE" = "yes"; then + CFLAGS="$CFLAGS -Wall -Wcast-align -Wshadow -Wstrict-prototypes" + CFLAGS="$CFLAGS -Wno-format-y2k -Wformat-security" + else + CFLAGS="$CFLAGS -Wall" + fi +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_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]) +# We use jnlib, so tell other modules about it +AC_DEFINE(HAVE_JNLIB_LOGGING, 1, + [Defined if jnlib style logging functions are available]) - 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 +# For W32 we need to use our Pth emulation code +if test "$have_w32_system" = yes; then + AC_CONFIG_LINKS(pth.h:jnlib/w32-pth.h) fi -CL_AS_NOEXECSTACK -if test "$print_egd_warning" = yes; then - AC_MSG_WARN([[ +# +# Decide what to build +# +missing_pth=no +if test $have_ksba = no; then + build_gpgsm=no + build_scdaemon=no +fi + +build_agent_threaded="" +if test "$build_agent" = "yes"; then + if test $have_pth = no; then + build_agent_threaded="(not multi-threaded)" + missing_pth=yes + fi +fi + +build_scdaemon_extra="" +if test "$build_scdaemon" = "yes"; then + tmp="" + if test $have_pth = no; then + build_scdaemon_extra="not multi-threaded" + tmp=", " + missing_pth=yes + fi + if test -n "$build_scdaemon_extra"; then + build_scdaemon_extra="(${build_scdaemon_extra})" + fi +fi + + +if test "$build_agent_only" = "yes" ; then + build_gpg=no + build_gpgsm=no + build_scdaemon=no +fi + + +AM_CONDITIONAL(BUILD_GPG, test "$build_gpg" = "yes") +AM_CONDITIONAL(BUILD_GPGSM, test "$build_gpgsm" = "yes") +AM_CONDITIONAL(BUILD_AGENT, test "$build_agent" = "yes") +AM_CONDITIONAL(BUILD_SCDAEMON, test "$build_scdaemon" = "yes") +AM_CONDITIONAL(BUILD_SYMCRYPTRUN, test "$build_symcryptrun" = "yes") + + + +# +# Print errors here so that they are visible all +# together and the user can acquire them all together. +# +die=no +if test "$have_gpg_error" = "no"; then + die=yes + AC_MSG_NOTICE([[ +*** +*** You need libgpg-error to build this program. +** This library is for example available at +*** ftp://ftp.gnupg.org/gcrypt/libgpg-error +*** (at least version $NEED_GPG_ERROR_VERSION is required.) +***]]) +fi +if test "$have_libgcrypt" = "no"; then + die=yes + AC_MSG_NOTICE([[ +*** +*** You need libgcrypt to build this program. +** This library is for example available at +*** ftp://ftp.gnupg.org/gcrypt/libgcrypt/ +*** (at least version $NEED_LIBGCRYPT_VERSION using API $NEED_LIBGCRYPT_API) is required.) +***]]) +fi +if test "$have_libassuan" = "no"; then + die=yes + AC_MSG_NOTICE([[ *** -*** 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 +*** You need libassuan to build this program. +*** This library is for example available at +*** ftp://ftp.gnupg.org/gcrypt/alpha/libassuan/ +*** (at least version $NEED_LIBASSUAN_VERSION is required). +***]]) +fi +if test "$have_ksba" = "no"; then + AC_MSG_NOTICE([[ *** -*** Entropy Gathering Daemon (EGD) +*** You need libksba to build this program. +*** This library is for example available at +*** ftp://ftp.gnupg.org/gcrypt/alpha/libksba/ +*** (at least version $NEED_KSBA_VERSION is required). +***]]) +fi +if test "$missing_pth" = "yes"; then + AC_MSG_NOTICE([[ *** -*** 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: +*** It is now required to build with support for the +*** GNU Portable Threads Library (Pth). Please install this +*** library first. The library is for example available at +*** ftp://ftp.gnu.org/gnu/pth/ +*** On a Debian GNU/Linux system you can install it using +*** apt-get install libpth-dev +***]]) + die=yes +fi + +if test "$die" = "yes"; then + AC_MSG_ERROR([[ *** -*** 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. +*** Required libraries not found. Please consult the above messages +*** and install them before running configure again. ***]]) fi -# Note the \\\\ for backslashes. Autoconf eats one layer, leaving \\ - -AC_CONFIG_COMMANDS(g10defs.h,[[ -cat >g10defs.tmp <>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([ +AC_CONFIG_FILES([ m4/Makefile Makefile -m4/Makefile -intl/Makefile po/Makefile.in -util/Makefile -mpi/Makefile -cipher/Makefile +intl/Makefile +gl/Makefile +jnlib/Makefile +common/Makefile +kbx/Makefile g10/Makefile -keyserver/Makefile -keyserver/gpgkeys_mailto -keyserver/gpgkeys_test -doc/Makefile +sm/Makefile +agent/Makefile +scd/Makefile tools/Makefile -tools/gpg-zip -zlib/Makefile -checks/Makefile +doc/Makefile +tests/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 +#./autogen keyserver/Makefile +#tests/pkits/Makefile + + + + +echo " + GnuPG v${VERSION} has been configured as follows: + + Platform: $PRINTABLE_OS_NAME ($host) + + OpenPGP: $build_gpg + S/MIME: $build_gpgsm + Agent: $build_agent $build_agent_threaded + Smartcard: $build_scdaemon $build_scdaemon_extra + + Protect tool: $show_gnupg_protect_tool_pgm + Default agent: $show_gnupg_agent_pgm + Default pinentry: $show_gnupg_pinentry_pgm + Default scdaemon: $show_gnupg_scdaemon_pgm + Default dirmngr: $show_gnupg_dirmngr_pgm + + PKITS based tests: $run_pkits_tests +" + diff --git a/contrib/UTF-8-test.txt b/contrib/UTF-8-test.txt deleted file mode 100644 index 2510f779c..000000000 Binary files a/contrib/UTF-8-test.txt and /dev/null differ diff --git a/contrib/changes-in-2000 b/contrib/changes-in-2000 deleted file mode 100644 index d9a18d09f..000000000 --- a/contrib/changes-in-2000 +++ /dev/null @@ -1,114 +0,0 @@ -New features since 1.0.0 ------------------------- - - * The default symmetric cipher algorithm is now AES (aka - Rijndael). OpenPGP uses preferences to figure out the algorithm - to use, so this is only used if the recipient knows how to - handles AES. - - * RSA keys can now be used (either old PGP 2 or new OpenPGP ones). - RSA key generation is not yet available. - - * Unattended key generation. - - * Faster and more robust random number generator under W32. - - * 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. - - * GnuPG knows what the primary user ID is. - - * Large File Support (LFS) is working. - - * Ability to run gpg as a full controlled inferior process to speed up - mass verification of signatures. - - * Rewritten key selection code so that GnuPG can better cope with - multiple subkeys, expiration dates and so on. The drawback is that it - is slower. - - * New utility gpgv which is a stripped down version of gpg to - be used to verify signatures against a list of trusted keys. - - * 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. - - * 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 option --no-auto-key-retrieve to disable retrieving of a - missing public key from a keyserver, even when a keyserver has - been configured. Useful for dial-up connections. - - * HTTP proxy support for keyservers. - - * Keyserver support is how also available for W32 platforms (MS - Windows 95, 98, 2000, NT, ME). - - * Experimental gpg-agent support to get the passphrase from a - daemon which can pop up a query window. - - -rfc2440bis support (PGP 6.5.8 does also handle them) -------------------- - - * MDC enhanced encryption is now used with the AES and Twofish - algorithms to detect manipulated messages. - - * The user is now asked for the reason of a revocation. - - -Translations: ------------- - - * Enhanced UTF-8 support - - * New translations: Danish, Estonian, Indonesian, Portuguese and - Turkish. - -Serious bug fixes: ------------------- - - * 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. - - * Protection against the recent Klima/Rosa attck on secret key - rings. - - * 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. - -PGP quirks ----------- - - * Can handle (but not display) PGP's photo IDs. - - * Better default values to increase compatibilty with PGP. - - * Many other small enhancements to support the not fully-OpenPGP - compliant PGP versions. - -Manual ------- - - * The manual called GNU Privacy Handbook (GPH) is a separate - package and available preformatted in English, German, Italian, - Russian and Spanish at http://www.gnupg.org/docs.html. - [Due to the complicated build process, the source is currently - on available from CVS] - - diff --git a/contrib/why-gnupg b/contrib/why-gnupg deleted file mode 100644 index 289b9af8c..000000000 --- a/contrib/why-gnupg +++ /dev/null @@ -1,80 +0,0 @@ -Why to use GnuPG and not PGP. ------------------------------ - - * PGP 2 is nearly Free Software but encumbered by the IDEA patent. - - * PGP 2 is old, hard to maintain and limited to one set of - encryption algorithms (RSA + IDEA) - - * PGP 2 is not a GNU or Unix Program and threfore not easy to use in - those environments - - * PGP 2 has a couple of minor security flaws - - * PGP 5 and 6 are more or less OpenPGP conform but proprietray - software. Source code is available but there is no way to be sure - that the distributed binary versions do match the source code. - Parts of the source code are not published. It is illegal to - build versions of PGP from source and distribute them (IIRC, there - is an exception for private users). - - * PGP 5 and 6 are not fullty OpenPGP compliant - - * PGP 7 is claimed to be OpenPGP compliant but the source code is - not anymore published. - - * At least versions before 6.5.8 had severe coding bugs. We don't - know about PGP 7. - - * PGP 5, 6 and 7 implement complicated methods for key recovering in - corporate environments. Although this is not a hidden feature, - this leads to more code and bugs. - - * NAI as the vendor of PGP seems to be a major government contractor. - - * Given the history of known backdoors in other proprietary software - (e.g. Lotus Notes), some folks claim that there might also be - backdoors in PGP 5, 6 and 7. Now there are even more rumors after - Phil Zimmermann left NAI. - - * GnuPG is Free Software under the GNU GPL. It does not use - patented algorithms. - - * Everyone is able to scrutinize the source code, build, distribute - and use versions of his own or from a trusted party he chooses. - - * The build environment is also Free Software and therefore less - likely tampered with malicious code. The exception here is the MS - Windows version of GnuPG where the OS is proprietary. The binary - version however is build using an entirely Free Software OS and - toolchain (cross-platfrom development under GNU/Linux). - - * Security fixes are provided very fast. - - * GnuPG is a standard tool in all GNU/Linux systems and used in many - different environments. - - * GnuPG gives reasonable messages and not just "Error encrypting". - - * GnuPG supports most of the optional features of the OpenPGP standard. - - * GnuPG comes with internationalization support for 16 languages. - - * Graphical frontends are available and they divert the task of - the actual cryptographic operations to GnuPG as a specialized tool - for this. A library called GPGME is available which makes - interfacing of GnuPG with other programs quite easy. - - * GnuPG is available for all GNU and Unix platforms as well as for - all MS Windows Operating systems. Porting to VMS, MAC OSX and - OS/2 is nearly finished. - - - - - - - - - - diff --git a/debian/README.Debian b/debian/README.Debian deleted file mode 100644 index 854a2e43a..000000000 --- a/debian/README.Debian +++ /dev/null @@ -1,28 +0,0 @@ -GDBM keyring support --------------------- - -GDBM-based keyring support is (and always) was an experimental feature -which is likely to be removed in future versions. For that reason it -is not compiled into the Debian package and won't be until and unless -GDBM support stabilises. - -Upgrading from old (<= 0.3.3) versions 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: - - - --- -James Troup , Horsforth, UK -Sun, 1 Oct 2000 13:53:12 +0100 - diff --git a/debian/changelog b/debian/changelog deleted file mode 100644 index 8d33a87ae..000000000 --- a/debian/changelog +++ /dev/null @@ -1,402 +0,0 @@ -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 Mon, 30 Apr 2001 02:12:38 +0100 - -gnupg (1.0.4-4) unstable; urgency=low - - * po/ru.po: patch by Ilya Martynov 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 , closes: - #93664. - - * Deprecated depreciated; noticed by Vincent Broman - . - - * 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 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 , closes: #87487. - * debian/preinst: the old GnuPG debs have moved to people.debian.org. - * cipher/random.c: #include as well as - * 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 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 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 Tue, 17 Oct 2000 17:26:17 +0100 - -gnupg (1.0.3b-1) unstable; urgency=low - - * New upstream snapshot version. - - -- James Troup 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 - 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 - . [#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 Nicols Lichtmaier 's request. [#57314] - - -- James Troup Sun, 1 Oct 2000 14:55:03 +0100 - -gnupg (1.0.3-1) unstable; urgency=low - - * New upstream version. - - -- James Troup Mon, 18 Sep 2000 15:56:54 +0100 - -gnupg (1.0.2-1) unstable; urgency=low - - * New upstream version. - - -- James Troup 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 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 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 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 Wed, 20 Oct 1999 23:39:05 +0100 - -gnupg (1.0.0-1) unstable; urgency=low - - * New upstream release. [#44545] - - -- James Troup 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 . [#42288] - * debian/rules (binary-arch): correct the path where modules are looked - for. Reported by Karl M. Hegbloom . [#40881] - * debian/postinst, debian/postrm: under protest, register gpg the - package with suidmanager and make it suid by default. - [#29780,#32590,#40391] - - -- James Troup Tue, 10 Aug 1999 00:12:40 +0100 - -gnupg (0.9.10-1) unstable; urgency=low - - * New upstream version. - - -- James Troup Fri, 6 Aug 1999 01:16:21 +0100 - -gnupg (0.9.9-1) unstable; urgency=low - - * New upstream version. - - -- James Troup 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 - . [#38864] - - -- James Troup Sun, 27 Jun 1999 01:07:58 +0100 - -gnupg (0.9.7-1) unstable; urgency=low - - * New upstream version. - - -- James Troup 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 - . - * debian/control (Depends): depend on makedev (>= 2.3.1-13) to ensure - that /dev/urandom exists; reported by Steffen Markert - . [#32076] - - -- James Troup 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 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 Mon, 8 Mar 1999 19:58:28 +0100 - -gnupg (0.9.3-1) unstable; urgency=low - - * New upstream version. - - -- James Troup 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 Wed, 20 Jan 1999 21:23:11 +0100 - -gnupg (0.9.1-1) unstable; urgency=low - - * New upstream version. - - -- James Troup 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 . - - -- James Troup 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 Tue, 8 Dec 1998 22:40:23 +0000 - -gnupg (0.4.4-1) unstable; urgency=low - - * New upstream version. - - -- James Troup 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 . - * debian/rules (binary-arch): install `README.Debian' - * debian/control (Standards-Version): updated to 2.5.0.0. - - -- James Troup 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 - . - * debian/rules (binary-arch): don't install the now non-existent `rfcs', - but do install `OpenPGP'. - - -- James Troup 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 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 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 Thu, 9 Jul 1998 21:06:07 +0200 - -gnupg (0.3.1-1) unstable; urgency=low - - * New upstream version. - - -- James Troup Tue, 7 Jul 1998 00:26:21 +0200 - -gnupg (0.3.0-2) unstable; urgency=low - - * Applied bug-fix patch from Werner. - - -- James Troup 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 . - * 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 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 Sat, 30 May 1998 12:12:35 +0200 - -gnupg (0.2.18-1) unstable; urgency=low - - * New upstream version. - - -- James Troup 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 Mon, 4 May 1998 22:36:51 +0200 - -gnupg (0.2.15-1) unstable; urgency=high - - * New upstream version. - - -- James Troup Fri, 10 Apr 1998 01:12:20 +0100 - -gnupg (0.2.13-1) unstable; urgency=high - - * New upstream version. - - -- James Troup Wed, 11 Mar 1998 01:52:51 +0000 - -gnupg (0.2.12-1) unstable; urgency=low - - * New upstream version. - - -- James Troup Sat, 7 Mar 1998 13:52:40 +0000 - -gnupg (0.2.11-1) unstable; urgency=low - - * New upstream version. - - -- James Troup Wed, 4 Mar 1998 01:32:12 +0000 - -gnupg (0.2.10-1) unstable; urgency=low - - * New upstream version. - * Name changed upstream. - - -- James Troup Mon, 2 Mar 1998 07:32:05 +0000 - -g10 (0.2.7-1) unstable; urgency=low - - * Initial release. - - -- James Troup Fri, 20 Feb 1998 02:05:34 +0000 - -Local variables: -mode: debian-changelog -End: diff --git a/debian/control b/debian/control deleted file mode 100644 index 5b158daf5..000000000 --- a/debian/control +++ /dev/null @@ -1,24 +0,0 @@ -Source: gnupg -Section: non-US -Priority: optional -Maintainer: James Troup -Standards-Version: 3.1.1.1 -Build-Depends: gettext, libgdbmg1-dev, libz-dev - -Package: gnupg -Architecture: any -Depends: ${shlibs:Depends}, makedev (>= 2.3.1-13) -Suggests: gnupg-doc -Conflicts: gpg-rsa, gpg-rsaref, suidmanager (<< 0.50) -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 use any patented algorithms so it cannot be - compatible with PGP2 because it uses IDEA (which is patented - worldwide) and RSA. RSA's patent expired on the 20th September 2000, - and it is now included in GnuPG. diff --git a/debian/copyright b/debian/copyright deleted file mode 100644 index e5d99f688..000000000 --- a/debian/copyright +++ /dev/null @@ -1,29 +0,0 @@ -This is Debian GNU's prepackaged version of GnuPG, a free PGP -replacement. - -This package was put together by me, James Troup , -from the sources, which I obtained from -ftp://ftp.gnupg.org/pub/gcrypt/gnupg/gnupg-1.0.5.tar.gz. The changes -were minimal, namely: - -- adding support for the Debian package maintenance scheme, by adding - various debian/* files. - -Program Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. -Modifications for Debian Copyright (C) 1998, 1999, 2000, 2001 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., 59 Temple Place, Suite 330, -Boston, MA 02111-1307, USA. diff --git a/debian/distfiles b/debian/distfiles deleted file mode 100644 index f7f226104..000000000 --- a/debian/distfiles +++ /dev/null @@ -1,6 +0,0 @@ -README.Debian -changelog -control -copyright -preinst -rules diff --git a/debian/lintian.override b/debian/lintian.override deleted file mode 100644 index c35ed27b3..000000000 --- a/debian/lintian.override +++ /dev/null @@ -1 +0,0 @@ -gnupg: setuid-binary usr/bin/gpg 4755 root/root diff --git a/debian/preinst b/debian/preinst deleted file mode 100644 index 607944c7c..000000000 --- a/debian/preinst +++ /dev/null @@ -1,47 +0,0 @@ -#!/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 < debian/tmp/usr/bin/lspgpot - chmod 755 debian/tmp/usr/bin/lspgpot - $(STRIP) --strip-unneeded debian/tmp/usr/lib/gnupg/* - # In response to #53714... no idea if it's correct, will check with upstream - mv debian/tmp/usr/share/locale/es_ES debian/tmp/usr/share/locale/es - 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 - gzip -9v debian/tmp/usr/share/man/man1/* - # Remove from /usr/share/gnupg that we install into /usr/share/doc/gnupg/ - rm debian/tmp/usr/share/gnupg/FAQ debian/tmp/usr/share/gnupg/faq.html - install -d debian/tmp/usr/share/doc/gnupg/ - install -m 644 debian/changelog debian/tmp/usr/share/doc/gnupg/changelog.Debian - install -m 644 debian/README.Debian README NEWS THANKS TODO doc/DETAILS \ - doc/FAQ doc/faq.html doc/OpenPGP debian/tmp/usr/share/doc/gnupg/ - for i in po util mpi cipher tools g10 checks include; do \ - install -m 644 $$i/ChangeLog debian/tmp/usr/share/doc/gnupg/changelog.$$i; done - install -m 644 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 -m 644 debian/copyright debian/tmp/usr/share/doc/gnupg/ - install -d debian/tmp/usr/share/lintian/overrides/ - install -m 644 debian/lintian.override debian/tmp/usr/share/lintian/overrides/gnupg - dpkg-shlibdeps g10/gpg - dpkg-gencontrol -isp - chown -R root.root debian/tmp - chmod -R go=rX debian/tmp - dpkg --build debian/tmp .. - -define checkdir - test -f g10/g10.c -a -f debian/rules -endef - -# Below here is fairly generic really - -binary: binary-indep binary-arch - -checkroot: - $(checkdir) - test root = "`whoami`" - -.PHONY: binary binary-arch binary-indep clean checkroot diff --git a/doc/ChangeLog b/doc/ChangeLog index c6d73976f..0c60d29a7 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -1,1103 +1,217 @@ -2006-06-22 David Shaw +2006-02-14 Werner Koch - * gpg.sgml: Document --enable-dsa2, --disable-dsa2, and - --default-keyserver-url. + * gpgsm.texi (GPGSM Configuration): New section. - * DETAILS: Note "Keyserver:" +2005-11-14 Werner Koch - * gpg.sgml: Note that --pgp8 does not include SHA224. Clarify - that clearsigned messages are not reversible. + * qualified.txt: Added real information. -2006-05-23 David Shaw +2005-11-13 Werner Koch - * mksamplekeys: Incorporate new package signature key and minimize - keys when generating samplekeys.asc. + * qualified.txt: New. + * Makefile.am (dist_pkgdata_DATA): New. -2006-05-17 Werner Koch +2005-08-16 Werner Koch - * samplekeys.asc: Added new package signature key and cleaned all - keys to save space. + * gpg-agent.texi (Agent Options): Note default file name for + --write-env-file. -2006-04-18 David Shaw +2005-06-03 Werner Koch - * gpg.sgml: Reminders that --cipher-algo, --digest-algo, and - --compress-algo should be avoided. + * debugging.texi (Architecture Details): New section, mostly empty. + * gnupg-card-architecture.fig: New. + * Makefile.am: Rules to build png and eps versions. -2006-04-11 Michael Roth (wk) + * gpg-agent.texi (Agent UPDATESTARTUPTTY): New. - * gpg.sgml (passphrase-fd): Explain that only the first line is used. +2005-05-17 Werner Koch -2006-04-09 David Shaw + * gpg-agent.texi (Agent Options): Removed --disable-pth. - * gpg.sgml: Some typo fixes. This is Debian 361324. +2005-04-27 Werner Koch -2006-03-11 David Shaw + * tools.texi (symcryptrun): Added. - * samplekeys.asc: Update 99242560 to have a signing subkey - backsig. + * scdaemon.texi: Removed OpenSC specific options. -2006-03-09 David Shaw +2005-04-20 Werner Koch - * gpg.sgml: Clarify new notation delete feature. + * gpg-agent.texi (Agent Configuration): New section. -2006-03-08 David Shaw +2005-02-24 Werner Koch - * gpg.sgml: Document "notation". + * tools.texi (gpg-connect-agent): New. -2006-03-07 David Shaw +2005-02-14 Werner Koch - * gpg.sgml: Rename backsigs to cross-certification (backsigs is - just shorthand). Document max-cert-size. + * gpgsm.texi (Certificate Management): Document --import. - * gpg.sgml: Document new way of enabling the PKA functions. Some - minor other cleanups. +2005-01-27 Moritz Schulte -2006-03-06 David Shaw + * gpg-agent.texi: Document ssh-agent emulation layer. - * gpg.sgml: Document --auto-key-locate. +2005-01-04 Werner Koch -2006-02-24 David Shaw + * gnupg.texi: Updated to use @copying. - * gpg.sgml: Document new --keyserver syntax. +2004-12-22 Werner Koch -2005-12-20 Werner Koch + * gnupg.texi: Reordered. + * contrib.texi: Updated. - * gpg.sgml (trust-model): Document "auto" and the "pka" variants. - (keyserver-options): Document "auto-pka-retrieve". - (allow-pka-lookup): Document. +2004-12-21 Werner Koch -2005-12-08 David Shaw + * tools.texi (gpg-preset-passphrase): New section. - * gpg.sgml: Document --fetch-keys. + * gnupg-badge-openpgp.eps, gnupg-badge-openpgp.jpg: New + * gnupg.texi: Add a logo. + * sysnotes.texi: New. -2005-12-07 David Shaw +2004-11-05 Werner Koch - * gpg.sgml: Document -d. Add [file] to a few options. + * debugging.texi (Common Problems): Curses pinentry problem. -2005-11-17 David Shaw +2004-10-22 Werner Koch - * gpg.sgml: Clarify "xxxxx-clean" and "clean". Document - "xxxxx-minimal", and "minimize". + * tools.texi (Helper Tools): Document gpgsm-gencert.sh. -2005-11-02 David Shaw +2004-10-05 Werner Koch - * gpg.sgml: Clarify what is and isn't included in a "clean sigs". + * gpg-agent.texi (Invoking GPG-AGENT): Tell that GPG_TTY needs to + be set in all cases. -2005-10-27 David Shaw +2004-09-30 Werner Koch - * gpg.sgml: Document backsign, --require-backsigs, and - --no-require-backsigs. + * gpg.texi: New. + * gnupg.texi: Include gpg.texi - * DETAILS: Clarify Key-Usage. + * tools.texi: Add a few @command markups. + * gpgsm.texi: Ditto + * gpg-agent.texi: Ditto. + * scdaemon.texi: Ditto. -2005-10-07 Werner Koch +2004-09-30 Marcus Brinkmann - * gpgv.sgml: Small spelling corrections by Mike Dowling. + * tools.texi (Changing options): Add documentation for gpgconf. -2005-09-21 David Shaw + * contrib.texi (Contributors): Add two missing periods. - * 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. +2004-09-29 Werner Koch -2005-08-23 David Shaw + * gpgsm.texi (Configuration Options): Add --log-file. - * 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. + * gpg-agent.texi (Invoking GPG-AGENT): Add a few words about the + expected pinentry filename. -2005-07-22 Werner Koch - - * gpg.sgml: Removed entry for --no-interactive-selection. - -2005-07-19 Werner Koch - - * gpg.sgml: Document --limit-card-insert-tries. - -2005-07-18 David Shaw - - * samplekeys.asc: Update 99242560. - - * gpg.sgml: Clarify --throw-keyid and --hidden-recipient a bit. - -2005-06-20 David Shaw - - * gpg.sgml: Document --edit-key/clean, import-clean, and - export-clean. - -2005-06-20 Werner Koch - - * gpg.sgml: Document smartcard related options. - -2005-06-06 Werner Koch - - * DETAILS: New subcode 5 for CARDCTRL. - -2005-05-13 David Shaw - - * 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 - - * gpg.sgml: Clarify --min-cert-level a bit. - -2005-03-14 Werner Koch - - * gnupg-w32.reg: Removed. - -2005-03-07 Werner Koch - - * gpg.sgml (comment): Add note to keep the comment short. - - * DETAILS: Document new status codes. - -2005-02-15 Werner Koch - - * 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. + Changed license of the manual stuff to GPL. - * gpg.sgml: Add bkuptocard command for --edit-key. + * gnupg.texi (Top): New menu item Helper Tools. -2005-02-05 David Shaw + * tools.texi (Helper Tools): New. + * Makefile.am (gnupg_TEXINFOS): Add tools.texi. - * gpg.sgml: Note that level 0 signatures are always accepted - regardless of --min-cert-level. +2004-08-05 Werner Koch -2005-02-03 Werner Koch + * scdaemon.texi (Card applications): New section. - * README.W32: Updated to match the switch to the NSIS installer. +2004-06-22 Werner Koch -2005-01-27 Werner Koch + * glossary.texi: New. - * faq.raw: Updated to the version from 1.2.7. +2004-06-18 Werner Koch -2005-01-18 Werner Koch + * debugging.texi: New. + * gnupg.texi: Include it. - * gnupg-w32.reg: Remove the entry for the home directory. +2004-05-11 Werner Koch -2004-12-16 Werner Koch - - * TRANSLATE: Add a note on how to send translations. - -2004-12-16 David Shaw - - * 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 - - * 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 - - * highlights-1.4.txt: New. - - * mksamplekeys, samplekeys.asc: Add the PGP global directory key. - -2004-11-26 David Shaw - - * gpg.sgml: Document export-minimal. - -2004-10-28 David Shaw - - * DETAILS: Document SIG_SUBPACKET status tag. - -2004-10-28 Werner Koch - - * Makefile.am (EXTRA_DIST): Add gpg.ru.1. - -2004-10-18 David Shaw - - * gpg.sgml: Minor language tweaks. - - * samplekeys.asc: Updated 99242560. - - * DETAILS: spk flags are hex. - -2004-10-15 Werner Koch - - * DETAILS: Document IMPORT_CHECK. - -2004-10-14 David Shaw - - * gpg.sgml: Document using "none" to remove preferred keyservers, - the keyserver timeout parameter, and the direct trust model. - -2004-09-23 Werner Koch - - * gpg.sgml: Document "addcardkey" and "keytocard". - -2004-09-20 Werner Koch - - * gpg.sgml: Document -K. - -2004-09-16 David Shaw - - * 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 - - * gpg.sgml: Document "--debug-ccid-driver". - -2004-09-14 David Shaw - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * DETAILS, credits-1.0, credits-1.2: ElGamal -> Elgamal. - - * gpg.sgml: Document --no-use-embedded-filename and - --min-cert-level. - - * gpgv.sgml: Removed leftover . + * gpgsm.texi (Esoteric Options): Add --debug-allow-core-dump. 2004-05-03 Werner Koch - * gpgv.sgml: Removed reference to non-available option - --no-default-keyring. + * gpg-agent.texi (Agent Options): Add --allow-mark-trusted. -2004-04-09 David Shaw +2004-02-03 Werner Koch - * gpg.sgml: Document delsig. Clarify that --refresh-keys - arguments are optional. Document --bzip2-decompress-lowmem. + * contrib.texi (Contributors): Updated from the gpg 1.2.3 thanks + list. + * gpgsm.texi, gpg-agent.texi, scdaemon.texi: Language cleanups. -2004-04-05 Werner Koch +2003-12-01 Werner Koch - * DETAILS (NEWSIG): Documented. + * gpgsm.texi (Certificate Options): Add --{enable,disable}-ocsp. -2004-02-25 David Shaw +2003-11-17 Werner Koch - * gpg.sgml: Document --ask-cert-level, --max-output, and - --default-cert-level. + * scdaemon.texi (Scdaemon Options): Added --allow-admin and + --deny-admin. - * 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. +2003-10-27 Werner Koch -2004-02-12 David Shaw + * gpg-agent.texi (Agent GET_CONFIRMATION): New. - * gnupg.7: Clarify that 'gpgv' doesn't encrypt, and that's not a - bug. +2002-12-04 Werner Koch - * samplekeys.asc: Update 99242560. + * gpg-agent.texi (Agent Signals): New. - * 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. +2002-12-03 Werner Koch -2004-01-30 David Shaw + * gpgsm.texi (Operational Commands): Add --passwd and + --call-protect-tool. + * gpg-agent.texi (Agent PASSWD): New - * DETAILS: Details for --list-config. +2002-11-13 Werner Koch - * gpg.sgml: Document --ungroup and --list-config. + * gpg-agent.texi (Invoking GPG-AGENT): Tell about GPG_TTY. -2004-01-07 David Shaw +2002-11-12 Werner Koch - * gpg.sgml: Fix a few minor typos. Clarify what --textmode is - useful for. + * gpgsm.texi (Operational Commands): Add --call-dirmngr. - * 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. +2002-09-25 Werner Koch - * gpg.sgml: Add an example of what an exclamation mark is, as - people seem to miss it often. + * gpg-agent.texi (Agent Options): Add --keep-tty and --keep-display. -2003-12-08 David Shaw +2002-09-12 Werner Koch - * 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. + * gpg-agent.texi (Invoking GPG-AGENT): Explained how to start only + one instance. -2003-10-31 Werner Koch +2002-08-28 Werner Koch - * DETAILS: Add a note about the date format for X.509. + * gpg-agent.texi (Agent Options): Explained more options. + * scdaemon.texi (Scdaemon Options): Ditto. -2003-11-21 David Shaw +2002-08-09 Werner Koch - * 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 - - * 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 - - * DETAILS: Add the 'a' value for field 12 and the new field 15. - -2003-10-01 David Shaw - - * samplekeys.asc: Update 99242560. - - * gpg.sgml: Document --no-groups. - -2003-09-30 David Shaw - - * 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 - - * DETAILS: Note fingerprint of signing key in sig records. - -2003-08-31 David Shaw - - * gpg.sgml: Use "keyserver-url" instead of "preferred-keyserver" - for the sake of short and simple commands. - -2003-08-29 David Shaw - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * gpg.sgml: Some general language tweaks. Note default algo for - --symmetric. --export-ownertrust takes no args. Document - --no-escape-from-lines. Fix escaped "From". Make - "openpgp" trust model into "pgp". - -2003-04-27 David Shaw - - * 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 - - * gpg.sgml: Document --enable-progress-filter. - -2003-04-07 David Shaw - - * 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 - - * DETAILS (VALIDSIG): Add primary keys fingerprint. - -2003-01-27 David Shaw - - * DETAILS: Document trust depth, value, and regexp. - -2003-01-14 David Shaw - - * 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 - - * DETAILS: Document disabled flag in capabilities field. - -2002-12-27 David Shaw - - * 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 - - * samplekeys.asc: Updated. - -2002-12-10 David Shaw - - * 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 - - * gpg.sgml: Document --no-mangle-dos-filenames. - -2002-12-01 David Shaw - - * 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 - - * 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 - - * gpg.sgml: Add an interoperability section. - -2002-11-17 David Shaw - - * gpg.sgml: Correct defaults for --s2k-mode and --s2k-digest-mode. - Noted by Haakon Riiser. - -2002-11-14 David Shaw - - * gpg.sgml: --compress-algo now allows algorithm names. - -2002-11-13 David Shaw - - * gpg.sgml: Document --trust-model. - -2002-11-04 David Shaw - - * KEYSERVER: New. Documents the --with-colons format for - keyserver listings. - - * DETAILS: Clarify meaning of 'u'. Noted by Timo. - -2002-11-03 David Shaw - - * 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 - - * README.W32: Add blurb on how to create a ZIP file, changed - requirement for mingw32 to 0.3.2. - -2002-10-24 David Shaw - - * gpg.sgml: Document --refresh-keys. - -2002-10-19 David Shaw - - * gpg.sgml: Clarify --force-mdc, and document --disable-mdc. - -2002-10-12 Werner Koch - - * DETAILS (KEY_CREATED): Enhanced by fingerprint. - -2002-10-03 David Shaw - - * gpg.sgml: Note that '#' means secret-key-unavailable, and that - keyserver schemes are case-insensitive. - -2002-09-30 David Shaw - - * gpg.sgml: Note that --pgp2 disables --textmode when encrypting. - -2002-09-20 David Shaw - - * gpg.sgml: Some minor language cleanup. - -2002-09-20 Werner Koch - - * DETAILS: s/XORed/ORed/. - -2002-09-15 Werner Koch - - * gpg.sgml: Add rebuild-keydb-caches. - -2002-09-12 David Shaw - - * DETAILS: Fix batch key generation example. - -2002-09-11 Werner Koch - - * Makefile.am (EXTRA_DIST): Include gnupg-32.reg - -2002-09-02 Werner Koch - - * gpg.sgml: Updated the charset option. - - * DETAILS: Added status IMPORT_OK. - - * gnupg.7: New mini man page. - -2002-08-30 David Shaw - - * 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 - - * faq.raw: Updated. New Maintainer is David D. Scribner. - -2002-08-22 David Shaw - - * gpg.sgml: Clarify meaning of keyserver option include-revoked. - -2002-08-21 Werner Koch - - * DETAILS: Added IMPORT_PROBLEM. - -2002-08-20 David Shaw - - * DETAILS: Clarify that trust letters 'q' and '-' can be treated - identically. - - * gpg.sgml: Document --ignore-mdc-error. - -2002-08-06 David Shaw - - * gpg.sgml: Clarify that only long-form options can go in the - config file. + * Makefile.am (gnupg_TEXINFOS): Include contrib.texi. 2002-08-06 Werner Koch - * gpg.sgml: Fixed doc regarding the name change of the option - file. + * gpgsm.texi: Added more options. -2002-07-30 David Shaw +2002-07-26 Werner Koch - * 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. + * assuan.texi: New. + * gpgsm.texi, scdaemon.texi, gpg-agent.texi: Documented the Assuan + protocol used. -2002-07-25 Werner Koch +2002-07-22 Werner Koch - * gpg.sgml: Document new --delete behaviour. + * gnupg.texi, scdaemon.texi, gpg-agent.texi: New. + * contrib.texi, gpl.texi, fdl.texi: New. + * gpgsm.texi: Made this an include file for gnupg.texi. + * Makefile.am: Build gnupg.info instead of gpgsm.info. -2002-07-25 David Shaw +2002-06-04 Werner Koch - * 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. + * gpgsm.texi (Invocation): Described the various debug flags. -2002-07-01 David Shaw +2002-05-14 Werner Koch - * gpg.sgml: Clarify "group". - -2002-07-01 Werner Koch - - * 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 - - * README.W32: Adjusted some descriptions. Fixed the regsitry - entry descriptions. - -2002-06-21 David Shaw - - * DETAILS: Document "uat". - - * gpg.sgml: Document - --personal-{compress|digest|compress}-preferences, --group, and - add comments to --expert. - -2002-06-17 Werner Koch - - * gpg.sgml: Grammar fix. - -2002-06-03 David Shaw - - * DETAILS: Details of ATTRIBUTE. - - * gpg.sgml: Document --attribute-fd - -2002-06-03 Timo Schulz - - * DETAILS: Add ATTRIBUTE. + * Makefile.am, gpgsm.texi: New. -2002-05-31 David Shaw - - * 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 - - * gpg.sgml: sgml syntax fix. - -2002-05-12 Werner Koch - - * gpg.sgml: Fixed URL in the description section. - - * faq.raw: Minor typo fixes noted by kromJx@myrealbox.com. - -2002-05-11 Werner Koch - - * gpg.sgml: Typo fix. - -2002-05-07 David Shaw - - * 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 - - * gpg.sgml: Add an entry for --encrypt-files and --decrypt-files. - -2002-04-29 David Shaw - - * gpg.sgml: Fix minor error in --pgp6 documentation: it does not - imply --digest-algo MD5 - -2002-04-29 Werner Koch - - * 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 - - * 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 - - * gpg.sgml: Moved options from section "COMMANDS" to - section "OPTIONS". - -2002-04-20 David Shaw - - * samplekeys.asc: Added 0x5B0358A2 - -2002-04-19 David Shaw - - * 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 - - * 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 - - * gpg.sgml: auto-key-retrieve is a keyserver-option (noted by - Roger Sondermann). - -2002-03-27 David Shaw - - * 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 - - * 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 - - * 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 - - * 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 - - * gpg.sgml: Add an entry for --export-ownertrust. Suggested by - Bernhard Reiter. - -2002-01-26 Timo Schulz - - * gnupg-w32.reg: New. Registry file for W32 in registry format. - -2002-01-26 Werner Koch - - * gpg.sgml: A few words about --gpg-agent-info and GPG_AGENT_INFO. - -2002-01-25 Timo Schulz - - * README.W32: Modify the filename because now the .exe extension - is automatically added to the binary. - -2002-01-14 Werner Koch - - * gpg.sgml: Talk about PGP 5 and higher. - -2002-01-11 David Shaw - - * 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 - - * DETAILS: Removed the comment that unattended key generation is - experimental. It is now a standard feature. - -2001-12-22 David Shaw - - * 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 - - * gpg.sgml: Add a remark on how to get the long key ID. Suggested - by Sebastian Klemke. - -2001-10-23 Werner Koch - - * gpg.sgml: Add missing tag. - -2001-09-28 Werner Koch - - * gpg.sgml: Add a note on option parsing. - -2001-09-24 Werner Koch - - * gpg.sgml: Described --{update,check}-trustdb. - -2001-09-03 Werner Koch - - * gpg.sgml, gpgv.sgml: Removed GDBM stuff. - -2001-08-29 Werner Koch - - * 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 - - * 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 - - * gpg.sgml: Added --ignore-valid-from - -2001-04-20 Werner Koch - - * 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 - - * faq.raw: Add a note about dates displayed as ????-??-??. - -2001-04-17 Werner Koch - - * 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 - - * gpg.sgml: Small typo fixes by Florian Weimer. - -2001-03-27 Werner Koch - - * gpg.sgml: Add --no-sig-cache and --no-sig-create-check. - -2001-03-23 Werner Koch - - * DETAILS: New status UNEXPECTED. - -2001-03-13 Werner Koch - - * gpg.sgml: Described --fixed-list-mode. - -2001-03-06 Werner Koch - - * gpgv.sgml: Changed some gpg to gpgv. Thanks to John A. Murdie. - -2001-03-03 Werner Koch - - * gpg.sgml: Tell something about the 0x12345678! key ID syntax. - -2001-01-18 Werner Koch - - * README.W32: Changed building instructions for MinGW32/CPD 0.3 - -2001-01-09 Werner Koch - - * DETAILS: Fixed docs for NEED_PASSPHRASE and added USERID_HINT. - -2000-11-30 Werner Koch - - * gpg.sgml: Fixed the description of --verify. Add a short note - the warnings sections. - -2000-10-19 Werner Koch - - * gpg.sgml: Fixed doc for --allow-non-selfsigned-uid. - Add entry for --ignore-crc-error. - -2000-10-18 Werner Koch - - * OpenPGP: Dropped the paragraph that RSA is not implemented. - -2000-10-14 Werner Koch - - * faq.raw: Add an answer to the problem of multiple signatures. - -Wed Oct 4 15:50:18 CEST 2000 Werner Koch - - * gpgv.sgml: New. - * Makefile.am: build it. - -Thu Sep 14 14:20:38 CEST 2000 Werner Koch - - * faq.raw: New. - * Makefile.am: Support to build FAQs - -Wed Jul 12 13:32:06 CEST 2000 Werner Koch - - * 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 - - * 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 - - * FAQ: Enhanced answer for the 3des-s2k bug. - -Sat Dec 4 12:30:28 CET 1999 Werner Koch - - * gpg.sgml: Add section about the user ID - -Mon Nov 22 11:14:53 CET 1999 Werner Koch - - * 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 - - * README.W32: New. - -Mon Sep 6 19:59:08 CEST 1999 Werner Koch - - - * Makefile.am (SUBDIRS): New subdir gph for the manual. - -Thu Jul 22 20:03:03 CEST 1999 Werner Koch - - - * gpg.sgml (--always-trust): Added. - -Wed Jul 14 19:42:08 CEST 1999 Werner Koch - - - * Makefile.am: Create a dummy man page if docbook-to-man is missing. - -Wed Jun 16 20:16:21 CEST 1999 Werner Koch - - - * 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 - - - * Makefile.in.in: Use DESTDIR. - -Mon May 31 19:41:10 CEST 1999 Werner Koch - - * gpg.1pod: Enhanced the Bugs section (Michael). - -Wed Feb 10 17:15:39 CET 1999 Werner Koch - - - * gpg.1pod: Spelling and grammar corrections (John A. Martin) - * FAQ: Ditto. - * DETAILS: Ditto. - - - Copyright 1998, 1999, 2000, 2001 Free Software Foundation, Inc. + Copyright 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 @@ -1106,5 +220,3 @@ Wed Feb 10 17:15:39 CET 1999 Werner Koch 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 deleted file mode 100644 index 51a31a5b4..000000000 --- a/doc/DETAILS +++ /dev/null @@ -1,1250 +0,0 @@ - -*- text -*- -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 : -uid:f::::::::Werner Koch : -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 - 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 - 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 - 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 - 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 - The signature with the keyid has not been verified okay. - The username is the primary one encoded in UTF-8 and %XX - escaped. - - ERRSIG \ - - 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 - - - - 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 - 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 - 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 - 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 - Unexpected data has been encountered - 0 - not further specified 1 - - - TRUST_UNDEFINED - TRUST_NEVER - 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 - PKA_TRUST_BAD - 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 - 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 - 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 - Issued whenever a passphrase for symmetric encryption is needed. - - NEED_PASSPHRASE_PIN [] - 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 - 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 - NO_SECKEY - The key is not available - - IMPORT_CHECK - This status is emitted in interactive mode right before - the "import.okay" prompt. - - IMPORTED - The keyid and name of the signature just imported - - IMPORT_OK [] - 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 [] - 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 - - Final statistics on import process (this is one long line) - - FILE_START - Start processing a file . 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 - 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 - 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 [] - 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 [] - The key from batch run has not been created due to errors. - - - SESSION_KEY : - 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 - NOTATION_DATA - name and string are %XX escaped; the data may be splitted - among several notation_data lines. - - USERID_HINT - Give a hint about the user ID for a certain keyID. - - POLICY_URL - string is %XX escaped - - BEGIN_STREAM - END_STREAM - Issued by pipemode. - - INV_RECP - 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 - Issued when no recipients are usable. - - ALREADY_SIGNED - Warning: This is experimental and might be removed at any time. - - TRUNCATED - The output was truncated to MAXNO items. This status code is issued - for certain external requests - - ERROR - - This is a generic error status message, it might be followed - by error location specific data. and - 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 - - This is one long line issued for each attribute subpacket when - an attribute packet is seen during key listing. is the - fingerprint of the key. is the length of the - attribute subpacket. is the attribute type - (1==image). / indicates that this is the Nth - indexed subpacket of count total subpackets in this attribute - packet. and 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. 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 [] - 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 - 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 - 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 - This indicates that a signature subpacket was seen. The - format is the same as the "spk" record above. - - SC_OP_FAILURE [] - 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 - Print . - %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 - %secring - Do not write the key to the default or commandline given - keyring but to . 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: | - 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 of the key in bits. Default is 1024. - Key-Usage: - 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: | - This generates a secondary key. Currently only one subkey - can be handled. - Subkey-Length: - Length of the subkey in bits. Default is 1024. - Subkey-Usage: - Similar to Key-Usage. - Passphrase: - If you want to specify a passphrase for the secret key, - enter it here. Default is not to use any passphrase. - Name-Real: - Name-Comment: - Name-Email: - 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: |([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: - 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: : [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: - 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: - This is an optional parameter that specifies the preferred - keyserver URL for the key. - - -Here is an example: -$ cat >foo < -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 , - where , 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') - -"@t" - Signed text follows. - This emits the control packet (2, 'B') - -"@." - 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 -PUT -DELETE - - -The format of a response is: - -====== -"GNUPG/1.0" status-code status-text -"Content-length:" digits -CRLF -============ -followed by 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=. 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/?op= - -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/HACKING b/doc/HACKING deleted file mode 100644 index eee9f628b..000000000 --- a/doc/HACKING +++ /dev/null @@ -1,305 +0,0 @@ - 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/KEYSERVER b/doc/KEYSERVER deleted file mode 100644 index f63200a6b..000000000 --- a/doc/KEYSERVER +++ /dev/null @@ -1,83 +0,0 @@ -Format of keyserver colon listings -================================== - -David Shaw - -The machine readable response begins with an optional information -line: - -info:: - - = this is the version of this protocol. Currently, this is - the number 1. - - = the number of keys returned in this response. Note this is - the number of keys, and not the number of lines returned. - It should match the number of "pub:" lines returned. - -If this optional line is not included, or the version information is -not supplied, the version number is assumed to be 1. - -The key listings are made up of several lines per key. The first line -is for the primary key: - -pub:::::: - - = this is either the fingerprint or the keyid of the - key. Either the 16-digit or 8-digit keyids are - acceptable, but obviously the fingerprint is best. - Since it is not possible to calculate the keyid from a - V3 key fingerprint, for V3 keys this should be either - the 16-digit or 8-digit keyid only. - - = the algorithm number from RFC-2440. (i.e. 1==RSA, 17==DSA, - etc). - - = the key length (i.e. 1024, 2048, 4096, etc.) - - = creation date of the key in standard RFC-2440 form - (i.e. number of seconds since 1/1/1970 UTC time) - - = expiration date of the key in standard RFC-2440 - form (i.e. number of seconds since 1/1/1970 UTC time) - - = letter codes to indicate details of the key, if any. Flags - may be in any order. - - r == revoked - d == disabled - e == expired - -Following the "pub" line are one or more "uid" lines to indicate user -IDs on the key: - -uid:::: - - == the user ID string, with HTTP %-escaping for - anything that isn't 7-bit safe as well as for - the ":" character. Any other characters may - be escaped, as desired. - -creationdate, expirationdate, and flags mean the same here as before. -The information is taken from the self-sig, if any, and applies to the -user ID in question, and not to the key as a whole. - -Details: - -* All characters except for the are - case-insensitive. - -* Obviously, on a keyserver without integrated crypto, many of the - items given here are not fully trustworthy until the key is - downloaded and signatures checked. For example, the information - that a key is flagged "r" for revoked should be treated as - untrustworthy information until the key is checked on the client - side. - -* Empty fields are allowed. For example, a key with no expiration - date would have the field empty. Also, a keyserver - that does not track a particular piece of information may leave that - field empty as well. I expect that the creation and expiration - dates for user IDs will be left empty in current keyservers. Colons - for empty fields on the end of each line may be left off, if - desired. diff --git a/doc/Makefile.am b/doc/Makefile.am index 34b9ddf65..6c56ae2d3 100644 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -1,4 +1,4 @@ -# Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. +# Copyright (C) 2002, 2004 Free Software Foundation, Inc. # # This file is part of GnuPG. # @@ -14,78 +14,42 @@ # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, +# USA. -## Process this file with automake to create Makefile.in +## Process this file with automake to produce Makefile.in -AUTOMAKE_OPTIONS = no-texinfo.tex +EXTRA_DIST = gnupg-badge-openpgp.eps gnupg-badge-openpgp.jpg \ + gnupg-badge-openpgp.pdf \ + gnupg-card-architecture.eps gnupg-card-architecture.png \ + gnupg-card-architecture.pdf -EXTRA_DIST = DETAILS gpg.sgml gpg.1 gpgv.sgml gpgv.1 faq.raw FAQ faq.html \ - HACKING OpenPGP README.W32 samplekeys.asc gnupg.7 \ - TRANSLATE gpg.ru.sgml gpg.ru.1 highlights-1.4.txt +BUILT_SOURCES = gnupg-card-architecture.eps gnupg-card-architecture.png \ + gnupg-card-architecture.pdf -man_MANS = gpg.1 gpgv.1 gnupg.7 gpg.ru.1 +info_TEXINFOS = gnupg.texi -info_TEXINFOS = gpg.texi gpgv.texi +dist_pkgdata_DATA = qualified.txt -# Need this to avoid building of dvis with automake 1.4 -DVIS = +gnupg_TEXINFOS = \ + gpg.texi gpgsm.texi gpg-agent.texi scdaemon.texi assuan.texi \ + tools.texi debugging.texi glossary.texi contrib.texi gpl.texi \ + sysnotes.texi gnupg-card-architecture.fig -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 = gnupg.tmp gnupg.ops -# We better build the texi versions manually. -#%.texi : %.xml -#if HAVE_DOCBOOK_TO_TEXI -# docbook2texi $< | sed 's,--,---,' \ -# | $(top_srcdir)/scripts/fix-db-texi $@ >$@ -#else -# : Warning: missing docbook to texinfo tools, cannot make $@ -# touch $@ -#endif -# -#%.xml : %.sgml -#if HAVE_DOCBOOK_TO_TEXI -# sgml2xml -x lower $< >$@ -#else -# : Warning: missing docbook to texinfo tools, cannot make $@ -# touch $@ -#endif -# -%.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 +.fig.png: + fig2dev -L png `test -f '$<' || echo '$(srcdir)/'`$< $@ -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 +.fig.jpg: + fig2dev -L jpg `test -f '$<' || echo '$(srcdir)/'`$< $@ + +.fig.eps: + fig2dev -L eps `test -f '$<' || echo '$(srcdir)/'`$< $@ + +.fig.pdf: + fig2dev -L pdf `test -f '$<' || echo '$(srcdir)/'`$< $@ -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/Notes b/doc/Notes new file mode 100644 index 000000000..3598bc7a7 --- /dev/null +++ b/doc/Notes @@ -0,0 +1,245 @@ + +Add an infor page for watchgnupg. + +> * How to mark a CA certificate as trusted. + +There are two ways: + + 1. Let gpg-agent do this for you. Since version 1.9.9 you need to + add the option --allow-mark-trusted gpg-agent.conf or when + invoking gpg-agent. Everytime gpgsm notices an untrusted root + certificate gpg-agent will pop up a dialog to ask whether this + certificate should be trusted. This is similar to whatmost + browsers do. + + The disadvantage of this method and the reason why + --allow-mark-trusted is required is that the list of trusted root + certificates will grow, because almost all user will just hit + "yes, I trust" and "yes, I verified the fingerprint" without + understanding that this is a very serious decision. + + 2. Use your editor. Edit the file ~/.gnupg/trustlist.txt and add + the fingerprints of the trusted root certificates. There are + comments on the top explaining the simple format. The current + CVS version allows for colons in the fingerprint, so you can + easily cut and paste it from whereever you know that this is the + correct fingerprint. + +An example for an entry in the trustlist.txt is: + + # CN=PCA-1-Verwaltung,O=PKI-1-Verwaltung,C=de + 3EEE3D8BB7F0FE5C9F5804A3A7E51BCE98209DF9 S + +This is in fact one that probably made its way into the file using the +first method. As usual a # indicates a comment. The trailing S means +that this is to be used for (X.509). + +It is not possible to trust intermediate CA certificates; gpgsm always +checks the entire chain of certificates. + +> * How to import a key and bind it to some certificate already +> imported. Alternatively, import key and certificate together, from +> a pkcs12 blob, or pkcs8 + certificate blobs, or whatever. +> Alternatively, don't import the key at all, but specify location of +> key using a parameter when signing. + +You always need to import the key; there is something similar to a +keyring (here called a keybox: ~/.gnupg/pubring.kbx). + +Importing a key either from a binary or ascii armored (PEM) certificate +file or from a cert-only signature file is done using + + gpg --import FILE + +or + + gpg --import < FILE + +In general you should first import the root certificates and then down +to the end user certificate. You may put all into one file and gpgsm +will do the right thing in this case independend of the order. + +While verifying a signature, all included certificates are +automagically imported. + +To import from a pkcs#12 file you may use the same command; if a +private key is contained in that file, you will be asked for the +transport passphrases as well as for the new passphrase used to +protect it in gpg-agent's private key storage +(~/.gnupg/private-keys-v1.d/). Note that the pkcs#12 support is very +basic but sufficient for certificates exported from Mozilla, OpenSSL +and MS Outlook. + +Background info on private keys: + +If you want to look at the private key you first need to know the name +of the keyfile. Run the command "gpgsm -K --with-key-data [KEYID]" and +you get an output like: + + crs::1024:1:CF8[..]6D:20040105T184908:2006[...]:09::CN=ZS[....]::esES: + fpr:::::::::3B50BF2BDAF2[...]1AE6796D:::2812[...]508F21F065E65E44: + grp:::::::::C92DB9CFD588ADE846BE3AC4E7A2E1B11A4A2ADB: + uid:::::::::CN=Werner Koch,OU=test,O=g10 Code,C=de:: + uid::::::::::: + +This should be familar to advanced gpg-users; see doc/DETAILS in gpg +1.3 (CVS HEAD) for a description of the records. The value in the +"grp" tagged record is the so called keygrip and you should find a +file ~/.gnupg/private-keys-v1.d/C92DB9CFD588ADE846BE3AC4E7A2E1B11A4A2ADB.key +with the private and public key in an S-expression like format. The +gpg-protect-tool may be used to display it in a human readable format: + + $ gpgsm --call-protect-tool ~/.gnupg/private-keys-v1.d/C9[...]B.key + (protected-private-key + (rsa + (n #00C16B6E807C47BB[...]10487#) + (e #010001#) + (protected openpgp-s2k3-sha1-aes-cbc + ( + (sha1 "Hvü9Qt^Ç" "96") + #2B17DC766AEA2568EE0C688E18F9757E#) + #65A4FF9F30750A1300[...]7#) + ) + ) + +The current CVS version of gpgsm has a command --dump-keys which lists +more details of a key including the keygrip so you don't need to use +the colon format if you want to manually debug things. + + $ gpgsm --dump-keys + Serial number: 01 + Issuer: CN=Trust Anchor,O=Test Certificates,C=US + Subject: CN=Trust Anchor,O=Test Certificates,C=US + sha1_fpr: 66:8A:47:56:A2:DC:88:FF:DA:B8:95:E1:3C:63:37:55:5F:0A:F7:BF + md5_fpr: 03:01:3B:BB:EC:6C:5D:48:88:4C:95:63:99:84:ED:C0 + keygrip: 6A082B3063F6DA6D68B2994AB11B4328FD6206D2 + notBefore: 2001-04-19 14:57:20 + notAfter: 2011-04-19 14:57:20 + hashAlgo: 1.2.840.113549.1.1.5 (sha1WithRSAEncryption) + keyType: 1024 bit RSA + authKeyId: [none] + keyUsage: certSign crlSign + extKeyUsage: [none] + policies: [none] + chainLength: unlimited + crlDP: [none] + authInfo: [none] + subjInfo: [none] + extn: 2.5.29.14 (subjectKeyIdentifier) [22 octets] + +> * How to import a CRL + +CRLs are managed by the dirmngr which is a separate package. The idea +is to eventaully turn it into a system daemon, so that on a multi-user +machine CRLs are handled more efficiently. As of now the dirmngr +needs service from gpgsm thus it is best to call it through gpgsm: + + gpgsm --call-dirmngr LOAD /absolute/filename/to/a/CRL/file + +See the dirmngr README and manual for further details. + +If you don't want to check CRLs, use the option --diable-crl-checks +with gpgsm. + +> I'm trying to replace the S/MIME support in OpenSSL with gpgsm for the +> MUA Gnus. + +Great; I'd love it. + +> Perhaps I shouldn't be using gpgsm directly? gpgme didn't seem to +> have a command line front end. + +For Gnus it makes sense to use gpgsm directly. Enhancing pgg to +support gpgsm should not be that hard. Things you need to take care +off are: Warn if GPG_AGENT_INFO has not been set, because this will +call gpg-agent for each operation and obviously does not cache the +passphrase them. If GPG_AGENT_INFO has been set, also disable the +passphrase code for gpg and pass --use-agent to gpg - this way gpg +benefits from the passphrase caching and the pinentry. + +You may want to look at gpgconf (tools/README.gpgconf) to provide a +customization interface for gpgsm, gpg-agent and dirmngr. + + +Module Overview +================ + +gpgsm + libgpg-error + libgcrypt + libksba + libassuan [statically linked] + [Standard system libraries] + +gpg-agent + libgpg-error + libgcrypt + libassuan [statically linked] + libpth [system library] + [Standard system libraries] + +scdaemon + libgpg-error + libgcrypt + libksba + libassuan [statically linked] + libusb [system library, optional] + libopensc [system library, optional] + [For reader access libpcsclite or a CT-API library may be + linked at runtime (controllable by scdaemon.conf)] + [Standard system libraries] + +gpg-protect-tool + libgpg-error + libgcrypt + [Standard system libraries] + +dirmngr + libgpg-error + libgcrypt + libksba + libassuan [statically linked] + libldap [system libary] + liblber [system libary] + libsasl [system libary, required by libldap] + libdb2 [system libary, required by libsasl] + libcrypt [system libary, required by libsasl - OOPS] + libpam [system libary, required by libsasl] + [Standard system libraries] + +pinentry-curses + libncurses + [Standard system libraries] + [Independent Assuan code is source included] + +pinentry-gtk + libncurses + [GTK+ and X libraries] + [Standard system libraries] + [Independent Assuan code is source included] + +pinentry-qt + libncurses + [QT and X libraries] + [Standard system libraries] + [Independent Assuan code is source included] + +gpgme + [Standard system libraries] + [gpgsm is required at runtime] + [Independent Assuan code is source included] + +libgpg-error + [none] + +libgcrypt + libgpg-error + +libksba + libgpg-error + +libassuan + [none] + + + diff --git a/doc/OpenPGP b/doc/OpenPGP deleted file mode 100644 index a511ad7fd..000000000 --- a/doc/OpenPGP +++ /dev/null @@ -1,108 +0,0 @@ - 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 index cd30711f7..6417e90cb 100644 --- a/doc/README.W32 +++ b/doc/README.W32 @@ -1,189 +1,42 @@ -README.W32 -*- text -*- + README.W32 + ============ + 2004-12-22 -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. + This is a precompiled version of gnupg 1.9.14 for MS Windows. + Please see the manual (gnupg.pdf) for the current limitations. Be + aware that this is the first released version and thus bugs are + pretty likely. -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. + Please copy all files to the directory c:\gnupg and follow the + manual instructions. -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. + This software has been build using Debian's mingw package, version + 3.3.1.20030804.1-1. Libraries are all compiled statically, versions + of the used libraries are: + + gpg-error-config: 1.1-cvs + libgcrypt-config: 1.2.1-cvs + ksba-config: 0.9.11-cvs + libassuan-config: 0.6.9-cvs + + as these are all CVS versions you need to get the from the CVS. See + www.gnupg.org for details. Use 2004-12-22 18:00 UTC as revision + date. The source code of GnuPG itsself is available at + ftp://ftp.gnupg.org/gcrypt/alpha/gnupg/gnupg-1.9.14.tar.bz2 + ftp://ftp.gnupg.org/gcrypt/alpha/gnupg/gnupg-1.9.14.tar.bz2.sig + + Building has been done by running the command + + ./autogen.sh --build-w32 + + for all these libraries and then for gnupg. The PDF file has been + produced by first converting the logo file to pdf and the running + "make gnupg.pdf" in the doc directory. All executables have been + stripped. + + In case of questions please contact us at info@g10code.com or better + write to the mailing list gnupg-devel@gnupg.org. + + Thanks, + + The g10 Code team diff --git a/doc/TRANSLATE b/doc/TRANSLATE deleted file mode 100644 index 1a2f266c9..000000000 --- a/doc/TRANSLATE +++ /dev/null @@ -1,33 +0,0 @@ -$Id$ - -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/assuan.texi b/doc/assuan.texi new file mode 100644 index 000000000..cb6eb9c31 --- /dev/null +++ b/doc/assuan.texi @@ -0,0 +1,193 @@ +@c Copyright (C) 2002 Free Software Foundation, Inc. +@c This is part of the GnuPG manual. +@c For copying conditions, see the file gnupg.texi. + +@node Assuan +@appendix Description of the Assuan protocol. +@cindex Assuan, IPC + +The architecture of the modular GnuPG system is based on a couple of +highly specialized modules which make up a network of client server +communication. A common framework for intermodule communication is +therefore needed and should be implemented in a library. + +@appendixsubsec Goals + +@itemize @bullet +@item Common framework for module communication +@item Easy debugging +@item Easy module testing +@item Extendible +@item Optional authentication and encryption facility +@item Usable to access external hardware +@end itemize + + +@appendixsubsec Design criteria + +@itemize @bullet +@item Client Server with back channel +@item Use a mainly text based protocol +@item Escape certain control characters +@item Allow indefinite data length +@item Request confidentiality for parts of the communication +@item Dummy module should allow direct linking of client and server. +@item Inline data or descriptor passing for bulk data +@item No protection against DoS needed +@item Subliminal channels are not an issue +@end itemize + + +@appendixsubsec Implementation + +@noindent +The implementation is line based with a maximum line size of 1000 +octects. The default IPC mechanism are Unix Domain Sockets. + +On a connect request the server responds either with an okay or an error +status. For authentication check the server may send an Inquiry +Response prior to the first Okay, it may also issue Status messages. +The server must check that the client is allowed to connect, this is +done by requesting the credentials for the peer and comparing them to +those of the server. This avoids attacks based on wrong socket +permissions. + +It may choose to delay the first response in case of an error. The +server never closes the connection - however the lower protocol may do +so after some time of inactivity or when the connection is in an error +state. + +All textual messages are assumed to be in UTF-8 unless otherwise noted. + + +@appendixsubsec Server responses + +@table @code +@item OK [] +Request was successful. + +@item ERR @var{errorcode} [] +Request could not be fulfilled. The error codes are mostly application +specific except for a few common ones. + +@item S @var{keyword} +Informational output by the server, still processing the request. + +@item # +Comment line issued only for debugging purposes. Totally ignored. + +@item D +Raw data returned to client. There must be exactly one space after the +'D'. The values for '%', CR and LF must be percent escaped; this is +encoded as %25, %0D and %0A. Only uppercase letters should be used in +the hexadecimal representation. Other characters may be percent escaped +for easier debugging. All these Data lines are considered one data +stream up to the OK or ERR response. Status and Inquiry Responses +may be mixed with the Data lines. + +@item INQUIRE @var{keyword}> +Server needs further information from the client. The client should +answer with a command which is allowed after an inquiry. Note that the +server does not confirm that client command but either continues +processing or ends processing with an error status. Not all commands +are allowed. +@end table + + +A client should only check the first letter of each line and then skip +over to the next token (except for data lines where the raw data starts +exactly after 2 bytes). Lines larger than 1000 bytes should be +treated as a communication error. (The rationale for having a line +length limit is to allow for easier multiplexing of multiple channels). + + +@appendixsubsec Client requests + +The server waits for client requests after he sent an Okay or Error. +The client should not issue a request in other cases with the +exception of the CANCEL command. + +@example +@var{command} +@end example + +@var{command} is a one word string without preceding white space. +Parameters are command specific, CR, LF and the percent signs should be +percent escaped as described above. To send a backslash as the last +character it should also be percent escaped. Percent escaping is +allowed anywhere in the parameters but not in the command. The line +ends with a CR, LF or just a LF. + +Not yet implemented feature: If there is a need for a parameter list +longer than the line length limit (1000 characters including command and +CR, LF), the last character of the line (right before the CR/LF or LF) +must be a non-escape encoded backslash. The following line is then +expected to be a continuation of the line with the backslash replaced by +a blank and the line ending removed. + +@example +D +@end example + +Raw data to the server. There must be exactly one space after the 'D'. +The values for '%', CR and LF must be percent escaped; this is encoded +as %25, %0D and %0A. Only uppercase letters should be used in the +hexadecimal representation. Other characters may be percent escaped for +easier debugging. All these Data lines are considered one data stream +up to the OKAY or ERROR response. Status and Inquiry Responses may be +mixed with the Data lines. + +@example +END +@end example + + + +Lines beginning with a @code{#} or empty lines are ignored. This is +useful to comment test scripts. + + +Although the commands are application specific, some of them are used by +all protocols and partly directly supported by the Assuan library: + +@table @code +@item CANCEL +his is the one special command which aborts the current request. it can +be sent at any time and the server will stop its operation right before +it would send the next response line (of any type). + +@item BYE +Close the connect, the server will reply with an @code{OK}. + +@item AUTH +Not yet specified as we don't implement it in the first phase. See my +mail to gpa-dev on 2001-10-25 about the rationale for measurements +against local attacks. + +@item RESET +Reset the connection but not any existing authentication. The server +should release all resources associated with the connection. + +@item END +Used by a client to mark the end of raw data. The server may send END +to indicate a partial end of data. +@end table + + + +@appendixsubsec Error Codes + +Here we keep a list of error codes used in any Assuan based +protocol. The format is the string @code{ERR}, white space, the error +number, white space, a textual description of the error. + +@table @code + +@item 100 Unknown Command +@item 101 Not Implemented + +@item 301 certificate has been revoked [DirMngr] +@item 302 no CRL known for this certificate [DirMngr] +@item 303 CRL is too old and a new one could not be retrieved [DirMngr] + +@end table diff --git a/doc/credits-1.2 b/doc/contrib.texi similarity index 58% rename from doc/credits-1.2 rename to doc/contrib.texi index 115328c11..28ea2e1d3 100644 --- a/doc/credits-1.2 +++ b/doc/contrib.texi @@ -1,16 +1,46 @@ -The GNU Privacy Guard has been created by the GnuPG team: David Shaw, -Matthew Skala, Michael Roth, Niklas Hernaeus, Nils Ellmenreich, Rmi -Guyomarch, Stefan Bellon, Timo Schulz and Werner Koch. Birger -Langkjer, Daniel Resare, Dokianakis Theofanis, Edmund GRIMLEY EVANS, -Gal Quri, Gregory Steuck, Nagy Ferenc Lszl, Ivo Timmermans, Jacobo -Tarri'o Barreiro, Janusz Aleksander Urbanowicz, Jedi Lin, Jouni -Hiltunen, Laurentiu Buzdugan, Magda Procha'zkova', Michael Anckaert, -Michal Majer, Marco d'Itri, Nilgun Belma Buguner, Pedro Morais, Tedi -Heriyanto, Thiago Jung Bauermann, Rafael Caetano dos Santos, Toomas -Soome, Urko Lusa, Walter Koch, Yosiaki IIDA did the official -translations. Mike Ashley wrote and maintains the GNU Privacy -Handbook. David Scribner is the current FAQ editor. Lorenzo -Cappelletti maintains the web site. +@c Copyright (C) 2002 Free Software Foundation, Inc. +@c This is part of the GnuPG manual. +@c For copying conditions, see the file gnupg.texi. + +@node Contributors +@unnumbered Contributors to GnuPG +@cindex contributors + +The GnuPG project would like to thank its many contributors. Without +them the project would not have been nearly as successful as it has +been. Any omissions in this list are accidental. Feel free to contact +the maintainer if you have been left out or some of your contributions +are not listed. + +David Shaw, Matthew Skala, Michael Roth, Niklas Hernaeus, Nils +Ellmenreich, Rmi Guyomarch, Stefan Bellon, Timo Schulz and Werner +Koch wrote the code. Birger Langkjer, Daniel Resare, Dokianakis +Theofanis, Edmund GRIMLEY EVANS, Gal Quri, Gregory Steuck, Nagy +Ferenc Lszl, Ivo Timmermans, Jacobo Tarri'o Barreiro, Janusz +Aleksander Urbanowicz, Jedi Lin, Jouni Hiltunen, Laurentiu Buzdugan, +Magda Procha'zkova', Michael Anckaert, Michal Majer, Marco d'Itri, +Nilgun Belma Buguner, Pedro Morais, Tedi Heriyanto, Thiago Jung +Bauermann, Rafael Caetano dos Santos, Toomas Soome, Urko Lusa, Walter +Koch, Yosiaki IIDA did the official translations. Mike Ashley wrote +and maintains the GNU Privacy Handbook. David Scribner is the current +FAQ editor. Lorenzo Cappelletti maintains the web site. + +The new modularized architecture of gnupg 1.9 as well as the X.509/CMS +part has been developed as part of the gypten project. Direct +contributors to this project are: Bernhard Herzog, who did extensive +testing and tracked down a lot of bugs. Bernhard Reiter, who made sure +that we met the specifications and the deadlines. He did extensive +testing and came up with a lot of suggestions. Jan-Oliver Wagner made +sure that we met the specifications and the deadlines. He also did +extensive testing and came up with a lot of suggestions. Karl-Heinz +Zimmer and Marc Mutz had to struggle with all the bugs and +misconceptions while working on KDE integration. Marcus Brinkman +extended GPGME, cleaned up the Assuan code and fixed bugs all over the +place. Moritz Schulte took over Libgcrypt maintenance and developed it +into a stable an useful library. Steffen Hansen had a hard time to +write the dirmngr due to underspecified interfaces. Thomas Koester did +extensive testing and tracked down a lot of bugs. Werner Koch designed +the system and wrote most of the code. The following people helped greatly by suggesting improvements, testing, fixing bugs, providing resources and doing other important @@ -67,6 +97,10 @@ IIDA, Yoshihiro Kajiki and Gerlinde Klaes. This software has been made possible by the previous work of Chris Wedgwood, Jean-loup Gailly, Jon Callas, Mark Adler, Martin Hellmann Paul Kendall, Philip R. Zimmermann, Peter Gutmann, Philip A. Nelson, -Taher Elgamal, Torbjorn Granlund, Whitfield Diffie, some unknown NSA +Taher ElGamal, Torbjorn Granlund, Whitfield Diffie, some unknown NSA mathematicians and all the folks who have worked hard to create complete and free operating systems. + +And finally we'd like to thank everyone who uses these tools, submits +bug reports and generally reminds us why we're doing this work in the +first place. diff --git a/doc/credits-1.0 b/doc/credits-1.0 deleted file mode 100644 index c536e771d..000000000 --- a/doc/credits-1.0 +++ /dev/null @@ -1,41 +0,0 @@ -The GNU Privacy Guard has been created by the GnuPG team: -Matthew Skala, Michael Roth, Niklas Hernaeus, Rmi Guyomarch -and Werner Koch. Gael Queri, Gregory Steuck, Janusz A. Urbanowicz, -Marco d'Itri, Thiago Jung Bauermann, Urko Lusa and Walter Koch -did the official translations. Mike Ashley is working on the -GNU Privacy Handbook. - -The following people helped greatly by suggesting improvements, -testing, fixing bugs, providing resources and doing other important -tasks: Allan Clark, Anand Kumria, Ariel T Glenn, Bodo Moeller, -Bryan Fullerton, Brian Moore, Brian Warner, Caskey L. Dickson, -Cees van de Griend, Charles Levert, Christian von Roques, -Christopher Oliver, Christian Recktenwald, Daniel Eisenbud, -Daniel Koenig, David Ellement, Detlef Lannert, Dirk Lattermann, -Ed Boraas, Enzo Michelangeli, Ernst Molitor, Fabio Coatti, -Felix von Leitner, Frank Heckenbach, Frank Stajano, Gal Quri, -Greg Louis, Greg Troxel, Gregory Steuck, Geoff Keating, Harald Denker, -Hendrik Buschkamp, Holger Schurig, Hugh Daniel, Ian McKellar, -Janusz A. Urbanowicz, James Troup, Jean-loup Gailly, Jens Bachem, -Joachim Backes, John A. Martin, Johnny Teveen, Jrg Schilling, -Jun Kuriyama, Karl Fogel, Karsten Thygesen, Katsuhiro Kondou, -Kazu Yamamoto, Lars Kellogg-Stedman, Marco d'Itri, Mark Adler, -Mark Elbrecht, Markus Friedl, Martin Kahlert, Martin Hamilton, -Martin Schulte, Matthew Skala, Max Valianskiy, Michael Roth, -Michael Sobolev, Nicolas Graner, NIIBE Yutaka, Niklas Hernaeus, -Nimrod Zimerman, N J Doye, Oliver Haakert, Oskari Jskelinen, -Paul D. Smith, Philippe Laliberte, Peter Gutmann, QingLong, -Ralph Gillen, Rat, Reinhard Wobst, Rmi Guyomarch, Reuben Sumner, -Roland Rosenfeld, Ross Golder, Serge Munhoven, SL Baur, Stefan Karrmann, -Stefan Keller, Steffen Ullrich, Steffen Zahn, Steven Bakker, -Susanne Schultz, Thiago Jung Bauermann, Thomas Roessler, Tom Spindler, -Tom Zerucha, Tomas Fasth, Thomas Mikkelsen, Ulf Mller, Urko Lusa, -Walter Koch, Wim Vandeputte and Gerlinde Klaes. - -This software has been made possible by the previous work of -Chris Wedgwood, Jean-loup Gailly, Jon Callas, Mark Adler, Martin Hellmann -Paul Kendall, Philip R. Zimmermann, Peter Gutmann, Philip A. Nelson, -Taher Elgamal, Torbjorn Granlund, Whitfield Diffie, some unknown NSA -mathematicians and all the folks who have worked hard to create complete -and free operating systems. - diff --git a/doc/debugging.texi b/doc/debugging.texi new file mode 100644 index 000000000..6c696abf2 --- /dev/null +++ b/doc/debugging.texi @@ -0,0 +1,154 @@ +@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. + +@node Debugging +@chapter How to solve problems + +Everyone knows that software often does not do what it should do and thus +there is a need to track down problems. We call this debugging in a +reminiscent to the moth jamming a relay in a Mark II box back in 1947. + +Most of the probelsm a merely configuration and user problems but +nevertheless there are the most annoying ones and reposnible for may +gray hairs. We try to give some guidelines here on how to identify and +solve the problem at hand. + + +@menu +* Debugging Tools:: Description of some useful tools +* Common Problems:: Commonly seen problems. +* Architecture Details:: How the whole thing works internally. +@end menu + + +@node Debugging Tools +@section Debugging Tools + +The GnuPG distribution comes with a couple of tools, useful to help find +and solving problems. + +@menu +* kbxutil:: Scrutinizing a keybox file. +@end menu + +@node kbxutil +@subsection Scrutinizing a keybox file + +A keybox is a file fomat used to store public keys along with meta +information and indices. The commonly used one is the file +@file{pubring.kbx} in the @file{.gnupg} directory. It contains all +X.509 certificates as well as OpenPGP keys@footnote{Well, OpenPGP keys +are not implemented, @command{gpg} still used the keyring file +@file{pubring.gpg}} . + +@noindent +When called the standard way, e.g.: + +@samp{kbxutil ~/.gnupg/pubring.kbx} + +@noindent +it lists all records (called @acronym{blobs}) with there meta-information +in a human readable format. + +@noindent +To see statistics on the keybox in question, run it using + +@samp{kbxutil --stats ~/.gnupg/pubring.kbx} + +@noindent +and you get an output like: + +@example +Total number of blobs: 99 + header: 1 + empty: 0 + openpgp: 0 + x509: 98 + non flagged: 81 + secret flagged: 0 + ephemeral flagged: 17 +@end example + +In this example you see that the keybox does not have any OpenPGP keys +but contains 98 X.509 cerificates and a total of 17 keys or certificates +are flagges as ephemeral, meaning that they are only temporary stored +(cached) in the keybox and won't get listed using the usual commands +provided by @command{gpgsm} or @command{gpg}. 81 certifcates are stored +in a standard way and directly available from @command{gpgsm}. + + + + + +@node Common Problems +@section Commonly Seen Problems + + +@itemize @bullet +@item Error code @samp{Not supported} from Dirmngr + +Most likely the option @option{enable-ocsp} is active for gpgsm +but Dirmngr's OCSP feature has not been enabled using +@option{allow-ocsp} in @file{dirmngr.conf}. + +@item The Curses based Pinentry does not work + +The far most common reason for this is that the environment variable +@code{GPG_TTY} has not been set correctly. Make sure that it has been +set to a real tty devce and not just to @samp{/dev/tty}; +i.e. @samp{GPG_TTY=tty} is plainly wrong; what you want is +@samp{GPG_TTY=`tty`} --- note the back ticks. Also make sure that +this environment variable gets exported, that is you should follow up +the setting with an @samp{export GPG_TTY} (assuming a Bourne style +shell). Even for GUI based Pinentries; you should have set +@code{GPG_TTY}. See the section on installing the @command{gpg-agent} +on how to do it. + + +@item SSH hangs while a popping up pinentry was expected + +SSH has no way to tell the gpg-agent what terminal or X display it is +running on. So when remotely logging into a box where a gpg-agent with +SSH support is running, the pinentry will get popped up on whatever +display t he gpg-agent has been started. To solve this problem you may +issue the command + +@smallexample +echo UPDATESTARTUPTTY | gpg-connect-agent +@end smallexample + +and the next pinentry will pop up on your display or screen. However, +you need to kill the running pinentry first because only one pinentry +may be running at once. If you plan to use ssh on a new display you +should issue the above command before invoking ssh or any other service +making use of ssh. + + +@end itemize + + +@c ******************************************** +@c *** Architecture Details ***************** +@c ******************************************** +@node Architecture Details +@section How the whole thing works internally. + + +@menu +* gpg 1.4 vs. 1.9:: Relationship between the two branches. +@end menu + +@node gpg 1.4 vs. 1.9 +@subsection Relationship between the two branches. + +Here is a little picture showing how the components work together: + +@image{gnupg-card-architecture, 10cm} + +@noindent +Lets try to explain it: + +TO BE DONE. + + diff --git a/doc/detached-sig-verification-bug.txt b/doc/detached-sig-verification-bug.txt deleted file mode 100644 index a938cd7ee..000000000 --- a/doc/detached-sig-verification-bug.txt +++ /dev/null @@ -1,231 +0,0 @@ - False positive signature verification in GnuPG - ============================================== - (released 2006-02-15) - - -Summary -======= - -The Gentoo project identified a security related bug in GnuPG. When -using any current version of GnuPG for unattended signature -verification (e.g. by scripts and mail programs), false positive -signature verification of detached signatures may occur. - -This problem affects the tool *gpgv*, as well as using "gpg --verify" -to imitate gpgv, if only the exit code of the process is used to -decide whether a detached signature is valid. This is a plausible -mode of operation for gpgv. - -If, as suggested, the --status-fd generated output is used to decide -whether a signature is valid, no problem exists. In particular -applications making use of the GPGME library[2] are not affected. - -To solve this problem an update of the current stable version has been -released (see below). - -Please do not send private mail in response to this message. The -mailing list gnupg-devel is the best place to discuss this problem -(please subscribe first so you don't need moderator approval [1]). - - -Impact: -======= - -Signature verification of detached signatures does not work, thus -modified versions of signature protected files may not be detected. - -All versions of gnupg prior to 1.4.2.1 are affected if they are used -in certain unattended operation modes. - -There is no problem using GnuPG in an interactive way because GnuPG -won't print any signature status at all; i.e. no "Good signature". - -Scripts and applications using gpg or gpgv with the --status-fd option -and properly parsing this output are not affected. - -Applications using the GPGME library[2] are not affected. - -The GnuPG versions 1.9 are not affected unless the currently -deprecated gpg part has been enabled. - - -Solution: -========= - -Update GnuPG as soon as possible to version 1.4.2.1. There are no -fixes for older versions available, although the fix described below -may be adjusted for them. - -To update please follow the instructions found at -http://www.gnupg.org/download/ or read on: - -GnuPG 1.4.2.1 may be downloaded from one of the GnuPG mirror sites or -direct from ftp://ftp.gnupg.org/gcrypt/ . The list of mirrors can be -found at http://www.gnupg.org/mirrors.html . Note, that GnuPG is not -available at ftp.gnu.org. - -On the mirrors you should find the following files in the *gnupg* -directory: - - gnupg-1.4.2.1.tar.bz2 (2.8M) - gnupg-1.4.2.1.tar.bz2.sig - - GnuPG source compressed using BZIP2 and OpenPGP signature. - - gnupg-1.4.2.1.tar.gz (4.0M) - gnupg-1.4.2.1.tar.gz.sig - - GnuPG source compressed using GZIP and OpenPGP signature. - - gnupg-1.4.2-1.4.2.1.diff.bz2 (39k) - - A patch file to upgrade a 1.4.2 GnuPG source. - -Select one of them. To shorten the download time, you probably want to -get the BZIP2 compressed file. Please try another mirror if -exceptional your mirror is not yet up to date. - -In the *binary* directory, you should find these files: - - gnupg-w32cli-1.4.2.1.exe (1.4M) - gnupg-w32cli-1.4.2.1.exe.sig - - GnuPG compiled for Microsoft Windows and OpenPGP signature. - Note that this is a command line version and now comes with a - graphical installer tool. The source files are the same as - given above. Note, that a new version of the Gpg4Win - package[4], including an updated version of GnuPG will be - available later the day. - - -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: - - * If you already have a trusted version of GnuPG installed, you - can simply check the supplied signature. For example to check the - signature of the file gnupg-1.4.2.1.tar.bz2 you would use this command: - - gpg --verify gnupg-1.4.2.1.tar.bz2.sig - - This checks whether the signature file matches the source file. - You should see a message indicating that the signature is good and - made by that signing key. Make sure that you have the right key, - either by checking the fingerprint of that key with other sources - or by checking that the key has been signed by a trustworthy other - key. Note, that you can retrieve the signing key using "finger wk - 'at' g10code.com" or "finger dd9jn 'at' gnu.org" or using the - keyservers. From time to time I prolong the expiration date; thus - you might need a fresh copy of that key. - - Never use a GnuPG version you just downloaded to check the - integrity of the source - use an existing GnuPG installation! - Watch out for a "Good signature" messages. - - * If you are not able to use an old version of GnuPG, you have to - verify the SHA-1 checksum. Assuming you downloaded the file - gnupg-1.4.2.1.tar.bz2, you would run the sha1sum command like this: - - sha1sum gnupg-1.4.2.1.tar.bz2 - - and check that the output matches the first line from the - following list: - -1c0306ade25154743d6f6f9ac05bee74c55c6eda gnupg-1.4.2.1.tar.bz2 -cefc74560f21bde74eed298d86460612cd7e12ee gnupg-1.4.2.1.tar.gz -98d597b1a9871b4aadc820d8641b36ce09125612 gnupg-1.4.2-1.4.2.1.diff.bz2 -a4db35a72d72df8e76751adc6f013b4c96112fd4 gnupg-w32cli-1.4.2.1.exe - - -Background: -=========== - -If a file with arbitrary data, for example 64 times the character -0xCA, is used as the detached signature, any data file will lead to -gpg exiting with 0 (success). There won't be any messages indicating -that the signature is valid or false: - - $ fortune >x.txt - $ perl -e 'print "\xca"x"64"' >x.txt.sig - $ gpgv x.txt.sig x.txt - $ echo $? - 0 - -Cleary this should not return success. - -The same problem appears when using "gpg --verify" in place of gpgv. -However in this case any application should to do further checks to -make sure that the key verifying the signature is actually the desired -one, thus using "gpg --verify" without processing the --status-fd -generated output is in general the wrong approach. - -The fixed version makes sure that gpgv and "gpg --verify" won't return -success if no signature has been seen. A minimal but sufficient fix -against 1.4.2 and possible older versions is: - -====8<============ ---- g10/mainproc.c (revision 4001) -+++ g10/mainproc.c (working copy) -@@ -77,6 +77,7 @@ - int op; - int stop_now; - } pipemode; -+ int any_sig_seen; /* Set to true if a signature packet has been seen. */ - }; - - -@@ -217,6 +218,7 @@ - { - 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 -@@ -1137,6 +1139,18 @@ - 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 = -1; -+ } - m_free( c ); - return rc; - } -====>8============ - -Note that the released version also includes a test case for this bug -and prints an additional diagnostic. With the patch above the output -using the same test data as above should be: - - $ gpgv x.txt.sig x.txt - gpgv: no signature found - gpgv: verify signatures failed: eof - $ echo $? - 2 - - - -Thanks -====== - -taviso from the Gentoo project found this vulnerability and informed -me on Monday evening. Unfortunately I had already switched off my -monitor at that time. The update has been released yesterday evening -(CET). - - - - -[1] http://lists.gnupg.org/mailman/listinfo/gnupg-devel -[2] http://www.gnupg.org/related_software/gpgme -[3] http://www.gpg4win.org diff --git a/doc/embedded-sig-verification-bug.txt b/doc/embedded-sig-verification-bug.txt deleted file mode 100644 index 2a2595497..000000000 --- a/doc/embedded-sig-verification-bug.txt +++ /dev/null @@ -1,211 +0,0 @@ - GnuPG does not detect injection of unsigned data - ================================================ - (released 2006-03-09, CVE-2006-0049) - - -Summary -======= - -In the aftermath of the false positive signature verfication bug -(announced 2006-02-15) more thorough testing of the fix has been done -and another vulnerability has been detected. - -This new problem affects the use of *gpg* for verification of -signatures which are _not_ detached signatures. The problem also -affects verification of signatures embedded in encrypted messages; -i.e. standard use of gpg for mails. - -To solve this problem, an update of the current stable version has -been released (see below). - -Please do not respond to this message. The mailing list gnupg-devel -is the best place to discuss this problem (please subscribe first so -you don't need moderator approval [1]). - - -Impact: -======= - -Signature verification of non-detached signatures may give a positive -result but when extracting the signed data, this data may be prepended -or appended with extra data not covered by the signature. Thus it is -possible for an attacker to take any signed message and inject extra -arbitrary data. - -Detached signatures (a separate signature file) are not affected. - -All versions of gnupg prior to 1.4.2.2 are affected. - -Scripts and applications using gpg to verify the integrity of data are -affected. This includes applications using the GPGME library[2]. - -The GnuPG version 1.9.x is not affected unless the currently -deprecated gpg part has been enabled. - - -Solution: -========= - -Update GnuPG as soon as possible to version 1.4.2.2. There are no -fixes for older versions available. - -If you can't get an update from your vendor, please follow the -instructions found at http://www.gnupg.org/download/ or read on: - -GnuPG 1.4.2.2 may be downloaded from one of the GnuPG mirror sites or -direct from ftp://ftp.gnupg.org/gcrypt/ . The list of mirrors can be -found at http://www.gnupg.org/mirrors.html . Note, that GnuPG is not -available at ftp.gnu.org. - -On the mirrors you should find the following files in the *gnupg* -directory: - - gnupg-1.4.2.2.tar.bz2 (2.8M) - gnupg-1.4.2.2.tar.bz2.sig - - GnuPG source compressed using BZIP2 and OpenPGP signature. - - gnupg-1.4.2.2.tar.gz (4.0M) - gnupg-1.4.2.2.tar.gz.sig - - GnuPG source compressed using GZIP and OpenPGP signature. - - gnupg-1.4.2.1-1.4.2.2.diff.bz2 (101k) - - A patch file to upgrade a 1.4.2.1 GnuPG source. - -Select one of them. To shorten the download time, you probably want to -get the BZIP2 compressed file. Please try another mirror if -exceptional your mirror is not yet up to date. - -In the *binary* directory, you should find these files: - - gnupg-w32cli-1.4.2.2.exe (1.4M) - gnupg-w32cli-1.4.2.2.exe.sig - - GnuPG compiled for Microsoft Windows and OpenPGP signature. - Note that this is a command line version and now comes with a - graphical installer tool. The source files are the same as - given above. Note, that a new version of the Gpg4Win - package[3], including a fixed version of GnuPG has also been - released today. - - -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: - - * If you already have a trusted version of GnuPG installed, you can - simply check the supplied signature. Due to the fact that detached - signatures are used, the problem described here does not affect - this verification. For example to check the signature of the file - gnupg-1.4.2.2.tar.bz2 you would use this command: - - gpg --verify gnupg-1.4.2.2.tar.bz2.sig - - This checks whether the signature file matches the source file. - You should see a message indicating that the signature is good and - made by that signing key. Make sure that you have the right key, - either by checking the fingerprint of that key with other sources - or by checking that the key has been signed by a trustworthy other - key. Note, that you can retrieve the signing key using "finger wk - 'at' g10code.com" or "finger dd9jn 'at' gnu.org" or using the - keyservers. From time to time I prolong the expiration date; thus - you might need a fresh copy of that key. - - Never use a GnuPG version you just downloaded to check the - integrity of the source - use an existing GnuPG installation! - Watch out for a "Good signature" messages. - - * If you are not able to use an old version of GnuPG, you have to - verify the SHA-1 checksum. Assuming you downloaded the file - gnupg-1.4.2.1.tar.bz2, you would run the sha1sum command like this: - - sha1sum gnupg-1.4.2.2.tar.bz2 - - and check that the output matches the first line from the - following list: - -f5559ddb004e0638f6bd9efe2bac00134c5065ba gnupg-1.4.2.2.tar.bz2 -959540c1c6158e09d668ceee055bf366dc26d0bd gnupg-1.4.2.2.tar.gz -880b3e937f232b1ca366bda37c4a959aacbd84f3 gnupg-1.4.2.1-1.4.2.2.diff.bz2 -95dd7fd4c49423b86704acfc396ce5a53c8b19e7 gnupg-w32cli-1.4.2.2.exe - - - -Background: -=========== - -OpenPGP messages are made up of packets. The signed data is a packet, -the actual signature is a packet and there are several control packets -as well. For example: - - O + D + S - -This describes a standard signed message made made up of a control -packet (O for one-pass signature packet), the actual signed data (D) -and the actual signature packet (S). gpg checks that the signature S -is valid over the data D. This is actually easy if not OpenPGP and -GnuPG would have a long tradition of changing the fromats. PGP 2 -versions used a different way of composing these packets: - - S + D - -and early versions of gpg, released before RFC2440, even created - - D + S - -i.e. without the one-pass packet. Still this would all be easy to -process properly but in an ill-advised attempt to make things easier, -gpg allowed the processing of multiple signatures per file, like - - O1 + D1 + S1 + O2 + D2 + S2 - -where two standard signatures are concatenated. Now when combining -this with the other variants of signatures, things get really messy -and it is not always possible to assocciate the signature (S) with the -signed data (D). gpg checked that this all works but unfortunately -these checks are not sufficient enough. The attack is to change a -standard message to inject faked data (F). A simple case is this: - - F + O + D + S - -gpg now happily skips F for verification and does a proper signature -verification of D and if this succeeds, prints a positive result. -However when asked to output the actual signed data it will output the -concatenation of F + D and thus create the impression that both are -covered by the signature. Depending on how gpg is invoked (in a -pipeline or using --output) it may even output just F and not at all -D. There are several variants of the attack in where to put the faked -data. - -The only correct solution to this problem is to get rid of the feature -to check concatenated signatures - this allows for strict checking of -valid packet composition. This is what has been done in 1.4.2.2 and -in the forthcoming 1.4.3rc2. These versions accept signatures only if -they are composed of - - O + D + S - S + D - -Cleartext signatures are of course also supported, they are similiar -to the O+D+S case. - -The actual checking for valid signature packet composition is done at -g10/mainproc.c, at the top of check_sig_and_print(). - - -Thanks -====== - -Tavis Ormandy again poked on gpg and found this vulnerability. - -The new version has been released yesterday and should by now be -available on all mirrors. - - - - -[1] http://lists.gnupg.org/mailman/listinfo/gnupg-devel -[2] http://www.gnupg.org/related_software/gpgme -[3] http://www.gpg4win.org diff --git a/doc/faq.raw b/doc/faq.raw deleted file mode 100644 index cbab76b0c..000000000 --- a/doc/faq.raw +++ /dev/null @@ -1,1344 +0,0 @@ -[$htmltitle=GnuPG FAQ] -[$htmlcharset=] -[$sfaqheader=The GnuPG FAQ says:] -[$sfaqfooter= -The most recent version of the FAQ is available from - -] -[$usenetheader= -] -[$maintainer=David D. Scribner, ] -[$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] - -[H hr] - - - GENERAL - - 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 - - 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 for details. - - 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. - - 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 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 for details. - - - SOURCES of INFORMATION - - 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][H/a][H br] - gnupg-devel: [H a href=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] - - 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. - - - INSTALLATION - - 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] - - 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/][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. - - - 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/][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] - - - USAGE - - 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 - [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. - - 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). - - 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. - - 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] - - 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. - - 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 . - - 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. - - 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). - - 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". - - 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. - - 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. - - 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] - - 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. - - 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] - - 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][H /a] and[H br] - [H a href=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][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). - - 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]. - - 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). - - - 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. - - 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] - - 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] - - - 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. - - 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. - - - COMPATIBILITY ISSUES - - - 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 ), 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] - - 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 - 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. - - (removed) - - (empty) - - 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. - - 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. - - 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. - - 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 - [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 - [H /samp] - - - 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). - - 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! - - - PROBLEMS and ERROR MESSAGES - - 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. - - 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. - - 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. - - 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. - - GnuPG 1.0.4 doesn't create ~/.gnupg ... - - That's a known bug, already fixed in newer versions. - - An Elgamal signature does not verify anymore since version 1.0.2 ... - - Use the option --emulate-md-encode-bug. - - Old versions of GnuPG can't verify Elgamal signatures - - Update to GnuPG 1.0.2 or newer. - - 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. - - 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. - - 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. - - 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. - - 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. - - 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. - - 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. - - 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][H /a]. - - 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. - - 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, å (0xE5 in ISO-8859-1) becomes Ã¥ (0xC3, - 0xA5). This might also be the reason why keyservers can't find - your key. - - 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. - - 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][H /a] - - 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. - - 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][H /a] - - 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. - - - ADVANCED TOPICS - - 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. - - 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. - - 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). - - 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. - - 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 (..//..). - - 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. - - 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. - - 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. - - - 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/fdl.texi b/doc/fdl.texi new file mode 100644 index 000000000..6e40e6df9 --- /dev/null +++ b/doc/fdl.texi @@ -0,0 +1,401 @@ +@node GNU Free Documentation License +@appendix GNU Free Documentation License + +@cindex FDL, GNU Free Documentation License +@center Version 1.1, March 2000 + +@display +Copyright @copyright{} 2000 Free Software Foundation, Inc. +59 Temple Place, Suite 330, Boston, MA 02111-1307, USA + +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. +@end display + +@enumerate 0 +@item +PREAMBLE + +The purpose of this License is to make a manual, textbook, or other +written document @dfn{free} in the sense of freedom: to assure everyone +the effective freedom to copy and redistribute it, with or without +modifying it, either commercially or noncommercially. Secondarily, +this License preserves for the author and publisher a way to get +credit for their work, while not being considered responsible for +modifications made by others. + +This License is a kind of ``copyleft'', which means that derivative +works of the document must themselves be free in the same sense. It +complements the GNU General Public License, which is a copyleft +license designed for free software. + +We have designed this License in order to use it for manuals for free +software, because free software needs free documentation: a free +program should come with manuals providing the same freedoms that the +software does. But this License is not limited to software manuals; +it can be used for any textual work, regardless of subject matter or +whether it is published as a printed book. We recommend this License +principally for works whose purpose is instruction or reference. + +@item +APPLICABILITY AND DEFINITIONS + +This License applies to any manual or other work that contains a +notice placed by the copyright holder saying it can be distributed +under the terms of this License. The ``Document'', below, refers to any +such manual or work. Any member of the public is a licensee, and is +addressed as ``you''. + +A ``Modified Version'' of the Document means any work containing the +Document or a portion of it, either copied verbatim, or with +modifications and/or translated into another language. + +A ``Secondary Section'' is a named appendix or a front-matter section of +the Document that deals exclusively with the relationship of the +publishers or authors of the Document to the Document's overall subject +(or to related matters) and contains nothing that could fall directly +within that overall subject. (For example, if the Document is in part a +textbook of mathematics, a Secondary Section may not explain any +mathematics.) The relationship could be a matter of historical +connection with the subject or with related matters, or of legal, +commercial, philosophical, ethical or political position regarding +them. + +The ``Invariant Sections'' are certain Secondary Sections whose titles +are designated, as being those of Invariant Sections, in the notice +that says that the Document is released under this License. + +The ``Cover Texts'' are certain short passages of text that are listed, +as Front-Cover Texts or Back-Cover Texts, in the notice that says that +the Document is released under this License. + +A ``Transparent'' copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, whose contents can be viewed and edited directly and +straightforwardly with generic text editors or (for images composed of +pixels) generic paint programs or (for drawings) some widely available +drawing editor, and that is suitable for input to text formatters or +for automatic translation to a variety of formats suitable for input +to text formatters. A copy made in an otherwise Transparent file +format whose markup has been designed to thwart or discourage +subsequent modification by readers is not Transparent. A copy that is +not ``Transparent'' is called ``Opaque''. + +Examples of suitable formats for Transparent copies include plain +@sc{ascii} without markup, Texinfo input format, La@TeX{} input format, +@acronym{SGML} or @acronym{XML} using a publicly available +@acronym{DTD}, and standard-conforming simple @acronym{HTML} designed +for human modification. Opaque formats include PostScript, +@acronym{PDF}, proprietary formats that can be read and edited only by +proprietary word processors, @acronym{SGML} or @acronym{XML} for which +the @acronym{DTD} and/or processing tools are not generally available, +and the machine-generated @acronym{HTML} produced by some word +processors for output purposes only. + +The ``Title Page'' means, for a printed book, the title page itself, +plus such following pages as are needed to hold, legibly, the material +this License requires to appear in the title page. For works in +formats which do not have any title page as such, ``Title Page'' means +the text near the most prominent appearance of the work's title, +preceding the beginning of the body of the text. + +@item +VERBATIM COPYING + +You may copy and distribute the Document in any medium, either +commercially or noncommercially, provided that this License, the +copyright notices, and the license notice saying this License applies +to the Document are reproduced in all copies, and that you add no other +conditions whatsoever to those of this License. You may not use +technical measures to obstruct or control the reading or further +copying of the copies you make or distribute. However, you may accept +compensation in exchange for copies. If you distribute a large enough +number of copies you must also follow the conditions in section 3. + +You may also lend copies, under the same conditions stated above, and +you may publicly display copies. + +@item +COPYING IN QUANTITY + +If you publish printed copies of the Document numbering more than 100, +and the Document's license notice requires Cover Texts, you must enclose +the copies in covers that carry, clearly and legibly, all these Cover +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on +the back cover. Both covers must also clearly and legibly identify +you as the publisher of these copies. The front cover must present +the full title with all words of the title equally prominent and +visible. You may add other material on the covers in addition. +Copying with changes limited to the covers, as long as they preserve +the title of the Document and satisfy these conditions, can be treated +as verbatim copying in other respects. + +If the required texts for either cover are too voluminous to fit +legibly, you should put the first ones listed (as many as fit +reasonably) on the actual cover, and continue the rest onto adjacent +pages. + +If you publish or distribute Opaque copies of the Document numbering +more than 100, you must either include a machine-readable Transparent +copy along with each Opaque copy, or state in or with each Opaque copy +a publicly-accessible computer-network location containing a complete +Transparent copy of the Document, free of added material, which the +general network-using public has access to download anonymously at no +charge using public-standard network protocols. If you use the latter +option, you must take reasonably prudent steps, when you begin +distribution of Opaque copies in quantity, to ensure that this +Transparent copy will remain thus accessible at the stated location +until at least one year after the last time you distribute an Opaque +copy (directly or through your agents or retailers) of that edition to +the public. + +It is requested, but not required, that you contact the authors of the +Document well before redistributing any large number of copies, to give +them a chance to provide you with an updated version of the Document. + +@item +MODIFICATIONS + +You may copy and distribute a Modified Version of the Document under +the conditions of sections 2 and 3 above, provided that you release +the Modified Version under precisely this License, with the Modified +Version filling the role of the Document, thus licensing distribution +and modification of the Modified Version to whoever possesses a copy +of it. In addition, you must do these things in the Modified Version: + +@enumerate A +@item +Use in the Title Page (and on the covers, if any) a title distinct +from that of the Document, and from those of previous versions +(which should, if there were any, be listed in the History section +of the Document). You may use the same title as a previous version +if the original publisher of that version gives permission. + +@item +List on the Title Page, as authors, one or more persons or entities +responsible for authorship of the modifications in the Modified +Version, together with at least five of the principal authors of the +Document (all of its principal authors, if it has less than five). + +@item +State on the Title page the name of the publisher of the +Modified Version, as the publisher. + +@item +Preserve all the copyright notices of the Document. + +@item +Add an appropriate copyright notice for your modifications +adjacent to the other copyright notices. + +@item +Include, immediately after the copyright notices, a license notice +giving the public permission to use the Modified Version under the +terms of this License, in the form shown in the Addendum below. + +@item +Preserve in that license notice the full lists of Invariant Sections +and required Cover Texts given in the Document's license notice. + +@item +Include an unaltered copy of this License. + +@item +Preserve the section entitled ``History'', and its title, and add to +it an item stating at least the title, year, new authors, and +publisher of the Modified Version as given on the Title Page. If +there is no section entitled ``History'' in the Document, create one +stating the title, year, authors, and publisher of the Document as +given on its Title Page, then add an item describing the Modified +Version as stated in the previous sentence. + +@item +Preserve the network location, if any, given in the Document for +public access to a Transparent copy of the Document, and likewise +the network locations given in the Document for previous versions +it was based on. These may be placed in the ``History'' section. +You may omit a network location for a work that was published at +least four years before the Document itself, or if the original +publisher of the version it refers to gives permission. + +@item +In any section entitled ``Acknowledgments'' or ``Dedications'', +preserve the section's title, and preserve in the section all the +substance and tone of each of the contributor acknowledgments +and/or dedications given therein. + +@item +Preserve all the Invariant Sections of the Document, +unaltered in their text and in their titles. Section numbers +or the equivalent are not considered part of the section titles. + +@item +Delete any section entitled ``Endorsements''. Such a section +may not be included in the Modified Version. + +@item +Do not retitle any existing section as ``Endorsements'' +or to conflict in title with any Invariant Section. +@end enumerate + +If the Modified Version includes new front-matter sections or +appendices that qualify as Secondary Sections and contain no material +copied from the Document, you may at your option designate some or all +of these sections as invariant. To do this, add their titles to the +list of Invariant Sections in the Modified Version's license notice. +These titles must be distinct from any other section titles. + +You may add a section entitled ``Endorsements'', provided it contains +nothing but endorsements of your Modified Version by various +parties---for example, statements of peer review or that the text has +been approved by an organization as the authoritative definition of a +standard. + +You may add a passage of up to five words as a Front-Cover Text, and a +passage of up to 25 words as a Back-Cover Text, to the end of the list +of Cover Texts in the Modified Version. Only one passage of +Front-Cover Text and one of Back-Cover Text may be added by (or +through arrangements made by) any one entity. If the Document already +includes a cover text for the same cover, previously added by you or +by arrangement made by the same entity you are acting on behalf of, +you may not add another; but you may replace the old one, on explicit +permission from the previous publisher that added the old one. + +The author(s) and publisher(s) of the Document do not by this License +give permission to use their names for publicity for or to assert or +imply endorsement of any Modified Version. + +@item +COMBINING DOCUMENTS + +You may combine the Document with other documents released under this +License, under the terms defined in section 4 above for modified +versions, provided that you include in the combination all of the +Invariant Sections of all of the original documents, unmodified, and +list them all as Invariant Sections of your combined work in its +license notice. + +The combined work need only contain one copy of this License, and +multiple identical Invariant Sections may be replaced with a single +copy. If there are multiple Invariant Sections with the same name but +different contents, make the title of each such section unique by +adding at the end of it, in parentheses, the name of the original +author or publisher of that section if known, or else a unique number. +Make the same adjustment to the section titles in the list of +Invariant Sections in the license notice of the combined work. + +In the combination, you must combine any sections entitled ``History'' +in the various original documents, forming one section entitled +``History''; likewise combine any sections entitled ``Acknowledgments'', +and any sections entitled ``Dedications''. You must delete all sections +entitled ``Endorsements.'' + +@item +COLLECTIONS OF DOCUMENTS + +You may make a collection consisting of the Document and other documents +released under this License, and replace the individual copies of this +License in the various documents with a single copy that is included in +the collection, provided that you follow the rules of this License for +verbatim copying of each of the documents in all other respects. + +You may extract a single document from such a collection, and distribute +it individually under this License, provided you insert a copy of this +License into the extracted document, and follow this License in all +other respects regarding verbatim copying of that document. + +@item +AGGREGATION WITH INDEPENDENT WORKS + +A compilation of the Document or its derivatives with other separate +and independent documents or works, in or on a volume of a storage or +distribution medium, does not as a whole count as a Modified Version +of the Document, provided no compilation copyright is claimed for the +compilation. Such a compilation is called an ``aggregate'', and this +License does not apply to the other self-contained works thus compiled +with the Document, on account of their being thus compiled, if they +are not themselves derivative works of the Document. + +If the Cover Text requirement of section 3 is applicable to these +copies of the Document, then if the Document is less than one quarter +of the entire aggregate, the Document's Cover Texts may be placed on +covers that surround only the Document within the aggregate. +Otherwise they must appear on covers around the whole aggregate. + +@item +TRANSLATION + +Translation is considered a kind of modification, so you may +distribute translations of the Document under the terms of section 4. +Replacing Invariant Sections with translations requires special +permission from their copyright holders, but you may include +translations of some or all Invariant Sections in addition to the +original versions of these Invariant Sections. You may include a +translation of this License provided that you also include the +original English version of this License. In case of a disagreement +between the translation and the original English version of this +License, the original English version will prevail. + +@item +TERMINATION + +You may not copy, modify, sublicense, or distribute the Document except +as expressly provided for under this License. Any other attempt to +copy, modify, sublicense or distribute the Document 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 +FUTURE REVISIONS OF THIS LICENSE + +The Free Software Foundation may publish new, revised versions +of the GNU Free Documentation 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. See +@uref{http://www.gnu.org/copyleft/}. + +Each version of the License is given a distinguishing version number. +If the Document specifies that a particular numbered version of this +License ``or any later version'' applies to it, you have the option of +following the terms and conditions either of that specified version or +of any later version that has been published (not as a draft) by the +Free Software Foundation. If the Document does not specify a version +number of this License, you may choose any version ever published (not +as a draft) by the Free Software Foundation. +@end enumerate + +@page +@appendixsubsec ADDENDUM: How to use this License for your documents + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and +license notices just after the title page: + +@smallexample +@group + Copyright (C) @var{year} @var{your name}. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.1 + or any later version published by the Free Software Foundation; + with the Invariant Sections being @var{list their titles}, with the + Front-Cover Texts being @var{list}, and with the Back-Cover Texts being @var{list}. + A copy of the license is included in the section entitled ``GNU + Free Documentation License''. +@end group +@end smallexample + +If you have no Invariant Sections, write ``with no Invariant Sections'' +instead of saying which ones are invariant. If you have no +Front-Cover Texts, write ``no Front-Cover Texts'' instead of +``Front-Cover Texts being @var{list}''; likewise for Back-Cover Texts. + +If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, +to permit their use in free software. + +@c Local Variables: +@c ispell-local-pdict: "ispell-dict" +@c End: diff --git a/doc/fr/ChangeLog b/doc/fr/ChangeLog deleted file mode 100644 index 167093dcc..000000000 --- a/doc/fr/ChangeLog +++ /dev/null @@ -1,17 +0,0 @@ -2001-09-10 Gilbert Fernandes - - * Traduction en français des documents doc/* - - -Copyright 2001 Free Software Foundation, Inc. - -Ce fichier est un logiciel libre ; l'auteur vous donne une autorisation -spéciale de copies illimitées et/ou distribution illimitée avec ou sans -modifications attendu que cette notice de copyright et note associée -se trouve conservée dans le document. - -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/fr/DETAILS b/doc/fr/DETAILS deleted file mode 100644 index 5c7246c9d..000000000 --- a/doc/fr/DETAILS +++ /dev/null @@ -1,945 +0,0 @@ - -Format des listings "---with-colons" -==================================== - -sec::1024:17:6C7EE1B8621CC013:1998-07-07:0:::Werner Koch : -ssb::1536:20:5CE086B5B5A18FF4:1998-07-07:0::: - - 1. Champ: Type d'enregistrement - pub = clef publique - sub = sous-clef (clef secondaire) - sec = clef secrète - ssb = sous-clef secrète (clef secondaire) - uid = id d'utilisateur (seul le champ 10 est utilisé) - sig = signature - fpr = fingerprint: (le champ 10 est le fingerprint) - pkd = données publiques de la clef - (champ au format spécial, voir ci-dessous) - - 2. Champ: Une lettre décrivant la confiance calculée. Ce n'est qu'une - seule lettre, mais elle fera peut-être l'objet d'une information - supplémentaire pour les versions futures, comme décrit ici - (ceci ne sera pas utilisé pour les clefs privées) - o = Inconnu (cette clef est nouvelle au système) - i = La clef est invalide (eg. il manque sa propre signature) - d = La clef a été désactivée - r = La clef a été révoquée - e = La clef a expiré - q = Non-défini (pas de valeur attribuée) - n = Ne jamais faire confiance à cette clef - m = Cette clef dispose d'une confiance marginale - f = Cette clef dispose d'une confiance totale - u = Cette clef dispose d'une confiance ultime. Cette valeur - n'est utilisée que pour les clefs où la clef secrète est - également disponibles. - 3. Champ: taille de la clef en bits. - 4. Champ: Algorithme utilisé: 1 = RSA - 16 = ElGamal (chiffrement uniquement) - 17 = DSA (parfois appellé DH, signature seulement) - 20 = ElGamal (signe et chiffre) - (pour d'autres is, consultez include/cipher.h) - 5. Champ: ID de clef (KeyID) - 6. Champ: Date de création (en UTC) - 7. Champ: Date d'expiration de la clef, vide si aucune. - 8. Champ: ID local : numéro d'enregistrement du répertoire dans la - trustdb. Cette valeur n'est valide que tant que la - trustdb n'est pas effacée. Vous pouvez utiliser - "#" comme id d'utilisateur lorsque vous spécifiez - la clef. Ceci est requis puisque les id de clef ne sont pas - toujours uniques - un programme peut donc utiliser ce numéro - pour accéder aux clefs ultérieurement. - 9. Champ: Confiance propre (clef publiques primaires uniquement) - C'est une simple lettre, mais une information supplémentaire pourrait - se voir ajoutée dans les versions futures. -10. Champ: ID utilisateur. La valeur est placée entre guillemets comme une - chaîne en C, par exemple : "\x3a". -11. Champ: Classe de signature. C'est un nombre hexadécimal à deux chiffres - suivi par la lettre "x" si la signature peut être exportée ou la - lettre "l" si la signature est uniquement locale. -12. Champ: Capacités de la clef : - e = chiffrement - s = signature - c = certification - Une clef peut disposer de toute combinaison de ces caractéristiques. - La clef primaire dispose, en plus de ces lettres, une version en - majuscule des lettres pour marquer les capacités "d'utilisation" - de la totalité de la clef. - -Toutes les dates sont affichées dans le format : - -yyyy-mm-dd - -Sauf si vous utilisez l'option --fixed-list-mode où dans ce cas précis les -dates sont affichées en secondes depuis Epoch. Plus de champs feront l'objet -d'additions dans les futures versions et les parsers doivent y être préparés. -Lorsque le parser traitera ces données, il devra s'arrêter au premier -caractère non-numérique afin que des informations supplémentaires soient -ajoutées à l'avenir. - -Le champ 1 dispose d'un tag "pkd" dont le listing ressemble à ceci : - -pkd:0:1024:B665B1435F4C2 .... FF26ABB: - ! ! !-- la valeur - ! !------ indicateur du nombre de bits de la valeur - !--------- index (eg. DSA va de 0 à 3 : p,q,g,y) - - - -Format de la sortie "--status-fd" -================================= - -Chaque ligne dispose d'un préfixe : - -"[GNUPG:] " - -Suivie par un mot clef indiquant le type de la ligne de statut, -et quelques arguments selon le type (probablement aucun) ; une application -devrait toujours assumer que des arguments supplémentaires seront -présents dans les versions futures. - - GOODSIG - La signature keyid est valide. - Pour chaque signature seul l'un des trois codes GOODSIG, BADSIG ou - ERRSIG seront produits et ils pourront être utilisés comme - marqueurs pour les nouvelles signatures. - - BADSIG - La signature keyid n'a pas été vérifiée correctement. - - ERRSIG \ - - Il n'a pas été possible de vérifier la signature. Ceci peut provenir - d'une clef publique manquante, ou bien à cause d'un algorithme non- - supporté. Un RC de 4 indique un algorithme inconnu, un 9 indique - une clef publique manquante. Les autres champs donnent plus d'information - sur la signature. sig_class est une valeur hexadécimale de 2 octets. - - VALIDSIG - La signature keyid est valide. C'est ici la même chose que GOODSIG - mais avec le fingerprint comme argument. Les lignes de statut seront - émises pour une bonne signature. - sig-timestamp est la date de création de la signature en secondes - depuis Epoch. - - SIG_ID - N'est émis que pour les signatures de classe 0 ou 1 qui ont été - vérifiées comme valides. Le chaîne est un identifiant d'utilisateur - et peut être utilisée dans les applications pour détecter les - attaques par rejeu de messages signés. Notez que seuls les - algorithmes DLP offrent des identifiants uniques ; les autres peuvent - produire des id dupliqués lorsqu'ils furent créés à la même seconde. - - ENC_TO - Le message est chiffré avec ce keyid. - keytype est une valeur numérique de l'algorithme à clef publique, - keylength est la taille de la clef ou 0 si elle n'est pas connue - (ce qui est toujours le cas). - - NODATA - Aucune donnée n'a été trouvée. Les codes suivants sont utilisés : - 1 - Pas de données sous ARMOR. - 2 - Un paquet attendu n'a pas été trouvé. - 3 - Paquet invalide trouvé ; ceci peut indiquer un message - non-OpenPGP. Vous devez vous attendre à une extension - de ces lignes de statu à l'avenir. - - UNEXPECTED - Des données innatendues ont été rencontrées - 0 - pas de détail supplémentaire - - TRUST_UNDEFINED - TRUST_NEVER - TRUST_MARGINAL - TRUST_FULLY - TRUST_ULTIMATE - Pour les signatures valides, l'une de ces lignes de statut sera produite - pour indiquer le niveau de confiance attribué à la clef. Pas d'arguments - pour l'instant. - - SIGEXPIRED - La clef de signature a expiré. Pas d'arguments pour l'instant. - - KEYREVOKED - L'utilisateur a révoqué sa clef. Pas d'arguments pour l'instant. - - BADARMOR - L'ARMOR ASCII est corrompu. Pas d'arguments pour l'instant. - - RSA_OR_IDEA - Les algorithmes IDEA ont été utilisés sur les données. Un programme - pourra basculer sur un autre programme de traitement si GnuPG échoue. - Ce message de statut sera affiché pour le RSA aussi, mais ceci a été - abandonné puisque le brevêt sur le RSA a expiré. - Toutefois, nous ne pouvons modifier le nom du message. - - SHM_INFO - SHM_GET - SHM_GET_BOOL - SHM_GET_HIDDEN - - GET_BOOL - GET_LINE - GET_HIDDEN - GOT_IT - - NEED_PASSPHRASE - Sera affiché à chaque fois qu'une phrase passe sera requise. - keytype est la valeur numérique de l'algorithme à clef publique - ou bien 0 si cela n'est pas applicable. keylength est la taille de la - clef ou 0 si la taille n'est pas connue (ceci est actuellement - toujours le cas). - - NEED_PASSPHRASE_SYM - Affiché à chaque fois qu'une phrase passe pour un chiffrement - symétrique sera requise. - - MISSING_PASSPHRASE - Aucune phrase passe n'a été fournie. Une application qui rencontre - ce message devrait stopper immédiatement le parsing car le prochain - message sera probablement BAD_PASSPHRASE. Toutefois, si l'application - n'est qu'un wrapper autour de la fonctionnalité d'édition de clefs, - ceci pourrait avoir un autre sens et stopper le parsing pourrait - être incorrect, et il faudra ignorer le BAD_PASSPHRASE. - - BAD_PASSPHRASE - La phrase passe fournie est soit invalide, soit n'a pas été fournie. - Dans le seconde cas vous devriez voir un MISSING_PASSPHRASE. - - GOOD_PASSPHRASE - La phrase passe fournie est valide et le matériel de clefs secrète - est utilisable. - - DECRYPTION_FAILED - La déchiffrement symétrique a échoué. Il s'agit généralement d'une - mauvaise phrase passe ne correspondant pas au message chiffré. - - DECRYPTION_OKAY - Succès du déchiffrement. Ceci signifie que soit la clef secrète - adaptée a été utilisée avec succès, soit que la phrase passe - valide pour un chiffrement symétrique aura conduit au déchiffrement. - Le programme pourait toutefois renvoyer un message d'erreur s'il - n'a pas été possible de vérifier la signature. - - NO_PUBKEY - NO_SECKEY - La clef n'est pas utilisable. - - IMPORTED - Le keyid et la signature ont été importés. - - IMPORTED_RES - - Statistiques finales sur le processus d'importation (cette ligne est longue!) - - FILE_START - Début de traitement du fichier . indique l'opération - réalisée : - 1 - vérifier - - FILE_DONE - Marque la fin de traitement d'un fichier, ayant débuté avec FILE_START. - - BEGIN_DECRYPTION - END_DECRYPTION - Marque le début et la fin du processus de déchiffrement. Ces messages - seront également produits lors de l'utilisation du mode --list-only. - - BEGIN_ENCRYPTION - END_ENCRYPTION - Marque le début et la fin du processus de chiffrement. - - DELETE_PROBLEM reason_code - L'effacement d'une clef a échoué. Un code indique la raison de l'erreur : - 1 - La clef spécifiée n'existe pas - 2 - La clef privée doit être détruite avant ! - - PROGRESS what char cur total - Utilisé par les fonctions primegen et de clef publique pour indiquer - la progression de l'opération. "char" est le caractère affiché sans - --status-fd avec les retours à la ligne marqués par "X". "cur" indique - la quantitité de traitement terminée et "total" indique la valeur - finale à atteindre. Un total de 0 indique que le total n'est pas - connu. 100/100 peut être utilisé pour détecter la fin de l'opération. - - SIG_CREATED - Une signature a été créée à l'aide de ces paramètres. - type: 'D' = détachée - 'C' = en texte clair - 'S' = standard - (seul le premier caractère doit être vérifié) - class: 2 chiffres hexadécimaux avec la classe de signature - - KEY_CREATED - Une clef a été créée - type: 'B' = primaire et sous-clef - 'P' = primaire - 'S' = sous-clef - - SESSION_KEY : - La clef de session utilisée pour déchiffrer le message. Ce message - sera seulement affiché si l'option --show-session est utilisée. - Le format est utilisable pour un passage direct à la fonction - --override-session-key. - - NOTATION_NAME - NOTATION_DATA - Le nom et la chaîne sont "escaped" à l'aide de %XX et les données - peuvent être découpées sur plusieurs lignes notation_data. - - USERID_HINT - Donne un indice sur l'ID utilisateur pour un keyID donné. - - POLICY_URL - La chaîne est "escaped" en %XX - - BEGIN_STREAM - END_STREAM - Produit par pipemode. - - -Génération de clef -================== - -La génération de clef marque sa progression à l'aide de différents caractères, dont -voici la signification : - -"." : les 10 derniers tests Miller-Rabin ont échoué. -"+" : réussite du test Miller-Rabin. -"!" : Rechargement du pool avec des nombres premiers frais. -"^" : Vérification d'une nouvelle valeur pour le générateur. -"<" : La taille d'un facteur a été réduite. -">" : La taille d'un facteur a été augmentée. - -Le nombre premier pour l'ElGamal est généré de la manière suivante : - -1. On crée un nombre premier q de 160, 200 ou 240 bits (selon la taille - de la clef). -2. On sélectionne la taille de l'autre facteur premier, afin qu'elle soit - au moins de la taille de q et on calcule le nombre de facteurs premiers - requis. -3. On crée un pool de nombres premiers, chacun dont la longueur fut déterminée - à l'étape 2. -4. On obtient une nouvelle permutation du pool et nous continuons avec - l'étape 3 une fois toutes les permutations testées. -5. Le premier cancidat est calculé par p = 2 * q * p[1] * ... * p[n] + 1 -6. On vérifie que ce premier dispose de la taille désirée (ceci peut changer - q s'il ne semble pas possible de produire un premier de la taille voulue) -7. On vérifie si ce nombre est premier à l'aide de divisions d'essai et par - le test de Miller-Rabin. -8. On continue à l'étape 4 si on n'a pas trouvé de premier à l'étape 7. -9. On trouve un générateur pour ce premier. - -Cet algorithme se base sur la suggestion de Lim et Lee du Crypto' 97 (p. 260). - -Génération de clef innatendue -============================= - -Cette fonction est actuellement expérimentale et permet la production de -clefs innatendues avec un contrôle depuis un fichier de paramètres. -Cette fonctionnalité n'a pas fait l'objet de tests poussés ! Veuillez ne -PAS vous plaindre si nous décidons d'apporter des modifications importantes -à cette commande. - -Pour utiliser cette fonctionnalité, vous devez utiliser --gen-key en -combinaison avec --batch et fournir les paramètres soit depuis stdin, -soit depuis un fichier dont le nom est fourni en ligne de commande. - -Ce fichier devra utiliser le format suivant : - - o En texte uniquement, chaque ligne étant limitée à environ 1000 caractères. - o Vous devez utiliser un codage UTF-8 pour marquer les caractères non ASCII. - o Les lignes vides seront ignorées. - o Les espaces en début et fin de ligne seront ignorés. - o Un signe "-" en tant que premier caractère "non white space" marque - une ligne de commentaire. - o Les commandes sont marquées par un signe "%" en début de ligne, - suivi par la commande et ses arguments sont séparés par des espaces. - o Les paramètres sont indiqués par un mot clef, suivi par un ":". Les - arguments sont séparés par des espaces. - o Le premier paramètre doit être "Key-Type" et ses contrôles peuvent - être placés à votre discrétion. - o La génération de clef aura lieu soit à la fin du fichier de paramètres, - soit lorsque le premier "Key-Type" est rencontré au sein du fichier, - dans un ensenble de contrôle "%commit". - o Les ensembles de contrôle sont : - %echo - Affiche - - %dry-run - Ne réalise pas la production de clef (pratique pour vérifier la - syntaxe). - - %commit - Réalise la production de clef. Un commit implicite est produit - à chaque rencontre de "Key-Type". - - %pubring - %secring - Ne renvoie pas la clef vers le sortie par défaut ou dans le keyring - indiqué en ligne de commande, mais vers le fichier . Ce - contrôle doit être utilisé avant que le commit ne soit rencontré. - Toute double mention sera ignorée et le dernier nom de fichier - rencontré sera celui utilisé. Le fichier sera utilisé jusqu'à ce - qu'un nouveau fichier soit spécifié (au points de commit) sinon - toutes les clefs seront placées dans le même fichier. Si un nouveau - nom de fichier est indiqué, le fichier sera créé (et tout ancien - fichier sera alors écrasé). Les deux indications doivent être - fournies au contrôle. - - o L'ordre des paramètres n'a pas d'importance, sauf pour "Key-Type" qui - doit être le premier paramètre rencontré. Les paramètres ne sont - destinés qu'au bloc keybloc généré et les paramètres des productions - précédentes de clefs ne seront pas pris en compte. Certaines - vérifications syntaxiques seront mises en place et peuvent être - ou non actives. Les paramètres actuellement définis sont : - - Key-Type: | - Débute un nouveau bloc de paramètres indiquant le type de la clef - primaire à produire. L'algorithme doit être capable de produire - des signatures. Ce paramètre est indispensable ! - - Key-Length: - Indique la taille de la clef, en bits. La valeur par défaut est - 1024. - - Subkey-Type: | - Permet de produire une clef secondaire. Actuellement, seule une - sous-clef peut être gérée. - - Subkey-Length: - Taille de la sous-clef en bits. La valeur par défaut est - 1024. - - Passphrase: - Si vous souhaitez spécifier une phrase passe pour la clef - secrète vous pouvez utiliser cette commande. Par défaut, - aucune phrase passe ne sera associée aux clefs privées. - - Name-Real: - Name-Comment: - Name-Email: - Voici les trois composantes d'une clef. Vous devez ici - n'utiliser que de l'UTF-8. Si vous ne fournissez aucune - de ces indications, aucun ID d'utilisateur ne sera créé. - - Expire-Date: |([d|w|m|y]) - Spécifie la date d'expiration de la clef (et de sa sous-clef) - La date doit être entrée sous la forme d'une date au format - ISO (année-mois-jour) ou bien sous forme d'un nombre de - jours, de semaines, de mois ou d'années. Si vous n'utilisez - pas de lettre pour indiquer la durée, des "jours" sont - assumés par défaut. - -Voici un exemple : -$ cat >foo < -ssb 1024g/8F70E2C0 2000-03-09 - - - -Composition de la TrustDB -========================= - -La TrustDB est construire à partir d'enregistrements à taille fixe, où le premier -octet décrit le type d'enregistrement. Toutes les valeurs numériques sont -conservées dans un réseau d'ordre d'octets. La longueur de chaque enregistrement -est de 40 octets. Le premier enregistrement de la TrustDB est toujours de type 1 -et c'est le seul enregistrement de ce type. - - Record type 0: - -------------- - - Cet enregistrement n'est pas utilisé. Il peut être utilisé - à votre discrétion. - - Record type 1: - -------------- - - Indique la version de la TrustDB. Cet enregistrement doit toujours être - le premier enregistrement de la base de données et c'est le seul - enregistrement de type 1. - - 1 octet valeur : 1 - 3 octets 'gpg' valeur "magic" - 1 octet Version de la TrustDB (2) - 1 octet marginales requises - 1 octet complètes requises - 1 octet max_cert_depth - - Ces trois éléments sont utilisés pour vérifier si la valeur de validité - mise en cache dans l'enregistrement du répertoire peut être utilisée : - - 1 u32 locked flags - 1 u32 datation de la création de la trustdb - 1 u32 datation de la dernière modification - - Cette datation pourrait affecter la validité des clefs dans la base de - données. Cette valeur sera comparée à celle de la datation de validité - des enregistrements dir : - - 1 u32 datation de la dernière validation - - Cette valeur sera utilisée pour stocker le passage du temps, lorsque - cette TrustDB sera comparée au trousseau de clefs publiques : - - 1 u32 numéro de l'enregistrement du keyhashtable - 1 u32 premier enregistrement libre - 1 u32 numéro de l'enregistrement répertoire shadow de la table de hachage - - Cette table ne devrait pas être combinée avec la table de clefs car le - keyid n'est pas dans chaque cas un élément du fingerprint. - - 4 bytes réservés pour l'enregistrement d'extension de version - - - Record type 2: (enregistrement répertoire) - -------------- - - Regroupe les informations sur un certificat de clef publique. - Ces valeur sont statiques et ne sont jamais modifiées sans une - interaction avec l'utilisateur : - - 1 octet valeur : 2 - 1 octet réservé - 1 u32 LID . (numéro d'enregistrement de cet enregistrement) - 1 u32 Liste de key-records (le premier est la clef primaire) - 1 u32 Liste de uid-records - 1 u32 cache record - 1 octet ownertrust - 1 octet dirflag - 1 octet validité maximale de tous les id utilisateurs - 1 u32 datation de la dernière vérification de validité - 1 u32 Vérification requise lorsque cette datation sera atteinte - (0 = pas de vérification requise) - - - Record type 3: (enregistrement de clef) - -------------- - - Regroupe les informations sur une clef publique primaire. - (ces informations sont principalement utilisées pour réaliser les lookup - dans l'enregistrement trust) - - 1 octet valeur : 3 - 1 octet réservé - 1 u32 LID - 1 u32 next - prochain enregistrement - 7 octets réservés - 1 octet keyflags - 1 octet algorithme de la clef publique - 1 octet taille du fingerprint (en octets) - 20 octets fingerprint de la clef publique - (Cette valeur est utilisée pour identifier toute clef) - - Record type 4: (enregistrement uid) - -------------- - - Regroupe les informations sur un id utilisateur (un "uid"). - Nous ne stockons par l'uid mais un hachage de l'uid : cela semble suffire. - - 1 octet valeur : 4 - 1 octet réservé - 1 u32 LID pointe vers l'enregistrement directory - 1 u32 next le userid suivant - 1 u32 pointeur vers l'enregistrement preference - 1 u32 siglist liste de signatures valides - 1 octet uidflags - 1 octet validité de la clef calculée pour cet userid - 20 bytes ripemd160 hachage du nom de l'utilisateur - - - Record type 5: (enregistrement pref) - -------------- - - Regroupe les informations formant les préférences. - - 1 octet valeur : 5 - 1 octet réservé - 1 u32 LID; pointe vers l'enregistrement directory (et PAS vers le uid !!!) - (égal à 0 pour un enregistrement de préférences standard) - 1 u32 suivant - 30 byte données de préférences - - Record type 6 (sigrec) - ------------- - - Cet enregistrement est utilisé pour traquer les signatures de clefs. Les - auto-signatures ne sont pas conservées. Si une clef publique ne se trouve - pas dans la TrustDB, la signature pointe vers un enregistrement dir fantôme, - lequel contient une liste des enregistrements qui seraient intéressés - par cette clef (et l'enregistrement signature en fait partie). - - 1 octet valeur : 6 - 1 octet réservé - 1 u32 LID pointe en retour vers l'enregistrment dir - 1 u32 next prochain sigrec de cet uid ou bien 0 pour indiquer que ce - sigrec est le dernier. - 6 times - 1 u32 Local_id des dir signatures ou de l'enregistrement dir fantôme - 1 octet Flag: Bit 0 = vérifié: Bit 1 est valide (nous avons un - véritable enregistrement directory) - 1 = valide est vrai (mais pourrait être révoqué) - - - - Record type 8: (enregistrement répertoire (dir) fantôme) - -------------- - - Cet enregistrement est utilisé pour réserver un LID pour une clef publique. - Nous avons besoin de cet enregistrement pour créer les enregistrements sigs - des autres clefs, même si nous ne disposons pas d'une signature de la clef - publique. - Cet enregistrement (le numéro d'enregistrement pour être plus précis) - sera réutilisé dans l'enregistrement dir lorsque nous importerons la - véritable clef publique. - - 1 octet valeur : 8 - 1 octet réservé - 1 u32 LID (Ceci est simplement le numéro d'enregistrement de ce record.) - 2 u32 keyid - 1 octet algorithme de la clef publique - 3 octets réservé - 1 u32 hintlist - - hintlist contient la liste des enregistrements qui ont des références qui pointent - vers cette clef. Nous utilisons cet élément pour augmenter la vitesse d'accès - des enregistrements de signature qui ne sont pas encore vérifiés. Notez que ces - données ne sont qu'un indice, une indication ("hint") mais les enregistrements actuels - pourraient ne pas détenir d'enregistrement de signature pour la clef, mais le - code du programme saura prendre soin de tout cela. - - 18 octets réservés - - - - Record Type 10 (table de hachage) - -------------- - - Comme nous utilisons les fingerprint pour accéder aux clefs, nous devons - implémenter un accès rapide en utilisant des méthodes de hachages simples, - afin d'éviter une surcharge de gdbm. La propriété des fingerprint - est qu'ils permettent un usage direct en tant que valeurs hachées (ils - peuvent être considérés comme des nombres aléatoires cryptographiquement - forts). - Nous utilisons une architecture à multiples niveaux dynamique, qui combine - les tables de hachage, les listes d'enregistrements et les listes - chaînées. - - Cet enregistrement est une table de hachages de 256 entrées ; une propriété - spéciale est que tous les enregistrements sont stockés consécutivement - pour produire une grande table. La valeur hachée est simplement le 1er, - 2nd.. octet du fingerprint (selon le niveau d'indirection). - - Lorsque nous les utilisons pour hacher les enregistrements de répertoires - shadow, une différente table est utilisée, et elle se trouve indexée - par le keyid. - - 1 octet valeur : 10 - 1 octet réservé - n u32 recnum; n dépend de la taille de l'enregistrement : - n = (reclen-2)/4 ce qui donne 9 pour la taille actuelle - d'enregistrement de 40 octets. - - Le nombre total de ces enregistrements constituant la table est : - - m = (256+n-1) / n - - ce qui donne 29 pour une taille d'enregistrement de 40. - - Pour rechercher une clef, nous utilisons le premier octet du fingerprint - pour obtenir le recnum de la table de hachage et nous étudions l'enregistrement - adressé : - - o Si cet enregistrement est une autre table de hachage, nous pouvons - utiliser le second octet pour indexer cette table de hachage et continuer. - - o Si cet enregistrement est une liste de hachages, nous pouvons parcourir - toutes les entrées jusqu'à trouver la bonne. - - o Si cet enregistrement est un enregistrement de clef, nous comparons - le fingerprint avec celui recherché et nous déterminons s'il s'agit - de la clef recherchée. - - - - Record type 11 (liste hachée) - -------------- - - Consultez la table hachée pour une explication. - Ceci sera également utilisé à d'autres fins. - - 1 octet valeur : 11 - 1 octet réservé - 1 u32 next enregistrement de liste hachée suivant - n times n = (reclen-5)/5 - 1 u32 recnum - - Pour la taille actuelle utilisée par les enregistrements (taille 40) nous avons n = 7. - - - - - Record type 254 (enregistrement libre) - --------------- - -Tous ces enregistrements forment une liste chaînée d'enregistrements non-utilisés. - - 1 octet valeur 254 - 1 octet réservé (0) - 1 u32 next_free - - - -En-têtes de paquets -=================== - -GnuPG utilise des en-têtes PGP 2 et il est aussi capable de comprendre -les en-têtes de type OpenPGP. C'est une amélioration utilisée sur les anciens -en-têtes de paquets : - -Les CTB bits 10, les "packet-length length bits" ont leurs valeurs listées -dans la table suivante : - - 00 - 1-octet champ packet-length - 01 - 2-octets champ packet-length - 10 - 4-octets champ packet-length - 11 - pas de taille de paquet fournie, taille inconnue - -Comme indiqué dans cette table, selon la taille du packet-length les -octets restants (1, 2, 4 ou 0) du champ de structure de paquets sont -un "champ packet-length". Ce champ est une valeur numérique à part entière. -La valeur du champ packet-length est définie par la valeur de la -totalité du champ numérique. - -La valeur 11 est actuellement utilisée dans un cas : les données -compressées. C''est à dire qu'un bloc de données compressées -ressemble à : où A3 est le binaire "10 1000 11" et -produit ici un paquet de taille non-définie. L'interprétation -correcte en est : "jusqu'à la fin de la structure englobante" -bien qu'en fait la structure englobante soit généralement -le fichier. - -+ Ceci sera modifié dans une future version, où la signification de la -+ valeur 11 (voir ci-dessous) aura aussi sa place. -+ -+ Une valeur de 11 pour d'autres paquets active un codage spécial -+ de la taille, où la taille du paquet suivant ne pourra pas être -+ déterminée avant l'écriture du paquet, en particulier ceci sera -+ utilisé si de grande quantités de données sont à traiter dans -+ un mode filtre. -+ -+ Ceci fonctionne de la manière suivante : après le CTB (qui est un -+ champ de longueur de 11) un champ marqueur sera utilisé, il indiquera -+ alors la taille du bloc de données suivant. C'est un simple champ -+ de deux octets (MSB en premier) contenant la quantité de données qui -+ suivent le champ, sans inclure le champ de taille toutefois. Après -+ ce bloc de données un autre champ de taille suivra, qui donnera la taille -+ du bloc de données suivant. Une valeur de 0 indique une fin de paquet. -+ La taille maximale d'un bloc de données est limitée à 65534, ce qui -+ réserve la valeur 0xffff pour des extensions futures. Ces marqueurs de -+ taille devront être insérés dans le flux de données avant que les -+ données ne soient envoyées en sortie. -+ -+ Ce champ de deux octets est largement suffisant, car l'application -+ doit placer en tampon cette quantité de données pour précéder le -+ marqueur de taille avant de produire une sortie. Les blocs de données -+ d'une taille supérieure à 32 Ko n'ont aucun sens. Notez que ceci pourra -+ également être utilisé pour les flux de données compressées, mais -+ nous devrons alors utiliser une autre version de paquet afin de dire à -+ l'application qu'elle ne peut assumer qu'il s'agit du dernier paquet. - - -Extensions GNU à l'algorithme S2K -================================= - -Le S2K mode 101 est utilisé pour identifier ces extensions. -Après l'algorithme de hachage les trois octets "GNU" sont utilisés -pour indiquer clairement qu'il s'agit d'extensions GNU et les octets -qui suivent donnent le mode de protection GNU utilisé : 1000. Les -modes définis sont : - - 1001 - ne pas conserver du tout de partie secrète - - - -Usage des fichiers gdbm pour les trousseaux de clefs -==================================================== - -La clef utilisé pour stocker le keyblock est son propre fingerprint, -les autres enregistrements sont utilisés pour les clefs secondaires. -Les fingerprint font toujours 20 octets où 16 bits de fingerprint -sont suivis par 0. Le premier octet de chaque clef indique une -information sur le type de clef : - - 1 = la clef est un fingerprint de 20 octets (16 octets fpr "paddés" de 0) - les données sont le keyblock - 2 = la clef est un keyid complet de 8 octets - les données sont une liste de 20 octets fingerprints - 3 = la clef est un keyid court de 4 octets - les données sont une liste de 20 octets fingerprints - 4 = la clef est une adresse email - les données sont une liste de 20 octets fingerprints - - Les données sont pre-appended (précédées) par un octet de type : - - 1 = keyblock - 2 = liste de 20 octets fingerprints "paddés" - 3 = liste de liste de fingerprints ("but how to we key them?") - - - -Pipemode -======== - -Ce mode est utilisé pour réaliser des opérations multiples avec un -unique appel à gpg. C'est assez pratique lorsqu'il faut pouvoir vérifier -un grand nombre de signatures. Actuellement nous n'avons qu'un support -des signatures détachées. Ce mode est une astuce qui permet d'éviter -de faire fonctionner gpg n en daemon mode et d'utiliser les Unix Domain -Sockets pour lui faire passer les données. Il n'existe aucun moyen -pratique de portabilité de ce concept sous Windows, alors nous utilisons -des pipes simples pour faire fonctionner ce mode sous Windows. Comme nous -n'avons aucun moyen de signaler des EOF multiples dans un pipe nous -devons laisser le contrôle s'insérer dans le flux de données lui-même. -Nous réalisons alors une distinction entre les données du flux et un -état de contrôle. A son lancement, le système se trouve dans un état -de données mais n'acceptera aucune donnée. Il attend en fait une -transition vers un mode de contrôle qui s'obtient en envoyant un simple -caractère '@'. Une fois dans le mode de contrôle, des commandes sont -attendues et ces commandes sont à un octet après lequel le système -revient au mode de données (mais cela n'implique pas qu'il acceptera -des données immédiatement). La commande de contrôle la plus simple -est '@' qui permet d'insérer ce caractère dans le flux de données. - -Voici le format que nous utilisons pour les signatures détachées : - -"@<" - Début d'un nouveau flux -"@B" - La signature détachée suit. - Ceci émet le paquet de contrôle (1,'B') - -"@t" - Le texte signé suit. - Ceci émet le paquet de contrôle (2, 'B') - -"@." - Fin de l'opération. Le paquet de contrôle final force la - vérification de la signature. -"@>" - Fin du flux. - - - -Autres notes -============ - -Dans la version* 3 de version de paquet nous calculons les keyid de cette manière : - -RSA : les 64 bits de poids faible de n -ELGAMAL : nous construisons un paquet de clef publique v3 (avec CTB 0x99) - et nous calculons une valeur hachée rmd160 à partir de ce paquet. - Il est utilisé comme fingerprint avec les 64 bits de poids faible - qui produisent le keyid. - -* Les certificats de révocation ne comportent qu'un paquet de signature ; -"import" sait comment traiter ces paquets. L'idée derrière ce principe -est de conserver une petite taille de paquet. - - - -Format des messages Keyserver -============================= - -Le serveur de clef peut être contacté par un Unix Domain Socket ou via TCP. - -Le format des requêtes est : - -==== -command-tag -"Content-length:" digits -CRLF -======= - -Où le command-tag est : - -NOOP -GET -PUT -DELETE - - -Le format de réponse utilisé est : - -====== -"GNUPG/1.0" status-code status-text -"Content-length:" digits -CRLF -============ - -suivi par octets de données. - - -Les codes de statut utilisés sont : - - o 1xx: Information: requête reçue, traitement en cours. - - o 2xx: Succès - L'action a été reçue, comprise et acceptée. - - o 4xx: Erreur client : la requête contient une erreur, mauvaise syntaxe - ou demande irréalisable. - - o 5xx: Erreur serveur - Le serveur n'a pu traiter une demande - qui semble valide. - - -Documentation sur HKP (le protocol de serveurs de clefs http) -============================================================= - -Un serveur HTTP minimal sur port 11371 reconnaît les requêtes GET -pour /pks/lookup. Les paramètres standard encodés URL de la requête -sont toujours ceux-ci : (toujours key=valeur) - -- op=index (comme pgp -kv), op=vindex (comme pgp -kvv) and op=get (comme - pgp -kxa) - -- search=. Nous avons ici une liste de mots qui doivent - apparaître dans la clef. Ces mots sont séparés par des espaces, - points, @, etc. Les délimiteurs ne feront pas partie de la - recherche et l'ordre des mots n'a aucune importance (mais consultez - l'option suivante). - -- exact=on. Ce switch permet d'indiquer au serveur hkp qu'il ne doit - rechercher que les correspondances exactes. Dans ce cas, les - délimiteurs et l'ordre des mots sera considéré. - -- fingerprint=on. Renvoie également les fingerprint, lorsque utilisé - avec 'index' ou 'vindex' - -Les serveurs de clefs savent aussi reconnaître le format http-POST vers /pks/add. -Vous utilisez ceci pour envoyer des clefs au serveur. - -Le mieux pour produire une requête reste : - - /pks/lookup/?op= - -Ceci peut être implémenté en utilisant le mécanisme de traduction Hurd. -Toutefois, nous pensons que les traitements du serveur de clef doivent -faire l'objet d'une refonte. diff --git a/doc/fr/FAQ b/doc/fr/FAQ deleted file mode 100644 index b15da515b..000000000 --- a/doc/fr/FAQ +++ /dev/null @@ -1,1111 +0,0 @@ - -GNUPG : FOIRE AUX QUESTIONS - -Version : 1.2 -Dernière modification : 10 septembre 2001 -Maintenu par : Nils Ellmenreich -Traduction : Gilbert Fernandes - -Ce document est la FAQ de GnuPG. La dernière version HTML est -disponble ici : - -L'index est produit automatiquement. Des erreurs peuvent donc -s'y trouver. Toutes les questions ne seront pas situées dans leurs -sections afférentes. Les suggestions quand à l'amélioration de cette -FAQ seront les bienvenues. - -Veuilez envoyer vos additions et corrections au mainteneur de la FAQ. -Il serait plus pratique si vous pouviez fournir une réponse à inclure -directement dans la FAQ. Toute aide sera fortement appréciée. - -Veuillez ne pas nous envoyer de message du type : "Ceci devrait -être une FAQ, quelle est la réponse ?". Si la réponse ne se trouve -pas dans la FAQ c'est que la question n'a pas été considérée. -Dans ce cas, recherchez dans les archives de la liste de -distribution par email. - - - - - 1. GENERAL - 1.1) Qu'est-ce que GnuPG ? - 1.2) GnuPG est-il compatible avec PGP ? - - 2. SOURCES D'INFORMATION - 2.1) Où puis-je trouver plus d'informations ? - 2.2) Où puis-je obtenir GnuPG ? - - 3. INSTALLATION - 3.1) Sur quels systèmes fonctionne GnuPG ? - 3.2) Quel collecteur d'entropie dois-je utiliser ? - 3.3) Comment puis-je inclure le support du RSA et de l'IDEA ? - - 4. UTILISATION - 4.1) Quelle est la taille de clef recommandée ? - 4.2) Pourquoi la création de clefs est-elle aussi longue ? - 4.3) Pourquoi tout est si lent quand je travaille sur un système distant ? - 4.4) Quelle est la différence entre options et commandes ? - 4.5) Je ne peux pas effacer un userid car il a déjà été effacé dans mon - trousseau de clefs publiques ? - 4.6) Que sont la confiance, la validité et l'ownertrust ? - 4.7) Comment puis-je signer un fichier de patch ? - 4.8) Où se trouve l'option "encrypt-to-self" ? - 4.9) Comment puis-je me débarasser de la version et du champ de commentaire - dans la version "armor" des messages ? - 4.10) Que signifie le message "You are using the xxxx character set" ? - 4.11) Comment puis-je obtenir la liste des keyid ayant servi à - chiffrer un message ? - 4.12) Je ne peux plus déchiffrer mon message chiffré symétriquement (-c) avec la nouvelle -version de GnuPG ? - 4.13) Comment puis-je utiliser GnuPG en environnement automatisé ? - 4.14) Quel client email puis-je utiliser avec GnuPG ? - 4.15) On ne peut pas avoir une librairie gpg ? - 4.16) J'ai produit avec succès un certificat de révocation, mais comment dois-je - le transmettre aux serveurs de clefs ? - - 5. QUESTIONS SUR LA COMPATIBILITE - 5.1) Comment puis-je chiffrer un message avec GnuPG pour que PGP soit capable de le déchiffrer ? - 5.2) Comment migrer de PGP 2.x vers GnuPG ? - 5.3) (supprimé) - 5.4) Pourquoi PGP 5.x n'est pas capable de déchiffrer les messages pour certaines clefs ? - 5.5) Pourquoi PGP 5.x ne peut vérifier mes messages ? - 5.6) Comment puis-je transférer mes valeurs de confiance de PGP vers GnuPG ? - 5.7) PGP n'aime pas ma clef privée. - - 6. PROBLEMES ET MESSAGES D'ERREUR - 6.1) Pourquoi GnupG me dit sans cesse "Warning : using insecure memory!" ? - 6.2) Le support des fichiers de grande taille ne fonctionne pas .. - 6.3) Dans le menu d'édition les valeurs de confiance ne sont pas affichées - correctement après la signature des uid : pourquoi ? - 6.4) Que signifie "skipping pubkey 1: already loaded" ? - 6.5) GnuPG 1.0.4 ne tient pas compte de ~/.gnupg ... - 6.6) Une signature ElGamal ne vérifie plus rien depuis la 1.0.2 .. - 6.7) Les anciennes versions de GnuPG ne vérifient pas les anciennes - signatures ElGamal - 6.8) Lorsque j'utilise --clearsign le texte en clair comporte parfois des - tirets supplémentaires : pourquoi ? - 6.9) Que signifie "can't handle multiple signatures" ? - 6.10) Si je soumet une clef au serveur de clefs, rien ne survient ! - 6.11) J'obtiens un "gpg: waiting for lock ..." - 6.12) Les anciennes versions de GnuPG (e.g. 1.0) ont des problèmes - avec les clefs de GnuPG récents .. - 6.13) Avec GnuPG 1.0.4 j'obtiens un "this cipher algorithm is deprecated ..." - 6.14) Les dates sont affichées par ????-??-??, pourquoi ? - 6.15) J'ai encore un problème, dois-je produire un message de bogue ? - 6.16) Pourquoi GnuPG ne supporte pas les certificats X.509 ? - - 7. SUJETS AVANCES - 7.1) Comment tout cela fonctionne-t-il ? - 7.2) Pourquoi certaines signatures avec une clef ELG-E sont valides ? - 7.3) Comment tout le système de confiance fonctionne au juste ? - 7.4) Quel est ce genre de sortie : "key C26EE891.298, uid 09FB: ...."? - 7.5) Comment interpréter certaines sorties informatives ? - 7.6) Les lignes d'en-tête des messages font-elles parties des éléments signés ? - 7.7) Quelle est la liste des algorithmes préférés ? - 7.8) Comment puis-je changer la liste des algorithmes préférés ? - - 8. REMERCIEMENTS - - - -1. GENERAL - -1.1) Qu'est-ce que GnuPG ? - -GnuPG signifie GNU Privacy Guard et est -l'outil GNU destiné aux communications protégées par chiffrement, -ainsi que le stockage protégé d'informations. Ce programme peut -être utilisé pour chiffrer des données et produire des signatures -numériques. Il comprend une gestion avancée des clefs et respecte -le standard Internet proposé OpenPGP comme décrit dans le -RFC 2440 : et il se destine -à une parfaite compatibilité avec le PGP produit par NAI Inc. - -1.2) GnuPG est-il compatible avec PGP ? - -En règle générale, oui. GnuPG et les distributions récentes de PGP -devraient respecter le standard OpenPGP et fonctionner de concert. -Il existe toutefois quelques problèmes d'interopérabilité. Consultez -les questions 5.1ff pour plus de détails. - -2. SOURCES D'INFORMATION - -2.1) Où puis-je trouver plus d'informations ? - -Voici une liste de ressources en ligne : - - - -Cette page regroupe la page de documentation GnuPG. Vous pouvez consulter -les HOWTO ainsi que le manuel de GnuPG : le GNU Privacy Handbook -actuellement disponible en anglais, espagnol et russe. Ce dernier offre par -ailleurs une présentation étendue de GnuPG. Vous trouverez aussi des -documentations expliquant la conversion de PGP 2.x vers GnuPG. - - - -Vous trouverez ici une archive en ligne des listes de distribution par -courrier électronique de GnuPG. La liste la plus intéressante sera -probablement gnupg-users où toutes les questions en rapport avec -l'utilisation de GnuPG se trouvent rassemblées. Si le développement -vous intéresse vous consulterez avec joie la liste gnupg-devel et -vous pourrez également prendre contact avec les développeurs. - -S'IL-VOUS-PLAIT ! - -Avant de poster sur une liste, veuillez lire avec attention la FAQ et -toutes les documentations disponibles. D'autre part, vous devez ensuite -consulter les archives afin de découvrir si votre question n'a pas été -déjà posée et résolue. Vous épargnerez des pertes de temps et la -liste pourra se concentrer sur les problèmes qui n'ont pas encore -été résolus. - -La distribution des sources de GnuPG comprend également un -sous-répertoire /doc qui contient des documentations supplémentaires -et ces informations seront précieuses aux hackers (pas beaucoup aux -utilisateurs habituels, sauf les plus curieux). - -2.2) Où puis-je obtenir GnuPG ? - -Vous pouvez télécharger GNU Privacy Guard depuis son FTP primaire : - - - -Ou depuis l'un des mirroirs : - - - -La version actuelle est la version 1.0.6 et nous vous encourageons à migrer -vers cette version rapidement : elle corrige des bogues et améliore le -fonctionnement du programme, ainsi que votre sécurité de fait. - - -3. INSTALLATION - -3.1) Sur quels systèmes fonctionne GnuPG ? - -GnuPG devrait fonctionner sur tous les Unices ainsi que Windows (95, 98..) et les variantes -NT. Une liste de systèmes d'exploitation fonctionnels se trouve à : - - - -3.2) Quel collecteur d'entropie dois-je utiliser ? - -Les "bons" générateurs de nombres aléatoires sont cruciaux pour la sécurité de vos -chiffrements. Les différents systèmes d'exploitation proposent des valeurs -aléatoires de qualité variable. Linux et les systèmes *BSD produisent généralement -de bonnes valeurs grâce au /dev/random et cette méthode devrait rester la -méthode de choix pour ces systèmes. Les utilisateurs de Solaris devraient opter -pour pe paquetage SUNWski afin de disposer d'un /dev/random. Dans ces cas, -vous devriez utiliser l'option --enable-static-rnd=linux. D'autre part, il existe également -un dispositif au niveau kernel pour la production de valeurs aléatoires développé -par Andi Maier : - -< http://www.cosy.sbg.ac.at/~andi> - -Ce logiciel est au stade de beta : vous ne l'utilisez que sous votre seule -responsabilité ! - -Sur les autres systèmes, l'utilisation de l'EGC ou "Entropy Gathering Daemon" -se montre un bon choix. C'est un daemon écrit en Perl qui surveille l'activité du -système et produit des hachages permettant d'obtenir des valeurs aléatoires. -Vous devriez en consulter la page de téléchargement depuis : - - - -Pour l'utiliser vous devrez utiliser l'option --enable-static-rnd=egd - -Si les options ci-dessus ne fonctionne pas, vous pourrez utiliser le producteur -d'entropie "unix". Il est *TRES* lent et il devrait être évité lorsque possible. -Sa qualité d'entropie laisse vraiment à désirer et vous ne devrez jamais -l'utiliser dans la protection de données sensibles. - -3.3) Comment puis-je inclure le support du RSA et de l'IDEA ? - -RSA se trouve inclus dans GnuPG depuis la version 1.0.3 et supérieures. - -La distribution officielle de GnuPG ne comprend pas l'IDEA à cause -d'une restriction par brevêt. Le brevêt devrait expirer en 2007 et nous -attendons cette date pour l'inclure dans GnuPG. - -Toutefois, il existe des modules officieux qui permettent de l'inclure -même dans les versions de GnuPG avant cette date. Ces modules -sont disponibles depuis : - - - -Recherchez 'idea.c' - -Les directives de compilation se trouvent dans les fichiers "headers" de -ces fichiers. Vous pourrez ensuite ajouter la ligne suivante à votre -fichier ~/.gnupg/options : - - load-extension idea - -4. USAGE - -4.1) Quelle est la taille de clef recommandée ? - -Nous vous recommandons un minimum de 1024 bits pour les clefs de type -DSA et également pour les signatures simples de type ElGamal. La taille -du hachage est probablement le lien le plus faible si la taille de la clef -augmente à plus de 1024 bits. Les clefs de chiffrement peuvent avoir -des tailles supérieures, mais vous devriez alors vérifier le fingerprint -de la clef de cette manière : - -gpg --fingerprint --fingerprint - -Comme pour les algorithmes de clef, vous devriez vous en tenir aux -valeurs par défaut (i.e. les chiffrements ElGamal avec signature -DSA). Une clef de signature ElGamal comporte les désavantages -suivants : si la signature est grosse, il est difficile de créer une -clef correspondante utile pour les signatures et capable de résister -aux attaques réelles, et vous n'obtiendrez pas de sécurité -supplémentaire face au DSA. Il pourrait y avoir des problèmes -de compatibilité avec certaines versions de PGP. Il n'aura été -introduit que parce à l'époque, il n'était pas clair de savoir si -un brevêt s'appliquait ou non au DSA. - -4.2) Pourquoi la création de clefs est-elle aussi longue ? - -Le problème est ici que nous avons besoin d'une grande quantité d'octets aléatoires et que -nous devons pour ce faire collecter une certaine quantité d'entropie depuis, sous Linux, -le /dev/random. Il n'est pas vraiment facile de remplir l'entropie de Linux ; nous en avons -discuté avec Ted Ts'o et il a expliqué que la meilleure méthode pour remplir le buffer -n'est autre que de jouer avec votre clavier. Une bonne sécurité implique un coût. -Vous pouvez utiliser les touches Shift, Control, Alt en appuyant dessus de manière aléatoire, -d'autant que ces touches ne produisent aucune sortie à l'écran et vous pourrez accélérer -la production des clefs. - -Un autre programme pourrait également consommer une partie de l'entropie du système -dont vous avez besoin (jettez un oeil à vos daemons actifs). - -4.3) Pourquoi tout est si lent quand je travaille sur un système distant ? - -Vous ne devez SURTOUT pas faire cela ! Vous ne devez jamais créer de -clef GnuPG sur un système distant car vous n'aurez alors aucun contrôle -physique sur votre clef privée, ni même votre trousseau de clefs privées. -Ces clefs seront alors suspectibles de subir une attaque par dictionnaire. -Nous vous encourageons vivement à ne produire vos clefs que sur une -machine personnelle (un portable déconnecté de toute alimentation -et connexion réseau est le meilleur choix) et si vous devez conserver -votre clef privée sur une machine fixe, assurez-vous qu'une phrase -passe solide en protège le contenu et que vous pouvez faire confiance -à votre administrateur système. - -Lorsque nous devons utiliser GnuPG à distance c'est au-travers de SSH -et nous rencontrons le même problème. Il faut *beaucoup* de temps -pour produire des clefs de toute manière. Il ne faut pas créer de clefs -à distance. Si vous avez juste besoin de clefs à fins de tests, vous -pouvez utiliser l'optoin --quick-random pour produire rapidement des -clefs *faibles* qui permettent de vérifier quelques tests. - -4.4) Quelle est la différence entre options et commandes ? - -Si vous tapez 'gpg --help' vous obtiendrez deux listes séparées. La première -liste vous répertorie les commandes. La seconde liste regroupe elle les -options. A chaque fois que vous utiliserez GnuPG vous devrez utiliser -*UNE* commande (avec une exception, voir ci-dessous) et vous pourrez -utiliser une ou *plusieurs* options en combinaison avec la commande. - -Par convention, la commande doit se trouver à la fin de la liste d'arguments -après toutes les options. Si la commande requiert un nom de fichier, -ce dernier sera donné à GnuPG en *dernier* sur la ligne de commande. - -L'usage basique de GnuPG est donc : - - gpg [--option something] [--option2] [--option3 something] --command file - -Certaines options demandent des arguments. Par exemple, l'option ---output (que l'on peut raccourcir par -o) requiert un nom de fichier -en argument. L'argument de l'option doit suivre celle-ci immédiatement ! -GnuPG ne sera sinon pas capable de différencier le nom de fichier comme -option. Comme option, --output et son nom de fichier doivent se trouver -avant la commande donnée à GnuPG. L'option --recipient (ou -r) demande -un nom ou un keyID pour chiffrer le message et ces informations devront -imméditamenet suivre l'option --recipient/-r. La commande --encrypt ou --e sera fournie après ces options, avec en final le nom du fichier à -chiffrer. En voici un exemple : - - gpg -r alice -o secret.txt -e test.txt - -Mais l'utilisation des options sous leur forme longue permet de simplifier -la compréhension des lignes de commande : - - gpg --recipient alice --output secret.txt --encrypt test.txt - -Si vous sauvez dans un fichier nommé ".txt" alors vous devriez probablement -utiliser l'option ARMOR en ajoutant l'option --armor ou -a qui ne prend aucun -argument : - - gpg --armor --recipient alice --output secret.txt --encrypt test.txt - -Si nous plaçons des crochets autour des parties optionnelles, les choses -deviennent plus claires : - - gpg [--armor] [--recipient alice] [--output secret.txt] --encrypt test.txt - -Les parties entre crochets peuvent être placées dans l'ordre de votre -choix : - - gpg --output secret.txt --recipient alice --armor --encrypt test.txt - -Si votre nom de fichier commence par un tiret, GnuPG risque de penser -qu'il s'agit d'un paramètre et pour éviter cette situation vous pouvez -soit utiliser un "./-a.txt" soit utiliser un double-tiret comme ceci : - --- -a.txt - -* L'exception concerne le chiffrement ET la signature au même moment. -On utilise alors gpg [--options] --sign --encrypt foo.txt - -4.5) Je ne peux pas effacer un userid car il a déjà été effacé dans mon - trousseau de clefs publiques ? - -Comme vous ne pouvez sélectionner que depuis le trousseau de clefs -publiques, vous ne pouvez pas directement effacer le userid. Toutefois, -ce n'est pas très compliqué à faire. Vous devez créer un nouvel -utilisateur, disposant du même userid ce qui vous permet d'obtenir deux -utilisateurs identiques avec un seul disposant d'une correspondance -dans la clef privée. Vous pouvez désormais sélectionner cet utilisateur -et l'effacer. Les deux identifiants seront affacés du trousseau de clefs -privées. - -4.6) Que sont la confiance, la validité et l'ownertrust ? - -Le terme "ownertrust" est utilisé en remplacement de "trust" lorsqu'il -s'agit de la valeur que vous avez attribuée à une clef en fonction -du degré de confiance que vous accordez à son propriétaire, et si -vous l'autorisez à introduire de nouvelles clefs avec votre signature -jointe. La "validité" est un terme de confiance calculée, une valeur -numérique calculée par GnuPG en fonction des paramètres de -confiance des clefs et vous donne une idée de la confiance que -GnuPG attribue ou n'attribue pas à une clef et s'il estime que la clef -est valide pour un usage de chiffrement. Pour plus de détails consultez -le chapître "The web of trust" - -4.7) Comment puis-je signer un fichier de patch ? - -Vous pouvez utiliser : - -gpg --clearsign --not-dash-espaced ... - -Le problème avec --clearsign c'est que toutes les lignes qui -commençent par un tiret sont "quotées" avec "- " et comme diff -produit beaucoup de lignes de ce type, le patch risque d'être -détruit par la signature. Pour utiliser un fichier patch en le signant -et sans perdre la signature claire, l'option spéciale : - ---not-dash-escaped - -Permet de supprimer la production de ces séquences d'échappement. -Vous ne devriez pas transmettre par courrier électronique un patch -de ce type car les espaces et les fins de ligne font également -partie de la signature et un logiciel de messagerie risque de modifier -l'espacement et/ou les tailles de lignes, invalidant la signature. Si vous -souhaitez transmettre le fichier, le plus simple reste de le signer à l'aide -de votre MUA. - -4.8) Où se trouve l'option "encrypt-to-self" ? - -Utilisez l'option : - ---encrypt-to - -Vous pouvez utiliser une combinaison de cette option pour spécifier -plus d'un keyID. Pour désactiver temporairement l'utilisation de clefs -additionnelles, vous pouvez utiliser l'option : --no-encrypt-to. - -4.9) Comment puis-je me débarasser de la version et du champ de commentaire - dans la version "armor" des messages ? - -Utilisez l'option --no-version --comment "" - -Veuillez noter que la ligne vide laissée en place est *requise* par le format -et le protocole. - -4.10) Que signifie le message "You are using the xxxx character set" ? - -Cette note est affichée lorsque une conversion UTF-8 a été réalisée. -Veuillez vous assurer que le jeu de caractères utilisé pour l'affichage -correspond bien à celui du système. Le plus utilisé reste "iso-8859-1" et -c'est le jeu de caractères par défaut. Vous pouvez modifier ce jeu -de caractères à l'aide de l'option "--charset". Il faut que le jeu de -caractères utilisé corresponde à celui de votre affichage ou des -caractères pourraient ne plus correspondre dans le message une -fois transmis. Sinon, n'utilisez que de l'ASCII 7 bits pour qu'aucune -conversion ne puisse survenir. - -4.11) Comment puis-je obtenir la liste des keyid ayant servi à - chiffrer un message ? - - gpg --batch --decrypt --list-only --status-fd 1 2>/dev/null | \ - awk '/^\[GNUPG:\] ENC_TO / { print $3 }' - -4.12) Je ne peux plus déchiffrer mon message chiffré symétriquement - (-c) avec la nouvelle version de GnuPG ? - -Il existait un bogue dans les versions 1.0.1 et antérieures de GnuPG -qui surveniait lorsque 3DES ou Twofish avaient été utilisé pour des -chiffrements symétriques (ce qui n'a jamais été le cas par défaut). -Ce bogue a été corrigé afin de permettre le déchiffrement des anciens -messages, en utilisant l'option : - ----emulate-3des-s2k-bug - -Vous devriez déchiffrer puis rechiffrer (correctement) le ou les -messages concernés. Cette option sera retirée dans la version 1.1 -de GnuPG : n'attendez pas pour convertir vos messages ! - -4.13) Comment puis-je utiliser GnuPG en environnement automatisé ? - -Vous devriez utiliser l'option --batch et ne pas utiliser de phrase -passe car il n'existe alors aucun moyen de conserver cette -information de manière plus secrète que le trousseau de clefs -lui-même. Nous vous suggérons de créer vos clefs, en environnement -automatisé, de la manière suivante : - -Sur une machine protégée : - -Créez une sous-clef de signature pour votre clef, en utilisant le menu -edit et en utilisant l'option "addkeu" puis DSA. Vous devez ensuite -vous assurer que vous utilisez une phrase passe (requise par -l'implémentation actuelle) puis utiliser : - -gpg --export-secret-subkeys --no-comment foo - >secring.auto - -Copiez secring.auto et le trousseau de clefs publiques dans un -répertoire test. Entrez dans le répertoire, puis : - -gpg --homedir . --edit foo - -Et utilisez "passwd" pour retirer la phrase passe des sous-clefs. -Vous devriez également retirer toutes les sous-clefs qui ne sont -pas utilisées et copier secring.auto sur une disquette et la -porter jusqu'à la machine cible. - -Sur celle-ci, installez secring.auto comme trousseau de clefs -secrètes. Vous pouvez maintenant faire démarrer votre -nouveau service. C'est aussi une bonne idée que d'installer -un système de détection d'intrusions afin de pouvoir repérer -les intrusions ce qui vous permettra alors de révoquer toutes -les sous-clefs installées sur cette machine et de procéder à une -nouvelle installation de sous-clefs. - -4.14) Quel client email puis-je utiliser avec GnuPG ? - -Utiliser GnuPG pour le chiffrement de courrier électronique est -probablement l'usage le plus répandu. De nombreux logiciels de -messagerie (les "MUA") supportent GnuPG à divers degrés. Pour simplifier, -il existe deux moyens de chiffrer les emails avec GnuPG : l'ancien style -qui repose sur l'utilisation de l'ASCII Armor (un chiffrement classique -suivi par une conversion selon le RFC2015) ce qu'on appellait le -PGP/MIME et qui s'appelle désormais l'OpenPGP. Ce dernier supporte -d'autre part le MIME. Certains MUA ne supportent qu'un seul de ces -formats et vous devrez utiliser ce qui correspond aux capacités -de votre client de messagerie. - -La liste suivante n'est probablement pas exhaustive : - - OpenPGP: Mutt (Unix), Emacs/Mew, Becky2 (Windows avec plugin), - TkRat (Unix). Il y a un effort pour disposer d'un plug-in - Mozilla et Emacs/GNUS dispose d'un support en CVS. - - ASCII: Emacs/{VM,GNUS}/MailCrypt, Mutt(Unix), Pine(Unix), et - probablement beaucoup d'autres. - -Un bon aperçu du support de PGP se trouve à l'adresse : - -http://cryptorights.org/pgp-users/pgp-mail-clients.html - -Le support direct de GnuPG n'est pas indiqué, toutefois dans certains -cas il doit être possible d'utiliser un "wrapper". - -4.15) On ne peut pas avoir une librairie gpg ? - -Cette question aura souvent été posée. Toutefois, le point de vue -actuel est que GnuPG en tant que librairie risque de conduire à des -problèmes de sécurité. Dans un futur proche, GnuPG ne sera pas -implémenté sous forme de librairie. Toutefois, pour quelques domaines -d'application le programme gpgme doit pouvoir assurer ces questions. -Vous pouvez obtenir ce programme depuis : - -ftp://ftp.guug.de/pub/gcrypt/alpha/gpgme - - -4.16) J'ai produit avec succès un certificat de révocation, mais comment - dois-je le transmettre aux serveurs de clefs ? - -La plupart des serveurs de clefs n'accepteront pas une simple et "dure" -révocation. Vous devez d'abord importer le certificat dans GnuPG : - - gpg --import my-revocation.asc - -Puis transmettre la révocation au serveurs de clefs : - - gpg --keyserver certserver.pgp.com --send-keys mykeyid - -5. COMPATIBILITY ISSUES - -5.1) Comment puis-je chiffrer un message avec GnuPG pour que PGP - soit capable de le déchiffrer ? - -Tout ceci dépend de la version de PGP. - - PGP 2.x - -Vous ne pourrez pas dans ce cas, car PGP 2.x utilise l'IDEA qui n'est -pas un algorithme supporté par GnuPG à cause de son brevêt (voir -la section 3.3) mais si vous disposez d'une version modifiée de PGP -vous pouvez essayer ceci : - - gpg --rfc1991 --cipher-algo 3des ... - -Attention ! N'utlisez pas de pipe des données à chiffrer vers gpg, -mais donnez à gpg un nom de fichier sinon PGP 2 ne sera pas -capable de le prendre en charge. - -Quand à ce qui concerne le chiffrement conventionnel, vous ne -pouvez l'obtenir avec PGP 2. - - - PGP 5.x et ultérieurs - -Vous devrez utiliser deux options additionnelles : - - --compress-algo 1 --cipher-algo cast5 - -Vous devrez parfois utiliser "3des" au lieu de "cast5". PGP 5 ne -supporte pas l'algorithme "blowfish". Vous devrez aussi insérer -un "compress-algo 1" au sein de votre fichier ~/.gnupg/options -et ceci n'affectera pas le fonctionnement général de GnuPG. - -Ceci s'applique également au chiffrement conventionnel. - -5.2) Comment migrer de PGP 2.x vers GnuPG ? - -PGP 2 utilise les algorithmes RSA et IDEA pour le chiffrement. Depuis que le -brevêt sur le RSA a expiré GnuPG incorpore ce dernier, depuis la version -1.0.3 et ultérieures. L'algorithme IDEA reste sous brevêt jusqu'en 2007. -Sous certaines conditions vous pouvez utiliser l'IDEA, même aujourd'hui. -Dans ce cas, vous devriez consulter la réponse à la question 3.3 qui -explique l'ajout du support de l'IDEA à GnuPG et également lire ce -document : - -http://www.gnupg.org/gph/en/pgp2x.html - -Pour procéder à la migration. - -5.3) (supprimé) - - (vide) - -5.4) Pourquoi PGP 5.x n'est pas capable de déchiffrer les messages - pour certaines clefs ? - -PGP Inc refuse d'accepter les clefs ElGamal de type 20 même pour -le chiffrement. Ils ne supportent que le type 16 (qui est identifique en tout -cas en ce qui concerne le déchiffrement). Pour être plus inter-opérable, -GnuPG (depuis la version 0.3.3) utilise également le type 16 pour la sous- -clef ElGamal qui est créée par l'algorithme par défaut. Vous pouvez -aussi ajouter une clef de type 16 à votre trousseau de clefs publiques -tout en assurant que vos signatures sont valides. - -5.5) Pourquoi PGP 5.x ne peut vérifier mes messages ? - -PGP 5.x n'accepte pas les signatures en version 4 pour les données -mais OpenPGP demande la production de clefs V4 pour tous les types -de données et c'est pourquoi GnuPG les utilise... Vous devrez utiliser -l'option --force-v3-sigs pour produir'e des signatures V3 sur les -données. - -5.6) Comment puis-je transférer mes valeurs de confiance de - PGP vers GnuPG ? - -Il existe un script au sein du répertoire tools qui pourra vous aider. Après -avoir importé le trousseau de clefs publiques PGP vous pouvez utiliser -cette commande : - - $ lspgpot pgpkeyring | gpg --import-ownertrust - -où "pgpkeyring" est le trousseau de clefs originels et NON celui de GnuPG -que vous avez produit à la première étape. - -5.7) PGP n'aime pas ma clef privée. - -Les anciens PGP échouent parfois au traitement des commentaires privés -sur les paquets utilisés par GnuPG. Ces paquets sont en *totale* conformité -avec OpenPGP mais vous l'aurez compris, PGP n'est pas vraiment soucieux -d'OpenPGP. Pour contourner ce problème il faut exporter les clefs privées -à l'aide de cette commande : - - $ gpg --export-secret-keys --no-comment -a your-key-id - -Une autre possibilité : par défaut, GnuPG chiffre votre clef privée à l'aide -de l'algorithme symétrique Blowfish. Les anciennes versions de PGP -ne peuvent comprendre que le 3DES, CAST5 ou l'IDEA sous leurs formes -symétriques. L'utilisation de la méthode suivante permet de rechiffrer -vos clefs privées à l'aide d'un algorithme différent : - - $ gpg --s2k-cipher-algo=CAST5 --s2k-digest-algo=SHA1 \ - --compress-algo=1 --edit-key - -Vous utiliserez alors l'option passwd pour modifier le mot de passe ; il suffit -de choisir la même phrase passe mais cette fois la clef sera chiffrée -symétriquement par du CAST5. - -Vous pouvez maintenant exporter la clef et PGP devrait pouvoir la gérer. - -Pour PGP 6.x les options suivantes permettent d'exporter une clef : - - $ gpg --s2k-cipher-algo 3des --compress-algo 1 --rfc1991 \ - --export-secret-keys - -6. PROBLEMS and ERROR MESSAGES - -6.1) Pourquoi GnupG me dit sans cesse "Warning : using insecure memory!" ? - -Sur beaucoup de systèmes, ce programme doit être installé en tant que -setuid(root). Ceci est requis afin de pouvoir produire un blocage en mémoire -des pages utilisées (et d'éviter tout transfert en swap ou sur disque). Ce "lock" -permet de verrouiller dans la pratique les informations sensibles en RAM -afin de conserver ces données comme secrètes. Si vous n'obtenez aucun -message d'erreur c'est que votre système supporte le verrouillage de pages -mémoire depuis l'accès root (le programme s'exécute en tant que root grâce -à son setuid). Le programme quitte le mode d'exécution "root" dès que les -pages sont verrouillées en mémoire qui plus est. - -Sur Unixware 2.x et 7.x vous devriez installer GnuPG avec le privilège -"plock" pour obtenir le même effet : - - filepriv -f plock /path/to/gpg - -Si vous ne pouvez pas installer GnuPG en tant que setuid(root) ou si vous -ne voulez pas, vous pouvez utiliser l'option : - ---no-secmem-warning - -Ou bien le placer en tant qu'option (sans les deux tirets) dans votre -fichier ~/.gnupg/options ce qui permet de désactiver le warning. - -Sur quelques systèmes (e.g; Windows) GnuPG ne verrouille pas les -pages en mémoire (ce n'est pas toujours possible selon les systèmes) -et les anciennes versions de GnuPG (1.0.4 et antérieures) produisent -sur ces systèmes le message d'erreur suivant : - - gpg: Please note that you don't have secure memory - -Cet avertissement ne peut être désactivé en utilisant l'option décrite -ci-dessus car nous considérons que cet avertissement forme une -faille de sécurité importante. Toutefois, comme il provoquait une trop -forte confusion auprès des utilisateurs de ces systèmes, le message -d'avertissement a été retiré. - -6.2) Le support des fichiers de grande taille ne fonctionne pas .. - -Le LFS fonctionne correctement depuis les versions 1.0.4 et ultérieures. -Si le configure ne le détecte pas correctement, essayez un autre -compilateur : egcs 1.1.2 fonctionne parfaitement mais d'autres -versions semblent poser problème. D'autre part, certains problèmes -de compilation rencontrés dans GnuPG 1.0.3 et 1.0.4 sur HP-UX et -Solaris étaient provoqués par un support "cassé" du LFS dans les -sources ... - -6.3) Dans le menu d'édition les valeurs de confiance ne sont pas affichées - correctement après la signature des uid : pourquoi ? - -Ceci survient car certaines informations sont stockées immédiatement -dans la TrustDB, mais le calcul ne se réalisé qu'au moment de la -sauvegarde effective. Ce n'est pas un bogue vraiment facile à corriger -mais nous pensons régler ce problème dans une future version. - -6.4) Que signifie "skipping pubkey 1: already loaded" ? - -Depuis la version 1.0.3 de GnuPG l'algorithme RSA est inclus. Si vous -avez toujours l'option : - -load-extension rsa - -Dans votre fichier .options le message en question apparaîtra. -Il vous suffira de retirer la commande qui n'est plus requise -du fichier .options pour que le message cesse. - -6.5) GnuPG 1.0.4 ne tient pas compte de ~/.gnupg ... - -Ce bogue est connu et il a été corrigé dans les versions ultérieures. - -6.6) Une signature ElGamal ne vérifie plus rien depuis la 1.0.2 .. - -Utilisez l'option : - ---emulate-md-encode-bug - - Use the option --emulate-md-encode-bug. - -6.7) Les anciennes versions de GnuPG ne vérifient pas les anciennes - signatures ElGamal - -Veuillez migrer vers la version 1.0.2 au minimum, et de préférence -une version ultérieure (1.0.6 par exemple). - -6.8) Lorsque j'utilise --clearsign le texte en clair comporte parfois des - tirets supplémentaires : pourquoi ? - -Ceci s'appelle le "dash-escaped" et il est requis par le format -OpenPGP. A chaque fois qu'une ligne commence par un tiret, ceci -risque de survenir. Cela permet aux programmes de retrouver -sans difficulté les lignes de marquage du format, comme : - ------BEGIN PGP SIGNATURE----- - -Seules ces lignes doivent pouvoir commencer par deux tirets. Si vous -utilisez GnuPG pour traiter ces messages, les tirets supplémentaires -seront retirés et les clients de messagerie "corrects" devraient -également retirer ces tirets lorsqu'ils affichent le message. - -6.9) Que signifie "can't handle multiple signatures" ? - -A cause des différents formats de messages, GnuPG n'est pas toujours -capable de découper un fichier contenant des signatures multiples. -Ce message d'erreur vous informe que les données en entrée -comportent un problème. Le seul moyen pour disposer correctement -de signatures multiples revient à utiliser le standard : le format -OpenPGP avec les paquets "one-pass-signature" qui sont utilisés -par défaut par GnuPG ou bien de recourir au format de texte en clair. - -6.10) Si je soumet une clef au serveur de clefs, rien ne survient ! - -Vous utilisez probablement GnuPG sur Windows en version 1.0.2 ou -antérieure. Cette fonctionnalité n'était alors pas encore disponible, -et il ne s'agit pas d'un bogue. Vous devriez adopter une version -plus récente, qui dispose de toutes les fonctionnalités :-) - -6.11) J'obtiens un "gpg: waiting for lock ..." - -Les anciennes versions de GnuPG ne quittaient pas correctement -et laissaient un fichier "lock". Allez dans le répertoire ~/.gnupg et -effacez les fichiers *.lock qui s'y trouvent pour continuer. - -6.12) Les anciennes versions de GnuPG (e.g. 1.0) ont des problèmes - avec les clefs de GnuPG récents .. - -Depuis la version 1.0.3 les clefs produites par GnuPG sont créées avec -une préférence pour Twofish (et l'AES depuis la version 1.0.4 à savoir, -l'algorithme Rijndael) et ceci signifie également qu'elles disposent de la -capacité d'utilisation de la nouvelle méthode de chiffrement MDC. Ceci -sera disponible dans OpenPGP très rapidement et sera supporté en -tout logique par PGP 7. Cette nouvelle méthode de chiffrement permet -de se protéger votre des attaques (des anciennes attaques en fait) -contre les systèmes de chiffrement du courrier électronique. - -Ceci signifie également que les versions 1.0.3 et antérieures de GnuPG -auront des problèmes avec les clefs plus récentes. A cause des -correctifs de sécurité, vous devriez conserver votre installation -de GnuPG à jour de toute manière. Comme manière de régler le -problème vous devriez demander à GnuPG de n'utiliser que l'ancien -algorithme de chiffrement en utilisant la ligne : - -cipher-algo cast5 - -dans votre fichiers d'options. - -6.13) Avec GnuPG 1.0.4 j'obtiens un "this cipher algorithm is deprecated ..." - -Si vous venez de produire une nouvelle clef et que vous obtenez ce message -pendant un chiffrement, il s'agit d'un bogue de la version 1.0.4 ; le nouvel -algorithme AES Rijndael est utilisé mais il n'est pas enregistré sous le bon -numéro d'algorithme ce qui produit ce message d'erreur "deprecated". -Vous pouvez ignorer cet avertissement et les versions plus récentes -de GnuPG sont corrigées sur ce point. - -6.14) Les dates sont affichées par ????-??-??, pourquoi ? - -A cause de contraintes dans la plupart des implémentations de la libc, -les dates au-delà de 2038-01-19 ne seront pas affichées correctement. -Les systèmes 64-bit ne sont pas affectés par ce problème. Pour éviter -d'afficher les dates de manière incorrecte, GnuPG utilise des signes -"?" au lieu des chiffres. Pour obtenir la valeur correcte vous devrez -utiliser l'option : - ---with-colons --fixed-list-mode - -6.15) J'ai encore un problème, dois-je produire un message de bogue ? - -Si vous êtes sûr(e) que le problème n'est mentionné nulle part, ni dans -cette FAQ ni dans aucune liste de distribution GnuPG, commencez -par consulter la liste de bogues qui sont en cours de traitement (la page -de documentation dispose d'un lien vers la page de bogues). Si vous -ne savez pas trop s'il s'agit d'un bogue, envoyez un courrier -électronique à la liste : gnupg-devel. Sinon, vous pouvez utiliser -le système de suivi de bogues GUUG à l'adresse : - -http://bugs.guug.de/Reporting.html. - -6.16) Pourquoi GnuPG ne supporte pas les certificats X.509 ? - -GnuPG est avant tout une implémentation du standard OpenPGP, -défini dans le RFC 2440. Ce standard propose une infrastructure -complète et différente du X.509 - -Ces deux systèmes sont des cryptosystèmes à clef publique, mais -la manière dont les clefs sont traitées diffèrent. - -7. SUJETS AVANCES - -7.1) Comment tout cela fonctionne-t-il ? - -Pour produire une paire de clefs publique/privée, utilisez la commande - -gpg --gen-key - -Puis répondez aux questions en adoptant de préférence les valeurs -par défaut. - -Les données qui sont chiffrées par une clef publique ne peuvent être -déchiffrées que par la clef privée correspondante. La clef secrète -est d'autre part protégée par une phrase-passe ce qui n'est pas le cas -de la clef publique, librement distribuable. - -Pour transmettre à vos amis un message, il vous suffit de le chiffrer -à l'aide de leurs clefs publiques. Seules leurs clefs privées seront -capables de déchiffrer le message. - -GnuPG est pratique pour signer de manière numérique les choses. -Les éléments qui sont chiffrés à l'aide de la clef publique ne peuvent -être déchiffrés que par la clef publique, ce qui permet de signer -des documents. On commence par produire un hachage, une sorte -d'empreinte à taille fixe d'un document (de taille variable). Ensuite, -votre clef privée est utilisée pour chiffrer ce hachage. Par la suite, -toute personne disposant de votre clef publique et du document -peut vérifier si le hachage du document correspond bien au -déchiffrement du hachage, obtenu par votre clef publique dont -disposent vos destinataires. - -Un trousseau de clefs n'est qu'un gros fichier (selon le nombre de -clefs qu'il contient). Vous avez un trousseau de clefs publiques -qui contient vos clefs publiques et celles de vos amis. Vous avez -également un trousseau de clefs privées qui ne contient que vos -clefs privées (chiffrées et protégées par votre phrase-passe). Vous -devez faire très *attention* à ce fichier. Personne ne devra jamais -y avoir accès et la phrase-passe qui le protège devra être -complexe, et longue afin de bien protéger le secret. - -Vous pouvez aussi chiffrer des données de manière conventionnelle, -en utilisant l'option "-c" de GnuPG. Dans ce cas, la phrase-passe -utilisée servira de clef pour protéger le message. Aucun usage -de clef publique ou de clef privée ici : il s'agit d'un chiffrement -classique où il n'existe qu'une seule clef, utilisée pour chiffrer et -déchiffrer les données. Généralement, on utilise cette méthode -pour chiffrer ses propres documents à l'aide d'une phrase-passe -secrète qui vous est propre. Cette méthode de chiffrement ne -doit être utilisée pour des communications que si vous avez -physiquement rencontré vos destinataires et que vous partagez -dans le plus grand secret la phrase-passe (votre propre époux ou -épouse, ou un ami de confiance). L'avantage est que vous pouvez -changer de temps en temps la phrase-passe et en réduire le -risque afin qu'en cas de découverte de la phrase-passe toutes -vos données ne soient pas lisibles ;-) - -Vous pouvez ajouter et copier des clefs depuis votre trousseau -de clefs publiques à l'aide des commandes "gpg --import" et -"gpg --export". Vous pouvez également (ATTENTION !!) exporter -vos clefs privées à l'aide de la commande : "gpg --export-secret-keys" -mais ce n'est généralement pas utile sauf si vous devez déplacer -vos clefs privées d'une machine à l'autre. - -Les clefs peuvent être signées à l'aide de l'option "gpg --edit-key". Lorsque -vous signez une clef, vous certifiez que la clef appartient selon vous -à la personne dont l'identité se trouve mentionnée dans la clef. Vous -devez absolument être sûr(e) que la clef appartient bien à cette -personne, sans le moindre doute. Vous devez vérifier son fingerprint -à l'aide de la commande : - -gpg --fingerprint userid - -Et recevoir le même finger par téléphone ou de visu par la personne -concernée. Généralement, on procède à des "fêtes" où chaque personne -amène sa pièce d'identité, une carte de visite comprenant le fingerprint -et l'on procède à un échange des fingerprint, ou directement des clefs. - -Vous pouvez également utiliser l'option "-o filename" pour forcer -la sortie vers le fichier "filename". Pour forcer une sortie en console -par défaut on utilise un tiret. La commande "-r" permet de spécifier -le destinataire (avec quelle clef publique vous allez chiffrer) en ligne -de commande au lieu d'avoir à taper le nom du destinataire dans -le mode interactif. - -Autre chose d'importance. Par défaut, TOUTES les données sont chiffrées -dans un format binaire particulier; Si vous souhaitez transmettre les données -par courrier électronique (par exemple) vous devez les protéger dans -un format d'amure qu'on appelle ASCII ARMOR. Ce format sera obtenu -en utilisant l'option "-a" mais la méthode préférée reste d'utiliser -un client de messagerie respectueux du format MIME comme Mutt, Pine -et bien d'autres. - -Enfin, il existe une petite faille de sécurité dans OpenPGP (et donc dans PGP) -et vous devriez TOUJOURS chiffrer PUIS signer un message. Il ne faut -pas seulement chiffrer afin d'être totalement protégé. N'oubliez jamais. - -7.2) Pourquoi certaines signatures avec une clef ELG-E sont valides ? - -Ces clefs ElGamal furent produites par GnuPG en version 3 de paquets -(selon le RFC 1991). Le brouillon OpenPGP a été modifié par la suite -afin de modifier l'identifiant d'algorithme pour les clefs ElGamal qui est -utilisable pour les signatures et le chiffrement des modes 16 à 20. -GnuPG utilise le mode 20 quand il produit ses nouvelles clefs ElGamal -mais il accepte toujours les clefs de type 16 qui selon le standard -OpenPGP ne peuvent servir qu'au chiffrement, si la clef se trouve -dans un paquet en version 3 du format. GnuPG est le seul programme -ayant jamais utilisé les clefs au sein de paquets v3 - vous ne risquez -donc pas grand chose. - -7.3) Comment tout le système de confiance fonctionne au juste ? - -Il fonctionne d'une manière proche de PGP. La différence c'est que -la confiance est calculée uniquement lorsqu'elle est requise. C'est -pourquoi la TrustDB contient une liste des signatures de clefs -valides. Si vous ne fonctionnez pas en mode batch, vous devrez -assigner un paramètre de confiance aux clefs (un ownertrust). - -Vous pouvez consulter la validité (la valeur de confiance -calculée) en utilisant cette commande : - - gpg --list-keys --with-colons - -Si le premier champ est "pub" ou "uid" le second champ vous -indiquera le niveau de confiance : - -o = Inconnu (cette clef est nouvelle au système) -i = La clef est invalide (eg. il manque sa propre signature) -d = La clef a été désactivée -r = La clef a été révoquée -e = La clef a expiré -q = Non-défini (pas de valeur attribuée) -n = Ne jamais faire confiance à cette clef -m = Cette clef dispose d'une confiance marginale -f = Cette clef dispose d'une confiance totale -u = Cette clef dispose d'une confiance ultime. Cette valeur - n'est utilisée que pour les clefs où la clef secrète est - également disponibles. - -La valeur dans l'enregistrement "pub" est la meilleure valeur -obtenue depuis les enregistrements "uid". - -Vous pouvez obtenir la liste des valeurs de confiance attribuées ; -i.e. la confiance que vous accordez aux autres lorsqu'il s'agit -de signer la clef d'un autre individu) : - - gpg --list-ownertrust - -Le premier champ est le fingerprint de la clef primaire, le second -champ est la valeur assignée : - -_ = Aucune valeur d'ownertrust assignée -n = Ne jamais faire confiance au propriétaire de cette clef - lorsqu'il s'agit de vérifier d'autres signatures. -m = Une confiance marginale est accordée au détenteur de cette clef - lorsqu'il s'agit de signer d'autres clefs. -f = Assumer que le détenteur de cette clef est une personne de confiance - lorsqu'il s'agit de signer des clefs. -u = Nous n'avons pas besoin de nous faire confiance à nous-même puisque - nous détenons notre propre clef privée. - -Vous devez conserver ces valeurs confidentielles, car elles représentent -la confiance que vous accordez ou non à d'autres individus. PGP stocke -cette information au sein de trousseau de clefs et le publier n'est PAS -une bonne idée. Vous devez utiliser la commande d'exportation pour -transmettre des clefs. Quoi qu'il en soit, GnuPG -évite ces problèmes en ne conservant ces valeurs qu'aun sein de sa -TrustDB donc vous pouvez copier un trousseau de clefs publiques -si vous utilisez GnuPG (et nous disposons aussi de la commande -d'exportation). - -7.4) Quel est ce genre de sortie : "key C26EE891.298, uid 09FB: ...."? - -Cette sortie est la représentation interne d'un userid au sein -de la TrustDB. Le keyid est "C26EE891" et le "298" est le keyid local, -un simple numéro d'enregistrement dans la TrustDB. Enfin, le "09FB" -sont les deux derniers octets d'un ripe-md-160 de l'identifiant de -l'utilisateur pour cette clef. - -7.5) Comment interpréter certaines sorties informatives ? - -Lorsque vous vérifiez la validité d'une clef, GnuPG affiche -parfois une information préfixée par l'information en rapport -avec le sujet vérifié. Par exemple : "key 12345678.3456" indique -que la clef disposant de l'ID 12345678, et du numéro interne 3456 -est considérée au sein de la TrustDB au sein de ce qu'on -appelle un enregistrement "directory". Un "uid 12345678.3456/ACDE" -indique quel est l'identifiant d'utilisateur qui correspond -à cette clef. Il s'agit d'une information sur la signature de la -clef 9A8B7C6D disposant de cet ID et s'il s'agit d'une signature -directe sur la clef, la partie User ID sera vide : - -(..//..) - -7.6) Les lignes d'en-tête des messages font-elles parties des - éléments signés ? - -Non. Par exemple, vous pouvez retirer les lignes "Comment:" -Elles n'ont pas vraiment d'objet comme les lignes "header" des -courriers électroniques. Toutefois, une ligne qui débute par -"Hash: ..." est requise par les signatures OpenPGP afin de permettre -au parser de déterminer quel algorithme de hachage utiliser. - -7.7) Quelle est la liste des algorithmes préférés ? - -La liste des algorithmes préférés est une liste d'algorithmes -de chiffrement, de hachage et de compression stockés dans -la signature propre de la clef durant sa production. Lorsque -vous chiffrez un document, GnuPG utilise cette liste (elle fait -partie de la clef publique) pour déterminer quels algorithmes -doivent être utilisés. De manière basique, ces indications -expliquent aux autres utilisateurs quels algorithmes vous -acceptez en entrée avec un ordre de préférence. - -7.8) Comment puis-je changer la liste des algorithmes préférés ? - -Actuellement la liste et les préférences sont directement intégrées -dans les codes sources de GnuPG. Vous devrez modifier le fichier -g10/keygen afin de modifier cette liste et procéder à une -nouvelle compilation. La fonction que vous devrez modifier est -keygen_add_std_prefs. Le code est d'ailleurs assez simple à -comprendre. Les constantes utilisées pour différencier les -algorithmes sont définies au sein du fichier include/cipher.h - -Après avoir modifié ces fichiers, générez une nouvelle paire -de clefs (ou une nouvelle sous-clef de chiffrement) avec -la version modifiée de l'exécutable. La nouvelle clef disposera -des nouvelles préférences et pourra être utilisée depuis des -exécutables non modifiés. - -Pour modifier les préférénces d'une clef existante, vous devrez -utiliser un exécutable modifié (voir ci-dessus) afin de modifier -la date d'expiration puis sauvegardez les changements. Les -préférences seront automatiquement modifiées lors de la -sauvegarde et vous pouvez désormais utiliser la clef modifiée -avec tout exécutable, modifié ou non. - -La modification de la liste de préférences à l'aide d'une -version non-modifiée de GnuPG (probablement depuis le menu -d'édition) fait partie de la liste TODO (A FAIRE) prévue -pour les prochaines versions de GnuPG. - - -8. REMERCIEMENTS - -Nous souhaitons remercier Werker Kosh pour la rédaction de la -première FAQ originelle et pour tous les participants aux listes -de discussion gnupg-users et gnupg-devel. La quasi-totalité -des réponses de ce document proviennent de leurs efforts. - -Nous souhaitons également remercier Casper Dik pour nous -avoir fourni le script permettant de générer cette FAQ, -qu'il utilise d'autre part pour son excellente FAQ Solaris2 ;-) - -Copyright (C) 2000 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/fr/README.fr b/doc/fr/README.fr deleted file mode 100644 index 3a5d8485e..000000000 --- a/doc/fr/README.fr +++ /dev/null @@ -1,10 +0,0 @@ -You find here translations to French of some of the documents in -../doc. Those translations are not necessary up-to-date and should -not be used as reference without checking the original English -versions. - -Gilbert Fernandes kindly contributed thses translatons. - - - - diff --git a/doc/glossary.texi b/doc/glossary.texi new file mode 100644 index 000000000..e739947ef --- /dev/null +++ b/doc/glossary.texi @@ -0,0 +1,30 @@ +@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. + +@node Glossary +@unnumbered Glossary + + +@table @samp +@item ARL + The @emph{Authority Revocation List} is technical identical to a +@acronym{CRL} but used for @acronym{CA}s and not for end user +certificates. + +@item CRL + The @emph{Certificate Revocation List} is a list containing +certificates revoked by the issuer. + +@item Keygrip + This term is used by GnuPG to describe a 20 byte hash value used +to identify a certain key without referencing to a concrete protocol. +It is used internally to access a private key. Usually it is shown and +entered as a 40 character hexadecimal formatted string. + +@item OCSP + The @emph{Online Certificate Status Protocol} is used as an +alternative to a @acronym{CRL}. It is described in @code{RFC 2560}. + + +@end table diff --git a/doc/gnupg-badge-openpgp.eps b/doc/gnupg-badge-openpgp.eps new file mode 100644 index 000000000..8edbaa617 --- /dev/null +++ b/doc/gnupg-badge-openpgp.eps @@ -0,0 +1,7798 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: GIMP PostScript file plugin V 1.10 by Peter Kirchgessner +%%Title: /home/wk/gnupg-badge-openpgp.eps +%%CreationDate: Thu May 4 10:58:15 2000 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%Pages: 1 +%%BoundingBox: 14 14 250 250 +%%EndComments +%%BeginProlog +% Use own dictionary to avoid conflicts +10 dict begin +%%EndProlog +%%Page: 1 1 +% Translate for offset +14.173228 14.173228 translate +% Translate to begin of first scanline +0.000000 235.680000 translate +235.680000 -235.680000 scale +% Image geometry +491 491 8 +% Transformation matrix +[ 491 0 0 491 0 0 ] +% Strings to hold RGB-samples per scanline +/rstr 491 string def +/gstr 491 string def +/bstr 491 string def +{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} +true 3 +%%BeginData: 538041 ASCII Bytes +colorimage +JcFO*s8Mfn"T8)mr;QTn!<2ut"TA>srVl]o#6">np\=R`kPk_ar;-9cq"j^aoEFs_q>:*fjo>>Z +!W;rhs8W'#rVlirq>^Kos8;oos87HJgAc[~> +JcFL)!<2urs8;lpqu?]qrr!0&q>UBnrVuoss8N#ss8W)rs82fqr;c`nq%EAjmd0/tgXXWn_SEgo +ZEUO:YkkX)Y8FOM['mHQ\\5o'cI:M)kN_R0q"aXYrr;urrrE&prrW/srqlWsr;HWprr2p#rr<#t +rpKg]rdk+4s*t~> +JcFa0"T.i_q"sO[s8Dro!;?Bir;R!!qYU6is8Mrr+8l!3q=saWna,K$j58S8^UCAGU7%7*Kn+Sq +EGoZ/AGTg9@38uiAnYmnDfpM`Ng?H@\\QG^Knq>5aCk5Tr~> +JcFR+s8E)trr2`nrr2co"T8;us8W)trr;usr;Qcqp\u$-q"*n9hqQc6eC2mtg>:ZBhV[8OjQ63p +)<0W6i8EMMhW*VRhVHr>f@JI%g#2/eoCVnNrrE&rs8W)rs8W'"s8N#qrrDuqs8Mutr;HVGs4[L'~> +JcFC&s8E#urVlZn#lXZ!rql]lrr;usrr<#t!<)iqs8;oqrqnJIp@@>&f$24J['-I,VP9f\Vl6Jg +US=NZV5C#`USOZ\USOcaV59u`US=Z`USFW\rhBgsVldAAajAYun+QbW')VV*rVZQjrVl`orr)ip +qYL3jrquotrVlcq"9/?"qsOL^rdk+3s*t~> +JcFa0"TA2nqu-$as8<0"qY^$P37=B\j7?sm>MA7oUmEHZegQ(b4c_U.#oio]LlnauMLq>1'gs8W)u +r;$0erVlfkrrW/sp\t'hrV6EkrIP"-s*t~> +JcFa0s8E#rrr)usqt^3c!W2fjrri?!q>C0irW)ops8MutrV$6qq"*b.g>h5mi=b//hq$?0f@\^+ +e_Jm6hVdGUk5" +JcF^/!<2Qhs8;urrr)isrVc`trVZWnrr;rqs$m"aq"jg\pup\gbe^]cSu/0s`qY^Bn +rquforWN2trVcZnrqHHmrdk+%s*t~> +JcFL)rr)ls#6"GrqYL*dr;?Zrr;$?mrVZ\#rr)]`lfmEeg;LM%SW8)7?tE\L>$>-7?tF+jCi*p$ +BPhU(E,p)DG^b*lIXlltIX63_FEMSDEGT<"@qB:`?t!GI=]ed/>$PBAASus\UU7ngj6#Uln+QYU +r:Bpkrr)iqs8Doorri5qqYU5Bs4dR(~> +JcFa0$3'htr;?Qnr;6 +JcF-t"TA8rrVl`p"oS5rrr<#trW)lqrVua7q!?nhah5*_Vkg)`VPU/dVlHo-]>;M5f&>uepAX^h +p@n@XqYU-bq#C0ip]1'fp*o\/q>C'UhU9H_^q6tVW2-5_SXuOLTq@pPWj97Xf]2JqqYL-dqu6Tp +qu6Nn!W;qJs3:Ro~> +JcFO*#6"Gqqtp?jrqccnqtpBkqu6ZprVnDFq"XUWo^V84iQo6CT9"_LDJEfp@p`ME>$G?FCN4ZZ +Q_LRf[^EKK['[7?[K3kKqRljAs1A?DrjjPe\@K2ZWgAWkH$!q9?<0s);c-S!?=IDVDg?ttTWu;_ +io]Oomdp5NrV$6krqHEnrVQTmJcFL)J,~> +JcFa0"oeDpr;?Qks8W)tr;ZclrrrE%rr2cnqu6j!p[7G0h>Z7:hq?Z:hW*njo'HAWrr)6a!<2Ti +&b"f=hV-Z>hr*DLi8iqUlLb&Nrseo'r;6Bequ$Bhr;-Elr;Qs"qtU!arqZQrrqu]nJcFp5J,~> +JcF!ps8Muq!;ucp$N0l$qt&q!ah+s[rLjRqUSb&r]Z8FQp%JC["o8&pqYL*gr;linrr*'!r;?Hg +q>C3grVR*(r;$-_qY^9krVH?brq@T'hTW^CZE:(,WMZGaTq\ +JcFO*#6"GrqYU6inc's7qt^$Wna,Dj_Q&uXHu3>#?s[>SCN+NNO-lTP]=bbd\@T>c^;'Z_$,OEo +`5KR3_ns:d`VmaQ`#nU'>\8;AT +JcF^/rr2Zls83&tqYL-frq6:$rT`1fdb*I7hV-cJn+ZeSs8W#sqZ-Wps8W)trrN-!rVcconbrRe +rr)j&rqu`nr;?NlrqQKsp\"%@k2cO$#isq!g=Y*9meHVX#QFZ#s8Murrql]uqt^'brdk+(s*t~> +JcFR+s8N&s"8r,rrqQKsrr)flr;6Kl)u0C$iQ\s8V5C5hV4sch\\lY_p%J(Np%eOarVlisrr2p% +rr)fprr;uqrrN-!nbrOer;Zfqs8E-!r;?Nmr[@[>p\+:Qo$Y^t\$)g.US+ +JcFI(rVcBg,lRW5na,AnhpB$4NI,PYBk(IO>%MVuLU+A"]">_p`lQb`5KX7a2lBG +bK\;Un]E`1`5Tj@aiDB=`Pod8`lH0@a2>[)\[A`FMgoe]>ujj% +JcF7"s83-!rr2imqYU6grseqdgZ.2IgXss'fB;Vrqu6ZpoDejhqu?]qqu?Kjrqu`l!<)`ns8E6& +rr;urr;H(QGio&M>h":CA!<.QLcMrC~> +JcFa0s8N#rs8;oo"8r,rrqQL&rqu]mr:]gFcEEt?Undpe$a$hYdba6\q"OU[r;6HprVZTlr;uur +rr)lsrr)fqrq-6hrX/W(rr)cnrVliqrql]rr;Q]qs8F2?rr2lno]b,X]sau`!~> +JcF^/s8DN3[^iu^^AYkN`5BR5`r3p\_ns=0a8X*Y`W+$Z +bQ#cdbPK?[aSa'[`l,jq`;[dXaN=G*.EffN`Poj8_SEq%^V@CgVj`WfCL:1F<`rg>Anc+4TY]@@ +n+$#BqYU0es8W&ms8W#tqu6Emqu)*GkPp&~> +JcF7"!ri,qq#:cleC3"-hVmJSlhCAVq>^Ko"T%ogq>C6kl2M:kqYU-dqYU-equ$?hqu-Kirr`9# +s8Muo$N0o$qYC!crr)iprr2fp%fQ4kiSE;Lk2YC\jP8AWlMgk`JcF[.J,~> +JcFa0!ri/rqYgHnq>V3/r;6 +JcF^/s8Dcnr;APNq"FFSo'bl(bcHA6A7/D8;,^qJM3OpK]u7n.a2Q!;aN)9=_o':)_Sa70`l?'= +a2Z*;`5V\prQ#u$aN)9?`Q,s<`Q6'?`lQ0Aa2Z-<`lH3Ba3)TJrlGMjb0%`B_o0R7`Q8"us2Z.s +\#GgUK5t=#='K$<@VBUtJZ-`Gi9'Fuq"t$grri;tqu-Kis8W&sqZ-SGs6'E4~> +JcG!7!<)os!<2lq%0$2&qu6WqrVuoqr;6El$iKVbhr!8Cf\Pf]rV6C#rqlNcp%A+Uqu$Bkqu?]q +!;uKhr;I0'rqucnrqucnrqucnrqcQerqH?grqQL%p[I>)jQZ$slKIL#q"k"&rVl]os8N&urr<#t +s8Dups8ITLjSs`~> +JcG!7!<)os!ri6"r;H]pr;Rl;s8W)urr;usqWQ>A[\BOlUo1N8cemsWq"ad`rr)ihrrN-!rVcs" +rr;rprqlZls8Duss8N)unGi%Xqu?Kks8Dus/,]5>q"!\"a0VY9T:MLCStr[2g$SV4qu6Wps8;lq +qYpHkrr)irrVucprdk+1s*t~> +JcG!7!<)os!<2cn-N*c;q"=FYq>^3VjPeh0VN64@ARf+YD1.;6W3WtF]Y;4u_oBd?rQGboaN2B@ +`P]U4`Q#p=b0'P$qo08i`l?!;`Q#m:`Q#m:`Q#m:aNXV-rQP5_!6FuYq90i'aM59p\@]>YWg8E[ +?rp<(9i"\pFHE]NiTp%2qu6`ps8Mlp!<%KKir=N~> +JcFm4%fZG+rr)inrqu]kqYL!dq>UQ[f$i=Oh?)p4rq$-or;69`p%S@\rqu]nqZ-QhrrW2tr;QTn +r:Bpfr;QTjr;6Kkr;?Q^rsSenkj@Qmi83/ +JcFm4#6+T#rr)ipp\u94qu$9^ilA3uVPU)aYeefImJ-_UqYgBiqY^ +JcFm41&h.Nrr)ios8W&rqYBgXp@Ih?m,?C&R!NLY?s?fHHB+W$]Z7t3aiDB<_Sa:1`lQ=%bl>i] +aSX-Xbl5c_a:lS7`l?!;`Q#m:`Q#m:`Q#m:aNXY.rQP8`r5\r^bfp(/rlk8^,fn$F`l?'A`kfO( +YG$r!@T-,u9iPG5FFUO9iT]e(q"t$iqu)*GgAc[~> +JcFs6s8Mus$i]trqYL*gqYBs^rr)j&qsik'f@nm9oBcMWrquctrquTkq#C-mqu$Hkqt'U`qssXb +rqcZorqZKkroX4ho]tGjh:p]AiSs.mr;Q^(rr;utrqH?fq"t'hJcFa0J,~> +JcFs6s8Mio!WE#qrttY3q<5u3Yc4:iX0KLom.'lLr;-*YrVuiqquZirrVc`qrrE&trVulms8DrV +s8)]rs8N#ns8;lnrVZTnq^MIBrr)ZjrVcZkqt\se\?Dj+T:r!X[_p_bp\aabrVuops8Vuqs8;lo +rr.KKkPp&~> +JcFs6s8Moq-iWu9p%\=ZrV6$Pho2.?G\gboAS-+GTrbc@aN;THdEg+^aiDEA`qm[S_[sf,aNDcR +cdC(bc-4>ScdC/>ci;8ibl5a!aNDTF`lQ0@`lQ0@`lQ0@`lQ0>`V[[NaSs?]aSs0\`P]Um_'[.F +c-4ATbf[rB^q[Us]"5DDNdGYQ=]SX1BRGrEb1YqCqYC*irdk+)s*t~> +JcG!7s8;rsrVm$"q=sjdqYpicdbE^CjlGP%qu6Zqr;QitrVl9c!W;ioq>^?lquZlpq#:$eq#C0g +qsXF_rql`orqZKkrq??lrr2irrqud"rqc?[oD&7`$N',Jjl5F^g=G*Hqu6j!q"ssdrdk+/s*t~> +JcG!7s8;rspAb0l%eoqpaJGZ)U7nEdcLCT&rVm0&r;?HjqYU3hrVlfprVliq"8r,rrqcWrrr;uV +s8)`cs8;itrVlfqr +JcG!7s8;rsqYq]:qY'RPn`K&iVgEAm@:3P[MQ!_]]XkksaNW#[eBQ1\rltJds2Y2[rPefS$cU-* +aND`Ocd0k\bl5`bc2Q&hc2Preb500gb/h`Hb/h`Hb/h`Hb/jFupr[_/YH^i7 +JcFg2s8<'"rql]lrs.Z@hqcf0jneoT"oA,pqtpUHoo)/C^rVZWns8W#rr;?Hh!VuTkr;Z^&s8;flqt^$]p\k'frsJJ_hq[)GhrikGoDJUjr:]XX +JcFa0J,~> +JcFg2s8Dut(B+:4rquuF#TqJ?[TuZX!rVlis +rUp3ir;HPEs5s?3~> +JcFg2s8Dut)Z9X8qX`RiUi^!PA7TM4U:S1R^VIOu`l?*BrQH/&b0%uScHXPWbfn5PaN2NKccs\V +aMu3<_u@XT`r='W`r3mT_[j`-b08#Pb08#Pb08#Pb09e+rlG)You6^G1!%VdcHXSTa2Z'9`Q63G +bfe8P`l>j(Y,mFu?s-Q3;dj6PQH.eEo)&Iequ?]pqtg8Bs6'E4~> +JcFm4s8Dcn#P6g&hVdGXo)&FeqYpKpr;HNlquH`qs8N#pr;Z`ss8N#q!<2fo"9/5qqu-Hmrq?@' +r;QWnr;QWnr;QWnr;QWkq>L3jr;Q]ms8N#sr;QTlq>^6iq#pWor;?Qnrs8T!qYU6ir;6EersA2Y +h;78PkgRiNJcFO*J,~> +JcFm4s8Dut'`S(.qtTL-[%X1aUp%esnbr@bqtL'hs8Mrr#QFc&rr)iqs8)]prVZZnrVuitrVlQk +r;Q`ps83E+rr;utrr;utrr;utrr;ujs82f^rrE&trrW/srVc`rrr2rtrr +JcFm4s8Dut)Z00sn`nf>NcAN/=(6TL[)0c(a26!Fc-"/Mr5o/`b/_TDrlY/_rQ>/d$I-f;`l5j3 +_8F10rPnZP!5n`R!QN4Ib5]Q]`r!aR`r*pSaq)\>aiMQDb/hWBaND`Nb/aM(s2Ptr_RQY-F(8*E +='BBLE2h:Fl1=]IqYpNoJcFm4J,~> +JcFm4!;u]n#4C=!e(EgTqu6m"r;Q`rqY^C6hs7uforr;fnrqlcnrVZ]poDejirqufn +')_b.s8N&ts8N&ts8N&ts8N&to)JUdq"tHtr;?QorVc`orVZZqr;QWrqtg0gq>C7!q!?klhWNtU +iUm$I!rVckJcFp5J,~> +JcFm4!;uir&GGqcftOJ]TVoEJiq33Ks8Dor"9/)ks8;fsrr<#trr;osrql`prqQNnrqlWor;?Nl +rql`Xrr)crrr)]mrr;rrs8W,ts8N6$rVlcorr3*"r;6Kkru(_0p\=[^p[["VWLoo`V4ONrg@=b2 +q>UEkJcFm4J,~> +JcFm4!;uir)"$.uYE![:?Y"A=TsVYSa2H!;b0A,K`m4S+!6>)Y!6>)Xs24uX`lJ%trl>)ZrPefV +rQ+lY!6G)XrQ+lYiQ2&Aqoo&^rQGPi`l#^5a2Q*?rl5;caiDB;`5]j=rlGqr`59L.] +MuWYQo)JUdqu6Zqqu6oucIq+.fB3&0rs8T$s8;ijq>:-ersSc$q"ad`rVcZlrVcQkrquZj!rW&s +pAb0l#Q4Jrq>'g]ro3tJrr +JcG!7,6%WBqu-H`i1m0MUS>-CnFHVWrVZQmqu?]qrr)iqq>1'hpAb0ln,NFe!<)fmrr)fpqu?Hj +!<;lo')hh.rr)iprr)iprr)fprVc`opAY*l"o\H#s8N&sr;uoqrr)isrVZ[5rVZQjrqQ6_n%YZp +TqJ'PU8m8Nqu6Wqrr2`nr;M9IpA]X~> +JcG`Jli/X:qXa7DhSXSXEFW6jLoISm_8X@3b/;<@`lH3EbK%]HbK7iE`Q#m:a2c3>`5KXl`WsK! +_8F73aN4A'rQGGibfIfF`r='Zb59B`b/jS%rl>Ab`P][7aN2B?rPnZS#fas,b08,Tbg$+1qoT8e +a2>j7`l?*Aa2e1u,K.UB_oB^8aj8>[d`fnU`lQ!0\upEb=]83t>%DiiiTg+5rUTsirVQQhrrE"L +s*t~> +N;j%[r;?Hhrqufqr;Zfrs8NW/s8W#mr;6?gq>UBnr;QWlrs&&Pgsj^'mJHq^rr^Hkr;-Bhr;HWnrrE&srr`3!rr2fm)ZKd8qZ$Noqu?NlrVufls8N#trr;ut +rr;urrr3T)rqufqs8;opr;HZms82iqs7QBis8N#pr;Zcnrs\c(s81m:k2kabf%9ZnrrrDuq>C6k +q#:Bmqu6Blqtu$F!<7Q~> +O8f:\s8M`lrr2oss8E0!rr;usrVm`5s8W)qs8Drpq=s0lW26AhZ-2A.rV6?jrVulrs8W)trVc`p +r;ZTl!W;iorsA]$s8W)urVulsrVcrur;HWnrr3'!rVufpr;R3)qu?Wpr;Z`qrVufmrr;rr"TA>u +rqucq%efo"s8N&rs8;fns8;opq>^0fs8N)uqu?Worr!]6pAFd<[&9aqV5Boce+W_;rVlisrr2rt +q>U$ds8IcQJ,~> +OoPI[oDejc!;lWm#Q=PrrVulsrqcX+q(qn_u%FRaSa3Ybl>ibaT'9[b5KE] +aplG2`lZ<@_90d:aMu?BrQ#Glc-OYU`5os?`l-!Ab5TWbaoof*b/D0rb6u5(]#2S:b/)3=`lA#! +rlQ"t_o0L7^<"ICbfe/RaMu9B_oTa;`Q.nrq8iKRrlFuZs2b5[&]iD@aM*gN=&Dan?=7iLcJeBo +r +NW9%X!;uins8;lqqu6Zqrr3'!rVl`m"9&5prVZ[#qV]uZhV@Ppqu6p!qtp`MJ,~> +O8f4Zo`#9ts8W)us8N#trr)Zm'D_P(rqQ?_h7KV^U85c_oDeger;?Qqrr;Hds8Vuq!W2lqrseu+ +r;Z`qs82cps8N#trr2rrs8N8us8N&urV6Blq[WZ*r;Z]ps8N&mqZ$Bks82fprrN,pr;R6*s82Zj +s8Duqs8DuqrSmhVrtGD1q=adUca]gBVl62_]BAh`q#1*i"oeJtqu$Hes8DqOs*t~> +OoPI[oD\mhqYg9j"9&8urVlg5rr;lprql9Ri4Y1j@p)uhT=DhW^r4=6rQ+uXqoJWV"N\a,`l@nu ++j%sPb/VB<`llEBaMl3Fb/hZDaND`Qc,n&Bb/h`Na2l@"b5]No_SOL@bga_M`PTa9aND38`r4!Y +ap-)5a1o4%aSs?lb0.iFaNhiJ`lZ0?_o1QU)9gOVbJC]uVLiM^:gR^>BSsmhm-F9 +NW9"WrqufqrVuoqr;R$$p\Xmdqu$Hgrs&#Rf\G?=nbW:crWiAur;?Qns8V9]#ljo&r;Q`rqu-No +!W;ijrWN0!rr;cmr:p9krs\l's7lWmp&Fsis8DunrX&W"qu?]ps7uNgrr2rt#l=T$rVufqrVtjU +"T&&rrqcQm#kd!1kNM*hg\:[H$hsMnq>:0ks8Dlnrdk+Fs*t~> +JcG]K!<2ut+8c';s8Dlps8N#ts8MulkJF:*grr)lqrq$-irr2rnrrU-frr2ourqu`pqYgNqrr2ir +reLN(~> +M#[GPqu?Zos8N)urr;uq)?'C,qtp0YiQ%1)?XdhpRDZ_P^VI_)`Q6.!b5]QR`W4*Z`qd\!ai;9: +`lZEA`5K^;aN;ZKaMub/MQE +`lH6Ebg4YXcHaVXb0.oMrQ+`QnAlHd_8474^W"7)_R>M@@U<5CAS[XPiTp:3p&>$hrqZWnJcGcM +J,~> +NW9"Wq#CBk!<2or"9/5prV6BsrTDblhW"D,s8W'%rVZQjr;QZplM_=orVQNkrVlijs8W&trqHHg +rWiK!s8Dlqq>^9i&,c,#p](*dqt^9fs8;`hs7uWtqZ$Tnqt^3j%K?8%rr;onr;?Qmrr2rWrr1*ir;;-Gq#>j~> +JcG`Lrr2lrs8Er:rr2lpq"amai5)7hU8Z0"q>'pdqtg3erVl`p"TJAurr2Bdrr2os#QFZ"rr2rt +pAFpnp](3krr2rtrW`Dus82Wlq#(0jrX\r"s7cQhq"XU`q#C9hqZ$Bj"oA9!r;6rr<#srr)lsrr2lmrr;osreLN(~> +M>mSSrVQWnr;Zcn!<)co)#Emklg!EDP\k, +OoPCZp&G'i!<2`m!W)`mrs&>Rf%f'AqYU9mrVccrqulurr;Q]ns6BU`r<<3#s8Dilrr3,trVuio +q>LWos8;H=\D[2Yrr +K`D&NrVmo;s8N#trVlfrq>:0cr:ndBTV\Qoe*Q`)s8W&prql`orr2lrrq?Bjrr)lsrr<#urr2p! +rqlTlrs/H$s8DlorVl`p#Pe>pmaAN"q>L?lrr +MuNkWqtp?gs82`o!WDlnp_`l-s8N&sl/U?mF^efgEKI61_TBp<^r+7laoK]abl>icaSs3V`W*sV +a:-)-`Q$!?`l>s8`Q#ps`>m7M`kT=1ai_lQb/VE>`l>sHf$Usm[Dg%u_8XLpaq2kEb0SCgH%:@/ +e&]bKccF9,aT'7!b07oKf%&7!cH4;XcGd]CaN;WJbK%]Db0%fHrPnfTrPnEL)oft:_oU'HcH45L +_Rd.aV1N8b +OoGO_r;Q]_rrDumrrqZ6f\#0YrVmH-rqQUEm%K?:=-7:#^.aRefrV??drYPG2s8Mfjnb`+]q"jpgrr)clrql]ms8V*X +qu6s#qu$Kks8Vonrr39$kMb=]lJ^dsrVuosqYpQprVQZpKE$H~> +LAq8Qrr;oqrr3*"p\t0kr>#8%n&D6&UT;H'q"a^_rqlQks8W#prr2usrVlcorr2coqu6Qorr)ru +rVlisrr:3krVZTmr;QWos8;lis7-(8q>LC9jp!gILStMgKWQ=B$r;?Tprr)fp +rr;unrrE%Qs*t~> +N;itXqtpBhrVQKl,lRT7nbDtVp\=IDd[YDq@:Ob`\%KJoaMbp5bJqE;aihoNc-?73rQ>/]qSrQV +s2lt`lQa3)R'aT'6d_TC0Rdauamcd_s;%+EA>`l#m8aMuHMb0'_)rPniUrPn?J*mDmPaN)?@ +a25g6\\#_iZ]As-:/Y8'H`# +OoPI\p&>$kr;Zcqq>UWff%\j5lMLScr;-M31oDeWQ8gmPPO.jSNqXXOYq>^Enqu-ENrW<-!qu6U% +rr;umq>^Kkq>U?m#Nab'lf$mgpAY'pqYU*drquctrquZmquH_Ns*t~> +O8f4Zrr3*"s8N#prr`5trVl]o%fQ+tqW#MhW2Qu>m/I"XqYpQprVuos!<;HcrVZ`qrr<#t!WE#s +s8W!&s8DZgrUTsfpAY*jrr2p%q2Z[>++Eq]s8N#trso&'rCnCV)AaT1qu$Kms8N!!s8N#srtb5+ +p6.rk:2#TX_qb%Vq=j[arVucnqtg +NW0+Zqtp6hqtg9grt55,pZgnu_3\nLBQAj3`5TF2rlYYmcHaDMbg+GUbg$+1rQ>,`s2t8\A]i6A +c-OYU`l5s?bg";L`PfX5bK7cRf?;Ug_TKm_nrmnZ?K\^>>A=>Q,2POq#13mrVcTnrIOtKs*t~> +L&V8Sr;?QmrrW2trql^!k185>jnSiT#la`"qYBpbq=ag_"o7riqu?]TrX\u,rVZ]qm+//+BU/,f +rVZKj#PUk=)CO,1s7uX)qu?PM,:4EZ,Tn;Js8)cmq>M3-s8Jf@-QjQS-lk#g,V3M]RD%8Eq#C +OoPI\r;Zfr!WW/srr`9!rr2lr')qe+qr58dV5:QFnbN4^qu?]prr2usqu6`ss8VKcrVZits8W)r +r=K#.rVul`eY\^EP4/GLrVuorrWrQ'oL9u<,1?2`s8N#trt##,pk9b4(aC%=*5;ILs82fp!WW/u +rtkV5r1G2W*$#tD)(ZmP-X_Ok]%-?Frr)NhrVuEe"T8<"rVcWn'`7q1rVu]np@nCR]VM +NW9%U"8_olrVQWprVQU5q=*V(]SpiE@;h.4^rja?cHXMRbf[uJaN2O'aTB`2bl,]`aSsE[b5]]c +c!erCb/VHBc-aqba2>j6cd',"KmcO6aOA2G_o9dBbfI]Cd4c.8%^jI%_nj@8bf[rE`RELV#R^\F +'+YMHe&K\Pbf\#HaMu6=_U6nd%M&XC!"/cB$4.;:Bm?,Qb0//Tq9&ZWrPnELs2lk=cH"#Ja2uEI +a2?'CaN;6?]Y;1iH!40G;HS"2bNes(rVQKgqY9p`qu-JGs*t~> +L]7b]qtg-apA+U`s8VomrrqK:*hqZ$Tpr;QuVi8!>Ih=LRE!;QBi!WMtNs*t~> +OT5@[r;Qlus8W)trttb8s8Dusq#:*aqV8EUVl-cRmeZhWs8W)rs8N#rs8W'&rVlipqu-Nns#L&X +qtpEnrr<#qs8;iqq#C9is8;olpA=mfs8Mrroe.=1*$MQcq>^Kks8DusrVXDT)Bh]Kq#:#Xs"N#8GN2_s8N&u!<2ut0)keD;]-Yr+X%mI*ZZ+9)]0S;+!aLOo)/OdrVu]nr;HZo +s8Dutqu$EmrVHNlqYgNorqHEorr)for;Za/s8Munpt2XFTVnN]`UNa#rVu]mrs&H%s82irrJ(?&~> +NrK7\qtg3eo`#^*s7Y^5Y^:(qA8e'F_8O@cd9nMaN)]9&e#%. +PnON=2:p0ra3;cI`lQ3@`kogI4Ui&.#R_"N'GhQ(*Z5n5'+m!Obfn8PaV)n>dEKeYaih`FbJM9> +c,[cDa83mWa8X0Tb500o`l5d,[Zb<2>%;#RPLA[[o(_kUqtg +M#ReYq>C-cq=sUXp\b$prRKN[e`co1#5\5nq>:*hr;Qlur;Q]ks8Mm*q#:9mrqufqr;-?kq>^Hm +s"O?Ed[k*.oDejgs7lWH-R9iR/Dp=%r;Zfrq#C0fIO$*\V#LDlr;Zcrp&G'grqB4f-OJ&k9.V/5 +Qi-g^qu6Qo/b1P@+"P=VXbLL\/0Q>i+!`'U+ +OoPI\qZ$Tnr;RK0s82iqr:9^;WM?Vl_"%9nrVulpqu?]qs8<#us8W)trr!N.rVuosrr;utrr;uq +s8Mrmr;ZTirtYG)d$nO"o)Jafs7cQF,9@a:-JS@prr4JHp]('dGo[kEU&=rhr;Z`qo`+sgrq/l+ ++X5&!7OArqP5>.Wrr2rtrr2lr/ak/1(ad)BWI\PH,oIaJ(EFJ9)B=J/qZ$HkqtU$frquZnqZ$To +r;?Qos82imrqHEprr)fnrqc`prqud4rqcBW]VD3qUSjpTq>C6er;Z]nrr2clL&ZZ~> +O8fC^qtg0drV-=0rr)]cjQ!^qBl%.$X1>g^c-+8Rc-"2M`l@tr!64lV"38F(ao98._T'[@aMuBD +`l,m@_o]p>b0eJS`i=DWA\ua8aOJD]WsTCN$PpIu_7[_0c-+SRcXmn%#(k=O`5^*IdDX>P_9C4a +()7@]eM7sQ(OX`UaiqoI`Q6-@`l6-H(D[PnUoo_n:c07/*$>q3'G1ZYB[4Q@aj&)ScI:.aaj.j) +`WsQ(`lQEI`QI_lpr`QV)TKb4]t(7i>Zas0DgKO^m.BoDqtKj[qY0jbLAuc~> +MZ<_Us83-!qYBs]q>'sersmoEjON;js82irrr)`krq??lrqQLkrqQEjqu?3brVuZks8Voos8)Tl +p%SLa^aUNP:](1irr<#rrjO6r.3M=\r;Zfkrr;fopb*g5/bJu;r;ZZoq>^Kgs8/-3+W>Y"rjO-k ++tWK_r\40Gi@#Wf/bo)8r;Z`di7"<[Al9ft,:<0`s8%;3bkq>3s82]ns8)corVucps8;lprVuls +quciorr2cos8N&rs8E9'rr2ikq>L-grs%uRl1!frgAV$RrVliqK)^?~> +OoPI\q#;$,rVuors8N&rq"`UL?nq>^Klr;ZKbs89VY*umrLs8;lrrVZW#+Vu:>8,3#^s7cKlq#C%:)At!pqtg9kqu6Bjs7cQi +PTq([FS#F:*toS?oDS[fs8W,us8OeLr8&V2)(>1Op\XsfnD;N^N+,L%*ZZHurr;eEPKN^to`+db +s8VurrVccns8W#rrVccq"onT%s8N&krW3&uqu7K/rr22qU7IpATr$E6qu6QorqucorVZYMs*t~> +O8f@]qtg0dqYq`;q>:$gp$(;8CLC[^J\/n/`6?QPbK7cE`5BF/_o9X:aS<[+t*ErVQTp +rJ(?&~> +N;rnVs8;orqu6p!s8UO+i8OM2rrW0!q#:'hr9XFgrr)flr;QTlrr39!s82fpr;Z]mrVn)=s5kLP +-R8!Ss8Vfms7lSA-6O?VCA@Q"s8Vimrj*ji-\;9s)#jI5rVuljs8:q!+!N*$rVlLc.3TpsqYU-g +#lXf$dN^.bAbZ3(,l.B\nl/gbeLq>:3drVuirs8Mijs7uZns8Dlpq#:Qt +r;?Hhr;Q]q"oeDon+lkZrs%uZq=*G%g\h*OrW2opL&ZZ~> +OoPI\q>UHoqYpoor9U5UTVKHns8Dors8Dutr;Q]os82rsrr2fn!WW,trr2otrr2p'q#C6jrqufp +rVca?qu>b!+X%olq>^Kes8VlkGTRe>+D1?Aqu?]ir;<`='I&#*ruD%9s8DuspAb$L)AsJ;lMLMN +8g5,mMYR)Jrr<#srWiK$c5duH@J0X",l7K>s7lKgoBIJ?(F&bVq>\hh.jK/@p\Fj`rVuirs8Mij +s7uZns8Dlp"o\H!rr)forW3&urVulrrr3Q-s8MronCOt;V4jHUXR>f[rVlils8IfRJ,~> +O8f@]qtg3gqu7N3q"F@OioJ4&B3ADeYf=]+c,n2Pb/hT?rP8]U`Q$!AaN44tE66);`5BR7`5Kj> +cc"5Qbfn5R`50@2`6l]N\H*0T$cL05ccan_`nFr<'+kjKc,7EAe&p.gOqeQ>?.$d:aN2WLd*0AU +c+F&d',B$Ie'Kfd()1r>aiqiF`Q63C`Q63,&Khi[cHaYS^r+76^W6>u&IT-Z%aE#4dAR$P"BCQ2 +d+628`s0`/aMYs=_u@aWa8X0ZapuM4`Poa4`Q$!Abg"AQ`r +N;rqW"8r/qqYC-oq:Oc\o_nghp]C-erqcWsrqu]np&A(irVuoqr;6ElqYC0cqY9a]s8)cooDeag +rVfS:+XFMms8N&qrr;ro>9kI<-'J<-s7--hnm*:a-,]WYp&G$kr;ZTlrUj>?,q5AXs82i!+se9X +m/Qq]0E(_HSg5:%J,fQHqYgElrVuoqs6M$X)CtLXs7?2?+WVj[eG]4Cr;ZTmr;Q`rr;HZnrql`m +rr)lnrWE)us7cEj#3=e+mG[?prr3,tr;?TlLAuc~> +OoGI\rqcX1r;$F6)s8N&rs7uZl +nl?hS,F7p#qZ!T9*Z$!as8Drss8Dp)qZ!!)'-;N!s82Zlr;Rf8s6(RH&LI)Is76&9*>p"KdJN_= +r;ZTmr;Q`rr;HZbrWW9"rVc`pq>V3'qY^-dnC4G0St_XQ\)[5^qu?]pq1ep"~> +O8f@]qtg3gr;Rl9nE]H'iQ[Tp@pt;/_TL'Caih]G`Q#j4^;%P(aNDa+b503Z`dc%G`QH9?`5BU= +aN2oUdEg%adE'GH[`->6ajDjR&eL/JcHXkaaN`)`5S+YD&TuaNcb%WYbX)m[$Cf/V^Wk!K`ll9D +d*Fic',QDTfZ_m'%N#ckb1"VV_o'R>@jh:Mbd(jnerU!;qTOJ +,~> +NrT+Xs82lqq>UTkf[e[Grr36"q"jsgs8W)prrE&tqZ6Worr3#us8;k1s8;osrr)lsqY^Biqn[t\ +/Sj,;s7QEgpAam^Jg;TdK)GQCs8W#lrquX?*[;[M^]+31s8211,UZ=_r;?Tos8;ijs8Vhc+=8F% +q>^9jq#=,6-6[$rrVc`ps8N#rrqqg%-RGG[r;QQm*r#W\,U4gCqZ$Els7R]i+X(Lkrr)lps8Dup +p](9grr2rtrr2lrs8Mups8Mrrqu-g"qZ$Qps8;fp#3=n3jPn_\Jc>`MJ,~> +OoPI\qu?]q&cMM&rVcKZe>].:`:NX"r;?Qirri?"rVulrs7ZFqs8Muss8Mrrs7uQlq"VOR8L\?* +q#C$eqtC'apO+&%*.Rk`qZ$Toq>U9d+Vu(4*4u.Irr;i[+WV[sq#(*jrr;oqq>^KfRi3@k4S8[K +s7cLb)]fo-p&+ggs8N!(s87cp*ZgmGqu-Bk*r#QW*uuV,q>^ +O8f4Yrqc]orVn);oBkbpbboGf>(!Qb`lcEHc-F\_`l#a3_8+"0b08,Tbf]_%s2K<%a3)KAbKe5S +f$`0CAhFK`[Em@=c,.?F_96I))%p9#b/i5__nF.9eI)g'&e^qiai)HLb75=*0$hVWdEKtY`4aFE +c[lQ?'J/,$bgFJ_2A7#@9$YZ"_8FC=b/M9@E"jH4I`TdYcHF;H_SX=1d]Wrf*^[uj'u\MPe-?Zo +#Y<@lbg+/Qa32H-53`mDoOd)s&)O]tOU:L.b1f'W82K`?Q~> +NrT.Ys82osp\XsnqpjNRkPbDcq#CBns8Vuorr!-!q>:-hqtp^-es8W&t\fDn=;#((hq#CBnrqlHN-R:#]-0"b#qu;O!)C_*Ms8)ZkqZ$Knr:oM( +,9e;Arp]s`s7WW@+!E,[r;?Qns8W)ts8-=R(bWZ#qZ$TmqYpNkrr3bI-"pbPq>^?hs88r<+:*is6S7pjQP=VrVllrLAuc~> +OoPI\qu6]jrVcX$n_9e8W5SK*s8W#qrs/Q!qY^?lrVlZns8E0$rr2rsqu7o?s8Dfnrq?B^^j."J +(`sY9:&Xhdo`"mjrVs8@(EH6Es8D]jrtG>(i?90\(EVH/s8;nO*YTcaq#C?j)>X=3s8D]R+WMC> +[/04iq>^,g*>]V?bkqA;s8W'Is8-1G%k#*eqZ$TmqYpNks8W)1,%Y)Dq>^?gs7iK-)Ajp7o)8Ue +rUp-h$24Drr;HWprr2llrr<#irr +NrL^0qtp?lqu?]kn*&9,BkD1=^V@n4_90p>aN2BA`5KX7aNVrTbfn5PaN2BBaSX+\aN;NFa2cb/hNC7i)d]S]Aanb/M'U!i)p +r.b6%~> +PQ1[^s8N)urqlfor;?R(nBoD6mf*7drV6-dq"ssg$3'o"q>1!`qu$BkrqH=pqu-Nls8VZ@Ijcin +,9n0Q+sSDIrVlisrql`nk:Ru$,jbF.r;ZNks82ikZ7-h>,$XmCr:ru3-7/!Xqu?Zqs8N#tq=neL +,9S.JS=Q+=QCsZi-6"16qu$Elrr4hSqu'&3,pLb:s8Dors8;iqs82Zmq"t*erVucprqZ@q,UXX* +r;ZTmrr;oirjHjWq"ajdrr)orq>UElqu6Wqs8Mup(&e12rV6Elq=O^Yrr<#shrX1fgY_u%s8N#q +s8Dqfs*t~> +ScAZfq>UHoqYq!'q=jaVd'07D]A!&UrVuoq"TSK!rVZZp!<2ips8Moq!<2rs>5eL"qu$K]dWm&b +*ZZ7:*#fk>\GH.&s8Moqqr9%B(a//As8;ols8W#spT>_U)B2`Ps8;U\*ZlKfrql`prr;uts7uA& +)B0M4C7(HWRZsD/)]fY5=8MmprVn_Rr;8o'*#m6(s8N#ts8Dors8)Qkp\Fd_rr;orr:]bb*[)@h +q>^9jrr;ohrO$URp\=Xarr)orq>UEooDSmks8Donrr3N,s8)cpr7A$GUnF6[gACjHs8N#trrE%\ +s*t~> +U&Y,jp](9lr;QcqrVmu6n*&?&LMppQT#&ImbK%]=^rFI;b/qcJbKJ/VccjW4ap?).`PojbPccX5QM+ +U&Y/lp](9ms830$s8MrnqYBsdrr3,RhUUN^rVuoss82cos8R';s7ZKir;?BgrVQWoq>C9fs7u]o +qZ$Hmqu?B`jH*7a+sS?Z+!XT-,Te=Rq>^kh:C]IgZ/>6 +r;6?j#la\tr;Z`qs8Mup!<2lqs8JnqJ,~> +Sc8cjrVZZn!<2or!<2lqs83?%o]r^Kns8MusrVcP@*Z5t +p&+XcrVucms8)Vj+;u1:*?Z7C*?cRK)'fq2*?_ihrr2p(o`+p`,9@OCpAXsh.K9AHs82ios7lQm +r;Zfms7Xb_'c\E`p&G!jqt&0F,9S$T=h4J0qu?Wbrq69qrr<#tr;?Qnru(e2`iGT)URnLLrr)`o +s82cnr;Q]orr<#rq>UNqs8J_lJ,~> +UAkApqtg3gq>UHnrqc`lrVQU'rU/=RCMII/X1ZEk`;RXVaNDa+c"P>G`mW)UbJqTEajA>R`Pf@( +^sUEHb.u'Ah:^Q)FZKsD'GV;e#W3)0'c:6.e]?%Z`l6!I3>`J>[a32WKbJV9?>n.G_&7j>E +UC[qK?eX)UcH"&D`m;lZM@9t0()If!&e,?M%7D0L'cn'OaMl6?ah,gAcPIQ9'Ze/2aMu'5^V\(2 +bK%lMd`TbW_SjF6f[[>="V_f+f#ttRai^_W%h/jU4Hn.;a2u9uaSF!WaS!RQa;<"Cc-4DS`kf +U&Y/lpAYEtr;Q`qrV6^Kms5k^P*[^d_r;HKis8VumrqQEks7cQlrqcZp +qZ$TcK.A&b./s)@p\ojq*ZcRO-+ +Sc8]hrr)iqqu6`ss7uZo')VLi\tc$th=L@>s8Musrr)iqrr)iqs8N6#r;ZZnrr3)qp]('es!%@> +rr;ijfo&3;*Z-(B,U$s6r9KRg)&"=mrVu]ks8N&nHN"lbK_tcJ'`\+2rVZ]mq-4sW+'s^r.643(`j\?ZN'\!s7lW^rqQNmrWE,sr;HWp)ZK[)p +U&Y/k!rMrpqYpQorVHZorql]p')(P4MJ-I-RBscUc,R]>`Pop@rltJes2o6)bKA)J_oKjIbfeDN +_7dS%c-=DL`PL!:GVfd;$l0Hk'3CXUb'k0I&K09JahYp;^W=f5)&`urai)-:c-4SY_SjF<57S,<% +$B1W&JPbPf@nWq`PfmFajS6@%2BHj$l0Hi&J5Zd%1a-n&J75Wbg"2GaiMEH_A=%'&B_l0ahks6_ +nNn*_T'jF`RN)P_SjF3d+?HM&ePZkj3,Nbemf*o$5*dTQ.a@+c+h +UAk;or;QZp"T/#lr;QWo!WDomrri5PgYD&js8W&trrE#ss8;kFqZ$Hfrr)]kq"adbrr2]krr)ls +qYpMs9.2,6+sA0U>.F/'p&>!U,q'f^Zhj_%r;ZTmqmmso,>@t5rr<#tqu?]mrVu@7+t"EUc6a_\ +:&aqfs8DurqZ$NoDB(#GB?SlSP,"VguRMKrVlruqYpBl!<2ut +rVlZns8JnqJ,~> +TE"rjq#C?m&,lD)rVlcdpVrc#Yg<@Bp\t3mr;ZcsrVlisrqud"rql`qrVuln%K6>,qu?]qs8Vrp +s/eik,QAi++X1!rnG`+[roP7D(*TpYs8W&tqZ$B")]0Sdq>UBn5Q:Q[s82cpm3)]hTK +p\t3ls8Mlpqu1:F+;eS.da!lFR[9;)SnDCL*uu_op\t-jrr;`?*?H/2o_ne;r;6?is8MrrqY9se +p](-js8;cos8!QW)&7\pqPGM[(*FhAT)JK^rVuHf!<;opqZ$Tprr3#urVl[*r;ZZfm(f +T)\fgr;ZfqrVllrrVmAifT]`SF-aeS\]E":`l.ksrl]3%aMu6=^W=C2b/_HAaNi;gf?qIP^V\:E +aN2DK-Ogb($j[1E2NZ&/_8t!D'He))O3#D]`6,g9d%(md&M;8K`lH?Ja32ZCaj\H@$kisX]G)"j +/ChqhcGdiB`6Zlf;[=3M9WGS.F+esfG^)W/;+qE6&JKE=e]l7T`l"hf)]2SrajA\ibfRlGccXDX +bf\2U`QQ6>a2lHRf[Km7%h!7(e;FnL"qV=JJ(Mlcb/hWDo#LjOaSj9]aSNpUa8sH)rlQD*`l6!2 +ZDMkL<*<[E[,'d;rVuorrVZWms8DutqtTmYqtpBqrVHBhVuM8~> +UAt5ls8N9%qt^$arql]sqZ$Hkrs8,Ni7S)0rVuosrW)orrrW,us8Drss#U&Os8Vlnq=M(3BVbA% +qtpEgs8W#sqN<-L*$$A-WTa0TrVQWmr;'PD+XD=-q>UBnqZ$HT.ioo_kPkL$rr;rsq>^Hopuj+I +,pjT_*@.6Vr;6Nls8Dros10L"*A$XXqZ$TepAFgbr;62%-QjHYlMghYs8;o"*??MJp&FmcqYgHo +rqcZpnPcUbq>^Kor;Q`pqu->m+"S]_ZW/7n,9n^]l21ARs8Viks81gT"8qrirqucrr;HX"p#Y8t +lJUt,rrW/srr2rtrqufrrqQKnrhf^G~> +U&Y,kq#C?m&H2A%pA+R[k.RLdXn_Ses8W)s"T85us8;Zl/c>YKqu?Qe[V]WNp&G!is7u]pr;ZVU ++W_I<,Z^o.q"t$es8Dlj;]ckuFnbb3rs8N%qVie;*$XMDs)J&'m^nmip_(aJ2?s7lWms/[%Q+)LQKq>0pbs8W)prr;FaXS)Ag +s8Muss8Dflpo>>\*Z_C[*Z5q<-?82Dqtg?mq#16ioDSaipAXmf(&n..qYU3es8)cgcEa:;T:`^R +p&=shrrW,pr;Q]mrri?"r;HVis*t~> +RK!9crqlZo?iL*'qXipdL0Rtt]YDJ0aMc'<`lcNKaNM]F`l5j6_S*P&bJqiMa,WeeM:U>&`Q#[; +dE9YPAHWAL%1bFR_TL!D`Po[7dR>,k&6-]c_8aU3aNhaB&J>Sgc,n&Nb\tJ@_9pNUcbp1q',M0$% +LdO-aMl08`l,s@esHjV&/`R;cdgXgc-t+heCW;I%LNOSbLk=abeqSW"V;Y[bg4JXc-Y%jbfJ)Za +=Dtgb0\JW`5^$Eb0J.`!Z2[bQoYch&e>XV_pHNA`PfF,bf01p!li=(rQP;arlFuVrQ,#]'$/)/_ +mmCcMf<')>\/f,h=1.5rqZZjp\k*qqY'RRpA4[ds8)fpVuM8~> +T`55qr;6us8)`p$LZs5gA1dKrr;loqu6]rrVZXFs8Dors7l +QN$sarr3Z2qX4:Xo":cnX5*aTrVu`lrr<#srW2usq#=.eq#BlR-mKl],$"@7s8W)rpAb'eg*RgV +,HgY6rVlcps8Dusqj/3>)_CX]rVlirs8;[a*#T[)r;Q]mrr;onrql`nm^=DV(`jJ)-KY1)rso&. +rr;rj-lsEPOn\hRoD\b\rr;lqq"*en*Z65Np\Y!gs8A3/)Ant4o`"miqu$Eks8)W=,pFCqp\k-j +rVuorrquRo(E=A:+!;IB=2sk-s8DusrVuoos7uZjs8W)srVHNirrE&srVca/q#']oTq@sJT#UR) +s8Moqs8;fhrrE&tr;chms*t~> +S,WZjqY9dZqu$J>q#0U+LL""nR`3:bb/D<=a2lHKc-4AR`l5j3_SX++`l,pLbBXF'&/c-FeBlCZ +`6-0Lb0%%"%h9GCdEg+bcd'nTa3)na%LraPaOA2N`l,pAei"-S%\(hf`Q-'>]uA:AeBZ$u$k!gm +'a>5[_oKa6_Sa=;cd,Vu#S%VubJ_K:dE^(^cHF_`d*)Os%2`d2da,eJa(u>#(6Qtbb0/)Vd*Kn[ +b0mEu!s!&Uc-=;LcHjVR`lU4D()Rf#(_RENXjG><_8UEkqYp?pqY'XXqk3t>~> +TDo#jq"X[]rrN,sr;R)PjPBS1rVQ3drVQWprr<#urVukGs8Mroq"F^\Ppdmq+^0gqu? +P5c'lp\FXDU9(34p@nUbs8;fnrs&H"r;Q`prql_&qt^9cPU7Oh*#]J,.:W;Vs8N&os8;or8/iZb +JGo +UAk;nqYU6k"oJ)gpA4ads*=V=l+gtA;L#FXaMlBAaj%iEaND`NcHaPN_nj:/_o9L2e'`CM%L3X_ +&.oaKeBZ(Qd)jSUdF^2b)@1-5b0/&Rcc3uOeA=6a%L<-da3VrJa2Zce6W@j&dc4rb/V< +TDo#jp\Fgds8W)rrr_TEin+20"8_clqu-Nprr)fqrrN)trr"_OqYC']Qn'C"+s\0O-7'BPbP(l3 +s8Vrps72'r*?c^%s8;ols8Vo&E@E4W*@>Ons8W)urr2gD\g&CE:%\Jbs8Mumrr<#qrVQWcCa1&E ++i=$Squ?Wpqu?Wps7H-9l2LKQrVZ]ns8;iqrV6Edl>(-D/T(Faqu-?G,:+?S,:"N^-SJ)/N1\GC +RjfF)Pl1O\s8MomrVucppJ)\Q+X`fSs7cQjpAb*kqYpNko`*qMrr3H,q=jRVq>^Ens8Murr;Q^" +hqd_]i9gOD"S; +U&P,lr;Qcrrr)cp&H;Uh];2F*p\Opir;ZWks7uWls82rts8Dor+TD<9rUcC(*u,e<(E+A;&L,Ho +r;?TpqYpNaLE[QU+nbj7)YsF5p9ABX*uPkU'es8N#r! +UAk;lo_/7`"8_`frVlg5rVQ +TDnulqu$Bls8Mus%dVBkk4&ENq"FU_qZ$Torr6g6s8W)sr;Q]orVZQgpR@D,9Xr$q"F^$E[i4Y+X80[D#"&0qtpEks8N&[.3]c]mJd%`qu?Zpr:g6krr;ll +;'dbjr;ZWnrr2rqrr;ipqu?Wn;#gOpqZ$Hgs8;oorVuZmrqlHip%n^er;Zfn_HAN:.O$,c+s%pT +,U+Ng+^Hnrr`)f +q>C6l#5?p6nDE*jrr3)trr2ioqZ6WoT)X<~> +U&P,lr;Zcp!<2ut#lX]!e#]@L_=[[*=o/0spAb0lrr;urr;?Qns8W)rqY-C'*>BJ4*#9P/)AO;6 +D#+#/qu-QnrVt[u'cnC4qtg$b]P]#6*Z?"<,\ZlLr;-U6jrr2rqrr;ipqu?Tls8N&ps82Wlr;ZZms7cQkq=OXWq>^Hns8Vl.;^`Y4*ZuXG()e8: +*?ZgL(`":)q>^BkrVm`6s7b4h*#BRJqYU6kqu?WorVuosqZ$Toqu66fp\t3m!ri/sqYpWls7uWn% +fQG*n]RVqUn"F/pAb0joDedgVuM8~> +UAk>mo_/7_rrW/rrVlh?qt014Xa+DiH*5!(aN_oLdETPM`l?*EcHXSUaN2KHc-XnhJ.iM)(`4,+ +*uH.9'*q.Ob0@uIaiDNQ^^pnk%]Rq!_TeBD&eGlo'Fk[Idalmka32QIaNqU2'bV8*cc42H`P]j@ +`QlKBaj/R!%hpeMd`Bf7b$2m,ai)EDccjVZaN_ZHa2Q?Db/MKMak,(ldFZOab/1p6bL*.T*YAtd +"UktV(DdJb$lTcp%M"iMe&oVL`P]U1aiV:0)ANk&dDsGVajJ5QaiV`I`66HJb0'\(p;R0Q`lS/% +rlkDb"3AL%`W!jsaNDZLbg+;Wa32K?aMZ$6Z@l4O=BK^IjRi<@q>($nrVH +SGrckqtpBmrr)j'nC#kCq#CBns8W)r!<2rs55PU?kqu$HiqXg=(,pFBN,9%pR@j<-A)(6cT +qtg?mrVlcppJ;nS,C9(%L+">o*[)UL,)=M:s82`nrr3E*r;ZOc+X8>>rr;rsq>LX!rqYa0kkk50 +rr;p3r;6$;\tjsh/g_Jj,U4K[+as8DlqqZ$Nos82cps8;NgrVZ]p +s8NZ0r;6 +T`5/orVlcorVomss8;`L_5=HPiVr`Hs8;lqs8W)srVu`os7uZmrVlisqtfoR+X%jD(`jG9+($'/ +*YftFc2.;:s8N&trq/r'*$9Ct`.B6W*u>h4*$'[Uo)JR`rVlisrrr)lr +rr2lkrqud)rr)lns8Dutr;Q`rr:p6ks8N#rs8W)ur;ciprt550s7tEZTU_UL]BoFos7uZlrr2ur +qZ$TpVZ2/~> +T`5,kp\=[art58,n`.';ASHI]]tqJ1cd0hVrl,/`ai)HJa3+D'>KY:cSH%H(1u0mAIAqZ%hoQd$"g0[e]c:_cH48O`6?IX&/Gn@ccO5LaN2NHaMu3< +aj&2M[`6kDccs_Ybl5cbaSa$ZaND[(bQ,faa=#-ScdC(`bfn5L_nj=8dba2uH=`6$'>aSX-[ +a8j6YaSO'ZaT'6k`Pf[:c,-&j;GL8+Nm?_SqYgEorVZZtqtTs`V#Pr~> +UAk8np\b$mq=XI[rs.]AfAci1r:p3is8;ip:\t+fs8N&uqZ$3cnX_3J,p+!K+WE#&p@k%!*$ZCH +BDql-rVuoqrr'#D+rVmQ+!;UQ*?c^R+JIcjr;HQnrV63ds8MroKI.ocL&1iKqtU0irr`&ns8CXM +(]XI3rr<#oo_/7Wq:`i[NbD-5.S@JUr;$ +U&Q&.s8Doqs8W#ms8Mum_5a<@li6\Ps8VrmrVl`p:\t+fs8N&uqZ$9fnXV$C+W;%8*#C)np%=[l +(EOA7B)DW*rr<#srqri=*YftA*?#b=()e56)P#XXqYU0irV63ds8W#oJKPsOJbf?Fqu-NmrrE&t +rri)ms8;ijrql`orW)orrr)lprW<-!rqud5r;- +U&P8ps8)Nfrr6g6rU]7-QZZeST>%hKbfn2Rc-48J_o9X6cGn/Nb0S)Sa4&:a'F,Hj&K)>l(Ojuk +Kb4n6%M27\bf.N>`PKXBN=?U7*!urY$l06c(`!U;^spi]c-aYO`Q6`s2Y2[rP\fWb5TUPc-4>O`l5s;aND`NaMuBF`l#^6c-Xtmf[e?e`R*,i +^SuTo7PGJn32G6Rc-!r=^VRn1cJ2G9&eT34`P97*_oBd?rQPSkb/hZHb/h[&`Xp2,a32ZGcH*o? +`5]d:b/VO"b5B?Yb5]Q_`r +UAkQ!r;6?err<#trr2p"hV$02p](-i56(QZrVHQiq>:&q +T)TQ&r;HWps8McLWhc?(o`+phs8VrorVlfos!msFrVQWmqu-Gu;]Zl!(`FJ6-(OT$rVQ@5*>ob0 +-JJLsrr<#rs81gu*r[)h,pFTQ*@):7*?c_.T]#P9rr3E+r;ZfoZ6^V8;>C+irquirr;R*$qu-Qp +rVZWns7lTls7uZjs8W)us8N#trri?$rr)fort581qu6?fqYpBcqssIRqu?Zpr;R*&qskaB,Tjer +rqcZlrr<#srqud,r;ZZorVQHks8Mios8Dutqu6Tp#6+T!qu$Bkr;Zfrrr3T-rr;uinu&LZSZ&+O +qY^0grgWq<~> +R/]nUh6Cj,@Xtc!a2lTM_oB^;b0%`A^VS(6aiD9?`Q?ETP<'-a(_RMs%1n!3`ll]X$ka9k&/DOp +_SjC4^rFL/#SS$l&/H#u$4Rg['`Jmr5_Ztq]?&.Bb/hTEbDZi<"u+3Ac,\)RaMl'7`Q#p>A13CXMA +UAkAqq"FL\qu6cdf&,Qerri8ss8N#rs8W'rr;Q]qrVlcqqt0il9dpc!-5n$R,F/3'q#C3foTgXA ++s%r.q>^Kks8Dooqd(Kg,9J+H]Ct34/gqkb*@2dT^KjrWiK&qYU9i +r;YIL$N0l&s8MrnqZ$Qnrr3<'qZ$TjrVu`os7lQt_(-iQ-hmZ*rX]&.s8)`pqZ$Ths8W&rs7lHi +"8qujrql]trqu]nrVllqrr3#op\t0slf76oleVL9rri2rr;Q\is*t~> +Sc9B&r;?Nkpr&o)ZetNWs8)Qir;?TnrqudnrVlfrr:g5r9ICDl+r)+B+d;g#qZ$QooopI7*#K`q +q>^Kls8N#qqHY3]*?#u3[dr7#.3]ZI(*4>;;N]2ps8DrsqtfbQGe*2=q>^KnrVlcq#QFc&qu$Km +r;-H`rq?BlrW`?#rr;upr;HX+rVZ]pr;Q`rrVQWpp\b'grr2utr;R'%r4XI!(F&SQrr2fprVlfr +rVl`p&H;_+rr;fos7ZKmrVccls8W#rrr3#urVcWorqufrrY>J3rVuonr;Z]o]r%NpU7g'3qtg3c +SH"*~> +SH&WgHMdErRV#iai;0<`5Ta?5nOkQ'G=QCf>(f0((q)c'FbR/A!k*XaiMTCb/5Q/R)[FjaihrRaMl'7`lQEG +_SX:0`llB@rPn]Ts2t;]s2kGb`l5jp_#_Hmrl-P2bg";O`lQ?IbJqB2]Y2D/bg=eba25sCaj/AP +_8=45_8!h(`luo('bq)bb5TTlaMu3:_o9X:b0%g)`WO<)aN4>"(<=M@aNW&ReBYqQcc=)K^rFC8 +aNDZLr6"uZs2P&W*5fb7bJ_9:`4s=:_7Xeh<)R"7WnQb0rVccnqu-Kn!rMimVuM8~> +UAk;mo(;eY"4l/co)AXorVuorqYC$erVuoqs8GglrVuons8,M;,9e6O+rVqupAOm]q>:$cnPUMI +-64J9qu?]ls8Drsq4o&R+!KeGq>UEkm^d$[,UXo]+XSdSbl@_=s8Vrqr;QHjs8;]frr +T)TQ)r;?Edjee`Sb4,H0p\t3mrr<#trql^orqu`ps8)co:*h#()]9\6.@9c-r:g-hrVc7_*>9P4 +,cghBs7u]nrr;bh)]BS6j8/KJs8))k@jE*<*Z#_<.V?m(s7u]pq>^?ipAb0kqYgBlrr;uso)JOb +rr;uspAY?rrVc`ps8W)tq>^Km$i9i$rVlclq#C0erqud*rr)VE*#0K2qtp?jrr2fprr2osrVl`p% +K-5*r;Q``p&G'hrVcZls8;irs7QBkrr`9#rr)ir&,c>!qXUeSUnOZbkk=fJrLNt=~> +TDq=Vq"jj^lH"3\C5&b(^W"UJc-+8N`504'_8XF6aN2KGa2#pC-4(+p'b_;j'mS*Vd`08E`6?If +'G)B%'njQKa2Q9Erl?sK#Sn9neD\m&e&oRq8eD[S*#K:t#sFd*b/;NNajJG`b1=hU_9L6G`P][9 +b0%rK`Poj:a8 +UAk;mp\=[d"8C@%h>R?[qu?Wls8Vohqu6Tp"9/5trr2phqYp3_Kd%BQ+LWprVulq +rr;oLrr +TDoK$q>C0YeYB%BhXgdHq>^9drr2utqZ$Tprr3N+s7Z5A*u,M0)]aP#pAb!gs#0TJQS0F'*YTM> +iW&lSr;ZZos7ke1'c\C%p\+I`r;HHfl\cW%*uogSo)JX^s8Mior;-?koD\dhrr2rtrWi8ts8W)u +s8Dcnq>UBnrVl]orr**$rr)fprr)lsrr +TDrm*n+#bsZ>aMkS@-2I^=(0Fc-XYTaMl!1_8XL>bg";N_8X46@gibY(_m[$d`U"[d*C+Yb]+C3 +*#fG&%^jO!`lulUcHX;G)%RT(T[q3"_SF4:eBDq>(*"$)XNAo3_9:!AbK.]Ge&BVQaiquMrl#2b +b/_WH`l,j:`;.FPaSsaN)HHcG\2W +d)l:.(rjP6`lcNMa"%E"'84cRcd0hV`P]U4`lS/%!m&C$rQ+rW&')l +U&P/krVc`uo%Mjbrr3H*s8W)us8;TerV?9drr2rtrWE2ps8)`p/)hfu,p4EJm/$\WrV#pUPq+-r +*?-"C.'`gPqu$Kor;ZNko2@.X,B3JYrVlg.r;6Bas2;eQp&G!jrVccprr)j!o`+jeq#1KtrVuop +s8UaN!rW#rrr<#t&-)Y+rr)imq"aserV?Elr;$ +U&Pi*r;QWkkJO3t`VKB/qu?]os8W&nr;Zcqrqus!q#C6js!cnL*?Q1B($tkurr;ceo9CdL&f29" +*[S)ks8;forqcWgs7B/9'd%>fr;R?*qYKja_8#j=s8;oqrVuiqrVm#ms82cprr2oss8E0$rVuop +rr;lpr;Z`prVuWkrr)lsrr2os!rW#rrr<#s+92?1-grVHNnrVulss8MuqrqcN,MbNI7 +s8N#qs8W)trVuius8N#prseo+s82ZfJf>bAao;/6q>^Hno)AplrVuorq>C6l&,c>%oA6XFSXugo +q=FL^rh0:A~> +T)Wa#j1gLaB7de4`l6'?_oBg:_TC*Jbf\#HaNDcPbeM35aO&Y['H/29)$A78a2,s@bft2=%ga$g +'bq@BccX/Hdaumn_9pId*"N`ddEfVC_p-BKb/W,+T\%30cI'bSccaPS`lH6;f#u"Nb0%g)`WF6( +cMkun`Q-0Ab08#NaN4;!rQ,#Y!l`1#rQ>,\50D*odET\Nbfn/I_o9^?aMu-;c-ahX_o9L1_8*n4 +`Q,g5beqHA`l?6Ic-42NR;=V%cHOMTaMl-9`Q$'ErlkSgaMu6"auXPM@OeB>l2 +`W*sWaSNpUaSa0saN;`RbK%]JaiDB=_6obD;+jl(Oko6trr<#sU]5i~> +Y5eM#qu?]qqYpu_f\Glos7uQlqZ$Tprr61#r:]p]r;Q`rrqu]oqu?Whqtkpe*??(EJ+rp=p\^L* +.iTER+!N!V`VB<+s8W&srVlimqkkS\*[g^^qZ$Ejs8Dutqtg9jrVlcqrr)lms8;ims8W&ss82Wk +$NKu%s8;lrqu?ZqoDSafoD\Rcs8N&u'E7t0s8N&ts8;ops8;lor;ZZlr;HWnr;Z^!qtU-fqu>p[ +&-)M)s7u"--6sc^B@$POrV- +U&Pc(qtp*;Xe2Q5pAb$hs8)`pr;QZp!<)os./s2Drr2iqr;Zfnr;(j](Ddi2Ie`sBq>?[)-l3XA +)BBtF`;09,s8W)r./j2Ar2(MU)C>(Vr;ZZns8Dutqtg6irr;lpr;?Tjs8;los8W#qs8;]l$NKr" +s8)]oqYgElrr2Tjp\t-is8N&ss8E-#rqucps8W$$rqufps8Dcn!rW#qqYpNp#lXVnqY9jcrr2iq +s8Muqqu6Km&,Q8)q!'(K*ulG5bPLr1rql`qrq??lrr)j6rqucqs8Moks8Vurq>^3(USjZWVs!dO +rr)lsrqHEorr;u(s*t~> +Z2ak&o)BR)p>`8r;H8%K`lZQS`5T[2`Q?9EbK8#QrQ>/a;96qt`5]^AgMI`E)%mTld)j8Lep\#F +$kOBp)&3UXdDj#EbKeS`c-OG[M@UC3%a<,0_S=(6aiMNCaNVlH`QHKJ`llEK`koO4bfn>W_og.# +a:HG;d)jJVa2c<=b08#NaN4%o!m&O,rlkDbs3)_4cdC([`lcHD`P][:b/q]Ca3W2Wai2<:`Pop< +aMu6B_Sa=ka:HG;c-4>Pair)_e'#tXaN"4u!li=*rQP>br5efU(sBqBeBGf1":GVJ:9`EucHO;J +`Poj:aN44ts2b5_rlkDbs2c/&dF$1Z_T9g9aMQ'3G#VI<@ +YQ"V%rqm?,s8W&rrqcQjs8Dutp?CN"rr36#q>:*frr2rrrr)cdrYOrM+!MmK.dHd&ZVDSa,oe$N +,Uf&VqYg6h&,lD)p`gn-,dRIFs8Mlpr;-Ehs82forrE&rr;Zcbs82crqtg3equ5p]%0$2%qt^'b +qu$Hnrr2opr;-Qnrr2iqlM_:ks8N&qK-_Zc,9\B[AC(5Qp\t*g!ri,srqufqrVZ]prr2utr;R2h +j5oRhht-mJr;6Klr;Qourr2rqY5a"~> +WW*P/qu-Qns8Dror:7Y!S?_/Prr<#trr3#us8N#rs7lTmru(h7l6@)_)&FR_q"V-f)]9V/(`FJA +PkXtMq>Lp'qY]t,)BL!)s7u]pqZ$KjrWE3"rVZWmqu6NlqYpNnrqlrsr;?NmrVHNjrrN-!p&=sh +rqufp"TJAurr)iqrVccqq#:HqrVlfks8W'&rVZTlrVlfqs7H;1rr2_E+rq[D)'0i*b52#6 +rVccqrqZTmrqufkrr;p1r;6?,X.l5\WQt8O~> +ZMt")qYL'g!<2lq')_@VRVPi,N3Bn:dF$4X_o9X8rQ+u\rQ,#]rl?,"`Q$!Fb7G@-)A*\.d*S": +&fDc*'bCc]GLY'hbkfBkai`2d$P!jZLWmQV`l-0BrlG)]"3/F)bkoQ^a9Kf2bf\)Qc1fH^b5TK[ +`rF$R`rF*Vao0B\bl,W_`WO3"aN4>"s2k>]qo&QTqoJTUs2YPeaND`Oc-4>QaN4A#s2b,\rlG,^ +!m&C$rl#YjbKA,W=o\U9()@i+;RY?0bK%T>_oD\ss2P&W!li=(rQGSjaMu6@bg"DVb5KBkb082S +_15rm:02;,h=LIArrE&srseu+qtg'arVuorrVQKj\,Us~> +YQ"V%rqufr!<)lr!;ZTn"687rpAY'oqt^'ck5H.lIjlH_+shTB:+.,-*?6RV/!p88q>L'es8NN$ +HmKaYGl7U:s8VopqYpBls8E#rrVlcqqu63epAXser;H`srosFarqu]lqu6NkrW)lpqZ?]prquf] +rW3&qrr3>ADC6SR)BU1N->R`\rr<#eip>a`mf!.lrqcTns8Mljqu!SrJ,~> +WrEY0qu6Tps7u]mp[GM`T=s[grVuosrr;Ecrr3r:pNn)#(`FH=Z:uV_*>]A6+"!6Ms7lNjrVlfo +s8W'-rUY7V(*Ii!s7lWoq>^9ir;HZp!<<#srVcWmp\k'iqu6fus8N&tqu?Tn!WE#rr;cirrUKm\ +s8;llrr`9!r;H$^r;RB+s8N&5CEjc>&f2K/+CtBIrVccqrql`krr<#krr;p.q#BimS"ZLSb4#-* +rr2]ir;Q]ns8Dr's*t~> +ZMt")qYL*h!;ufq'Dqh)lIV#5?#Z@7]#E"Eccj;C`ph(Latq&V`Q6>4(_mo*'P!F`'G)9((a0V, +Fk,$bcHjbXb/VE<`Q$'Gf$n%9#RX5Eb/2EG_oh_p"j4p/aNDU$b5BH`b5KQ^ao]Z,aS3[VaMu<@ +rlFZQr5]5baMu<@aMu<@aN"1trPnfWq8r]YqSrQVs2slQs2tA_)TKb8_oT^=cI8.O#RqU^'c@l% +9@_8,`P]U5rlG,Z"i\Bu`lQ=%bl>fgaMu6@b5TTbb5KBsb082V`5\lp8PiE$Ra:3ms8Vuorr;us +r<)rnqu-Norr';*J,~> +W;ckoqYpZEe^cIQ!rVZZm +s7uZos8N#tquHWmr;HWirr`8uqt^6d!;l?br;QHj!WMuqq>U9jr;6Hsr;6Eirr2oss8E0!qt^'b +qu?Nlrr;6^&c_V*rVl`gcXeOT+=8*YK`1l(rr)j#o&&TskhlC>!ri)rrr3-!p\+C[r;QlsqtpB% +s*t~> +XT/;!%fcD*qtg6dpYMR?VpG)9rr2usrqlfrs7-'gs8DrsrtbV4koUcb)AsY<*YoS5*u>rgm/QqV +s8;lort#,-s7j)F-Wm>Cs8Dlpr;ZKi!WW/qs7uZmr;ci^s7cKnrVlfp!<2`mqu6Qor;QQm"o\As +rVc`os8N#srU'U^rt+r)r;HKab[;Y@)B]hBJc#EEs8Dros7-*`rsS]'o>d\tT:r%No_SRes82lr +qu?ZpZN#F~> +Yl=e'qYL-i(\mt'o^qY7[r65$NjHFfA$$k3OS(E!Yk +KZVff_op3Fbf\)Jrl#GgaNN&\R0+$_HGdnG`lQ0BprEZZaMu<@aN"+u!QrL_`W4!T`r=$Z`q@CU +b/h`Hb4*LMapZ;5aNDTHaNDTHaN4A#rQ+rWqT/]Vrl+oWs2b5_!R/^VaT'E_a8j6Z`=gD2c-4S_ +c)XGM((M#b%q +Z2Xh'qYpQnqu7&pg=t-Ws8;idq>:0gs6BRrs8.Ho*$6@I+!DdP+X2s4pAb!fs7lR(r;Z]lla>aO +s8;fpq#:U9hrql`ns8M]k#QFYuq>'g]q>1!cr;ZcnrVulnrrN,prqQNhs82ios8N#t!<2uq +rr2lrs8N&r!W2fks82cqr9!tiqZ$Qpr;ZWhcX\@J)(ObHrS.;^r;ZHis7GL=nEJs,s8W#orr30$ +qtTs`rr2p#rquTfrjVoX~> +XoJA!&c2P,q#'s_d\`h@nbrFdqZ$QmrUBgds8Dp2s8N#nIiT4>)]9S8*?Q=EMWj^4qY^Blrr)j- +rVuckl*K:Fs8;fpq#:U*fqu6Tp!WN,urp9[brqZNgrqHHmrr2irrr2rorql`prVc`ps8Mut +s6K[^rt,&,rr;lqq"Dm=+s.OHj8AlSs8Drps7?6`rt>;1q#C07VjX!BVU#)=r;?Nkrql`prj)QS~> +YQ+Xt!<)oss8*T-n*fArXDMH]Z,"9&a3i;\bf[rE`Q%Jis2H8*bf\#HaNi7M&J5]l&J>cj'FtUl +aj&DVaN;HE`lcNJaN"4u&&cW6cGGRTf$D@UcbdcJ`qd^M`r*mY`l7knrPe]S!6F`R!6FuVq8hpF +rQ+lU"3&:!`r*gU`rF-[ao]f0b4`Poj>b/h[%`W4*X +b5TK]b5]Q\`rYY@s8W"qs*t~> +Z2Xh'r;Zfrqu6che)0`qrrhoer;?Qnr;HZ\rYPJ0kq",%-QjHP+:3i!<2fo!ri,prVQZpr;QcprqZNis8;ip!rr9!mem%_o`#*or;6Bh +rqucsrqlEe!rMonl2Ch`s8VlnrVuon"k-m7K`1l'rr@@ki;U?rrW2trr2p"r;6Bh +rr3*"qtpB%s*t~> +YQ+V#"oeQ%rqcWnrVS`*+s8;osrr)ir!ri,qo)AXgrVlis(]4'j-QX'G(`=53+F`\KrVZ]n +r;ZZkrVc`mrser,q=t!`s8W#rs8W&rqYp0fs8N&s!<2`ms8E#srqlcqq#C3imf37brVc]ms82io +!WE#qs8W'"rVZWcrrN-!mJd+b#6+Q#s7lTmrr<#m#16a0K)GTHrr;rr!<;clrr;usnGa$tp"lX@ +R\$G*qY:$gr;?NjrrE&'s*t~> +YlFb%!rMikrr3c/p@.A'Rq#lQZFnB%dFQXgb/hTDb0':r-H=$Eb08)P`l?-Ja:o=#*#05)&J&Ho +b0.fG_SF=/_8OL?b/hTBrl+oX%+32>e]>tV`lQ9Ha2e"s!64fQr5JcV_u@LP_uI^U`r*mXb5'9[ +b5B?O`r4!Wb4NpXb5TK^`rVg_84"0aj%o?Tk.;# +Z2Xh'qu6Zqr;QlOiS+80rrVWbq>UBrqt^'brr;9_')hk*JfZ$Z*?lMSl1t)Qrr;lqrql`qq>Lp) +q"Xmequ$Kirr)cps8)ckrqQEkrqucrrr2iqqu?Torql]ur;$0cqu6NnrqZTkr:'dr;HNWrX\l's8W)ss82ims8;c3lhUMY!<:pT"8`&ip\k*qp#Y>r +ip6UD!;l]o"8r&nrr2rtquH`*s*t~> +YQ"h*r;?Qos8N#r%I^s9Vp=o6s7u]ms8;lps8VusrU^$fs8Drsrser,p3mhr)\a8/I-:>$rr3#t +s8Mrrs8;lps8Vm's8;cls7uZmr;Zfns7uZfs8MuurVlWmrr)oqrVHToqZ$NnrVc-`rVlcorVZZl +!rW#rrVuos"9&/qrUKpTrr<#urXer(s8W)ss82ims82Z0lM1AWs8Doss7lT[rtYJ3r;Q`oo^0Dg +T:`$oq"Odfrr)cnqu6ZqZi>O~> +Z2ae$s8)`p(]*acbD^XVMQX_2_:6fZbfIcB`lQBJb4E[n`l5p>bfn5L`lHTU@gEY`'c[p,cI9kS +_ns./rk\]Xa8X6]aT'6k`Q>m1bJqNBdDO&G`lcHBbPB3a`l5s:`l5s:q8NHS_u7RS`r4!Wb5]]_ +b5KE[`qdaPaSj-WaSj6^bf]q/s3:Pes2t>^s2OfPrl4uZ"3Sj3b3d:M`rF*t`5^0Mb/qiIcGn>X +cBc,ab/VE>ai_iOaN"5#r5o5b`l?!8_o;>hs2G#U&&$'%b1+SIYBNuB +WW*1rrr<#Ig"-0&"9%rnqu-O!qtKdYrr<#`rY#8%s6VB_*%)^TbOPH/r;Zfrr;Q]srquTk&,lP. +qu?]qq#C^Ko!;uins8;oro`+mh"TA5rqu-Nk!W;ior;Q]k +rrN,sp&53rr;$-`q>:*frW)lpqs"(^s8)KhrVm-"s7lTnp\t3lrr<#Trr)lsp\t0skMG1Yj5'Y/ +rrW2triuKR~> +YlF_%s8UBlrVcfsrr2Zlrr)lprr)lrq>UNqrVc]ms82cnrVlZl +!<2fos8N&srqlcpo_nmkrqZTmrqufdrr)lqrWE2sp\t-k#lO_trr;`ls8Musrr2rtq#:'gqu6Wq +rVd0(rr<#oqu?]l`Mrj/!hn-:rr*#trr;urrrE&)s*t~> +Z2Xn(qtpBkrr3N-iQc(FE4*%2?RmJm.]o_A:\ +r;Zcp[f:j~> +VZ-_?g#N&2"9&/lrr)j#r:fs\r;Z$\(]==3pmWQO+s/"=rV6EhrV?Kgrr;uqs7uWorVlisqu?[$ +qu$KorVlinqYp^Kls8Vrqrqucprr:gRrVm9&oC`(^s4lbtjkTb.s8W)(s*t~> +ZN'q's8W)ts8NZ,l(t2\nbi@_s8W)tqYgL$[p&"I_pAk'hqu?Qo +qu-HkrVQWprr;rsrqQKrrr)fprVlfps760es8Dp-qZ$Qls8Vrqs8;osqZ$Qmr;Zcqs8Vooq>^Ko +rVccqs8W,u"o\H!rVQKjrsA]#or"RVStk*1rr)lr!<)fp!<0D+J,~> +Z2Xq)qtp?krt>;*kJV=IC9tk&bKeARaMc0=_u@XT`pq+m`l#^8b08)N`l$!Ac$Bm7)Aa&ZfuV7H +]tDV.bg+JUbk]?[`sp/2_nsO9`Q$*Ea2lNDq8iKV"j"j-b/ha(a8jBZbkoQ_a8s<"rPSWNrk86B +!5\9Es1n]MrPAKNrl+iU!6G/^rlFWPqT&ZZn]:aM'ue24aN2NH`m2ZEaMks6`PBR8`6?=$`X'W, +b08#J`lQ=$bQH#/`l@tr,f@UBbg4\accjJM`lQa3W)TaMPHl@9m#@DSY6$o_8@]!<)lr +"9&,orO;fW~> +YQ"t.s8;ZirVu]De+ik@"8qujqu$KoquQ]mkPbtis82I7,p=HR-d)A_s8UpSrr!N0rVcThrVQHj +qu-NlqYL-hqtp3gp]13jr;ZchrtkJ'na#>sio&_Nh;$fAh;7,Lio]Rtq"s[_&cV\'p\4I[rVc`q +rVZTns8;`erri?$s8Dc8rWN9!s8Vrprt#&-p?gi6qu$Els8Dims8Dlq%/fqss8)cqhqmVXhu3QS +!WN#qrri;urr;r*s*t~> +Z2YI9s8;opq>^0s`o'bu4lJg@=_n`jjXf81oU8"?STV8*T +VP^ArZb!rjbgkV6lgF<:q"XU[r:g3orr;rprr2p+r;HKfqY^ +Yl>F9q#13js7+mDCL`jF]ZA=Abf\#HrQ#2caMu3:_oD;h)TKb8`lcNLb/VE;ai_p;()Il$&?*jk +`Pfd?rm(Vib5B9ZaSs?\a8j6OaSs4mb0A2Rb0A&Nbfe2Tb/hZHbfn>UbK7oNbK%W@_ns7,_7mRo +\@/Q5R#d,XIX#mPD/!TnA7T7`B520uEHZb_MjC$;ZaR?T]tV1l]YD;!_o0O4`5]j +Z2Xk(s8N#srrViBg\q-Xq>^Koqt^'brquctrqu]YrX]&)rr;ql*?uUJ+)gcNr;5CNrr3W1s8D]j +rVHKms8;opq"t*krqZ6e'E.@Wg=b*)cHt(mg=tB@[i7lu=f$Mdi +dFd=Br:9jiqt0ISp&>0nrr2rqao2AAqt^6k$MFH!mY*889>16%rVluss82fnrt58.qu?Tos7b.. +l/C_'s8)cprr<#q!<0A*J,~> +Z2Xn)s8N#ts835LU8loUC!rr<#sq"agarqlcprr;Nf +rr;cmqZ$KmrVuiqs8W,urqurus8;`mrsJH!s6P=e)Fh72r;HWtqu?NlrVZ`qrVmE(s7FI(US+9g +o(VnYrVc`"s*t~> +Z2YX>s8N&uqs`O7@qD%@cHNuEb/hZD`lQ=%bQZ/1`l5p:o>h'S`Poj^Hn%/p%tqY'XYqYL-is8Musa8QhPq>^Bjs8W#h@N6L5-miEqq"Xg\s8;cprr)j) +qu?Hjs8V<>l0I?`rr39$qYU0frqu`o[f:j~> +Z2YI8s8DutqW4fR[GLf[qu?]qs8Mrr!WN#rqZHcqs8VZhrr;oqs8NQ,s8D=7)]'82+3jQZs8Dlr +rqcZ^rWN3!rr<#tr\O?Ks8DimrVucos8W)srr2T]naYo"ah".6P)YH_Q^aJ8T:r!QT:M[KT:hgK +TV%gISY,bMr1=n#T:_^FSXuICR?N\kOd_rF][>d+o(DhTqYU0i!r_uorr2rt#6+Z&rqu]mjo55Y +p&=jgs8N&srr*T-s8Dlqs8)=p)&sVA,@L0>qZ$Bgs8W)tr=Ac)qu-Qa_53]nT;^oMrr)cps8KG+ +J,~> +Z2Xh%rr3Z/k.,G=F/$[taihlH_o9U7aND[%bQ,fUaSs0naND`Nb/V?8`m;jE',_Q!$Eh_%d/M?" +c-"#?^Ve%1`lQ6Db5BHbb08$(a>1fWaN;QFaNDNHcHF>Nb/qWDaiVQA`Q,g0^V77ZQ\]Kj?<:32 +?tB*2g_C2*W[-u!=)?];^V[n)`5^!GbK8#N +a3)TKbg4JTaiVQA_o:r_s2t;]!65#WouR*O*lZ.?b0A2Tb/M0?`5^'QeC@+r&/,oq8^bl)a1f[: +rQ5hq`l?!;`6H6=_l@lZ77^R$_s$glr;Qcq[/YX~> +ZMtR:r;?Has8V-6o`+sdqYKsdrr2os"8r&nr;?Qrr;6EWrX\o*r;ZcnR3*On+!>:ls81dS!<<#s +s8<)ss8;]jp&>j,p?()\g"bKMme$8Kp\"(ClKmm)m-X3>mKE"HmHs?@nGi%Xn,i"FmelMTlg4'= +n.G'RmI0W;naPu5kiL^Sf%fESq>Ug"rVZQgqY^9gqu6Kmb5N4Us7u]pqu?A1,97pO(Eb#'fDYLE +rVZWnquH`orsS]'q"asinE'$%iRe)/#Q+8jr;Q]orO2`V~> +Y5\n$rTg_^^?tmns8Vros8W)srrE#sqZHcqrr;Nfrr;rr&,ZD*s8MhZ)&aA2*GG3GqYpEnrqZT] +rW)usrr2lrs!@[Es8Mups8;Wbp@\%GcG$QBIDlO-?6C_<(+ZrV?Nlq#CBns8N0!qu#RTrVuNhr;Zfr +s8Drr'*%h.s8)]cD]]f9*>0>9;qM$Fq>V*,rVZTmr;Z]is7aO0TVA$QiqN?Mrr0A+J,~> +Y5]+&lbdaEFK3I'cHX>P_nj70`r='YaoT`2rm(Sen]:^L*6?:Hb/M?9aNW(Y$Q9ru$r#."cHjh] +bf7K5^;Kris2b/]r6,/`q8`QXrQ,#Z/]Q2]aN2KDa2Q3?_7m[u]""2eG%b8j?F?Yk1MYdV9_rkeoX +`lcKIaSs?fb/_THai;9bKe>_e6Wh%()[Mm&N@&EaNVZC +a2l?A`Poj +Z2Xk(rVlfuf\>9^rs/GtrVcKdqu6Tp"9/5rrr)iur;6EWrX]&,r;Z]npb*m2-5n2Zq#B=P!WW/u +rVuj#qXX1OrVcTm+8"LDg#1iKk3MI+o'c&:o(2MJp%%YBmdBQ6o^;/9nbr"]n*]W2mJcPRnH/4K +mf)SVn*KB*m/HJPnIP3_o^_SAmd')tj58M;fB2u1$3'bus8DWeq"amds2t +Yl>43s8LrRU9*k[s8W&ts8)`prr)fqs8Duq!<)?brr;us&HD_-s8;ff.N]?J(F.E&rr)iqr;Z'] +!WW/urVulprtPD.qXs7DlIWVAQBRPtQ'n5;USFL]Se%B`StD[LT:VUGTqn9OT:c(T"J26XSt>qR +s.TRgTV)4T"/DTaTDkJdStM^GSGf!#USOWUS!fV1P*;B?c/eEgqZ$Khr;Zfns8Dlos8W&rlMge_ +pAP'lq>U?ms8E#srr*`6q>U?es7Vg$*#]k>*uu==+3=KWs8W)ss8W)ur;lrrrr3?(s74U;TVnTV +h>%!L!<2ut!<0G,J,~> +Yl>43p>iSr?"L4Rb0A5XahdtqqSi`\b0A8]dEM1&!QrL_`>cn@bg")B`l?g7a2>a0]XPJ\V20,%?sm;J@q]RlC1h-h@U`hXA7fFd@qB1_ +Bk(X`Abp$=Ac?,\rl4iVs2t>^!li=&rlY5]s2I(<`lQ +Y5]!if&6&ts7uZoq"asgqu$Em$2j\tr;Q`rrqu]YrX\u-r;?Qlrg"`G*$ZeBs8V'W"98B!rVlfs +rqcX!qrQYae_]Qin0%;no'l&4lL"!-nF5o9n*TT6o();=mdfo +Z2ak&'DB>?WP/!&q#CBjqu?Zqs8Muqrqucsrr)3_rVuos%K6>*rVufnOrb;S+=1Xtrqufmrqufh +rWE3"rVcWn0E1hBqX2e;Um$h#Q^XA4SXuLHSt):AStD[ISXc.8^T:l1W!20=`s.CI*S=H1DTq7gHTV/$SU7e'JTV.a:OHuT[iV3C6nrr';* +J,~> +ZMtO8qX`O4CM%q%_8=LHaiV]D`r4!U`WaH+bg"ASo>hrpbf[oB_oBjCbK[l>`QHYR'bLla#t!1f +bfIlF`r;4p_8OF:ai;?AamdCMb5]Q]`r*pXb5]Q]`W4*Xb5]Q^`]D2`bfn5L^rOC;bh/^&*"s"u$qgs; +'b1[ueBc.T`Poa2`Q63S.<*X=BiUQ^Ar3QER~> +YQ"_&f[Tftrr`8qp\k!h!ri,nrqHWlr;Q`rkPc"cs8Muss7cO?+XA=^kPtA:rW`E%rVlisr;?R' +iR$'#gYqA`nac8?mf)VRn,MnTmL&IRo(2D?mdBQ5nG_hYn*oi:nc%qUmKN"Gmd]f9rpTmT$gmBO +naZ,;n+?5AnG_kXnF?#ImK;qGmI1#?#OUgBjP8AGq"t'prqZHfqY\M8)>a@4s81P&+<)@D-(Oh@ +-6XTU-?8bTqY^?krs/K!rV- +ZMt@4r:A@9UUElrW)oprqQNg +rYY\7rVlisr:fgPmanY3Q][Z(SY2^OTV.qVU&UecT`C_`SI2!^TqS*LS=H.AT)P8`StDXJT`1P_ +TDkD`TqJ(XTDtJjSXuLJTqJ$MUnaWVrh0CfUS@a\"/2B[U&L\rU8+KVQ]R?*_r1([o_eagr;HZ^ +rr)lmrquflrr2rqrW3&rrr3`/fI.XR)&jfhq6_Fe*Z?5@pA=jhs8Dros8W!*s8DrsnZSISR\\?t +rr2p!rql](s*t~> +ZMtU7mF\F]B99g?b0J,KaiVK>b08*-ap?56b/hT?_8F:aa=#-Sb/M35`QHHEcc*]@b/iaN;QD_SEgrUO6]a>[q;VBPD*kARt^Ms(M=B#\[pe +BkM!fA7baP$YQQAH--O?t!PUA7K(VB4PO]@prkV@q,FF"(>YIA,^!P +AS,Lc@9d)UNN9\.]uS@ +])Va.qu6c[db4/Vrr<#trquQfq>:3lrVcWj +s8VB +_>jN6q#C?m&H)79TVp'+q>UBnrVuosqu6Tm!<2WjnG`Cds8EN.qZ$Tks8V_Z->;N;rr2lr!<2rq +rr**$rr2rtrqcZlrXAi+rVZQhq=aCE^RUGcSGo2_TV).Rs.B:`!29Cbr1O+`rh0IhUSOc`rM9Ii +s/-.$WN*##X/`.trh^:*VP^2dVPU)`U7n8J@u+!>Frp\E#U*uu7@=m#V\ +rr3f6s8MusrqlZmq>0]rS>)RLc1V)7rr2inrrE&nrrE& +^Ae?7qtp?jr;RH-qX<+$D/>ibbl>fh`l#X,^W,ic*R)[F_o'I9bgOMN +`P9FaNDa+c2Z#fao]Z(`r!aT`r!jV`rF!W`>$/%[uG-1BPD-rD/3fs@preQ +@:<[FA-caYAnYjmC2%J^C'8nGQD%g`#BkV-kAnP[cAn>L_ +A7K+X?srqA)e*5`@:E\S?t +])Mp2qt^-grVluhf%'QprrW/sr;6KmrrE&squcurrVQTo#lO]$s8Muns8)!Z#l!*Gr:^0cs8Mlp +"oJ)iq>C6krri8us82NfrrW/srVHO'lIseCj6>gnlg4$-nF-;E*V&XfmdBE*ki1[_hqm>Mg"tQB +jm2F.pA=aes8DfgrrDurrtk\3q"XOTo'GT#iS`YQiT'(`kihL*o'lYH'_(JVnaQ&:n*ol:n*]`9 +mcN0Oi;3BO!W)]ms8W'$qY^Bkq>UBorquZorql]trqlTjo)9O*s7lNhs8W&tp]'er+X%mO+("m@ +s7cEW>Q,iL-R@.5rr3)ss8Mopr;?O$s8N#ts6JJ%kMu13s8Vusrr2otr;Q]urqlTj`;b>~> +_Z'cUiur;6!&V5Vo:rVlcorr)lsrW)orrr2rtrW)lqrs8T&rr;urqZ$Hhs8N#rs8Drr +s8W'(rV"q;rV6Eis8N!#rVZTjrVZ[Arr)fqqu6Wpq>^KmrVlcnrr<#qqYBU/YaCK9S=lOITV%gK +TV).R.%d*'TV%pOU7e9XUo(/nWjfRR`6-KXf\PKHk2bRenbDkOp%\=PlK/$-(?=?/g!Is`_7R(Y +XfSM!Unsl^T:V[Jrgt:,UnFEVU7n6QTqS3QStD[JS!0,:bNefqqZ$Hhs8W)qrri/tq>C6hs8N#s +r;cirs8W)ts7cL8rVuZjqu?]ps7cQaAKMs3*?&)Up]'s`l;nuG*$??Knc&OjrVuoqrr3r:rVc`p +s8;fpnAM#mT;0C%qYg +_>jN5"T.obq"t$i$i0MbfU-GkQFF]Ma8X:&aMu-6_oBd?b08)Pb0.cC_T9[7_oU!Fb/_HC_YV:O +aSj*\aNDZHrl,;db0A)5bL+AV`m+M(rlPAfb0%fHr5o2d`Pp*@_#DFnb0.iF`Q#m4^qmORIV<%q +A8,akB4kghARt^J!+Z";s().A+Co2&C27g0Ee&h!Ng6*+U8OuoYcb+7]>21p]thFpZ`jA46a!Jg +URRR4N.cY)G&qV?DJa6*BP1skB4PObAn#7[@UEGJ?XdPT@:a+a@U*8[PH_X2^;n(,aN;HAaMl3D +ai2WIb5TK^`r*d]`lQ +]Di$5r;-?frVm5ef\-'"s82ior;Q]q!ri,qq>Lp%rVuokr;Z]prqcHhrr<#_rWiJms8VopqYU9k +r;R?*q>:'err2rrs82]nrqlBeq>V!"gX+U7n+,o9nF,i9o()8KnGhqdnF,W+lKREiiS`e\me6/M +#6+Z&rr)iprr2uqmf*RblfI'_jlbdgrTG$bmHa-*n+-,5m.'Z:nb)PIm,?O?f(Jt@s8E<(rr;W` +s8N&nrr30$r;?HirqucurqlTjo):$8qu$KmrVZTmrqD[&-PmpP,2W(nqZ$TjpP'q6)_!)=oDA=_ +rV?Kirr2rtq>^HuqV^H"g?nn>!r_rmr;R!!s8W)rr;OY7J,~> +_Z'`;r;?NkrtPJ4qu6QioY7<'ebo:>s8W)trVc`ns82d,qu6Wqp\k-is8DcgrVlisrqcZbrW`Dl +s8W#srVc`pr;lipr;Zfr"TA5tqu6Tp1ALeIs8;corUf[-W0<@/R@Kh?T:VXITqS'MT:hdIT:hdL +Unjc]VQ-r5`6R-&o_8%PrqI-&qu$s8VleJfY[@+s3rVqt^9lq>C73rr)iqr;QThs7am=TVe9n +q"=R_rr;usqu6Woqu?Zpa8^Y~> +^]+K9qY'XXqu-O&q!6Y"DeYKL]Y;P2rlcD*`l5j5`Q$!Abfn5N`Pp$E]u8+8e'6"UbKA)PaSNpH +a9U&(ccsMUaN=;$1<@JTaN2NHbfn/O`Q-0C`kTO;bf.N@`4NRHDd6RWBPD'lB4bahBk_0lB4Y[e +B4kaerFmHlDKgSdPFo(i^V7M"_8O=4`l,d6`l5m9b/h]Ga2uKF`5hku*ll:>_T0X6_8*du]Y(PD +P(\4)EH#c2C2.EpASGadra7!]Am8\T@p`PO@qT=Z>?YZtWjK[b_7mh,aNVK;bf\#CccF,IrPeiV +rPeiYrlXcP)Tg%>cc*lA`lucVFpo)o&deZQe'lC_a2H29rX^1j':R=j]u.Y'cc3rC`lu]MaMl3A +a3(oH +_>aN7rr30!q>C9mq>LLp)pA=aerVulis7q5$qXjgPrWiK&s8W#s +rqZEf!;ucp%K?8%q#CBns7uNkrqZ?gru^phdG*[GmdKZ8o^qbJo^VD9lg=0/lg!fugY1WJmJ#fD +"TJB"rr)Qjs82orrq6:7qsih*h;@5Qk3;7#n*o`/nEfE*nb)SDnaGl2k2+\[ +_>jN6r;RK1oDJC[p8P!jm/$2Ns7ZKlrr)fpr;ZZn&-)D%r;Z`qrU^$_Itd^is69Lfs8Dutr;Zfr +q>Up'rVZTlrr<#ss8W&tr;Q^`rV$$_m`MGlQ'n28StDXGR[KY9S=5h6SY)UJStDdRX0T=Te)^&i +p%S1Squ$ +^],#Hqu?]prVuQho^CLXC2L,cZ,Y#%rQGPiaMu3<`l?*@rlPhobeD!4bfS;Zbh1g:16b3I%Q +bfA#N`luTFq8iTUs2b/](!"_Ha3)<=bfIT3]u7IHF'`9cB4kiUB-LntAnYdeA7]FhCMR[#DJXBA +K8c5"]"5Sj^;%V*`Q-$=`W!dg_o]s=`lH*>aN2KGaN)EFb/qd)aT'@Lb/;*6`5T[5_ns4%]=GMa +\=f%>H$""DCM7?oBPD-k@:s(W?XdSV?XmVXBP([Y>AB>*]"l;+b0%uSaMQ*<`Q6-CrQ##ZaSj-H +a=GNP`lYm0`Q-0KNsZI.,npBWdF?F`^;J.>d?GLa%291be]Q1[b0J)J`Q%o"&&u?&bKJ&L[[CJr +:1A4sm/I%bqZ?Qhq>1-krPnkf~> +_Z'l?qtpBjq=smbrrUHmi;NZZr;$3`r;QZp!WN#mrX\l*s8Musq"t*c==Yc.qu#^X$N:#'r;Q`r +qYU*arV-Bir;R!!qt]m`qu$Hn!<2rs%HYj_k3;F/oC))4lhL5RoEt*Um-Eiohr3hlpuh\WrX&W( +rqucos8Mror;QcrrVm3&r;?Eeq>:$`r:U((rUoI>jlPXhlK[U!mHs?1nac5?n,DVVl0%-]bh;dk +!rM]drr3-#r;6EirVlipn,=%$r;Z]js8W&th'a +])Mj2qYU9g&?2J4o(Dn[r;Q`qrr)cmrVlcqqu.-'s8W)ss7c?ho2I+`[JB^arWN)sr;6HdrrE#s +quH]prr`)sqtpBm%0$/&qrPJXPFnA:TUu.R,+G0lR$sS:StMmTUS4Ng]ZK*so(`"Sq>0scrVZWo +rr2flrqlcprr*]2qu-NorVZZps8Mrorr;rpr;6?gqu6Ek!W;opru(e3q"jmdpZ^8M[]l^+USOZ[ +TV8-STV8'Rrh0=arh0^lS<]58f^nn8rVQKirr`5trVlcqrr2iqnbs7&r;Zcns8W&tg*RaV*>B]p +oDeacrr3Q*s8)E0,9%XL'3"_urr;oqrr;rr'`\(/s8DiprRe3ATV%qSqtg +\c3ECqtBC3H"1]s\\Q(t`6$*Ec-4DSaSj-YaSsQm)TFLa2Gm9 +b0.j$aT'9[aSj7A_ofs;bK.`@]thIcL1FV+BP;-n@piYMBk:jfBPD6uE,]]4EI3P-XL5j_`59L5 +`5g!@aN;WH`Phbp!65#Y(<+52`l?'=aN;QF`l?*AaN)?@`lH-@rlI:C`l?!9^VRb(`504$\[fAd +\u_B\I% +a4.R-$4n*k)25uYbf@lIaM?0Je?9Mr',LX.fZ_dkb/jS%rl>nqaM,O4aN)E>P@$p\?ZFumqZ$Tp +p\Odbs8VrrrPeee~> +_Z'i>r;69aqu6Km"6SOro`"jprVlQ`s8;lps7cL's8;fis8DureKuOb+sZ4Lkl(ngrVuorrqu]k +qu6C"q"t*krqlNequ$KmqtpC3qq9EPj6,gumd9B2o^hSFp@RqEkiCaViU-L4rrN#nrqHKmp&>$k +qYpWrrVlKis8N&rrr2uto)B[+p$Cbtkj7^(lfm[!kj@j+lg=95lgO3#gXY?_rr`&ip\Omb!W;rp +s8W)rr:0b6rVuoqs8VunnPL;I,9S7[s7l?gs8Duls8W)uqqYX%+Y+`ah>ILm&qu?]ps8W)u +n`/`lkNVsF#Q4Jus8)Zjrk\Vb~> +]Di]HrVZN_oC0ir;Zfr!<)op!r`,tqu?6d./j2Grr<#rqX7,s)'0_=HN3d7s8W&tp](9m +s7t>P)&jkA,2)ejr;QWos8Ei7r;HWms8Vogb,V2/Wk7s$q>^Kmrr;iorrW2url"he~> +\Gm'7jjeTaCm;cQ^Ve15`mOb/s2t,X'#r,5`l?EQf\*nK$jH_4][G'Kqo\KN#0+R%_SsX9rPnHM +1=!kVai;39]"!c7?=[\]BP1g`?XdVY@qK@gCM[g)E,U/eUTh5B`5g!@`l,g;bKA)SrQG>ba2Rtr +!QW:\ao9H[aTBQ(aSEsWb5fZ^aT'9q`Q#p<`Po[/^;%Iu]tUhNR>uiAD/&u_)eNPe@9d5N@:*GR +B4Pgl@9m/^S[lJO_8F:9b4s0_b/hTBrl"lWo#UjQ-H3a8_SaO<1'nF-(E7)?_SaUAa3;B?c-"Pb +]LN8;(Cgtkf[S-fr5ScX(WXD0_o0^E_RYA);,q=edd$K)s8N#rqYpKsrVH +_>aZ;qtU!dqu6`LiRIf*"o@rjrq63ds7lTnq@*E%r;ZB!.O?5_,]!,;rr +]`/cHrVcQfpo13eoD87\s8W)us8;oqr;?QmqYpNp&Gu>(qtpE_[3Qe4*[#.grVc']#QOf'r;Zfp +r;Q]rrqufrrql^Fr;ZcjoD7gfO-5s'U8"9LT:r'UTq7jKTq\3PV7+P"m.'iIr;Q`rq>:0jrr`2q +rVlEg"T//trr)iq!rr5trr3-#rVZWmrVcfqrql]m"TA?"s8N#rs8N&u"TJAurr;us-2dZ6m,6F, +ZDaUtWMcSjUnOKWUS"'LTpqUKTU(q6bkD&8qu?Eirs8W%qtp +\c3<>nD&7s<2mFC`llEAbg=APb09e+qoJfW&]2K6bKnqfRMHSH$3`rFdEg&6b4D%7>$PTPC2.BkA7fFb?sR&IC2@TuDh+(H[CO&g`Pom=a2uWPdEg"WbKTt1 +s3:_kb/h[%`rsB%aiDF#`sTr/a2uKGaN)<@a8O'\a32[)aoBKbbfS!+`\GNQaN)9<`5T[5_o0F/ +^:(&6K6M0HCi!j!C1^sa@q8tP@q8tWCM6sV?&lG4`Pp-@rQ5,arltJe!m8U(rl"lWo#O;BaMc!; +_p6b8$4n'a$V/ss`m)EBb0A;Ta3VHDdaqb4&ePrra3N,UaMu6=`Q63@aN)68`QcTM['3t7;I"+T +k4noTs7cKl!r_ul`;b>~> +_#OH6qYpWQfBiJ9#Pe,pq"FU\rql`jrX\u-qYp?dOXMCo+Y&*mr;6Hks82ror;H0c#4ps4hWL]urV6-ds8W)uq>UC$ +e`5lPhuE`Pq>:*hrrE&7s*t~> +^&JTArVZQinuAA%q#: +_Z'`:qYL0hrt>5#fQCJM[CsK&`5paihs.ao'ceb/qp-bl>jDa2Z0A +aN)?@`l,^1`5T[2^:(#,JoPL=An>RbA78t[AS>^c?!^lG?rgK\X1QQr`l5s=b09k0s3(YhaMu3< +`q%2~> +\c309db<[[s82ins82Kbqtp6ip\k^'nGi@bAKi?A-R?2#p&>!UrWN9!s8MujrrN,sq>V5fcJ@m[ +o'u/:nau;^Hl"oJ/mq"XgeqZ-Wos8W'%r;HQgq>UrVQWpr:`c,+L]u +q#('gs8W)urr)j(eE?2\iV``Uq>C0grrW2tr5Sbe~> +^AecDr;6EhgoREZqYU!dqu?]orVllsr;HHjrr3Gss7uV&*Zl=E+1(k9rTX=]rs&H%s8;oprVHF? +rVlirrVZWmr:]'OOd)?,S=c=BT:_[DT;/*SUo(6+d-:9%qtpEnr;Q]rrqucrrr)lsrrPFKqkq>C3irr2rsrVl]qrVlfro):!7s8N&srUlWu,8D"=gACjKrVlir +rq0MBQh^OWs8Vug6Q-aX.,=h$rVuosrr3]3s8W#srr;okpS4OYSu10 +_Z(JOqY9pas8Vra^jBX-]>D;'a3VuLb0%fIrl4uZrlY,Zs2GVl]$njS5lh/q&IY&_c-ahZrQ#&_ +bf]Lts2G8\aMu0@a2n5%rQ#l!aN2B?_nWprV06'OBl.Qq?t!VYAS#OlCAquoEe0LW\A#Yi_oBO4 +a2Z0@b0.rKaN;TIa2l6A`l?'>`l?'@anj'saiMKBaiVTGaN2KFa2c?EaiMQDa2l?Eb08$,blc27 +c-6.02U'=caiMTGaN;HA`Q-!:_o':(^UgP=PC%:aBkhV?!h<<^q[Y#_oBd? +r6,8caMu6iaT'?maNDWPe;"Y['bLtgccab[rl@%DcTMPWbfdoDb0AHm(`3eu[EQ_5`l5j7b08&T +bJhQ@_oL!Jb/(Mf9hSH'[-[bks8Munqtp?0s*t~> +_>aN7qu7!"h9b-\s82forquZorql]srqu]irX]&'s8I-l+Whn&i;NWSs8:pVs8N-!rVQTrr;ZEf +rsAM[gth;gnF#c5rp'gWm-Elnki1[rs8N#rrrN,sr;6Hjqu6Qlq>LHqrr;cmnbiC`r;$Bfs7l]m +r;?Qor;ZWor:g4+o^(f)lgX<-mIKoAoCMVDmdBE#gtDW*$N'Pss8MrrrV-?lnc&Rg-2miAs7X&M ++X/"JoDSUcs8W&tr.6.9.;o"^qu?Y>,9A-U-ggd+rX/])qt^-es8W)trVlg'mG[=!gAh3Pq>1'i +"TA5mp&<#3J,~> +^]+lEr:p0dhQ3?ao)J[fqu-NnrVuiq"TA?!s8Vuqrr3K&s8@!f*?-%kh"ppIs8;iqmJd+brr2rr +)#X:1rqu]nqtpEhs8Vidd&NS"SthmFSY5nQ%%s;cXKAtcp%J(Ws8W#r!<;opmJlSQj8]&Vr;Qfr +r;HR"r;60IbdjdJT)PE(U84QWT:_dJT;&!IQC#_Yp@nUerr;uoqZ$Tls8VWgs8OGErr)lg[N-5+ +)fP?Jrqucqrr;kF*Z?;=p](-jrcK;!*??BjqYpEmrr2iq%fZG*rqufrk..(PUSH`Err3-!rVZQk +_uG5~> +_Z'Z8qu6F)q>0WsEDq+db08)Pc-4DSaMu6u`W*sQaT'6jahcBN9aC_!"YRRCeC)X`rPnlYs2slQ +rl4uZrlQV3aNMcKb0%cDb.l*;]"+2KAR/naAn#7Z@:NeZB5)3tG^4h7^;%A\_uI^S`qd^S`WO3" +`Q%bn!6FrXl,WnJaSF!WbkfK\a8s<%rl4uZs2HS._nj(!VicLPD/*cp?t!SV@UWbW@Us(_?Wpa! +Z+7Ea`l$'Eb/r#T`QQEoa>(l[a2lBTd\7Bj)A66$d*0e\a2H0G?3glM:Xme4a37<`%iQ#e_T'[: +`l5j7b07lFrlc/#`l?'Cbg+5'D,!Z/D7]$/s8VunqYA#.J,~> +_Z']:r;6Els4%>As8W&mrVuiqq>UQrr;6Berr;p+s8M[:,Ud@%p\t*es8V3[#Q4Jsqtg?kq"k"* +r;ZfCdc0`fn*BE5nF,T)lg!KfhXL@@oDSdgqu-?iqu-Hjrr2imrql`krpK[equ$?hqu-?jqu-Hj +rr)j"rquZkrqud;rpAe3l0.L'nF?,=oC(r1o^_2(ea`\>q>^?ks8;]lrrDuer[7aFrr;fks7'8> +)^$AUoDegirr;`]/1Dka.UCg.qYH!s+s8"Go)JRcrr3-!q>'perr3#upAY'tiU#ahfDkmMr;?Qs +p%.tVa8^Y~> +_#FrDrquQfnu\V(mf3=br;Z`hrr)lorr +qYL!OcaKaKU7RpIStD^KV5'WRV4j6?Pf*+eq#C9js8)Qis7-(8s8N&uq>1-Y<$)kq+Fj"_rVlis +q!KRV*Y]l%f_tXAL*[fX)f,!?rri?"rVlfqs8W)trsA>js6["bRA-MSrr30$qtU*grP\_d~> +_#GDNqtg'Wep:A9VT$d%d*g1_b/hTB`Poa4`Poj:q8iTU&&lT7ccc@j#"6qde'5tUao00\`lQCMs3)k5cHF/JaiMHAa3;',X(GXHBP:m_@qB4aAS#UmCMn3RY.hZh`PfsfaSX!S`<"!"pr_[= +qT8f^pr`KT!QN4[bUgoXaMu38^V@LgR=K6jA78qXA7]CaB4Y@T@piDD>_fYn\&,r"bK%TNccsW& +a=#0P`lZ-@g!E,%&.o@[c.(.d`l>d-#S7[Y(db^ZaiRlq$k +_Z']:pA+[e#hRbos8Vuqs8DWjs8E)tqtp3gs8W,t#63X5J,B0C-hr;HWos8)`hs7?6hr;Q]f +s8W'!r;6Hg!W2fgs8W'!s8Moq'_Ct`lKRX$mI'3%oC_YCoC(huf]2u2!WDrqrr`#ko)&"W-ia,B +s8Dips5>4J+s/"3kP5)WqZ$9^>U1X;,:1,)qt0Ao-6q(9p\Omgrs&K#qtp%h~> +_>b&Fs8Mrnl(t2poDejirVHNmr;uusrVZZms82fors8T$s5,8Qq>9mbrrN)rqu?*`!r`,tqYpWp +s8Drs#P.W>R#@H/Sc55tTV8$LSt;^RVR"\EpAb0grr2flr;6EirVccqoDegh!<;Tgrr)Eequ?]q +r;?`srVlcorqZR!rr)cmqtp*ZQ8'k4\fSqu?B] +^Af,Ko[.VaH`=p#_T'pPc-"2M`l?!:_o'I4`l@hqs2Geob/qlW\HZ3`c,S5UcG[T=_o9U7`pUqJ +b5BHoc-+AMa2>s<`4*RWAm&kerb!!WAS,I_BPMC&DL%_b^<+L9bK\2Qbfot,rQ+uX!6G)\qoJ`U +!6G&[kK*M>qT&ZZn]1^QrQYAd.E]`R`59F/]tCq2HZEt;B4tpi?N]5fh=!a1og7bs<'a'GM"Lg!\'f:C.*)a2.Yms2tA]!6Y;b(!=V= +bKeDW_nEE_<)-A(a6NBss8W)8s*t~> +_Z']:qt^6k$/jXos8W#gs8W)ls8W)sr;$9%Kr;ZferVulsl2L__$i^)$q"OOTn,<:d +r;HX-c-l7Wq=+"GnF>r1kNh9hl2CS\s8E2uq#('erqZQsrqu]kqu6Eir;HWjs82fis760gr;Zce +rrE&tr;ZWpr;QTns8Mus#lal'rVuloq#:9m'Cb2Fj5fRrnEfQ3o'l)@nEf8ag\h'SrVHEfr:9h7 +r;Z`os8W)ms6UBnrr2rq%Jp&!rVulos8Up: +kNDC5rri8urr;r:s*t~> +_#OH6%f5b,W3,^ls7uZoqYgBlr;HWoqu?Nl!WW,trs8Drh#I9Os7-*`s6oserVulprrDins!.=9 +q"3F1NhVu5Pan88TV%dIVPKulcKk<&q#(0lrVlfmr;6Hjrquirq>^iPQ*9QQr;6NjqYpNcrWE)u +rr2os+ntru=;N&$)C*r7s8;lrp@NPR(Dn2;T_eZ]p +^AeZ7h2Z)TYJS,f_8jaGbl5]_`r3mU`q[Ud`l,pAd)sYAf#u7a]>_h0a8X'W`p_"Kb5BHbb/_9r +a(b>g +oDSUe!;je9J,~> +_#Fc9s8VK@dJs7FrVl`p!<2ips8Mupp\k[$s82imqtpEgqZ$Tps82'[s8N0"qt^6dqYq3'hW4"j +l0Is9nb)SEmHs2qoD8@a!rDior;QcprVQKir;Q3cqYp'm`rVQU.qWd"tkj7g1q"=+@mIKuCmcN9cr;Qiss8VZh-i +_>b2JoDSI$WN,gorr)lsrqucps8N#rr;cios8W&us82d&s8N&qs7uNfs7lHhrrDums7-*gr;cin +ruV14qu?92OGB$hR$sV?Q^aP:T;89Zb2)O^q>1$hqu-NsrVQWop](0j!<)clqu$TorVbaTqu?Ei +s8W,u!<)ops8Dusq>^Em"TSGur;HWprr!Z1nD(m`Vl-AcUSafYS>)mZUn='@Z0M/arrMuonbr[g +s8W#rrr45:s7(=T)]'S?[IjM!nGiFaTbnge,8k^uqYp0ds7ZEjrr<#trr2rtrY>D2rr<#qrr2fp +s7H +_#Fr9qW=&ZBt(sr]tqb1aihd"`r=$_b/hZDaN4A'&BMl1a2QHJbf\2I`6$*?b/=%pn]:OK.*p#T +]"l7nP[[m/Bk(^fCLUmkCMn-3E0R3/_SO+.a25pAc-OVWcHQ1.prEHXqTSWTqoJZSn]:IEqoJfW +o>psSqofSqaN)9>`Q63AaMu$&SqM%]B,"lgC1h!^@;'CiAmnthY.MNfbeqEia=G +_>b#Es8Uisj8]/Xq#CBjqZ$Nnr;QcrrVZBg"TSB!qY:'is8E3%r;-Hhs69Lbs8MrnrqQTmpAP"& +lc.fXqZ$B^o]u#=o'>AplM:Gfrql`oq"amgs8MrlrVQTlrr2:*i'(G)DlgjQ7o_\%BoC2JOo&\?Zqu?6d#64]&rVlfo +rr4#8pRL?ks7ZHE*$u[P.Tl3;s7lNls8)]sr:p*erVm-#qYL6lrV?Birrgj1k2be+ +rrW#mrP\_d~> +_Z(2HoDAI%T!nIkr;6NorVccorr;us!r`,trVuiq!<;rq"TSE"qtU0j#QFc'rVHQis8;lqs7-'h +rVl]o-h[K4qY%glSXGP3U7nEPT:qsNSt`O8k4&?Ls8Dlor;Z`jq>:0jr:pC9mqVe*;S>3L] +qu?]qrquira8^Y~> +_Z(&Cn+5n=@rf,o`59R;rl>)Wr5S`Wq8rf\`lQ7#aq2Y:_ofj5cI:"Y`m)H?c,7^%aSs3LaSO%- +aM#R,_7k_2B5D'qD/!fqB5;=!CN4orZb+6#ai;<=_p6<>_oU$EammIJb5'-Wb599W`pq.E`r!jW +`q.:O`rF-ZaskQZc-4GTaMu3@b/hT>]s=VoGA:o1An>[o?XRGQASYmd?@B;k]ZA%2o>jeOcH=8I +_8!\(c-=YdJe/M)#ngUqd*]eRakFN>)\No%4j;-p^rF^Gb/hTBb/hTDc-=>K_84+1aihrTa2?!@ +ah4'A:/PMTdHg]0s8DfjrQ"qg~> +^]+B#c/\a%"oS5mr;ZZnr;Q[%s8Mrnqu$Bks8Voo%f?;"rVuTcrr)lnq#C0ik5GAYrqc]pr;R;P +f^S(in)rs*md99%g=u5rrrW&mrVlg"r;HZqrr2lrrr)lrrq-6hrpp!XrqZQsrqu]nrqufrrr;ls +qu$6g!;u`nrr<#trqu`k!;uirs8;oo!<)iq')UbGk3_U,naH#>naZAAo\%UarVuHf-ia&Arr<#o +rqZBgs7F8X*[MpT?17glr;ZTdGTS(S*[ae]qZ$Tks8)]tr;$0drr2p(rqHHmp](9ms8)`p#hA,! +k4J]RrqaP4J,~> +_Z(2Gp[Q%o_tE]us8N&urVuoqrVuos"TA?!s8W)ts8;uts82d*qu?Eis7c9err;iis7u]lrr2rd +rr)jL'RUo'WU_rgptqu?Zn`rCP~> +_Z(5Em+[tKMRU.1a2lQQbK@l@`W!jWaSs?YbT4jI`lQbfdoCaiVQA`l.\ms2b,\qT/ENq8iBO +e]@a4$HU3(`Poj:aNDWHrlG,^"3em/aSs3u`koO"R$[8s^Ve(_a@j\' +aN;NEa1fI,_p6r`W"9@S'bj'XcGI9;a3n<)'Gh2h0$;#MaN)TMaMu6BaMl-Bbf[rE_o9U2c,[T? +bJhN<`Or0P<_d(jcM%8;!r2Kfa8^Y~> +c2[hCpAY3`ddI#4"oA&nr;6Klr;HU"r;6Eirr2rtq>Lp)q#CBhs8W)qs82irrqZThrr2imrr)lr +rWE)qqu$Bl&(/kep?VG9kj.Quk2tRPoDJV"rr;lns8W&qr;ZcrrqcTnqsj^`rquZqqu$?ar:Bp` +s8Dros8W)sr!36$rr2imr;6Kks8Mlps8N#q!r`,urr*3%qtpr8rp^3c +n+c/&ch[M=!<2uqq#1Hms8MrrrVlg;qt^9bi(YC@+=8Voqu-Nh[j!.@+!`5`q#C?ks8)Tk&cDP' +r;Q]qrr2ros8W)ts8Moorrh0AkM,V-rrE&js8N#Is*t~> +ao;A?r;R3)r:n4(`UW[$rqu`np](3k!<;rq!<;op"TS;ts7uZo#Q4W!s8W)os82fqrrE&ts7lQn +rVlfps!RgDq=iL2PaeM6TqS9ZUn46VVl7r3qtL!frr;uss8W&pqu?Wps8Drss8E)urr)cor;HZp +irA->rVuiqqZ$Tprr)fpq>UTsr;HQmqu?]o)ZBU%dC63XTr+Z\Uo'o]Un+BSS"/%&q>:*grVufp +s8N?'s82iqqZ$KmruM(8s7P2>)]T\:-JJ@rs7irA*u>b8,LZAes8Dunqu6Nn!ri6!rr3]0rr;rq +s8W)us7Q&`Tq7aln,<:cqZ$Kmd/SU~> +dJs7FpAZ*1qX<=4Bns42_o0O:d*^1^`5fsAaMu6@aNDa+bm)D7aMu6@aSj6naND<>aM5d;`l#p; +bKS2Nd*2L3s2b5[oZ7$SrlG,Zs2G#S.\UN_AoM*l@q0(^@:X(eD3_ZL_SjR=bK7uQc,mrDa2Q*< +`5]m:`Poj9rPnlYr6#&\qo/o\`l5s:`l5s;q8iBOe]@a4!m&?url$V3aN2NIbfe/Na2Z*?> +'bIak_SsN[$5XBh&dk_[bJhEHaiaV(#Kk-*_og3GaSj*qa2,d;`Pfj;aj%r>Z!'q#?'s=;rVlZi +qu$KorQbFn~> +cMmtFr;?Km!;ufq!qXmor;RB,s8Vuor;HQis8W&sr;Zcqr7h2Nr;QTnr;Z`rqY^?sr;ZWmqu$Em +&)5q!lLFH8n+#Z*l/L@OkkP2IrW<-!s6KXcr;QW:rW<#sr;-Eks7?3kr;QWmrW3&sr;RAiiT][o +lL"02oBPl7jm:XJp\t0rq"j[_rr)ir"o\>rqtp +dJs7Gr;RN2qu6Wos8)Zda.f]nq>:0kr;Zfqr;Q^)r;Q`qs8Dutrr2lprr)llrr2rcrqZR"q>^Ej +q>^p\F[_rqufpp\k3nrqucsrr;Ec#64]&rr;utb5MJB +rr;]ks8Vck!rr9"rVe/Dq>UBerpe%2VP^,]U84N\T;JHVVN[:bo(i=]s8;osrVlcprqu`ps8Duq +!<)iq+8u$0AKVd1(alldrS&G;'c.u7\Fon#rr)lsrr<#tqu-O(qu?]ns8Doqs8N&ts8N#t&cM_& +aeGN'T>pX%s82iqs8MooquZcnrmCar~> +df0CIqtp9j!;ufq,PU`^QtL<0^;@q6aN`&Tb0%iIc-X\R_nj@4bg"JYb/M-1`V@OR`qd^Sb503Y +b5]Q^`[/IDaN)?Jaj.uM`l5j2^:8&m@:a(^@:*PN?ta:gH&]ST`Q$!?rlP8_b5'*Z`lS(t!Q`:K +a9KZ*`lQ0@`kTUm`ph&!b/h`Ba2bs6\W:iNCM73d@UL +cMmtFr;Q]q!r;lnrr3)le)L9'rt+u(s8W&qr;6?jrVu`js7u]JrW)lqqu6Knrqucrrr2Zmqu-O* +m`ODRo^V>9nF>]/l.t=lpA]^CqYhB4r;Zfls8W#sp>>$"m-aK9lKn02nEfSsh#@s*t~> +dJs4Frr;us+8>g5s8;T7V6ehJr;Q`ms8W&pqY^?krqufnqu?Nmrr2irrr)lVrqQL;rV?BoSXb5)'0]WlQm\d)BTuKnc/L^s8N#ts7lKks8Duos8Dfn +rqQNnqYpKo)#jL5m`2)mTqf9prqHHlrVZ]prVQHgrVl`p!<1UMJ,~> +df0CIqtp6i+8Gm8rU\pCBlB_b7`lH9HrlG2^`;[jXb5TUjO9',(IfcO_$/*ZPc"^WFI6ccjPR +bJM6FbK7uHcH4)Kb/DKKqT';lbKS/PaK^4k6qgmEh"14=r;?Qo!r_riqu?]pf)L7~> +a8Z/R9O!;uin!;qEIp\k?rr;ZfqrVZ[!jrr2iqrr)jBrqu]npTu1i)^ZdU)]g1H**i7:3lqu6Tsr;ZTgrW2ro +r;R2phrN\Tq#CBis82fpr;Qlur;6E@s*t~> +ciqYpNos8DiorVm,us8W#ss7QEirr)lVrr<#urr)j#q#C'fq#(*j(A.+9 +OHHB9S=-%CS"6IXU9E/=q"Xmgr;V?Ip\l66r;ZfqrVuoorpRk+W2H)YUn=KUT;/0UW/dnFq>LOO%rV?Hjrr3'!r;HQn!ri/tf)L7~> +`r@%WoB3&jBp-$E^r=O@c,n&JaiDE@^raU6c,RNErQ5,]rl"lWg;kGUc,J#I`m;rO`4WaI>[)#Z +? +df9=GqYpQprr3)le_9csrrrAuqY^3erVm3'r;Z]nrV$9hrRCfRr;Q`rqu?]is7?*drsn)AoCMD= +o^hD7mH<*\rqufrqZclkq"aa_r.4kBrr;rsrri;sr;QWnru(:jmd]c9p@IkElgO3#hTblrs8M`l +s8N&irVm#uqt^0hr;RZ4qYL-epY7,@)'9kA+<;UOp&"L_s8W)ss8Mp'pAb0g@^Q(.s7uBfs8)`p +rr`6"s7uZo"m"\%kiDC8rr`6!rqZQmrVY+DJ,~> +cMnLUrVlfrs8N&trRIgFe*[&0r;Q]trVQNirs&H$rq?BirVc`qs53hSrrN-!rr*u3s8Vopqu-Ef +kGjT9SX>nAUS"3VVP(ETq"OCWs8;]mJc>HDs8Dut-2m]=s8;llhncFnU7IjLU8+HUUS=%s7uBf +s7uX.s82iqpAFpX]WI`tVo\W2rqufrqtg?mrW2usf)L7~> +cN!nBrr4)>rUo?tcO@qTb"C4N.r^:V;(_oDYrrl0N1prNKU-HaNP`5KX/^qQY"FDY`%@:WeT?sR>T +@V'#?\\l>"dETeX`6lTDrPnlY0?;2Wb/hZGaiDTP^Cq7e&.T?g&.],ocGn#LaMu3BaN2B8bgFg, +PL%1k`PTsGbPK9k`l5a7bJVEAZZfhO<+qc\q#:9orVHNns82cp!rMimfDg@~> +df9@H!W;rnrri?$s4tlsrs&H%qt9d_rVlg(rVZWopAY*lr;ZZJrr2rtr;?Top&Y*frr3K"akZ=F +nG)\HnF5StlMLJY!;uik"o%ffq>:)@rqZQnrsAW"rr2lrr;HWorr3N!jQZO0lh'Z8mdB]4jOWMn +rseo&qtg?is8W)rqt^0hrVn2CqtU!]s7Q6c=sG49*Z?OLh>@6Orr;oms8VrqrVuT`>:Ll-r;HWq +q"apgrr`6"s8N#t"Q&8%l.Z.:"TAB"r;?Qk!W;rEs*t~> +cMmnDrr)ir(]OBfXI\2=qtg6js8N&urVccqr;HWpp\t0or;ZZnrW)uRrr2p"rquZkr;RQ-s7u&m +N16c7Tr"EPTV\EY\C:3GpAFR_Jc>NFs8N6"qYpKmrVmr:rr(rrVkU/]R\cgVUSFfaS^En +rqufrrVl]o"TJ>srVlfr+oVH8qY=27*Zl:9-lh(As8N#trVQWpqZ$Nop$u00*k)"FrrDihrXo2, +qZ$ToqtfupW1BTOjneiNp\t?prVlfIs*t~> +c2[hBrr4>Dp?8Z"@@t*H_o0mFaiqoJ`l?!8`5K^.`Q6HLdDsDNaMu@V&L?XRPZ@U+/`^rOC6ai`#T`r*gU`W4'YaSs=1ahQ$=eDNe0'c%Ah(BCqgc-4DQ_njI? +`m;cS`QUF]$]W6QbfnDOb500n`PK4)bL"MW`k-7m8Q0!4kkP/Squ-NrrVHKls8VrrrR_("~> +dJs7Gqu6lus8VoNg$Sb<"oA/mp%nX`rs/;us8)KdrVP=Jrr<#trVmW(r9O7Xs8W)OipGpno'Gi9 +nE8corVZ[(rVZQhpA+LZq>:'er.4kCrW<#ts8Ms#rr;rprr)cp&*`$3nabi2lLjT5rpK'trVlg! +rq?Bcrr2lo!<2rs.fB2>q>L-ds7Gl@-6F6S+1qOMp&FshrVZ]os7u]dhbbg>.O3^Ar;Zcoq>UBn +"TA2srV6Bl"Qe_2le_X@#QFc$q"agbrm:[q~> +ci4%Fs8Dp&rVulPWh[Q/q#(-lrr2p!rVQNlrs/;us8)KdrVP4Gs8O>Cr;6Egs8)clqXW+$Pbb%M +XIl)UTV&!eeElr*rVZQjs8Muls+11GrW<#ts8Mrurr;rrruD% +aSuM?kd5,2LVCM%aV<(GaihfH`l#d9b0%]NccF)HaiDR%aT'EBa=YEL_o9X:b08)LdD*c;_7Q:J +@r5jhB3SVI@q9>'T"2h\aN;NEbfe,Nb/hZDrl"lWJ]R]/!liF,rl6;*bK%]Ha2Q*:\@?s&@qoXY +?s-rE?#X=cr5J]Vs2b5_.EolO^rOpNf6.i=$P!0%dEKMVaN2?=a2cBDd)NOM +&IB3QVo$O"b/ha%a:uV-_8OLDd*'\Q\nFr;?#[RDp@S4Zs8Vs!rVuorqptdt~> +c2S:Orr<#ts8Ud6mJm4cs8;lj!r2cnqu6rr\K]r/r;Z`qf`(jL"TJ5lr:Bme%Go_"oBYW'kORs, +j5p.9rsAZ(s8D`is8W#prr2osJc>KE$2a`%s8MrorVuikrsn#=jRVd7mIg#9qX3q.jo,2_nc/L^ +r;QWo!<)oos848Ds7cQkrr<#AF>7d`q#1-jrqcZprr)ZmqZ#P*,9%pQ@.jR"qYC0err)lsq$R#t +s8N&uhrieTjSo/^rql +ci=%E!<<&t$ig.gVQ7E(q>:3lrr)j-rVuinrr;uk[NF?&qu?Wpqu6Wqir8uX"TJAtrVlfr,Q%N@ +q=gqSR\HILU7e +b5Wmgs6R@1@<8us`6-9GbKJ#Pa2c3bL";Rb0%rPb/hTBilD;C`Poj +c2[hArVlrOiog:?(Amn'r;-9grVuoss8V`O-7L:Ks7u]nf`(mM"oe>jp&4[brs[*/mIKZ2m- +dJs1ErVm6(oVSOpp%eUerqu]o&,cG*qu6Wei?9EhZ2aV!rVQTos5Eq[s8Mrorr)j7p\saOQ_'nG +T:hpRUnX`c_Vk+crVlisrVc`qs8)foqu)*Fq#1g(qtpEnrr<#sr;QZkrVuiqrtP+WXJVkcV4XKY +StD[MR?kter;ZWmrrE&tr;ciorseu+rVuirs8;Wkq"FO_rr3c3s8N&rrr;lqrRW84(E4Jsp&Fmg +rr;]k)Z9R5rr<#qs82cWUo'iUWq6/es8;onqtp +b5Wmdo$qGYBs,4ocH42QccaGP`5fm;bKe#;%M]A5f#Z(Ub0%rPb/hTBiQ2&=!Q`F]bTad>[^07M +B4t^_@q0+]C2J^%]#)D)aNMZGc-OYWb08#LaSj,0aSEmkbJhHBaiMTHaiV`LaihiF`kK0kQ2YP7 +?"7/J@pE>LAm\i'[_BeuaNDZHaMu="`[o0PaiMWHahu*>bg>.sd*9eXbL+PV`QQ?Dbf.lW\.B2^ +&J."Fbf7rNbKA!(a90H$`QA,'%EcT2_o&B[>>\48b38TrrrW)oqUGOq~> +d/OUSs8Dutq>UEAip$LCqu?Qk)#jR8qu?]ms7@`d*$Q_fq#C]CPrr<#o'(l%qrVuod +f]qtik3MI&mHWcgr;Quuq"Xaarr2QiJc>9?rqu]o"8r#iq>UC(oAAg#nF5o6nFQ#4kLA5ars\f$ +qu?]ps82Weq>:0js76."s8Duns8DrqbpOe_+ +dJj^Ur;Z`ps8W&mW2?lsq"jjerr*].s8D`modCjp)^1%2s8Dipq>UEis8V!U)ZTd9rVuosrT^\I +S#N0VV4sQSUT(Kip\Ojfr;ZfrrVc`nrV_rqu-Hm)ZK3LX/2VhV4a?OUnaf^QD3I> +qu?]mq>^9``TV.jWp%\Rd +p\t'dr;P.EJ,~> +dJj7FqY^@#pt9ap@^j"ecH=6+ar&4>_9:!AeB&%7'GCsjcdL"WcGdrN_oTjVaT'F&c-"8OccF&C +[!YtcCLCCTA7K:gEHf%/^r+13r5e`WJ]R&rrQ68(a2Ga.^TWc?=RMKB;`MYaiqiG +c,RfHrQ+uX+j/'R`P]U5bg4\]aMl0Acd0eRbeqZHc-iX'()[\o6.!sSb5'-WaqDe8`P][;`l>N# +91r0&f'EA9r;HWsrVQKAs*t~> +d/X.Crr3?'s7,"4s8W)qpAFphqu7E-s82Ol+=A$T*%Z:.qu?Nls7ZKmqr.MYrVZ9_qu6Ejrs[fC +rV,dHmHWhWFD%o'l/7lL3ia +q>UNps8;ln!W;rrs76."q>^9js8D`'-n-5Y-%l$no)8ahqtpBirrDimrs@NHmH4?Hs8)`lr;Qcr +eGk%~> +d/OXQrVulss8L6B[IV5U,]Uo(-6p%eOarqZQorr2lrr;Z_HrpKdbs8W)ur;ciqru:t;s7u,tXJ)AdVPBod +Vkg8`Qd>9orr<#rrqlQlrquirrVuos!WE#srt58/rV?Khs8W#j[Nct4'd%nunc&Ofqu.9/q>^Kd +j.`3?UX8o;rr;lnr;HWCs*t~> +dJjaUq#(0gqYfcQBPXNYaNV^(aSs?]a;2n7cH=?a" +dJj4Err30$s8VNEg&D!Rq>C'dq>V6.s8N&sgasQm+s\6Q=7,b]s8N&trVtmV#5n/nq#('crr3A[ +kk+67o'Pl9k2#S+rrE&trrN,srqccprr2iqs8N&r!W2eGrp]mfr;6Kg!r;`mrr<#srr3K$jlZ!u +m-j?*mHO*'imR]'!;QNl!<;Kd%fcP.r;Q?"+sJ*K,)H$inbrUfq>:0k"oeGtrVu]mrrhrTm-`R* +rrE&trrE&Hs*t~> +dJj4Err3<$rqP'HV"4?]rVlirrr)csr;$BlrX7U9(E453(`H?)]'5/K_>-1rr2rtrXo,.s8W#sr;Z]pbGq&( +U#,VDqu?]q!r`,tfDg@~> +dJjaTs8Dibn`I,r?F%>gb0J0/`r*mpa2H6HcI0'1&Ki&3&e$hAaN2QDa2lHKb2^P\b/r,UbK7K7 +]pCLCda?=.AXBT0LE`6/)'"3S^+`r*gU`r*pVb(7Y(a=#!H`l?*@b0%iNbJ_33`59-QH#@G/ +?=7#=?sdMS>?SMQ`P]U:c,BV(,fn!F`Q$-E`PKC.b0A2R`PKC0bg4_]ai)?BQjOK@%hNO)bfon* +qT&i_c-=8I`r=$k_oKgCaM`d;8lTE0jnJ`RrVcZo!;k@IJ,~> +dJs7GrVm5ieC+9ps8)KeqY^-g(&S%.q"a)X-6XET+>"o$p%eXeq#C6NrY,5/pA=mfs8V9;p@%A; +kN_d,kO/6Ir;Hm"rquZkr;?Qnr;ZWqq>:)@rpfsmr;$-^p\=Xar;RH,q#: +d/OORr;Q`qcE*_hrVZTmrr3'!rVc`n)#aL7qu?WkqWCm$)&=,.-R%OBq>^KirqbXRs8Ni4s8Vfm +n#hbISt2aLR\laT\(LBMq>L9jrqQKnrqZSFrpp'arrDrqr>Yb9s8;fpn]Ir2WMZVmX/;PiS>i"1 +q=4L^qZ$Nm!<2uts8Mus"9/8trr)j.rr)ihs7cGt-Q3aE,(T:]s7-*frtPJ2rVlisqZ$Bis7uK5 +Tq%pUlMCMXs8W#ur;P:IJ,~> +d/OaXq"41AVg)O/`Q?9Fc,mrD`l@tu(sL.AccjSX`C:^]'H7])#ee0oa2Z'Cb0&bc(Wt1Kb/q<9 +[WbtpAn#I^?Ya7iI\+6k`r4-dbf\#J`l5jo`W*sVaSj84aRR>!`l5s;aN2NHaNMfLaiDB:^W![D +E+s&tA78tR=(PQO@\^iPaMYsArQ5,]rl-#%aMl'7`QHHMb/M99`QHHP`QZ6FN=cX6*#<;9bgQ:/ +qT'Stc-4/E`lcNJ_9B^8bJCcD<`!(>`8gLequ-Kn!r`#pfDg@~> +df0CJr;QZp$fBRss8W&ms76!`rql^.rr)fqs7u]iphqB#,9RmN+2msRrrMuriVilXpAP"!f]r%t +l079kn)*+%q>UHorql`qpAFjc!;qEIoD\dfrql`ns8)osqtg6grt581s8M*7l0S$&o(2A?l0$.? +rVllqr;Zfr!;uBd&,lP.qi!!D,UOS*pAY*hq==Oar;Q^$rqlTmqZ$Ekrr3,fkMkIQrr3)uq>:0> +s*t~> +d/ORSqY's_Y+`T(qu?QnqYpNprqu`prr!s/!W)iTrYkh1s8Di\PF%c2 +U8Xl`VOXd=oD&(Vqtg0erVlisrp]r=rq$-`rrW2ur;Q^:rVuWis677nV4j`PW2ZYkUSj3Rp@nUa +q>L6hrVlfrs8MusrVlcqs8EQ,rr;hO-5@OC(nC3rs82W_rr2p"rr)fprr3K(s7lNhs7!FjTVn^Y +r;$ +d/PcunE02lFBa7/a3DWM_8aI5`l?*Bb/hWB`QQWMd*:-@%h]`q%hf#9bK\DZaOA;la;<"F_T0R2 +Z +df0CJqYgEn%I2O=s8N&ks8Vilr;Q]mrtbP3qXOUbrr)DA,p=QY,9\A(oDedeqr7VQrsSYOlh:2= +n*&ZfjRi3H"oS2lr;ZfprWE)tr;QQjJc>6>"8r&nr;HX#rr)]gp\=Xarr3T,qu?]kk32F4nac)= +m-=9&`;9N#rXAi(pU)Cq)C-T +d/X.E$iKS?Tu6Eks7u]pr;HWqrr2irrr2p3rUg-hrqu8:+;u7<)]Bifnc&Lbqr.MlrVZZac]sof +TpM^VUSb!+i:R'Lrr2flr;HToqYgTsrr;uos+11?rr)j"rr)fprr)j!rVQHer;RE%d]fXKX.lA^ +X/;SpUls^.q>^Hmq>UEoqu6Tps8EH,qXq->*toY9[.XIprr;Nfs8N)urr)lr&-)>&s82iprnj`M +S=7"arVccqrmh%!~> +d/OaWn`\W%?[B,odDjAP_T0X7`lS/%(s'h=aMbd>b08/QA.9.j)Aj"oHcj^YaMm,Z)9U%?[Zt*+ +@V&YTBOu"#N2aA+`Q#s=b08*/b(7Xba90T,a2\(u(sgFH`5/gFEbB'"?XR&I?sRVZ;kph>b0'_- +!6Y;^s2kGb`l?+!b5]Q^`Y-A8d*0dt$P*OW%\(np`Q-*EaSO'TaSs0oaNDZLbg!oC_SF:7a.Zs? +92g>klMLJY!<(LKJ,~> +df0ROr;$BmrQWpmrrr<"rUg-grqucp)?9^4s7lEis7H?krVrr;onrs\i&qtg0drVufor;6EkrseMQmdKi= +kjn?7kj$Ikrr3-!qt^-grr;Qg&,ZA).3'KU-b'$Rs82inqXORbs8W)srrW,qq#: +d/OUOrqtB>Y4;PkpAb0es8N#trr*i7rr)lrrVuohs8W&lZR-G-'Gq`/K_#$?qu>XS&,,IdS"QLO +S>`!SVlA,j@2rr<#poYdDuT;83PW2$)ZX..Z4 +q#13krrE&srVc`ms8Dp-qu-@:'cJ&8Zhj\$qu?Tko)8XhrVlco&H;_,s8N#trVkNJU8"@-qu4qA +J,~> +d/Pcpp>i5cEOoe4%r'82be_\7kmS%ut_`l?*=`;RgVa9'N.bl#W_aSWu.aRR@Nb5TK^`\#-KaN2KEair#Tc,[`:\Zp]l +ARK"T=^bK9>%h00^;J+;c-4DSaND`Obf\#Jqo0>kb08)Mc.NX9'G;"FeBlCXb/2!9qTAZU)90S5 +aNVfLaND`N_TBX5c,dhi<_Q.eT&BSHrrMukeGk%~> +i;`fUr;Zfr!;ufp#5SU?hr;Z]ps7uQ?-Qs`X+sA=7rVHQarr;oq +rq-3tbhqgXlL"''l/qR9rsSf&qY0map\"7TqY]^[Jc>6>!W;rnrs\l&q"aa_qu-HjrVlcprseVW +md9H3m.C#CmHiBdrr3)rq"t'gs8W&ur:g1$s7lCB,U"JAqu$Ems8;iqo)AXgs8;iq&,lG'rVuop +q"t*XlL+,snGE7cqZ6Worr<#t!W;rps8W)\s*t~> +h#@HTrVlWm&,Q>$c)@Msp@nC_rVulqr;HZorr)j1qu-Qls8Vojc6=/H(E")6;Z$=jnc&Rg!ri6" +p\ka%p?S':U8+?TVP']_^Z>(arr2urq>^Kos8<#srVZTlrr2iof_u$Rrr;uto)8Xhir8rWdJa4I +rr)ios8D`ms8Mus')hFFUogMjVkU#`V4soW^%M:%rr3#urVl]rrVlfms8Dp-s7l::*>os'q"t$i +s8Drsq#:6jr;I''rr)fnrVuosrr)ir$N'h:VOF*Lanu&9dJn^~> +huE`Tp&>^'qWOnoA#6uX_T9[8`PfR0`Q$("bS\LD_o9R1`6?-;a2cQ3%h]d#*#92HeB#c%aT'B_ +aSa'UaT'6s`PT)oBPD$a?=I5PD2,1-`6$6D`5]m<`r=!]`lQ6Db5TTcb09k-s2b)WhoGf?qoAo[ +aMu<@rlG&\q8`QUilM,=dE):/s2b5["3AO%`W!ptb0J8VbK.W:]sO`lA"ss2Gbob08#M`mkh@()*.ec,n&J`5Ka +iVs&[r;6Bjrr36$qt9aXqY^?lrrV!*rql^Gqu$Korr;oqs8Vcls8N&srr<#srVliqqrCd',Tn6T +,q7[Iqu?Qis8;`nqYgWqqtpU +h#@WXqYL$frVulrrtbV.n>iA;o`"ddrVlisrVc`qrVlisp&4mjrr2rtrVum3rVGMO*ZZ%6)]p?Z +q>1-gqZ$Kis8Drlru1n8rVQWls8;fnptq.,T:hpTSu89beb/t?r:^0grW<&trRCiHrrE&ns7QBe +s7-*es82fls2b37s8N#tr>bb7n%#EuW2-2cUS4KWS>u8Xs8;osqYL*dr;Q]ls8W)srs\[g*Z7lK +qtg?mrVuZlrt##+qZ$Knr:G*$q"jshrr;io"98B#rr)j+q"2.kS!fu$qu$Hns8Mrr!<2orrr1sX +J,~> +iW&rVs82irs8D`m$gc#U>)g&7bfn)G`W!k)_T'O:c-jMRa2c-:`lcTMa2Z9Dbe#eD(Dn#-'+he( +b0@uHbf7TDrQ+uX"N\g2aMn.r'ue5=aj%fC_7cdNCh@6hA6ieVEgjZ?`UV%KaoTT+f#[m6"3ep/ +aSs0a`Q#m:`Q#p?rQG>caN4;!"NAC#aNF+qrPnlYs2tA_rl4rV!62[m+i_L9^ohooARShJ?=$uN +AmoPb\AQ,(bKA#Nb/hZC`Q#ss`rF++b/V?Ad_rl,YnbgXJ=E_]/$A[CaurVcWlrVQKjqu6frq"X^ajSs`~> +iVs&[r;6BhrVmB*p\+L`r;Q`rf[]Zps8Drs!ri,srVm9$s7lNls8;ior;?QnrtbS0rVQBhB-/QA ++<;USiW&cSs7uZls7uZoquH`nrrE&rrt3N'mIp2Ap#b_tkPYA[r;$Bj_Z'H1qu6QoP5YR]qtpBj +rrDrqrs\/JhWsOqlh:/EmGQ%arrE&qrri?!qYU0brX/]"s'$co=Sr-qpAY'nq>UIHo&0NI"oeK#rqu]nrri8qq"apfrrW)nroa<3~> +h#@KUqYL*ers\l(r;!@fb4Yc4r;HWos8W!+rr;ipq#(0lrVlfpr;Q]q(B441qtL"u)'T\0'cJ@R +s8)cqq>UE$PU7dt:o`+jgrVZQirVlisrr)lrrr2p(pA\/9*`Vt7 +qtL*i!rDoorr3?&qYp4i*@\,dr;H3crr3H$oWFpXU8R;Ps8W)urr2rtrquctrr)fUs*t~> +iVs/]qtp?ls8Domrtt_0j*4mXW56U%c,R`A`lQ6?aMH3@b0\9/`#H_=cd'kU_SsL7eOBib',V>n +&\uu;c-O;K`l\2#rl-)%bfn/I_o'I5a2ZBD`kJutZkQH?"%,BUU.kUaND`LaSs3Y +`VmgUa<8L?aNEC*%15&Cd)WlCaNMEBaNMcN`Q$9S3slaff$)2*a:-59d)!)#;G157aQ`U$rr`2r +qu-Hm"o\;mpA4aKs*t~> +hu<]Urqu`p%/]\ss8DutkKW2Ys8W#r(&\(2s8;orrr;ipr;Q]qs8Muqs8Dfnrri&oqLg?s,7,5< +ir&fUq#CBlqYpEm#6+Ptqu?Bfrr3Aag$%\lkk+B,iUHaDrrDurs2+d4r;$?ls-!?`r;6BjrVuos +r;R/iiU,t.o]P]1l/9__rri?!s8W)tr!*,ts8N#qr;HU8rVuTd?7-t"p](9is8;cks8W&sq#C"l +-70`[[f>mss83H$s8W&Om-Wa!s8W#js82fprVlutq>:0irrW)nroa<3~> +gA_icr;HZos8VuopV`rGdJin.s7G0]WiD_pVk:#iWLo:)oD8Idrr2os!WDrqrr<#trZD1=s7Q%g+s'_Us8VurrVQKl +s8N&ns7056+;Z6/s8VZhs8NT(s7k0:T:VO`qYL6hs8)`ps8Mrr"9/8uroF*0~> +iW&rVqu7<+rVufhpAXsLSo&q5\\?21bfKb&.*0BOaN2N@a2H!;aiV]IbKIrCc-4SSd*cJ<'GqZ& +#S=Jdb0@fGbJsM%rPnlYrPnlY(X^.>`knEl@Ui_W>%hP\DN1O.`l>p:b.l!tb4NdO`W!mRaSa'V +aSO$ZaS +hZ!l\r;6uqu$Hls8Vs#s8Dutp](6lru1k6rVucns7?9ir:m!9*ucLT ++H-6prVufqr;-EjrrrE"q=sIXrr3&Kg["k+"RkdGlMCM[!VuWks2+d4r;$?ls,m<\r;?TprW)`k +rs\AUlfRTtjRVU0p!<:0rs&>qq"jmfs7cNmrVum-rU_Nb-[5F[rr;`ms8D]krsA1!+rqsW-KG.' +nbrRhr;Q^)o\\s$g%,1=qtpEmrr)j!rqu]nrVuop!<20]J,~> +i;`iVr;R?-qYgHoqY^3;UT<5DrqlZnrVulr$30o"s8Dutq#C?mru1k6rVufos7?9iqt?U,(_[o5 +)N"IhrVufqr;HWorrE&trVulrrtkM2s7PcLQDCFVU7n3TXN^;3rr)irrqXD0qu?Kk!WE#ns7lTk +s/>qrs8W)tr>,D4qu?]kp%6/$X.lSiU9LGlWK"giq>C6orr<#mrr;rsrsntt,p4CQp[nIbq#CBl +p\t1"mT1AD+!Mrhs8;ogrr +iVroVqu7?.q"Xmgp@%eDX_r$F[DKo*bfn0,`[JpOaiV`HaiqN?aN;]NaiMTG_o^0>e'-(_JJ8Y, +)]f>qb/MKG`luI$aSj-Y`>ut>b0%rN_T9d/[:% +]Y);(aSs6[anNk!aiDNHcHHV(%U.B'b/h?DeBGbMa3Vgj&.T?`!k-=i`q.7\`l5d;_7,8":/Y5h +kk+lSrqlWlrVHTnj8XW~> +huUEorVlio%KHA+n]'hdnEfE-l/:Cqs8W#rs2"^3r:g3\s69OYs1eR2rri8prVHBh +rtG%bhr*trkOeN9p"8%!s82Tcqu-No!r`&rrVn&?r;Zcms7lNQ,Te:ap\k!hr:g6kr;52",U4NZ +>4MC_s7-'qqu?Hjs8V +irB&X!WE#prseo'rr;ijg81n*r;ZNir;Zfrs8NN+s8Vlir;HZpr;?Qorr*N-s8Dutq=ajep;A:3jrqcZprW)orrt5,$abc^hU7\'VW26Nfm/$YYr;XY5qZ$Nn!<)Qhq>C?ns7cNk +rV-^KdrYGP4s8Dusppm&iTqC3=s8Muss8MrorVZ]qro=$/~> +iVroVrVmN/qtp6cq"ss[kdPABRD-bZaj'h-!6G/Z%EQ`BdE9STbKn>N`lQ:$aqqt;bL+eZ^s(!J +WuDfj'GrsNbfe8K`QS5$rl,tt_o'L:bg"DVbeLcK:hFEL=]f0IBlh/&a2lEEaSs5sa8j6Z`<4-$ +aNFM+!6tMe!m8U(rl+oWs2b5_qof)^`r4!Xb5TW`blGueb599[aoor5c-4>Ja=,'I`Q#p=aNDZG +b/_B?_8j-ECLLFW@8L38>%q/\\%TZ!aN2ECaihm+b5TI*b0S5Ia26*:#mh)Re'Q.W`5^0G`lYIs +&/H#m435FW`l@Vk%E5uu_og-9EDB&$B"RO2s8;inqr%L)~> +hu\5/r;Qru +s7Q'bq#(..lJLjnp@e+Ip$pV\s8W#mrVuosr;6BhrVm?+r;ZNkrr;ifi%H0"K`:l\rr;rprn/bH +*?cn6nc&Res7-'jr;HKcrr<#Z!qPF*rr3&rr;QTn!ri,srr<#tk5Tr~> +ir9,[rVc`ns8W'-r;6KlkcU]+p&Fsir:Ksf$i^,)s8;Wdqd"aAqu6Wprr2p5rVu]ls8;osrU6[, +'d"Hsq#C6is7lWmrqZR3rVlcoqs_=eW1]cPW2$&e]CtRjq>1'is8Drs_uBN4s8N#rpAXjcs8E#u +mf*4crr2io_>aK7*WH$8rVlisr;?Tirr;]_m)6$+USji[SYW0NV>:#frrW2trVca$rVZTlrr<#m +rr3o5o@tf5,(TLdr;Q`oqu,+n*YoY=;XXM`rVuHf'EA(3s8Duml`lnTTrRYXrVHQorr2inrrE&X +s*t~> +h#A/dq"X[^qYL6a`cYO:b.u*>b0'_'.*0HLbg\[Zb0nV[a2Gs$P33=(5iIBXtdoa2c9Aa8=$Ya<8XM_p$$CaNVC7#nL\"cc4&RcHFP<#nRR\)*H*gbf@ir +a:Q>(^r=@A_5Um09j2_mn,<1`s8W$#qtg0drS[^+~> +huE`R!<2ut!W;opru1Lah>dNMqXX[drqlTjs8W#orr2q2+=(pup\t13r;Q`qr;ZZoqYL3jpAaqo ++Y"H\p](9gr;ZWnqYg]sq>'sdqtpBm%ccF5mIKT;lK[:,s8N&nr;Qlqo_/0Urpp!_rqZT1rW2rr +r;R$$pAY!dpAOgcrsS&IlgjiDqX!S=hoGZp"oeApqtp +ir9)ZrVcQl%fH2$oYI)nr:g6kq"t*jrr<#srr<#t"_8PoC[h#rru:q:s8Musqu?Kgs8VinoiE%U +'I3;Ns7lNlqZ$NnqYqH4s8W&nn#VqPU849VS>NCHo_SU_s82WhrVcc6rquf\rpBabrqufprr)f3 +rW<-!rr2lrrW)iprrW0!q#::,o#7N'T;&*^T;/K_Rdp.Ms8MuqrVuip"oeQ$s8)KhrttR^+WM\M +q>^Hnq"rek*>9\C8c8Ves82ierr2p,rVucls4sTFT:E^kq#:9m"9&/qrqucrro=$/~> +h#A/do_/1[rVli\N)3BR\]`LFaj%oJb0'_'s2ZP2f1-&S=4>I>b/2!7c-4,Maj8)K_o'4>g.;u$ +&JNI5bJ_EH`6%u!rl-)"_o9^@c-=DM]5q:h@:WVV>\.ZAZb+K#d*9eYb/M?>_T2r$`P][6aN4;' +s2t8\qTAfYm`#j[b0%fF`l5j5`Poj +huE`SrVlotq#13nf\ui01\UMArVuoqr;Q`rr;6EgI3^$b+(++$s8W#ss8;lps8Durs8DulBd"fE +-H>o^rVlirqt^6kr"/c'qt^6ks5Dl.n*fE/lfd=,rr`8mr;HTo"8hcaqkF)[r;$?fs2"^7quH`p +rs/Q'oD/%VqYL-i$hi]Lo()>Cn*9-%ao25BrqcNir;-C7r;ZZos7cQjr4+%!.CJsLs7aD^)^H[M +CARi,qu6Tpnbs-sq>UEkr;HZpi9BR_r;ZfrqtpBnrr2fqro=$/~> +iVrrXrVHO.qYgu.p\Omes8N&grr;rrrt58,q:)13US-$1qu?]qrqu`oqu?]qjo9i~> +h#A&bp@eCZs8Vr@@8Vl\a3E#a_o9^rastEMaN2BB<='9V&4saZb/D-:bK.]BbKJ8Qa2H9K9FVdK +'WK@$ai_lL`VdgU`Yc\7b08)P`P-4nB3f"OB4bsuS[uMS_Tg:'blc,0`l>m:!65#W$-('-b0%rN +b/h[&`q[XS`r?P$5?`V;.6Bcp&4ggs8)fpr;QiqqYfUWJ,~> +iVroWq#:a$s8UR(mf3=dq>'sas8W!0s10X*+!MdR-f=drrr<#sr;ZQkrsAZ$qh$1=,9iiXq>LNq +s8W)srVmE-qYBgas469%o'br0n)'pbr;?R&n_iR&p@7P6m.BVn +rr3E'rVZQmrr2Wes8N&uq>Lm#\1&gQ\G,g.,pX]U-&)?slMgh`%fZD(s8Ud6lKd1(s8Mrnrr33$ +s8Mrnr;PaVJ,~> +i;WfVrr3W1s8Musrqc&YXi1&4rr<#trVZZnrr2os$G%Q,(E!u0,2E"irr<#s!WVrorsJ`%q1'S- +*?C^GrVHKrrVuosrr2p7rql`qqZ$,\S=uXLU8"NZ`9mHqs8W&ts8Mrsrr)l6rr2rqrW`?#rr<#t +rr)iurr)ilrsJc(s8Dors8;fprqZQprr)ir!<)fprr'\4s8W,us8DusqYq9/r;->+Zm6k>[.O'u+<;F;++a:drVliarr;rrrX\r'YG7\b +TB?%Js8;lorqlTmrr2'[J,~> +huE`Ts8P.YqtU-iqq6.$DQLFle'ZF[`Q63EaMl->b/fAB%29d")\9X*_oBa=a2H3=bKJ&Kaj=H* +&.o8$d`qd6rQ$)$b0%fEa2le`Q$6LcHsq]b0J,Oao03\aNVd*`X9Z#_o'F2`l?!VaMc*0O_\<3>Zb06?=RMSU;+=Ta2c0Aaj%lKd)Z..s3)8"`l5sAc^,+P$^]DoQ44KC&.rU- +cH6(*n&Q'_aMu6Bbg"5@AP>QoA&IO&r;QirrVcZo!rD]jkPp&~> +irB#WqYps%s8UC$ec5[Kr;?Qhs8W'?q"f+Z+X\QW,TOJsr;-UEo +!ri,qrr)lss82ir$-qo+na>]+le:t0rseo+rqcTkr;Q]nr;6Bh])Ma.s8N&ss8O)9r;HWnqt^!a +qtg0dqY0XKlKdj)lgON?q"jpdrqc`rrVl^"qu6Wpr;6Bjrr9k7s82rqr;QWo!<2uq!rMonrr3u4 +q>^KSl0S3Lp'r;!TE,:L.2.j,o[,(oUgrTsO]rtGD/r;Zfa +jQPdXs8Vfmr;HWorVlfo!<2$YJ,~> +huE]Ts8W,u$2=DlT;]!irr;usr;ciqrVZX3q"\qQ)BKk5*>c9cr;-?krVQWfs8Dus[/M!H+aj%Y +q>UEo*<,m7rr2ikrVulsn=$5JTV8!PWLh#orquNjs8Dor!<2or])Ma.s8W,uqYqB2qt^6iqtps8N&urr2lqrql^6rr;utq"asWZ_j@o +X/DecUnWsiqu6Kls8VuqrrW2ps8;lqrtPG/pT>\],IOa&)AjM8J+NU:rVulrs7-*drVld*p[knc +S>2tXrqHEirVlZnrr2'[J,~> +huE`RrVnkSp]'Q%BO\$R`R!#Zb/M9>b0%fE`lcNDa\`H\+X%U9".7NZ`5BX9`Qu3:a3N5##7V1R +@F3-?rlY2\s2lA'`l,j8`5p*B`QG]!CLLOR>\%bdP.JiW^rOO7aSs2daT'<\`rF!]`lQ*;a2n8% +&'3)Bcd0tabg";QbK\5Nao0O"dEg+^bg=YZb/hQA`l5d0_SjI8ahl+'b08)Pb/hU#`BhMbaND`T +dETG<_5M9]>@_2J>?GEN>)9i*]#)S3aNr)PaMQ'Abfn5N`l#d9bKu4R#S3Vt&e5Hi&8';5a2c3@ +rl4KLs2tA_%Eco@c+pYr7S$^*g?nJ/rrN&rr;Zfl!<)*\J,~> +irB&XrVuoq!<2rs#2Rc.s7l9bp\u!-s8N&uq26[G)C$LT+ccKus8;oprVlg'pV%pt-mhshs8Voo +('"72rr<#trr<#ts8UR5lgXE2lKdF-s8W&trrW/urqu]'rr +hu<`VrVcaGrV-0FVP1%iq>LKrrVc`mrtP;+m[Bc;U8=Z^WiFkArr;lms8W#ns1A:-rrrB#s8W)prr<#t,5qE7lf?jP +da64[`l5s<`l6-Le^N!sg?%l$q#(0lrr;rqqu6]rr5/F8s8N&ur;QTns8E&rrVca3q=CkqT:r$R +WhH)]SAP"!rr<#or;?Hks8Drprt##*s/-SW)B9V6)'OP'rr)corr;Qgqu-Qo$iU+cU8XTNc2@G; +qY:'lrr)iYs*t~> +iVs#Yqtg3frt"ei\n+mI]ZA@FdEK\N`Q%nus2H5)bgFkdC_IHn)]9J!D:?\S`6ZNDaiMiQS.-#G +&ie7aao0B\a<&IDa2lM]\\Q%q]=br&e_8EueC)[fbK.iH`rUb/hTA`Q$'>bL;+E'FkT^ +&J#IdcHO>Jb08#L_o'Laa:ZS=bf\/UccaD";,^.jT&8r6rVlrsqu-Kn!rD]jkPp&~> +iVroWrVuoqrVm,Kj8]/Yo()_Xs8W)ss8W)uru^t7rqO#O+s7pH/0]'3p](3hs8;fii%$/r+scm\ +s8Dcm!r`&qrr3'!rVQTo#h&)-p@.>1k1K\5!r;Ncrr<#t!WW/uquZlts1/+`qu?]pq"XderquN\ +kM".sb/_H=`lQ9DaN) +hu<`VrVca#rV>iPY2AmNrs&H!qu$Korr2lrrr;pU?m(]472qu?Wls7aO6 +TV\QVW2-AhQ+$2[rVlg"qY:*jqu6Tnrt,20r;ZZlL`@BU)]p)tp](0jrW<&trr2rgrr2j0rr)fp +s8VfecD.24T@Wr9rVuiqqu?Zpk5Tr~> +ir9/[qtg3gr;R?!c":FG[Em1HdEg%X`Poj:rQ$2*bf/5`d[CXW',2$!$rPQpcHOGS`5p'5&etog +$e!>B`5qr#rQ$)$`lH6Da2Z0@a2P8iC1(R[>[hJbV8CEubKS;Va2Gpp`<4-$aND??s2tA_rPg\3 +aj//Qaj8Jff$r'g^p^GW\[]5`^;7\(_SO(%]tVCq]Xthe\$`EC]#`:Of[nHoc-",Irl;ms$HgT: +b0%fH`l5p7rP_+Cb08D`b0Ir?`O1A6?=7)9>[M)Ra3\N, +&/#Kc$B*Ab0%uRd)*8G;H$e/XlT!MrrW/qqu-Nrqtg9Ss*t~> +h>[NTr;HX$gtCTbs7GsVrr2p#r;6Eks8N#sruUn6rVYLt-mfrW*\1I[r;HZqrqc@f*@2aSj8]/S +s7ZEms8N#q(&7h/g$S>#mITW-h"h!Mq#1*grVQQls8N#ss2"^7s82d5r;HKgr;QWhkhOM&^r"(2 +_8F73`PfX0aN"+r!65#W'?8,9bJqWD`m3N6rV6`5naYJss8VuorrW)kr;-C(r;Z`qp%O4f+sA>Aq"aserTaC^s8W)urrW2sr;Q^!jPf7Y +h>R?Tq#(-js8W)Ys*t~> +huE`Urr3K-rV3Fg[e0Uts8W&pqu-Knqu.];p&FsdgE7[^'c7`5=6KGWrr;unohH;E(F%f:s7u]g +rr<#ur=K#.s6,Z:S>;mUSu8RCq#C6irs/H!s8W)ts8Te3s8DusrVmc5rVZQkrquNShU0 +ir9,Zqtp?js#KuOicA78Xi\c4c-=JVb/hTA`Q$!Ab/hZN`QuiW\d&ia',D/p5/bpud*'SRc8Z1K% +hHM)bJ;6@rlY)Y*6H4=`5][4Zs[NVA79%YD/c5^ai)KLcHXDLaN+8!]u^5rs2YJc`Poj:aii#\r +n%h.`k8X_[_9Mi^r4:5`P]R3_u%:N_>_4`_8F7.\$WKG\Am.We^i6pb/_NB_8uZ!r5eoX!6+lU6 +-.ErcHaJRcG@N,K5>(&?s-W:>[^o[Yedulb/q]EaN)NI`l5s;b0%`H`5omBBFG4S$BrfWbJM3=b +g"AQ`P]^ba8jB^a:6;9cHO84CfXD7GgP[Nrr3&sq"Xgf!r`#pkPp&~> +hZ*TSrr3&mdc:?,s7cTirVlusq>:'gquH`qrs8N"s8;`P>9G?n+;#tLhuEHMs8#eD,9J,Bq=jge +q#:^Enrr2rtrVulrr;XY5s8Vuqs8N?&r;?6Ke&]T/`Wa?! +_84%-rkf,`aMu3UEo +r=Aqurr;ENmcO'-mechNjl6:>!;l]oq>Lp)r;ZZoqu+EODUSRXs82iprW)uerr2fqrr2p"r;6Eh +rr3>\iTf+bs8W#mr;?Nns8M*ZJ,~> +gA_Z]qph@FoD&:`s8W≺HNmrVdlbAp&4pd<$3.s)n>Y:rVuZls8N0" +rVlcq%dfIPTqJ$NSZ/^Mq#CBnrr3-#r;Zfpqu-To_#FB4!<2ip-Nrr;oiqu?Kio#Io6U9:Mn +WMZJd[-IViq>L?ks8W)ts8W&s&HD\.qu?Ni^hdc3s7H?hs8W)t"98B#s760fs8N#srs\l+pZ&-A +US#I#r;-Ejrr`9#s8M-[J,~> +iW&rVrVnnVo]NA]A#d,_cHOANb08)PaMYp8b08#J`QuTEbf\2B4q&AG((h2j^u!;[ccn6W().@Q +d)ErJaSj9[aT'@&aN)9?aN)<-?"mt]?X[G_G-/Nta2H9HbK@rNbJq*6s2kA``r).q^V7Fs^VIRr\@B$I\-fj^^!5!We^Dac`3IB/a2?!Fc,e&Q +^;%"/Ch-US=&`O9A7p.i_T'C2c,[rNaN2B@aSsY8"'Pi)*2s8VlfpAOsi!<)'[J,~> +huE]RrVlrIgA1aJ!<2or!WMooq#C.7r;Q`rq>L?fs8VrgBI+ZH,on0XYl=OuKI@`c-)1,5s7H?c +q#1?prqu]o#h\4sn+#]4jkg":"o\8rqY^?ks8W'#r;6EkrVsb6rVuiq#Pe>un__d:`;[S'_Sa:0 +`5]d7_SX41ajntof\,!3f\"ZtaMu9Aa2Pp4_o0I3a2ZK`l1P&U_#FB6#6+Puqtp('irr<#erW;ulq#14# +qt^*aq>^Kmiof@Trr3&srr2lrrr2$ZJ,~> +iW&rWrVm0%r9:5cfD>@Drr2rr!W;ons8N!?s7lTnq#CBinm`aW*uu(7,-:_=r.61-*Z^dBs8Vcl +p\=^hs8MrqrugppQD:+OURJ'XXlB$Or;HZprVc`ps8Mrqrr<#trr)f3rr;rsrr2pTrqQKmnD2F1 +_SO++_o0L4`Q-!<`5K[;bLP4sg"G*4f\"Wra2Q'=aMl'6`5T[6a2cWdlh:>X^]+*0rVlfr,5V?; +pAb0ir;Zfnr8Y&TXf&4rVk]f[VsOH_rr;rkqYpNpr;I<*s8Vrls7lTgs7l9eq>('irr2rdrr)ls +rr2p+rqlHip +g]';4mD*RNNP!*Sbf.E9`m)iSaMGX2b0S;N_8!q1^<4[Ed7k2_*#fP-(6R1lcb +`4WRf\\,Sh^V@S!_7mOj[^3EM\[T)[]tV7s^qI4`Za@-O]tV:s^qRFm[CX2obgFe]_8uSps2auX +6--g]_7n4Dc-4JW]sjME +kl1Y^qYpWrqu$Em!p%qrrr2urqu6]pq>U-kq>:*hrVmo4s82]nrqh6p*$cLL+XiHCX!&W;++a:g +pAb0hs8MrprXo))rVcZos8DoCnEK6!kO[d#qu6]prr)lsrW3&srqc]nrVsb6rr<#trqm!!nCbn$ +aN4:t&&Z9$_oL!Qj6lU8q"ad`qu-@%q"jpeq!R1rdEBPL`50:.rkel[fBW,,_>aK7s8E&squ-Hm +rr;lsqu$Em"Shfms8Mus%K5JOmI'N5oChY4h>dNSqYpL3rr<#trquZkq#: +j8],XrVmH.r;4(*aSGc6qZ$Qnrr)fpqu?]qrVnnRs8;corV1dc(*!u+(a=q-W#cp*(jkrUpAb0h +s8N&urr2rss8Dutr;Zfeg5;MtWLoi^Tt9UgrVlg'rVulrrVZHfs8Mus!ri/sc2R_Bq#:obU8"6mq#(-gqZ$Tpk5Tr~> +h#CRTp>^U/IC-r;ai_H7_8aaGc-"#C`lcQM_nX(/]#qn/dF$KR&.09j+rM/;d"_T*)@g]CfYY\Q +`m;lOb/hZDaN2BCai;?>\"m& +bL"AO^TV*F +lMpn`!rW&srVm!!p\XshrrVW@iVid.rVlirr;?TlrqcQmp&=jgs7lWmr;Q`prVuii\0NLE+rW)llrW2rrrr2utrqufqr;R/siTfjplLOT>o%r:'s8W#orri8p +p\4L]s!dsIqu6Wpqu?ZprVZWorqufos7ZHlpAapcrqu`or;Zfpr;Q`rrqu]kqu7/Nm,mL-s8W)m +s8Muoqu5[VJ,~> +nc/Re!r`,tqZ$Tp49,9Zs7lHccDn;Ds8;oqs8W)qqu?Qnr;Q`ks82irqZ$Tos8W&rs8DW!+U9EOTTuG#pAFpes8W)t +s8Muok5Tr~> +k5YGZs8QF(qu?]lp?JP]?EM5kccO2J_SX:;aj8/ScGRlHaiM*0^;7e1a2cBHacHZB(*OtC*E3^] +#7EQFeBZ4Wa2uKKbf\#G`Q$!Da2H0@Z+X.L?Wq/TAp8a@`Q$!AaN4>"rQ+r[c,^%1bfn5Lrl$>+ +bK7iJcHXGLaN_fHbKJ;bZamca_SX70_S!=cZE_6sf[eU%ccjJOb4EjWbobKc_R-_\]Y;(o^U:2U +bL=_^d*KkS`l5s>c-42GaMua+ +WEW7i@%HH[s8Mlhr;QfnrTF32~> +lMgk`rqlcqrVlutqtL'grt3i3oDejhrVuipq>^Kls7ZKirVlllrr<#ts8W,trr4)8e0Q1a*@E$T +,9S1,qu$Bkrr<#tr;6UBn_Z'B2!<)os*<,m8s8W&t +rVZ34`PTI,_oKa3]Z%k8i:?dBqY^3hs8;]lr;7T7s8Mliq=NO``Orat`l,m?i:d*ErVQHks8Dil +rVli5rr<#urr)`prVZ[(rV#L7kj[p/r:BI4iVicWqYpHn"TJ2jp\Fae,6%Q@q>L?hs8;lrr:^!_ +r:BX-f>jDTNGWM's8Dutq>UEorVlip!<)fp$KpRBkLon8qtpBkrqc]pjSs`~> +nc/XgrVZ`qqYpZrrr<#tq\]+iXf9\CrqlWnrr2`ns82iis8)cps8Vljs8W&srtP4U+;c.5*>o_7 +)BDNHqYU9ks8W)rs8N!1s8N#trV#T?US+?YRAR!bo(i7`rrW2tr5&C4rVQR#r;HZqrqucqs8Drs +(\?+q`59C0a2Pm.`Q$9bpAY*irr2lqrquflrqcX8rVHBiqW,rG_S=%0_o'OPpAFderql`qrquZl +s8Tn6s8DusrVmo:s8Mrrs7>0ZVlHnoUT:2hS?hSZqu?Zqrr)cmrr)isrr2g?rVlfrqYgHhrqlZn +qt9d[qXO1#e]!rJMJ?nrs8;lrqZ$QnrVlis%fQG*rqlWfaJ#8uU#>bBrVm$"s8W&qk5Tr~> +kPtMZ>Q=[!qu$HlnA]ZUI(7;Abf[oD_p-BDbJM]MdE^"a^W+C4_8XR?aiDHDb/^Rj&0i/@*Z>e& +#qsiVbK@oJaiMQIbf[rE`Q6-DaO.u=Y?,:??"I>\Fa1[?aSj8sa99Z0bfIg'`W*q+b0SAWaN2QJ +aj/2]cFC6l]tq_/_nhe1_oBd?b08)PaN"4us2ZD,aMPg0 +a3ViRc-Ob]a3DiUb0[)iSp#Nt8OUYNd*TtM_8c>o'$&,5`kfL(LJplBAAn' +lMgk`rqlcqrVlotp\k*njOiSns%34ds8Duss7u]ks7uQls7QBkqY^?ls8W)srVu`hs8CYX,U=NL +,TnE`h#%'Krr2rsrr)cms8Mrorr2fprVuoCiofe"m-*NdrVlusq>:0js2+d2s8;j2s8N#ms8)KM +a2Gp4`5TX2_T'^Mli$_\"oeGsr;?Q`rrE&tru:t9rV5R0c,[c=_o9dIl1k)Ps8Dusrr)cps89_4 +s8W,urVZ]qs8Mus')L\No'l/Ao'bo!dJs7As8;cnrr3)uqt^-es!%I?s8VWbjO)5PPalW*@j`cS +.Np8i.OH>^HiO!Arr)irs8DrsquZltrVZ[#iooO\o`+pgrr)utr;>XUJ,~> +n,NFe!WE#nruqCAs8;orqY.:j`;'?3rVHQns8N&ps82ilqYpNerr;lorVmZ4rVccnq#C9D=rn\%% +ilQ3-JA4mrVlcq"9/?#rr2rtrXo,/qXrp8U8"?TU84ckq=sjdrr3'!rVaS3!<)Tirr3r5s8;WO` +l,d2`5T[3_oKsSlh^SVqYgBlrr<#trp]jdrqud+r;#O0bf.E6^;7kO9 +kl:\]7/Qr]s8Digs8VuYIp[W1_TC'DaMc9Gb/)'3aMZ0If>c%V_84+1aihoOaiVE:d*T3e%MKTd +'b1Z\\C/[GaMu9?`l7qu$c^9/bfn8T_nE-UAH#p@@qT_'_o'L8rQ;mr!m8U*rPeiYrlY8^&')Z. +^sC9Qa0N4h^V[n&\GilC`6m>kbfRoE`lQ=%bk9-UbTP!Kb0/#RcI'VF\@B2c_SX+(bL4PSbf@fE +`Pf[9ccXDIaSj9[aT'@!a2Z-@aM4$GBHA8Ap!]$&19b5TU7b/hTB`Pop>b0%`Jd`0bQ +ZET=6JQ#<7%MKQo%2KWn&e#"OgsF6a_SaCmaT'E]a:Z>1_nX-l@8fp)RH*o=s8Dflrr2usk5Tr~> +l2Lb_rqlcqrr3W-s8N&umbR")s82irqu6Wms8;lr"T7Y*gA(XH!<2lo!<2uts8EE&pMD)u/K5ra +e+s%?rW)orrr`8tqu6Nn#h\;,n+5i.kMQ7a60)#jI2rr;uos8Vf8^:0irrN,squ.c=p](7o-RU5k-RU)[-mKfV*?l[G+XA0Z*2`T1r;Z`q +s8DrrquQiqqu6cQl07.&s8W#Xs*t~> +mf37bqZ$Tp')_e-rV4X4Z0hSds8Vuqs82iorr30"lttDJrr)lor;cirs8W'*q=SJD*%)IC-.)Dc +rquforr<#ur<<5up"c+/rhp*qVQmQ'q#10jrr9G+"98AurVlg4rVuokb.Pp7_8O=3_o0mZlhLJZ +qY0jcr;lotrr2rrs8E&trqlZlr;QZorYkb7s8Vl\gWd^U_nO++ch%25rVlfrs8Dlor5&C4rVulp +rr`9!rVZZl&,G.oVPpDfVl$MqSA+OgrVlg#rr)cnrVlfrrVdl(8CU%rVu`ns8NT,s82irqu?TKUS=HYf_tXG!<2-\J,~> +lMpn_rql`os8O;=rVcT\Y%2.Ibeq]Oa25g9d)O)H`Q#PYZI7CUc,[`BaiXP*'?\GAbfJ#QcUe3I +)[-TVYL(_Ab5B9Y`>?P8b08,Tccp&bK.`F`l6!Ccd0eO]Y)"r]tUVPbL$70 +#K=a'_oU3Nb/26ub5KC"aiMNC`Pfa7^7TRT?!165?=RGDHaUf6aN2O'bl>fcaSs3ZaT'C*c,J/f +2%1!.)&aMGj0PZUmfBs$b!s8Vrlir=N~> +nc/Xgqu?]qrqufqqu6uPht@$Jq#C9jrr2p+rVlNcs)B>6M"(<8lfId2*rVlNM`5p-8 +`5TU2`Qd3+q>UEoqZ-Wis8N!&s8N&ts8N&tqYpWpqYpKo)#aL7rqZ$De&08F`l#mWqu6Kgr;Zco +rr9h6s8W,urVQ`oqYg9j')UbRo(2MGn*B2aiW&rWq"ajer;S)Br;6Bhr;HTopVn^),p"$G-QaZS ++=8Qb,V;c!,p4]jq>UEmrVccrrr;ltqZ$Kjrrh'>kN(Irrr`2rr;PjYJ,~> +mJm1bp\u95rVQ,^Wm1PCpAb-lrr;utrr;`fs)&u*KC&C/qu6U2rVZWorr)ijp](9gq3rNG-RdL> +rr;uprrE#prr;p5rqZ#CVPL,aU8b??p\b'js8W)srr2rt_YsQ8rVliqs8E#qrr2utrr3Z-k/>Ba +]>;D$_oBsWmeZq_r;-d@rW3)`)p\b!i!<2uq!WE#pru_7=s7O8W +)'9Y0'd+;6',_o=+ +nc/OcqYL9kr;SbUo$VPhKuVEWbfn2E`5p3B`P'.>9*c)Ie()XX`6-9FaN;WJa2l*5bgOMQEWcLR +$*hn)cH=/Hrl#eq`5BL4b0A8Yc-4/==D_\]?>+7uO1E!A_oVi"rl>)Z_T2l"`PojaN"+u'ZS85`Q6$:^Un>c9N#ZN +n,<:[pAO%OJ,~> +o)Agkr;?QkrrE&sr;ZcprsntZh>dNKs8Vims8Vurq>UBubU4JR+=j)`r;Q`rrWE3"r;$?l$hjVq +s6cquo_AIdpA4dfrrN,srr2os&(L";p%.G.j8/fUr;-3ar;Q]urqlTj_Z'H4s8El5rr<#ts7u3) +`ll*4bJD*5ce[m[s8W)trr3)tp%eU_s7QBhs8W$;rr)fqs8N&urr)TTh8mgY_9'dMq>L6m*Y>&s82Zir;QZp,l[]:q>:*gs8VopO^ +)^g?/[*S72q9(!%-:mt4s8)Zns8N#q!ri/qr;QrpjQH$hl2:Par;-9eroa<3~> +mJm4cpAYO!r:.q)[IF+hs8Vrprt#&-qZ$TpaWhZ>)'tdKr;?Qos8N&u!WDinrsSQ#q>]f[[ds.l +s7Z +Qa+d%mIeF<'-BX;s8Vrlrr)j!rqufrrqm&YW1'NS_#!s,i;\<~> +nGiLds82fls8)fpr;SbUqV@QHDm7C+cHO8N`5BL8_9'sIV@!\A&Jp&Kb/V`PbK@oJ`l,d@b/qHE +^s0lSPKV5%d)*fBrl+oW"NA3p`le;,&^82+@VK@_@UNhiQG:5Ma2c:#b5]Q_`koeG`l5p:aND`N +b/D5^_nj7.rl+oWqoBo&e'ugjb/VKE +_oBjCcHX5?[D9A_]!Jrsda#qTccsPS_8uZ!qoBc!a2Z6CaMu9>`Oqdb>Zt?.;cch/?&Z80`Q--D +rlch6aMu6@aNDN>b0.l[D?paf(DR\t&05k?NiUINgpIb+'dq/D`lQHH`qmahb/M9=a2Pp0RpSc_ +;Ng&4rV$$Gs*t~> +o)Agkr;?QkrrE&qquHNkru^@Wo`+sjs8VomrVHKmqZ$Ne:+7V9+=A:%a8Pf2s8W)t!r`/lrr3,u +s7lWfrr3&tq>^?krVlrur;QZp#h8)0p$VA>iq36M"SME]q>C6l"9/2nr5/I3s8;j.r;$6iqW?8F +a1oL2^rFCIl1k8X%fZD+s8N#trVcWhq>:*hqZ$Hlqu6cop\OgerrE#srtG;(p@e@FbeD*=`5]sc +rVlWmrqaG0s8W,us8;oo!;uinrr!W3s82irqr[)6oCDPDl07$es8W)qq>:-j,l[]:q>:*hqtg +mJd1cpAZ<3rU\[=UYl(KqZ$Tns8W&rs8)cno1C8P)AjS86cAlrqu$Hqrr;ZjrsAT&q#C!cs8Mrl +qu6Zqrr;usrr!?'nXZ/AV4aT`WQFr0s8Dors8Dusrr9n8!<;los8Nu7rr;lZe&BDD_Ss:-`7aDN +s8MupqY^6grql]qrr2lnrr2rqrr2lqrr)itrV6Bl!WE#srt+PC^W+@4`6%BGs82irqu?]1rql`q +rr)d.s8)coh6`uVWMlhsUSt'(p\b!hrr`5tqu$ +n,NFd!;lcls8)fpr;SbUrT:LrKa2c-=cc",SbV'PH(`""u.\kG8bKe5L`Pod>^WamG +`QZ9LbL4ncb/;KDrl#eqaN;K?`Q69Jc-"#;ARf4^?=@YjPearO_8Z>ps2b5[_T3tA`Pojd*]b?\&,bm_n3Lf^W4aNcHOMSa2>am^^J-&bg4\ac-"#C`PqbpqT&ZVrl?/$aN;QC^rOO< +bKJ8^fZ(5#^;Rap[*7.Nb0S5H`Q#L1!QiF\`u;q<_8aBdF^A6L:K(A"A7^;)_SjI:b08)PaSj+& +aMkp+^W+CCFEVnlLCFq3$Id/;c,%cT:^\'FR`WCebg=N1`rF-Zao9 +o)Agkr;?QjrrE&sr;Q[!s4Z2is7ZHl/H#PCq>L3es82inXX##2,9J*X-"lZ?s8W)ss8Vurq>:3h +s8W&trVcWnrqlWmrr;oqrr38lhXpL4m-<^#rr3/ur:]g\rr2p"rqZBf_Z'N6rVdN.rVl`ilI!/[ +_SjF4_p%$4r;Z`oqu?]q#lX\qq"ORZqu6Tprr2fms8N#t"oeGurr)fortbV4qt^$\p@nLMcGRT? +`m"&Sp\k'es2"^7s8W)ur;ZX1q>1'grr2rtqu?Nks8D*AnF>o9p?;%krr3*!q"Xdcs!I[@q>C0i +rVufqqu?Khq#,=X+YHdop\b'hb9ePX;Y^7fs8Mrrs8Drrr!rT's8Drqs7u]pk3_Bnhu +i;Y_,pSOIkqu6Tkqt^9ks8W)ps8)`jW?3#q*#KV=+(OX0rr;uss8W#sq>:3hs8W#sr;HNms8;iq +!<2orrr*H,qtI^iTV/-XUoD?%qZ$Hkrri?"rVlfqs1A7Js8N&urqPa*]#2A&`l5m?i:m3MrVQQm +rVlKiqYpBlr;QZp"TJ>us8N#r!<2lq%dhTZ_o'F9oDeUcs82ir^Ae*2!<2uts8N&u'Dhb-qYfVN7s82ikq=aZ))]L/$rV6?kr5g*)(es`'qu?WlrVlZn&cMb0 +rVlcqrr)MpVOX +mf*Liqtg0dqu-Bk2XfID;//]s2Mmrs2P)[s2lk5`l6!B +cdL"IXMMop_7d4_^sUQUbK.iNb/VK>^V@Y(`6?QTdETbO_oBdnb5]Q_`rF!c_o9U3_o9[:aN)EE +rQGhuf[@OJ_7mFgfA+Zra1oX6]#Z)8a2uHEaN;K=b/hQAUN'F::ek#!=CtF<]thS+b0%rNb/jS% +,07d?^;n.7ajA8Yd+_Y.%37UZ^Ve4:UC@nI3RGp`a3DlOr5S`W&]W#;a2l +o)Agkr;?Qjrseu+rr)cprVuoVhZ*WHr;Ru=q"Xdds8W)sqtZ0s,UXZT.Nfstr:g0ir;Z`qqZ$Qn +s82Bds83B,q>^Kos7k7Ap[[e3kN2[B"TJ>rr;QZp"8r&nr;-Bts7cKlqYpNndJj+E(&Rt/qu?Wg +rp@_@a2Ym1`Pp$qrVlfors&K"pA=jdqYpBpqYC!brr;rnrV-`rq>0sdrr<#ts8W)t)?'F0qtp9a9`P]g7fB2i-s7QBjrVum!rr)fCrWiK&qZ$Tms8W&srVZ]mr;70+s8N#qrr<#Ukk"?5 +oC25 +m/R+b('":5s8N&trVufmfqbhCs82cmr;Q]ps8W'=s8Mupq=f^h+!DI:+W)8Zq=X[crVuirqZ$Qn +s82]mr;Z`prr3W*s8Vofb*&ZtUSslf\G,murVlfr!<2ur!<2rsqYga"p\k-grr;rCrrOnA)'5LMs8Durs8N#hrsJ](pu80ETV0-trVlfsqrRj.~> +mf*:crVQBi2".PXBs#V!b/hZC_8FODc-4GXcd:%dC'G%Z&/6B)$ZFV?bf[lEa3;WNbfS,Mbfn5P +aN4;!)T^(Dbf\&O`6HQA]T-$+@ps%\Ee2'G`l?*@qo\r[s2OlU#LC6,bf%TGa3VgBc,mrDaMl9E +b1Y7M[)C/,^V$hTda657aq2S1`lZ9@aN;QE`l5p;a3)L#b:q&]b/_K@`PfX,^;%P(b0.rObK7iH +a2>d +o)Agkr;?Qjrri<"rr;usrrhErp\Omgru1k6qtf_r,p4?V+CcbIH: +`PCL/q"t'ir;T%]r;$0`qu?Zgq"jmaqt^$Zp[dtGnF,l9mI'H5nac5Brr;uoq>0p^rVHEjrVQWp +qYC*fn`/$4b/hU&oCW(\rr3-#rVc`qdJa.Brr3)ps8;iorr)cpqu$BlrYGJ4s8)cqqr$].o^;;G +mHW:&s8DrbrVcchrYb\7rqjee,9eVbs8((e,pY)6r;-Bls8)cqrVlTi!<2rs$M3$FkiMjErqQBh +jo9i~> +m/R+bs8W,urr3H+rr),_U"9)8s8Dlorr)lsrr2p9rVZQglt@O\)&a;2,93r\q#C6kqZ$Kis8Dup +rr2rorXer+rr)NiXJM_bTr4`m^[h:$rqZKmrr)lnrW)forr`,qs8ULG(B+12s8N&urr2rsl,^cc +]u7h/_rgmnrVlco!<2ip!r2Zlm/I(brr3#ur;?R.rr;olr;Z`os8V]Ncb7B<_uB<&r;Qp!rVc`q +dJa.Brr3)ps8;iorq69lrVQQn&c(@fV5L8dVl65bU@\3\s7cQlrVZWprVlfqru(h9rV=DY*?6BM +rV4SW*?6HqqtpBms8)`oo`#I$s8;oga-i`lWnR@LrVuiXs*t~> +mJd:eqtp?hs8VsNp=+1iQG(#WaN2B=^Ve=DbKA#Oc-+8ObJQgU%Mg6.'G(A/cH=PTbJqoM`m2WK +b0'\(rl4uZ!6Y8a&BE&=`k''*An>:T@V9k?]Z'lkq9&`Ys2OlU#K4m0ai)3@b0e9Hb/qiL`Q-'= +ajAYa[_0i$b/:lp`R2cIrlG)]s2b5^4j(smdE]YH_o9[?d+-b+iS`VMhV[/Bf[eU&dE]nR_Sa:1 +aiqrRaiDE=^;%b/b0JG\ahkR)]Wg;7_Tg+"aTT]*a2lBMa9TZ,ccO#I`lIYk)TK_4b0A&M]:EYB +>[16/=&`gEZamrs^aSNpRaT'Bi +c,IK$J59*>E45E +o)Agkr;?QkrrW/srqud!p".ptr;-Eur;$-brVlfrrr*`6p]&E7.iBWY)^le#de`qBp\t3mrqZTa +rrL?mrqud#rqQ?fq=OL]ruV+4nE]2qeBlFY_8!^t^r=XNh;RG\o(i1Zq>1!erVHO1rqu`nrqu$, +^WaX;l21>Trr<#trVccrdJaCNp\amfrr)lorqQC!rr;rss7Z +lMpk_!<)os%K?>$c_IZCr;ZcprVlfgrt5#)a\F,o*#oY:)Fi'Jr;ZNjrr3#qs7?6irVca-qq%4. +USOW\YeKo1rr<#sr;QQor;HWorr;cm#64Gts8Mojd/F(Crr)j+rr;cWbeD!4_SO.5Ys8N#r +s8E'!qu6TrqY^*f%.`lQkMtOZhrEqip\k*k!<2cn#QF]$s8;Wirr2p1rTMM +mJd7dqu-El1B%%=ii6^2aMu09`l?!8_8X[D`5':0a2Z*;ahc8t2&?`C)@dMf/[!OKd`'ARai;0; +prNKXrlkDe&C8VC`kIgC?X[;I@W[@CaN4/!rQ,#YprEZ__9C'C`PU'E!Qr[db5]Hpa2u]Ubdt0t +aMkj%]Z&:Dbf7`FrlRjS`l5g8cd0h]da#tTbKnetkjn66mciimiSNJOl0e-6o]t)Td*L"_bfn2N +`l?0Fai;TLaiViWb.+Xg[Bn$+bf\#KaiMNCai`#P$-C$'`6ZNFai;?na;<"?`l#p@_o9a8STeOL +<`<%%@U!fW]>F?a+Ni$XccjJL_nj+*`7WX]";;D6fA0%9*t`qY`6--=_92YrrPnlYrQ5Jj`5]Hh +BMV<)M!G!>!rM`jkPp&~> +nc/Xgqu6fur;HWorVm#Hd/X.?qu6fur;6BhrVlfr'Dhb)rV;d6+s\!R-RU3\mIUAXoD\aiqXXXc +rt5)*s8LX?p[Ie9ioU4?rV?6cqYpQprquNi"TSDrs7lTndJa7JrVccqr=]#*iQ8jTaLoO3b4GQ- +s7cQmrqudGrr;onrr)ZgpA=IGg;gIhP*1iaMM[4KN/ijRLQ.UpZ-qLjlL"-7q"F^`rt,//qYgHj +ldi/3!<2lq +q#2'-s8Vlipfnsc,E0Yl)Bp["qu?Wis8VTf$30u&qZ$NJnE8m3rrE#Ys*t~> +li.[us8W&srr)fpqrsfQq>1!gqu-Nno`#U%s8)ZfP:IRl&0W/>+E$K7s8V]irrN#soDT="s7ZBd +hk[0IT;ncl^@M3rrr3#tr;QQpr;HWms7uWss8;`nq#:<@rYtn7rVulrs8DrUb.ks:]#D\6p\t0l +q#C?mrVc`ps8O8?rVuosrqufrr:K7.cG[T8^:h1m^VI_%]XthrdG"*_qu-L4s7uWns8;ckrVlis +rVliold*Se_SZ-Iqu-KmrW<-!rR(TJrVuoqs7cKlrVlTl(&n72rr<#ts8;iNZD4FrTrFreTtL!q +rrE&trVlfqrVulort5&#oiN1P*/DBU',i+]q>^Hirr;lprVuco&,cD+qtSd4V4adCqYpHnroX62~> +mJd4cqtpCMqt]mI_Ja;*`lQ<=`l?!8`Q6 +lMpn`!WE#qrt3uAkPtP]q>UEns8Mrorr2rtrVlfr(An.3r;?8<-m]fO*%2sYTD&<[r;HWpo)AUf +#lW3>n+#u2io^4>s7lZmqu6Zqrqliss8Vln#6"T$qu?HfdJas^rVlfmr;HKUaMYs2`l,[>s7lKk +rVufos8Drrrs\l(qXrpj[%3)+J:N4LHS^%rI!p6fJqJ]+It<<5T"3G;o(E%\qYg?ep\jses8W)u +s82W=a2lNDoDAIcrr)irrqk+B$2ac!s8)]ks8;fdrY5D3r;6Els82irr9!>:mI'K"-5n:-,psRbq#CBjs82ipp\t3mqYg`ts8V0=jlPM$rrDlVs*t~> +nc/XgqYq**s8Murrq<:lc2.>;q#13is8W)nrtPD2s82]cHm0UG'GVc1,Fe?*q#13hs7ZF&rVHNk +je&HBTW+ii]_;3urVllrrVQ]prr2rjrW`?$rql`jqU,9\s8Drsrr<#pkf:TY^rOF1e,T=Ds8Dup +rr)fprr2p-rquZjs8VrXgs*dR_T0^r^GNaB_o0O0_oBd8_7mXr^<>F*s8W#sqtg +mf*@eqtp9j0)5)-f5ken_oC!=a2Z*9_oU!EaM>L(_o9X;a3)<@dEBk\>nRn_%M'Ed%t;gPrkniT +b5K?YaSEsh`lGfi?tinRARoS,]u.b4rQ=KJ#04m-`Qc9Pc.Ct:gt^N0e(EL8ioK7bkiqI"k3)!nk25"LgYC`Nmd/iXdDEW9`lH9M +aN)NIa2c?Fd^-$"^3 +?WrDr^;It1rQ+oZ*6?.=_84%#_p-6M\c`QM&iL76")H?1b.l!7bK9_*s2b/YrQ+r[%EQH,^2[1H +=anoiqtL'Os*t~> +li.(dr;?HirrW2Ohu1-k +rr2rtrr2g&q"jp^nE%NQOG82_GS>4?GB\4QEcH&;FE;SGFa&4_GCfaL%%4iemIpDOq#(!^s8N#t +')qq1rVb:eGT=G +rr2rtp\l!'s763iq>-U*-QFEO*%pOTr;-Hnq"Xm`rr<#srX/T#s8W&ts4$?!i;W`XrVZZXs*t~> +kl:\^$NL)(qVn3KnG`I]rr2lr!ri,rr;Zcq')V_,pAb0fro8YR)As5))]^91rVllnrVuQi%KH4r +X.c)_T;AHfnc/F`s8W)trVulqs7ZEsrVufls8Vinci3nC&c1n;^r=@0_TUO's8Vums8Doqr[n0L +s8W)prVlfpqVf3.`5KR5`P]L0`5T[4_SO(-`59=(^r+1*_o9C"^te\`qu76)s8Dutrr)lrs8CNd +`koalrr<#rs8N)tdJa@Mq#CBns8;fpp&4sgrr3`3s8W)rs8:TSVQ?\oV5U>`de!M +n,ECdrqc]orVmZ3p$^tT@:ZdecG7]KaMu-8aND`L`l.krs2Z&"`QQ9:bfdrQ`cMq0)ANnt#mZ:3 +b/VN;rPnfWr5oYnb/h]<[qfGZBO,.^F1B9+aisb,m)TFPai;9Fahcn_VC,eD]9< +eBQ4_beqK?aj%oIai_u^]Wo#U[c#WXai;?BaiDfM#L('2aiM`Hao06TaSj7!a32QB`5g$C`lGi] +CL(7J_r5ScU*PBP*b0S/RFpSlk'F=sWaO85IaN;6;d`fqXb/h[&`r4!Y +apuV9`Q5s5UKUJf?)Qi[qrRj.~> +li.(dr;?Hjrsee[f)PdLqZ$Tpqt^-er;ZTl(B=:3qu?]fqsL"&+!i$Q+"11brr)cpo)AXg!o)`" +rq-E`Q,sKnc/I\s7lBf +s8N#tr"]#!o&dfWKn+VrF)c;FH$Xd[FEDYIrcJrsFE_tVH?sj`F`_hWK8,8]`oHIVq>:3lrr +nc/Xgq#C?m$1#I%g]%-Js8;iorrN,trqufpqu.?1qu?Qns7?'PQlm.a(E")8;tp:ir;-HirW)ut +rX\V(U7@pNVl$WXp\Y!jrVuiqq>^0f#Q=]&r;H?hpWrj;rt=eN^;Rk*aN3-0s8D`mp@eOcrr2rs +rr)j$j2ALC`59Cj_`>QK^qmn*`5Ta9`P]X3`5BI._Sa.%^r441_Ue/Ts8;iqrr;usrVHHlrr)ls +d(mc=fD#7Drr)lsd/F:Mq"Xmas8Vuns8Drpr;cirrtYM1rVccqq#0g/Y,A4sYFhkkQ07i=rr;rr +rr;oq(]XF5r;Zcir*^W\(EFZ-oDeagrqcZlr:BmfrVlg)qu?WmrPkb)T +n,ECbrqZWnrVmc4oBakk?]r(<_UHiWbfIc@`lQ[_&RCNZbq`5]sV&Wa3Mi@[Dg/(^pCYt +e&]PX`l?BH`P]U4aNVoXf]DDRbKeu.l0I['naZ5@lfmd)o(2PJo`"M5oCDA=oBto.lfHsMgudt_ +d`TSG`5BR8b088[cICIMWkH-icc=2La2uHMa9Ti(_TB[:cc,e$rQ+lY)9L+Ha2Q!6`5TI/\;k9/ +<`<1!AS,5P]Yhbfa9Kf.`l5s=b5TU*ccFMTcHaMa;&C#b(D0-]f#l+O^ +l2Lh_qYpKo%JIlrs8Vrqrql`mq>:*grrE#orYth9qu?WjoZ;2'.30WU*$lgVci*nArVQWorquZm% +fH>+s8N&urm:'*p[.8*rVm3'pA+^fs8N#qr;HKqr;Q]qs7lQtrVlirs7^T^rYPP4rqlZjiP!@Q_ +SsIFq#16js8Vrqq#Cm@Hn`RNON.l\&EGf`;F`qtSH[C$`G'.nLFa&"OG'\I^H?aRUGB\.NG +_(:/b3ns#s8W)rrt##'qtg<4aiDKfp&>!jrr:@E!rTiZrr3)qs8MrnrqcWsrqu]mrr2utqu6utk +j%O#q"47AdJj1Gr;Zd!r;6Eiqu.K5q#CsrVuorr +r38\n*]T;s8Vrnrr3#ur;?Tprq$/?~> +nc/Xgq#:a$r;>9EY42Jfs8MlmrrW2urVl`prVulsrtt_7qu?Tho>bhr,8M47'-/);bl%Jtt +n,EOhqtg0drVmB%mGbNmC8nkYaNVlVbfKe&,K@mNd*p=cb/hTBa3D`Qbf[nr:^[pH)&a8/%gf5^ +cH+,HaSX!SaT'6k_n2F?A7K+VBQ:Q$^rjg?b5KEW`r3s\`lQ6Dr5],``lQ6Gb!sYSb4s$Xb500\ +b/ha&aSs0cb0A2TaMuBFaN"2"4ibX_`QQ]KYf+Z&^pUl*ccO)JcHXq\bf7Q:_oBsPiU,:,](&gcd`p(X_ofs@dETq[b599[ +`rF-[apu\?`PKL5`OAuE7U;bPqu6WqrVlfurVQK]s*t~> +n,NFcrVlrrq>C6l#hmu/s8W)qrr;rr0DthLr;Zfop\jsgqYgHgqtT<4:a@81,U"0N,TnLIs7l?g +s8N&ur;6Eirr2rtnGN:kmbI$so^:o(rVm$"r;$-cqu6QlqYpBl&,lP)rqcJ$>i#/Sq>UBirVQTo +s7$!ks8;`mq>($fs8Mrr%J]turS#0.`5BL6d/*V;s#pAUpAFmeqYgElq=3@=ML^>1I=$9]F)l8C +H$ajaH[9s^G^OsfH$4=VI"$KfGC+RXGBIkDFa]"Xiq)pArVmN0q#1$]s8W#H`6-3erVZQjrVc]p +rVd&us7p]Hs8Dlorr)l]rX&O'G1??as8;orrVuNhs8W)tqu6ulea)Pqn+5l8eGfJ!rr;lop%\F^ +r;Q]nr;HQiqZ$Tprq9&**@Fk\rqZTms8W#qs8;lps8Vrqs7lTmrt>5)r;Z?Hn*Jp2s8Mrns8Voi +qYgHoquH`gs*t~> +nc&UgrVm!!r;?QnrsShrV5)u@s8Vuqs8N#t-N3uDqu?]qqZ$Norr<#prV>T6:*CSr*#TJ/*ZHA7 +rqH0es8Doqqu7B0s7cQlqu?N0T;/<\TVJ[No)8RcrVucorVuiqrr;in%fcG+rVL#,h>.*Js8W&t +qu6Woo`"dg$2aMsqY^Bmrr<#srY#8+s82iQ`5TR/_TC:)rr;omrVZ[>rr)lsrr<#od)3N4^V%># +`Q#m6_o0L2_n`t#_o0C-^qdec_E#BF^;.V&^r+.._Sj=,k5PAVr;Z`ns8;cos8;ospWgLla6N^) +rr;rqs8W)ts8W)tr;ZM0[f61%rr3#urVlfbs8Dp)s8MmmER4@Rs8)]nrVccqrVuZlrr;uss839! +f<;?PXei%nWgWGWquQflqu?Wos8W,ts8Nu8r:4NTq7jNmJR"arVulss82forUBi;~> +mJfEJqYL0js8DQPb\q!^[)0f$b0J5RaN)3;`l63Jai2B?b/)$<_9:*?D`8:E)&a;(&J>?U5h3om +c-=;MaMu7!`>HV9b/)BFaN)#I?=7;R?tOP_^!+aEb/qZoa99N%`lcO(aq)V<_8XLE9LZG3d)sYX +aNOJ'!R/^baT'Btbf\/Pb/hZD`l5d7c-kCq_o'^B`l7nrJ'5^S`m_W._oTj3\[9l1aiDBCcHt"f +d*0GH`Pp0[mbm$[lLOK3mHa31mHNs(m-3g-o&/aN;THa2>g7`l5s?aM#gC:n?Rpb/M9km^q#eF>u>'7>>e^+\]E":aMH +nG`Rhqu$Em#QFPms8V-;oDS\=r;Q`qqt^6krVuooqZ$TgrV?3bq=M(0,p=?N+!qpI.j?B?VtU/h +s7uEgrrW,qr;HWprrDimrs.';p$:i0jSSrV"o\H!qY:!Xrql`qr;Zd(qRh>Wm/?qYrVl]jrr<#g +rX8c$rr1hjiVWQNrr2lr')qq+s5_A@_Sj@2`r#B-r;ZfrrqQs!q#16fpA=7!W/#a!HN/@VG'%\F +H$a[UFD>,^;+X5K:KCb3CN"9=I"-KhH$=:KG&h\NIu:,;nF?PYr;Zfnp@eC^s8V`@_SO=gr;QQi +s8Dp$s7uCn?'YHfrr)l]rW`46[U0"6qYL6drr<#srr;lrrqud'q!6o3kjn98p#O[%rrrDpoD&4\ +rVlfo!r`&orr322*%2gJ])2L,!rVomr;Qs!q"t*eq>($hrrE&tqu?Zuf'Mkhrr33#rVuljp\Xph +s8;orp&BO~> +m/IIlqu$Hnr;ZZ/UqZO$s"40Js8Mrms8W)us8)]os7lWlqYpBb[:pj,)]0>2&euZ3,>Y--rr)lm +q#Cr;ZfrrVuKgrr;los8;os$iIVa:[J,]qZ$Tps82fqr;uuu +s7lTkrs\`$qqc)Ks8N#ts8N#sr=/f(s5qSE_Sa:1aSkl5rqd!"rr<#tqYgHkrr4\4cbI64_S*\" +^r+%,`l5^)]X=]-R@K\3S"H[g]tD"k_8O4+_83n&aMl0<_8=XXrVlolqY^@6r;ZNWcbRB=qZ$Tn +s8W)urr2rtrr2rooi>.Us8N#t"9/8trr2p+rr;utrr;utrr;utrr2rrrX&W(ph$a4rVuZmqu-Qo +rVuiq!<)iprr<#t'Dqb-maA)=UT:AnWhQE]p](6krVZ]orr)j(rr<#tZPb#*)S,_Drseo&qZ$To +s8W&nr;ZTgq>UBl!<2ut#lO4hTqA"'p\t0l!<)os"9/5rrpg#=~> +mJf9Hqtg9ks8)9AO(EXE`6--?b0.lD_8XF4ai_QAbg4,I`P]g?acT4+%h]Tp+qkS-$k4tCbL"G[ +_nXCoaT'6u`Q#p=c-F2Dai(Sj=CkcCC2]NO`QlcQbK7`oa99N%`lcO(aq)S5aN2PpEC@mnccF;R +a3+D&rlPDgb/hTBaSO$jaMu6=_ns1;gr2gd_T^9E`Vmeja3M]R_7.(qai1fpf#?"R`l?'?cI(%_ +bK7]Fh;[#:i9p+,o(),0lK[g,lK7?thq-Q1^:2)-eD'*OnFQ;IqtTdQmd'H?q=sF;dFHh;f$_UO +]Y__3bg+/Mai_6&\[U&4cH=PV`P_\o1WISY_naS`7ss.:_nj@8bf[oB`l?*>aMu<@aMu<@aMu<@ +_o'RH +rqcHirrW&go^Mm2~> +nc/Ufr;R!#pA=migXuK)s8;rsrVn2Bqu?Zos7uZgs8Vlmc[.2c+!_aS)^6FT+Xqlrp\Opds7QLol&frl(@Wm'@G'\CTH?OL[I"$m'T@3!"rr3,ur:g*err3,_a2Z'QrqZZpqYgHmrWi?# +op2RckkP,UrVu-]#QM5pKsgmWrUKmes8Drsr;Zcnrt=VXmHO<;l0?jls82ioq>^Blrr)lsrY,2. +rVHQooOo3d,Yn13rr;cns8N#q#QOW!s8W#ss7uZos8;lrrrhuRlK[F/rrrB$s7Q0bqu?ZppA]X~> +mJd1crr!<+qu?]SWi"JIs8W&rrr)jCrqufrrVucpq>^Kkrm,j=*#]n6,o.F<,TA"Tg@Y1?qZ$6d +s8;]l(B=.,s8VocSsZRIV4ss:q#16lr;HZqnG`Ifqu.*(s8Vll^qRRu^;n%>p\=aoqY^0hkfh,eh>[ +m/IIlqu-Qos7*R;B:?X8a",9SaiVWF`59R7a3MfPa3W2Weu`ahPj=aM>N(>A75PA87=@_T9pDbfn2Kn]:aMs2b5_&Br;;bfe#U3iQE2bfRcCa2@kq +rl>,_aSs0X`r*pX`rF#+_nOCAQ?#%)aiquK`lcHD`P^'Ge$??q_SO*mcILFbaMc3?_8+(8d)X2Q +i9]1@gZ7_jnEoc:nb)PBhS#SUXehr$Z`0n/\$E0=X0KFgiU,sokj7^%oC;DCm,[<\hsf^S`l6$A +d)aAKbKJP]\@T#\e]l7Z`5os<`PjXQb/hHFd=%3L_T0X5`lcQMaMu/]'["M:`lQ-;Lf$fDE7FFXs82Zk +s8W)prVuorpA]X~> +o)Adjr;QTn/H5MGs68Cts8Vuorr<#trr)fps8VrmrVl`ipu\JA,Tn6S*?QF@+snUE^\%O)$30Vs +s7cQnqY^9hrso&*rr<#rs5)W'oBti1g\q-Trqucqs60I^r=&T'R?a57qYg +mf37bs8NZ.s80F+\*a(ir;Q`rrr;usrr4;@qu$Kmq>'0M5p70e*#BJ4&fr2=?+]Y)r;HZes8Vin +s8Dutrr)d4rr<#ss7l;kSZ&BUS?T3lr;ZfpqY^?lrU9acs8Drsr5Xrr2ips"XNOqu-Hhs7!t?`k072aiD63^qQq0D.dWu +Ao)@/F`;>GH['XSG'7nHFEMDa[(sc&rkB\o`P'7,_8FCZs8Vrqs8DuprV?Hkr9;/@_)BP^Ls8)clrr*6(rVucprV?KnnbrLarr +n,NFdr;Rr;rTK)MH*P3)`lQ?HaMu0:`QZQGair5_cdBO`.M*=4*r[#h$ka$W6CuQTe^;j^bKI`G +bJsJ$rlPnubJqT5]6e1+@pWPcEk9!'a2uC$b5fTQa99Z,`l?+!b5]Koajk]dL5*sm`5Tg:^r+.1 +`l@tuqo/?MI`9@Ca[1K3bg+GT`l?9I`l5p>f>=o._o'-jaP"eabf[uI`4s%%`m)fWjPnJ:l/V4# +o'bf*lgNfLT:)=KYdU^D]XYA]_8*k$]XP>RXJh`/iTp""kiqL*p[7Y=lf6^]hpKNjcH")Eai;TP +f?CG,Xj5M?b/qlM`l5s=s2kkmakW5!>,ouh_oU'Hc,dusao]Z(`r=$d`l6$?Zq&+mc-FQ4aSs?^ +aSj-YaT'EYa;`+:a2Z$7`kS-Y@T$9/=^biBS&ik!`5KX7aNFM+s2lY*`lH$?`OQd*)AS1Sb.5I/ +cHseZb0IcCa2Q +o)Adjr;QZp!ri,nrr3/Yg%bUIrr2pKrr)ipqY^BhrVu`brPr_&,pjc_*$-1I*[agTkPt8Ps8)Zl +s8MusqYg +mf3:cs8NE(s8)/\T\TMFrr2pLrr)lrqu-Qjr;ZQ_r5NIt+X%dJ()Rr4)C/+Hjo=uKs8)Zls8Mus +qYgEns8N#qs8EN.rr;ok_jmKpUS+WgmeZq_!<2urs82?cs8Drsrr*H.qu#_\ggK:Brr2rtrr)lo +rW2usp](0js8N<%hdis=rVQTo'`S%.rr2rroZ+kf_nsOBs8W#ls8Dip +n,NFdrVo"ZrUJBQ=e3LOb0/&Rb/_N?_8OO;bh1=gh5XBf(*+>=(`4#)%MLgH^>-oTccF8NcH+&N +`6$'>`lQ6Drlc)$`Q#U&LhCL3@:F.q[(O;p`lQ3BrlXfQ+NhpN`P]^:b/hiId)\Ps9?52l_SsL2 +_8O=3`l?*@b/j=sr5a<+a2tthVf:D7b/VHBcd0VMa32u?^W4@-\[1#:b/ViPc,dZ7_o':1g$./3 +i9g"0n*]T-n++boSYE6q]"5Pj_8O@4_8!LgaN;B9^V%(`\$i6>fCnt2mdBB,n`KH5h:p]Hg!@^\ +ai)<>`lQ`^[BR?[fu;4Xc-42HaSs?k30?s?f6?Fdqr`5Ta;aND`Nb/h`C`lH$?`OQQj(D5 +o)J^grVm-"q>:3ln(dO3ruM+;rr;cnrqQNio^%Y_+se6S*#fk;+"/F_aRT0+rr2rt$NBr&q#C9j +s82WfrVm]5r:U*ds8U@6me#i3iVrlWqY^BmrVQQms760hs82d*o_S<8['k;Vs8N&urVZZis7-'r +qu?@mfOEh7r;?Qnrr3Z2r;50c`Pfd3d.[56qYpNnq"=U`rtak$K7&&hEcQ5@I"#H_,pF?I&I]$P +!WU0]n]/nmh>RBKq>LWn +qq#Q-@fQ<#rp0UarWrJsV3Th(Zhs[krr)lsrr;m!rql]prqud&mH![)mI'E4iSOM4!<2ip*rc3> +r;HQ`_(-[urr2fjqu?Wps8DutrV,H7+tA?LKoqt^0drsIcKl.ke.s8Monqu-Nns8N#ks*t~> +n,NCdrVm'#n\_$9q>C75rr)lsq>^HhrqQ$JNuoGe(`aA,()Io9,C@K$qYgEmrr3?'s7u]mrVuls +s8N#q%fQD"s8;ceP+n>=TVedHq>UQqqYL0]rr;rqs8W''p\ac;Z*S]NrVm!!rVuoprr;rprW<-! +s7uX!r;Z@fdpCr-rr3Z2r;?Qos8L]f_nj:,deN\=qYpKlrtbJ/s8W#I^rFC2_o0O0_nr0qAnPgr +FT-G9GBS+MG^k0bFEqkKH@1*dH$F@VI^Korr)iqmJ[%`$2sepV3BS"[/L"'s6osds8W'#s8Dlprqm;EX/`1u +WiN7lWqu\ms8Dror?)%;s8W#ss7F)U*h!$-r;-?krVuoss8W#ij,+j(KCSg;r;RT2qu$HnqXLe` +T:Ndiqu6Wqrr<#trqu`cs*t~> +kl1n_hO\2&]>r%mb=g!u`lPs?b/VlWcH:26%Mfa!)Aa/$&/5O[WQi`3bf\#Mai;6@^raU:cH!rD +`lcNMc-4#G]=PIPC0b:UC2]leaN)<@aN;NDaia1q(s:(F`P][7aN20?dqb\R?dm9=`l>s7`Q8%u +rlG,^r5\rZaN"5#!6Y;bIEKFScp5iU`mMrJ`Q6HQaMl6J_77M+`OT`5'++ceRd8 +dc9Z_qu66Pn+##6StMj[\A6,'^U^qd`m;i:UT;)NaiD94]tM"q`4NIgeFi;'lL=02oB5`%eEZ#H +bKe2O`PoX9c-XqG_7%&*cG[uO`l6$uaqVqH]Ml=1g<%@RaNDcOaN2NHbf\0'b5TTob/VHDc-FUe +HHIt-e]e$4mDoXWa2l?@`Q,s;^jH&c10Rg[>ZYg[`l,d7aNDZLb0%fF`Q-$=bK\/'&ds*%S9rr;ifq>:0orV60dp]#a~> +li/I1q"t*kfA?Q-q>C3ir;HWps8;ogs89?6+s\*R*#p%H+Wr=@WVZGcrVZZo%fQ8$s8;oprr<#m +s7uQkrr3f6r;Z]ps5E/9qtTO6nGiIaqu?]oq=smes760hs8Drsr;Zd#[mAZ#^A@g.s8D-\#Q=\s +J\B!!krVlip"TA5qs8Dip#jh$OlgO<0r6,*>!r2cmrVl`p!<2ur# +Q4:^KgioBRdrr3?!r;HZqr;?Tprr2QiJ +,~> +mJd1crVn8?hk$n;rqu]mrVZWns8W&to)JQn>TFt)+Vtn3+<2CO>H.Mrq>^Blrs&K"r;Z`qrVlfs +p\k+)rVQKjrr;orrhc'WUSO`abkh8:rquctqYC*\rr;rmrscA"e:PC2s8Drrr;?Tprr2Zj!ri/t +qu$j!rVliiI(6q*rr)lsrB1)Zs6[kF^q[k1lMph[s8Duss8N&toD8LYdEBYN^r+.-_RlIeA8?C6 +H?XLTG^Y!eI!Bj[GB%J=EHQR+HS'VoJpMTcHZjLVUUS@a\&H5%^W!n(dJs7?qYpEmrVuoss5(N+ +_uB]9rr2rtrVd$$nlXUq]Cu4'rr2rtnbs*ur;HTnrr)fqr9dSA^gd3?r;ZWmrr;lprr3i7s8W&t +s8Drmm_>j'V6$Sk[#X8DqtC$hrVclsrr)ir!<)os#5E6hj7N9Krr3Q*s8W)unE>6F)BBS?l2:MZ +rr2utr;Zco$NBu'qpD:1V4HB;rr<#trr3#trpp)>~> +nc&Ufrr<#srr4A7]P22d_8F:7aiMNDa2c-A_UI#"5mIl+((h<"*>T+u4G2&,c-FE0`Xg#(_T9X; +`5]pF_op$<`le;*&^8D5_n0YhB4POaBop*JaiVX'`rj?&b0':r"3Sj3`rVccjAQcXsJn +guI)JlKd^'p@@b]?&.obl>g1 +aMu6?`lH9Kd)eld_Tgb/VELaj"N:&/>Nbbgjt\rl+rZrl,Ynb08)PaMZ!*MHs"]@(G\) +s8D`hqZ$Tj!<)ZlJ,~> +n,NFes8W,p3rAsPhWOq=rr2rtrr<#tqZ$3fqLKk=+s7sL+s&!M-]HmSs7QBdrVucns8Dutqu?Tl +s8DfoqYU0frVmZ4r;Zf`j8/E?nE0KFs8Dfos8Mffq#(-ko)A[hrr2op&,l'F]AI)Srr;rss8N&u +rTX@]r<2Xmi`PLEr;Q[/r;Y0``P]X9f`(XFrr)lqs8Vfkrr3MaR=93qE-HJMJ9+OG.i\ro!"K#0 +!!O/Z&-N(M-l+'A"nhp."UkkdAo`-CFaeO\FFT+[jno&W%/p5#q>^9iccjPip\ame#5n+rO3qD1 +kPkAYs8E<%rqV5NfQYL8rquHgs8W&ss83T.qYg?irr;lprVuo]lgjQ9p$(qmrr3#ur;HNmrr<#u +rVuotq\T,.TDeffs8;corVu]jjb>',,U"3U++sCg!;uin!<2ut!;lcq#ik"3n,!(ap&+gh"oeH! +rqlWcs*t~> +nG`Lfqu?]n$,E.Hq>:3ks8W)ts![aDo`+]8+!M[E)]B_8+;uPah=gmDs82irr;Q`qs8W#srVccp +qZ$NnrtbS1qu-Nms7"!sTq%aJVU,#:s8;oqrVc`tqtg9^rr;rsrr)j-rpk9BgL&h9rVQQmr;HZm +rr)cooDK$orVlcmm8VnAl2L\^s8?a4s8UTf_nj40f`(^Hrqufos8VrorVQWb`50F0_oBO+^p/]- +Ao`*@H['jcIsZHfHZO1FE.!1L:2k9!I"$NjG^+O`J:)WgH$"YN_8O7%`PTR-`P_!@s8;cmrVuip +s8;o@aiNB7rr2rrrX&W(ora8!?hXHtrVuosrr;rrp\tj)rVZWmrr2loqu-ACXO_U>rqufmrr2rp +rr0*%*uu== +(*4 +nc&Ufrr<#qs8Q*tlAo8%]tVP.bKJ&Mb/VBD_V!:D"qM7W&el,o'akRi\]W=;bf%WF_SsR6a2u3< +`5Kj>`6ZHB`Q63HccsVN`it,(AR/VNAs'XDcHFPVa2Q!:aSs?Ra;E(Dbf\#H`PopHct9B+9YAct +b08,Pb07s+b5B?\aoKZ^b5]]cbrsCs`Q-KX9@lYUbeqE@cd0\Tft"Z3`l5X,fZ;C[`lQ'S +bi.R(h!==qna#B)i4GMPYIMHj`Pfa8rkq[GU7J-b_mFDZPc_R8_T'X;`Pom>_nWt![_hk:q"*_> +m.'K-e)f`Mccbe_*:dGVRFZ,"Z/aMu9k8Cu83_nj=3aN2?>`r4!S`Yuh9aN`&U +b/MHJe'HFiBrBR"[+!1=aMu6@aSj6`aMu3 +n,EIbqu6Tjs8N8]huE`Ss7uZnr=mO*,9J!N+<_pSG/3eErr)HgrV6E_rZ1n7qZ$Norr2lrrn$c/ +r9`e0s8Vojr;Q`rqt^'crr;Qg'*%n0r;$Bfrq`:MhSO71rr<#trr30"s8W)srVc`qr?_ICqu?]m +s8)cnqu?]prVulnZ\cY7q"k$bqu6WmnAWMb_o9mqrVlfr)?0R3s8W#ZU4IN*FaA1TJS6GV)@coO +!sAl.!"o>5!#-t!*tehf.Olhn#lju+"8`)u!>5J8&J6R-EHHJQDfg/LLofk7rVlg8rr<#sq"r4S +aSYi3qu-QpqZ$9^<8)-=r;6Nnr=&]*p&Fsiqu6QorVQWlrr;rsrtYM/s8W&trr;]1J(`:RqY^9d +rqcWjq>UEorVlNgrr3;ujR;R1mHs2slMgegrqH*`qY'pfrVn,Ar;?Qkr;?Tpq#CBlrqaii-mKu\ +,U=EL.3eWcqu?Zqqu?TmqZ-Qns8W!'s7b@>o]H2Rqtp?l"TJ>rq>9gaJ,~> +o)B=$rVlcqs8)coqs'rOq#(!gs8)^1rVZQ9,TR^=*#fn?,'C]pp](9ds8VuqrrE&qs7uX+s8Dun +s8;lrr7%(0RAldSZ1@no"8hrmrr)lrrUTpts8)cnr;Z]pr1K,*^M`rJr<`E$s8Dlqs8MurrVuor +-N=&Bs8VrqqZ$Kjs8W&ss8D\rKu7U%s8Vros8W&haND<8`Q\)Tr;Q]q0E1kHs813^`kf[8^V@U^ +B52@-H@'m\I!L$eI!9jaDGG%kIsZ3E@<6[ +nc'0us8N&mo`+sac=U:n`P9@2qT'SucIAj%%1X!g(_dGf4`l5s=rlXfQGg+4Sb/;B:c.@c(d]ca%ccs\Wc-=DPbfRrH +`Q#p:`lH-Bb/MKF`6?0DaN;`Qai)BMfV*]$:?_AcYJJ,lbJqT?qnYM.`P'Ilp[[hEk3VEq +f@0$6`l5p:_o'OCeD%12XjtV6_T0sI`m2]Z6ciB@g<@[U^r477^W=C8_oB[?`P]gq`>ZY4`QZ]N +_SjI;d`p(\Uik>78Cu24`lc$=sH[(j]*aMuNL_oTj: +`l?*Dc-=>KbKJ/N]u\= +n,Ejoq>UBks8VH@q#C9ls7uX1qZ$P!+XS0V*?6#hnFukWs82TkqYU^-arSM8Fj)W9Aq#CBlr;Zfqr;ciqrsJc*s8N&ur;6Nm +rVlg8r:^0gr;-Ha<8=::o_n^frV?BF`PK=3_<:[nrr2p2rr)ZmqrOf8E,9lLG'/4#,p3s.r;[Z: +!!<3%!"KPZ,UP)Q!!a\pAj@4:#Qau.rW!]7"9\f-#64f:*,9D3Fa\:FH[gsho^MbX8,`J^il'%' +qu?Qnqu-Efs*(s!AFfZuq#C^Bfr;-HnrV-3hr;Zcpr;HWps8)Wls8W)ss82ioohaZ!UlGEN +r;6NirV?Hms8Drkr##D0r;Zfdk4\H>lLrVuorp&G'grqXiQ/0H)] +*[2jK:b!>4S,WB`s7u]orqllqq>:0jrsS]'s5!>AlL4cQrr)fq"8quiqt0o=~> +o)Adjr;QWo#5e86Tu?^'rr;io(]+10=<&Fu*u>\/Rd^"Mr;Zcns8Drsq=4G%rVZ]ns8;Nhq>-PV +S"cUTZJ#-TrVuinr;Q]q!ri6"nbs:!s8Vloq#CBOA_c3_aT)#6rqcKks8Dolrs/Q's8;corVc`q% +/fi!rVcQjn57o7S,*$_$MjYUa25X7^ukOmrr)rsrr2rtr%S*Dd*08?c,[N.^kQQ>E-?SWI!KmVH +$Y!^Jp2!+:NgYqG^*e`G'J7XGBS@[H[:#;Gp%EaEHm"daMl$5b/V0:^qSn0q>^Ejs8Drps7kTja +liX%rs\f'qt^88\'ALRr;ZTlrt5,-s82ims8W&lqu?Wps8Murrr3#qqu6U.rql`ms8MafiRaods +82fps8;oprr2rprq?@*qtg +nc'0us8MojqZ$EURU:ES`lH$;qoBYtaO8X""qh@c)&Nj?dF$:_ccO2S`l6$5aSj9XaSs=#aMc!@ +bL+SNb.>/mCg:@SA9+*N_o0gHcHOB/`WF6(b43Og_p6]ObeM-C_cG=>>H-;rc-+/Jbf\',a"GBP +`l>s9c-FDPbJqTIa2cHIb/V6>_o0[KfgSufQA`5Tg;^;%=u_9K6F=(^Adirme#i* +p?9u`lH7Jl_8X@9cI^@WXgH'm`k]d>bK7`T@B7.=e^i6c`k]U1cH*lB`6ZWI_o9g;ai;<nt +b/VKAa2Z!;dDsJTcp-=5QZ(O&c,n/Ha2n8&!6G/ZpW36S(uXdY]YqM-cG[iJ +r5LY;bg"APcdBkJb/VBIdATMF$l^E0(D6m4(^q@;gr[:F][+pHaMu +n,Ejpp\t0hs8U[+s8W&ts7uX1s7ZK-.3]fW*?lmJIHpJ)qZ$Tjr;QWonbrOdrVllrrr35ehX^:( +jkfV.rrr8ss8W)trVlrop\XO\s8N]-q>^Kgoh=3'dp)YFs8)cqrVl]nrsJc(r;6BhqtKpdoDS[h +r;Q]mrtG>1BZ8V%rUp$drV6-+`5'41c2%59'E7q,qYBNbJTbsQG'SFj6kUIK#5\B9%0m" +o)J^g%KHD,s82`ZUTEPOs8W)ss8Dp1s7Q?',TIU=(E=Y5Hg:;(rVuoprVuEes8W&r(]X=0\sAqa +Uo(3>rqufprr;rrrr)fnrr2rgrrq>UDd!1 +FanX\H@gThH?aL_G'eR]GBS.RH$aghI<^"Y_8X=.dC['1_t=!+s7lHjr;-HjpWLS(qu?Wprr2p4 +j&k35M>I/Ks7QEgr;HZqrr;NgrVc`q!WE#rrrN&prr3Z1qu?]orr)llViT`kEm"FYs8W&prW)ud +rY>D3rVuAsU84T_WiN.qjS/]OrVuorrr2utrr)lr!rqulrr3Z.rQA[o*#9e5(E";e\ak.h)BJVO +s8VrsrVlcq"9/5nrr2p*d\3,#VVV4MrVcZnr;Qitr;QHjJ,~> +mf*alqYU0]`b]@^]ue@7`W!mWaT'BudDsk0%L`d_)^$7.AB;s@aNMfG`lQ0sbkT?\a;W(=aNMfL +bItZ>>[h8R@qh%>^;S%8ccs\VaSs3Ia;3(CaNi&NcT0P3`B_nrc,@`H`P]U4a8X.2a2Q!8`P]O2 +dD+#QbKRuI`l6'=a2Z6HceqU-`A,obbKS5Qf"/c3\@8`ldf%CpcW[@%c-FJM`Q8&$!6G/Z!Q`FXaSa0sbKe/GX)hKJ +nGiOfrqufr!qk17rr2urq#2*,s7uB_Te.<0*ZHIT,`DEppAY!arqZ?ZrW)orrrDrprt*TKo^1u" +mJm4_rr;rrr;6KlrrVlcqss^es7lTn%eBErgu-qYRed!]s8W#prVm$"qtg0err)ir%0$;#qY0jd +q>L6frVlfr'D_:0MVi`uqt^*drTV28`l5p^qYU]4fq>_63$ipD0 +(e/mW3#r52!sKf+^IgBq$N'l,":,>>"8i-`&Ih]VBRjoGH#eJ%f^8_=rVuforVulZ`Q7QFqtpEh +qu2;TflPC4s7lWor;HZqoD\I0YH"qup%\@Zq=sd^rql`ks8N)urVm?)qZ$7ffA>Ogli6bVqtg +nc&XhrVlg(rVHE1Tulm*s82cns8Dp8qu6?]o:.0E*#KG9,pJ6@rV6EmqZ$Kjrr2lgrrL3j +s7tH4USOZdWQ4Q/q#CBmrr2rsr;6?hrr;Qg!WVlmrsnc#=5;]cS=06RrVuorrVc`urr)cmqYps% +s7Q3]q>^9hr;6KlrtP8$[YWac`Vo`5s8M9#_T0[8lM:JYr;cirs*XhGs67A=^W4:/]!6itF*`1] +I=-BhI!]s^FaJ=XDN&XMF`r.WGBmQHDfTTVkirVuol +s8Muqs8D#qa70'-rr;fjr.M<-EQn4Xq#CBkrVlihs7jpDWjD3fq"jmaq>1!fquQ]mqYq'(rr;ao +f\YUgm/Qq\rr;6^)ZBU6rVliRXer5%Vlm:qZ2=7pq>^Kks8W)trr)lr+o;6BI=<5)Aa20 +*$DHSq>&;`)Bt4:0k$h^NjT:ijlqu6Nlrqufrr;ciks*t~> +nG`Lcrr"GDo]DBHL9\bC`Poj9`l?*@b0%iOcHt-s(C_?&',hVoCXLPLbfIWA`Q$-Gc2Gl`b5THu +aiqfKa2uB9Ti>]QbKnA8X3/H#a3hrOdq5E'@^=M7`6?KFbL"kbf[-USKT4.#daHUmdEp:h +da6.WbfdoEbK%cA_9^Ljb0nX#bhC7]`W!p`b08#L`l?*BpW39T(Wk"B^Vc^]?=-f3>@CKI]=Q"t +`QuHGb5KCFb08)Ld)sJJbFqQJ$lfrk&KVo/REE^rW"TRRFj.b8_:6l[bf.K=aNVlMb/qZ:Y$k't +<0$#6s8W&mpA4aYs*t~> +nG`dnrVlZjs8Um3rr3'!r;ZTl%/p5&s7Z3OGU=UQ*uY&&#H.@mrVlcms7-'us8N&rs8W#sipZ:( +l/(S%rs/N&s82]hq>C3k!r)Bbo);,Yr;ZcirQB<=guD3&rV-'sfrs8Dqq>^*Hlg!4#rr`8ur;Q?gJ,~> +nGa(!s8W)pr91#YkP5)WqYgHoqu.6,s7u]eo]:-<*YfS-+!;`(q>:0k!WN,krr^Hb +o:V_NX/2W,o)J^err;oprr`/pqu-Noo):6@qZ$Qis3,ZAgYbj!s7cQnrqucqr;$9jr;6BhqXj7G +rUfl^Ch%70eFrqBr;Q^4r;$Bmk$cc^AbQ-'rVb3`^<4F?rV?Ejrr2fp1ASu)_o9R1_6.ZjE-cPP +IXQTgGBe@VF*`7XEd#8sBR=iCG^=FQT[Zh]F*N1^H[L0erd%dsGBeCZF+AMAc+q!.`l5g-ciYnKus6ZtPKQr*CaQN6rp\OpgqY^ +nc'4"r;?Tpp?fh4@]$i\b/_ZE`r!gqajA/^cI9pC()7Ds&/GidLXF8fb/q]Kb0%s*b5KE]`Yce= +b0J#N`O3-dA7B4aA:1]&`l,m?_oTptaoKN^`pq,@bf@rOa478"f@eh>da5hLa2l9CcHFAWe^W's +e^Mdab1Y4oLJC94?aA&4dE9_TbK.TEc+[*#]hm>0bK&5L`P]QsY1(M8b5TK[`Y$hke_]Zao'Yo" +SYWU3]YD5#rl?,%aMl'DaJjGJK1CX+_oB[/NC?E^(5T-&_8F70_u7Db`k]F.`Os@(lMp\Mm-X6* +gtV>Ed)O&KahQ0Kg9dlocHF5ObL"$me(%%8d*ftOa32oceCB+07mo=$39AVRG\C>oL9/JHgW[pi +c-"5P`5][/dZo"-cbN6)e]c(P`lQ +nc/Re"o&&sma^J!rrVoos7uX1s7uZfs8VolbY9N-+sA!P,#?Y]p](9enbs!trquTlrr;?DqX00JI'!<<9=/jJ:(2('":!Vl^k"p=r2!s&Q=AScdAGB%hTJ\:@As8;iqq>^Ko +i5O(;r;HBis0@^=d9lG?q#CBns8)PZ>='f&;-m*e8l^qHZG*Z/F'r*jS^d6,s8W)rrr3<"oM"-+ +f4*\3rVcZmrr<#mrr<#trXo20s7Q6gq>^KegZn1mmdoYbrVm#os7lKhrr4/@r;?Bjr;Z]e_&t!N +*$\t:7j]WSpAb'ja!r)VR/d$]qu-NsrqlTjrr3#mqu6Tuio]Xcp&=skrVQWprq?AB~> +n,Epts8)`l`h9j8s8Voprr2rprYPV1rq?Blp\;p)-5mmE)'9qpdeNYrr;Q]qo)8Xbrr39%r`%M)hit#2r;Rl:qu?Zmrp.h&G?n-F<)lkh +=bsGZKni`=anYo8qu?Tnrt>'.e`:kaqu?Zf`P]F0`9$mrq>L^Kks8T6\g!aC&qtpEnr;ZNaQWcX&4&9*W5tFq6TWl)6O`Ff4FJ.1UqY^?iqYpL# +r:Wk@jj[_tq>C9crr)lorY>>1qZ$Tkqu"F+XK/:tX/VQWo_JO\rVllrrr2rt,5V?;s8;K&)]^"; ++CWA[,9fMIs8;o8,o7_irqcTjs8;forr3T0rVQWjs8Vo`Z(Re\_tX*/rpKf:~> +o)B@$qtpBms81c?>&1Ufb/DWLaN"(t(;n53f%/7#Y;R++(Dml&%Q(E8b0\>KouR-P+iqjKbfIuA +_gkm&@U3\dUVY*jcc*f>a2Q-Bbfn5L`PojfaC3*7`luWZ50_g;MilK<`Pp!Eb0ADde_JBRLL!>1 +4[2+mMFMfdQ?d^C9<6Rpd`Tt[aiVWF7ag70U=@?,e[WW:]WArodDj8I`Poj:b0AGogYM8eoBYK& +N2*_m`lPp0+iVUJb/D0?aj$lE7!:e;U;"jsaMai`*Fqi4OKGq)^VRhd`Flp+`59R7`koFhq>9O@ +mITbpi9A\8`5K[2c.(OdX0gC)ahuQ]PC(Ws9@D/+bf\/]eC]:@0cMc5:d[*%7Y$\rXeLDT9gr<> +[F*X[e]u=`c-FGW5M>&>9u>3$`l5s=b08#NaN4>&s2b)Ws2YVkaMc<>bL=MM^O]?er`'8->ZeAD +_99XAbPoZ`a?Ibf_8jR?b/^+[(E~> +o)B:#r;?Toq>^KMhuM31r;Zfor;ZZlnZ3rV,p"!J+WkF_nc/X[rr2p5nb)eZs3^H- +o'"p/s8W&ms8Vrmq=smerrW2tr9sVSs8)Qkdr!t)fhCl3o`+marr;i]`f"20Eg4)\h;@&Ies/m" +;'5r#>Fa8%UIuW(EqZ$No +rqufmoZYGFrVlTjqJX:0a^Y&Eq#:-il_dd!5%&;PEH-)&Dr]L.h:p`Ah:^>jS8M;EXQ9E]p]'s^ +s&.P'l&hk +s8Vji+=C[Gq"M?B+Y0nos8Vq,-m0i3s8W&ns8W)tr;?Qnrsel(s8N&fjQl*ms8W#kqu?]n!<2`m +J,~> +mf*^oqu#TWY1`[Ns7u]nqYpNp'`J(3qu$Hirpm-7)^-(6)B9]/l14?D(&n.2rr<#kjH-41V5LKP +p%\L`s8;cmrr`5trVlcqo);5Ys82cpe8=%'fM1i3pAb0hs8Vu_`J\).E0@WUgtpiCdum3i;-@C5 +;--S#`Urs"rVuimr+*t(_K#8KroV)7^r=OmqZ$Klrr)jPrr<#^]YqY'^VIX.EH5fAH@'j[H[L0e +H$OL]GAp9n]23?gH$ORWH$+OF]@NKH$adbFa8"L`59@'`kf^4^A.O(s8;orqu?Na +bfT;Qs82`gC;8]MAGlK)rqQHTUJYYc?#Fe(E-#)uin*)Cg=tH>g"!^*D,Y8Khu3TIs7lQm;V0Oa +O/DdRs8Dutli%q%s8VrqrVQQe^p0]3Xe;_gW:BcQs8Duss8Doqrqud;q#CBe9,f'ad/!FG*?$6- +pAb-c?m6L4p](9mq>C0hrt#,-rVucns7cK:URdsTir/fT!<2QhJ,~> +o)AdiqYL3k%/[t^@Z.e;cH">TaN4A's2b5[(;n5;`Q6?KccCnH#Sn0j)Aiu_a2ZBHo#;iob0S/P +`k&3OB3o"VC7;WGbKA/M^Ve"/aND`Nb/V?:`q.8bb0/)F_UPu%gZI!Mf@S!^^r=^Qe&\D)7nR9G +XN9#If@A$'6pspYB3\2,5tS'(da$+^_77WcbML!@e&feU\];RtYgCP>`l?!6_8XL?f&,6*lM:JN +lK"J4Z*VKd_8jX)Gq"BSaNqoHafpd`4A&(EPJ4WB_8j^Dbf\/F^V[q6aN_T6 +qs`q6o^D8+bjjK9`jrh!c.U[t['A'3behTRU_:mVdd`9D^8D;c7jFW?=c,RW?aND`Nb/hZHbf\)LaMu6=`VmdpaMu*@aiMiS`kem% +@o?0+9O2%C\&5c&aN_s.b5B=;a3;TPeC#rS$q%&@e"I6_'p?npf@`h3$3no*bf.QMdDN]5`QZTJ +b/MEI_o.I3853j5mJd.cr;ulmqt0o=~> +o)Adjr;$'=`7<(iqiBDs6kgNs>Q=s2$kj[sH?+7QFEiY=lLaoP +rVlcpq#Ag`i;3?NqY*kHhqV)sp\40qHX)kD7q?[[FDPo9JC`]:i8NYQhqm;Ohq[#D`/SJFVW[UK +abAO/jOq.lp\jgbr;?Nms8N-!r;HWirtGD3p&G'gs8)Njs6K4Ime5r4dd[58!<2uqs8N#q*WH$; +s7lWk]5H!kqY^<^:*CoupAY*edNKh]T)/<^s8W)ur;Za-s8;osrVuiriTTagnGiObrquctqt^6c +s*t~> +nGa$us8MukbbMoLr:pUC(p&Bgk*uc+7*?QAso(r@`rrE&rs8W'"s8Mlo +rso&'QCsqGW2R`/s8;osq#(-trr)fps8W)ts7$$fs$QOWOk\XHI^f1Qq#10RX(bUYWm08QhV[,C +gtpfDfA9;=BlJ$,D,s_T<0Q;;p\Op[H*Q2V^Hnr;RE*ahPO._S*aMBQ&'B +G^Od[G'X(7ApS`PHuW\o_4t+UGBA4WH$sp\FaMWeDKp5IH$OX[H?spaH[gEeF*i+SGC@BN]YqY& +^r"Ius8Duss8;lls3o$Fq>L?iohOE$hGWn>q!Q"D=HQfU@rZC,C2Rs=eDK*=hr!;I);X30hqQr@ +_22]6U>tkBbD=p1in1egq>^9is8Dp!rVlfro`"mj)u9O4q#CBnrq!4dVkgMpY+*<%rqZNlrr<#t +rr)j>r;HZjrqX*?c27J>s6rZ"*bFs@rUnGT*?^gGqZ$Tnr;HZprXA](rVQWgkGb#DSB(U,s8N#h +s*t~> +o)AdiqY:'i%-sQpG.#'"d`fkS`lS,$*6,t:ahu*\%2KBP<(*_8X^G`Q,s;_oBd?bfn5L`PojgaC*07b/_THL5"=9gN9:KfZ)+b`f*VU +@[OpXfA#-;hV[;Ghq6pgEcZPNDer3B?9ieQeB>q[a_eNIeO.j6bJCs8_R[5(d)XGQ`PKC1b08N$ +bh)%WrUK3bOJK8$^r41jaT':u_7-nn\WL-1F`0pG^VnC:`m)5nAICh3.XReo]Y;A2e'H1R_T'X9 +_og'E`O51,l1OW7k24k_g;:P7_p6o^fse0,g<7a^cTTq6dm2F4cGc8S4ap0i?ZL./D/jTIfAbZE +i8EMJgYLfDf@8:h\pdLMM9+2uUM8/]q8O5l`lPm;bfJ2T_Rcj\ +=]\C#<+T6f]uS+kbQ,faa>h>``l-$I`mE(r8ug+Vb0\Qr&en3me^i6X$P*YoccF;OdEfeH_8XR@ +aMZ3Db0@`$?:mmkRH+&?rrW/rqt0o=~> +o)Adjr;?Nns4@MOs8W&nr;Q`erYkh8s8N&SFrVbL*$uaS.(T6RrVulrr;6EirqcX$p](9Yi:6C' +o]6#Orqucprqu$[8,rAaq"p,JhVI;M;2DWrSRP`ZbMV(-jl5+Rgu7)Lh;%#Mhl:1+E,T`>DJ)qq +V.+2*][EN_i8r^.g@tK_aM5[2nc/UerVca,p%7hBZ%IFHF*<=3+;PCirW!Z6!!NQ-!!*-*!u+7X +gu)L,(]aU:"9&9.#pqjmo]&"a%Km(=q>`na#RCM7#o*UnDf9fDFFAXrb4,<.rqlTjq>0HtgA:jE +s5RJ>h;$ja>$+^V[F\A^CNFT8EH?"p`oPk3i8!&Ii8*PNrnnRKhrNM3P?q*^FJddOiS;"qp&"^b +rr2fpo)8^gq>:-j%/BSms8V'Jmd]f8kgTJ0"oeDpq>C6ks8)^2s82fprVcE!,p+D`qY^BhBd+iK +qYgEno`"ji"RY.8lJ2C=!W;ios8W'!r;QHjJ,~> +mf*dqp\1AVh!k@DrVuors8W&srr2utrquirrr3N-s8DoMEYf`4'HS)5,.7CHrr)lprY,81qYp?. +R\6LLWN5gns8Dutrr2lrqu6Wqnbu/\qu?NjOJCR`i7q.b[`"hK=c1D[gY(`JhVR&Hh;d>Fi8NLj +@;g%#Dffi.;pV:JBpQE[UL2j;gM5O?rPQ[n`kq*Aqu?]qrqcQm9\dG(a2,F)Lh^pTI=-?cG^"U` +H@($aI!g'VLWIYEBleQGH?jg`H[Ks6bgOj?F*W4]G'nR]H@C?=^RZIMfSC3"?4EH?"p`oPk3i8!&Ii8*PNhVR/GhVm)*O^([Y +Ff=$Phq>MjpAP!j!<2opnc&Of(B+1/rr<#sr7RmHVQ?i"WLE&MrVZNkrVm$"r;?QorVlfp)#F73 +rr)Gq*Z,sHq"t*cA/l[5p\b$jrr2lrq#1Np_kE`pU$MXUrr`9!rr2QiJ,~> +nc/Xf;?-LWfP+cc[E$D3b/hH;`QHEKb/VE?aN`&Wbf7WDbKnG_[oW\G'G;Au(DN=^`5Tg?bfn5N +aMu6=`Q$!AcGdi>KNqhj>]4_t_8O74b/h[&`rF-[b5]Q_`pq,hc,RrJdVt>ug>q-dJ>T<";b__W +e^Mq(h:^T;hqd>KgYq/KX(66jE,]r8@SY(8<*+I?\s6[ak0m5;ce,M?`5Ah'd)aS_cH3uFb0IoV +e^N[Jn*TYSR@pRc\A651_oKj9]t_;"_k1F4DgFWnXT$7d_o9^;^P3(l9kPr$Vn]dSe'u[^^VS"8 +b/_93`lt^-r:0FOp%[b"kiU.+_8X^Jc-XJ._;!GSbIC6sh;-dT9gqu'AoMg1EH?"p`oPk1 +hV-WAhV7,Fhr!8Cg>'uaKhk$%B:[]6i7+`;cHF8H`lQ#hTAaj/,S +aMl- +nc/Xg"oJ?"qV1$/rrW/pr;Q`erYk\5qtpEnn'Y#W-QXE[)cHS1rVulrr;6Bhrr)iurqcTmrsR!@ +o'u//q>^Enq#'+M7eQf]oX'G6k1o(MX+GGYa55q0hrN_LhV[,Kh;$fFj4iMIh,%j0G'.JAF)4V$ +g;]V3BSPI$gtlVqq!Z>>^Ve1fs8VrlrVmE%o(UUlH?O.OK4ubQ%gW48!<3*"!"fA>$NLMA2dG>+ +b;M!d!<<*#r;[6H7@a#:`%iJF!=&T,quC%($4$V3"pYM?;J^Q*Fa&7_TBYqCrquZkr;H34b5_28 +s5RG@io]+Ig"#-:hJZ))FEMAAEc,hqfA5HCio&hSgtUWBh;@2Jgu75Gi8!)Kf&>ZEjPu8ps7cQi +rr2fpo)8^gq"amg&,Gtss8V]SmIBZ7k31FsrVlg"r;$-brr2rorYPJ0s8W)us0E^q,[pTMrr(1b +,:f2[s8;Hes8NA\l0R[/s8W#nrr3'!rVlNjJ,~> +n,Epsqt\O4Z17ems8N&urVuorrr2otrr2j3rr<#qrqlTms6\-**?Z.:+r!cMs8Doqrr)j3rr)fp +rqcTnp?7a@U84]acM.>\"BQcS%FfAGZIg>:`Bj5&MGio/SIg=oA9 +FEDS9FE)%hdb2U0J7sYngY:Usg\UE[^r4@*\HuF4?bfmasD0'rJH[:$dHuaCGQd*Xj>'"q/IWg9gH[gKkGBA"UI!9aaH+:f._nO%,\]+UJ +rr<#srr5@WcGf\Ps8V7hgu@MReC`:/f@t+7CiaZ5F`MA=<7fschW!JQi8!)Bi7m)FgtUcFg#(Q< +jOW;MgYh"LU]:2jrr;uqrUKmdrr`5sr;Q]q&,Pk9XJi5"WM?Dhp[S7ZrVca!rqu]ns82crqYU3j +&?cin*F/F?rqstX*@7!Is8;He#Q3PYSt2[rqYpKsrr)iqo`'F~> +n,G?Eo%g!ODn*p6aiMQC_Sa@8bf\#G_oBjFdF$1X`Pp!=a3`>UYW!(0&JQ2n3R5R`b08)Sbf\$) +`Xp50a3DE&QBASmjN`QH*WaEPkGd*^%"E7<_#l.`4cBo9d_j42uFhUpW>g>Uf?g>LuEhqQp^ +Bm"Q?B6A61:"._0Nc8bmZd6n;cI1"\`Q6.Go^hhMp[["_ +ma/kl`lufSccNAqj2fNc[8#B9l/:(Bd+cpuB1?QSFDZ/@Ci3/$gYglFhVd8Eg"P<aND`Nb4!FOas5!I`Poj:aMYQFAm/&(9h\l(^:hn;bfIcB`lQBJaMuBH +b0'_-(!F\9^WP#i$m-3Te'uOcY6GRRGgk"/a9f\S>tn.*Phkm,r;Qirqu-9hJ,~> +nG`^krr<#Of_kaK!WN#rs82fqrV?F)rVucnr:p9boq3]X*ZZrPqtp?krVZ]ps8W,u!;lcq#2eA$ +n+,r,rVlonr8R]Hr;ZWjs4(oAiT8qXfA,h&AjP/JKh;[AFhrWnSh<=1-=1R +k^5E.$Np8+%L*P346l_/Sj4A+"9Jc7r;Zm"#6b#+r(gYUrJgYLrDgumSThVdJUhr*MQhr(!h!ri)prr38^lL=?5o'4Wkr;Qlrq"ajes7uZortPJ-rVD*n,TnS_q"OgcC*4cI +p&Fp[rr +mf*Ihm\co2qYU9orr<#trZ(t;rr<#trVc`qs8N&rrr)Wjo^\Ls*Z5eF_#=<2rqufprXeu,p@t\[ +Tr4Zd\b#Ups8DuWr^ZndrVccHC>7V(guHr>i8EAMhUgiCgu7)Ki7QrKj5&JPh;6q"CN+$2FD>i5 +DEuP*hs8tOf\kZJCYAaK_o0O;g\q*NrVulr;Z6Ojs3SKt`50?uH!tT5GBnL[G^4O[H['XUJoc$6 +b/_JDDfU#GH@($eH[:'[I88/DFu_niqOrVo@arVuol +fu*(Sq>^@kf@Sd5io/YHb;_q6E,fi0G&_S>@,'Pti7m)Kg"bcJj4rMNj5/\Pi83GIh;6oJhV-^b +p%eLbrVulrs8DHdrr3*"rVZWmrt"qpYH4b%WNW7fa85Z4rVlcqs8;]l!<)os'Dh\&INTUJ--Z,Y +s7p7F*[(%Rqss^kr:RgtR[pGLrr;ur!<2WjJ,~> +nGa[2s7=BRAsUBXb/VNEa2Z*h;dJKgumPO +h.UVECNai9F)Gn^d+d%*ce7(5gXJp(g;pb<^::f'bK@uPb/hTEd+n0@jRhp)mGkOJ\AQG1a2Z?J +aiV]B[CFPdJ1bbEB0UU9]Z8(3^V@\(`hIer@Sg<-=c0i9]tr(3^:qY1aMkp/?c1$t]=IY+p@e"H +jN$''`Pfd=bf\8V]!'K1_o9b^cdLM$i8*#;`\g)'DK9f4G&_M:?J4,lhV$ZCf@o?BiSEDOiS<8H +gtLT9g"P':g=+A4e&oVP_oBd?bf\)L`pq.Maoof*`Pojra>L]9C0sq89itS!N5W`\b/hZDaN2TL +aN2NJb/h`LccsSL]>r<1(` +nG`gjrr;lJgAh3OrVlicrW<#tr;6L"p%a+j-XcfJqu$Hir;Zcqrs/#CpuCc-lM1AY!WN#Sr^Zhb +pA]lOg#_8Ll.b.Rhqm5LiSEVQh;@5Qin`8Hj5/_Sf5GYMEcQ/DDKg&D8"%o]inNMQhU#O&psmI+ +_T(m=r;6Bhr;HWp,l-AdKQ_3VLhJOf%g<+Pq=!!30(!W2p-"q*M?FF/1RH\\9VpAFsiqa15XkfDlbqYg;eQJp]]i7m2B7q[$`EH?,? +Ec?2=>M@uiiT&bRio/kNhW3PLhr!ANhrEYUgudPMiT+J4p](9gr;HWns76-kr;6Bjr;Qcorr3T! +ipl[3q<77qs8W&ts82Wequ6WlrW3&trr*N0qG&.T)C0.ss7uYt-6OhLq!n@_rs7]MkMlL@rqQKl +rrW,qrqHGC~> +nG`mls8C9:XRc2arr<#prqcZnrWE3!s8Dip#4hJ9.jSEqqYp?ks8EQ/qYnO#Y+DSfZJbc[rVccR +r]pG^q#?)OfAb]Akh=tPi83>MiSEVQh;@5Qin`8HiS<;KeST5EE,]`dnSI=6HeGBnUeIscTkEg=\V_na1/`6J;]8,iDarr;o[`o6mms8JdXiSWbU +g>CCI@rlI)EGolC]Ej5&_SiSiPJj5&MIhV[8JinreNjknhLi*Y^Bs8Vons8MutrU9aa +rrE&tr=],,s7u]>Z*(+-Z_ajpmeHh\rVc`srVZKj!WW,srt4us)&Er-C&@r+r2UqY-FW[Ko)9-t +q;.s +nG`gjs6ZOjE43a,`W!mSa&qoB>kaNDE> +N*("$@qKkV^rFI7hT/sAc,\FHQce.@gZI)>fA#*9i8<;Lh:pcDio&SBi8WSMimr!dEcH)s8`mEf=g%>44nEnDnXM;m%ccX;Lrl]?(`jiabR6#(c +<,OUO[_^#)_nWt*a2Y3A9ik(U?q>%1]#)"oaM,C-aN)9=_oBX0^U2JimIT`:m+KPJi8`l5s=aMl?9^kQB*r!cca>G`R**l +&JYZ`9$bo(duFtL&spYYo#M-V]q&8!9k1Hlqu6WqrUg,?~> +nG`dis8V?Dn,NFcrr3'!r;6Kmr;ZNj%fcG$rVQWpqZ$?:E8^cprr2os!ri,qrVHWnrr2p%cL(2m +m,@U8rrN-!iVlsXqu?Nmq"@kJi8*;Uin`\PhV[;Bg>CWDi7d&>jkStVhVI8F@rlX2FDYu?DJa?2 +%RSsB0KdE9ALdf'4Gq>^Hmq=sa^n?RdrGB8"P80nlOqu@9/!WW3%"9T/\3MGj:n>Akn +pAbX.$8Z,PqXWBG.MNO+"T/6#"9\N$rsB*>Ci=H?E.sD)o)&Fd6i?o]ouu"as7H?k:T3+(hqZ.E +4`YabFDQ2FCiF968_r=]hW3JGiS3)IhUpN +nG`dirpm@ma7oQ3rr3&ur;HWop](6lrr3H*q>UrVHNjs8N!-p$n?CUSauecMRY? +qtpEOr^Qhcqu?Eb=PVcegZIAHj58_NiRQZ>g>_&EhUglEjknkJimqOXDfKf5DKK]1DJ`@`g>:uJ +g#&?dr;4j]^;%_]rVufqrql^(f"/H/a2Y0+C2\KKI/\I\H$XjbG'%qRG\*;acH2;\FaAC\H[C-f +H?sgcF*MKCdEBRFD0'fDGBnRaI!U!]H[L9eI<^3]]>DD)ah>U*n,<4brVca[p<;(bs7ZKl9W?n( +hqZ.A3GrnTEb]c@CiF968_r=]hW3JGiS3)IhUpNGmp]('gs82cqs7-*e +rtGD1r;?Nns82T.XK&=tYGn/#p\k*jrr3#urVc`pru(h9r;Q`rro57E)'U.Cb4u#/^*FI1=7H7i +o)9*ro +nGa*rr7u[-MSREZ`l?!9aNM`IaSa'Y`r_o0F1_na.7jl5:os7>U/X.uc._T)PnFND\Lai;9,Q<6sa +7oWZ!T>&Ch`PK:)bg+2FXbSQ46U50BG,)Rea2G^+_oKg=bfn2FaMl?5o^V,2q!74nl.sP'b0A#N +e't\6d*9&Eh)UhIcI:4S7Q>=.E-6#CG\h>8E_"m@gt^oCf\bB7inW,:gtWXqe(<@'gtCH2fZqs( +ACSfO^rFI8aSs?^a8j6KaSj*paNDWGaL\U"@9ZZ)>[C`\\A6,,c-=JTrQ,#]rl,hscH=,FaO%p@ +(D[u&#H?&#cD)3d$Tu5J`q.7X`l5?!:/+c@hY@*Ms82HgJ,~> +nc&dks8VuSj8T&YqYpKrrqu`nrr)lmrX\r(s8DorrVlios82]hr;6HlrVlotr;QKmqu6Tp#NFh7 +o'b`"s8N#rs5O#DrVuirs8)`f=ch%ef%f'3`j)8/U8bE;h:1Q@inrVGgZdMSgfAN8DKU#@D09iC +E`?FJb2h15EKKkjqS^7pc.r;'`IUC]rqcTjda@shs7ZHjN.%Xj +AnFnQE-6&>G].D>EGokpaQML=g#_5Pi8N.\K5".Q92JAPBOQ41It(p0CA@i/r;6Nil2ChcrqlTj +rVm<$qXsmghs^+*p$;>%rr33"r;?Hhrr;`l('"71pTP_^)BpCNAbGbl*?udV.fT86rX&N&s5W\: +h#IERrVlrsq>U-gJ,~> +nc/Xg"o[;RVsF3Yrs&K$r;Q`qrql`qrr)lsrr;m*s8N#trr2rprqcKer;6Hl!<<#sr;Qcrrr!;1 +T;&'RVRQ*ps8;]lr8@QDs8N&uqZ$4iNR$8+f\"`nZ(de`WNjJ!eE,HEhqm&>kM"qL<,uhlF)c/7 +F)Q5@;InLrr2ipo`'F~> +n,G$4^h-rX`m)cJ_8*t4ccX>K`lZEKc-",F_8F:8bf7QD`5Km=aN_iPb0%cIa3+D&!Qi@[aT'E^ +bRhq:_fK-k?"%Dn[(s]!`QZH_aBQX*`5fs=e'U@,`RW;be^;:"cETaO"16dam9[]>V4jf#c+O`PBI3_T1-beaNB4,q& +F`UMM:"7eEaMZ-8`l?*Bb/hTBn&YLJ435Rec,[r<]qAkCF+KEW,.((JO(`pq+T_i7Pg;.mQ5rr3#qqt0o=~> +o)B=$q#CBZht$gIq"Oads8W)ss8N#rrV?F&s8Mrnrr<#sqtpmkHCij\Uj'Z)->H.GorThVL`6@6@rV?6gs8Mrlp$ftTI!TsbHr)=*!r2g+!>Dg$>FF)PoCDK0i;C7<`.iTAhHhQ^K`Dh*S*QBI>lO%)`/;Hul9m.^JRrVlin +s8Drqr:9jdrttY/qu6WqrV?']rr;HOnbMYGoBP]Bs7cEirr;olrW2oqrr3W0Cb$kYQmEq)8Lbc4 +)Bp7OpAOR]#lOJts68h=jQudD!ri,sp]#a~> +nc&gjrqaO,]);R-"9/5rrr2p'rr;urr;6Birr)j#rr)lrr;6Kn#Q=Psr;Zfms8N#srr`9!rVl`p +&cMY+h3"P0V4apCs8;opr;ZZPr^$G]rqcZpp%G4e5".b%78d*.CijT)=\2Vh`o5S0jPnqMgrrH1 +FE2)5G]%G@C3"8NjBl,,>H.Jrs6IbK^r+t)rVulrrr7E0^Vdn#_RFl#DKpPXI=6HgH[C'aF*`"O +?d6[8aKnicFFAO`H$O^^G^4XUI",mfeAoeSVd".`GC4[]H[9mZG'A1ZH$4CXF1'-+_T'O2^%_I) +qu-QmrVbQrr;Zfqqtp6*NL\S05\k@[E,f`1H>RVDD/#Egg>M)FfGiYN?qbKiLm49iOHGSl83]mQ +8]9lbqtBses82fqs8MusnbrRfrr2otrr2iprt55-_l]rBWNN+mZg[nnrr)fprr;usrVloqrr2p2 +qe%/s*KhK`+[RCi,nV%4,kh6;oDT7"r;ZDrStM^gpAP!ir;H9fJ,~> +nGbNGjd9Co_p$?J_Sp@al1rPANO0#><; +_oBa!J0nr'85EYeQ)qgCa1f."a3W)P\AYIW8nC:]?"QWk\Al_,^Wb!GrPr$`aMuFdFQm?DM#g.4)/n_F`q_?HY[M?CM0!_f\YZ>f%[?68o8s.Od2)mPEA@, +5"\X7\CT6]c-48N_8sX9rQ,#Yn&YOKs2Y2_rlkD^1q^DOB3JD7=B8OCYJJB-dEThQ`Q$!Cb/M9; +`lH6Daj/C7)Aj3D',)`Rk@s8W#no`'F~> +o)B'rr;ZfOhZ*WOq"amg$2s`#s8Mupr;6BerX8Z(r;Zfms8Dors82fq"T88urVcZo"T8&hq#(-k% ++aY3me#l@s82fjq>UBnir8uXs8,^oqtg?j]ML=90eH*G0p%ZdNgc&qMfDm%]A2,qi8NCGEH5u=G +&MA>Ec?,BCfkfJlIYA!p](-Tahbm;kkY8PqYUb_tX30s +8W&pqrYlfq>1'i2Y6h@ofdG=F)c;DE-H,@Dfp)>G-BKQf>WJq +YgHls8VoprVlcno)AXg$2aPor;ZfrqY'X^rt+/YmI]o=o\TWJq"t'js8;fjrr<#ur"K&).3KjHn +L>S&-6OKU+ +nG`^hl)CN5qtpBm!<2ut$iL&)rr)`jq"O[arr2rtr:`> +L2V$JEHH&9DK'K6Eb\Zun*AWmrV?Kll,UTVaQE@!rr2our;HWp,2:#R_oBEW>&8D/H$XgbH$Xgb +HZsaXE)4X&cG[VHD/XlMrd+Ti(O1.JG(b-aEE(-&`Q>oSA8up@G^+L[GlDnQH$=^`Fa8.s^rF70 +_SO+Ls8Vrps8DoqlH/f"rr;ons7ZEeofR24DJX?6DK]f;DKKl:Ffs9Mf#388@ul_8R$IZ8&X\lE +PVtBS0fE=3p\Y!fs8Vrps8W)ss7-*grVccqrVca-p[k_lV6R/$W0kj-s8MuprVlirrql`pr"JcL +)'!#M,o7C=(E+/.*$^C=s8V]is8NK#rmIF1S#5THrr;rgs*t~> +nGbK>a`LpT_o^0H`50C6c-+;PaNMoZg"P*+aMYp7c-OPVaNi#IaiDHHc,\)RbK.iKaiDE?`Q$!A +rQGns`k$"r=]SsENP39O_o0a?b0&_bGK.eA_9Ks@g>&Ge,UY,m9Hl-MPE_#nNg,B==&ulcf\>^:_e?d)3lAa2uQQg?[JMmd]i-^Q>P3`Pf^3_oKd5 +^V@J!Y(SNJ;+X8c7!k`@^;n4(\A?5.b&P2=^8cT;E_o;.C0YME^rF.*cdBhO^VRn-bfI]@\C'g< +o_A%Bf\Y?(a2lEDbgXV0bK.N?bg+VXf%Jk2BlA$4GBIhGBl\$1Df'Qse(W +o`+pi.Js/7io^:@rqQ2\>j@c +DKg'pEY`V<46QD:-is4k`9_TD->r;HNiq>UCaqq-dVDf9oU66mQX!E+)X;7ojCeQ^O2)Q][Q!O-u,pP'0SP5!Co[og@7) +s8W&trVlcno)AXg"TJ;oq>:0h!VuTjrt"AZoC22CnCdjAq#(-ks8;]ls8O)5rr:q%-R"]MQ7O(# ++s8'T.@U24s8;ops8Vupq>Lm%p\t3miU,soo`+sfrquEgJ,~> +o`+sjs8N9#_5=X2p\k-irr;p5s7kr+ARMP's82fqrqu]nqu?]ls8N&ur;HctrVc]ps8;uuqYpL' +r;H9;R&-OTW3>girr)itrr(dSs8OA@s8;`lq4K0%4=DgD-'aRUQBI_uQBmYtO&A_pUpd4:E,9Z7 +pi$IUF?/O[s8)Zmrs%B'`PTjerr)k9r;HKls7sIN_8F:+G%>N:H?O[[GBe:VI<^-`F()6"d*9hJ +95SotH?FX[I!0j[F`r+ZH?*Mg_TBL'^2.S,H?aR[H@'a]J9Z?cH@1-fH,.P:`4a1,e,B4Ds82ip +s7"5"s8W#ps82irqWBkWEVseTE@,UAEHH,,;+a;XC-%ZJQB[c#Q^Ei%OHYcJ8h)nb1P>3`deNkB +rqQN`rW<#rrr)isrqud-rU]*RVQm>(Y+V6Vs8;onrr2rsrql^8p\t0K*?Z8[p6$d>(`=/0*[I'I +r;Z]pr;ZforV?HlrsS\oW2#fS`:s90s8;NhJ,~> +o`+sjs8PUXP@npA_9^?J_nj=5bfn,Gd)sI:;GE:oc,.EAd*U"\air#Kb/h]HaN2NHbg"ASaMu3: +`Q$0Ab0eARbJB`R?s-`CDRdU`a8s<%rlX6A-cX6J_TL$Ff%Prt2)cm94 +]tLV,6=F7p7TsmjO12^:_T9=#^W=7)]thCeP[%Eq>?"sX9m!;M^r+^MaLJgq^*ge6^r44-\b5gg +o^2/0hVZGubeqTHe'"T)c,RZBbf.`Re&s%IDK5Ys!HE&WD'j(;Ec#,Y846Bi30]_nP*:ojQ'%Q$ +R$2Ya,r@;'E7>i+b0\>Na8O$BaT'E_bWa=sb/_N=\"mV9>#S1!=')fQajA5Sa2>p_o9gC +_91-:%2]Y)gNO>B)]fb0&eTQCb/_NE`llTFa8*dgb0/#DY?+Ij@%QNXs8W#oqu-9hJ,~> +n,EFGgA_*qpA+O`s8N#qr;ZfhpEM"9,9h1,s8Mlpqu?Klp\Fjgrr;lprr3&tqu$Hn"TJ>qp%SIc% +bTn/l1*^*s8W)tr;6Bhi;P,(q>C9mr9HK:VD:P.0NTYTPaRl'Q^F/,Od;Aq5[eb=@V9>"EGp!pE +X$](6-B*%rVl[.Bg"X%3j).1q#:[EWp&Fsds7uWoqu6U3rMq.\,e!aK=sb=;,q>8\s7uWms +8VuprVu`n&H);#s8VZLmd/m3s82Wks8DZkJ,~> +nc&jnr2?+=p\Xjcs8W)trtP(t+!DpN*H1lUrqcThs7u]hq>^Hls8N!!rVZWms8W$1qu?]qqZ$?Y +TVSN_X/+5Ar;Q]os5 +o)C0;qW)QoRCpJWb/hK<`lcNJai_NH":c@_#uK!raN2lXdDs_Ta3huJa8X'XaT'C"bf\#G`P][7 +aNDfK`Q5s,B4PFU@pY;5`r=-\aT'EAa=#*H`R3&W_A:X^+?)G6<$s8\Q^*c"QBmesPa7:m?ZK=Y +AnH=-DKP\oIrfaD/u6_:cHF>McG$d#\&[(NbJV9Bb/V?=h!CfOnMA:ZarXh)O!aiME0[D^#"^r""+]AE#GlfR6c +cJ-[daMl9Dcd&].c,[cB`](r\`R_^P@r$(*F)c2:Ci"66DfKc7CMRp0D)6s.QBmPuPEVZ'T9tq4 +A2Z7X/"/$ud*pIbb/F7ul,`nIs3*^Nc-+2Ka250(?r9us:0LMa^WFRC`5'C4aNDTC_o'I6c-=S[ +KaeA%S_;CM%1jEl'R8?cbfe)Oai2 +p\t6mqYpTQjSo0%rVQNls8Mrqrql`kAgSB;,:]epq#84Yqu-?ds7lWjs8)`orrW,qr;HWsrVH6e +rs%uDp#P/rl2:P]rr2cpr8IW%rVuosnbrAQ0ZQ@83a>0nR?<`"Q&UfkQBIQ#O#:fqG]mnEFED?o +EY3;5E^RtEs8DuqqtJOU`5^a2rVmT0qu$KloZ)N8HZa[J-lE$c!!3-'rW!T9!sTN"?K:tSm.K:C +5SO2#!!39#!#,P;!<<*#-UZ2IoC2;C!es6BU^rs&K"q=j[X +rVQU*rSd&+mdTl5g].MK9p\t3eE[`@fbl.D6E[ahYn,N7Xrr)cnr;ZforVZQhrX&N" +qu-Qph!FOerr3#rr:L#>~> +p\t6mr;QrukG,$MqY^BnrYbb8rql`i@j)I%*$qQ^p\i"Sq#'p^s7lWjq>UNqrVc]p&H2P)s8W&t +rpmmgX/;ks\b?"#!<2rsiVk2&s8W&eqtrc5`&oh7=@6qlOd)/sNK0BlP*VGq2/[GXFD>f9EbbAg +F`2>=6H]6+rVuosqUEC$a5[!rqtp^CdBH@gToG]S4]G^4ISFNr=]aj%_/ +Bl\EHG]S+\H[^BcIX-6hH#dt#Z,45c\@&A2C3suJIWg$dKQhZeI"$NlH%WuA]<\cUUpTmrs8Mrq +rX\)Os8W)srr<#ts6)LdCN9;lrGa3%Ci=<4EH5l6Cd*0.PEM9"O-GukOHl2nQ"!3j2+p>.8G;oR +s8W)ts6]gbr;ciqrtt_7s8;cns8LfWZ)b"-Whc?Ws8Dlqs7lWnrqud;p\t3dD^6JRaSYf.E$\/J +m/QqUrr)cnr;ZforVZQhrX8c*s8W#XURn$Eg%YLGs8DZkJ,~> +p\t6mrVm?'n&AdA]#2b7aMu30.J_Y6uJBSPa7SoNgQ,qQC!XiDK9rD +CN=K;C\VmuE,fYIU;tO#aiMHE^::kc]un[Ea2uWN]>h\@m*FhZlKcESYI1s[c-"8N_8X@)\t!4c +?r9Wg8nCSNYf"Do_oTs;a2GU1bKJ&C[Zr[b@8p66BREC/\%Kf(^V\+?_na"#^Vn74b5U5H_S=?m +R`X%'`l,sBdCZs8bJqL"_`c&g`Zf),DfKiVH]s\UQ'RJqR?3W"Ru`b> +6!5a$0J+a&e&p(aaMu3=aN2NHmE#7K5KCskaN)?B^mSeB<)67h=(/MU`5p3G^W+@;aMl'9`m)KF +bf3B~> +pAb0lrVm)[htmBMr;HHj(]XBh,pF]X,ppY0s792:;5WjVs8W)uqtg[2\KNB`:#QtJ7!!3'!'*JON.6uJRo(2MF]K@YS +!<`W9$Msi'"oeQM#9cHgl1=N;q<"S<*!??D!s&B%#7hRh)]TnE13@JF=A(tU5f3*krr3Q-rT`/5 +r;Q`rrVZ]noJ1Q/pi7^#EH?5ADf9`?F];S3Q'[Q"R$a("OdM;sR"In9/Nu +pAb0ls8N<&qS&iHpA+UcrVdW5qV*/5+;Z+C_tsE';'J`1me$MYrVuflrrW2trVc`urVZ]lrr3?" +k*W$AVQd;_s8MuqrVtjU-NEo7s8Vk#><4W-QrG_^T-Z3jBEc5f3EcZ;"=d>29O-uB&P<=nlOHZ#_6X2*&3Zqp>oDeL\ +rr)l`rW<&trr2p1rr;roqYgHoqT#qDZ*1.1PeHhjrrW0!s8N#srrE&trt"o$W"p-fp\k-lqtBaV +s82cp#lXc#s8W#srr)Zlrr36&oXLNbT!\:lrrMlmpA]X~> +pAb0ls8NQ$ifRSp]Z/+:`l5s;aSs=!c-3['&/l&m$`)8&atQ`kJQ[AmeqZDP=n``r=-:aD\1`5TKuWe)R4 +:cq6E;I!+i]Z7ds\\Z5`aEbV>_T'[jghUV=RY_8X[6\?Dg&R?a,(NjO^V:-h9C +/YU>4ai2?BdDWK@bfIZ;^VS.?dMc_1DfKi>EGoZ1Df9T8F)Z#7F*)M&>*bD=O-uB&Ps1@tOd),] +5Z]0c.h,3@dbDgaaMu3<`lQD(c(s8VijrV->B~> +q>UWts8W)srr2pGeCXa#rqcHjs8Mrrs8Mrmrdl:;.3fldq#C63,9e9Z.WW>up%SLbrVZZorr`/o +q>C6l!VuZmrs&)PpZq)#kPkJ]rr2p!r;6EMr[.OBb"hV?2'b"P7:StPG*SDWRl6+gMjTZqOd9!G +DfBcCj7iKJrr)`j=K%=0>#8F/F*(GS/L2DR'*e@7&eQ$/ +`U)p`rU8lp3#i,&$ksirqZ$X2'E.tm#VA-lmeQMKmG_M"%KQPA!"'A]00i--;,9qkF-NrRd`-cr +meZ\Tr;Zfpmb@U7rr<#ts7uTb3Gis:ErU5/G&q\DEcQ5DFDu5.3g>elS!9,$O=+h*R@08)Ma(NQ +.jud$o0fq[rVlcqnbrRerr2p#rqlNgrVlg*rqucqs4HW'mIBZ:c2R_ErqZTirW)orru1e-/14a' +qYL6ks8Dorr;?Tlqu-Qmqt^0is7lTnrsSW%s8:g?lf%mDq>9gaJ,~> +q>V!)s8W)srr;rhWhnePs8W#rrW)utrYkh4r-fV)+rqOOpAOg**ul4F-Z?]ioCi4`rquctrqu`n +rtYJ/rV6Emp[Z.iVk'rpanYc5s8MurrVtjU-N!hd:@r!N+>QMT@S/\(Pa@Q&2Mm]WR$*l"Q;pk% +E,fi;G].J;pi(7oF)*brs8Durs8W&J_8OC[s8W&srr<"#Ul'G+?#4VENb2mBG]@YIG'SCbIWTpS +=2i\4d*]bKF_GoEH[0d_GB&@_I=c`fF`DVQEGeXk]>:k[XK>W@Is6*hDgQeOE,B8u>ZOd)ApKE7 +YcW#2qZ$Qls8NZ0o]#oLrr)lrs7uWc3GWeXqJ[j)EH#i8E,fr>DJrlAP)tipP*(of-#&C+R$*_l +5$_;<,UA-87'ZLcrr<#ts8DKe!WW/ur;ciqrtbS2qu-Qnr:I.uXK/S+X-*&Mrr;cns8N#srrN,s +rr36#o-Y_cs8)Wls8W$,s8N&ur;6Elr;6 +q>Us(s8W)srr;N6E+#qDbeR8at*"`>_cd^C<"q1kI#Z.,>bf\AQ_SO(+`Q$!A +b/hTA`Q63IaN_l?[YA$rie9C+6[4`5om:a3_`:]X5Q#c,duF`ju.1&H2ZR$mo/!ApB6)UT(l>`lHc8kNGSI'LN([&9^o[*ln4be:?i^<4[#KK=6P<)?k6HV'4/\%Bkp_6fP\Ea1se/1ND; +6;D$3KN)s@fZD+Lai_iI\CAgH_Sa10`R3*W?>a\&F`VVDDf9c=EH#o;.<9NODfB)EPED&tQ'@Pp +->JU/QB7;d3a#E))&7/B,)F:\`l5p:aNDZoaSj9\a?@S``Q-$A`PAck@oQ0% +q>UHnrr2utrr4VJgtMf.r;?Qos8;fps8Mrrpa@F.*G/Snp&F`,/0#lU+[^u(4aiNZQ9R?YOd26!P*M1b +@!-L5Df9W8E-$-sE[l-NF#WdkrVulrr:ngZ`5Lg7r;-?gr;HG!j5]Ucca0'o@n&:+5;t)6&H)Ss +'fSkOp\O7Vn(:&]%KHMJ(`t+0!!!'#%i6N+!!!3E1njF0n+lS?LGTPF#RU\U+sfTgMm(4QhVRSk +pZgJ+G.@>?qYpL"r;,m>qYL3jrr3-!rq]'$qJuUX!HN2ZE$B:BF)l2AG!qO`QBdW)RX$nOPF.?' +NfZn<@k9;mM*Nfcs8Drqs76-jr;6Ejrri?!rVZZos8W)urs82Olg=E2o%Ed9rrDokrZ;+7rVu`k +RO3^Xs8M`lp](6hs8)Wis8W#srVuoor;$?krrDinrs.WHm,[O5rVQ6eJ,~> +q>UHnrr36&s8W&FWNYsms8W'#s8N#rrr*c-,9IX9@9I@;s7C4V'c\&0*@2qurq66hrVm!!rVQNk +rt,/,qYgHop@+BETVSTikPb;Ws8N#ss5Er)rVt&,/Yb$H+';oW5!44UQ'OWoJ!$"^Q]dVs0jo-E +FDYl5Df0Q8q/?OYE,RQ(s8MusAc'rm`Q.?Fs8Duss8W"'h:h#Dbd<^g?qjKtBPMC*IZelDM"4S\A,Yl^:LYR +MK6W5s8W''qu$$Gs8Drrrr<#r"8P?$EVOJQDuOW!DfB]8D0'ecOdVGtOIV\^2`-Y`N1c/k8QfIM +.l)fB0^o&@rr2utrr)Eerr<#s!rW#rrr<#s3r]0Yr;-H>XKAM0VlQ93qY:*jqZ$Tprr<#trr;`k +s8)SX,(f=arqHHfs8MoqrVlcqrqufps8Vrnq#1j&rr)lln#W%MT>LR*s8Mlop]#a~> +q>UHnrr5^ls8VGXB5=oud*9_N`QHEE`lQBPdL?j#%Sf,R`n&C6((V/f#RV.QI+ulg`Poa7`lcHJ +b/hTA`lcNNc-48>Yub@7=_;TR_nsL7`r4!Y`o>&fb0/8/+r6=g*un9e>WOihOHl+r3.I'UQC!c" +Otg?eEcl8;E,]`9F89g*E,fhEb/M<>`l?*H`4`jkaO&,MaN)<6V#XFY5r()C/2Jk/4%j=8OK#t/ +_Ss-dHSo@u7QF"=F#9,m]sb"rB8!S6`l5d"IZ_On`k%jS=CP*!@:s:MJ?$)t`3-(e3[upK5tkBk +B5M-a=_D,DV<6@Ucc*l@b/:jBd*0AD#fOd+e(QH^CiTDr!-A-Z!-%pU,B.XCEGfl@6^!n'QBRr1 +GW7RDQ&;/kNCmA`.4?`m.2'_Nb5T?_`lcNLb4*LNb5]OHa2Z*ucp!^WF^< +`l?*@`l?*Bcc=)N`6N]9>JS_/]u@_-b/200\\?J +q>UHor;R'%s4lE$s8Vferr48Aqu?]oqt.BE)^Qriq>('coeI=+,TnNZ+EcZJID>A2aFE2XeoDJXes8W#mf>PYIkl1S]@/g3*roS%go_n=NoC;/(gV'M@>W!Q.!!WE6 +7ucp,q>^-LTK4(q!!OMg<]h?%"ptY\.O5i4!!E]_?g7(Pk3h371*6r+!?N^KbhqUNnF5f1mIU/A +nZbrXYNtZOrVZZp"RY7Fq>UBn#5nN"l:>o5qf;^Y.<0ENF`_\FEHH;BD+eW/P*hT!OF0>cCm^NR +SUBjs76-kr;$6hr;Qlur;?Qjrse/Zo(;G9jO!r,qu$ +q>UHor;S#@or=h8pAXpfs8Drrs8Muss7N`@'HJCOp\Fj`o.:Li)]'[s)%7Z0g\UjIrr<#srVQNk +rtbS2qZ$HlpW\kpV5gH8pAP$irr2rtrSIN$s7uUT7r'n#1fIU020bFSQ&.@fC65!LR$!_`1hq/R +CiOH6EHZA +q>UHor;SVQiGD_\]u\78bJVO +rl,hubg+YY`OUq*>ZP*@NP&fb0J8b+#I@X)`:]%/MhL2PEUh\7V\$UP*hAu +I5G\]Ec#i;EH68ED"qu_Dg*\P`6#s?ai`)S_8*Frc,RbGbg"JW^5Dt^+s.s[2b..^@Sfft>B6FF +^!=`m?U7^K2*O93B3C_4\?DB.:f=:2ahb3G6V+/t`5Am;3-8J-;.F)u;:8njNPR@9>% +HU(&7Q'7H%P`nC:@mi*r68Hd/b5T?_`lcNLb4*LNb5]OI`l5p:aiVfMah"p"?;scu +`l?*@`l?*Dda-.Uaj/TKEl?2GdDsMNdEBJE_njO=a3VK?cc!oKq8`ubaN)H?\pRLR=DcU[oDa=~> +s8N-!r;HZqrW3&urVnA&fDkmMrV?p1@;=S_srs88i>,9n6Q*?lXL+se]9rVlfr +s8N&u)>s:)q>^Kns8;osa7AlnkMlOAqu?Wps8;lps5EtWr$D&f8k_?9>\>iGQ&qGuPBB2^BpXjH +Q'RYH9lk2lE-?5BD0'Z4!#\>8o`+samG(5q'*&">+=t8g,SLFn-SV#U('=O:"8ZR$*]&Oc;P53%7m#I676%rr2iqo)8ahqtpBjrrE&tr;ZcrrrDrqrs\#Xm.9W2hs17AqtpBk +s8N!>rVlfos8Dkfd/O(Er;ZWnqZ$?is8Dioq=MnerqcZnqYpKo!<2ut#lEWFmbIjBrqlBgJ,~> +!WE#ms8N!%p["lTr;-?js8DpC6krr`5tr;HTo +)#jL2s8;c[QEI*_V6B^ks8W&srr<#sr;H-as8Vrprr;uss8=;Bom]J'3'gVT0eJWNS!9+Z6:YaV +NgH#sP\*X2DK0Q9DfKQ4DK>PlF)Q,644XB1s8Murr78g)_Wh!tr;HNjrVcZEG2_E3gXFWsc-4>J +`4p;*GB8"SG%.8mcd9bQaAm2'I=ccZ<7>#lHus@N?_:2/I"6HgF&Jg?\@SZLUHs!BFaJ1;al2.1 +eBuRdbJ_0.];J`?^qojHrtkY5s7u]_m/?k^rr)irq>@rrCiaQ7Df>Sn.W99FDf0K4E,'N8CL'Z! +Q'@GrQ!m6c +!<)iqrV\YSrr;rdc"C%i`lZNK`P][=c,R`Bce:bu'Ga$cccaMZLC4k:(`*f%(D[`!%bT.PaiV`N +bfp(-s2Gqtb0/2T`3N?T>?4gC^r4IDai;<>`lQ6@`pq.M`qmdU`rF+/b0ADff4[-/2*tMZ1bOrL +QB./N6:YaVNgH#sP\*X2DK0T;E,oc8Dfb_oI<0UL0X&U>b/h]He]G\BZcg_9`6-9LcH3M1!%f*$ +)Bgan5=.k4@Y.ZtS$U2[U-D7K5/]6,pm``lQ3BbK.Z7 +SR,Am=&rX0Ge;&;b/VHBaMu6@bfn>S`llTWGG!%*ccXJMb/r/M`PTR;e'?(/Y0+W&a3)R%a:-54 +`l?'2P[I-_@BSkds*t~> +s8N/tq#:9m!rDfnrVlr\eE-]04T,*Nqu?]ls8VckkU%Gu-)CS>s82Xs+se^Kjs6i.V4'k!"93jK! +PF.StP%IEj;3mB6QBmn9=`JM&EccAFCi+B5BPMU,E,]l=GBJ"*T)AWfs8DljhSd@Omf!%[rr4hS +rV6/`O7E,Is8;]fnFZ>Fl.;4_+9i)o5Mc#1o_@[S1*?c$!"C85f75q.%i.>lc:K&ZrW"5Z3+Lk/ +n*oi$;)o0t.Rgl8nbrCco'c#9rUKX87ZrO]Ph>[.rVca`n`fiEs8W)urr;b/?#4Y%EHQ2@EaE!E +:0;@PFDc8BEc?,65a@\(Q^*\&@SpBuOHl0!Q'tWV:fq'X1c[Vgr;6Nlrr;Nfs8;orrr;io%KH@u +q>^KZjlu4&o^U?.rrDuoruV1;qu?]ps8ViXs8;`nq>UEkrVZTls7Z9)K./+!rVlimrW<-!qu-O" +hWO7jn,NFcp&BO~> +!W2fjs8W')r;$3-WP8-$rVl`p-MdZ@q#BFt)''fls8;omp/W+R(a0qB+Vtt9(*h!!s8N&ss8Doq +qYq$$s7l1F_bT&EG]T2EH#r;DGH\us8N&srqbHh`Q%6Arr<#trr)lqs/hLHeCE.L +c;;L#_Sj$rQXXuTG]?Krc-F;RaJi?_G^b'aBNjP_Ed)YGDb@`?DLHn]H['FF^Tk2OWi/d.D09r< +^>Ro/eCMmibfIZ-_73(A]tqMYs8W&sr^?_Sn,N:brr)iqs8$J8CNF?2F)>o9?!Brr=);erD09f: +DK9>QPEhK"PE84A:g9 +!VlWms&T*pqY9ses8VcQQXk*F_Tg?L`59U=a32T>eC#3M'b?#Mbg4Yh6P1.J(CLWe',hr,(U)?4 +`6#s@bK@oKb/hTA`luKN_MDGsr(?bf[rE`W!mIa99N%`Q$!ub#$0sb.l'7bgF_nf-m4B +;DT[k>W-\dQBI>lAP?0%Q'%K"Q'Y?ME,oo;F)lA$$6^T`SZB,=dE[A\U8M_:(+ +_8X2FC58:.AT1.^nC%bNRX'a2Z-?d)<]Caih]EbKS/Q91ioC +EccJBFE(Gb8P<&uD/j?4s)ATgF([_'QC*u&N^I/K=dG&1rfdq]:g$Lm=t(pJ+O\`^b/ME`a8j6W +a:H80`jp+o=]SL'=\c?@aiOG#4N5=]b0/,Vb0%rJ]$SXAd)!`G`Q?3=_TTmFU2(JUAB`'4aN`&R +`lQ6@`llKBai)-+Db`l-LueI1s8Vlm!<7Q~> +s8N/rp\t0ls8)fprVlrPchIG="T/&kqY^?m2#71FOWtqj/b]#?qZ#;#,TA,7^k!^W,9%mSf_k^F +s8Durs8W#oq"XdbqYUrr;QTnnc&RdrVl`p8G`Aap&FJPCFUlH>@KfW+deLY +M`[)B7VFrKRZ<`"PtPG(F)c5=EH$&H-u<"F@6egTDKBl@E+DfAs8;oqr;#6g`5V*@q"k!i2#d1J +nBcTRqu-]0[q\!!!-9/2cAM5<'l<1sFNL*-4(b\:>4t" +mGrU^/LNQ`lMgSMs8D`bo()\We6.liI=@4*o`+mhrr5CWm.gMYs8MlpqY`3_G&VJJDfg2:2C:7S +:O%#(Ec6#?EH>hUQ'RYuQBsaN4aW/YJs)7]PFPNP?=d@o0KrORpA=dbi;O2_p\b$js5WG2p%%h3 +n+cndrquWms8N#t#Q"K#rVuosqYpNpp^=Wd-Rp8`-78H\s7lBg!WW,srrhTHkj.-ss*t~> +!VuZhrsSf)r;5faWnI.DrVcTm+oMB9M]3KO.J*?7q>]"l*>BZs^ORFN*>KM7eGB.As8N&trV?I% +p%"EBW2?W,mJ-SUs8DrqrUKmcs8N!jrVlisrqZTlo`+ANBdbE>>%'TS+-r.UM`[#>6tSNCR#I;o +P=]"uEGof5Df0W@->HS>?TrCLCiO?2C1'd3s8;oqrqkQj`Q%6Crr5^krr;`ms5f93gs40nbg"PX +`4*Lq\P-d_Df]1)c-sbOYukdbG^b-eD-5of??'q#7_u`=Cj:;TGBS"F8$ob0V5e<L9ks8N#ts8N&rs8)`haJGDuV"4H]rV$8A~> +!VlWms#U,Tq"jmbs8Vc8H=N&I`6HNL`l,jQc@$QC%M7".bfe_U)&3PnQD%as)'9_9'YDi9 +^r=7:bPfR$aMu-:b0%]@@q/S;?ZiKc`lcWObfIc@`Q%Dg"NJF"`lS/%;96eu`PKmC`n]*&=rSSg +mMsPY,5$Ec?#9E,TiD-YleB?pAUPD00lBC/ch/c,e#KbgX_G^UVM4 +`PT^9_oB]FeA@Y.,ss".3C6A48lA>b@Wt[d_?#2fd[C!Q`Z\pG/8If3iME$fN2N,/Z +_8*UWJh;.T='^,OBVC824!+n?%Nm;a7SZ`VC2>N.h='UVlds8!aMuBNa1f[:aiMTFcH+9D<-<;* +HZ!hHAM>5[8PF8IEGo[nE[>[FBKDHEOcYck3b^X"MF;rTNfoKl9i>2)=Xb[L4J9sCaMc':i5e[; +`kJ$T@9-E(<_e=c_og'?`l5p:`lQ6GcHFAUb/V]Pa2cEFaO/Gga2a-G$lBTn*"^6+`k]pHb/VND +`l?0E`lQ*;^P,QR:28GTrVuWj!<7Q~> +s8N/rp\b$js8E6&rr2rqf@9d!s7n_Qr;?Nnr;-H`.O62aIf06Cs7_*c*@!93q>Kr&*uuLTmf3:b +s8Duqs8W#oq>:0jq#CB]e*lhnhtI'L"TA8qr;QZpn,E@brVlis9E"n`s8)`pf/e:22E,)J>q%^\ +P*2/"23&WBQC!l#5\4tWEGp&>F)Q&$0d1%#LN7HSF`_\GCGkterr2inqVT90`9dEtqY^@u +q!HG)>f,h$pA!q=m/$AFp>s^p5VGH[pZh&9i@?W#$NU5-$8"1%o@$H/:R9_a;^2JK"U>A?-;&(% +j7(ou<^es\nFlVKs7Q*bn+->?d;",SH?+:ie+E\=rr2p"o'H2Mrr4#;s7uG*>]aq,C2\#Z4B,cm +Bk):(D09uAF`MM=2ZAs_R?i1aBKVHH7k9pjS!/ne:gREt0.S_-Y?(]'rVQWSrXJf$qtpEnmHU^!r;?Nns8MurrtkJ1rqlQip]'rlKIJAs*$c[R)^ri+pAasf!rN#srVm$"hrX4[o)F4~> +!W)`mrrE&trsSi)s8CHEYOqShrVQQn*rQ'9r;Z@6*?-,JqZ$HmomR\n*@p^VrUOY@(E+Ucrr**$ +rr;inrV?I$pVE)jV5^ZKpA=acrVu6`rVulr9E"kfs7ZKhrVtJ0H7Lg/?W^P]2LCOKQUE]kO>Co/ +MjT`oPEA%=E,ff5F_u,8Dc\S6@7l5mEG]c8DJa#Aq>LH;IcGRB2o`+sirr2lpnF6JUs8Muqs8;_0>B=Y%BPhWS4&]QiBOZ($Cijc< +F8p2(C,D-R78ZlPF@YpKMPiW7P62G/$E"Rs8Dfoir8rW%K-&!^9"B=W3)nhjno)U +rr2pWrVulpqu-Qpq>^KmqYTs`nu[Ef,p*g@)BKP9a8G]3rr)irrr2rtrr;rrqY^ +!;cZos8o>DK9W6=>1k,987G,DK^/CD-IUqbPoR;bgaeI]X>i) +aMlgQBQPUAN>g<6n":^R#m8Y9jM!l.O-/C(6^N*d)j5LiQ2&A% +E#lkH=0fR9itD$WPcjWaSj+;aN;WMbK.iKaM#[4_oU0Mh:Im(%MBEf)A3es'VNI[c-4GR`lQ6@` +lZHFa2Gs:TN+NY?H2I2p&BO~> +s8N/rp\Xsis8N&u"T/5bgZ8A6,l[Z;rVZ]ps8)]g`[)]K,K0QYs82@2/0c3hp&4X[=W]"5>l=U$ +'`S(2r;Zfpqu$Hns8;osbNA9\lfe"`[nSNn*h&rVlfr7e5pBrVulss8Muhg-BOtFE;_J +?ntGo92]_HH?=.FEHQ;AD_dQBQ^F"1=C4deO%hZTQ]Rc*R>=(5@6Hq0BJb,(qu?Qkir0#Wqt^3j +$f^[Bn+?&+lMpe^s8N#tr#l";rr<#tr;6Hks7cBfqnI#"-6j]R.3fu\)^HMXq>^3brW;rrrqufr +j9"c3m.:7-~> +!W)cns8Dp)s8N&q^SSdFp](0hrVmr;s7lWia<)6:+2RmQs8)4+-QO(To)AFY\$`]L\#iDJ91Ns8NZ0s8D`HWirP- +Y,\&&rVQQlrr2os,Q7Q=rquWirr<#nqYL!!BdOrB)\aG6)''G4)1_M^q#:9ms8Dp,rVufnqtg?b +[A'@g_>!m#s*t~> +!<)co2u`aOq>]oHB7IM'`lZBIb/VK?a2Q?HUCe%F#+j,[c-"04'Fb7XdF?Ot7hcpP6.XN.b/hWJ +a8O0[a;Dq9^q*icA6<2bXLuKmbfe5O`l5j7`lcHoaT'9[aC`T9aMu3>c-4ba7n,oa,9p2d?SG*6 +Q(""g0gCt`:K^;*O.2H#OuI/qEH-)@Ebp#:GW%TDB/*;,E,]o=E_'EUa3;WEc.'nJ]X,T%bK%fL +cd0\Uh:BKY*+)0$9M%<8:0:_/@fmF]S%aMuBOa1fa=aiDQKbfRf4.r0BRFEh_2 +01]eJ:MjlkEGfT3FE)8;0p@id*gMjYd- +S7#W!:f^_"H,IQ!b5]Q^`\tlZb0.oI`PoX3^<"dVU/i*F&eb`s*>]:m(Ca`ocbIWF`l?0DaN2BF +aiMNA`j9;Q:LKdVp@\H9~> +s8N2sq"t'frri;rgtVc*rr`/sr;-Bl)ZKAG+sS:3qu$HgrOXHu-7@=Crr(Xs)'C02rqlitrVc]p +!rVrpr;Qupg?%kij8/`S$iBYnqu6WqrquZjr:9jer;HWos%<4gq!pV%1Ij8O=^GK5/rc6ZQB5NI +6B[[?:iS[POI);u2/mMSF)l5@EHZ8BEHH5@EAN`CQ'6>WFAHM5RS?gnG`"Z +ec,RLrqucm+T26 +!W2lps8W&trr2p*m&?`8q>C3jrr<#prr3*!s7L:/*$J2Tr;QKh\0Dh6,16GjrnJS1*$2B^r;?Tn +rVuior;Zfrrr!3(ou!/iXJW#NrV?Hm!<)Zlo)A[hqu1a4QAq,i?qEYG +Q!-q$4G&TYQ'*q@DJsN6DK0T:D/<]S/Z4eBCiXE2Df7qjq>C9mr;Z`R`PfaZrr;usqu-Hfs8UNb +]!tGbbK.WF`jE7aZ)O_2WCpW#XjP@3T"i%S]Y_\-`IG@-iTp'uflFR9\4s.YH+n0X/DBM +r;HWlrs&H"rVuosrr2p!pU,;G*=`o-'c\;6*[+R6+!)Qrqu$KlrXJo)r;HNlqTkq/SY>BHp&BO~> +rVllrrVnVMq"X^=FC1QM^Ve.7cHF/G`5]sIbtel`$oZPVaMQ;j%0[4MZJ!RP^'k>\$Bi`Xb5TQa +cMkudaSs?^`YQ.C>[M,LA!XmB`Q?9Cb/VE<_o9X@hqh!Y>K-;-Z/Jf^/>+qt]mH_CIDI(ahQK8n2chaRo6"o^VM>hSro7 +=o\Ou+&O$_#SJ@.1Gh6c:h`R4^?4YOq<-2nfZM7U`lccM^!"O>a2l?DaZRhq.;!dFEGf`A8O#[_ +BR+61DK0]9F)c/<16@caOE*R*9Oj3O8lIC&O-,ZlRX.%s>t-1b.[qd+cI9noa:c_;`5KC#HX0BB + +s8N2uq>C6krs&H$s8VN=j8AoYr;HQms!%FAr9>aY*\!HQr;$Bh@O2sB8,rJ^pQ?UG+"mBfr;Zfq +rVc`sr;6Bk'%H=7lf@=1s8Durq=aX^rr;usrqc]no)A[erVlis!<2ut8,#e42C_:$?t!:s7[9.0 +O,Gr$:6^uk5Aj^rT9bh.1N@ARFDu>@G&;,ADJX/u<-`;%FE2SA7eZf\rVlcoqr,N3`8pdlqY^@u +nE-m&ItWt`iUcp6oDALcn,*"Fj1afjHJj[(K7\AqGB.\HJqleMp\"4La*uaj:lg*IEI)qMEH[P= +=DPbBp@2i?="=Squ6TpJ,~> +!WE#rrser)rVZWos4O*Go_JOcrVuos.KBAHrTYgR(F57@r;$Bf?Q^(/6iHlYq2lXA*%L^]r;Zfp +rVuoqr;Zfqr +s8W,r!<)lr3r8XFo=SXE[D'SraN2ZLaMl*6c-aTH'b(atd)s8RcThmB&1H8Xai\Z2(CLc#bK.rS +bfe/Nb0%fHrlQ+u^U%*Q?X[>cYJn5rai_ZF`l5j7`lQBJb3d:L`b!38dG*80)'p7e:KUk'0gh1f +T8n^a=A+jAHp2CO7\5m2P;7)qE-#r=Dfol5GAV,3?rM;cF)u>A@kuETb/MB>bL=SD]X>W$ccO8H +`5p`hnDDs_fs2E-=AVI\<`iO#@;&qP=>aMG!*1Ul_s-mip\".Gikd&t#RhCe"9;//-HY]Gnac,1 +k2bB~> +"TSJuqu6Qo#6+N"s52W+rr3-!s82`lrr3u9s8/T4*%36"s8W&olms5%,cpk>s77EY(aFD*rVuos +!<)oss8;fp"oHg;p$(N9s8W$'qY9j_r;Q`qrr2cpr:9jer;6Kns*"5%3JfjS@Rsp59JBY6Q^3r( +GXbS.Pa@Y)@r4DfQ'ILgEH6)@G]%P>HZ@FEhItq#: +!<2or1&_%Kr;?Ti^88gErVuirs8N#trVcZmr1Y,F+X?.Ls8DcY-lO$HW;-5hoH54i+F*e_rtk\5 +rVlforVuorr;HN`c]b')VQAGFs8;`n!<2lqo)A[hs8Mrr4T>*:2hj@I?UnL/9.sD0Q'@MuG=>A* +P*M5!@;@u^PEV(_DfBZ8G&2,6H#IG>EGff1EGoo8E-,SdpAY'k#lal&i5N^Thtd9OIf9[+Uhdrd`4*FaYI_3BRo7Y[b/8.-\&,hi_8O@1_S3^$^uXYQBm=K2F*M;=EH5r< +rbs6'E,KZ8DE#7f?Sjns/bo/#rr2p/q#(0gq80G;Wi3"t +V +s8N/tqYU6k%/oqmiK[u'^W+7/aiOJ*3Q/_Kb1)7V%2TPoeBQ+W`!lqZ$]EEVd)lS'#Rsk[b/hoU +ccsGKaNDTFb08#J\WBTi@pj)@]u@qhaTBN(`r:H>mYBEc6#5Ec?,JMd*0_S`Pm>Md`Au2 +\&Qk=_T'O0`QR<1f[f$Ggn-`F;ccOg93,bA>u1N#853)!.&b_bp\XdZmH`KC1Ed>C$NU_o!(83H +m.^DMnE0,kaZUgJ9Jn+[!rsYT#9,6Q6;(^+5f27@m-4-3kKiGEaMu<@b0\&@9"Q`QliKdFVP9'lDIG_8!n- +bg";OaMlELbK@oAZ#WZ=@?BL?rV->B~> +rVZQm"T8<"dG4a$"T8)pqYL-is8406-6jXKp&Fshs5@Q@,:;jUs7X#K*@2rWrVc`qr;Q`prr<#q +r;?R*e`QGgm-OcPrVullqY^6irr3-#r;6Bho)A[equ6WqIJQ2q1+l=.>[^`"EflWL?=f@294LMX +QC)t_G#2>,PE.M=FE2A?EH?;ADg?8@E,p)?F)u>DEbAMOqu-QprVcTN`PfaSq>C$crVufpqWb/6 +FE;_aG_=u?m.U2BiniU9f(Jt8nD[\LNf/U=GC"alMP=n4s8Dutp[[l_Q<937MM?h`X=`J!Z@fPCZ&+>[9!F;`ssUir0Jdq"asiq>UEbk4SQE +q!HQ0rsSc#p\=[drVuosr;Q]q(B4/'+X&=V[dWnes8;oqrqO#I-rKd;qYgQorqQHls83'#p#G]/ +hZ!QMrW)tK~> +r;T^prVc`qrr;8YVq^nErVccrr;Zfqs8Vrk7NrfjBCc'"rr:kb-QXJtqZ$<$+W;LIcMdbBs82cp +rr;rqs8W&qrVH2YU8aoi]^ksts8W&ts8N&srr)lfrr;uurql^drqJ]B/h9S#>@:MsEK?[rq+ +8n(;SPa6PWFA>o$Oc;)5Ec>r7DfKl9D0Ki8DK'Z7EH,o:DIQWAqu-Qprr;rT`Q#pQp\t2`@:`h8[l9Ec#i:D*E?2OuI2r1l[icOoA>o>E4+[I?fq_P_)8.>$EL;:cnLOir8rW&,lP(s8:ZX +Y,\G,XI%H3r;?QrrqlZlrso#,rV&c")'a")mIU2Rqu6U"pTth^9D/5]rt>>0rr<#srVZHgs8W)I +St;7Ao(E$5~> +s8N/tqYU6ks8=qKaDYXV][+O5aN)HJai)';b189`'FmmacGn#Q\O@/=#Kk?=bE`PE'b%%a`Q$0I +dEfeNaNDTFrlPbh\Qr9A=(Zol_o0^?a2uI%`Gc!1o/FYmH`lojijeN*u"tf!@oP(piplU2o'l58dHoK,a2l9Ccbd9:b/q[QaiMKDaO!Fa +DgQ5?F`DJBE-,`:CN=N4FE;>@Ec+*iP`Rb;DDI-8OcTK?'NpBA.>!qMQ&L)S?!Ubd1-HW(bKAkd +'#qo.b0J&I\<(#t:/"bl:R8i +s8)foqu6osr;ZcLh#IEPr;ZaLNsrV6Ej +rVm#Tkjn'"rr2utrVQZpqu6`sr;?*as8;`m-NEU%0hFK8?!pS\9U(j/CGKdn?qjisPa.`#A4pi$ +Nff)\E-5frr2p"kj8*DrVm'"r;Q:t>jcVaG]7^mD3p)=D)I9?PF%J'?XHQoI6'i]QB[Z"P!E8Y +@6#i4pAOsis8N#rr;Z']&H)>#s8W)qqu?!Mq>KXEn(%F;"8hohqYgF7rqu]os8DlqN[#fdq>C9h +s8MurrVlcb,T\Djr;ZZnrqlZos7u]p"Q8h>kO&6J"9&5urVc_G~> +rVm?+rVc`pq>^E>SZh_`rr)lsrZ_C>s8McL+rMC>[Jp.)r;QTgjGAH_rVuM4*u>tiq>L?nrr2lp +rt#).qZ$Tgc^Lc:W2SVIrVlcqkPkM]!<2rs./s2En38Np3*]]q;CP5$Pa#l9Cm8:#>"Fg?R?(fK +D)[E7Kfj6oATmT_&TM`#9_nYcs8W)urSYZ5`ROh\s'Xj(`Pf[/\O&W6YdCaE\$(OHG^G&D=gCmKl9Cc%';P*V8#?=$?kHoONVQ'7N"P<`;V>rF*) +pAb*ks8N#rr;Z']rr3Q,qYpNprOo52Y,\Y+SFlaYrr3*!s8Dops8Ms*r;MQo*bb6Cs7u]nrVlg$ +rTkRA,MDtmrtGD1rr2rtr;6Bis8W&mTUqUGc2R_B"9&9"rr)kI~> +s8N/tqYU6k8,*&RTjDN@`luND`lQb.eT$'+1,WaiDEFeCV`W?I-gAbZPJc&iA%Y`Pp'I +dETYJa2u%F>@`r*s[aN"4u"ieX+bfn6#aT'B`aN"4u.*0Z`d3p)"2-X6i:a\o" +Q'H)=D3\C!=@SL=RZM#ODE*W;L-9HsApd`Au3\%0u.`Q6-;_SaUQeD'E[ +lf-5[1/i..An#Cm2ulTA6:XNQ(dA".VO5]^cGZ\="99AM#Sn9u.S38['hX.GP[d`B9laS@9f"Ii +84NY@5>G'B0.LVYir8;Viq<$Cl-o"NaiDKBb0[i9aiaV(#0Fj%b0WnY99XZ^8!9)7NY"H_@9tZ)0[S1gbKIuJa2Z6daAg0s`QZTN`kSp"&lmZ5ccOY`bJCm.bKg_3(VIr.^;It7c-")HaNVoRbf[r>[8p+$ +AZ"\ds8W&os*t~> +!r;`krVnSNs8W)un)a*>s8;ckr;?Qnr;Z]pqg]k4,V&6^r;Zfrq>^Kls8N#on/rhs*h3!*q#1]u +r;?Tpr;Y[AjPoOqrr;rp!<2fon,E@bqYhi=s)0>I@V&nI1dRFiPa+fuH&kp+CcRWHP*)8!BKCX4 +HTc"aG&Qnks)\fe:AXtgrr;rqqV]?1`7Y+drqg'tr;?B[^4glVG^G*tQ#KK0Nk39ZCUF\q#1-ep@\.Lhm.NCmJl,TgM3=!FCc`dQ95\ut +I>ubKs8Drrrr_KOq#:9ms8E0!rUjN)mrBmtC34JeCQs917qn9TR?Nt#BNe,pKf;8@R?a/'R?9X@ +>Xpt?bkV&6rVZWolM^k_q>:0k$N'Vus5j(KmdKYsrr3)tq"OacrrW,qr;Q^3rVPG!+><<`s8Duq +r;Zfqs79>G+HlNrrr;iqr;Q^&rqQ +rVlrsrVc]p#5>Hub4kl6rVuos*rH!6s7q$`)BL3jrr)lsrqQNlq>^HnqX>LF*?(@?rr3*"rVc`m +rser+p&1Y]VPpZ2nGW=brr;lp!r`,sm/Ht`./s2@s(j&A?=7&=1I.1cP*8BmGE#O%CH.BBOH5hn +AiP4,GroSYFD^Jc&7nN0rr2rtrr;rT`PfaGr;QNl!oUl2rkhpRVPo)H8_i4Y +OBbn*B66sIZ^m3;k2"eFgXXa#cc;u+?#+_T]"kScQW2PbbJ^l%NeCSJLT%`#]>UbAMn$dH_SEt[ +s8W&srr)]UnGiFcrr3&o?XE2?.W9!@ECXc-I60o3Q'I`"Q98e_9Tt,f5'<6WR?X/&4'u&W3]bL\ +qYpHkrVu0^rr<#q!<)os$f7ncWNNM)QgF>@rr)lsrVccrr=/f*qV*24.e!97rVuclrVm&j;^`ND +p\k-jrrj~> +s8W,r!<)os8cAPdkC$Qg\]E";`lQ6Db/;?;cd6)6'G;#!d)edacR_aNb,)'Fo`?bJhHE +cd0hQ_8s[=aNDW=_.?tP<+C9_`lcO)ao]Z(`r`lcWVj&me]F`-_hHuEk/37?$i`Q#m=d`Au3\$j]-aNDTB`50IE +dbscblKdNQ\TTka6=jnU!(f.B6qooH5U8!)(,/]\=>;"2-ib;##T+X+,W81m>uNF(4A]X.BN8V4 +!(K">#e6s +>ZOS%]>;J-aihfG`P]U5aSs=:aiq7'$5V"3a2cKMbJh94aj33r&Tc.5^;It7bf[uIaNVoRbf[rC +\8G2@?&@J0r;HHkJ,~> +!r;`mrVulrs8N>_kl:\^qu$BjrZD%:s7l=4.3Kdis8Dusqu-Qhs82`ks8S<2*?6^"o`+des82up +r;Q]prrggHk1ntqrri?!r;Q]is7$$fr;$=$YDj6>i$TQ"3?GI[!l:F#9,GPFmqn1e)PK +GsQXpEHCYjF`_eB:&+bfrr;rqqV]?1`7Y(dqu$BeqY^0[^kmMdH$aXfIX?m2FAk_XQN-sZmH98J +o_\1NkMaRn\`2lIbCf!Sp\b!iqYBmWlf@*fkO8'2lL4<*GLZ$QqubKs8Drrrr_KOq#:9m#Q=]#qt=0%EU[uqE)^Rk8o0`A4>;kaP+7c#3,DhoPDD/*99>@%Q'7Mr +10n.4/5?!?rri9!rqlTWrr;m+rr<#tq>^K]o(DA:o]599rsAAls8DutrqlTjrr3f2s7[o`-+s3S +s8W#ps8VrqpT,\^8H&MarW<#pr;Q^&r;$0es8CmFle249rr)orrr.E~> +rVlrsrVlcq"mDSSkP>,Vs8Dp?`jJCm(*J@RN5(P#>>!0TqT]SW8I\ +6ue935BUp`EU[oLEb7r;rVm9)s8Clp`5U:*rVulos'X]s^VRe*^!+C/_6A]&8S`S+e'Q+MA$+MF +g"=KbZEggY`m_)5gZ@8Hf\"QuccO5Oc,ml;^V77e\#i3,ahbZtYVD-G\[]Ae^W3mJMi5'`aM>a1 +p&G'jrr2lmk4&ELrWiE%s8Mdr@W1aT/oFU%Db4`.IQK3DQ][c$OuI/\9Tk/h?V6BBQ'RZ#OYL'E +H7MYbrr<#rrr2fllMge_(]F:1rr<#k^9FcAXfA&)p](9ls8VrorVccrr>P_4s7IWU+LqCKs8Vun +s8W#sor&rJ6i6l_s8DrrrtYM1r;Q`rrqOj1T:_tIr;?Qorr2rsrr7K~> +s8W,r!<)os:&F\]csg.Q]u\F?aNDTHaMZ!=`mG#0'+J[,bJqB6`QZP=t09_T_Sr\[`7<4K75^%-dEq+/LDgGeMd*9SL`l6-LaLSskZHph@bfIcC`QHi_iqMj+ +n`]K#d`SkJ="5O(6S:Ml=TAmP()8Jb9h%B6@U!q_@UiYA:K_0-7ScTO +=(qe^YeeQ=l0n6(^::i=oCD/,cg99*a2l9Cd(R08b5TK^aT]Z(cp:iSrGhgXpMhg(;.j`9Bp!d' +/WH$VR?:YcdBtX`kS]s>#\L&;bqVN +_o0L7c,[iC_o'L8b0&#Nccun'%@bPY`ll]QbJ_*=cArbO/_%bU`Q8&$rl>bqbg"AS`l,HI;c$G/ +`pENurVlfos*t~> +!rMopr;R$$q>^!DlMph^r;6I7s8;l0+!VpQg\^pKr;6NoqtU3kr;Z4V-Qj^Qn,N:]rXJf&r:g6g +s8V!?o'55frr<#rs8M]knc&RdqYhi4BeV5H@UMPP6%+iXS5*ETI[=AADEEo;T95J-4ZmeLHp2@d +/TgN'6?@XrqeAKqt^'dq=cZ&1Ao])6%OFMb,F`q@n&-;nH;f[)$HApAG +s8Drrrr_KOq#:9m#Q4W!qY+!#EU[uuEC7rjlL2+!UoPa7S]6Yp.-P_M28240_mR$3`&KKi[2 +9K8^r;$0cs8W)tr;)'j*d%AZrr2rrs8;co +robdQ/D^7&qu.-(rr<#tr;$6es8Us@lJ)77rrW0!rVleH~> +rVuor$3'u)q>Sg8XS2Sks8Drrru_1;\f)P,*7t#`s8Dlqs8;]ms8Duc73WZoD!q?#s8W&srVm<& +s8)ZnZ^mhmZa'/rrr;rrrquotrVlcomf*4c.K9;DnRjI+>[Ul(-U2s/o_e[crVu0^rr<#t(&e.3s8(WR[Ag+/XHN/Prr;usqu$Eks8W$(r;HNfJ/fDF +r;Q]q%K-8)r;Z`W,8_f^r;Q`orXf,/r;?Qns8W)mjeJB;SC7?6rW<&urr2qJ~> +"98>squ-O#qsX![?t$L]aSa1'aMu3>`m:+Z().1id`]_J_T^=-*HO-,o+?9N_& +=]&lkNf'EiQBs]qEftc4CN(hGnSo.YDdbQMc,[cB`QQcR\\,>Wci2.$b/qcHc.^\,p[R_Hl1!m* +lJL4@5QG@X1dP"l!%A]=\&Df9]u+6tT]l7Kqu$Ej +s*t~> +q>U^!s8V0:q#CBnrr2rsrX/W"r-g4>,U^D,qYpL+q>:3frr;iof.@gX.^/jOrV?F$r;QKkr;ZfB +p?h,&m/I%br;ZcorrN-!rr2rtnc&Rdqu.u93&`?l?=,W71PV0cR$KdF5Cnu-p,RpA4R[s8;ianb)88q#CBjnE]Q4lK4&*lFLb7JphfaEdMe4'*\F@&63[g +EHd;io`+mhrr3)am.gSZrs/K%qtg%eA9%-[06))#2Jb^)P_gttPaIi$Q;gt)<*toG3,1F?O-Q&p +Sn_ +rVuos#lXc&qu".'`qfW6!<2ur!<2ut+8c"_-PdXE]DMC&s8Vols8)cqqu5+q',Dsurr;rss8Drq +rs\f)qu5oJWL^&pci6Kq>^Hns8N&^rW<-!rr)d-s7Nh)XKA_0S]LEts8Mior;HTo*W>p3 +s8;o4*[2lss8DorrVlcqpAabe)'tRFrr2rrrWN9#rVc`ors/Dk[[s(b[.sY"s8;uurr2qJ~> +"98>squ-ObqsWL,A:_G8`l?0Fbf\#G`Q$$M?Pa:i'rBX1cHOVTa3)-4aMH$&)\!5lP1\.%`Pop@ +b/hQ>`Q6'E_o&QVAQ2rJM87'RrlY8^rl+rZr6"NM0ZqV`b/VE?b0SBO+WXKc?8j#^KThjiP;cu6 +I#VN3D+eZ1O-u>q;D`Z]HUMd>q/J'*EBc6n5BW*C +.U%t"Q&h,+ +rr<#trr3-!s8UX"rr2utr;Zcq*r,^+Afr6C-RMHRjnJTMr;Q`mq#CA>+ri'Wo`+sgq#:uaHePa[`%LmL295C\o>8oSB/Pa@]' +P%68"Rt*P60gT^IEYC6krrhrNm.B33s8DqI~> +!<)lr%0$5)rr;8`UZ;(Js8Muqrr4&=s7TtA(`OS?7[E*-p\apfs82WlrcK7u-6`$]s8;lrrr2iq +&GlG*]V2.!VQfgos8)`prr;oqrr;6^s8OPIrUMWk1L+0b8P#)7OdCih3bCR&ODm[*@R-*APa7D? +/qTL?3+jm/D")CiEb7r;s8N&urVufQ`PfaGrVlipqu$Kns8Uul_SX4/_SXR;^;Rk)_j=A'@EO:N +iS*;UhV6]2b0J&QdDO+G^"hQ%gX4BodFZjhaMtm$^V7+d[^*#Q:K^P +"98>squ6UgrVQ'%F(D)]ai26Ac-=JP_o'@;d7k#_)&Nu[1QAC9kRra3)KErPeiYr6"KL0ZqV`b/hTBb0eKN(FN9d;b'kqQBdf!@kWJ'IlV0r5]-%2s)33k2pfgj`lH-CeB5D;]"lt=_8sdCcHO\leD9cjp@[n> +p%S.Xq!d1/3uf&`1F-QP#osj$,;1l;4%E%59E6:K"W&O91,:gP4$#Z"92f%f7UU"JG>p^f1hN.f +iVN'>jm9dtc,@Z4lh'N8im6uCaiDKBb0[i9aiaV(s2t_fajECXE,ff5DuO_VDu"B+DKAB(?9i2D_[<8S!]P*PEh8M6TQqS`5^$Ca2Z*@ +aNMfPbfIg'`Au#^c-sAHfGP)5R*WXbccjJMa25mAIM*/^bJq]J`l6$Bbf[rFbfn)Ga2G]P;+jbn +cM$u,qYC*hrr7K~> +rr3E)q>C9mqZ$NDf`2!Nqu7fmVp%n^ep\X0ZWVQ>[p%n^go^VVFo)AJ2me$5IjeQ:M<_B0cSQg,[G%+Gb"T\W($5?EW +Fa/=qeF`e>rr2p"kj8*Drr<#t"T85k?XN5A.T8`+4+WZ]/T[5APaQV^Df%UlQ$5N10p\H!P+7f( +QBm\@7k[!jq#CeGoRGrVuirs7uE`qu?]ns8VrqHn-7UpAY$jrr)lq +s8;o,-6Q%Yr;Q`qrVlirrr3,sq#(0krr3,Xm.TN1qu?WoJ,~> +!W2iort#)+r;P6@ZL[ehs8Mupr;HTo*;]\P*YfS-+;l:RB!h=,s7ZKmr9u'X(a+\8qYg?lrr*?+ +rr)lns7Mn^U8k'*rr3,trr;utrVl`plM`=6rr2iiBdPoL?8a^(P)Z)sR?BIC6ZJ?G2em7gKohXa +P("[7OG>`)1e)KRE#rR`q#:6ls8Duqho3OQf)GXHqYL-irr<#V_SjF3`W!_U^V.V'`3qt(Ui +s8W,qrr4YMqsC1hFM#H2_o'XAccjDF^rFOQ=:u/_'cd_l'MFeFdF5tVd*pAV)%mHsf?))4`W*sW +a:QA1`6H?C[p*BF?t=i)_90gtaSj*aaND`Nb0%fF`q%2)b08)PaMu410[p:1lm`VSWK2" +1h]0oPDD26E&NH5R$3_`-&dtB2e=j:Eq+,^Df&i@d`fbOa2cHSb.GC!^tR$3`XKi.bgYCrfC&8( +p@.MLmoK8RjipPnQ!'VAUD,7')^cRL2*=2p69n(,'`]9i-8$c'4#JfX853#a>Z+F#ATVWf\qt=6 +W17e*kPji1Z*_Np`l5OUr:omBcg99*a2l9Cd(R08b5THibf[rKcpq/WDf9K2rc&!XEHD"ss)0Jc +5t*b^P*%55PE:omEC+JV3Ju4'h=\tEp^Wb*Lc-"'*`W+!g_SsO3gLq`@9Z4oebKTt+(!4A=SJ2JdcH+5Q`l,m?bf[oDb07m) +`=9_[=@l"a[IX%cqYC*hrr7K~> +rr3'!q>:-j!rCX6q#;N:r;QKkplm9T+!hjN+rqsR.>6@RqYC0$,9IpQhY[3Ls8)`orrE&trt.MinauYWqtp0[m-soNn+62EmBKrUH$G7/1oH^$MK)]0!!W?%$j[_LCj1&S +O4 +!rW&srr<#t%KH7GUrW3.rr;urr;?NmruD";qN<0G(*!r,)]'S9,_4GDq"Ocp*?,kAhYdBNs8;j- +rVZTnq<=3?W2-NNp](*irr2rrrqucsrr;Bbs8OSJrVZ.44\Ag<0Jo&ZRZir%O?7,JB9&-1DJ`0V +OHu)oLa8+KM)RRn8T+EErc.dR*-#n/:&4bcs8W&tqqoB1`Rb%drVQNks8N&uiPYZ6>J\7t]>h\% +_nC_AT7:p8P,s@+f@SF+f[/!gbeqN>aK9+,fA,0-d*0b\c-"&A^:V.fZEB1"]YhV!Y"#[d9"i*Y +P)c#pNK/pV\])S&_8,aDs8DrrrVG[Gs8Dp&s8Drsoj_6HEVseUEW:"XEW'i0Ec"cR0/nKMP:)'N +PEqG->&[n=Od'BMBfqK:Q]dGsPEqDuM)7:Ln,34arr;urkPkM](&e(-rVZ]fc`aIWWNE(np\k-h +s8;ios8W$(s8DusqnX3k-ft=,(&n75rVuc:*ucL"qu6Wqrr<#trr)iqs8W'.s8DGfU7.dip&4pj +r;Zcqs*t~> +s8P(UrVuorqtoH8?Au\BaMYp%il!aV_,<&"V6U!n)8i6Su*@ilq1,q3u(OZDkLTa2Ym,lMpnRjNm2EaiDKBb0[i9aiaV(#gLK4bfrXSD/]Dn4*,C[ +D/jQ6DfKc8nU;NP+@u*R?NktP_qCc/^Vefa2Q'>a8O'Z +b3m>Pb/hTBbg";M_oTBL@oZDt=^,1>^rX^Ibf[rE`l?*>a1f.%e>j5s%_g3.bK7]Aa2?!CZP*i\ +dEBbU_nsF8bf[oDb0%`C`Q6*,@o#?jRH4#:qY:$grr7K~> +#5eE"s8;]lrr32Xi;@H#7SBFE)A?FE;MCEckr$q>L?ms8Doni5NXQe,0+Cs%WLmr:oiuKm.TZH$=OU +H$+FcMDVQ=3/VE:%N@)aiqr9;p%\7Urr)NXj)OVanFZMSr;?Nfm-4'3nE0H6\l4f>I!1.$;.un? +;I^CEqu@-0)-L]mFF0"so`+mhrr3)am.gSZrt,20rVubr9lkArFE)8CDfTjsE\_QWE-?>F($grtP;/s5`J< +p@7Y"s8Voos8W)tr;$6hs"sTPqu?C<,9`]Xs82WlrVuonr2Cbf+o2'8s8MurrVQNms8Mopr;6Kn +s7YR=le_[Aqt^0fs*t~> +"98AtrVca$rqN.\g\q!Krr2rr,l[iDqu?Biq2-CA(EFD1)]BM3+!+CYo^Gm+)'W#Pr;6Nhs8W&s +&HDb+rVQWgYFhYhX2Of0s8;Wjrr;Bb;uQarrr<#oqe.i8?q2H(PEVE"Od;/l6=3hmOI'*NCLfbm +QB[c"7$*ss1,0Oapf`e(<:!bg">M_o0O.;UjRSf[A0mbf\&Ob.t^*Z+@N7;np/i^V%'u +IB7I>\;lc6O-,WhNek6b`5TU0p&G'jrr2lmk4&ELrXf#-rVu_q96"leEGf] +!rr9!rr3<$o^gmJ=e?bKc]"uS1anNjVb3R,Gc,IQ@bL#$C-6-)R*g)YMR[0,'PEA4?=]:HM>$#NO +6]dY!R$'k!SVf0Y>#&mTH#[tQC2Ig+DK9]=FEVbID,*:=bL"AQa3N5X\\,Gaf$"'6B#i$9dG31' +nFQ8@mJ$2=k3M6[>cjl$cf!EUST?5f4X_jF76`t&7S?TW!%oWH/h]%B4?Gbr9ikV.;d+-d;9[e[ +kjdbiJ?OEriO-5,^<=gB^p`S,qXE@fm+9A"aMuBL]tVV2rl>\pc,n8VMDf$`F*`%PG%tf2E;jT5 +G&_YACf!qm/VfCOKp7pkNg)A +#5J/ss8Milrr3/]k5YJ[r:p74r;Z]hs3Yd6,9@pM*ZZFF+s\6[J05mU+M[aPrV-?grr2p'r;ZfK +o()5(nG`IFr_rals8;oks7;-o3a+p.Q][T$Q'mu+P=&hm6&;"Z3-T=%P)u;sP)tujPq>$rEHl5BD01&<459Z4p\t3ks81`p`5L4(rVulr?N9otoYQB/F`i(QG&_MSI"b=;Ui9gl +70`qq)a\N/p$VVOp@eF]p$_@3a7B!!qtL!cr:oaInFH)DkM8n(J9#RTKS#78SXh&b&c`1;"TSN) +(0PKoF*W_oo`+mhrr3)am.gSXs$utas7KW.FEVVDD/sW9E-6,+F`VhGEcYJY:+hWpQ]ml&PEgJ^ +E)p#(Q]4:E?UL!@R#mDlOd_T!PCl+S8"fJRs8)cns8VEa"TSJsq#:9m$iBu&s6f+Co_7_6mf!1c +rXo20qtpBmrVccps7VWu,TupWrr3W.rqQNmAgJTMq>C6lrr)ipq>C6l&cDY+q>L9lrnHW!kl:\[ +q>:-hs*t~> +s8W,r!<2ut#QEk^W9+$Ws8DrqruV1;s82NicYY!N)B'S5(E=84*ucPT*?,n9]D)@)q#:B0+iEs7QWj&=i\+ot&s8EW/rr<#trr)irrr;YP)BKgio`"jurVu]nqd:Kb-2.68qYpWpqu-Hm#lXMG +T:qmNf_k^J"9/?"r."~> +s8Mus#l=/]`b&ST`5hl"s2b/Ys2Z;0bK/529G%pK'GqT%*#0A0&fPQn#Rh!3dF-"Hai2:!aqDe8 +`m2cM_ld9N=Bo:$_8a[=a5P*>b/_H:b/;f[G82`.5;8IhQ'[`&QC!b$@V.l\RXI,:ai_rbdbF9_nabu< +o'?#3gP(Z`GaRLF]YCYMIOS)S-U'm^5"8.=;dTM>0J>%40g.ij6q'[G=]o<9Fu[S"lKS$@l.&_4 +Y[F-/\AZ,+`lGs+l1ai>i6UcAaiDKBb0[i9aiaV(:Wgr&aOJEu;/LQ&H?+%@C2S*+<,QZ$D/3og +8l.-tOd)#sPEM/V6>ok(PEq.mB4"#hPaIPoOcc)uP*:M`/3/I+ai;*>`lQ0>aNVlL`p^t`bf\)J +`l6!?_n1M.;+X_c=*M6raj0n.r5^q@`Q5p=a`7Ut$Ja%Wc,@90^X_+9'+Y`-ccF&@^r+46b08#N +`l?!=bf@G_=%l7qYjqbjqu6Wlqu;0~> +$i9l&s8Mons8VEEmJd+cqt^45r;HWps8;`kl_70!*$ZXG*[)XF+s.jL+Y*-[s8VloqYpNps8E6& +ps\p)mc+0E!;tgT7Jd#]rVQWp]hCIj<^(hkPE_GuOHPip=]9-$N0'Bi1il9#R#mc)R$=,&1dY,C +DK9`6G$-qQDfTf@EH?,@FDc@tp&FmfrsJ`)qr#N5`7=eas8N!Os82T`_MC-_o'b.do)JaXrr2Znp\=^](%CO?Lm*%)H$4O_LM0tbD^$#(!!``- +!"098EHlSNN7@M"rVlfr"6f+Hrql^bq#15q8p#&kFDYo7EG]Z:7l!S=G]%n#0k;tmOd;8uR@9IF + +s8N,tqu-O!qoP_Bnc&Rdrr)itr;HWo)>j7+l_.&r)'Bt9)&sS2*?#h:)^Y%Ks8Voos8Dp/s8N#o +rqt*,X.u]#o)J^err(gT;Z6Xorqufr\Oe\\<^1nnP`h>pNf]Eh=&E]qMN3sa12fWlQB7Q'R$=,& +1dFo;C2e*-F]^_MD/jK;E,ff9Eb]bjpAb!fs8W&sqr#H3`7=hbrr)orrVloT_#D5U^r=11cb?rl +.H'cd'bV`5BR3];K,`gtBd"ccaAK`PfR*]!f1^Nk +!<2or%K#b[UhFVM`5fp@b/h[%`\tr_cHsn^e&d4t#mLtT%20Qp&f25o&do5ud*B_Iai29Bbf\#H +`m2`J_N@])='o^H`lcEE`8J^Cb/(s3ce4mL.o&i"G`e;UQ]dDlPEo`e]YtTb/_WHceQt'nFQ6Vmd]f; +r8uYI>-4K.i4-G1^Vm[F5=\!o2a0Gn8PD]M$tPE_?"R?grT?UUQQP(5K2>#gZIQXF9kPF.Z#QBtB-/$RLC_8FC8aMu6@b0%fFn&Q9gb0%`D +`Pp'?^RSe28lAJq;mO9_b09k-rQ#2ba2Z'BcH,tr0O3M_aj%rOe(9in%gcCgc,doB`5]pAb08#N +`l?!u4.!P3i5Gr;Zfoqu;0~> +!W2lqrsJc's8Ua+p](9mrV?HmruM%6s8W#srV6*9I4H*\+U?m"l8)- +m-+*@rrW0!rSd`Ss7H?krVQKF.6_!7;O'p^p@RtLqY^9fs6Im-RXoa(Cj(,MLP%4>U-1%E!!*E* +!"0-0EI)hUNR[V#rVlfr"6f+Hrr2phrqufos82LLEHuMCBN9"iG].J27YsQtH#c/dGq+uHQ(",( +P&*I)3JNBUPYPJ(9jEsPO\ohJQ]dT$QB6>R2+[9;rr)lrs8V?_s82lrrr3#uqu6U"kN_[/p@cu7 +s!7I +s8W,t!<2ut#PYBr`qfT5s8DroruV+7s8Mops7uE=Hn#jU*#]V8*u5q;)M@\^rr;uqs8;lrs8W$, +qtd@`X/Du>r;HTjs8V'W;ZHLks8Mokf-WRa;,`gDQ'[MI=-/Z1@8:Z'G*J2RD*N/!MjBWkPa.Mt +.o\btEGone-U:IHDf0i3?s%AjEH=7Oo`+sfrVulsqr#H2`7=hbrr)orrVloT_#D5U`50C3_nF6% +OfW8hRYZfaO-#EXJ8Wo_cd'_T`Pfa6]t@(^dEpFkccaGM_SEgq]X+S2[^jGt]u7e&a1"d9XBp=8 +Lm+-_PEM!@`50@,_"Ia-rVlfpqW@;IrVf:bqu?WpqXugbF_u#-;fQ`"DJ`oOL-guEDE_f[.[6Hf +R$WnrC-Z\rKSPbS9NlC0>a:b?;/(fPP*DB#OE`oD8+Q][rr;uss8W)t!<;Ne!<<&ts8Dus$iftn +\ZDp3XK@lHo`"k8rr)fps8N#ts8Dios7ppV.MI7*q=smao7nS7'-k!^r;Q`rrr*'#rqu]nrr3?( +s8;]b\>#RdW:p2i"9/?#rI=~> +qu7-(oA5.4K=o+Aai_cIaSj+8aiqiIcd9q`d*9h<>n-iI&.oKn*"s;)#A2B6bfI`>`lQBJb/hTB +bf[i:Cfk%J@>)A5bPoQ@aDoYFa2Z*?e%QVR<(p&POI)>qD-2pcP[[F+5BiBWPAWX/1lR`cP*D5s +P:KX!5B:^_3u^(MF*)>E@9ciNF)>kLR)mUsa3)HAcIL"G^::f*bJq]Ia2uKMgsXsHoCMYDo(2M9 +k&$0ZFh>T&]>qk.9"gsD1KZIo5"&"=:.\&SC:K(._85;uYbgISEFED_Ca:b?;/(fPP*DB#OE``61<@_Z`6?C&`rF0^aN!\i)9U1GaMu6@ +a3)'#CfO5&/a([:02SsqYU9ls82ZmJ,~> +!W;rqrri9"s3fNurrN#sq>MK9qu6Wqr;QZnqtKjbp:"`_,oRm@+s@aTl21M[rVcclrW)iprsR3A +nEf07s8;oqrr(gT;uQ^ms8Muc1I"u=.?0LZR@'+@0U7oeG=QIZ7ZNk&R9i]d@?Zq[_=>Z5TVDe`/Hs82irr;Z`oqr#N5`7=eas8N!ls82T`_Mdro_%hDnFuk[s8;)H@uPqQE-Z5@DJX_Y24'1D//8$_ +$j@#4D0UAVO4]q>UEo"9/5qr;?R(p#,3%g]. +rr<#ts8NB(n"6H3rVufqrVl`p)Z0O6s82cns8Mljs7a!9,U+!D&02`(.H^I+rr)otqu6Wq%K?>) +kE`'DWikI]q>L3is5O#UrVl`ps8;=?4&o-+Nfoj!QB,0$PEV,O7;?7!N0]`q>Y\%$PE_2qOd21b +?%abM@l[*E87uITCiF/o;K$>hB2JL*qu?Wls8N&qi5NUPec#IGrW)oqrrLulrkhsW^V@\#^m/-& +OC+o9I>3]@P)ti^D5+toc-")F`5T[0_0;hY"`GJ\KQVrI% +P)YfjOH.)p_SX('p&G'jrr2lmk4&ELr^Qhcs8N#tr.IpfE)jQ[@;KdnEHO;2JQP?S4-+\EOd)/l +P*;(iCc.*8R[K3gG@s6fNg5kb9q7K4Q'ISuOu=j;oDe^eqYpKos8W)us7-'gs8)^Qs8;onqTu@J +WNW1n[.=4rs8Muqrr2rtrVuoqqu?KR,odjK7$X+*@2U+,*[+/Fqu-Norr2lqrr;osrr2p+rqcTk +ps>V)S=]'GrqucrrdX~> +qYpuqcZ!Wg^r4.6b0%fHrPgh<`Q6BMbK\5P`P]aGc]q07&IK0[)Arkq_pHfR`Pfg^dK_n9GqFDc,pPWEY>MjBj$O=kck6@"TVPql((Q'7JuPa%=f,n\>F_SsO;`l5p:b/hTBn]2ZhaND`L +aMu6D`lu91LK[YM<)d"@[DU/2bf\*,a>CiUaiMTPd_lP#%i7-TIXY3+&e>?X/]u>[aMuQ +bfn5N`l6$=ahtQD:esu#ch$u3rrW/qrI=~> +s82lrrr3-#s8Ua-rr3#rs7uWsrVucerVlg5qYpNnp\=RVjc)n[.iKT^Pl:UXrVccrqYgg!qu?]` +fCSIqjo#,Zr;,CO7K*5cqZ$Sd-QQk[0:S)aOcl/C0T;3[O#:rq0pn#iPF"jG5C/QbP*hMp/T$_; +C-c3em7V&=F*MS'XKY$.GX9@Dq>L0hs8W$'qr#H3`7=eas8N!3s82T`_M>al&,lP< +!XB0.CNb&TO4:'N6Y^O<;cec_FEV_B6Mn/l4D6X5O`-GIQ^O>&2/5Hs +PFIJpIRIgo1Qe2fBI-68PF%MtP*qGA4unJrrVuoqs8VEas8;osrVcitrr)j)jR)X6n`nR&s7uKg +rr3r:r;?Qmrr<#rr;XDN-6sf`-Qj][,Tn +rVm9)s8W#OT0s[jGZYT-PdaOOo,+RrVlisrr2lqrr2p* +r;FR$X/;o1q"X[arVtmV;Z6Upqu?\e,o^DS/tA&aOcYr=/rGdSNAGNi0:%TaOd/F?4aN?`P*hMp +/SgM5Bg#a_mRq&6D09YpX04g,GX'4Cqu-Elrr;utr8>T4`7=hbrr)orrVloT_#D5U]u.J!`3;k* +W(EM!GC+afM3a?fN.OREbfn/J`59C-^::aSa3)lXc-4DS_nERg\ZJfE]#DV*`5oj>_J=6pNM^6+ +Kp7sgOcPL:`PTI*_"Ia-rVlfpqW@;IrVlcq8c&>^j?dKp;,C8I??(%)C-ha)<]O\HMihqAPEhK& +M_f$3DNU?DP'fT-G;GAONbB_1Q'7Q!PEM>r@QQQ+r;HZqr;Q]qs8N#ss760hs8W&srr+X.gG)]]h<+4'ucr;Q`ps8E&trr)j-rqcTl +qW4E@T:ad6rVuosrr7K~> +rVuop%KGq*BQ^Vu`l#m?b/h[&`]1r\`P0I@c-+#Db/_QGd*BUL1_L`8'cD&?ccF/Ga2lEIc-4DQ +`l?0?_h:rs=^?6]`6-EN`PfdUaBd!3a2,mKHOp]q1+JWOOHYlr@PD(q<:R$*b+><[@t +SW]A*N\,(25A*)UE6^7CIX?HZ:o:?ZBPoT.d)j>FcH+&Fc.'hE^::f*bJq]Ia2uKMgsXsHrps@j +nb2b2>bnE&`id%raMu9E_7?e"!*Vrc;-$[q:.n,M@K8YJ3]]Vt6:4II?XQuC36U@VoC)8HrVu_d +UO/Z>Dh=[o_nWgm]'T1`o&J'_f?)(S`lcZA^<+OsaABq!`l>g7d)@VDC0"D>M.(^VE+:KWR6`T> +3g,\DOcbrsRZ'(;6#VpTMN`HUAp?+oS;q8/8X5L+P`q8uO^L'oA'2j7bK.]B`Q$!?`l5sga;`.? +b08#LaMuHGb0%8f@TH6!<*E8-^<+UDbf]n*(rjP;c-OSXgmS +"9/5qrr)j%pYP-6s82irq>LEnqYpL!qYpEjrqcEfrsnW"`eS5B[f?4(s8Dutq>1'sr;$Bmf]2Jj +kkY2W!r`#miVldUr:pVD&%Q^=,+Q<$"^Q'RFgDfn]YQ'.MtMEQ)>L7=EiR[02,O@<&9 +9\B2P?Z^=,AVE`FJm`O[kkb>Zqu$KorVcWO`Pf^Fr;HZprYbb5q"2FYH$+7SF`;MOAo">\66-42 +!s&B+r;])21$eB#o^qkOq=sUFm_4qXnFQJOp[e(Mo'u/*7#-;-I=$$UCfD2X%jj$$SK&m^!!!',% +oI1eH%(b&o`+mhrr3)am.gSYs$c_Ys8W)uoKI;(:M=BZ7riWl?=Wm'AnWkZQ^a#&Q'%Ao5&XY#Q +^*r.P?q7,@6p*=P[R$OQ'@]"QB[YsO?,Cqo`+pgrr;<`s8;os!<2uq!rr8srr3Apjn&$9n_=*Dp +\Facs8W!5s8Moqs82cgpU_[m)'pIM*[;sM/]7V_qYgd!s8W)rr;6 +r;R!#rVF7$_>*j*rVlotqu6U"qYpEks82Tjs8W'1nG^=XA7i.Hq>^Kns8Voorr)iqrr3B(n=ubX +Uo`ANpA"Xcs5O#Us8;]mq":LM-Wi!ZQC!r+Pa#-+C6Om@1i7;*>Eb/7OGGu>1PD0ZO-l/pR#XO2 +6:oi,@ptSU9D+/;YE*QoOoO_bh2jBelR$E_sN]_/] +9U1g-RZUiRCgTJlOHa0C8!T=,P*V>tOcVI[U%\Ncr;Zcqs8W)trr;Qgs8N0!r;Q]q(&e%,s8)B* +X/r5&XdIZ8s8W)rr;HWnrtYG2s82cfosc(]&g&,5(E4D2.Dc&YqYgKnrVlcq%fQ8%rr)GlS=lLe +q#16lrVqB~> +rr3Q.qYL3ZO^j-[`5Ta9b0%fHrPgh9_T^?J`lc<>`koU9da?Flb1i_*921]'bKe;OaN)3@bg"AU +aMu6@_R?GC$^rXgKcGdZ?ilHPpaM?$:a+l8g<@WiiQ^O>0PuTeZPa.4cDKJKUP`_;pM*,l: +Kpn3eR?`u(O$lc,33pq#:O%5-@Xgd6JQcS3aj85R_o9^:`QcoR\A#Pde]YtTb/_WHceQt'nFQ8E +oCMG.V0]1sMlOG2dEKVV_T0R&O9B,n8l&;\:d.ZP=]T&f!)#XD69mUq85`Vs=*R!Qna?,=lLb,M +_7-kLBWeXJ]t:rFp[dt9cg99*a2l9Cd(R08b5TIYahY^6bfJ;\-"C+RBk_T[FE;@s8(c-[ +?8"L3RuEYsOHkkiDH]c#Pa@l&>uYZK6'ICp@7EbPPaR]#Pa.Ak1FR[jcH+)N`l5p:aN2?>`q%24 +`lQ +"98;rr;HX$j5KD*s7u]ns8)^#rVuflrVuoqqu-O-r;$?hs7lHjq"aperVZ]ms82imrWrGts8UL6 +md009rr`5rr;>OQ7K*5cr;QQa0j7p9Q^!PtPEqJ78kG)4Q:kJ$A4MiPP*qVt1N?3%PaRZ#QB[Y7 +->%MqqM86iGB?_T=)(<5E's3qr;QWns8W$'qV]?1_q"\`s8N!6s82T`_M7L`?!>-o"S6I0PrW!?3 +&lNUiG'o;!o`+mhrr3)am.gSZs%31hs8D]lpA%a$B3ASY>=3IUF&JG$pPET-B9A=EPa7`$4^i4f +O-H#tQ'O7AF\-22P`m[t?'CJBOd)2sRuL*.qu$Eis82irm/I"^s8Ni5r;6Elrr2fps8D!JnauA9 +j8])Tr;HX#r;6Hmr;Q`prr3N)_(?rZ,:"N]-&:a\q>^KlrWrK&s8Mroqt^0grs&K&oBYo+f`(mR +q>:*hrdX~> +r;R-&r:m+_c27MU9kp\Fj_p\aper;Z]pqu?ZprVlfrrs\o* +iKC1+s8N&ri5W^Sec#IGrW)oqs'X^!_o'F0a2Pj,7&6YP +BlnuJG^F[\M3+*eMcdI2bK7fA^::Y_[BR&9^X: +rr3Q.q"O^NEaP!I`l#p:aNDTFrPfnta2Gj8bK@iFc-=GVaMlBFeB,tgcdC4dai;K@bJjJ)(Adq?P*qH"Q&d\> +:1TQUOHu/qPZ/l3@E?T%6uINu:IJ&q86K@NcHjML`666A`66ZM\A#Pde]YtTb/_WHceQt'nFQ2; +o'thj:oLL-QF"cG`QcNCb/M=j]9k9`=@u:_9i+bj?!q;[!*rc#69[Ip9N,"s>\@'hmJ#`+oChdc +]#MRgK9NBcK;Z<"^qRSQp[dn7cg99*a2l9Cd(R08b5TIYa3)TD^a(;Ecc(]GgO]K +>TdgIO-PfkR$'R>D)[K=Q^*f#1MLr%AsS[F/Q5r=PFRc"Q^!u!7l/iEai2QG`l5p:aN2?>`q%22 +`lQYbg"ASaMu<@`Q?9Ic,n)Jc-W1"&J5?X&etjh_9BsCaiOD& +(!">8b08#L`l5p=ai;3)H;mU7F4^'_rrN)qJ,~> +s8E&pqu-O#iSOV7p](9ls3goHrseGUmd0B6s8N&ur;$6eiVldUrVZ]nr/iX64)gLROIMAqRq>&H +NKf`d2fNdmNL#otQBuJKEAW`DP*qT#RVF-MZhjF+7riir7tP;`4)AY,p](6ls8W#srVcTN`P]UD +r;HZpra,X%q"2FZH$+1QE-H_.I@XOm'*8.6!<`K-!!!*$(eV@+mdTc;p](-gnEGp*459H.r;69_ +m-a0,U1TL9G^Xga<>boE!!!rr2p"kj8*Drr;lps85$F9m&'k +ASY7cH#GP:p\=#;07o@QRZ$5E'Pa@MqS=!k[G$RY,OdLVU1Q7QdOI),sR$*_[4]M=UqYgH\ +rr2iqrtbV3qu$EmqY^UBn#QFJts5iY6h>[EWrqcQlrdX~> +!<)lr$N9hbTV(uWqZ$Tnqu6Bjs8E#snc&Leq>UBn$i@T*VPgN:rVu`irr)lUr_`Rks8W%Z/lXcI +PaIK#OcYuA68XU`P__27E%m37Q'IT!Cc62eNL#ZmPEVAI,ZCuGqRK%2E,S*n@UM-.BMJ:%s8Drs +qZ$QprSY]6`7=hbrr)orrVnM,_8F1/a2#a/EJ^H1CNFcKI!^*_I!LI/P)!_Kbf@lJ_7dIc\$E8X +>uAbfb/4.o#J7je]nC=7^Abtob--AS=l_>q#:3kJ,~> +&c;V.rV6*[dq2^p`l$$@`5p+"aSfcaSj*ZaNFJ*'["M:`PoT?=B\j: +J\&hFdEftS_oC]WGg4=Jbf\=R*)/>0Q'RK%PEVGH6T'gdQ&.D;EAp+>;=LJ`Pfd?a2Z'@d`/f3]Xu_;`lcHEai_rbdbO?`na>N(eolb@J!@(I +^qRP%a3)38_mkk!>?`%792/&V>Zb6bBMiM^?lRYXt3ER"$tLN0K`lQ]d]&P*L2D1sX.[bfn)G`Q$!?`l5sgaT'7"b08)P`l?!C +b0.`:VI`do:/+_^ZbXi0bK@oGa8X*YbV72Z_nj@:g +s8N,qqu6U%qr?c;s8)]orr:IHrr3>_l1=E)s8W#ss8N#piVk8(s82cno;"'B17jbqS!K>-Q'=9s +DO$QT?rV)[6&q@sPa.Fs:hhqPrf\^tPERF_jo>2W6Z$pf<(1+eAoLA9r;6Kms8N&urVcTN`P]UB +r;HZprY#8.q"2FZH$+7JKmS/2Srr2p"kj8*Drr;lps84_DFBNL* +GZK$2EEd)Oqu?1O@?I%EOdDJA +!<2rs$N'VNUT4"erVulqqu6Bjs8E#srVlBfq#1d'rr2GaSu8Wij8T)UqYgBmir1A's8;lroV=*> +/tA,hR?j,)PEIjkCm1-L?;bZS5E(qkP*;"k:1uMHrfJOoOc_%Wj8])X6>17V;*nJX@Vn]0rVZ]o +rqu`prr;rT`l,gHrVc`p!<)lr!T(Zl_csdu]rY,,Ue#HKH[L0dG^"=SJ:ioBDM,sOb/2*5Z*psG +J6I#1:X$Sn_T0I,]"bY5GIbW.a1n[/H%1-aI=,pSA#tDdIufVRLpY"?_8F+^s8W&srr)]UnGi4] +2?!&d=DW)%;K?bp=D%F0s78NaO-u;sR$q8YC,(L.NLQ5nN^72k6ue3RO&&k:Q]dH!OID:1Pn/^> +T`=ujrqcWns8W)ts8VZhrr<#s!<2ut!rN#rrr3;q`j)SGWi2?:q#:3ls8N#ss8N#rrsSf)rqc<\ +q"":\qYC-jr;Q]qrVlcq!W2Zjrs.GXS=QA(q#:3kJ,~> +&cDV-s8)EV]ObN`aiM]G`Q64#aS$G&Cm +dEThQ_oCZV-dKWKbK>V_:bA6&Od_Z(R$m7q$!gJ^MBQ`5]pA`l-'K`jidr]@G*Eb0">:ai_rbdbO?`n`KH!]hk6"A?!;[^q77q +_nj()]XjP25$:KN78?fY>?GcJ"hL\<(rIfb07uLa2Q*?`l?0FaMl!1_oL-Vg!n?rbgb(`_oBg>aND`LaMu3:`Q$'Eb/hTA`l?6D +_7uXN8P +s8W,rrr32hiUHmIrVQToe,K@H#Li58n_=*Dr;Q]trquZPr_raprVZWic7_#.Pa@YtQ'IH%M`tN- +Q][8o4D8XoMNX9iQ(3nZ6XEWUPb4,'Q\S8hq>0j]<`aS[G@!#Pb;!!O&ZOJ"QV)@6BX9lFuqJ;r(Ns8Drrrr_KOq#:9mq>NSXTQ3D"AS>s[ +5Y_4Wp[lX!SW]A*P*TTOF>0)NR%'8)P%%@,@nMfNP&3R(1lIWdP$=-;PEV8s6g+1As8)`pkPkMZ +!<2ut(&@b)s8W&Xo^25Gk264=rVQTos8MumrrUBn"TJ>rqu6Tp#lF;p +s5rV4iUm-L"8i,urdX~> +!<2rs#l=83VS)R#s8D]kqu?Nlo)JC^%K5:PUo(9!q>UEmr;HWos5O#UqZ$Qns8("m1P:jUP`M#l +Ngkkf?8\"/Mj6>8D)d?5QB[Z)NHINl:R%$5P*D;f8_O">q>!rfDKKH4CMQ=&n,N=crr;lps8N&s +i5W^Rf)>RHrW)oqs'X^"_o'@/]!u43X'][aH$k!dH[0maH$=:]Mgfuo`l?0:`jiUbRpTuPGAp3e +ah>F*[_T>WIs8<>]th:1Fa/%SI9k_o9L/p&G'jrr2lmk4&EEr^d"fTQ*7q +@:X.K4A#MOq=i*(S<0&$Od0BKE\s8)cp +rr<#trr<#hrr2rsrr +s8Dut$iTYXS7H]ObK\5M`qd^Q`rF-Zb5]Q_`r*gO`rF-Xb5KBn`P8*H?qQB.Pn4^U+5OGoJeB5T_dOd;5sS;qbZ>u6fMSs#>)Jj@2s`lQ[u8nD^> +C1Uj6.*KrR_8=78bJqKDd`/f3]Xu_;`lcHEai_rbdbO?`oCV1uFHNbNS%d+ha2,R.^qme'\@>&' +Cd;Q)9Me5X9j(_6@$@apHn8r=?=-f,EbGi%9`l5p +s8W,srr3&Yg&1jL!r;lrdf0:H%e&-Co]t`@s8Mros8W#piVldUrr<#ns5#:VOHH!$P!"kqPF4aO +:gTu4k0Ye)$jI%L0MosVm.L5J +nEZ9bNd5SB$3C>2!!ubKs8Drrrr_KOq#:9mq>N\XoD6Fe<('E? +p%eLaqYQmrNKfTnQ(0mH:1fNMPF7Yq9j_[T3KfbpO?I/\99Gd/Hm3ErPa%N%?E4#%s8Vops69O^ +quH`prtY;(qYpNpi9p(,qLp$qu6WqqtpBhq>C9mr;?Tirr2p.r;6Eks8W&r +pAb0Zl0[Zurr3*"s8W(K~> +!<2rs#lO>#User8s82Qiqu?]qoD\pls8N&jrX&N!aI/j"X31D>rr*#urr<#Wrr;rss#^)WhC9t7 +O-lAu3ffYjQU#1Y>`bA;N&>Hg2ia#qNfofl6s<\hO,oKmP*TLHs8VomTQE=p=\(YH\bQ.'%fQG, +qu?ZqrSbc7`7Fncrr)orrVmAa_8F1-]=XG;UQJMgG'a+6s*77bGBe7ZH#n#H_oBI7\%95d6Z@?p +GB%_4]#_Us]XthgG_N]EbI2J6IXcNhJTlQjH=KsTP#?%JMiY'U`5o^0p&G'jrr2lmk4&ECr^-8R +`/[_^8r<*4q>^?jT4X%FOHu-#3FkfoN006hP)N%>Bl5kkQBdOpAR.rkSWeFFD46]RQ]t^Rs82ir +q>UBns8Muts760fs82d.s8N&urVc)fZ*1C6URq&Qrr<#trW)usrr)lsr;Q`rq[!2uqYgHorVccp +rqucurr)fprr3W.rr)lrs7sF(T:`F]rVuosrr7K~> +s8Drs$M<#)@#2D;ccX>Kq8iHQs2afO"3AL'`r4!Xb596k`Ogh(?X%#k\AQJ6c-",I`o5!Gb/_TF +aP+QO-'+.UR#a=lR?Eq'BMVorRZrdiDJ_@oOe[r"RZU$C=](9BPF7Ss=,>PTaOGlM-p:$W.lajgj`EN,OVU;bI&aMl!1]Y;)%`P%^R4D@Mb +7o_uTAqVq#\\PkNIlVY"Al;E$=_:$Ug[Y=6[(XZ+_TL0@`4`=*C:pKdPdSb/hTnaSs1"b08)P`l6!@b0A&I^o:aE9hS2U=LH,jaMu3< +aNOP'1WIDO_7dY'bKJ#Lb/1s3`l>p7b/h`JaMu3<_o'I9bfn5L`Pfp@bf.W9HrNg?HJ.odrVlhI~> +s8N<%r;Q`rgsZ3%!ri)sdJj1G"P)`,o]#lM#6+Mss8W)riVl4Er;Q`hrO=s`Padf"HS0N.OI9TK +D(hKCPaQJXFC[CrNg5ouR?BsP3KoksR#RPq:%nG`q==F]O*d\crV?Kis8W)trs\l+rVcTL`59F@ +r;HZprXo2-q"2FZH$+@^P:qia.juJCquH`urr>Cg!Ws94OR;r9qs3S9]f%e_!!`K5&1fcCjm2C' +lfG9UM/u-%#mgS3#6=f4#R(qe-\/'j2A?H/=)re0H]?PIs8Drrrr_KOq#:9mq>NSVs8Moiq"FFU +rr;ljqs$P1T95V0P[7-t5F%\$Q'db.?upESI@$+U2f3P:;jNN/M_n=qPF7T#D2n8hq#(-kli%%e +rqlTjrVm?*q"ad`s8VKJn+6>CgA_-PqZ$TirW`E#r;Zfpr;Q^"rVQNls8Vims8W,s!<2ut$2OW" +s8VcQmH`d.s*t~> +s8N#t$N0.fVWR^Qqtg?ko)AIbn,E=drr*K,oqnL[VPrh[rVlisrr)iriVl+Bqu?]jrjY!^P*qAp +H7X3'NgF0CCFu';P*^&PEagtlNg5osQ]==B23F5kR#RMm9_\Mcqt'^]N-CrTqXsj`rVm?+s82iq +s8Cor`5L7*rVlcrrVcb(hSI+I_S*`VS?5M$I&??(!KH^0\O2f3P:;jNN/M_n=qPF7SsC5hoe +q#(0krr<#drW3&urr2utrr)fq%0$/%p;=#;Yct'pg%bOGqu6Kms8Dut!WDrqrrW2trVlirrqcZp +r;uuus8N!/r;Z`or6h=2T;^uOs8W)ss*t~> +&,Z>)s8V`2E*o0JaNi#P`U_(M`r,\rl4uZ%EcSs@U<;G?_k<4@lT^5Q'Rf)O$RA9P*hQ&NL,>[f@&*kbLbEa>(aiL +dauae`4s=5d)sDJaj@u9^V%2/bJq]IB#i$9ceQt(nFQ2:l!ga-Asg3IaiDE>^q7.j^s:3ETOgr7 +<(0SV=(uSBQ*7g;[_/5`7;$=;;c$G$?>%p_j1i4E_8=F4\\GSYYF9X$Z#tr&\[_%onEoDdm+9A" +aMuBL]tVV2rlG)]s2[aNaN2WQe'udpeC)Ugf$)Ilc7Xd +s8W,t"T8<"g"$*%s8E#udJj1G%*S24o&9WIs8Moms8V!Us8PI`rr;YFB98CCQBto9G*SM^QrI4+ +0U//eRS-n-DDmoKQB7?!HU;:+NLc)rOdgr;qt0pgr;HZnrr;ons8;onrr;oqrsJZ%ptis+_peP^ +s8N!0s82T`_MEJ[H%B1-T5#l"&eFmIrsV='$OHn?-:4Kks7H6Me=Ar_+qY@n$iphU1JWn`jQ>gm +a\%:N,U=BP*uQ(?*%<-_,r.bAUR38J'cKJaG'8OueF`e>rr2p"kj8*Drr;fn/cYP>p](*ir;ZWk +s82^^Ng#isP`D"`DEUBqp](9[rr +s8EK+rr;iGUp'FfrVHEkrUKmcs6]gas8N!-qrsBEV5UKms8N#ts8MuRr_`^ns8VeHAWN%`_8F1-\:AY(Kj&A7Gl;pdH:iR1FEr4;OhJrMaM#-A94i6dI4Z&+'gKnbM?N/E:IKSkA;J4QQ/6#D(+WQ;omah[TLs8DrrrVG[Gs8)`ls"+!Bq>^Bm +qu?HfrquX\N0BTpPDbVYD)mZ9OdVJn:0DFO=&>0GQ&IS=9P0RhQO8IL:6Uj/OckN%qYpKsp\t0l +m/@"`rr3-#rVZWnrVuor$N/baYH>%0S[8"grr3-#rVc`prr;lpr;QlqrVulrrrN&srVulrs8Nr7 +r;Q`rrr<#ss82ZjjJ8? +rql`q$M(9-AurYbc-FPPn]:^K!li=&q9&`Yqo\r[rPnlY&^&"j:Ld[=B"#Fpbf\#H`lcH^aD/i6 +`QcV@c,mrHd)V:;Ds0.[(s5`Y-FdT5?tWU9[UPj`kog@bL+MNa2#a/\"?[$W`bReZIAF2oC1/of?)(S +`lcZA^<+OpaT'76`Q#p@`5p$Nc.("fa2uWVh(O87P*_Q!QnE)3OH#ElQAn[DDJrWSQB[\o2/c0# +Q2[*bL0.37P*qGuJN;$&c-O;I`Q$!Abf]Isrl-&&bfn5K_o9X>cHXJL]9QSq77g9WGe_8=`5BR: +c-4?0`W4*ZbR_e5^r+17be_3:aNMfN`lS+u)T^(B`Pp!Dbf[rE`l?'FbJqGp>>@k!Z0:`Qrr7K~> +s8W,u"T/5jgY_o.dJaRSo%3R,n+6SXr;6BhrVtgT;ZH^os7U;^P+Ru*PZgLMPEM8nRQ,/(6Bn(( +P;R8p@m,j:Ss,Y0A56*5O-l6"PF#IWr;$'as7H?kq>^Kms8Moqs8N#ts82cihSd:Ke,91Err-7( +qtTg#Lj=,jMC5$Y.=-&B?sR#B?!LQ:>@:W7<,,FVmd]r(b@k=OHuEk=AnGphCj_=d;Sq>Yo$g-q +H"h#4Bm+6$CN"*1Dea6;;JDk9:j$M:A8Za;NR[V#rVlfr"6f+Hrr2rnrW)ips#TlMs8Vrqs8Dgr +O-Z*#OdM=uBKLU.R[98)A5@5c?9*n)Q@LZ0=A4sFP*:l";bE= +%fQD*s8Vo4U;-['rV?Ejrr;Ths8Vcks8Voor;Zfr#PuW5W2?Q4qY^Bnrr;rUr_i^prr2rlD1Rh? +P*V;76qi`)Q&V.hCMuJ$S<&dgD/*QDNg-&rQ]b`K;IGQQQC!Ys=gA#+qZ$Tfs8Mcms82iqrVulp +qu-Qos8Lut`5L7*rVlcrrVcb(hSI+I_72k7TLuH%[^`fT[C*HQ\?WTT]",+TZ,OJo[(0mh]t_@q +]tMA2_SX."LJb1[[C*&)]=kqp`k0@2^;e1._8!Y$_L$^1Fb@NMT";YX]#"(>s8DrrrVG[Gs8;lm +rrDurs$$8Ws8Vlns8DgpNK]WqOdD.nAib:(R$Ei!@SLf[>W7J!P^Y<,=A4sFP*:l";bE= +%f-#!s8VVP>B[Ec`m)rSrl4oXprWf^`l?*@b0'\,s2tA_s2G&]rQGAdaN2C#`>$>5b/9*:@UtYc,7fI^;7e1cHXJMaj@u7^V%2/bJq]IB#i$9ceQt(nFPkj:U$["bi7UF +m.C&Fo'G]-oC;>;a>mO2:/k;=7rm>Kp%S=Sp\jRRld(2=G][_1CHBr4p\+@Iqt]p`qsa7Wq"!0j +I^=m(j6OeRnb:kcm+9A"aMuBL]tVV2rQ,#Ys2@RI`Po^;c-*uDbK7`Eb0/C#J;fSTPF\+1B/Y%$ +R?j&%@nq#_>r[\%Q%(K.=A4sFP*:l";bE= +`luZMa2>2m;+b#akO&!Bs*t~> +!<)os"TJGhhrt"XQ'dVu:hFQD?B:88PaddrD)mB5S!02+PXP$9s8)Wmq>UEjr;Zcms8Vrqs8Dur +rVGBh_o'purVlisrET9rotlH/H%Sn6TjD2`FEM\IF)uJFEH-)EDfg)Q;;CN\[ +q>:-hqu?Torr)\p?BpkEQ'IPo2.&_;Pa%H#JNmpc;bEIAQs_[eD`cR +q>^Ens6Tabrr`8rq#(-k(B44,p](9js8VNRn*K]Df`2!HpA=miq#1Bqr;$9gs8W#srrW2us8)^# +r;6Els8Mrrs8Mp&q#CBms6K(:j5Tt9J,~> +&H)S+rr;i(VTf)7s82fns8W)ts8V?_s8VrprVm9)rVc`lVl$;fX5`sQs8W)urSdbUrD`gprqU8U +Q]RT!P#>19PED5uNJ'^Ejs8DuriQ&mUf)GUHrVc`orsml%_ns3/Kr]-J^qRq1`W!^n_o9U3`PKR3\5gDa`OUCuT=VJK +]t_M+^r=:2rkC+j=D">2ZX007a2#X7]>_k-_nX.(aMYj09VeR\[Dp&#bItg0p&G'jrr2ilk4&EL +rqQKnqYpLXrr;rsrVZJl?':M?Pa.Gk10m53P*2#pIm%L[;+R%9Qs +N)9EOq>^Emrr;?a!<)os"9/8rr;Q^+rr;uqs7jL>Z)t1.PO&#Crso&,r;Q]qs8N#rrVuflrVZ]q +r;ZfsrVZ]qrZ(n9s8W&rrr;usrVuoqqY^9g[A9Ch])2O,r;6JD~> +&GZ/"s8VD6=bFK%aNW&QaN"5#s2P)[q9&`YrQ>)_rlPSh`l?*Bbg"AUaN"4u!65#Z$Gg7X>@(j3 +]>r(8rl"u\bfn5haT'4ra2?'G:N)DYS!T43:,J2uR?rqf3c7,TPa@Dq:M"BB?B:56OdM.fCcI33 +S!')"L+^`nbJ1p=`66ND^r4=4`PoX:bf\&Jc-jP=]Xk`+bfIlF`Q?9Mgsk3OmGE>IX`pDoj6l:) +qYU-aoCGiMp@7hB_BWr.A8":mUuC\6nFlYPmHsB:o'>#88PFGKIS[*,qXO4Nkk=lFoBc2Js6ngh +;6I61ali'fs6J[ilIX.saN2TP]thh4`lQ0>`W!kK`P]O1^;S(4`Q5s<`Q$)\98f$uOHl)p3F4t: +PEV5tJ3I^_;G!7=QX;IbD` +aN_oG_6nDf9L_f`;R=3X`59L9bKS,K`lQ +!W;inrr_BBrVHHl!;tjUrr36$qu$Hnrr)Zkrt#,/e+*.tg].Bm3WRQC=&+Q>Aoq:Q_04R$EtdC%qB%rr2rto_o0prVGBi`5Bpo +r;Q^HqY:'ho=fm(H@nATQ8jqSF`D;;EclPJEcH5BI"$s5?Iul97;[d0IXucfrHS?f/UD>\I!gcf +6<0FtB9IggG]n4NF*;hSG]mtKG^O(8Vg(BeA9N69Iu)_JrVuiqrs%]To)AUbs7-(Kq>^?b8s#L1 +R$F#'3+"b1Q'@W#P +&-)V-rV,WTUu_4Ks8Dors8N#qs7Hhk*_3eD+P';/_^:_D#_Sa:.^qde*^W==-OD:MIC50==`4Nt%q#:3k +qYg +&-)S+qt8icbQ>r.aSs3ZaSa1$aMu6Dc-=JR`Q,pA^[gc-"&D_oD\uilFL,`Pfa@aN@5$M3jU'P#YC:I$U%_P`f]QECN`kQ'H;:Aoq!FPF%Dt +PA*9e9TGO*Q^!VQ;:VDgn+$&Do^hV?mHXH5hQAYe@l$!%e)]`^rq$urmHa**p$D>bf]:n"Nng,`lA#! +'?\D;`O_O>:K("^:PQX+aN2?A`V[^Zb08#NaSs0]aNDTFr6#&\r5ScXs2P)["3S^+`r='Zb5]Nj +^4]K_:hI]3qu-QpJ,~> +!VuTkrsJ_cjo>;Xqu-Qpr8R_Trs/Gsr;Zfrr;$9j&G=`Ip#b<7rqcZprr2rtrqtaS48o3ZrVuk1 +H^U+cO-s-?S@b)R?a))O\s:#q>UBns7H9tr;HKM +`Pf[AnGi=`s!dmGp%$(RI=aD;SP4?hLiRM&&FFA\%eai_>$3'u&kMu@9s8Vlar\jfL +s.WqeP*2&qQ$c"rUELrr2p* +iTT\&p$LQ7s7cEgrr:IHs8N2[jlG=srrE%K~> +&c_k0r:o'AVssT`rql]ps8N#ps7uZorVulps8)`prVum:rr)irs8MupqYL0HR\Qg^anl&9r;HZq +rr)irir24Crr;uprqpARR?X)"QX*-_@$ln@P*D8'>%hJ.PE))i5@eS3@#L;4Pa+pK/s_E_Q'R\s +:Wre7s8W)srVlfrrr2iq%0$2(qr#N6`nL4fp@eIb.JE`$_8NidRA4#S]u\+1a2c*7_Sa=3`4s:* +\9<%%@[agG^W+@._8=(g_uIRQ_\9u*_8aTUFC[s*]Y_b&_8=.._SH/f&\c?#`O8d2WEsPY^;%h3 +a7fK2rri)npZ:Z]nQ@24u<0iu9Q]jmHCJJ/uPEpDM +CN3$ZQ^F&%P)r4H94^Hns8UsT&H2Il\[&<=WMZN^rr<#rrVu'[qu?6d$iA\U +U7nC>q>U?krdX~> +s8No6q!GUo<3XHiccF2J`lQ6@`l5j7`lQ=%bl5cbblZ&/`rimZ!Q'Y'HBkBGkO.2(k@VSnL +M3F!`P=f(2P_k]kQBmFoXO4l%_oU'HbfIfFb/hU%`?3+@b1,+aZF@6TdFc@N`6?ENbhLq2nC2$9 +Tkh$sp?qqKD=R5hnaGl0kkXZ#Jmpc*KY-+*q>0UQo^hP;lKdj/o^hV?n*d-!@SB;Cli6hYq"+%I +o^h_Ko(_M^Xe$8Ng#Y_ +P`h,N5tt@GRuint6saS$>EFu3FYd`M9P'QXQ'7Am87kM'OH5fmQ?u!Eaiq`K`l5p:rlX3@&&uJc +@T$*$8PWa,aNVfH`obAA`WF-!`q%1Y^R&,$;I6Hgr;HZqJ,~> +!W2forsJ/Oli7"_q>C9mrSmhUs8Vm!r;Zfrqtg9irt*uBo(;,>s8;`ns8N#ts8MrTr\sfTs82ir +FENk1Q'.MO9klJCSs>S*PE\7JDEUdfOID@nCi:nkSX>h,O??6:S!KA(Q^DEDo`+F[$2jbui5NXP +c2[eBs!da8qYKs"H$b':Rts^mIW]^KEcubVH?aLNGBJ(QHiPES>(D*NFEMeMrHA0_3-KLlI!BUC +0-MoQK33A9E-$/EF*2_PG'8([E-c\WDFg7Q/pVS_F`W2apAP$fs8N&am.^/Ls8VWg2Z3RL=GWN2 +RZX,'85_Up\t3err:dQrr3Gnjm2^9 +o$7:8qY^l/_U;rrE%K~> +s8NN,r;4X2ZMOV$rVZ]qrr2fpp&=mhq#:^D6F-ViPP*ToVB/5@7PEV/lP!!Mr4&)9+R$'FEDCh'CQ^Ehp4%rSAQ'RW!QXu*JrVuiq +!<;urrr4/@r;QWP`l,jGs8N&sqYgO.5&c1F^VRk* +_o':h_>qLQ`"^,*_8F40a-VU;WPOh8]u%e,`5]dp_]?M5]ue7/RUW:e=gbiWa1f4\s8;oks8)c\ +o)JI^rVm!!rVc`os$?Y_rVlisrVlUnL7+-jOe%\-;a$G.NLl2e3,W=tQBRDd6#U[3DO-ELP*_\Y +4)7T(P`qB!PB_*Brr;`mrr2rthYn)bqtA(9WirJ(POJMNs8DlqjSf/ZnGWgnm])nRUriT8rVcbH~> +rr3`.m%dcm\]W4@b/q]CaN2B@`Poj:aSO'ZbQ>r.`r +!W;rrrsIZ?p&G'iqYpNor8R_Ts8Vm!rr<#tqtg9irt*H +s8N?'r;*pu_YF*/rrL=(r8bo27A6\XVnKgba2Z!4rkB5b_o9@1`6#!;Kn?)>`lQ-7]u7e* +_SlGm'Z@l*^:qaYM2@.la26!C^raO5`lA"r?Gj^o`PKR8]3C>fBpHBJ`l#des8Vurq>0sEo_\[g +rVQWprr)fprr<#trr)fps8W&tmmNM,OHu>pKK;)DOdD8tQ9o(p4cktnLam.W?Ug6FQCF%tPX];1 +8!0+)rf[\&NVibQrr;uss8UsT&,lA%fsRrbXfIiErVlisrR(TPr:dFfU7esns8N#tJ,~> +rr32tk)EYf\]4Wm"Ne[$`lS(t!6G)\rlG,^!Q`:[`=Ku0b08)PaN2B?`lu]Pbf9Y$'$8>;`kQ+l +>?kd>^WXsG`l#^8rlX6A5/tX\aj&#OG$g5oTqIWs2JZ5uMOBWoR[&dcG]["dO-YlV4_n;'M3tN`Q63ErlG&\!6G/ZHcaXc`jECg[aN%4`kp!Ia3N5`e'qF"ZsUZ+kO\B; +n*ff:oCMMBnFlAAcEaRQcLUAhlg+*=p@RtFmHa0.oCqtPrPl%DZde@(me-&DlfdEjlKdd'p$VD; +oC:USQ(W6%lLaGud-TT5_Tg0EbHAe)b/q]C`Q$'Fbo4gI`Q$!Cc-=DN`Q-KO/W5gVR@8q\1c'WE +R/W="5[e7dNg,Z\-tmF&7$Eq&S!&er7V?s9Od;AuPE]Emcd'MPbJqN?`lcH]a:?2&MHa"U:JjoZ +`lcEFa7.1Ib36nP_6mlM;-8D3qu6VG~> +&,cG+s8UX&r;Zfrr;?QnrSmhVrs&Juq>^Kor;QR%r;Q`rcL(,fmJm4_rVlfurr<#Ur\slUr;Z`i +]NLM`R$*_u5&tL$N0]QiQ][G4<-!"L=co#7G"$=2KpS-lQ]a=78O9dJ*/0s8<0!i5NXP +ht-jICB"2-rV,]oMd^FqD,6%AF_u,?H@LEmH?jaXG%tkc$jm7R5&>(RFEr+VF`V\JF)uABEHQ5; +1(j]p$or!?F)Q8HH?j[VG'.kLH\-H^C/Z!!0WpftJTGj_OjNUqs7ZBjs6/_?s8MrrnbtQKo>Odp +Q(!r"Rm9SIPa[`&NG)((4+`rdLcBKs +s8E9%qsgY]d.[D9rWE3"s8VflpAb$h!rr9!rr<#srVmK/s8W#\R&Hm^^&.g-s8Doqs5*bTs#9rS +s82N"=-\u:P*M1kDJV:iP`ColO-!@>E,\6IO-PoO6uG&=QBmf%OZ-Q9PaIZ*OH`Gcq#:9mpAY*l +3r]0Xi5W[PhspaFrVlisrr<#\]SCR#H>U@9`l#d4_8!_!^qmn*a2#p,Ll[X\W6)fd_oTd8_Sj@1 +rP^\2_S=*ZN09TnZ,ac%^r=.,_o9U4_o0I-_Rm_.^Q!h +&cM_/p"4RuLUY7Fbfn5L`5]gpaSs?]a9'B#`W!mV`W*pXb5TU0b/hTA`Q$'Ebf[rE`Q$$B`l5/e +@pN>Z[(j]-b/VE>`lQlkO]GD#ECO&lPEBoQCcI$2 +P`q>m2-WM4PEDN#O$0eoaMYp7aN2NFaNDZLbf\#H`Pp*P`jWUl_oU6FaNDuV_T1N\^m'8KMhTsQ +nac;@n*ff:oCFU)oDJ4TgT7p%alNKjjm)C0q=aFMn*TN2nacJMrm/3f_T:j3mI'<3mcrrskjAB> +Dsm2]o(qa\TNnt"M`m;f(6&CbqQ]mh" +78oA;OI1o:956G9R$!([EGn`7PDc$!Mk-,*=DL3"Q'7K!Q]jn-cHO;QaMu3=aNDZH`o4uL`P8'T + +s8N6$s8U[%rVm$!qtpEniVjYnrqZBis8Mroqtp6gs8:U@mHFYF +PEM#mR$MeYCMQ1oR[oS.R[./1F_WsfPadb&A8!raR$=&&GWS$OP+.Z'Q"ZBXnG`Id2Z)FO`5U(& +rr;ooqtg9gkJE66V5c51JTYsJEd2t]I=-p@rVuirs7-(Kr;Le_Pa@l+ +P(YhRMisWnO+p);;Il8YP$V.1EE7g[SWT"uQZb`:D)RN@R?<_uQpp-5qu?Qls8UmRrVm)algOT? +l-oY3rr(:Es8N5nkORutrVllsJ,~> +s8NK*r8aZOi;*BPs8Drqs7lTds82fprrE&ts8W&orsnqNR&Hscc2@S\m#Bg.EARu`l&PZ]PYBK1I)RZBgGB/bm1*irr4A+[8!Hq7_HFM`PKI/^q[Y"_8=(,`lYNDRZU0WkPtS[rVlisp&6WE +rr)h:G*/&XQ'-e]2iNohO,eo^BMi9.O-*^IF)Y-5Q(=&!Pa?P\Ec!^sPaR[5PR0_=r;6NkrVlfr +rVcfsiVjAfqt7b/WNNA"U%nWdr;Zf]rr<#arX/MNU7IaJlMpn`s*t~> +&cMb0oYPNXR_-S^c-+5La2Z-uaSa0caMu6=_o'I5rP]#]aND`Nb0%a'`?*%Abfn5L`Q#p?ai;,] +>\%,KK=8M7cH=5I`Q$!Ab2LEk`Q?*E`mV[ZLQ7[kSaNDZH`o4uMb.t3! +<_?.b;HUWRa2Z +s8N6$s8Ug)r;Qlsqu6WSrY#81q>:3lrqu`kqtL*ikNVO&kPkJ^r;Q]qrr2rtiVkk7s8Duqs7K$L +R?Q'Rf'8MkjZPa%N#N)Td#=*L0J@=<`QE.;nVH?sj]G'.tLCJ5i25u!Q5PaInD:g-SZR?W1^EGIFtR?a/#Ss5:,?>rAINh);qS!8t0q>C*hqu6WMrr2p%nEBH6 +o^^H0rr`5tqY\hA$ig2(jn&$(oDejirdX~> +%K?D,r77aJo)/Les8N#rs7lTds82fprrE&ts8W#nrt>.2SYiBmi;9qu6Kms8DuRDMO^!L:P:@^sBa7_86,frkfDdZ&4g.R#m9!`PT=*b/_97 +`5KRm_E,TTbFaiTP*_2fZFe/m]"c5!^r+(+_8*n)^W4:K^AVR$2tZE,%4pR$rAINh);qS!8h* +q>U6jqu?Zps8Doss5Eqds82]>Z)t+0X.&JTs8;lrmJct^mJ[=fjeA04UY5VGJ,~> +'`7k/nZ6PEZ+n5ubKS)J`PojEk)3Q'%5u5?`2@3g>\dPqR;B +G`e/QQ'4ZlHB4/QR[8dpe'H%M^W"4:b/hTFbg"AQ`PTL6dDWQ2^:`%IfZhabbeh3Sb@H@$I\GTe +o^i+OoBY`2nalABo_7IX^:(bf]@6WKlgFH>n,MqVmh,*^q>ARS^;J"/_s$CTkN240rpqB,q"XRQ +mHaWD]YqIhVHp@*:sA(Xdc]Z?ce") +s8N6!s7tO%r;Qluqtp?NrY#81qtpEnrqu`kr:^-ig[t%$kl1SarVlisrVlisiVkk8qYgHmrqToW +OdM5nR['.;EcFNfQ'[c$R?B!"U)%>Fp11KnP?9nb;lt@RrINj7WHNs8DKe3Vf"UPa7c$ +R#s9dL6\!fQ'*t@16RocPr`]"3K9)eQ'@PtOA9&">!S19PEDDuQ%`]Bs8Diprr<#Prrs8NAdo_%D4s8W)tJ,~> +s8N&q#0EdJr;6Ejrr<#ts8Voop&Fmfrr2utrr<#rr;RK1s7MeQVQ@>urVuiqrVc`qrr2lpiVkh: +rVlioqt=qQ]IA5:3'T/OdqST6t\QCS!9/&F?E-[Q'7JuO\Nsrr;Zfr +s8W#rs8O/>s8Lus_nh":nb2bXs8N&uqo2L5Th;u<]YqY$_86)frko>e[Z$3+QC*MkVS^0g`kfIh +`&trS_8=.0TotS+PDYEW[)BYp_83k#_8F1,^qde(`6=1%O,]3RDeu,.CqRNqq>U9jEFh[!8`ogH +qYgFR$!_t2E?PYP`h5m1Mee.P`_1jC2Z(jNgGupQ'7;)>] +'Dq_)m$VL-^V7S)bg+GO_SsO9b5KNdb/hTBpr*ssaBODmNt300Jj +P*9oI8!&guR[TC*YLU_3^Ve(8bf7ZFrldCD`PTL6dDE?.^iW2ue^E!m`P'IQ\43] +rVlrdgZeY9"8r∨$?lr=&W&s8Dipr;Z`qrVlijrXeu)s8W)rqu-6cs8UdJoB#TCs8W&ts8W'# +r;Q`riVmoqrr)`os7_=fQB@N!PF7SE3cT1'J=;alP*_Gu>#fQ1FH`#U?;`e:Q'7`'O#f"\NgZ8u +P^mB>s8Vupqu?Qgs8;oos8W)us7cQL_SIa,G)&?Up&G!crqU&aThBHWG^+LZG^+CTG]dkBE+VcX +$3^J0!"oW$CN=W@F`qnLFE_qVG\_.J'E%oX!=0&tD0C,HF`hkKEHHGMIX#s4'`\=9"9o8[,E/<` +H\n!4p\'VKE-#u".Q[8#qYpNprV?KlqZ$QprVlcps7uO^PaR`!R?EUe2342mR$;>V1-hs8Dutg\q3Nrr32[oC2GIi8O\8s7lZmo)91"rVuls +s8Drsr;QQmrVuogrr;m&s60+Lki;^Crr7K~> +%0$2)qm`BDq#13jrr2iqrr2rr!<2ur$i^2*qu?Torr;uts82fors/Q'rr)fqs8Mus#k*qMWN48; +rVuips8E-#rr)fRr\slVr;Q]gLM`<=QB[T#O^g@hE'&N9PF.GsPEK$HDaST/Q'>QO3.mHYS!8pn +0U@`eQ]RA[B_VK*#Q4W!q>^Bmqu$JtNfB"&`l,a3_8=+-`Q#j2_njU2Q&:cfOc>6O +:n"OiV7XS3s7VOXEcc+s-opkoq>UEo7K3/`rqcZos8N&ts8Vlj7?X%$OdM8l1H(>_QBm\J7o`]Q +PF,QMCJ&E(R?Ei&Nfct +-iNr@kCd3%]tqV+aN_rK_o9X:b08,TbfRoD`6H9?bf7fEai29BaSsC/b/hTA_o9^>bf\#H`Pp!@ +aM4iV@:E]$[_Kr)ai_cIaMulM'P_]u@e%]Xk1WUSV&+f#H\4g3Q8"Ame%F,h(,^b/q]C_9Bm:aiMWD`l5s>b2,%2PE;$" +QB?+?k:.]ZD_TU$Cn]26_a2u?AaMl0>`5][;`Q60la:$#/[U;j-?&[b;s8RT~> +rVlrXh"9/2qr;$?krs\hurr)fps7ZKhr;HNerWN/us8W)tr!<#ps8(RIn)F$>rrE&ts8W)u +r;ZfUrr;orrrEgW/ZPb+2'3GWUeR$UEgs7kG!LOk51LO;nqrr3o6_IK['4c"E,G^4RZG'.kDFa.M49G7X3 +!Wi9#"9pbsEI%P+$?U<6FEhtOD)`.0r;\SR"pd8'EcQ5AF)ZA@F)cGSE`3eX"9AKbi"0q4%c +O.4nkDG>(fEGp,>8QkogrqZQn7K*/aq#:9mrVlfns0H*rQBdc&Q'!LpQ'IK#Ou[)5NguAo3-8;% +NL-#qRZ`t.@r?*ENKo]mQB[Z#PZkHkr;Q]qrVuoPrW)iprs%]Sn+HD;g&D$Oq>gHarWrQ'rVuio +s7uTlrr`2ns8DNf$iB\unauJ7i;`iVs*t~> +%/p2'po1(;q>UBlrVl`ps8N#r!<2ut%/oo!rVc`qpAb$grVQNlrVm$"s8Muqqu7?-fp&5/XOd7G +s8DurrVlfrs8MuUrque2r;3QuQ'IQ!Pa%Gu>#8pI7rXcYQ'.Z%O#Lcl/XMZcQ7uZ?NL5]mOub=N +RZN\sQAnVsq"Xjgqu$Kor;Zfor;-Hnq#C3I.>E8&I#*5Gq>UBnr4#h+P@2,A`507)_8F41^rFO4 +bIEN1N_P\$P`q3.`l#^2_ns7*`kK=)`Q+[5OHGipPE(W^[)^/(`59F+ai)98_TBd.P)PWhNf'*a +Lj)drQ<^i6p[r>tEGof2FD= +'E7t*iG`(f^r+.1aNVlJ_o9X:b5TX(bfRrG_nF.7bKA5Ja25d8`QHEKb/hTA`Q$!uaqDe8`Q60B +a1[d8?!h-+]>DY.ao9EcaMu6@b2:9Y`Q$-Je;d._PEhW'P*;29;/0i:EL2rVPF[u#3,3=]Q'%5o +/mV,.QA_&j3%olNP*_Z-M*Jr'_844/aNMiFa32HA_8XI0daQ,RJp_rgJo`p&bJhWPY$%QcFPuBO +o_A4Rn*B9$oD8%Uk.AUPrkVUM_SP.-p%%P@p@[kElgaQ@qpE$c\\5o!`5T^YoBki3oChYJn+#f6 +nEo>R]Z.n)\&6.lQX?GLEm2JdhGlgTC2@L$ANN**d*9VTaN;B( +-W6(iNgZ"f@Ps(3P);,:<`"[ +rVm8[h>@6Orr<#tr;6EfrXAZ%s8W&ts7lWcs8W#rs7cNjrt#,,qtL*ijl?(%ir8uVrr2lr"TJ;r +s8V'W!WDins'Yd)g..EqOI2;rRZWk#C3=,RPEVB#N0Tlh3cJ).O-l/]3AH;ZQCO.I085pVR$Wr' +C5;Q`q#(0es7ZHjp](9mr;-Hhni:l@LkL\5Lk>C#s7c4lVl)\'H?aUYH$FK2EXHr5D/DiT"onW( +"TAB5">s_0H?XOREcuPREcPkO'*S14('+OsAoVg3FEVePD/Xc>BOVta"98E)rW!lI.PuL@PF@Js;d!`nOIM]' +P*_M$A8Q +s8EE'n"?T=r;ZfqrVlfps8W)urVuj*qu6WqrVuolrq$0irVliprr)isrr2lrrr2p,rr)])RA?ab +kPtJ[rVulq!ri6"hu3ZVr;Q_>qZ#5;PaIQ!P`V;oPkR>3b?<+1fRPC>JFL7=Ht +P$fnrS;ru&OdKm^Bks7cQfs8Mfns8Mrms8)=HG'esoMLUM4nbiF_o1bUK;67RN_na((_o9X6 +a2Pd9[#'m,OcGNdP*;!-aMYnd_8=+,`50O/_S`"(MiX-gP*(fcO1!'K`Po^2^W=:4cG@02Q&1W` +MjBZlNJiR1PGDcM[Ij/O89/lnD/aQ7>tG"irr;utpAY*lr]C/Zs8DccAUou.QC!i%N\s1cOdqPG +5W"XlN0R:CAiPj?R?Nc!QU,/!EAr??QB[Z#Pa.Q"7Gn(DrVuZl!<;'Xrr3B'pX?IPY-+jpn+ln\ +s7?6hrsAT&r;HZqr;ZKfrr2upo)A[h$2qf7R[C&Arr;tJ~> +-ia)7dUZX[`5]g9`luZH`Poj_j +]QR1W?YQ=P_oB[:b08)PaN!,YFN_YC`luTV\i,V8OI_f%Q]RFrBlmoNP*2/tMj0Zd3GhZ$N0TNQ +2D0ZNPF7M=/;'IQR[]M,?ua]F_84=2beD'7^WFaA`l?KUdj&UOLOY,1LND(kb/_q$T;l/:jQl:, +p@e.Ilg!s4p&F6c^;e73_8-r'_SP.+oC22>q"O@Hq=+.Re%N9'^;%Pa`-95bp$M&3o(25`lZ]Tb0@fBaN;N>n]2'U^4BB^;JX2 +rVm&Xh>dNPr;Q]ur;6BhqYpNp%Jou$pAFsjr;ZcorVccjrr<#urr2p,qtg?mf';kokl:\]rr2lr +!ri)orr;$XE;]_0s8N&ps7JgAR?Eo%P+%o+P>#.sBL%iGR\#q.PZ_"%0U%`bQ!I$XN09Nj:-Fi* +QC=#!Q^C#0p\=dfr;Z`qrr;oirr<#qj?@^9LP(A4IXPumh"UTAHDkseI!9aYH$FIQEH-&@EH+V]% +KZP/(Bad>!!Y>oEdDtTF`VYKFEqLQ$jQk:"T/66#!-C;EclSOG^FFJDeNW#":5&/#lXfF"ooKU/ +"r4iVV&dSFDQ#:HuX%AF_ASCGGaXDSPa7W"Q'IItp%nXbs8;lrh#7l_qY^?ms5o^C6.s8MupnbrRdrVlg(q +tg0fs8W#sr:g6^rX8Z"s8V +#6+T!ihWLErr3*!r;HWns8W)urVulsrsel'rq6-frql`pr;Q]qqu6Tp(B4:2rr;uss8N&spS4CY +X1@p'rr2lqrquots8V$Vs8P=]s8W)nrpiC9R$*c"OI;Q$O\/_kAj2E?R%0M&P#kUt09VN^P[$gT +Mij__*^qmn+ +rl,,[^r]\4s&r8\aW15&kCZCisK+CiEoDq"Xmbrr;lqrr)iqs8P1Ys1V6nP`qDuPE_>b8!TR+ +O??$IQ'[_a4)7!4R$EktT8lNJCihmdR>I5oQBmc#Q'+B)r;Z`qr;Z`mrW)uXrr2p*r:oEZYHG(3 +QJ;66rr;Th!rr2trr3?%q>'sgs8;oqq#Bpas8NE(d@d##U>c(MrI=~> +.0'/4_.6iZ`lQ6?`QHEE`PojaN4A's2b2Z*6?:FaMu6=aiDNB +]4"cC@<8ir`Q6!G$=AifaOHGWf +>"D;CO-G\u3g>hoR['&%Ot>2.`5op:ai2NDai(p9dF-I]-=h=PJqel2J7'P,bL28_W/6Dem-F-4 +p@e+HmI'N>s6@25`5g!<_nc8c-/&%`nF#i?p@@kJs8('N^;.S'^qRY(`5Up2mHX*.n`fH+me?Hj +pqOPd]YDM%_SjX)XjU:VX]2slZnQ<6G]S7PEcGhm)qNHea2Q9=`l6!;`5]j?et56jP*D9!Q'@J` +7?a.#OZc-GPEh;Y3GCR,QBRGlSW$0FCihmdR>I5oQBmc#Q&RQPc,[Z>aNVg+a90Z/aN!2[&BW,= +^7AD%8kMuUS\rLf`Q%Mj&B;T*aj&#ObKJ8`dE9VM^Wc5h$HKoB=Ai.+Z0V>fJ,~> +$3'u)r86E3rqZHjrr`2rqu$1-`q#CBkrV?Err;Q`rr;?Qo%/Tr&s4$K)lgOlQ +qu-No"TJH#qtpBmj8NHarV?Kls8Dro;2CR)Pa.N$P`V8q20EYJ4IMA!P+mr(4Dn2*O-uGr1cL;Z +QBcQWR?6#CdhG^4[iFa%\0B+k:G$31&1 +r;^+0&mS7NT5%ok96>/pEc5`>F`_tLC,l(grVuoqrr)iqqZ$Tms*ARNPa7T!P`hB!P*2&pE^;mN +QB@V3>[U*gQ'dW%N_EVsBg%Q>S!B;)QBmc#PDr3.qu$Hnqu6WNrW<#or;Q^#hsU40mb[I4rrE#f +rX\u,s7lQmqu?BKo_eahq#0d_#Q4K!s5`G3i;N\+~> +#64Preu#VErr3&ur;HQns8E#srr*K+rVufor6=s1s7?$cs8;lrqYh--rqu]os8DrsrVuiaRAZsa +`Vf`8#QF]#rr)irs5X(rr2fmpeHX2QBRPsQBI8oO>CrkB0)B@Q&qYsQTK%a>`P2>N&*AK +Q^*eVPF%>uPEM>rQ?.EKs7lWor;HHes7lWop\=;IJ;9#7K6iB/J:M3]qXd%MThDc2rkncQ!Q2kT +`GiW1Zu^hYNK]QfO,oEdO/U(8_SO+-_o0@0`1;1(M2m[YN/Nd_P)Z`d`59F,^r3h+`k9KDG^bg9 +OHPN`PE2#i[sED!F*?h=C2Is1D.Rg0EHQ)548JdOs8W&srVlfns8VrqG\`\2QBd]#PaRpKsCoDARfq=4IarsAY\Un+3QfDY^IJ,~> +.0'&+Z"%7Q`QH?B`QH?E`l5s=b0A/QaMGd<`m*&8e^E0j`luWD`Q%\os2l5#`l?!?`lZ3+='8O1 +ID3eFai23@bg"AO`o"j_bJqK=bKA&Z4b/ZZR@9G.PE2&m1j!GF4.).rOeI`$3GVPsN0]ff0f4ZN +PEKpMRZa#"OI;5nB4K?<^WF[=ahtp<^Wb$Ie^Z`l4KO/3?eLd`'@*n-&lg=<9o^hP? +o()hR[DBetaMu39^V.4fddmD*Ie!(&p%/(ZfXJK1`5TX-]Y_V)_;k+PlL"*2nDj'0p&Dn?^Ws^4 +`P'+)^;I>/P)Q\kG2kYlC34W&n=?OH>rsQBdc%%$[$@LcO,5`P]X7bf]q+"3ep-`o4uMa32cGX'\Rl +9N+i=_T]s8`q.7_`l,j;`6?f\f$:eGc-FSL`ULqT^Rne0 +$2ji'p>#$7s7lEhrr`2rqu$rH9QI-P*M/t=@-)P +Q^!o"QBmc"QC!huP=5*@s7uTms8=#=o`+YhL5C_4J;8l0Jqo/84k>.0VeKI`Is$!ZG'3b)"F+`e% +1E(6'*SI +Rt5!/tSq%F'Eg1G\hVRE,fltQ'R`#Q'7))o)AOdrqcWoh#7BQqYU9l$K^[Jn*TGss8W)snbs'tr +;ZcrpTn`g0V8.;rr<#hrWrH!s8V6CkiDR=s*t~> +#64\qbbMiErr3&ur;HQnr;Q`r%JKi$s7%T^89+Y/s82cos82d.s8Mons8W)ss8N&qgmP1BXO@%F +s8W$%rr)irs8MuVr\4BOs8W)urr)RpK9VddQ'ISsSsGS.6p_SUEoo)9$srqu/aSY)Y"r;QVE~> +.KB8'U0qrI`luZG`QH?E`l5s=b08)P`lbm4b1=iJ"Xcsnf$)+Nb/VHsaT'C#aMu3=aiDQBU/tJs +?AuV=bKRuEb08,S`l6iVs2eZd_TL-Id7J\GQ^=81Q'7i,PaXsCG%!h&P*^uoO`rm-0TVBWQ;p.K +O-GcmO-uE!OHPlpO,GaBccj2GaO8>V`Pp0@g=AT7JUr#nL5:J5KS4b,`,'4cJtUiclKdj/rq-6\ +>P\'f[_oko`Q#m:_S>kRZ2>Q<^i.6Od;2jGXH7j0NX^-P*VAuQBmc#PD)BQcc!f?`m2`JaND`L`l6oX&BDr=`NsAT +7nloaB#2a/^rGue&B;Z+air>]NCjH`G0e@UbfB7p$H9iaB2_]/O5p'9J,~> +$2ac&kM>q5s7cC*g&-)P,r;#"g+s8Q;o_SUfqYC*jr;Q^.qt^9lrql]pqr-i)kl:\V +q#13l"TJH#q>:0kj8K/Yqu6Qms&o,'K9_ddQ^*i%PEV/mRo<"#?p^9KR@9M5;,0euPa[bp4ue^m +PEVK%R?Nu(Od;H#9%C"PG(G:&N/31:KS,,?M0D9WYFRe5H?jXVrc8R_5A!!33+"9&9/"#OV1H?a[YF)>_M$iBu+!sJi+!&G*RDKTu?FEi"XEFfjh#64r.!!rZ+!!N?-% +:=Hl@%DL-FEr+OE,ff:G'%kEF`;Rcs7cNm5Pb3 +KonpR?a1l4_]'nH'+PXQ'7JuQBd]#P`/N4s8)cqr;Q`Orr;m+qYpNpo'c5^KiWZ<<*GPqF>s8)9b#Q4W%kiCphli-p7~> +#64\p];3OBrr3*!r;HWns8;lrrt,,.r:eb]*?6X-oD8Lequ?]nrY#81qtpEnrVZZos7XC"WNNGb +r;Q`rrr;p#r;Q`rrr(jUAcMc0rr;urs7TZLQ'd]"Q'ISrOcYZm;+bb55aRe'R$O4<9hT,_R?o +1-q(hPE@h:30K\lR$%c`jLR +Ybmo_rVccroD\ah%Jg#'oqrZL)KbiRs8VrcrX/W$oWt3^Tt(%"qg\~> +%fcC^NaI1Aa3;cH_oU!Arl,hsb08#L`Q#^7aNh0s#65([a2lHE^W"46aSj9]aT'BmaMu3=aN;T? +N*'(Z?C\h1bQ#Nbb0A8V`l6iV@`cg1`5p0JcUrPDPF%l-Q'IMqOcc)195n6(R$X2.Q^LTA8S+$N +O,?"VO-PfgR[Tb/P*1flRZ9J;bf%N=`llKHaNVWJdNi@KJ;B2?KRe]&JVf/)4?TO8@,gM9jQc($ +rq(1$o^_IY`kT=3_8=%)^qmt._Vb7`nEfK1oCMq0]"Pi"^rFF8`P]R-]Y*.nnalJMq!dnGoXVQY +`lPI(cc*Z5a25["l/A:TTS5sL@r?4$CLh1-I!KXNB4Mq:aNMlQa3;]HbKnXq99b^.QBdYt0Tqfb +N1-#m1I@1fOcMD22NX8dQBIP`3bEOhH'+PXQ'7JuQBd]#P_VKRd)3i@aNa\+"3ep-`Sno +$2FQ#f%p0%rqQ9frr`8tqu$AW +qY^Bnrr2rsqtpBmir3B`s8;oqqu?FoLR+3hR$3i(PaRl)P*SLFF%(,4R?EerPsT+IJs;UiC,(7) +Q'@T!Q^EH>Duqu$Bkrr)irrVl_BG*82YQ'IYsQB7?"Od'Z4O-u)rF$ri2 +P`qK"QBOaGF>Aco`+pds7-*frrhBEm- +#6"PpVP_N5rr<#s!W;rrs82d's8Durs89#C*[5"err2uprr;lp'*%t.r;ZfrrVccrnZnX]YI*j! +rr;uss8<*"s8W)si;R*`rVucjs7TNIQBdW"PEqPuQ^*htPX8bt6ZA-ROHPZh6"W92PEqSM0Ro@P +PE_2pQ][N"P*;)TFSu19s8Muss82Wko0%STK7\c#KS,#0Lk'r+HUa*n>d1oVaMPjo`,NW2_S`O# +G'8:^G^P.$NK93cP`Mf`_o'=.`Poi]H[1!fH@C0iLQ7IYPEV!1`l#[3_8=%.^jL0QG("OdGC5@2 +P)YQbN5EEH:S=a\C2S'1E--,>Df'E7DKKl&B))9$rr2lqs8DomGB/h2Q^*glQBIVuQC +.KB+qG%6-8a3DiG_p$?E`Q$!Abfn5N`PKO2c..pc$O8uGe'Q7Qa2Z-tb5KE]ar/4<`Q$$Bb.;k" +:f_53_TU'D`Pp!Ec-48KhoKl\c,7TCaNr*tH]F;WT9Y_0PF.Z%Od/:BE^Xo0R$!SlP!ZhE'[3&OcYikPE8+;EAEH9Q]d\uR$O#'Pa%N#LGRH,_SsO;bK@p*ao]Z(`o4uMb/hfK +\r9W[934qc]>_P$`q.7_`k]^>e]udI#mC`%d*p4Vc1/j^a2,B0=AMV#hY7&#~> +%K$2*g"ZQ,qYC$gs8MrhrXAi(q4K#X,*Mg$s8W#lrW2rrrr;rrrr3Yin*fK$s8W)urr;rrr;Q]n +rr<#Vrr;pXrr<#rqHecDPF%W$Q^3f"P*_K!O=+dS30TMnP*hAd3)EY>PEh1b9p2$-Q'@T"R$Eu+ +P*h,/o`+mhs"!pFs8DUZKSP84K8+u4K7Sf3KSP>9K1^/h]SCQPH$Xa]G&_D2;@j3@!Wi3!#mCP8 +!!!0WCM\4oFouD.&cqh/rrE*%rW!?65B(dmF`__CAeP4Lq#Fk)!sAT.&QO%+Gt"Bs9Qb8oEH-&D +CgD%*DK']=7)JWsrVc`qr;Z]g>DSK/Q^3c)O-c/qOID=j7$EjtPWEJ2P`qH#QB68UE`?#%R? +s8N5gV52`@rr<#ts8Drsqu6Qo&,Z*k+<2D^p\b'krVulrrVlfps8W#trr2p.r;Z]iTV&']_Y=*. +rVccorVcp!rr)fRrr;pXrr;uppg&EPEh1b9p2$- +Q'7JuR?j2,OHbQ%o`+pis"!pFrr2RYK7ec(JV8N+JUrT-IY!-(KM6T$f>GA@_ns.)`5BR/Z?CJ< +H[Ga>hLV>c!iZEH$#?E,T`+L?arr +&cM1?F(CKKa3DcA_9p`O_oBjubS\LD`P]U9aj>MH$jUe%d*BbN`lQb08)Pb/h`Ji5kr=BZeTFbKiIoPa%`0Q^=#$Q'.K"P`R8-AN5m:R?Er"L,`"1 +PEV8m1JO%&O-c9'PEV#hR?<\\5L@fs_o0^8cHt(g-uO6WI"[?2M2$Y9U`PTd@aNDZM6@=l^Q^3c)O-Q#o +OID=j7$EjtPWEJ2P`qH#QB68UErT)UPF%8mPEM8uPa@]#R#u\UcI'q[aNM]H`r='Y`o4uLbfA#O +_l-^29heMYR_ct_o#MB^_SX[Fc-XZ:&eGc3c,RZ@n]:aN#eu3u7RLM/pA9@~> +&,ZD,g"cW-qtpBms8Mrrs7lR$rV-?l@NcjBYl+Csrr;fns8;iq!rVrprr3,VoCD21qu?ZnrVlis +i;WcTBE%r2rVLPZR$F#*PEhJtSW];%PaRamCJn8pPF%PtNBq8GEKlTSF=3',SC#"G_([&L5L\5f-bK8MRBV,q,HF)5An90b:: +A9E'4E-Xq2qY^BnrVQWnohUR8P`h?%N1,usR?X%t.tX.YOCV0Z@[*+@Q&q;"@ouQdPa7`$R['5, +PE_C4PR)DXq>U?lrr;rNrW<#pp\k*ukO7p1o[r[5s8DKe&-)S,rr<#h/fuAed/O(Fr:9jdrrrAc +jRMj)rr7K~> +s8NSiUo*,Ms8W)urqu`os8Vuqs8NK+q#CA#)]Bs&qYL0is8W)urVulqs8Murrt52/qX^2MUoho< +rql]ns8;osrVliqiVioYrr)iqAGl7AG*S/RQ'7K"P+@c%P*DB!1i#ukNg#fpP)VbA6ZJ?QRWKp: +N1?2tQ][T!PE2)pNDB0Hr;HZjs7uNdATrWXIt`]2HW,!:It`N.JV&H'7dSdH]ZIn*^r=4-aKBf4 +G^945GCFseIuBJQNj$CE_SF1+R=0:$H$k!cH['d]Its#GOcZia`4*n,^qjl4KR&)nH@'s_H$t@* +P*Cfa`5KR-,\PTQ*SOHr:E=AXs@QC=&-Q'[l%PEqGtQ$.KKrVZZos8Dcnir8uX%fH>(r:@P*YH>%$aS#E0 +o)A[hrr!6(s7%TV*?`T)s8W&frX/W(r77^6S"o*Es*t~> +&c1k-DJ5]YaN_lB_pd/U_8aXsbVI>^`l#[.e([4t$k89IcH4/Ia3)WNc-48K`Poj>b/M97`QQTG +\62m1>`-54_8aF:`qdd9a90H$aisb0A'e%^OHuH/Q'I]!SW];%PaRamCJn8pPF%PtNBq8GEKlTS +F=3',S=#_7O-#?]OIMDd3RcHs`5B74a3iI0@rd$EK8G>5=E]7GMhcq5JU`#2i7dJcqXZ*a@-rF;iD-g^m4NGje`6$-?aN)F`K9hgdQCEi%Pa7`%Q]3MI +R%07K:e>,\PTQ*SOHr:E=AXs@Pa.;qPEhT%R$a,$OD%b=ccjVUbK'FuiQ)PR`m2`IY[gL%8l&!1 +]Yhk^a:QA0_9LBQc,0ku)]5p-b/qTja9]_K +&,cJ-g"uc/rVZZps8N#ts7uWopAY("nKfD,+k?Vmr;HZqq>UElrVlrsqu6Tp"P<88kk"]O!r`&p +rVlisi;WcT#6+Z%rVMpprg#:+P*M9"NgQ&pQ^!ng1N"q1Q'dc&RYih289A;KnbG"pG)3"U,#1!!!$&#nfXBJ:;EZ@N,ae!!*3&"TSQ,"TeQ%*sNNcG("rn34,VP +E,%^0A"rAO>Zu,aF`hY5?haTsrVldEqtWmHQ^!`#PuX-6Mk?/sGU8Q9P`dY92NjDhRZs2#3,1L6 +RZs&%Pl?dUQ]mZ$P`h;;Y5A1qrr2rqgAV0OqY0sg$1[EPnb(brs8W&erXJf*s8;in@NH^>ZMaRt +nc&Of#laJTnFGf@s8RT~> +#QO_TU9!_]s8DrsquZlts82d2s7cQnrpCmL+<8i0rqucqs8N#rrVlfps8Murrt52/q<4-?V6AVN +r;6Nms8Dutg\rf)rr)irrquSXAWr7?Q'.DsR?!Z!PF%N%J2;'tP*MDuR$rmeAOqrMQ]3AKPl?k* +Oe%T%SX5J&PXP3Er;HWps7lEQ3.lj;JVSM/c%\/XH&$g!ItiSfA*r*i_oBU1aMGj@WdJi3rd+Tk +s*>H*H[:!mOHbfr^;%V%_304jG^4[cI!Yd;*-cg[L5h7TY._iq^;mg0F+J7SHZFR]H?ja\I>7`[ +@>MM3]t.*+Y+n@(CdUa%S`em5=)`&"F_kDip](-irr<#tqFHR2Pa%K!F`-'OIUOtLT0 +P*_<"PaILkC-%?CPa%GuP*(lnPE_H!P*TFWqY^6irr;oqrr<#Trr +9DI\RC2C&ga3;]B_pd)S_8aR=bfn5N`kBR>d`i+2'F(nrd)a2GaN2TMc-48K`Q$!Ab/M99`ll`G +XAi>"?C/LG_8jL9a2l?Eb2(-R`l6'Bc-4DYG>aHdR[fV-PaRQ!P`qGuR=I)20p7fhPF.er0kEn< +Q^<[ZLm4*gR$3npPF.f)P`7EKeB#VJ`lH0Kb9_@[Jpr>p1s:P.;0@\GJ9uou?Wc+jF` +-'OIUOtLT0P*_<"PaILkC-%?CP`h5lNK9-gQ'Rl'OHE:qbg+DUb0.fGaMu6Ua:HJ6c-"/9Dbj)" +:eGZ;_8l,f&&uH'dF-4^bruRQ'U?q[a6q"S`Lg*t6X71ipOE~> +$3'u$g#E&3rVlfos7lR(s82]np+%@..J*T>rVccpq>UElrVlorqu6Tup"8m)k5>8Yrr;oprr<#U +rW)orraPj(b#OaoPa7N"PEh;tQBmbuQ'jF"3f0/cPF.H)9N!m%P`Ck]=d#5()*[KS+qQRD-@kMUk1IMMHq:F[k]7L3.KYF),Z-65'G-"8Mot!s/?#'+R?JG].FV +$3C2/!WrH)!W`H+!WE'7"Ubl-E,oi1=VLrO!!!6(#Qb#."U5&-!+,g<(0>U,JPS^XWbPa\3jS;; +li-[5;KQtlI!7a:q>^ +%fcCOUU'Rjs8N#trqu]nrr;lp%fcG's7.KV(FASMs8Drsrr)orrr2lrrr)ir&cMY&eX*,1YNl,b +qu?Worr<#Rrr2otrVldRrVO`9PEM&lPF%JuP*_K#P`h<"1J'WaQBIH!OJ#9F3J!ETOYU(&RZs2& +Q7RrPQC*l"61k-S.K9;DpfMfnK7JH(:78i0M2KkJIYNT/Is=``ikiOK`l5a6`h[p"H['i5HG&r.THZsa]G]n7UJ:s#HLUP+; +_0]!tV.WtT41"D8kP=b%;KHnjGB,_+q>^?ls$6JZs&"Q7Q'dhq-]==[OI)0"4b]8_F@SKJM3sNi +R@&Xd4a*3TQ'mi'PF[r'Pa%N"Q'P,#r;QZprVucorr<#Trr<#ur=&W(q9ZFOY-P"%pAFs]rX]&. +rr;upr;Vj&)'5.Ds8VTf$N0r'mA6>CU!EN7J,~> +7JPraSs1ma3)WMbKm+NN0]j"Q'[]"P*_K#P`h<"1J'WaQBIH!OJ#9F3J!ET +OYU(&RZs8(OX>d=S"5k*0%JIpb/M69cIYF$I=crrIR]I.[=NkR5(A9\sR]"Z&"_nj1,^r=1*]tD.u`PU^9qYBpY[]dig^s0g@`l6$B +bfRlA^W+=1nGDb=PZDb&DI@]HUXm9"g"UL;DJN[0FtLbT7*NNia2,aH6A1GcR$EUXMjKloQ]mk$ +Kp[jA7m2Q_R$<`$R"RC]G*nDWR? +s8N/lgZ8>5"TJ>us8Vim&,H2(r66N3,"_h2r;Q`rqYC-jr;HWrr;6Kn"QSA0mcFHJ"9/?"rVl`p +rr)lOrr;pDmn/b2Pa7N"Q]Rf&QB[N"OcPe`7W=HXPaRMjQoe>CR?igiOHu"-PrFg\KVXosQAST3 +rr2rsr;ZSn;0n4WL4iorhn[1NdAS[SKS,/2>);g]J:DW[EboAV'F50P"9\N%!!<#t"q!5)Chb[5 +q>^Nt"8W!)!X0/oAnc$b#71b9!!36+!9mR? +%KH7CUV$?ts8N#ts8;fns82d.q>L?iaWMNB7K<2]rr<#qrr2lqrr)lrr=T&/s8Mih^Rh=&ZLn1o +r;Zfqrr:dQrr;rrA,Z>o8<9%!P`qH#OIhZ%P`_ArO-VOjE0-NQR>m2n4'#(DQAmb`QB7AqPE7MQ +Um-q)M,3^?rVlcos8&`iFbbO"JR"8o_8OCBW%!FNJqe\ZOoO+Jc,.B>`PS?nDgQVOGl)biI!U!_ +J:`Q9R`*%[Oa(u!I=6HdGBnL[H[U\kOo',Q?s7fT+Ecl27B1VpqrVuosr&JD9Q]mYtOt(jGOIhc%PEM)nPse/AQC!f&P*M;U +4[>9mR?Ys~> +7eYi+Apq>+`lQ6?`m)cJ`Poj`m)T? +JQH#VA$a4n_oTjm2n4'#(D +QAmb`QB7ArP`./DUm[O8KKR`4c-=;HbL2D:EJ]C#HrGXFZadWcS0iuAJ;&5GId,))o]u)FrVPK^ +ZG=/kqSdd&a2Gj3]Xk`#qY:$7\[]VtaN2BAaiqiJaN2B=`Q#j:i;``Tpo_-C]tDD(`P]=#^;S(6 +a2,C([_hn9o&clG2lN]JF#u84`l-<\ff`ANG'A"80[[hZaMu$8eld3^Ockii.X[SESsGS(P*2&p +6qC7BQ]mf"Q'E>44[>9mRus#"P*_#oQ'mu'PEUb^dEBeYc,e#IqoJf[iQ)PQa3;ZI\VaB`92JSf +[)9oSaT'6i`6?]Vc,kPF&e[s\_og*kaT'9d`O/rA7p)>Fp4*~> +s8N/ehWk(>#6+Mts8W)rq>Lg"s8Mr"+h$i10M#Qt>;#6=uH7qG+4 +((:cT!R11Y-uKhlko +Fli#erqcI]BQS9:F&n.ms82]ns7h^lR$*`!Q9nc;Q&h&nQBIZ$M(^M-JrZ1cPF@T"D_lQlSX,P& +PEh@uOd)6"PEqM^@/Km"rr;oqs4[GRr;6?grs.`Sn+6"ns8VTf!rr8trr3<%d3p1[8H8_hs7$!o +s8N&[lLF)us8RT~> +%fc@8UrN6+s8N#ts8;forr;lp$N'l%qQ(VV*+o'Er;ZZnrr<#ts8^&=+Za'Q'@Q#R;SIUOdMH%S;]]qD3C-KQ^j8)FZhFm]!Q@^3IQ&:om +G]<J-C+CGC+[_rd"Nj=F>UJN4?gK^nX&"AtsrP +FB*DAlM1>RqF>7@DfK\qM>I8Lr;ZfjMe8<=Q'@S$>*5)2Od;;rR?`U^07o4NR?O)$QZ"['LRj`r +OHYro6'7D!Q]m`%I:E3R"TJH!rr:^Os8W,t%/^#$k-hOtYHODWrVc +8+tkoA;\+8`lQ6@aNVlL`Q#p=aNDZHaMlQOdu=SC$qJ^ic,[fB`lQ)=`W4*Yb$iQG5'E3[RZs#&R;SIUOdMH%S;]]qD3C-KQ^j8)FZhF< +Q'7K!R>m]"P^XR=Q][l)DHP94bg"8Nc.!thN.cn8;LR9B\$iQ7,\D[ZJ;/PJLYpM6jm;d4hoE13 +\@T;crP/?F(rGr]bL"5D`6$>P@Zun;P*SFb*PEV.qOd;H(PE_2P:"78,b0.lIans0Zb2LDPb/hiLaLmdA;+aSb +;5_=No#MB^a2Z +s8N/\hXLLD#6+Gqs8W)rq>L^!qtg8m.jld!krWN2srVZTl +rr<#SrW)orra5MQE0uuZPa%Al1RF8gRuinoQCC]bP`q>nS!&r&,X-C8S;W_uSW0)$>=+L:Pa[hL +Q21FXs8DrlG\DVZLPT$,qtB$f_8g8#LP:YFIu$k2m`'s&Hu4.$5Yam<8432@(d15X8kDB==#b,+ +=]8I#;c6Oo=BSa/='5H&(0+C; +&-)@)UXJr8rr)irs8;fos7uX#rVQEgW@&l8SbE'_!ri/uqu6Wqrr2rr&cVh1rVZ8]V5p]@qYpNo +rr;uos5Z)kC?\$`TLZa-j>Yd:^F[^EKK[E=iL\@B8Z\@]&O^UCDX['onA@CE\V^U1;`^po.Y +Cd=hl8o8Hihs(1:s8DOJGACu9E&l_Qqu$Kopq9OgPF7Yu?oF(1R?X;!PF%D25t$^#Q&h8oQ'?D9 +NM)ApSX#P0O!\V,QBm`&PAH'Ms8)`prVccMrr +$hW1q@@"[G`l?*Bb5TH^`r='Yb5]Q_`t$5nS!&r&,X-C8 +S;W_uSW0&"=?i"8R%9@CH.'sZbKJ5Z>?6!!Kn;jTj4qk`[(BLAItN]>I=jtjhq$?Bp?hb)a4f8# +iSXRnro+mSjlY[`gYhD3n`AflnacA@lfm^"l0.?rlKRR3k^!'Io^D/;kO8-6nG`(Jo'>W.o_87Y +p%%V@in`n_hOcrD4f"lHChI@s_U-3DaiPWCE,p)6+LokA_SaF=Valc-Q]dG:2NO)jPb*\pQ&em1 +7#dV"O-buoP]\41TTG>/Q'[hs->Jm7QB@Dk@<0Z8`lQ9Ba2uEDqo[m=&')f:aiM5n@oH&p<_epp +`:Ct\`l,sEcH45Vd1-Wt1rRMUa777N`sBYrEDT8-I+\%@~> +s8N/Wh=U[G#QFPrs8W)qr;-C's8DunrV6<;irArQrr;urp&>!ks83K-s8UI.o&TcLrVuoprVQQk +r;HWps5!\SrA=NRpnqSdQ'mo&P%QM%R[0,'PaIc!1KTa,Q(!f#R$)hT>*,)0ir;ZaDqpn,iN/*()D#*l(gr@=..>O+P*CDCPF.PuPF7]#OZ=nPPa%K$PF.W#G"\*` +Q'RSsR>m.s23j>hPaRS?V"Xicrr2urg&;'Nqu$Bl#3P4@o^^N*rr;Nf%KHG,r;Z]l]%m/Ws82ca +rr +&HD?sU>#GCrVc`qs8Dlps8Vrp$ig2*q"saZc/AX"qYpNkrr<#qrrQ'RSG0nYp\P*_E#QB/iQ^Eu#Q'RVu2Hl31Octo4 +Z2ak%rr)cF5_FfBIVWZmq>K3l`M4o8JUr9%J:BcCr8,3-_8X40_8++1_8uSo!6"lU(rjP/]=u/$ +ai208a2>m7_SsF1`PfR.`P_\lG/M28`kop6_S?Er;HZV7$a%'P*CDCPF.PuPF7]#OZ=nPPa%K$PF.W#G"\*` +Q'RSsR>m.s23j>hPa[\CVYC,frr2urg&;Q_rr;uqrr;`,Z`gU:REPF)o)AXgs8EE(s8;`&f_>+> +r;Q`crX&W'qn])#SYYfTJ,~> +"nC2Y>b/\0`WXB,b/VI#aSj9\a:ZS8cH+M`gTJ$3aMc*@`Pop>rlQ5%`l?0Dbfn)G`lQ0>Yut1: +?&lY>bK7fHa2uEDqo7U9s2P)[s2AEdc-_DINg?,tOcj?3K:8*hQ^!l'OY^(%R$F,%QC*h_2Hl3/ +R$3`!QB[Xn>EtkKQAeFsd`TSPc.'3SHA7'$@TM:9h8HY1R2gF%LkUYU-gqKVc0r;HEap$hGCp&"^`p[[nIoBu/?oC28n+uYMnF6#Dqu6WhrV5mRnFQMS +r;6?fp\=[RmGci..s#AqUQRoV0oX,q`Q#p@aZqo24'PlP*Li)Nm#bfai_`FrlFuZiQ)SNaNhoK_6%EP:/+\\ +LV:XGo>hK_`Q69I`lZ +s8N2Zh"q!Krs/Q!qu?]oqu#IQs8W,u"98Aur;Q^"dd?>Ws8VllrVlisg&>7Tb#4UlQ^*f!4]6Eh +P`V5tPa7W"P`_5rQ^3c#P`JILQB@T'PF%MrOt:j>R$X,$:>#:;q>^Eh>BPaSMLe(fs7uQK_Si<3 +J;K&H[0^E9NQ4RF)uPJrcS9arc8fsG'&+WFEDJ:BfB=? +H@'jYG'J1OF8^8iH$FUTFaSX_DIFbuEIonmEGBMoNi6Pr/;3Egrr;rqprPjFFE;Ifch[PmK!P+%]#R=%Y3GES;WQ'G7gqu-NorRq/[r;$Bl +s8N&unEKQ8oB+p/s3LZLs7kI +%K>OdU?;@Or;HWps8Dlps82fps8W)urVucqrVlfps82fqs8W&srr2p'rqPcHX/iD`r:L$Hrr<#u +rr2rtrWC8=P`u*3;3O.@FdJ>SQ^3l%QB[VrQ'I]%OdD;n94jKPR@08*P`LnUG)hiPP`\erqYpEm +r:jH:KmeZ'55,$SrSbZ3V)`sVJ:`E$KK8>lhSR7H_ns:i_uI[S_uI[S_[j]+_nWq"_o8dY_SjI1 +`52Gi!5nfSs2,G_`l#X4`l6)q^r!h(_SX4,_YqCP`#?M/`kK1(_84(+Nl]2R:bm*)DGl@f@Tt=7 +mf*5Rqu$935]La]Da2MBr;HZqoKe_0Q'@Dj/o6f9Q'%8tP`q;nQBRSqQ'di'O-c8oQ'dZ#P`_;Y +8Qg1tQ'7Gt;TSe9rr2rrg&;Q_r;ZWlrVlT:['Qj:Vm#moo)AXgs8N&us8N#q!WE#rs760gr +%e%MO=fK9U`Q$!Cb/VEAr6##[rl,nub0A>ae'6%XaMu3=`lQ6Db/hZD`lcHJb/hU%a9]P^;I*L8 +SAEAFaSEj7aT'9[aSs1_b1*IZOd;AuOHVh*FdJ>SQ^3l%QB[VrQ'I]%OdD;n94jKPR@08*P`h.Z +GE\PdQ%_3'a2Ps>d+Us%J:3#k/(`G$f#4i-TeCSCLP^ko8o(2MQoDe?.n+#l6p%%SEp%%dul1"*/m-aE9pA"@OmHX!&me#ugP`_&gM_Aq5PEqAoQBIAoOd;2rOHl2u +Q]IK$NKolpS!B/(HV.IdPEq>lMajqt`r='Z`rO3Vb2LDQ_p$9Ja2501=A_[f=)#:c`q.7\`l5p< +aMu6@bgk:pccH+)!64TN$HL-)[YdsU +s8N2\hYmBOrs/Q!qu?]oqu#IQs8W,u"98Aur;Q^"ea2M[s8VllrVlisg&FE_s.GkcI^G^"FXFa/.VEGS#b;/^GrFEr(TH$ORUEcQ5EH?ORVDK&i;+AH`u +H?FFUH?saWG'8"NGBe.RH$jmX=t(.oEHu\:ApA9=6`d+Pki2%+s82cpr;Bu2DfC#@8,3)_rV6D5 +G*A2[R#*jpOIq]0PE_W(OdD5qR[P.\OHts!Ng#ltPF@r*R>uApG>afoR?s./g&(aIs8CUL%Jp,( +s8N&un`TK6p$191s3^iFrs&DWlg +&,kLaVX=?]r;HWps8Dors82fms8W)urVlfos82cts8N#rrr2os#laGJQE.-qoDJ7\hu3WUrVlis +1]I+76'[UuR?Dhl>^2BrRZs,)PEM/qT95J#PF7`#T9,8!Ru``&Ng5o>3/3`]Q'@S#p&=t7rqEuo +L4=i+:8Rdds8(m$^r'\MH@U3jKR\\Kn(P^n_o)Jjpqni'_ns=,_nj4*`NG'"_o0O1`59C-_8F10 +`Pf[3^;7_(be]p6\&#o"_ns7*^r"",`;[_`_n8SP*DB$Lc@kaSWKJ,PFRo#Q]dT%R[0&$O.MAqR?s,)R$3kqEa*Z_QB[c& +PXsL+s8N#trRh)[rVu`mrVlZC['Hd:W2TLio)AIb!<2ur!<2oro)9!prr;iHUn"$Pi;8$~> +&+%/F>d))c`Q$!Cb/M?@b5TTeb/hZDrP]#]aNVoRb/h[%`rF-[b5]Nf`lQ6Dbf\#Hrl>AWQqppl +C9GIsqoJTQiQ,EHaNDTF`l6$AbqbBER$Wn[:gA7-Q(!r'Q]mSsQ(O2*Ng#lsPFmr#OdhDpS;rl& +AN>U:QC +Km8&`CGVEE1= +"onDYiW&fSrs/Q#r;Zfpqu#IQs8W&ss8;os#5[-BkMQ=>b5PKBkX^u'Pa[b$Nb;^aNg6#sNg?-% +OI),qQ][AnOckupQ][]!Q'n,*6TU9rQBdbYG5;%,s8)U`G):p,?_I&hs7lNJ`PK=3838OsB827o +3kW4ZG'\B3G5QL]G5ZYYH#n%@AO$Y58nr9;=H#mhF=+pJCs8VuT9Tb^,P`Ipn +J")RaS!o7UQBdf$OB$"`Q^3c$Pa.Z!P*M5oRq?;r<.0suP`eYpqu-NorRh)Yqu?Zqrr<#nk4&$< +ma_=:d/O(F#6*EDn)= +&,Y"VWV6Alqu-Nos8N#ts82fks8N#rs7$$ers//6R&[Q!MQ'[_sSYFd6J,~> +&*L?3?FIkq`Q$!Cb/M?@b5TTlb/hZD`Poa4`Q#psaSj-NaT'E_aT'BgbIW@(>?u0V_u@gYaSj-3 +aBm$1aMu3?e]9\/PEhSu6&oSbQ&_,tP`D&uR?3buQ'[VpPED#nQ'[W$P*MH)P!D$fS=,V'@TUam +^!4aT3cft&G"I2*aN_`Q^U1el_a$.45[SqhGVZ_]h=UXAoD\:YoD\:Ymsj`jl14HEk.S@fq"+(D +md0?2oC;A>mHsB3o'u>Mo[:%Pht6L/m-a94o^qbDlg!d$p[[\Ep$CtSYf6P/ilOoAF)p)4E11Ti +beq6>@de;H1*A`q.7O`r*d`_o9X +"on/Sj8\oRrs&K#rr<#rr8IYTs8N#sr;Zd$nE96'iW&r#r`B$f6Bdb)Ne0]_Cg*BqQ'@W"SW/Vs +Pa7St67\4bQB[_D309nrO-"K_4-l5%P`n_pqtpEdrI871KS*rcp](*io`*dh`l2qTZ"/bqJqeVE +`5ma[F)q)!qfZ1gG'%qA@Rpb+$V"lNGBS1MF*W(VF`VVHG'.tIDdY@1$kZ0QF`__NH$t*dG^+CP +DesB7G'%A%*"WPk>A\kC)/3\6^A1C"W)(t+s8VinqZ$-dgHBV!G&_L\63$fVqu(#VQBIc#85`BP +RZNl!BM"DRRZMJ\>@W_ZR#df#Pa@])QCNqDEg(oFR$s/%:Y#@@rr)orfDZ6Xs8N&urVuoZme$>H +e,KBqrX/])s8W)Ql1!a2s*t~> +$Mr&DY5A8!qu-Norr2rtr;Q3r;?Qms472Ks"XKA6'.A!Ne0]_Cg*BqQ'@W" +SW/VsPa7St67\4bQB[_D309nrO-"?W2j'AmP*8Strr42:qL)\'J:M3Xp&Fphp]'*i`5?GIWF(E^ +ItW5IcfMsZ^;'9W%`6-#b/;61LQ7P&`59F-rko&X^r""-`Pf[n_A:85V2C4l]?.t-_o'7(^;.S% +_oBa9ao94d_T.t+Oc%/r_m_[NBeR9q8#)hRe`d&5q#C-hp&E`,E,Tc6Da46rp\Xr!JsDIfO@E&D +PaIJsO_74KQCedQ'dW'Od)2sR?a8#@;q?U8sYm,PYfp/rr<#trRh,Krsno)s8N#b[]Zg; +WLEATrUTs`s8N#ps76-rs8N&oiMW09U!NRc~> +&*'[#@^sD!a2l?EaMl->b5TTeb/hTBpr36Prl>)^oZ.'QaSsp\".MqXaXT/+<#sl14? +][aYDBl8!,@k-B`a2c\)HB=)RN^lrGQ^No!O(CeEQCedQ'dW'Od)2tQ]mhp?ZD6X9p_3) +MF+r#`Q#p=a8O09a:ZG4a3)]L`4r0U9M/&X9s;ISo#UjNr5AZUrlG,Zrl"lWo#M0\aN)#e?;OL# +R-&o~> +"omuMkPt8Ts8;lrr8IYTs8N#sr!<<%k3_R"lMpn`rr<#Er`B!`8!T=.OB$mrK2[\oP*D2pP*)$# +P*hG5DKeI6O-u+r9TbI'R[?cd7@TF'P]_3Hp\t'_:i_8FL42kjs7uTlr;#Eq^91;4Q<*Wk6:_!j5#"NNSH[:$\F*;eOG'.qNF`qV>?n`#m"qO=DEH$#EH$k!bG^+CQ +Ecu2CG%PD%#QP5BA9NQP)Ib7hp\:e(X+kHTo)&:`s8MonrMN)0Ed;G3DY=&.p>SE%Od;>'G"71L +Sro-[>rI\2OHi=^Hr"O>R?s&#S(OHZ8ADNpSWN09Ws9$mG5rr)orfDb^J#lXf'kO&!=p +$M_W9Zi:"(qYgEmr;Z]ooDe[drVufpr;R'"pSOR_[E84Br;QZpf)G[K=8_ARP*25pL?nqW,]1XA#OQ +;Y"L"D/VZ"e\0#>`:Llb_Sa41`k$qfNfL?\^qmb%_o0F/_o'F2_o0L0b/U68N/in-`P01-a2>[, +^qmn*`5Tm3`l#F4MMm=OK#bmIYs37bUAFV`Au:/smIgJUs8W)rr;EHXF`)>8@rCr=s7bJ=OcYio +7!(kKP+7Vq,$[!bRZNe)H@/M(OI;GtPamu'PE1lt>\oRj6&LemQqGa'rVcfqqu6Qoir8rW%f?8* +rr;]&Xfee,Qg"AGnG`%ZnbrmqrVlWVWgfNP`VY/~> +$K.OdB=c"&ai_]Grl+u[b5TTcb/j@trl+oW#0=s0bf\#JrPncVrl4u\$,jGf='9'e]uJ4naSj-Y +aSj9?aT'Cgbf\#G`Q$9K1l[]hOAgapK2[\oP*D2pP*)$#P*hG5DKeI6O-u+r9TbI'R[?TZ5a[^t +O_\CYaj88Y2e.GpJ8[9od_io=aNhl<]<=f!LIU#l3`T?5e'm7Op%A:Uq"#9koC;8Bq&O`lH-Cc,moAZ"$F!92J-T_8buco>^=A$H^?.^8>@9 +:/m/5J,~> +"omiEm/QeYrrW3"s8DlSrr<#trX8Z$r;ZfSoBPH0s8W)ts8UCD4lSi"QBQ>aQ&BZbPEDH!NKfcu +P`V/l:4\U,4boPiPV#n#P`hAV;05KsPEhJ7\G,mtoSd:;KR&AB`;f]5rtPG*ikrH9PH8K>pA&H7 +4$`2JLOF7@Fo?IaFa!_+'Q\A+=qM;M!!Gf/GC=gbF`V\JG'b7rs`r,i9qZ$Qps8MgcCNFT;F#VhIs8)G/G*SJ\ +=D2JJPaI`*AO:4#Oc2JTKml^ +#ku*.]Dqp/r;HWorVuiqrr;lpr;ZTlrVuos!WE#prs8PsS"ZaeebK+@rr)lJrr)j[iBiutO`F3^ +MfMp`Oe.\pPa@i'OHko&JWitpLRaKk/QJ(#P*^>dE(H+RPEo4[qu6TfMdM3jH&+r-s8)]o'DLM& +]NgPuA&e6>C1]\$q:ra*^\5PF_Yq@d`6,s3K8u%VNj6I:^qIS$`5BL0_u@OQ__KEUW/ch"O,g]g +_8O@5_na((_8=+.`5BX4_97UlNffWg_S=%"7Rr=4r;HLqS#KK1rr5=]rVlisr:i`pDfBQ42;%[' +r:P&QPaI\9Anb))QB[hK6#;pNN';fHIS=mNP*MPqO%XY]P`T$fQAgtaNK0E*^&7U'rVtmVrr3#s +rVlg'qnK;;X/q`BrVc3aq#Ba\$NL&(rUR.^R\7@jJ,~> +#2Y\TDn*^*rlY5[rlG)]!6G/Zs2b5_s2b2Zs2>#[b5KNbb/jP$rQ,#Y%E6?0b/M"s=B9!t^W+Fp +aSj-YaT'Babf\)faT'Cfbf\#G`Q$BD0U7ofE_MaVE`eNfSro"sQ^X/#Q&nalP>XQ!S<9$fn+,u9_:@2giFd%hP`f*\Cf?OaP*fW?Cm^?D5(SE:9Qc\b +Q(3bn8T^)VN`U7fO-MV]M2t0'c,KY&rQ>/]s2P)XilM,=s3(nn`l>N%9M7rR8XI<6o#UjR!6G)X +s2G#Xm)TLQaMP,o;,'o +%fbYJoDeU`s8W)us8;cli;WcV!<2uq#lFQ"s4d>6iVW?KrVlipf`"pe=d"i41lINeHs2JpP"%Q. +OHYitOCW3jP#t;$PETNQ?'(D#=N +EHl_OG'J7SFa/(AC)[0XrW$"2@s!$C865-PqYg'.=JD9bp%eF`s8Dilr:Xr:E,p8EGs&A'oSl%& +RZiYH?@YM&P*D2H>"4I=I8# +$hh-*_uKc6rr)iprr2rrrr2rlrr<#trr;rrrql]rrVl`p$NC(uPbb4]htR'Io_njjh#@9P4MP!Z +NKl>YP+6o'N0]Vr4ACp$P+7VED39u`8U6M`A5?KmQ^*h-FDk0?R@JRlq"=R]@;LLBKnaJGs8Drr +(B==4il.HlWeb6\p&Fg`92P3:`4j11r58KM!Q2eR_[s](_T77dNfK?hZc0i"^Vdqf_u[cmrk\WP% +`YN/O-GfiOL`BL`lH*^f(sOHYlC=[n@*LiJ,~> +$ephQGIYW2cHOGN`VmmXaoKN^`rF*[b5KQaapQ50`Q63Gc-=JTaS3[b`Q$-GagtAS)\c17QaD,PEMGtA8RHl=@me%P@RHpOI)5t +7rN-=N1-2Y3T/?3cU(c`Jr#(j6/g;8`59O:fZ(@efuqjdcRCa*gZ%VioD\:Vn,;c,oCVSI +ZG"#c]tN@pnF5i7nF?/CoC;;6`4isn]))0e +g5Bq6gs4!ZVa[&=7G6#)`l>g1`6He1iV`AlV +$if;Dq#CHad +Pa.MrF'FZrOASDfP*%b36fn(KI!TsUC,ce/r;[3;9lP5q +DK9lCG&qa(Fp<).G%2Eq$2sp,#8(HaH$tI=hY-[@s8$\pWF3%0rr;rsrVu`opNp%aEd2YC7TtmW +KP4MVQ?$#ZCfHagQ#fr$GE@SJK7SD5N' +$hUs&aSu5:s8N#rrVccqrr2rlrr<#nrqufqrr2rtrX&MkOK#:bjno#Trr*$"rr2ldrW)u\rr<"$ +rqEKuOI8+aPF%;LE5;:;+,MhOZ-rZOdV;Y:k31cOd;%m2Ep^*AO2'!KS=kC +jnJQMqu?NlrSGC]TqkQDr;ZfqrV6eXOG?5VJUBV>5*VM!P<4_jG +&($5DJ@ie>c-"2M`lQ6@`r='Y`rF*[b5KQaaoof*`lQ=$bQ>r.aSNmfaMu6@bf[o0941q5V8UHt +aSs0\aND[)aT'B`bf]_%!64uYs2slQs2n]mb/hTAaNKT;NLW1fPF%;LE5;: +;+,GfO#UfYOdV;Y:46STNg,Mb/1K3%74`e8LkBe)aj\J\_T'F;f>OmVQ^9nRf$;CYbL"r'f\Pre +l0[m6mk4"rnaZ5Em^^*I^:q@ihXU+'mI9W8oCMMBn*ff=qUNh$Vbfn6-aSs0ZaSj9Oa9p&/aMPE';bg).iIC~> +&-(#2s8W)qq"t!grr;usr8IYTrri?!rqu]nrtX5Xo],uNs8W)srr)lps8Duss7lWkiVmouqu?Qn +rqcZmFaKC38WK+"P\4T[15h+53as8;ons8W)QJ9Rf=M>.&LrVufmp[l=XH$+:UH?jd\G^4R_G'81LDerGf#R(;/!!rp%CiOT? +G]e.LrcnZpG\q+L(An.I#8'aOF`qnMG]e=OCN4< +"nJLbchIA9rrW/urr2rSrXf,/s8W)rlBe9JYO2;frr;usrrW3"r;Q]tp]('crquf`raPp*s82ip +qZ$D5G`dhQNg>imB4c`NMis5bO-#Zo1maDkRoDY!QV_X,A^Hns8VllpK)$ECd)fUD+HjCJUKbEPCH5PL-CKXP]0cN6]upeJq$a6O%jkbP`InfQBZ;e +HqT`iPE]-oQ&/?5pAb0ks8VrorVZ]brr;rqru1n8rVZ]is7lQlr;HTjs8Vlnd'BmZZ)4f!r6bKM +s8Mri_P*ToU@j$~> +&&)ppOhANL`Q63Hbf7WA`q[XRb503Xb5'*Z`lS)#)TKXo9iPD/YK+o2`l,jdDj8K +rlY8^s2G;_`l?*Bbfn6"aC<'2aj.rFcdQ'9P)`4rP`h8DAqDdrP*.nfOHu4iQ]m](<'GJj9Q+-E +PEqG&G^`t4OcNmSHSm`B@!I*LI!A)-dF?RdbeD*AfY_WBQ"asVccF/Kb0SVsf%oian*B<.nc&1\ +o5s9^na#f=m(C*K_Sj@,]\rAPnaQ/?na>u8m-jE4qprj)`5oj3_Sbd9md'*%naQGMoCMJEo(Vdm +[D9Dl_S3Rmp$qA2g<8sBc,I]@a#KcW376!ic-4DVai;TQ4'?67FDkt]2h$1#4,f5J89fbKLQ@KO +CK5RHPCQ)SJ5p?G:3i1kO?AVhP\jBI99kd+PZN'mKL45-c,[cDc,n2P`l5p:b08$"aeUa1f3=>>7Ub:M[JXo#UjRj2_SMbK@f4H;dO4A(lG~> +!rpd)rr3<&p\Xmdrr<#tr8IYTrri?!rr2iprr^jCp#l;R%K?>(rVcWbs8MZis8DuTrrL?jqtTg#LO"#bH$X`7G5lgeG6`P7E,/>i$3L,*&dh6JEHQAJG'8(P +H$=CVAiUS.qu@K;&PmIlH$FOYIW0.DD09r@?kWYS#6Ff(>m)$VFa87\N7IRurVuijQ@,EKQhpaX +r;ZQjs8)cL4`l$oF(RLeJV/nu:RH`*Lk9\GS!SRtKNquQ4&\16H]sj_P`h%jOc>`sM`jOjQ^dN&rX&W(s8VNF +lgEd4J,~> +"nALdde3P:s8W&trr<#QrXJo+pu.R9XL%KtrVlirrr39%oDed]rVufqqYpEms8N&so)ARe;uHOm +r:j$DP']fhPaIS7B1&;QQ'4=jSr$ZsNKochP-,.:7%/j8:k#QPrV]$8pQPc5*D"d4HYVjRYs +&%6:iR(gGU`Q$'Jcc3rD`o4u@`lQ/]aNDcPb4E\b`l5p@c,n&ObgeY(Q@_u%P*hA5B1&;QQ'4=jSr$ZsNKochP<4)>5Bg=HOHkYc +Lk\QIMhOKKH[p'WKReZ%HrX7rd*g:g`Q6$@e&j_:QRgS.`PKO;`QZ`eeD9Wan*B<.nc&/JoBkl5 +l1=]6]Y;1u`5KO.]AW8Ona?#=naPi2lg4K@fYtS=`5]X-^VT=2m-3a#nb_hJp[@eHqtn"5a2Gp5 +_SNjrAbGZ^leg"Whp'9da3&dHQ"#!ed`K\[`5U!@d^CK8F`qk<3.HC-M/#_LI7/X5CeL"SG=R9i +@?rrP3D4[]Qp6dsNBND`R$rpr7ZWn&Q$?/iO[$k4`Q6-=aj&&P`P][7bg"<%a +!rpd)rr3<&q>:*frr<#tr8IYTs8Dp%r;ZfmfCSS!r;R3(r;?HfI$AaFrqQUEm +rquHbs7UbDEb/$+KSbD=H\#[DQo]tRHqT0XIT1fP6A.R9OckutOGlDoO[>%oQ'IDi-]S+i$Bd?6 +Q +"mi.`fCo.@s8W&trr<#QrX8c)pXGS/X1J'*rVlcq#lXRGPB6Bpq"k!ir;QWomf$;frr;rsqu-Qh +oKAJ&=E'RkQB=+WrVuWjrtXA*_o'F1_o0O6`Pf[4`50F4^5[l-rK)JjOGpE^`Q,j7_SX41 +_SO=1VN-UqP*M>sOH,=2`PBF0_Sj@+a2>g9^qYtjR>d,nMj]`eMo28H%07BH5_;.1O-#QlNf#ugO$J\kQ'DH4N@0_b +PR*F2QBk^>s8V`jrW<,urr)larr)lsrr2p4p%X_@8mCugpAb0krSXugYck"$o)$f5#lX\paJ5H" +U$I4~> +%^BhaSA)kY`l?0Kcc3rDi5c#?aNDa+ar8:3O@rSXDS+0;bJq?6`QZe:G>ul8`kf^8`r*pU`WXB* +bfn6$aC<0-`lH?GbL+GY.#sU#GF"GYOZbdmN0Tcr2O0DW7Zs1)PF@LsO_.gJ=D*__6$n?9:5,!$ +GCP3sK8PD;J:)_ie()OXcbd]:b0JdOG+;lce'6(Sbe_EFdGNI0nF>u7mJQD[mI'E0nal1_\@oZV +_?[lj\_clHn*L&BGO+Yan+ZD(]t:nh_8="&^:ie'm-Es'o(DMDmdKrCo"r)_]thh)bJh31qY9^R +jNd/JbfS&NcIb+FShAF;cHaPO_nO+>dUGseA55"5KS"u*J7<>]3JW689SSg^J_o9X>bf]Ou+j/'SaMl'7`lQHPccOUW/hoN7 +f"fDK_7Q">:e+8X>I25qaT'BgbJgo?;G9bmb('~> +!rpd&rr3<$q"t!err<#tr8IYTs8Dp7r;Zfbh"'q&s8W)us8MroqY*17IRTb+s8(XP6i-i]rr;i% +@[!$CQB7DoMCaIJPF%Dh7$*KtO-PokR?9F!##DB8o8QiFF&4XGBS+P +B/gJ4"p+Z&'*AIM:3(Q(F`MSJH?O^[Ci(6q#5S=/";tclG^"Ooeb&e:rr;rrV.?KXJGB!9s8Vrq +s7H?Q2eGlmJ:i9%Ko(M(6BsTVMMkhOQ%DDVH;8-NG`eDZQ^XC5I@Wi`Ng,fkR +"llJUh=pjGrrrE#rr2rtg\qQ[rV4L*WiNo2s8;fp$iK`]N-dp]rr;lqs82fos6fmcs&AjprVlfl +Zs\uV5Eh1pOGYTCQ]mbuMFm4_SX4. +ahjU$Mia0gQ'.;mO,^`j^Vn(.`PKF+aMYa8N.dFZOcbfkP*1c^`59@._SGmFs82fqrVE:#WIoZp +r:p +%]O5WU;"L]`Q$'Hcc3rDi5c#?aNDa+ar8:5KhtlTF2#i>ai)$1_opLTHYP0Yd`fJF`r!jU`rF-[ +b4E]2>\).!c+Ca3b/MKO_aC)d6+PRk_ofj6c-4SmeD9WlnGr%Vm4Ro"n+Q4^`Po^2`5KR0 +^:E1mnaGi5naGi5oDSF4\\>ho^q[Ru_nj%Mp$_>9nG`!%lLOK7s2;Fe`l#g9aMc'5_>O3*p#aQc +fZ;+Ua33(n=.XVMd`]SOa2,mFakb2i?;"LNI +!rpg'rr3<$q>:*frr<#tr8IYTs8W)tr;Zd4jP]Xro`+mhs8W)rr;-.ZQ'RXnme?b?r^["drVlis +rVfcVP'g;pQBdaiCmL0KPadRtO^;shQBdi#RX.q"=[%=0I$[0CK7eM6P;J5NJV8c4LkgD7F'/,2 +rql`os7uZn'kio7=.[_;qYpEms8;choYQB/F`V^'F8p@fF)c%o&-r@=q>_-87qup_Ed)\OHZF:G +4qIo)"TeT&(BXgH%SCY\FE)2>GBJ.QD/^R"!s/H&!rW+("W:lmG'81heF`_;rVlcqgKp2E;qLaB +r;Zflr;$0_OWfL5L4k>g3`nI[@[`LHQB%8t5ET,mQ][i)P`04@OdV;O +@#gC@m/?bYqYgHmrr;o\rXJi+oV>N5QB=i5q>^Egrr35^lgXH4dJs6prr;m%rVuooip6!os*t~> +"l#rNjS/TNrrrE#rVlish>[ER$2s_6TrY66qYg?irs8Ps8s5s=\s8W$]rr;uqr)8N7 +G>s`kQ'O+?QB7DsRu9Uq?>l!mQ'd`'H;d+34ap%MPsTYHK6]P@15^X4JqSf3KmSPo=S;Rhrt+u) +rVL/iW)]G6s8)]ms8W#rs('s$_o'F0_o'F2`Pf[1_T&p2KSbeSP`q5kOHGU/`Q-$:`PTI/]>_a[ +I"$p4OckfeOcbZa]#VY*`Pfa5]u%\%bD1J&PDPQmNKoTgMi5Nj_8F.*pAb0jrVuipg0^2B:Y,:= +s$char;-,J+GPN&K8>;5Ko1V)7R2-NJ9j\>K1/0f<]Oo&R$!VtN0KSjO'$RlOe%f&N+SE=R?2Gs +Nfls"rqlZkrVuiqr;Z9crr2utrVm`6s7N-cG*.bSoDS^fq>^E\Z*^d?Y++tZdf0:Hs8&Y* +U"Y"~> +%\RTNW4p3e`Q$'Hc,R`Bi5br=aSj6eaMko?<*<@N^])=e`504+bL8A-Obt@*`QH0=`l@/^s2KN+ +a3)ZPcIFdsML/KmQBRUgCmL0KPadRtO^;shQBdi#R!;Im<]b\&H^7'EKnXn:Ou&#JJ:iQ0LPC23 +E_tN>bf%K9`P9L?ges03^QB[>?Q][\tEaXob0Z_\aa26!Eb/hQ>_o9dBb4D4&CBS;MTUMGXarKJ:WH,I>3E1Jq?O%antl2 +q>^Ens8037UlA^$g@5%?qu?]mqtTg#LO"%AErgE,rcnHc"DV'O!!Dur%LGX?Df]rCF`htRAj@.7 +r;[N4!!!*'":e%@E,ol7F*)eSB5]($rVup!r;^.)!!O6NEcuPNMU_:trVuoss5URlVjV/rr:]j\ +s82iV7mVu]I>N?*Jr=o*JUgBUb*NQ&_H+QBR]%N^neh +G]N]Xs8;iqrVliplM_7jqY'_\KqFQr-hIB3qu-O"jlu7%mEtt6df0:E#lXf'ro383l2Q8~> +"P'HJm/$Y["oeK!rr<#Srr2p(r:mRnWiaPCrVZTn$2jNaOH,Ge63$WVs5j5]s8N&srr)fQ6'Ia/ +I$'YZQ]%&pPEqPpG?BndQ'IMuPaRe?,@3DOsK;MTUMG""WEIXd$$H\I*,JUp="aSku8qZ$Kn +s7s!/TSQjmg$nq>r;Zfnrr3#T_#D7L_Bm+:_oBU+HussmM3*pbP*(liOKldEa2>m6_SjI+T7;!2 +K8YhRrK)>aNk39J`l5m7]uA+,b)(@jH]4,MOH5NhP)P=<_nj:/_"Rg.rVuoss5UUnUQfu$q>UEor:RS*YcY$qmebH3s8NB'rqG*@T:D\+ +J,~> +%[q-FYJA/ra2Z9Jc,R`Bi5kr]Z.q1`oY9g`l60D +bg"PG."mj[JX2ObQ]%&pPEqPpG?BndQ'IMuPaR_;;cJ]83_t0O^;e(:daFR`SW$pl`6?BK_p$6@bgG=th=0t,qYKpWn*TT8rVuf2]#i+-85F8QO,%jIO#hGs@X1R4P*hB#P`qM:FC&XM +OI2;nSt)+1R$Nb&KofeBeB?+VbKJ&L`P]U4b0':r+i_F;`lQ6@_o'F5eN%uLR?Iutcbd`C`k/?_ +:.IlS:9D@\aT'BgbK%8Z;b9SfWIO~> +!rq!+rr3<%rVZTjrr<#tr8IYSrrE&tr;Zd$f&Z8aqu?Zprseu*r;67MHD-@]Ab,fti;RQmrVc`l +OEHYE7?j7&Q^3o#Q'[o"S8hVBBpXsGR$*_r:JZ>'NDVQf'A +"OF$Eo(r7`rVcfshu3ZTrr2p(r:[.eWj("Lrr)cp#laW[G+OVQB(l*$q>UEonc&Ofrr#[jOE6G= +6^!guQ^3o#Q'[o"S8hVBBpXsGR$!Vo:/-"uMbc-^<+p]5L3YX]Jq/K1Itic-I>hu0?U8AqqZ$Tp +p\XS]U8L_h^X3#\qZ$BjrVnP,^r+(._ns4)^VIY%^:\f;I<:'nMiX$bP*2#jYf"E!_SsF1`5%sk +G^OdcL5_8oOsZ9NN4R'Ia2Z$6_7me0L3J#lKPuR.M3!p`PDtRB`5BR3_=dj.rr2ppo'YX[NhBmc +rqufpq"=&FJ:W6)L4>#0Jqnl3ItWD"A:JT0?U&p"P`1lj7n//oR$!T&L6soC;O!K2Od_JoPE_>u +QXaTiP"YQFrr;oorVl]oo)AUfrr2os#j"RFP`(TAEqfS5$i^2$p:df;Y-",UqpPHNs8Muqpt_a; +S>FP^~> +&!L^?[)0i$a2Z9Hbf.K@b2LGA`rF3\a;Mt1BinGALVM!SaiDB<`Q?LRF/P=c/] +s2OTMs2K?-aii#ZDI.mK7[KU+Q'R]!Q'[o"S8hVBBpXsGR#dDi9MTo!N)DQh=)3>ALNP:QJ:<') +I>!9!H&-,u="d7jbKS)La3rL'RANie]"?eG_TK[8bKSAkeD9WaoD&+Qna5`6pA"O#_8sF:aN2BD +b/qT=^#8JOnM9V,o_ACahnQnC_8=76`l>p5_nNeIp@7_Fp%eFVo_uV6`5K^!_Tfs9a1T'o\b5[g +oO-b+lIR8cXI?(lc~> +!rq',rr2uprqlrsr;Zfrqr.PRrs\o(qu6WqfB2GbrVulrrseu*rVZK">E5>=P#B^*ir8uXC&@i- +rU`IAQt'p!Q'RZ!R$*o!Pad\6G!(_MQC3l)OH)=tPa%Mt6#f_RLOk)0.YiJ0KR\f2IuK)+4)\qU +@CK8*qYpEbV/`AbEPf`Fqu6Eks7uZkq"2FYH$+1NG'\ReI<]a;$NLA.!!!&t!"961F*N%UG]I\7 +4;@tq!!*-'rW!]8%o."]EcQ;JGBdRC#Qb#,!"/c,$OQe49*?&>EHQALNn!Xtr;QZns5<,+7BNOd +p%eLJQSF2EJ;Si/JV8]-K61U(7RT'p2*=<,@WFmsPEqE%MDAS(QBdf&Q]YWf7ZWmsRf8T^Q'do" +Q]aOmQ=$Nhqu6QorVlipli-q^%J][`Q]mo'>-\,'rVQEirs.cNo^hP#s8UOH!r`#prr3,\lgF-; +J,~> +#0Ng?p%n^erVm$"rVc`qhu4/brr<#tr:QtcWj::Rrr)iorsJV2=H&c3O]9g/rr)lnrr)lfrrflPE)f^ +_Sj:0`5]`fJTc3bJUDp!MN3aZP`q':a2>s:_8VGHm]qra;#KRSH.IY*-(Kn=n$F(/-<6Sgb]4[rF]F%86RP`_Ai0OBp,PEhAtO'QZEBSS +qpPHNs8Murpu&!?R\IlR~> +%uk77[_^#&a2Z9Hbf.K@b2LGA`rF3\a;W%2B3J>AMS@6UbK7cDa2lPr:Q_K=N'=DhaSj-YaSj6a +aMu3<`pq,ua2Q-Dd`s4kN*^=gQBm\uR$*o!Pad\6G!(_MQC3l&NJf\jPEV;r6?5qVL4Xr(,_CB! +K78N*HA?uj2JQi9:n0>]c-b(iN+&<,DSa-&f?D%NbJM?EdGNI0nF?&@oC;58n+?MR\\$&*`PfR/ +_8j[;`4ih>naH#9oCI,"s5:c)]#;_._SaC4_nNq$]'&\Pmd9WAq#C02[CX;p^rO7*c,m]7]!Jp< +o^VG3e*PZ*`5]a9e@s5[1nBsoe'cdcHPpjDG_CBnItE3!IVrIh5s[4b0fVHp>AH>UOHkutM(rA$ +Q'@T"QB5Eb7ZWmsRf8ThQ'do"Q]aOiLe_o9^>o#Muo_o'Rs6X_U^+9N"KU_:$C3bK7rL_4=Op6s5h+~> +!rq!4rr3<%rVZTjr;Zfrqr.PRrsA]%qu6Wqe*6;[rr;lps83?!ANZ2KSt;4=^#Wa +EI1)5MhV!$nOo[X7_cp[eboCGrr*Q1qtTg#LO"#bG'81ZG^OF6$Np>-"T\],"9Sc*!"BE8H[C9g +FE;1X(]jd@qu@Z;#6t5/!=VhGGB.qWG'[aV"onf-!!i`.!!*3$!"/i?@rH@3H]?PHrVc`p:]0M= +p5sR*Efg")2aE"HLOY&5Jq\r0H:UA"?"IVd7QlfpP`q5*2NO&gQ',30PF7VtQ^Eo"3]!1fP*qK! +Pa.E!Q][Sa9pUEEq"jmfr;HZ_rXf&.qZ$Elqu6G+Gaat[C$tourr;oqrsJ,Yn*oo#s8W)ts4.)K +rVca"r8R/6mJMJ~> +#/d4Bo)&Idr;Zfq!WN,VrW2usrr36#oV&:eY2f?SrX8c*pLBAOP`nbhq=jmg!W;uprr)lfrrsQB[YtR$Wr$J5)5YB)2<#s8;iprr<#frY,>0s8)cos8N&rBR#r2Nb\+_rVlfr%K65"aL/7U +Z('GBrr2rJrX/W(s8;cOV4O3N_gh~> +%u"M4ZG=N"a2Z3Eb/M9>b2LGA`rF3]a=>3I]4,&K>*cqHb0%rNb/hZKdS>diQ]XPFcbmuM`l#g; +b08)PaMu3<`q%2Kb/qKCbgD;[Cj>p +_nj'u\%BMr_n`mlg$n7mm-XKAfu(2-^:_.r_na.0`kK$oZ/b<;iop%+s7k'L[_g&$ai;69`5]a3 +]XG0>oBc&.ea_D9`PkutaO8/KfQCSt@WpCq+YRt^IsQZuIt3)uG==_i=CPcV6TBs^O,Sre0o_B` +Q',30PF7VtQ^Eo"3]!1fP*qK!Pa.E!Q][Sa99+$bdE';O`lcBB`P][9b43f%&$d`r=$f_6S/]7nHWPQ+k>\ajnH>a3)TG`LTmq7TPIu~> +&-(GCs8W&rr;?Hhr;Zfrqr.PRrsA]#q>UEoe*65Vrr;lps83E+RmWC*SV]o5s7ZKhs8Vu\r_rjq +s7lWhJT.&9Od)&qPa7W#QB7>tQB=-bOIDK!R?O#,/7k33QC*Rg>TNR[RurVc^ilL+35 +;P^B^7k0@FLPUbAJr##)J5/7=FEVPHDf9VXOI),qP_plKPa7Q"LamY4Q'df#QBtiBHBst_R?Nl% +P*M>sQ],fBN)0BOrVl`pmJ[k!s8Drms7uEM7@]a0QS\72rr;uqr;Q^'mcs92o%F'Crr2rJrX/W( +rr<#tipQ='rI=~> +#/Ht@o_\[er;Zfq!WN,VrW2usrr39#nt<"cYN>QXrr*W1rr2rtrgZ<:P+.8!q>^0gqu?]or;QZp +o);\irVuZmq1X"E-6#8EGoH,1/kT.K; +s8N&urqbpOq".FVVaZPa%K# +>X<\%R?O&&Pa@PuQBRYoDDd;Gr;Z`ps8Drrs8VQe&,cJ+rqufnpuFf3Q]mdpp&=sirser)q9-4P +Yd'YHq>UBnec#pSs8Mroih`6:T>5s~> +%t\81Zbji)`l?*Db/M9>b2LGA`rF3]a=>3I\m\lI>*ltIb0%rQbf\#LdX!U(Odq(df@Imd_T0m< +b08)Pb/VE>`q%2KaiDZCda)E-O>2i^PEqArQBdbtPa@\u3&ZkeQBR`#Q'Wq/Q][W&N&Op#:kKR&)M95JZgFE_\4@NRe-D0MObN5bK@lG`Pom: +]XbKEoC2A4f(7\?`5BL8f>u+YbVPNX1GThpGCYh%);bN4daN2KRa9ou0b/_Pr<(08ULO]~> +&-(JEs8W&rrquZjr;Zfrqr.PRrsA]#q>UEoe*6/Srr;io%K,ttGab"_R96cjrVZQls69M]s8Dip +q"n3@13/GCRZEStQ'.SuQBmbf5$sP9P`h>rQ#eUAQBI]$S2#SLFF&IlK8k_L3gNbaiCQ:P0Or;Q`rqu$Hn$Ld +#JHk?pAP$irr)j!r;HWphu3ZTrr2p)qXC&UXg70erVlfqrVuj(s8)Y;R?`o$!cGdYHH[:$dH?sp^GC+X^Its,KP`3`"_Sa%#oD\dh +s8W)piTU=?UhQPfD0gehIt!$)IWSsj3__JEFDGZ6F)Gi#?&k;@PESk*Q'mf#Q!HG:Q&q,oQ]m1X +BoeLBQ2[-MPQ-mZQ^3Va6fmq>rV-86kofrr +%t7o+[):#+aMub2LGA`rF3]a:$#*\R/WG>FE7Mb0'_.)pHCE`R%_@N/a3"Q-R[t_oKd; +b0%rNb/VE>`q%2KbJqHBaj`Oi/8pZ>RZ3GrQ'.SuQBmbf5$sP9P`h>rP&;h3QB[u.ShkqNDfg;U +I#*T0Ll.CSK7@DoA8?.%GBe4PDJ#aiVK8j7WHEr;Y$Q^rFI7^VIk1b0J2M`Q,s4\EN_Xk54uS^rFF9rlS9ec-FSU`l#d7 +_niq[o_%n=f_++E`5BR"iEbCX&p2Igl[LkC;2JTYX)4tT&RCO:)?F`M>6=]pWJR$3e6OHl5s +Q'GW9QBdPoQC!ej056K3PEl-6s-*JJ&snoDKfmW*eAf>Gb0%fE`Q$!AnAlfoaiVNHd+WbPNfAfH +0u_AZ`l?*Bb/:Z9<_Gt[8rLF)aN;uR!QN7\ap"hH77L4*J,~> +&-(MFs8W&rrr2fjr;Zfrqr.PRrsA]#q#(0ldd$)Qrr;fn&,Q*u4B[o9KOXiYrVulmrTX;[s8N&r +s7tnGM3=0iNLZB!QB@Q#Q]d\M/!5mYQ]dZ%PVI*GP*MGuNIR%ZO&S)#K7eu8LkgS4JTF@c8N0CX +Ec6,EF`_Y"Oel."g;D"SeboCGrr*Q1qtTg#LO"#bG'%b;7Ks)"!!*!!rVus%!W2p)$:/TIDe(j< +!s8T&!!EB*"pY5-!"9B(DKKo4?P!2C!rrE$!<3)s!"0&F@;^F:IZN"MrVc`p5QC':nbDoN-\$Q! +It`f6Kml6]O37+Q5C.0mEHl8B9j^/AQ&grmR[9;+PE^um/:a4UQC*quQUOo:QC!f$PQ$jIQN*3T +Q^)-BpA4gdr;Z0`('"11s82Zlp/$j9Dts&$rqucqs82`nrsJ;\nac8-qZ$Qos3prIrVlg"jmV^* +rI=~> +#J$P=q#: +&:%T'[DU5/a2Z-AaMYp@!oGo)$#.bKJ#Pb/_oQbKS&H_Sj@2 +_nQ!@q=Eh&oA%O-_oBpR`PB=3eN"gtGD1R%N.HFs/3%dWgW;*hBln'-@;8).3.d6POI`#3Q'[]! +MjQ&GS!K?JR$E`!79,J9Q]m`!rg!MLs-3tYQ +&-(MGs8Muqrr2fjr;Zfrqr.PRrsA]"q#(0le*H5Rrr2utrqufqrVm?#b_Is=QqcZ8s8Moqqs")/ +s8Dutp\B_ZOHGfqRZnI>Q!!!'#!WE'%!WrK+!r`0-#8UikI!1(#eFWY;rVfRL +m.()H3GF/'K8P>2L-SK&o^_kVs6DXoFE:eX8"[)a?BUeGO-#cpP*VK$Q>/=7R?`l!QBcbIN0fct +PEh>uQB[]#PEh\s8+uoYs8)Wmn,=(%rVulqrV=9+R4aHks8Vomrr<#qqu6U&p#tr;o&99Arr2rH +rWrK%s8V3Lna$+'~> +#IU;=q>UEmrVccrr;lothu3ZTrr2p(qX9fQYdj<%rVlfrs8N&ss8NT&c%[m5P=XX(s8Mrrr;Z]o +s8VWg6N-f]s7uPLAr_tXClNZ(tWfR[8tmR?`r$R$O%Q2Mmie +OHl,sH7Y#APa[f$PF%T"QBdZ!Ru0]0s8N&prVc']!WW&qrsJS;9pI2bo_ngds8N#trseo&qUr<` +ZETn;q>UBnec,UK#lXc&oVe@PS@="~> +&9M/u[)1&-a2Z-AaMYp@=;Fc,e!'aqrCI`1pueMN'L2cI0kPaM>g: +b08#L`l@Pi;Td))b/i.V>`Y/:R$`hpR[B>'QBRK#78/`0QBmc(O)?S2PaRl(S",k/OGnos;DB[f +Edi4aHtPRqhq[=F.nrl,Vlair/ieD9WaoD8Idm((!H`5fsua8X$Y +a2\(rs2P-+rr6`e[D'Q!`lH->a2c0@aN2B=^Vn.-o)/@aosqc[_SX=/`QQ?It'43dEp(beD&7oDIR$I0//9UPu*@*RZiu*Q'.H#QBib1 +2MmieOHl,sH7Y#APa[f$PF%T"QBdZ#TSPGTcH")Gb0%g)`W=0'o#N*!ccF/Haj/A24Gb,&e^Vm\ +aN2?>aND`H[t[mV8l&',]u\::e]@d1#fk*6\l_Bk:Nh6~> +&,tPKs8Diprr2fjr;Zfrqr.PRrsA]"q#(0ldHp)Rrr2utrqufqs8NW,qZ$?^k4G$YOSf"Vqu?]\ +r_rjqpA+ab9obO.QBRH'O-YusPEh;qO=#jLPEM/oQ]EhGOHu9"OI;2pQ^O&&7G7J/X\M)nF+[0[ +s7H<`nGdtoAp/066)12P2Xf\@_o^I,rVulr?2sfsoYQB/F`V_94WG(7%g<:L%LrpT#6kMB#mLJ6 +#7s72:b<4e$jd+>"pkG;#RL_>"9nr.!=BQ2Ec4_g%L<:J%LNOR$NgV>#R_.R$O-tN+C]M?F+0+u +oDSXdr_;VAr;5bCL4P/.J;K+YkO\KKs8Dujs&@]A6Z'g8r:TJISVNf&R$uQ&q87]`7a'qZ$!_s8N`-r;Z8-Jp(;lqYpNpr;Q`rqtpBm$M`fRoCCu5 +s8N#tdJj1G"QSq>lhc2~> +#IC/=qu-QnrVccrr;lothu3ZTrr2p(qX'TNYe'W-rr2oss8N&ss7m'&p[RA7P\?$Nr;Z]os82cq +s7-(hrVQ?es85ZPQC4#%Oe@\uPF.Q!P*D%TMNj*NU^9NiFrcK<-GC+dbG^=^_G^4X_GC+q!Yf+8TG^+@OG^Xm\H@'f5GlMpsGBe^mLqU^D^Vdk[ +s8W&sr_NFVo)J^R4+i'=H@CX*9]kpAs8W&to)2>669f;*p&+OO7@T%%PEhB"Pa%Q&OcqSOP*D)p +RZ`e'MNO*fQC*l&Q'.DuQ'I>m=hXk3r;Zcpm/@Ils8Vrqs6t&YF'&,2rVccrrr~> +&9(ot[DC)0a2Z-?`kfR8bf\qds2GPkaN2B?_73ZV>@OSOcH-"))p$1Gbf7QFa32TcM-+iNd*';I +_SsU=bf\)L`pq,JbfIN;dapO9R%Kh2O.2/pPF.Q!P*D%TMNj/P*2#nM2=./ +gXVBC.oT_g/^i=qf?_[u@j#-$FE0R:TM-ind'17%^Y$a/`_ORrbgG=th=0t+q!6AA^U;(o^:q7o +^;%M#_SX4*]tV;!iq_f\ZF7l,#+i]g=Oh/Ne*aiSuQ^!_)S(,?nbf\/PrlG,^o#N*!bKS&C`mW"1Cgo`a +dEg%YaMu3 +&,tPLs8;`ns8Mokr;Zfrqr.PRrsA]"q#:^AW?'e7Zrr;uns69O] +s%iHc@$6buPa@N!Q'[c%M+N\sPae#&PF=\-PF%Q$PEqT(Ng-,j;tp%dqXWNtA,,]pp](*h +s7uWAIW9=>Br6DYEq\8-bJDa,rVulr?2sfsoYQB/F`V[m0fUU8/ho+<2)I'C/hSY,0JG+1.PO2) +6p!Y#:-_366UO(%69m[s4?Ykk5=/"FG&g>M6V:$G5=&(=6VBa46q9mE8OPKu5\>+\EHmGloDSXe +rY,=pjmW59>_J#aLkUG/E;BP1s7cNm.Ja#8_s8;lor;Q`rqtpBm$N&rSoCD,7s8N#t +eGfLJ#QF]%ipZC&qg\~> +#I'r;qu-QnrVc`urVZZphu3ZTrr2p(q/s7cNm%eotom/$VUs7uZnU10ONrf\.bR$*_rS!&;cQ^X;,P`hDr +QBdetQBda7Pl6pJPQ,h/o)Jahrr)iqs8DKe,PqH?qu?]b7u]=Kr;HKiqZ$Tprr<#qqYT9ZZF$m2 +](l:(s472Jrs/Q$q59mWS@*k~> +&8kcs[):)0aMu6@`kfR8bf\qds2GPkaN2B?_6m@X_Rc,fn')90hDcd'kW`R`Ue8V&\Je'>qF +_SsO;bfn5uaAU70aNVeW:Q1[0Q][\sPEq>tQ'[c%M+N\sPae#&PF+@tP*VH&Q^F5.MN*dF6Jp/< +dEK@:6.3fu_90^=cH=\EDes?(AtaZJB'.4FaLo:?bPoLfa2uQQhpgKOnaZ:k^!+OEd*g4`bg+Vb +f\"Tue'ZFabKA-$dEL+qleUCOhV[/Fhqlu8e(*%&gYCN=naG&ahObfe/UaO8^n9oY'sQBdf(P*M,u +P(8a_R[BA)P*hAtQ'[PtQ'M?5rg!qZS +&,bDKs8;fps8Mrlr;Zfrr8IYSrsA]#q>UEocg0cNrr2utrqufqrr3K's8W#i?qQP:]_qX+r;Z![ +;Z$Lcqbr?8Pa7Z(Occ6!Q'@JtQBm_sQB@VqPa[euR?!l%Pa@PuQ'.Z"O^#Nqs8D]lqYBp]s7H?h +rVcKhqSb(*D*P,!4Dn8Igr7+JeboCGrr-4'qtTg#LO"#`Dfoo.DJ3NlBkqO#BkV'hAnc.#Deiru +<*a-PA8lI*Ec?#;E--/8DJj6(CiFE3E+sTED/40-Ec?)ADK'`9C2.U)EH-#:CM73rF)uGKN7@It +qu6R,qs3JAqOCT?JV8Z+K7uYcr;6Kn3r]'WrVuosqZ$Hmr;-6;:7RQ6R#mMsQ^3i$R#mVuOdD?" +Q'IN#P*V>tQ]mZ$Q^!`"R?F"7eGK1Cq>]s`$ig/(r;-+XHY +#I1#=qYU[ER$2NnNXKT;7r;HWnrt58/rVuTks8;Iq8<,:4qtg?krr;<`2#[:N +p&8!LP`qB!R?k['6:7 +q#:9mf)GXJ#QFYsVk9QM["&~> +%;fo^MJPp\FFRo^;;Jq"Xj_B_M5sqZ$K`p@RhB +hot<4`lZHIb/Up$ce=">GBn^mJq/8$eBPnK^V@S#bKA)Rb/DB=b0%uYZoaG5QC*btPF%T!QC*c$ +P`_;tQ^*i!R?El#Q'[]!R$X&%Q_0J"1TS^?aND`Lb/jS)rl>/\aN"%ss2lS.b/D9=bKqbN:>!_4 +b0A,N`l5s?bfn&;PZ(.G8ka3;aN2KSaSs0ba3)Q?=\).YDh%~> +"Sgp@s8W)r!<2uq!WN,Vrra_UJG]s8N!Ms82T`_MFDl88AScO.DK'W?G^+CQEcQ7#Fq/Y4CN=?1DDPgCF*2YHFT-M3G'.kK +F)cAHGB.eMCi<m.Gl~> +"L+]>q#1'hgA_'N#Q!hQXKB;4r:p9krsJ]'rql;KB05\^rr2rtrW)usrW)uqrq69oqZ#\FPl-jI +Q2d*;Q2d*IPmg1_u@Ri_ns7,_oK^7bK%B:R)d+Z_8F.._8=(g_uIRf`5oa1 +_8aO2d^Pg[`QQ0;_=dj.rVlg7qWIJIpd.9!L44`+J:9uZrqcZpq>^Bhrr2oq!<2ut%fQG%A:K`/ +Q^*i%QBRK"l'2F:OIC?=qY^?srr)`ms8Mfnqu.3+s82irr:NQmK)YWHrr)lrrr2j)rr<#rjL)4t +Z(e`&rVlcrrRh,LrrE&trrr/!St;RYJ,~> +$"R7h\]2e7aMu3MaT'6c_m`ZK<,](]bP]H\b5]Qj_oU'Hb&LH3cHF<.`rF!]`lQtfdFCM%\%C57 +`lQ6Aai`#ddbF9]na5Z0n+$8Gs7@'"o^qSFq=jpeo^MSEnac8Fo'Pc5pAXmto^D21kk4]Eqnhjn +nb)nU3V;q5nalDLqY9pWmcs60m/6"qo(M\=gs#'8aihiH`lGO'bge-rGCb7#M1g(+c-4#DahuEG +a2l@$ar8@@`Q#pHd7eVCS!T>&OctlhR$X/-Q^*i"POatSQ^X)#@9V+,cHFGTb/q]GbfIfD`Q#mq +`rF-[as5-Qa2u3>`lcOV>^"c=bf.WEaN2BBc-=>I]U2\f6qL!f]uU,n!6 +$23Ld%rVulrr0:qYnbW4`rr<#krqZHuqu$Km +qXfq`P*5d.s-DBe,91Err+8EqtTg#LO"#b +H$XXTEGoi;G'J:XG]e%IF*)VLDeEH+Ao_j1Fa!b1(O:1FF*2_QH$4CNC2[ND,$Sr.H?aLSGlE!e +Ft[u[Jp;Q[Dg"l'2g'(TFb5\)oDSO_r;Q``k5Y2B7=T`GLjt567JZu`qu?ZprVl]os8EB'qtL-K +8"5X*P*Q$4!L&ZEPlI$KQLU4JOIVDr9)&&Vqu$Elrr2uqnc&Rg&,ZD(r:NQuJbf6Dr;Zfrrr2p+ +r;6Elr9O"Jo]YW@rVlcrrR_&Jrs/Q's5rY8m.Gl~> +"gOo@p\k*grrN-!huM$(q*o$kVO9kkD)q=B^rF@ErVc`p +!<)lr!T(Wk__]0G`5Ta:`l5j4_84"+`Po^1`Q#d2`/;+C`5]g7_SO+,_o0I0_84")a2Ps>^RgM' +`5;Mi!6"iQ!5nfQ'Z7c*]ZA"+caf7&b/hH;`PM6Is8N#t(B*R_s7PS@I^Kms8N#r +rr2oq!<2ut%fZ;(i'j#oPEM2tR$a/&l'2X;S<&n,q"OX^r;HWorrN#rq>^6h%/^)(s7SlrIJX!D +rVulrs8 +%qAam]>i"7`l?!=aNVfJ`o5#=b5KBh`l#;e=&a1G`QH9CrQ>/])TKh:air#UF&jd8b/_NCaMu3= +aNDZH`lQn]"YP^e]YtTb/_WHceQt'nFQ2;lg*s*rpT^R.IZTgoD/1Tp:KY] +nF,o9o'bl-mIU&Hp@I\8m-=!7o?k/:p%J.Pnac5LmksY,p@RtFo]bo3lhf_YaoD/'l/9eNfuqR] +`Q$-6[ardL/T>ilNeN@aMu3A`QHCUAouJBaMc4!a:?A=c,df:RT2^A84m^3 +a8X-[a4JB5a2S%t"h/#98PNuN~> +$23:3hrr;lqrql`qrXo))s7Yu# +I$p=eQBdVuQBIJsrK[DKnWaWNP`h>IQi$g_rr;rqs8VrcrXSu-rVu]mpI07IpAb0is8N#srs\i& +r;Z]]o_%k>li6q_rW)oKrr2p&rr<#\lgF-4J,~> +"gOo@p\k*grrN-!huUd#s8)cn +pHk:7Qi36MQ2d*5PmQ>)]_rVuoss8N)qnG`Id*rl0 +%qAam]>i"7`l?!=aNVfJ`o5#=b5KBh`l#;e=&j:J`QH9CrQ>/]+2u:Bair&YDc\L5bK%WEa2Z*< +aNDZHaND`Nb/hZD`W!jkaNDZLaM?'If.N)HQBdYrOcu&sQg^1@Q^*j8P7*V@OZUJ3_9C!CaN4>" +s2b,\--XWe/jP2e=_MJ[+5#2[[^is!bJq]Ia2uKMgsXsHoC;;:mI0N;nHnXVo(DqM[CGGjrpU-[ +o'bo0n+6PP&G,;YmdTuBfXeQ[q"XLOlgOf>rpMW.l/1n*m/QqS`k]aoq=3e4cKa*+bK@iEb.#"- +e(7DuJTcj(M0U;sbfRcDc,\#MaN"5%$-:-*`Pg-JdogYgPQ[24Pa@U4QiE?NPOXnLR?`ek=+/cT +c,RcA`6$3Bb4Naeb/hZEa3))[f>n<>`lQ0> +[q&0(9ko1~> +$23Is-Do7#EYL"EW>k7qXOOus7/T^UQJ;jG':aoiP`dQe,91Err*9)qtTg#LO"#` +F`mA#s*-,FEH#Sd&e#RYEHZPNGBe@XH$FLREcQ;JH[9pN3t2N5>]Y19F`DMEG'J7TG5cb>HZs^W +@V$GY&Lpq#H[::*earb9qu$Hnk4/HNr'`bOL4bD>LI'qoqu6QnrVuins8N!%q#: +"gOo@p\k*grrN-!hu,.6UDfg->oA[d2_q+ebrr)orrVm#W^r+(. +o>CUF&')B'b.NXjNjljC`59=,_>_=O_uIXf_nj1&`5S^;NJbHg_SO+-ai23s_uIS,_o97&a1oiX +KTr+G`Q5d+_"Ia-rr<#ts5W_NrV8`@=,)0YJqH8Gq#: +%qAam]>i"7`l?!=aNVfJ`o5#=b5KBh`l#8c=&sCL`Q?3BrQ>/]*Q?(@b0&#Y?iX,T_8sd?aSj-YaSs?^a<8^V +dP=XgND+,$@AMN%]>1hbe]YtTb/_WHceQt'nFQ8AnItZbp\X?h[^kSlo'l,8na>f3n+$DL&G,G_ +nbDn5^:UlAq=X@Km-t#?rTuE,kj7[/s7lW6]#`Clp%Ik5cKa*+bK@iGcaL[9eCGrn8:H/MM1dP" +bfRlDaN;`J`l?+!aq;_7aMQ0RfK1X@PEqN!O-#`orKlo:%?QmAN.R_nV[A6UXL;CV@dfa8j94a9ou-aN2E2A5#QhC4H~> +$23A4RJiBMQ2d07PmE +G5cafG]s(/'6\VGH$FFC<"K-;$q>^Ha3GjD"L4X_Ns8;orr;ZfqrVuiq&cDV)s7b#J +MNX6eQ^ +"gOo@p\k*grrN-!hu(G"(Wprr;urrr2rrrW)uj +rr>3R?dc;s-N3^t/J_rr)or +rVluV^r+(h_u[cmrkSTOr50/a_83n)`km^mQA`;k`P]L,_o)Jjs24lT&AuH"`5/4-NffC>`PK=) +_SuJj1W72K_7m\)_8FN^O-GTscGIH9]tj=@s8N&urq>F>rV6Ein2Y96I"6Wg;ZHars8DutrVlcr +rVc`qrt#,/pXL +%qAam]>i"7`l?!=aNVfJ`o5#=b5KC2`l#8c=B9LM`Q?3@aN2NHaN2B?aN;ZOcUqq1`6HBCb/q`E +`lQ*?:d*9GLoZ7'P*mDl62414(CLSP3 +eCMmN]sG?$bJq]Ia2uKMgsXsHp[e4N&bGblo=MKG[HR8SnF#]7naGrFnc/1lp[\4WftG&/ZKCfN +oCVYGn,;SPm7?dBqZ$Bes22Lc][6TFnF5>ZlIjA(bfIrH\%9c*f\"Uq?@7?^JSdL$bf[rDb0%cE +`lQ`PKC-_oKmAb5KO%c-4DSaN2B@ +`Pos?aiVNLcn0i3eA]SOaNOS(%a*&?`kfBX<^T8H8Sc#[rl>)[f>ms6rl>;a\R\B*9ko1~> +$23lfJ0Hrr;fn&H)P+s8VmrL.^D&s8Doqs8VEa#Q"'g +MjK`tQi30KQ2d07Pm*:uEVTD1mf!i.BWZD]E,.l1oDIXh_oU=)rVulr&c_b'oYQB/F`VSDFa/1X +H?jc6FVAqCG]\".%L*%9$<;.nH@'m^G'&m9-rH?s[RGlE!gG5lgeG:[fP +@NkjR!sg2aDfp>ZOO`t$qYU3irUfIUrVcZlh(Er)Kn4J7mJd(arr;oos8Dp/r;Zfkq=_0qQ^j2% +R?a)$Pa)-3s-E2?&!30DP*D)SK`;#Nr;Zfqs7-(#s8N&tqYohNPX>-=s8W&trr2oss836's8D +"gOo@p\k*grrN-!huZEV]G/s7ZHks8W'1?tH]=LInb)qBai)?Q +rVc`p!<)lr"5^i2_u@RY_ns7*^qmnc_uIRb_90TMO-brk\\lA%^VRq._u@OO_[XE'_l/NLOctgA +`koR0rkeZNs24lR._ig=aiKs8PEh,tbf@Q8_8,aDs8N&urqc0Qs8;fkr8'#JIt2of54/CKrr3#s +s8MutrVc`prsnl$p9dkaRZEZ#Q'df%QMm*KPjt"DP+%`%P`U*Brr3*"s8W#orr2lprr)j,rqufq +rVu1NO$EF9s8Vuprr;p*rr<#tk-hP#Z(e`'rVlcrrR_#Ls8N#t"o#0kSY*-:~> +%qAam]>i"7`l?!=aNVfJ`o5#=b5KC0`l#8d=B9LM`Q-!aN;`Uc8To,]["Xc)F?BO3+0`mi,B^;%;1bJq]Ia2uKMgsXsHoCMVHr:BaS&G,Spo=)EM\%:ksoC),8o^`"OrpLBf +oCW(\iPN+>]X$\koC_hVoD\:Zmn!'Hs8Dlkb.kU'\B"F>o'YP`lIX5&bf\/S`4XC>cI(:Z(i4_X +Jo<6adE0JLa2Z3?`lQ +$23Lj$s8N&tpe$ZAf_b^Ir;Q`drqud$rqCeg +Q'@Q"rfmAHs-Du9s-^0fqtq,o9W+RUE*uW8s8VfR]Z@_6r;HZprY,>/q"2FYH$+1K +F*2_QH$Xd^G]s%."EJ%[;m?R$*>#mf3=^s8W&tnG`If$2sf!j[b\*m/-_[s8W)ts8W!(rr;r` +p%._8l2U_]rW)oKrX/])r;6Hmk3VR(p4*~> +"gOo@p\k*grrN-!huuL7ns7t`i +ah64'rVlcrrVca-hS@%H`5KR2_SO((_8=(,`;[Xf`5]EMNK06nOL`6F^qmn-`5BI0rk]Dd_nsEr +OcGQbOc.#p`5K^8`P]O,_#D.h_oB[3`M/HZP`:or^rXO/_SGjEs8N&urqtO=rr3E&r:lCXL4Onp +6_!rLrr3#ts7lR)qu?QnrV'?CRZro"PF%Q#QMm*KPjt"KQ^Ni&R$*>"mf3=_s8W#rs7cNks8W$, +s8Duqj@,4tmJd%`rVc`ps8 +%qAam]>i"7`l?!=aNVfJ`o5#=b5KBj`l#;e=B9LM`Q6'<`l@tu29*SVbg+V\.Y0^jbf[uIbK.]C +aNDZH`PKC.`lcNMcd0k[aMl'5`mJ71LQ@[gR$j;+Q'7F#Q2d$WOcu-"S=,@*R`rskb/jS%s2b2^ +s2b/Y+iqpP31l^/C/dCDe^;O\Yf*o\e]YtTb/_WHceQt'nFQ8No`+O_nbhkUnI5$]q!>f0]"Z+o +l1OWHmoB#MoCMM@mHsH8p&!df^r*t)^@M'knaZ,>q"t$eqXj=Jp%7\@bIkd2[_'NIqYK^Fcg'-* +bKS,QdBL:-c-FGXdWJ38LPKe+J'uH[`l?'>`l?*BrlbqraMl6?eBuT'GFOk[QBRZ#rf[JMQ^=,, +ns'rRP*:iqRZN%YbgjqP`5T[9`l?*@b5KQaaoTT'rl#;db07uMd)\�#brPrlY5]%a*&?`kfBX +<^]AJ9Q%Parl>)[f>n +$23B3i_T((&rVulr#QO\roYQB/ +FoHFoF`r"SH$O^]G]n.JEGJ\p#7(5.'*M9TH$Xa\F`2>DG'J=ZH#d^]&,lPr!sB9=D/jQ:DfKi@ +G]n4QG]d_0lV,TG']5"oDSO_r;QW^mdpJXr;QKfBP`HVK0M`mqu$Els8;osqYgs( +qY^Bhq8HO"R?j5&Q2[$HQ2d0@Pn91GNgPunR?^:_o)JUes82icrr +"gOo@p\k*grrN-!huQ'dc#Pl$aGPjFYBP`q>c=82aos8;ips8)`mrs8RPI\pjcDF!^jr!35[`kodH +rVc`p!<)lr"Q$r3_o2Plr5'Dh_SX4/`Pom7NJEa_PF%9=_Sa4,_T'I2_o'@j_%ai3X-8O(PEUl_ +_TB^5a2c9=_8!eb_D&pIbeop+Oct`fMjh`'_o0=*p&G'ks8W)olgXWJrquflqIXDnIXaIGnGWCd +s8W#lrXf,.s8Vun`E8+eQ'RPtPa7X6Q2d*>Pn97KPF7VuR?^=`o)JUes8)`ns7uZmrt#)-s8;oo +ha`f!irAlTs8Drrs8 +%qAam]>i"7`l?!=aNVfJ`o5#=b5KBj`l#;e=B9LM`lQ0=`l@tu293\[bK\AV,DSCdb07lHbfIfD +aNDZH`PK=,`Q69Jcd0k[b/VE/] +s2P)[+j/2AEi!PSAi&)jbJVTD\A5qoe]YtTb/_WHceQt'nFQ8NoE"RRqsXRTs76Wlo"MWN_8!dr +lLj`ImniWDoCMM@mHsH9rnYN-_8XC,_=mftlg4$1q"t*iqY'CFmdfSTV6R_C]X>lXo^qh=cg'-* +bKS,QcG732d)sGTc.Gm#KS4k3/C)P^`Q$+#`W=0'rQGepbf7fOb06VRMO'HmOd210PQ.!LR/iTD +Pn]:KQ'7Po33CKVai_`B`l5j7`lQ7"b5]Q_`Y$20a32]Jbg4?iL,-9``6-Slc-42D^7&(l +77p6k]uU,n!6<^4$HpT7aN:u'9LhflJ,~> +$2!6>s8W&rqu6Tnr;ZfUrr;uurr2iprr^[8lKJ3HqYgs&rqucqrUN:>PT0mO1;t^+f +s81`m_o't$rVulr$NL"uoYQB/F`V_LrcJZnG^4^[H$O@ECfD#T#5nN7$WhCmGBn=OEcuVIH$FUV +D*/L1!%e9a'j,BtFa%nJG^OORF)>u?FD=/s/LMbU%1k@7EcZ>NO4Ek#qYU3irorhIrr*K,s7^J" +KS+tCJ9Lefs8W&tp\t3jrVHhlA +"g=i;p\OjcrrN-!hu2D$`Q-*8P^n::N/R$s*5Q2d*>Plm>;QBhB6%S4S8qYp +%q/[h]>Mb4`l?!=aNVfJ`o5#=b5KBj`l#>h<)n+I`Q6'<`l@tu1<%8Sbgb"[,)&LRdE0DObfIfD +aNDZH`PoX4_8jR:aNMKLbKJ2KbrBQuO-Z3#S!f\2m$/6OP+7l*S=G^-WQiH%_TU-B`Q$!tasG*J +`6ZEIdC2'.S3gpp5hXZ/a3;K4_nWn8bJq]Ia2uKMgsXsHr:BsYs6jdknETK7nalM@\A#_p_8g;LS?_nX()\aK+Zkj.R%oD%bEo^(u6o&R*COHQ?9[_:&bo^VG6cg'-* +bKS,Qd(@$6aMu6@d*>QEI"6f-Dd(W7b/qZH`l?*BrQP;as2b5^$-UhU=H&B(QCjMDVBgda5tPb/_68`kfR7qT'5faN)]J_9gK:5_pW4`m;ZLrQ#Gjc-4/A]p_ql5tjso +^!at/b0/&LagtkS7nm`K~> +$2!6>s8W&rqu6Tnr;ZfUrr;uurr2iprr^^9lKA-GqYh!)rVucfqu9

UEls8N&u#lakoo'Pu2 +li5?2s8NB%s8Cg;m-O]NJ,~> +"SK^.Wpp#fs8N#ts8E#sir/uYrr2rrrWrQ#jI**Thtmajo_eahr;ZZfs8N&ti5W^R +ec#IGrW)oqrrLuloYU[GrPK>f`kmdkNK93`_SjF1_8=%+`5TX3rk]8bai1KHLmOWkNlT&N_oKj: +_u@OQ_>h@k_njF6Ru*,jR#dlY`5'1+_=dj.rVlfpqW@;IrVlfr!<2ut&,uV"6@4N>H\Hrp5\?$H +gAV'Lrr<#urqud#r'?L-QC!foQ2d*HPm3J=Q'7S7]`.p?rr;rss7lQms8MuprVl`p$iKu&qSKYL +\>-D+rR(TOrVulqfVG44SAG)Q~> +"l>\P=g?0Lb5]Nc`l5pf#u7X`7Z`%Od,a. +!13YP"dbL6boA73h`6#U(q"F4Hn*TE-mI1#D47i.=rqt0V]Z%e%de`k5mc;^\f?)(S`lcZA^<+O=aMu-8 +`lQ"hRfNTbl~> +%0,kYiW&rUrVlfor;Q]qiVilXrr2d&rr<#ss8UU8kk>&Vq>LBlrVlis"o\K!s7cQlq??nk?^?kA +rKQ-'%[NBGPa?cCp\Opirr)irq#2$,rk;gCO$GooF`2>?Ak)[tq#16jrVlisr@ +EH?;JG]n=WH$FINFCdBE$O6Y3#<$FFI<^1"eF`e>rr2p"kj8*Drr;rrrVR9+o6tD&MM>&,?"dLn +Q!4"]r;HWps8)^#r;ZKe6C*t%R,O>0QMm*KPRX%GOaM6Aqtp +$2_o>V!%aTs8N#ss8W&urS[\Rs8N!'s82>TX0^OUrVc]qs8Muts82d+rVucpq#C9irVunn@[E:F +rKdJKr072Gs-Di5$^R!CIph[~> +&*0Ni<2IUSbK@oG`l5s=b2LG@`XU#3b/M?C`O&K>=-:/8rQ"uYprEuc_8O79^WOaC`5TuJ;3Ht: +Pm`qHR@9P3Q^*bsOd#@$rKI8Hs-H6EQ^3\nDeRhIa3)KDaMu-8`Q$!Abfn5Mc^dk/ME3[RCM@[$ +>W(Ei`lH3BbgFhY`5g0A\A,\ge]YtTb/_WHceQt'nFQ2KmJZMPmJlWSnau[q]#DJ!_6rh*oC2;@ +oCVYEn*fZ2nalM5_7IIs]Y_>Rp[[e;m-a90nal;@n+$)NqprHqa1]=(g&1X;n`A*`f?)(S`lcZA +^<+O=aMu3<`r3sjbgY!S>Bu!V:ek2(=<`J_d`VR/"3S^(`VmgU`).[??d +S!/V?<6NG&_o0L;d)sGK`lui\dE';H`l5sAbf[D&7Qa46GeD#8d`;d;cG[JV=%l:jQ0a#~> +&-)=`k5G>[qYpEir;Q]qs5t8mUF'`n\ +r;-C#s8Domi5NXQeboCGrr*9)qtTg#LO"#bG^974%!d/EH?jdTFDtM!#m:,+&dqucGB\:UEH68K +H?OR^D/Mi_r;[W9$Q!5pH$FLTF``"QG'.tRDfB,F'FG-F!"9/kCj:ARIuVtMs8Drrrr_KOq#:3k +rVlip(B4/j>_\#fItiH/K7#mkZ2".ms8;`nr;Q]q&H;V+q=Kl9QBmf'OI2>qS!*K1"IG:/PaV?4 +rg*SLs-*ePQBIW#OA>HGnbrsqs7Z3erVuodq=3h%rr:CF$NL,)s7YUBm,e9IJ,~> +#l`JKT%s5BrVlcq!ri/si;WZSs8<6$qXgP_Y/gP?rVlZns8N&sqYgd#rr;h;H@_9Hqj%)Drg!ML +#EbF?OI)3!Pk^ODQ2m3KPR3Y?QB7DOq"t*kr;Q`r)#jI5qu$BlrV]H]W((K?>!m+DDd7AZs8Vuq +$NL,*rSYZ4`7=hbrr)orrVloT_#;1M_Z.IP^b!7:_Sj:3aME^lO-,QgPE(s8W#ns8W)ts8W&s&,Z;#oT>E)Q^*r"R$Ni'P4k.DQ]d5jRJE-I +PQ@&8rg*nXPF%Mo:A+Ydrr;rr!<;rq&c_h0rr2ros7`q,[C2UVq#CBBrX/])rqa^3T:DM)qg\~> +&*pZ/;OP8>aNVfG`Q$!Ab2LGAb5]I!b/hQ@`l#;m<`XR]`QH9C`l5s;aN2NHaN4A#r5eo\#Kb?= +<+gK=Qi<3KPlR0KR1,FIPECugR?ir$PaI^2PnB=HOcYWdQC+22R>Zi"d`oqUrlfl5`P]X6b0nJU +_oB^C1m+\)A8+t-Ecc+l;p^Uh&-bJq]Ia2uKMgsXsHoC;56n+68Jp@RkC +mI'?5p@>i2_SX4-_7fI6o^MDAoCV_Io'Gc9mJ>kb^;\+0`4rtYp$V55lg=0;p\4:Ln*Kf?f=eou +`"g2,^tAV[oC(_cm+9A"aMuBL]tVV2rlG,^s2b2Z0ZqeoFA74=M2..HM1Be/:R02F`lZqS!*K1"IG:/PaV61%?lp9OHGlpS +&-)Idm/6n`rqu]kqu6Tps5Ld%rVcTN`Pf^Fr;HZprYkh6q"2FYH$+7QG]n4PG'J:WI!KsS@q$>`"8i-3$X[t!GBe:OF*VtQ +IX5pP7Ml=-!#>_I(L_E2G]n4QH?=FKH?X+IA2Ol)$2ji4#rc[EI!L4$eF`e>rr2p"kj8*Dr;Z`p +s83Z.oLjafK8GD7J:<<. +"omSRT\'&>rr2rtrr;rSrr)j,rVZZmp8G!n^\ds.rVlfmrrE&srVZX$s8Muqq."o$PEbs0rKR2E +#Fgm+EgDiRQMHdZOcl#sR@'>,OHtus2q%[(s8W&rrr**$rqcZlr;Q^.qj_f1FB3]gNM=G.^V[h'p&G'jrr2lmk4&EM +rr2irrqud8qt3U4J:E<,I"$HuKN2b]r;Z`qq>L?nrr2rtrVlfr%/3\bP*V6$Pa.ArP*l'1#F(LA +PEJXlNqnt?PlI$KQO0%GQ'.;pO?rU?nbs'ts8W)up\a9`ZF.*2iqrc'rr +%.:u?aMkf%='0FN`QZKG`l5p:aN2NHaN2B@b0'\($-('0 +dF(O'F-DphP6.#9Qi3?PQN3L_ns:: +c-4YVbfP'=Vfc0ZB5MU6G&Ls3b/VHFbfIcEaN)9Cd`Au6]"?M9`lcHEai_rbdbF9_na5`6o`"Un +o^VJ=o'l)@]Y2+trkrZi^[q0knF?)?oC_YAo^V>Gho*=NcH*o?^V':5nEoQ/n+H8Ln+cM9p[utF +]u7e)`koIBqt9RLj3R)DaiDKBb0[i9ai_]Gb08)P`l?!;aNDa\DL$bnP)G0FK7Hd.3S;]uaMZ'B +`lcHD`Vd^cbgP$*LPh7USWoD%Q'.O1Pm +"TJG[m.C;Ws8;oos8N&uiVj#\rquZgqu$HugZ7h^s8W#prquZorr)lnrWi?!oK\:dPEta(#Eb7* +2ij&fPPLIUR$X)&PEV/mSW9,)Q2gRXrqu`os8No7s82fkrVcqlfh"8i--#rc[EH?ajteF`e>rr2p"kj8*Dr;Z`ps8;oo'Qe#A +N.6M;Ko1D6Cf>MApA"[fr;?Klr;R9%p&+APS!&quPa@])OI,d.#F(F7Q"a-IR/*$IQN*6MPlHmO +Q^*r!BhIOco)AXg$MsSurr;W[q=O%!rVt=F$N0o's6&J1lJV^BJ,~> +#lj:_Uq5`:5Xn +%.DJL=bs`-aiqoH_oVi"ilDhVbf[rFb0%`DaMtr4;cm\8_p$9ErPnlYs2tA_s2P)]s2b2Z#ft-7 +d3O'eQ(%];pm1uGrf[SLP_M,XOI27-Pu=$;PE:iePEhi'P)+;6^W4@:bg"AS`l#[9`QH6Cahu=` +R\N5jG&D#:F*MIr(!=P9bfn/IaN2E@bL4JB^Uh&-bJq]Ia2uKMgsXsHoC;;r'+9b4E[d`ko[;c-=2DO@qW! +:0+^7^W"XB$I$Z4\S"Q2=(fG>J,~> +"TAAXlK\BKs83&tr;?Qos5EtWrt#,,q"asirr<#ih"'D's8;cnrqufqrr;fn#Q=Si1i&2q#C?mr;HWprtkP3p](9ls8I\#WG?-hF*`+LG^"0s`q]B/ +$ig2(qV]?2`7=eas8N!*s82T`_M! +;g!YGJp`0)JU_u +#laOgU;Ha's8Mus!ri/siVrlUrVllrrqluscCM2Ekl(JZ!rr9!rr;cmrr36&s8MRGClahMPm^6is8DutK6sG,@W67/F_Z#>Da_YCrr;us%KHG, +s8N&si5NUPec#IGrW)oqrs.Dr_o'F2`Pqhs#fXa!_SF+2PDB."#a1=2OHGR>`Pqho4i,"T_8aO. +Z&O[,QBRGlPEh,e`l,^3`Pf[0]u.V'^r2FmOI;DrQ'd\rNMFM0_8O:.p&G'jrr2lmk4&ELrr;rs +rr)j7rr;@aFFSplH\$p&IsFMX7I:'So`+sds8W)ss8ET0qu?]qqTqWpQ^F/&Q'Rc$q3;/TOHbke +KTPtos-3PKs-E\O#Eb@1QT7pqqXXUrs8Drss8N&ue[DfmZD.$id/FCPrVuYrTUhXInGe"~> +%.Mq[>(*uuaiqoH_oVi"iQ2&As2P)]s2YYk`P74'>%+/Cbf\)L`r4!Yb5]Q_`rF3]aSs0baNMoS +)IA;hS+W-HPm^<=aBce!&VUhjag +E-68:F`M(JV9I$#bfn/IaN2E@bL4JB^Uh&-bJq]Ia2uKMgsXsHoCMtOrpTmS0(8;uoD$56_SEt( +`5BI,]C>F]m-X6/nal8Cp[7"O\A5tu^qR\%\[_;-p%._Brp:p"me65E_RI7t_S*h+]tV,.q"+%C +iQplBaiDKBb0[i9aiaV(s2tA_1WIDRaN`A\3F[&WH[1$eF`hdnRl&C=`k'1=`l5sBccsPM_njU? +c-j$_Q'[l*Od26!PkgRKSWK(u3/!CePn'.GPECukPFR`'0KH;Wb4E[d`l,g=c-"&@JOqmh9j>9E +_8apE$HgK1[TuO$=_l4LJ,~> +#QFb_kMuUBrquZqrr<#Wrr2p!rqH3brs.!Fjo,5Vr;>s]#QOPi5s1BsP4=eBP`q8^:hlA\q3;)I +Q'R`#rfRPLPre^=qu?]qrqufqs8No6s8Moqr:nr=XIM_"G&h25GALhVp\+X_rX8c)rVGHk`5L4( +rVulr$30ntoYQB/F`VU&EW:(ZFTul)D.+7g$iBu;!t*!#,G6!!X3I +Ecc;@Ecuk_FEMeE,mabP!<3*/$o_sDG]S.heF`e>rr2p"kj8*Dr;ZZn(AIh.<[fV78Prc;KSFh6 +Xc@W%p](9hq#1g(q#1!`qER*"Q&_,qPaIX0Pm +#la[qTt'pqrr2lr!ri/shu3WSrr3?(r;HKikEE'Si;ETSp\t3mrVl`p#5RpX4d2+mrKQu?#F(F8 +Jl$3LP51@DOco^0rfdSKQ8eR:qYUq_o'F2`VmeV`PfU/a2NpkP`(]gOcYWbOH%)q`l#^2^VIt)a2G', +OGf3bQ'@GnOcbXC`PKL3`P]L.]>)D,ML:DJPEM/oOd;,gUW:6g`PfUcs8W&srr)]UnGi=`s8W,u +)>X=4<@KJ47o*?4K7nJ,WJYiqqZ$TjrVuosr;cirrsnl)qu$:U3/a&^Q'RZ%P51@JO-Z,!H\I`N +pltoFQ'M<6#+1IBQ"3/[n,~> +&+\Up>]dNlaNVfG_oBd?b2:;?`W=6+rlPJ`^S4,$?^/D*aoKN]b5KE]`rF3]a9or+`Q$0FcmLK- +Rf&TRQhQaMP`q8^:hlA\qNV8OR$j>-OcTI'#;5&kb/V<"+_ +<\3"Se&]PQbfIcEaN)9Cd`Au6]"?M9`lcHEai_rbdbF9io.'4rlg!d$m.'uK^q\%-_SX70_8*dq +md]`1lgF32p?_\Pj06D2]thFu^Abbr\FfUip@IhAlgEs(qY\4:^Vmt'`507-]t)Sbo'u,-cg99* +a2l9Cd(R08b503Z`\GQWa4&g%%i88+6;D'2F`0%4JRHmCb0%fM`Pp*LccjAG`4a11dG?cAMj9iQ_oC-G$HgH. +Y?4Iq>'AEcJ,~> +s8N;ijPU";rr2in!WN,Xrr)lsp\XsqdIHPts82`lm/@4aq+*o9R$@-+s-EnTP^tuQRJE*XR$X&$ +PEhH"M`X[7qtg?jr;ZcqrtbP4r:g-_Cmh/(Ao1't4$5bf4]qCVqYC*us8Domi5NXQeboCGrr*c7 +qtTg#LO"#`EcQ5DG'J7SFDYP/!WrE)r;[K4"U5NFEH?/FH[C'VIV):a"onc(!##J9!!a9IEcc;@ +EcuqZHuj-[$3Bu'%KZ_@2f!MYEd3Pmo`+mhrr3)am.gSXs82d3rVuKfq1jF7]8flS;K#$hV,l%E +rVcHiq>Lp%s82`d4`sOOOIDK!PE)40Pm#pQFS!<`6s-E\MrKIPNOckc)Ac)AprXAi*s8;co +s6&hDp"e^-s3glHr;Q^#h +#ljh.TWn1hrr2iq!WN&Urr;p+rr<#sr;Z]kooZ8\fDY^Kp\k0mrVl]o#5\-d6BIIrrKQu?s-EnT +P^tuQRJ<$WP`q;rQ^F.u4A8cPr;Z`os8W)ur>GY5s8Mlop1fnf9[\%fQG-rr;f5[^EQA^A%L&dJaLQrr)#WTq@pcpA]X~> +&,,(7?Ym*daNVfG_oBd?b2C>C`l5s?rlbYna1\`J=C-ftpr`QV'#r#8b/hTB`Poj@bLJ4'NguT- +rgai2KM-#61* +OIDK!PE)40Pm#pQFS!<`6s-*;Gs-3bF6qYnLb43O`aihiK^o:j75t+:l_SX72d`;d<`knKO +9i55Qg%0^~> +s8NQ'i7e52rVl`orqu]ns5EtUrrVrfrqud!g[+=ts8;fprr)lsrr;olrWiK$qK>YlR$dE/#EY@; +QCKR"OSP.PR$El$R?rqf6#1L,\b?%&rVZWn(]XI6s7u]2>HNZ]92oW`n%;fOp\+L[s7uX%s8Dom +i5NXQeboCGrr*c7qtTg#LO"#`F*2_TI=6EaCLA4b!rrrr2p"kj8*Drr;fn(]47/ +qYg3cs8MTho0RuOA#uA1o_\Ocq>("#s7lKf;He!_;+G)ZR?O)"q3;2QFARIMR?*R-Q2d0IPm3S? +Q#KTep[J1^rm,[j>s*t~> +#lje?TW.DYrr2iq!WN&TrXSl*s8W)rrVu`gT;Ag9rVccqrr;rsrr)lrrql^"rq^e4M3XA)PkUFL +Pa.>uPEq^k8s&h5s,mbUR?rqf6#:L*\G-""s8N!5s8N&ur;XQ7W.Io<;J=tU]33VXq#1*hs8N!, +s8N#trr;rT`P]XErVc`p!<)lr"Q$r3_o2Pl(W!o&_8F.-MfsPtG`e)NOcYTaOcI8s`r6\@&]=f(f7BdJaLQrVG9ET:V^qp\o[~> +&,>4N@UuRU`QZKD_oBd?b2LDU`l5p:aNVlQc,mW*<`N:I]ZA1:b5TWbb5]Q_`rF-[aqVq:`l5j7 +aj&==5_Y`"R[TY4Q^*j8PQ-pJQO0(HOI;;uS1[EqqNYKUS=,_0Q^*M^5A"FWRa94"aMu3<`lQBJ +ai)';a4R1ZUjbcj4&!Q?SN!Una3;]Q`l?6HaMl6Aa2Q6MaLT's]@G*Eb0%cHb0Skkg[Oh+o^hJ9 +lK[d/q#8II_SEe1a8X%K`597!md]`1mI'K9p&"?e^qdV%aMtm(_83gu](Ysmo^VD;me$)Hd^I!1 +]>Vn7aMu'0]t)SdoC;A3cg99*a2l9Cd(R08b5TK\`r3t3ajSG[eBuaug!AU*,A"AcUm=Nrai2QI +aMuMHHaUUo#UjQ% +Eli8]q/Ct6UsY3`5fjEa9p,1]p;Vk;dl3QoRH~> +s8NQ-h:DW+rVlfrrqu]ns5EtUrsnerrr;lqrr;6HlK\EKrr2iqrr)j"rquZjr:p6oq8Y+=Qgg7F +S;Wc"O-+Tpplu>RQ'db_=[$\EF*:LUs7uWkrVdW3s8Milp.hK^=/.nSp\t*brql]nq#C*arX8c) +rVGHk`5L4(rVulr)?9U/oYQB/F`V\MI"-ZrH#dO1!sS`*"TSZ&!"B#??ZL71G'A%LE_d8NquHa( +.K]_P!!sC9f +rVQNks7l:leb3p>VJ*@6q>^3crX\r&r;1Y1HYmhHBNIHXQ^@K4#CeIWPaR_tRJE-JQMZpPQBdV> +DPdC5nG`=b"Q]+En'q@:!WN,Hrr +#QOVGTqpoMr;Q]prrN,tir0Pirr2ios8W&qq>^BdYbS>9r;HZprr;rsrqufrrqud$rr)]5/:NkI +rfm,A$'^^FMjTcjO`k40Pn0(@Q'db_=[$\DE-+tNrVQNmrr*f6s8Vrpp.M-S;kZ>Nq#Cs +`P]U3_SaEqH?agcrd"s0OcPTbNKK4@`PBCj_umip_3Y(H*-cmUJW#DFP)YN]Ur^Ei`5BFas8W&s +rr)]UnGiIdrVuiq0)tkKs8)corr<#op06)?CkeWoZi'b$qYpKos8MuqrqufqG=d$qEcbtr5`D%r +plu)60n,@TPED:,Q2[$JPmNa$:prr;Ke%fcP-s8))l\[A`;kPG5UdJaLQrV"^7T:Vb&pA]X~> +%Jo4`ARD1G`6?BC_o9^rb2^PC`rN0fn+Pm;dnI[$7aOdZ'2&X/?>Q^O;2Q^*l"NDs)9e]l8.a:QM< +c-+2K[#[jN6qBnJ`lc6Ia9p/1\VsH^<+Vudp4*~> +&,cJ-g>Df-s8N#ts82]ms5EtUrrVuirqucuoAK'!rr3,srqu`orVm$"r;6Bhrr2lr:]17m^/g/B +R$Er$R$3u*QC!o&QC!o#Ng#csQ'@bk="'DtR?`u%Q'IPuP_Cf%DJj`?DJ;<0qXsjfp&G'gs8Dip +rpuXtXF?!"q#C]Fn1Ec?,8:)EtGA +R$!c+P+%GL/V'@TOHQ&rPDY0ZR?j&$R?Ef%QBmf'R$NM\6LXsPnbrReqYgEtrT`eDld5Y2!WN,I +rX/Q#s6Sn3l/;R@s*t~> +#QF\SU8cW:s8N#srrN,tir0eprr2ios8W&rrr<#j^n.^;q#16gs8Mrqrquirr;ZfrsOGoBhR?a#+KNBRgOdVJuQBd`!Q'?tVA8Z4-DJNlKp\OXas7u]p +qZ$Nks8MY[CoMc9p\OpirVc`js8N!,s8N#trr;rT`P]XErVc`p!<)lr!T(Wk_ct!q^VRY"]u>,< +H$Xd^GBn^tPEM#gPE3Gq_o9O1ai1E3E.<:^I!BjaLQ7IYOcYIB`59=.`P]^2R6>C^Z +Ec,f8>Zm8RR$Nf!RZNnrCb:1-PE:rrPEUl[P*qW"PaISrQ2[!IQNib/JjAf)r:'[cqYpL%r8"un +]!.k#rVucArX&;p^n[BiU>#GCJ,~> +%JfCsBk*(6aNDZE_o9Xpb2^PC`rsR$X"tPEqW%Pad>-.$p'aQ'7N!Q^*o%K.^\PD0Ti*==2_N`llK: +b/_NJbK%]Hb^X#pCi@eGc,n/PbfI]:^VS"4`Q$-GaMl6Aa2Q6MaLT's]@G*Eb0%cHb0Skkg[Oh+ +naTfNnaQ2Gs1H7jb/_H9^;7q;c,IQ7]C#4[oCDPRr9M/,aNViRahu!5`l5m8_RfR=o^2)9o)/@< +]u%q5bfRlD`llQF^qRY5p@n4QkgAbKaiDKBb0[i9aiaV(rPn`Us2t;]:rgf+cd'k]coRkk6.!]q +^rjpB_og'Kcd9sM0P,EAE,T]9?! +&,lP.f\lT*s8N#ts82]ms5EtUrrr5nrr;rnrr3&PmcXTL"T/5squ6Nn"8r&nr;Q]ms%Mn]7sKiM +Padu.R#dDrQ'IZ%Q'$rXQ&q/oPa7MfF@DFQPaml&R$X&$1h_5RG&2AFG?nP^?krVu`m +qb*oa9(`/[p%eX_r;$="s8Domi5NXQeboCGrr*Q1qtTg#LO"#bH$X^ZFD5P"#Qal(rr`)t$k-Zd +F`;>B@7_+9!sST&!!3'#rW!?:>]=b1Hu!b31'[d]rW)s"rW!K2!<<**0kklXH$t\%o`+mhrr3)a +m.gSZs7QBir(m=lr;-?jqt?,!VfJ:)qYg?gq>UEkrqQ;/3,sCaH?"1LD08ToQ]dZ'OHc-$OZe5] +PF%i(Pa%&XK8c%[Q'[T)PFdf$R#d2ZIV)1Lqu?3c!WDoorrr8bn+,_rr;Y4Err3,ekj%Kjrr7K~> +#64Y[USZ-/rVlfr!WN&WrW`E%rr)fqs8Dm*s81<6Y-dNns8)cprVlco!<2rsqYpNp%IjBdGD2$> +R?X,*NKKM*PWG(nO,/FROHPlnQBR&F7?iaqS<9/*Q^![jBR=W=C3+E;>?g7ir;Zfns82fos8)Zj +8Z&1OoDedbrUp3irXJo,rr;utrSYZ4`7=hbrr)orrVloT_#D7O_$@]j_7n'5G^B@9#'tQ?I"@09 +rfKU0`kfR,_oofsIs-3iGBS@YGC"anNKTHdON>8K_o]X8^R0:kIX--bGB\@]Jr5SNMN=RT`P0.% +_"Ia-rVlfpqW@;IrVlcqqYp?k:&b(js8MbQGG8uCrVlipq"k$jrr;ciEAh]\BQe69DejDfE0ZNL +R#[>qR#a=ZQ]mc,PE_;hK7f,IQ'I\sSroM#Q'[MiKm[H&r;-H`rX]&+rVlfne@;rqY,h?rqu"k@ +$NKts\YG^eUZ;:OJ,~> +&H;44D-qn,`lcHC_o9X^V@Y,bK7]<^%_0kn+H_RkeF^Hc,e)VbK%N:`5]m=_nl*@m-aK1qY8^Y +_p6HHcH!rC`5]m<`4_oBpDb07uRH#]HfJCDES +`l5d5aiVrYg0#k=HYdnDGAqA?9lZJ]Q'm\sQ^NptJ^* +/Cr%ko#MBbc,n/L_lmuG6:apZ]#i"5dDu[=^UJ/^9ibuHme_M~> +#6+Z&f\Z3!rr2rt"8hons5EtUs8VurrW2rkrr35KmHX?Ds8N&tr;?QsrquZkrr2lr:]((ir/X*F +L51SROd)B"R$O)+QBI2\JVK5OQ'7N%R#->GT9>D+P*:um;`Af6EHQ/BG\_Cg46ZP1s8)Znqu6Wq +om24eEi\j4s8)cprUKjps8Domi5NXQeboCGrr*N0qtTg#LO"#cI!p0]AR#WI!VQL'!<<*0E--,10TM9XR[TP+N'2WSR#R8sPEUuZJUrT9 +P*M?$Q^*SuP)>9VMaarOq"t*]rW2uqrVm5qmIKc)l2Ue]s8UOHrr3,^lKdZgrr7K~> +#QOeiVP:g#rVc`qrrN,tir0\mrr2lqs8W&rrqcZpl^+`[gA_'Ks8N!#rVlcprr)lnrr;mls8@sC +=+l<`R?3W%P*_DuQB[JgK7AW:QBdZ"R@&h]/t\;jR?EbqPuBS^BlA'/EHGi55W\0.o)J[gs82fp +s7LYeUMm.&s8W#ss8DrrrVuoss8W)t%KHG,s8N&si5NUPec#IGrW)oqrrLulrkf/]_o0d;_gH`T +H?jg_rHh._J;]PQOcHig`5][3[G> +N/s$eR$<_j4+*9[NKT]nPDt6HJVT5JQ'Rf'PDb]fL5^qH6a?XaqZ$*b%fcJ*rVlW7[^WTA_>O<. +d/FCPqs^b^S=ZJDrr7K~> +&HD@HF'Ndt`6-6A_o'L:bf\te+NDC>`lQ0@c-=JM`PSiY<`tNt_8FI?c-4>O`l5s;aNFJ&!65#W +HGdhReScd%GCbC5Nff`kQ'IZ%Q'$uXJ;0,NQ'7N%R#->GT9>D+P*:oi;)E9-E-?/BF(B#E-HFKK +bf%NHa3;o\cWtFYArt6_be;':a3)K@_8F79bf7ZHbfIcEaN)9Cd`Au6]"?M9`lcHEai_rbdbF9_ +nalDF$N9i"^;@q5cHOAIrP(tBaj%i@^$,=fqt^0Z\$`ohaN;cVbf[l>_8jaB`P;-Ao(_JAq:!-q +cHOMW`lQ0>_ns=3aMu'Fq=sRTl-\kLaiDKBb0[i9aia7srl4rV"2Vq!b5TFPbgeeKVCp*2aNM`P +bJMHGgauZDEH#i@E,TZ9EFLS\OH>luQ'.%fI?^+YP*qMtNJ)k6LQ.I^P`q8rP+7_gJ9GubQ/0^- +bOW^cb0A)O`PJT_5s\%=H,%A;ajJ0:bJ:5j;GC/,eF`]i~> +&,uV/gu%Gts8N#ts82Wks5EtVs8N!)s8N#or;ZfCm-F!9rr`2rr;QZp!ri,qrVl`p%J]tuo_FPE +JrY;AOI):4Prt:mMhd">I>X5RQBdYsR=T-LR>[PsR[&=rDJsZ?DKg,@HZO+I/C4=is7u]oqtp3I +KF),r8B2=e_N0Tcf5_G/YR?s5&OH+gDKS+r5 +MiNdXrf@MBKSb)'7/-NLs8Vudrr;rqrs@rXp%$]6s8MusdJaCJs8V!Am-*=*s*t~> +#64\sY+N&qrr**"rr<#trS@Gds8Muqs8W&toq&4ibPh>;s8N&uqu6Wqq>O+gq#C*\q2eC(NdZtL +QBd\uPELr_KnFu*MNa +&HDIXI9:0l`QH?B_o'I;bf\qds2P)[)oftCc-FAI_S08V=b+)s`6$6Jc-"&F`Q$!Ab5B?[`c]PC +e&fneEB88tG`.KEPEM/pPE1TUKS+]1PEhH!PEM>bCJU@VRus)%HqS6kFEDGIEH$/?BP%mYe]Q7X +aiMTLe%e28O[RgKaMQ$6`QHEI`l5s=c-42Ibfn/IaN2E@bL4JB^Uh&-bJq]Ia2uKMgsXsHrpq?% +nbN3k^V\%6b/hQ<^V@V#_8XI6_7fU;pA"[I[^X/j^;Blj29*\R^V.M'`l,Las6f@Io#J,Kaj%]C +beM$4^q[Rs^r!t#chdM3p>aQef?)(S`lcZA^<+OiaSs1W`Q#m4`6$->`PTXCR8g&+>h$a0aN)BC +ce3A-D0'Z=DK:,KEb]`4AknS[Mj0Qb5D"rVR?s5&OH+gDKS+r5MiN^PMij6]K7@ZF-.g\jeBZ&' +a:HJ9ai(rh>S!pF5ZinJ,~> +&,cJ-jl,A%s8N#ts82Wks5EqZs8Mrorr3<(r;QNls4c`'kPbD`qt^*drr2p!rqu]mrr)j\q>^?l +s7l,j=akpZL4kG@N/W[MKS+r3Kn+fEc?&AFEhkHE]WRas8)Kh +rsea3PGhd(pAb!erqcZnnbrprrVcTN`Pf^Fr;HZpr_*:gq"2FYH$+7LG]$Uj#QOu/":#/8!WW6+ +#6Fl*"UGcHF)Gqg&J#!s/<"%0m=tBm4fI +I>ubKs8Drrrr_KOq#:9mnbrOerr;rr8,)mgQ`X'6p](3ls8)cJ6$-pbI<9LTDK'QBDg61lH'4h^ +G>3sPQ^F&'R?NM`J:`H-JqAZ0K8"o6M1^>;J4f&*rr;ios7-'irVlfqrs@iXp@QW0s82irdJaCI +s8V*GmHO!:s*t~> +&-)Y+\Xokls8N#rrVuosrS[\Srt,2.rVlisqYg,nVQRi5r;Zcos8Drss8DosrVld[q#C6ks7u2l +>(2$[KnG5;MMd7EJqAW.Kn+fJ8"s]mG9NJ9uTe +G^4XaI!L!aI"I6;NP*3Ib,BH-IXQWjI=HKcIX?HgH[UO*P)mGma1TKUFEi(XH[0j]H[L6jI=6Tt +L67Oka2G^.^VTUCs8DrrrVG[Gs7cNks8N!qs8N&rrr;urrVuonqd#Dd:=f4?r;Zfos4KYYC2nQ= +DKKT1DL-/CD+Af3SrRqdLkq=`Q'Ic$MMH_6KS4r/KS>&3JVSu/I#*5Cl2U_^q>UEarXSu-r;?Q\ +]!f#SRI:(Ss3UcFr +&HDOcN*'Gl`lQ6@`P][=bf\qds2P)[*Q?%Bbfe2F`5$Io=*:p__oBpFc-"&F`Q$!Ab/h['b5]P- +`k]X8d+6OdPt5q>Jq8K.LlICQL4b#-Jq\`-Od_MsR$0[`89a!5eWK/AAp;_S5L9q>]H\]#)7u^Ve%+^rOC4_nj.'_o'+Uo).qSa03(h_8F1, +_8?2es1eTJ'thE!eGAt2n`%m]f?)(S`lcZA^<+OsaT'E]aSj-XaAU%!`l#d9aN)9=`lQb(LS$W9 +bf[iJe'H^V.rK9MJT5USDfK]BDKfthG`eVZG"daLQC*r&R?NM`J:`H-JqAZ0JU`**NJ)Y,Be$sO +dFZL_bjia`ai_`D]pVY]5>4hW^r4R?$HBlL=\qgpK]`13J,~> +&H)S.o&Sp2s8N#ts82Wks8V*X"98Arqu6U%rqZTjs8VZHlfA$E"T/&jqu6Qo!WN#qrql^-qYpBi +qt6IKL4FZ(Ljju0KnTGX"b_Y]Iu'6dQ7nAjPCdjKOd;AL:NCN#D0C#DEH?;>E--5::&";[s7uTf +]OIt!F7oS-q>^HorVZ3b$ig2(qV]?2`7=eas8N!Hs82T`_M#6G,9"p"`-$Q*8oH#=rCrX'5"U>23!!!NbB)ZrX +IuVtMs8Drrrr_KOq#:9mnbrOeq>W,Fa]bO4@fH6(s7cQG4EbUaE,9Q:F*D\IAoMj/EB]JMPW4;P +R[9;$P*:iYK7njRK+NWfK7/B,MHWaHs7Q6grr2fbrX\r+rr<#lkk+W +&HDb-a.T^Hnr:0ass8MrprS>#nZEBtqr;Q`oci+3u +US"$IaSl/ +&HDUfS69!k`lQ6@`P][;bf\qd+i_UGaMl-BbfIuE`l+$9<,SYG^rOUBbf[rE_oBd?bfIm'arSRG +ahl-@bg+Rg3I5jlIYW?)Knb53J:`FDQ)@FDu2ABl.d(=ub3[ +ccj5Jc^d^sG$W_P`P]j;b/qfNc-4E2at:]R`luZJ`Q6-@`QQ]N\\G_fe]YtTb/_WHceQt'nFQ8H +p[>K#[(sJj]t:nirk9#X^V@=g]Y1oGq"iLG[_08a^:XBS)8!Sq^qmdr[^iuZo_e^b]sG#R^:V"k +]=#6K\JVog[^ +&H)S.ro`A3s8N#ts82Wks8V*X"98;oqu6Ttr;$0N.Q\8Kn]MZ2h?U9K7oDTNgYrtP(e*ENg)MIDKBN;DffrGC3OrHEH6A.B`.c-qtp@i +V6!ASpAP$jq>^&5o*+;>(l'+tc`%MB?`$k*LN#n%:X(1Lln1)UT2#S@RT&ebff&eYch'GCub#oGF+GBn1Q +N7@M"rVlfr"6f+Hrr2rlrq$.Hq>:,4Ml13is8MroqH%BMEHZSJF`_SDF)QAHCiX_tCR%53PEh<" +Q'n&$Kn=l,KS+o1L&HZ7K8tY;HpRW,q#CBgs8)ccrW)ios8V +#64\ueY/_hrr*-"rVuosrVb^Srr3N-r;?Qns8Dlmk+&N^iVWKKs8W&urVHNmr=f21q#16kr;Zci +bs$i9KmJW,JV*fP2h?U9K7oDTNgYrtP(e*ENg)MHD/s<7DK'E:Ap&<>Df0`"BDh`.r;6CfU8glM +q#(0lqZ$Hms8;los8N!,s8N#trr;rT`P]XErVc`p!<)lr(#HaD_o0?[F*M_XH#n7UH$FU[H?j`6 +H5:dTL53:WO)fo"E-HSPGBS4YHZs[ZHN&1%H@:Ff\\=#NG^+=YIsZKeG'qt1 +_nl$Gs8DrrrVG[Gs7cNks8W)qr;lotrr+eTr;Q\:M54[^s8Dlmq,M'HE-6AEE,TQ2EG]r@C2e;l +Bp1f+OctloQ'n&$Kn=l,KS+o1L&Q`9K7\r1I]!er@^%D=(s8:7C +$2qc8SXZ2%rr;tJ~> +&HDXfWEW>e`Q6-?`P][;bf\kbs2tA\s3*@?aMl-@X\;`/R('`JbK\/M`l5j8aNVlLaNDZLb0%fM +^Ve13`Qurc].SAXJUp=p$C\am+9A"aMuBL]tVV2rlG&\s2b/Ys2Y2_rle0\aMl3EcHaVPajsOA +T3mr3`5^'U5[.o;E-62CF)>f8DL$;=EHY2oPX0PWP`_B!R@0+iJq8K+K7ei2KS4r+IZ9)5F=Z(m +aNVoHbJMNoa:H83b/Li9:dI3-HG753ai;`L$H9c-;bg+jVX4?_J,~> +!;uir!pAV/r;Qfpq>UERrWE3"q>($is830"s8;oseF)>jrr3?'q=jdcs8W)ts8W&srVmQ.s8Vrn +s7cHkmDhbNKS>#3KS5!VKK"O7L5(/3Q'RT%PF.Yo9MJi!Ciai>F`;AGDg6>;F)c>AED#S9qAeS' +HApAGs8Drrrr_KOq#:9mp\t!gs8N&us8>Ifp\O5LWMrbhr;ZUuB6&!6DK9f=F`h_DEHPu?F)H"] +9l5rXQ^O#(Oc"dCK7\i4Jq8Q-JqAZ/KnP)-:\a_^rr2iqs82Z_rW)oqrrhELo)%8BrrMuri;WcV +rr)oqpAPBulf[^&j8]/Us*t~> +s8NQ%h4gUdqu6Tnrr<#trSRVSrrW2urVca%q>U&WYd2jVq>UBqrr<#srr;rqrr2j1rqcWoqu?]m +rr;B+7tQAHJ:iH*Jc(-YJVJo.L6\'fRZj,)MbHiO?#+J)DKKf7FDGu=BQ7s1Ci)hHpAb0iRW50L +MYd>Or;Zfps8W&qrqufqrXJo,rr;utrSYZ4`7=hbrr)orrVm/[^r+(.a/le[rj;j=[^N[C[f<^+ +[C +#ljea\6i6l^;^)ms2G)\b2CA@arJLA`QH?FaN26B]2;jAM7C:?ai_]D_o9X:b08$-aSj82aMPp> +_8XR7c/-jO20OG#K8,)6Jq8K&It<0*L44lBQBI]#R$NY(9jV%ai_cMb/hTA`P]^>bfIcEaN)9Cd`Au6]"?M9`lcHEai_rbdbF9_o_IM9 +o()DD(A74emdTiBqYKmVo_.qFmI&Tmq=sU\rr36&s8Vuiq"t'is8W'&q"!dos8;ThrrN&prr2rt +!<2fo'D'u=n+#c*cg99*a2l9Cd(R08b5TK\b5]Q]`rF*[b5TU]cH*uDbg"ARb/)?F2kQj2ccXM[ +5?;N:DJ3m-F*);:D/aT1GB.P?4A'FMQBmu'R?\*s*t~> +#5e>us5)r#rr3)uqtg0gs5X+Xrs8Q"r;Q]nqtpEc,u83aRK'Pa.Q#Q&UOtKFriiKnFl-L4t&3LOkA38bW)^rVlcqnbrRh +rr2p#jQZ71h>[ESp&>!Orr)iurquZmr;Zcqs8N!(s6&n7kM-%:r;V9~> +#ljo&m[^,_qu$El!r`,uiVrlUq#:^#p\:_dZ,lY=s8Mios8D`lrVuiq-N3VR8Uu\JIu8i1KS4`0 +Jq8N*JV&`?O-u>tPa$Pl5&tC[FE)>=rG_[S%WZB,F8Gq8p-PUN:&4Sarr)otp\t-krr*B,rr2rs +s8Clp_o1+(rVlcrrVca&hS@%H`59F0`Pqhr!6+lSrl#Aa_ns:3_T0O3aN2B@`5MYms25_m`5K[1 +aN_]I_8*t4^Vde$`l,m:`Podp_]-G3`lH-9]Yqh/b/V9:`PKC`s8W&srr)]UnGhYMrr3]0r/5g# +DjC.pdm.YkDK0Z8E,T]8rc/QhEH5r=CcYpVPE_>tP`q#Yrdk`7KS>&.KS>),L4Xc,Gt7T*s7uWo +s7?6irsnu(qWPZ*\?;=gp&Fsis5EtWrVulns8;j'qY$k\R\Q\DrVunJ~> +&HDY"eRMd)\A#r,dEK\N`l@#Zs2lA'`l#^6aNDZI`kB#s>ZZ!UaN2BDaM5I/bg"DT`q[XR`rF+. +b0AA\Uc*=KIXm?/JV&K"LP(22K7\`5OcZ$!PEhD];*8`.E,olbqXXUZoC)JCp@@hLrpp3`p@eL\*;&t!p\OUWr:os\o^DA?im6uC +aiDKBb0[i9aia.ps2t8\s2m[L`l?*AeT,B&Aq&@]Yq'.%Df'?2F`qhBC2S!.DfT`9C,fCKOd)3$ +R@'"iKnY/3JqJW&ItN8tLPUG4D(sJccH?+,"3/=!`q.:O`XTi+^R8:l4%2T@^s'g?grT<2rQ#>g +]j"-#>].^Vs8%6~> +#5e>us5W5#rr30"q>:0ks5O%WrrE&tqu?WsrVH?hrr_iCmdL/T#lOPus8W)oo_8@bnc&Rg%/dq@ +I#!K'I>`Z3Ljo;U'8(mkMOBirQ^O5(IlDUmDKK]6GPQ7iG&V\G6`KeRH\/8=W:Bocl2D(jrVcTN +`Pf^Fr;HZprWrQ$q"2FYH$+9/GQi52EcQ5DqKF(oZ,G\KKU +EdiFbHusLPF`hqRG'8.OE,orAHus'q;eU5qFaT1uo`+mhrr3)am.gSZs69Lns7lWcq+d`f9'c2^ +8:#,rq/Rj(Df9W9DfSEeK9_ghQBmbqM1^G6KS+r/K8"u/LP^V@MK_trr;HHirr)lerqud(l0@m8 +i;`iTq>L?nj8T#W!WN#rqZcutrr<#trr2p'j7DNlg]. +#ljo'o;A7cn,31brr2rtir0#WrVl]o%K?D-qY81*YIsK)s8W&orrN)rnbs'rrr;i.;0mnMG^G9s +Knk*TJeN]cKSYt\P*MB"OFB*3EG]c4DKYnsrG`?kDfoqbXSM[L9mrVlcr +s7?6irso&+r8,0!\ZVY"rr<#rrSdbUquQcqqZ$Km$N9+YT:V[Uo_ngiJ,~> +&HDY(hK)n6W4U'rf$V^\_oC]W+O&!L`P]U4`llQJaM#3B<`3A3a32TG`k9%*c-akY`Q%Ji&&cZ? +e=o-EItW)pML^G8Hi8R1Jq8W4R$X#&R$Wq_1imMJEG9?7rGhgT&8c<#J9]m+9A"aMuBL]tVV2m`>FJ +8'&iqaMu3=^X:'Q23X[ke(UHPDJ4*0Df^&EF)5T/CMe!1DfS?aJ!$%^R$sA&LkLG8K7ec*JV/Q& +KSFo3L1iU"ccO)GaSspsO%`?8uMH)c$92`4iXAMP^=FJoss7h*~> +s8;os!q5+*rr3,uq>L?niVriV!<2ups8E)uq=spg#g;]"s8N&tq>UBn!rMZbrr;Qgrr3E%rNK4T +KnbJ7JqJ]0rIbi:JqJ`6PEhDtQ^q?jUC]8S`JrS:Ps8Drrrr_KOq#:9mkl)(es8Vht +Dl&58q3supF*7;!-Za9HEcc>/7"^J`PEV?"PD=jDKS>)3KRnf/Ljt,4KR8GHnbE%^r;6Kns7-*e +rs\SdlgsQ/s8Vrpr;ZfWrr)isrr)ckrrrr7K~> +$NL,)qR<,sj88fSrr<#t!<;'X!rW#rrVmE-s8DutqtB?DYHdEhs8W#rrrE&trrN,tnbrajrr;`h +Y>Y@Q"c.SWJUrIPJeN]cJV&]?PEV/pQ%siHCNFK;C2s2krG`?cEb9AgS+to;Wh!&Zs8Dugrr2rs +rXJo,rr;utrSYZ4`7=hbrr)orrVloT_#D7N_>qLQ`;daR_Z.M#_S=41^raEKL;LmK`P]U3_ns:. +_ns=._Rdk*`5]rsPEs/-_nsj4&PEM&nQ'$ZKJ:`E*K7nf/K8=r.JUhoq +8FZHSs8Dcm!<;Tg$30u%d(?iuV69XnrrN#qiVrlUs8Musq>LHneXZW2"M4I/s8RT~> +&H2M&k([,JS@Z_de'Q@Y_T(TV+O&!L`P]U4aNM`Jb.tTi:fUSp_91$C`P0+.c-OYS`Q%Ji&&lZ: +bL_qAG^kF*JqJ`.K`-N:Jq8N+M3=*fPEqMgI5,GUEcl/nEo]5naZ5@ +naGT3mIKuJeA/ukp[mtGna6>E!:g$Z*:iIgoBlARmE2o_nFuMCl-J_JaiDKBb0[i9aia%ms2IRM +b08#L`P]I7e^9RbQ#gKpKfNX\EcH)?F`hbBCi4'+EHQ8-6%FiTOHPosP_OjDK7nl0KRnf/Ljk#/ +Ir]`jdEg%\`5p%!aof`)`Q%Ji%`ZQ,[s(V15Xo4oaN;cId`;j>aN0`E8PN +%fZD+s81X.s8W)qqY^BniVriV!<2uqrr3#qq>L=!c0a`gs8Dlkr;Q]tr:fsbs76-us8;fpr:.3k +I>`T0LOoGYre1<*s+Co8OHu9"Q^*8ZC.i\dDgH9rEY!,6DfSd%mUVK_>/L.5rqu$[$ig2(qV]?2 +`7=eas8N!As82T`_M4G1Ed2tVF)l;BG5c_%F`DSTI +#ljl&qoGG,gA1aH"TJH$rVtmV!rW#rrr<#t&HDb/s8)HaSuo3Mq>C9ls8W)ts8N-!rUKjrs7uQl +qsh-jI>WH*Kn')Srdt0&s+1c4Ng,ioQ'6iSBhEJ_D0TjpE;abeDK]l:<."%COK)Buqu6Wqo)AXg +rr*B,rr2rss8Clp_o1+(rVlcrrVc`shSB-.rke]Q!Q;nT_Z.IP_A0u*`4X18]oA&0`Pfa5_Sa=0 +_SX4.rPB5h^;e".ZB'X/bK%?2_SX71`Pf[n_ApJ1`PfO)aM=U0Mlb"9^;@\%p&G'jrr2lmk4&E= +rr2rqrXf,/s76-gpe[Z`;pTtqEcu6qE;sniE-#o9EbS0\Ko_OcP`q)\JV*lR'7tjhKSOr+KReo4 +LdUh7q>^Ens6BRoqu?Wg_RR(`S]^g-rVucph#@s*t~> +&H2D$lC2-bO1WHVd*9bS`5^fX+O&!L`Poa7aNMcJbe^p'<`N1_]Z/49`PKC3c-OVR`Q%Ji&Br#1 +e'6('3cg+/MMd(AKS9>Ws+LE)%t]k-Q^*l$KS*i,EboW=D#JAOD[pu/Cd_jc:P>E2UX.'-b4n*ff:oCMMB +p?_PEpuB&jaS>Juo(DPArUKmY*V&Odp%.eRo$XeJg%k:/mc)RZf?)(S`lcZA^<+Oda>1cS`Q63G +b/hT@bIl*QgH:Rb6+q82CNF<3F)uJFEGo]1EGoi>Cee`"NKfZmP`CKMKDpQ(K+`lmM1L;7K8P/+ +/CrIpb/DHBb5TTdb/VHia:5k`@nSmM6@ZYda32QGe&Vs?`kI7-8PNNgk4nuQJ,~> +!WW,trsIN:r;ZfpqYgHorSdbUrs8W%r;Q`rrqlNirs7NCmcjcNqYC$frrrDsq#:jM-qu>p[$ig2( +qV]?2`7=eas8N!*s82T`_MnmMM$Y=JZGm8G7F`qqQGlDjr +HZsUP8eD@;->%.:H[Bf4E)$$qD0u)!'QA89EcY,_Lk_(^RZrhfJ;/i6KnTGX%tTFcLkLP1KKSPqs8;osqW[tZ +r;Q^(kO\<6g&M*IrVc`qec,RGs8N5fkO%Wsrr3#us*t~> +&HDb/qq%L7cM7D/lJq/N/IY39)JqJ`/Jq\i3Pa7GrP(&+$6ud-`ErBtVE=d))EHcA3A[Z'HN,8Lnq"t*^rr2rs +rXJo,rr;utrSYZ4`7=hbrr)orrVloT_#D4Q_SO+g_u@OP_>V4`]tqh5O,9*Y`l,g4_8F71`5BLj +_DB0I_8ia9PEhQV`50C2^r442_o'=,_Sa@1]YMV(UPtM'YJe/k`P97^s8W&srr)]UnGhqUrr;oq +&HD\.s8;lkb>kI+=G'LfBm9Jorc'-#G&M>>:g&O+OI;K"NJ;q7K8"u2JV/T*KRSZ*Jp2c,lMCJZ +!W2o^rX\o+rU%2*\$MRhrr)lqr;GURs8Vimrr39&p:R,iStk'9rr7K~> +$N'YqmB'o$K>#@NrlYA``5^fX+O&!L`Poa7aND`LbJV*+EDK__\AZS1_o'I9bg";L`Q%Jis26A1 +_8t-KIRes?M2-qEJV8]/K7nr3K8,&7Q'[Z!PC/""7<3?fF`VVDEW0kgEH$#@AlDX- +s8N9$s8Ud.mf*4hrr)lsrSd_Us8Drrrr`5tqYpKo&Gk,Lj8]/VqY:'is8Mfgrr;Ke-3*o@qu-Ei +MI)0gKnP&2KnY24K7no1KRnZ2O-5rtLOaP7DffmlEY!A5E,eO(9q\@ZhtZsEs7tpY$ig2(qV]?2 +`7=eas8N!)s82T`_M +%fZM,rT'fI^%hX-rr)lsi;OJirr2rtrr)iprr2rrrq4m4YIaH,rVlisr;cirrrN-!o):!7s8;in +s8DqR>`!f[Jq/H*K7\Z*JqAQ*It!35OI28eIrmqmEbtYmrc&KgFDc&<9S?$/UJB_CqZ$Tjo)AXg +rr*B,rr2rss8Clp_o1+(rVlcrrVc`shSB-.s2+cQrk]Dd^qde'_Sa:-b/KF(PDkaG_o'=+_u@UW +`59@,rk]kia2PTKN0''fa2c-9^qn(1`P]R._84"+_SO:0V2L=uOK&5qs2PM`p&G'jrr2lmk4&E= +rr)lprX]&-r;ZflrGd^kAXYMnIVA\!s)J'X!H3)ZD^%)cJqArFOG\dGJqAW.Jq8N+K8+l-H@^m+ +7Gn.Fp](9es8MutrU'Rpr;ZfS\[JuMUA+Wcs8N#riVrlWp\t0l#lO1qSt2FHjSf)XJ,~> +&,Q2#n\AsAEP9TAbfRuI`Snol0a32K>`Q$'Ebf[oD`q%1t`Q#^0 +_TC*VFAR[?LkgV:KS4u0JqJ]-K7JH.Nff`pKRIu/DKBaqF8p7ZD\6u9EG/lFGX\!g3P!8Laj\>R +o>i&o`Q$-GaMl6Aa2Q6MaLT's]@G*Eb0%cHb0Skkg[Oh+r:L$\!:fpW&bPhto!lEL\&%\+nF,u@ +nEo]Dnbr%jlM1,=^V%J!`q9'#p@IeIoDS2$n+#l;naubPe[rE,]A!#Ro((tim+9A"aMuBL]tVV2 +n&PXO`PojFdQL#0kYcEF*2PDD/F94E,oo:E]JW)Ko_O^LkL;-JV&K(It36, +MhQq9Jqnk7^!Y-@a2PX2aND`Obf]Fr&B`;@[=V%<6UsqY^W"I?bKAebs2OrWqT92^X(+t!94Gs5 +qu?PD~> +s8N9#s8Um3j8Ju[rVuinh>[BQ"9&/pqu-O#f^.Yus8;`hrr2rtq#L?^r[.[Cs8;omp&=f!ArMY" +LP:A7KnG#2KS"f3LPCVIR?2rOMD00gFSKkeGAM>:5F5ucJ<'I)s8Moql2D(jrVcTN`Pf^Fr;HZp +rXf,,q"2FYH$+7QG'.qNG'J<3H3ee>F`VP@?6TgW!!3O;FoH\0H#mtDEd2nXH?sg`B2fEB!X&WX +Ble<:F`MYGF*;hTHMr+&F'L@(!!WE16>h$iD0_)io`+mhrr3)am.gSZs69LnrVlilr;Zc[9W>$^ +4B-0?q/R^$EcH,<2M-C9OHPTXKS4u3L4k/2KnP)0J;B2;J4[9Hq>^?js69LkrVuo]mIgA=k5YJU +rr2rVrr;orrr)lsrqu]orrh?Clg*a5s8W(K~> +%fZM-r:@(bY4;Dhrr)lsh>S&err)fprVlirs8Di^SZ9*[rVZZp!r`&qr;Z?e-NEuCrr;ojs8->; +M2-P3J:W?*JUrE)J:NB.KSGPSNdcP8/ot`IqJ[$dE-,i9D*=+mX*fp's8W)qs760gs8N!,s8N#t +rr;rT`P]XErVc`p!<)lr!T(Wk_uIUR_ZRcn_SZ;f:r1#d`5Tj8Q&greQ]fD,_nj.+`l?'<_SEq% +^r"72^lOD>Q&;-Tahkj0_oTg8_ns7+_SX(*ahk'=MNj6cXM_uj^;Rk\s8W&srr)]UnGhqUrVuco +s8P(Sr;Z`Z8uJOR3)OF1E,T]7EH,r:EH,o9D)?cjM2m[UKnG#0JV&N*JqSf0It!-1Isjbop\Fje +rVulr!<)or!<;Qf$2skL]!Sf@]Cu4%rrE#Vrr<#srr;rsrqud%qr+BCSt)eKrr2qJ~> +&,H,$o@84j@^X8$bK%`Ha5P,>aoKN]`Y-A7bfn2M`PATQqh7HW,Qb%b/hZGdE;(% +,0%UAbfn/IaN2E@bL4JB^Uh&-bJq]Ia2uKMgsXsHoCMVHrq$0[!:TmVrppirrq=4>]Y25!p$qP? +oCVP>mI0T8rUUQsna='#`lc'>p%\.LoCDYTnc/&"mI0N5o_S.0]Xbnl^u5%`n*/lYm+9A"aMuBL +]tVV2n&PXO`Poj +s8N9#s8V$:hYmHVrVlcmhZ!HQ&H;V*q>^?ls4cf#pAb*er;Q]q!rMfknGXg5s8W&qs8Viglq)k] +M2$h;KSG/5KnY27KRni/JrG_IIt9RtF)u?sEXm&0E`7BSWMiG]qYg?krTO4gs8Domi5NXQeboCG +rr*H.qtTg#LO"#`F`qnMG'J<2H3eb1LdEI!Mmo`+mhrr3)am.gSZs69LnrVu`os8DroOF*[I +N$`C_q/Rj(E,p&;6u[p3KS>)3KS>)7LkUJ7L4t56KSP&5:VZf*s8Dups8)c[rX\u-s5WS?qV_;O +s8;]js8V*X"T8/or;QWo!<2uqs8N&u#3P7:l0nZNrr.E~> +%fHA+rqj1"V!7UPrr)irh#@1-krr)cnr;ZBf.0'2Es8Muss7uKX8V;JG +JV/H(KS"f.K7\c.ItN9%MN!@>Il;.`EGt_n&92Z+EH5$)6)CDKo_eaerr)Bdrr;us%KHG,s8N&s +i5NUPec#IGrW)oqrs%>q_o'F1_Z%IQ_Z%A*^r""-`lH)eNKBa5`PTR2_Z%@l_ns:/`NYJbP`C`dWkHBk`5KLbs8W&srr)]UnGhqUr;Z`p5Q1WZ +s8W&sr/Z,oG).>WDfBW6E,fl:DfK]7Ebe!ZKmnW+Jq8Q-K7ei0JqJc2JqS`1IYLV2qu$Kns8;oo +s82fqs7-(!s8;f6]<\W5h"UjKrr;rqir8oVrr2oq!<2uts8E<#c_@/*S[\Iorr7K~> +&,?&#p#Cm6>-,Q\aN)BDa5P,>aoKN^`rF*kb08)Mb/20/?!(6Z^;\"0aSj6`aMl-iE$_T0U3 +_oU6HdE=1_Fb5=(JqJc0K7no1KnFo/JUr`=M10t6E--2BF*%;"&T;Z2FD+-`4Jnc-d)sDKaN;Tq +a)0 +JV/Z0LP:D,H9A(XbfduF_T'I7b5TTeb/hTBo#M<`d))V\5r_G,PIJZU`lS/%ilM/>rQ+cV#ekmd +;c6MBjno&WJ,~> +s8NQ,s8ViHj8&`Trr;orrSd_Wr;Q]nrrE&sr;Za&s75"1lMpn\q>UBn!rVrnl2CtdrV,hQKS5/: +nUq-tL4_F%G&DL!EY!/1Fusl&UM["#s7u]nrr;6^$ig2(qV]?2`7=eas8N!.s82T`_Mrr2p"kj8*Drr;!W$N0WfX/\X6;0?o"rc.sY#]Xd/D0'neE/"+@ +s+^E(#DIb`K5tZ!r8IV[qu?TRn+ZP/rr3-#qu-Qpir0)Yqtp +$iU)(s7k*6Vq:_CrVlfsrSd_Us8N#trVlcss8Mus"o?'-ZbZ>7rr`9!rVl`poD\[frVd$$q=-t- +JV3HD#ChGZ2J[DNFSTkdDfBbXF+^*#W:Kubs8Drso)AXgrr*B,rr2rss8Clp_o1+(rVlcrrVca( +hS@%H`5BL0_ns=.rkT)^_8FC4bE\0LOctoiNlM%7/]5TKahbs:]Y2)$\sSGBP`q>hRE3@b_nj:0 +^W=.)`kT@.`PnsBP*_;iNf0n9`!s]'_=dj.rVlfpqW@;Imf*.ar;QTn)#j4tW2;n':2t5kDfBZ8 +E,KN;CiX\aDhIt>rdt`5JV&K+K7\]-JV&GkBD2<'rr2rnrr<#grX\o+jh8=8Wg`_]rr2rtrr(jU +rVllsrV[6*qu?Tns8Vi,US46R`Vf]7J,~> +&,Q2'qW4e]?CJaO`Q?3Da5P,>b5]Q_`rF-[aqi4DaMu66ISs<`\]M_+aNDZHb/hQ@`q.7``l5p: +`lQ +^Tb>c`QZ0=oCMMEnFH&5o]tr;m-X?9p"?me_SX()^Z#%_oC1edm+9A"aMuBL]tVV2n&PXO`P]^8 +rQ5,]qo1G:f/'+s5B086F`qeCCMe3:E-Z2;F?XPpKnkG;K7A?"K8"r1JUrH+KR\Dm>YEMmbfIm) +`WF6(b5TTeb/hTBo#MEcahrp-4[)J2ZG=K$`lZEHb2UMB`rF-YapuV8c,[oIb.):`:JtMam/?s7~> +s8N<%s8W#MhsgXF!WDrRrW2rrr;Qitr;?Qns8;os#Lr#&s8W&nrr2rtr9!t^qteT+LkG2M#D[hF +6$%$gD>A2_F)XI8;l?9io)Jahs8;ool2D(jrVcTN`Pf^Fr;HZprYkh6q"2FYH$+1NF`qqQG^4UX +H$44EBOiD!!rW*3!Y8pcG'8"LEH5uFD/t/IF&rr2p"kj8*Drr;!Ws83)%B;^])5]cpFs)SNfEH68;Ecu.tA:=9,s+^E(#D7_bL +I'esrSd_br;ZNWmITl0s8)cqqu$Hnj8K/YqtpBirrVuprr)j(m-EltjT#8Xr;Q_H~> +%K-5)s8:cHUWE3/rr<#UrW)utrr;rsrr<#trr +%/Kf#qsD()>Dg,5`l[)Ys2tA_s2P)[r6#&\&](2==Ce_N_SsU=aN2NF`Pojga99N%`Q64$bl>`h +a31D2H%(I$o7I="JpV)nE,]o:rH%pW&9MhMO%Z+26Hmp$aO//N_T)2g*lc1=bfn/IaN2E@bL4JB +^Uh&-bJq]Ia2uKMgsXsHrq$0[!:TmR<9`oCoCVbN_ns.!]u.e,^\70cn+6/>mcjB.o)/(SjLqt5 +_nNn,`5hK>nac,;n+5c6mI0i)_"Nng*`PqAg&&ku$8NK%.@_'FsaN2KGb2LGA`rF-YapuY8bfIrHagbbN9NG`*nbrK<~> +s8N<#rr<#RhraqGEd)_EDGqDRqZ%rK/Sf?KH$=IUGBS=ZEcZA11_9Wf +!!!-*!t.G4F*;bUNR[V#rVlfr"6f+Hrr2rWrYYS*r`>Yh;*f/AEH-&@EH-)FE--8E5"C\0LA6E+ +K7Zb4q>^0_rqlWarr2p*m-X01irB&Prr;lmrr;$X"8r&nrql]rq#1-j$K^X;k2ZLAr;?QoJ,~> +!W)fprrqkiU:0aorr2uri;Nr\rr2lprr2os'`S(0rr;rkT<,N2U""s8McmrV6BloD\ahrr*B,rr2rss8Clp_o1+( +rVlcrrVca!hS@%H`;@IP_@af&_og!@RYm2hP*;#gNf1oprPUk<`l>d4a1fX-O,B*eQ&q)jNg[u- +_o'=/_o0I2`4j48_l/ZTPa%>nNfT1"`5BL2_SPpFs8DrrrVG[Gs6]gas8)`mru:Y2 +&,?,'rU\BS?Z`]na2l?A`n&60aq2J$=&iIp[)U5/aMu6Bb/VHla:QA1`QHHOccjJL^r=Mh>^qS# +K*m0YJ6YQ]Ciji?EW'tYE=cu)1ff=&9;^.X_9C0Dahu-ia<8LA`luZJ`Q6-@`QQ]N\\G_fe]YtT +b/_WHceQt'nFQ8NnQG>Jlg*s-mIL)Gq9-Ca]t;"t_o0@anF,i;oC),9lh1&Er9V,(\%TMi_oBO5 +oC;A?mdBK1n+$#@HrQ%%BaN2B@`PopA +ha*9m8NLX.Ec>u8DKL,KDf9N-1-LDDK8##3JU`6)LP:A3It<0'IWdWDd*KGIb0'S)"j4p-`l5pf +a9or(Z~> +s8W,rs8NDehr"J6r;$3es5EqXr;QZp"8r&nr;Q^/rqZToi829O=ZSEVT;(rr;rms8;-\$ig2(qV]?2`7=eas8N!'s82T`_MpU-kr;[!%!X03LEr9tcFE;\KEbS;b"U,#-!%7pL"tOJ/Fa81TG&qtPGB.J-3=#Zk +"98E*!!!9iCNXlIIuVtMs8Drrrr_KOq#:9mir0ems7OlCUR"\]FE)8?EcH,AEccJKA5,75q1e]u +s+U\p>ke0os7cNir:9jdrsRoXo'b'-s7ZHlqtpBmir8uU!<2rs"TJAprVlcq$K^[@j6$CArVZZp +J,~> +!WE#srrr>.UoEeZrr2usi;No[rr2lprr)j,rr)fps8Mc'V68&7s8N#ss6fmcrrE&tr<`K's8Dur +p,R\Qnq-mo#(KB0E-6#9q/?mcC.VX+LMutarVlipq>^EnoD\ahrr*B,rr2rss8Clp_o1+(rVlcr +rVca!hS@%H`;@Fc_SaC0`Q-#cMiNsbPa.AjN/P]nr5:_;_Sj7-_mbYbPaISmP*M2jR`NIc_ns@1 +^rO4-_ns9gMiX-gO-,N_OcQQ^_ns=-_=dj.rVlfpqW@;ImJd(aq#:6l)#)Q]Tp&,PEc5l9EGof: +D/XH:@S8h,K7a)Rqh"`u#_[nI>PJ-qs8W)trr)iqqu?3cs8387\\#>=nGWCdrVuoTrr<#urr2j, +rr;rss8MlhgnUL5TX4:hrr2utJ,~> +&,Z>*rq>?)@UlIRaND]E`n8?4`r='Zaq2S(FAl@nZ-(20`l5s?bfIfpa:QA1`lu]RccjDH^;nII +,^On0K*m0YG=FK+EGKN5EW'tYE=d2*6r]\$JbYnaPSbm+9A"aMuBL]tVV2m`>@HrQ,#]rl?)! +`Q$?P[R$.<8m6:TD/X?3F*D\HEG\`?0Pu8ire2,?JV/`5Kn4`'JUrN-@Rntp_og!Abfp(2s3(Pe +aN4>"o#M6Y];\Li4\/)I^raaAh8oW9s2b/]&'W#5`Q#d2SlJBV>(kZ&rr2qJ~> +s8NQ,qu-Q_gu8;5qY9scs5EqXr;QZp"8hoir;HX*qu$KnfC8&)s8N#qq>'ses760hr;HWors&2o>Vs8N#srrDu]rX8c)rVGHk`5L4(rVulr$NL"uoYQB/ +F`V_Lr-/KjE-5r%+qP+`qu@c="VG?dF)uJIG'A%NF_at`"T\T,"9JZ*!!k)hDfbo%*d2jKFE)D2 +/.`!d!!*0%!!WE-5&5:dH$t\%o`+mhrr3)am.gSZs5O"cr;-6YG*&V58p#)nrGi0bEHlPH9:]:5 +q1e]u$&+$pB_VE(p&G'frqlWarr +$N0o&s8W)9U8-WArr2usi;No[rr)cnrVca+rr)cns8VuRS?KNqr;?QnrrE&trUKmes8W&urVld% +s8)cqoR:8'KCa[#K8+Y>?2oAXs8N#srrN&toD\ahrr*B,rr2rss8Clp_o1+( +rVlcrrVca#hS@%H`5BLl_@si(_nO43_NB\6Mj'EjP`Lc`NQ1t95Jt@U`59F/^q,)VOc5KcNg5fi +OI=2/`5KO2`5fR,_99]^LlRUXNg#N_P`q62`P]O0_SPpFs8DrrrVG[Gs6K[_s8)`os8W$(nop.j +@7>6WE,kkr%<63*DfJ@<=a5RNJq8LMK)L<-Jq/A1Ab>j!p\4[as7-'tqW58u^9"L2rVuoss8V!U +s8W,us8;rsrVmE+rr)N1US"6N_tj91s8W(K~> +s8S$aMYp7bg"<"a:QA4bfn>UaMu04 +aj\[P=b;4rK*m0YD`Up$Dej30EVjegFA4l`QpSU5b0%fLccsJF`q.7q`l5sAbfIcEaN)9Cd`Au6 +]"?M9`lcHEai_rbdbF9_oC;AMmoSoFn*^&LprL7i_8F+(^Vdt-_=mBen+6/>nF6)Fp[Yc/_nO+- +_8aC-^rlHEoCD89lga<3pAas7]thP$_oK^3`kK+Aq=O4Hj3R)DaiDKBb0[i9ai`tkrPnlYrlY8^ +rPff"b#j(_@S(QXCi=<5F*)GHChPqi8o&g(K8#$YK+j#oK7SN%JV/W*0iZ]Ia10.1b0'_-s2tA_ +rPnBK$,Np*8j>d3@(4)Qb1ar8b5]Nla2>j6]STW^9j+(OpAFpiJ,~> +s8NT-qu$Kig#`86q"FUas8V*X!W;rrrri>sq"Xabs8VurrrU^;k5G;^r:p'brVuHfs8;ips8N?# +s7Z-clTp*lKEm3S;8#/6Ed@J$%sUQcYBklsrVZQfqZ$Tns69Ljs8Domi5NXQeboCGrr*9)qtTg# +LO"#bG'F)uACF)c>GEc+2# +VG?rAq1Js+LIniKs82fqq>U9ho)A[h$0LjQo[Ws@s7uQkr;ZfUrW2rrrVm'#qtKsbrVlg#i8j1i +hu!EQs8E#uJ,~> +!W;rrrrrDNTqTX(rVllriVj#\rr)cnrr)j!rr)cnrr35pR]UBuq"k$jqu?]frr2rsrXJo,rr;utrSYZ4`7=hb +rr)orrVloT_#D4P_Sc8f&BD]-O*Q>:OHG]iOcGH`NlV.;rke]Q3l\tNG'o@1N/rsYP`_#iR`NIc +`59I1`PTL5_k)1%Mi`gTP`UcfPEDrc_SO1-_=dj.rVlfpqW@;IlMge_q#:6l(Zn/cU-iU3EcQ,= +EGof9DJMJnV+cPpK)C3!K)L<-Jq/JAYkJ(os7lTis7-'os2_p^[@c1JrqufRrW)utrr;osrr)j- +rVlfe\"]IcT\'&>rr<#tJ,~> +&H2Y.s82,`Ala>maihrK`5^`VrQ5/^`r3jh`lQBH`j8KE?_#']`kfL1bg";uaSsnFc\RqQ[KM`5Ka8_oKU- +_T_lMo^_G +s8NK*qu$Koi9Bb2q"+=\s5O"Yr;Q]q"TJ2jq"t$i#Q4Dqs6Jb0oD\alqtKj^rVuHfs8;ips8W,s +"TSJpCM*$g#$m#T6?$j]q/QdC8Z8FXqYL0jrr2p!rVQWZrX8c)rVGHk`5L4(rVulr$30ntoYQB/ +F`hm*GQi85F(?[1rW)ouqu@07@W6C3G^4U^GApas"TAE$"oJ?6#:aA(EcuSLF`DbIB0H_)!!!'* +qZ%$05](XgG'o;!o`+mhrr3)am.gSZs5O"pr;ZWgp5XNpHVn9nF)c8BEHc;EC.J'i6huK4KEm*b +M(u(,s8)]oqu6Kjo)A[h"Q/bDnCdg@#5nAqr;Q`rhu +!W;oqrrr;`WM$ZprVllriVj#\rr)cnrr)j,rquZkrr<#lZCeGKp\b$hrrW,qqsj[crrE&rs8Vs# +s8;P(A:]C)JdI'_?AJ)Wcai)-8_Z%A5^;%7,I!L6qO,o6YOHPcfRE3Cd`59I2 +^WXI,TR(s7I#3oGOctoiP`Vuc_nsC1_=dj.rVlfpqW@;IlMgb^q>UBn)#a8jH(B+T@W?F,EH,o; +BldrWp[LS'K7a#Ps+:3%s+1N)K7bbRp](*iqu6Bjnbrpn^UghSU\Fcdrr<#Qrr)fmrsJ`$lDgPL +S>tiOrr2otrdX~> +rr*B,qru(>;e):ar/:?`P]U4`lQBH`jfe]>(OZ@`kT:+c-OVVn]29aaN2B@`P]U1 +`R35f<*+Bso7I3rGYibN3rWjpDfP\r%s;#GTT_"Zc-+/Ib0A8S`::ni`l5sAbfIcEaN)9Cd`Au6 +]"?M9`lcHEai_rbdbF9hoD\8\oCVkO`jiFgaj%c?]tM>&`P;-9n*fl>n+-,Fo!Q!;_8OXDa2Gp6 +_S=Cnq"F@Jmd9E>q"W[U]"P\mai23<`4s!sg\(1.nDhj]f?)(S`lcZA^<+Oca9g#1aMu6=`lQCiFE:Ec?8?E*P6Zgb*euJVAmXKbB#hIsum"KnP;8+cO^g^;Iq0`r='Z +`rF$X`WF6(b4 +!WW/ur;Zd$kNh@3rUosbs5O"Yr;Q]q"T8)jq>C3k%fH5#s8Us@jo>>[r;$-crVuHfs8;iprr<#s +"T.jeK8&iK#Cf5+pLRQMF89he:3s'YVY^5fs82fnqZ$Tnl2D(jrVcTN`Pf^Fr;HZprY>J1q"2FY +H$+7SH$FLUF)l24/e/$crW)s%!!<*!%0p9XEclVPH?jI8'*&78!!33(!WE'5"Xn#$F*W"SF`VD7 +57n&!!!*'%"T/6.#=*-KG]nCmeF`e>rr2p"kj8*Drr:sV)#F7/s78saV`e+"F)Z/AEH-8B@;#0, +oS<:-j +"P;c&kO8BLs82lsJ,~> +$N9o%s8Vul[@aAmrVllriVilXrr2lorr`8ur;HWp#5QoAZ+Ki,rVllsrquB4c[E">N_X(nL.rr2rqrquWms82Bdrr;us%KHG,s8N&si5NUPec#IGrW)oq +rrLulrkecR_>_=O_c4RlNd,_pJV&K5Nf]?bP*:pJ`l5m5_8*t)\p\XOIPnC!rr;usoDejh!<2utq>LW\_6LSQYP%nns8W&ss5EtT +rVQTrqt&kIU'.!op&4gfrrE%K~> +&HD_-s8DEAJl,O\ccaJN`Q$oYr6#&\!64uV'#r#8b/q>_;HRYK`l#R-`m)iPm)TUT`P]U7ajAYn +4*>n$o7IC"EAQ&&<_mROEH1qu&TMkfH)+JqdEKYO_og'?c-+)sa<8LA`luZJ`Q6-@`QQ]N\\G_f +e]YtTb/_WHceQt'nFQ8Nnc/2^o_A=]bI4pq`5TU6`5'7.`P]=]nF,i;oC;JKos_0B^q.S,bKe2J +_nj(4qtfsWmdT];pA*IS]>;A#]Z&"3`lPm-]%ZiKnaPSbm+9A"aMuBL]tVV2m`>FNs2b2Zs2Y2_ +rlkDb)p#k7`7!-tU80\FC2e06EH#rCBMqXUgY@"%KD^K+KnFsUIgq$cNIc^n7FfT'`P][6rPniU +!QN4[b5]Nbb/hTBrQ,#Y'ZeG<\qj +s8NK)rql`ql0IO1s8;fos5^KAmd'`Krr3&trVu3_r;Quur;KcBKnB,R ++,59!JqJK/Ir/urpk)IaEHH)@E-?5@<(sEdrr2p"kj8*Drr:sV+8c*rq#:3jrs\o,s7PUJq:GZHqtKjarrW2tqr.PQs8N!!r;$9h +rs\;UlfdI%s8Dlmr;Q_H~> +!ri5trr32u_kNpcrr2osg]%0Or;I!%rquAUXgdHirr30"s8W&ss7?6hs8W'!rVlfr#5e8q<-EkE +q19oIIt`K,I>WJfC&%IV;/gGoCiaK9DfAWFVjgWXr;Z]ps8N#rrUBgcs8N!,s8N#trr;rT`P]XE +rVc`p!<)lr!T(Wk_csmn_S=(7_Sq:YG^4aeI=@!2OHPchPEa1_8=:3S9K+&GC"O]IYa)MP)trkY/J5o_oBOcs8W&srr)]UnGh>D*rH!;qYdX.V1_0R +F)H);Ec?)9<."H@_a]-.J:36%rdt'#$A*qZJ:g&Kp](6lnc&[gqu-Kn%K$2%rr2rpe@3-*Ra^m- +rr`8ur;HWpir8rUrVlfr$iKeuqSB#'SY +s8O_T)2grl,Gjbfn/G_oTmGhEbn' +I=qBM-&-o%J:i9/HsTe'e7CdYE-6)BEHuSB;+mgK4O;3m_SsO;bfn6!aF2(I`luZJ`Q6-@`QQ]N +\\G_fe]YtTb/_WHceQt'nFQ29mI0NCrl?h7 +ccF)TP#S*,6Z@$]Eboc=G%jBMdG(HXIuB2:NJ*.DK7SN%JVAl;KS4_)aj&)M`W!mV`W!mWaSs=) +`lQBH`P]d>b/;38bKS,5CHasT6&iM!`P][;dEfeJ`oG,Cb08#J`r=$h`l#a8a2Yc<<_l=iNp-E= +s*t~> +s8NT-rr)lsoAo$$s8N&ss8UOH#5nN$jQG[qr;Zfp!W2i_rr)j%q#C*?5DY#Fq1Ki@Mh?P3M1("2 +g&L]3:iUMtF),r?DK&.0Wa*mFrqZTmrr)l]rX8c)rVGHk`5L4(rVulr'*%k(oYQB/F`r4XH$jXD +?m?*aq#CBqrW!B.%VKHmH#@eD>7U]7"82^+""7o&Ed`=XFCd?@"pY,.!VcX'"?UOHH?OIjeF`e> +rr2p"kj8*Drr:sVs8O,:s8DRuT;PXsG&V;:FE2/=A:"%GrB,+MM2?b9JGY$"K*Ha^Jr4;eqtpEk +rquZqqtU'frr`8qp\t0l%K?>+r93\BmFVCC6lJ,~> +%fQG+s8N&se"<5Wr;-Hjd/FUVr:dXqWn7:MrVZWns8W)uoD\ah!<2ur$3'u#s7k/.KnP$QJf]K$ +K7JQ1I=a'$s7MgVE,]i;Bln?2Db#b_=jHjCqYpNprr;rdrr2rsrXJo,rr;utrSYZ4`7=hbrr)or +rVloT_#D5U`P9:4aMPlVIX63aH[0mbIY[HQ*W5s8nm@l]:LA6aDJsW9 +BlIO-q=j_DC3YDbIY3.LK)L<0JpN6$LM(c,s8Drro)AdgqYgBm%K6>(r;6N]^q@4aT^;UUrr`8t +r;Q]qiVrlU!ri6!rVm6'r;HN!U7\$MdJWnAJ,~> +&Gl;&s8Vu`XAhlWcH=>I_oC-G&B;]*H"^;7b&_SX4i +`@f!?bPUr!naQ&DqU`?m`l?*F`PB=,`lH'8\[U,ap@Ie3cg99*a2l9Cd(R08b2:8tb08#Gc-4C& +OJ5Z]F)5Q/G'.V<;cq;df-Y0\Mhlq@Knk;5JU`6)LOkM;Jll:0d`TPKa2e+trQ$2*aMu6Db/;-< +b0%`D_op- +!r`/trr2rt!pAY&rr3#rs3^iFrsShXlfA*GrVuooqYfUV"o\=AC41m3KH>MoM1^D4F^4eCrJFBp +DJsZDBle6*=KRX"nc/Ldp\Xsis69Ljs8Domi5NXQeboCGrr*c7qtTg#LO"#bH?jdUBkJq'#R(;4 +!<<*&qZ%oC%V9j5H#dY,$NgD9!rrB)!!*'"!<`N*"!_>oH[g6ZAMXbr"nhp+!< +!rW)srr3?)k,4i_qtU3fs8URIs8NK'r7[R?_"dp,r;QWms76-hs8;lqrs&DuFD,uTKDpK%KDpHE +H@^j&JV%rHp](5N:3LGjF*M>;DIlnJMeV\\rr;cnli-n`rr*B,rr2rss8Clp_o1+(rVlcrrVc`s +hSB*->/J1o^Vl1SG^"F\H['jbG'\^rNffKa_8+(+^V@L(EclkZG^b'dH$FXdMij0^QGp_]`k]O1 +S:,L+G^+X^I!^-cJV]>MQBnGg]=u>)_=dj.rVlfpqW@;Ih>SMnr;ZfmrQS3gk +r;ZN<6@F]BIYigYK)UE&Jd@*`IXui*oD/@arW)urrqZQqqtg9jrso&.s8MuqrntH%[&:V3qYpKs +rr)fprr:pU!<)lqrr3E+s8);`TUhdQl21M[rVqB~> +&GZ/$s8Vrc`*cGia2Hp4gALF-o&S-`f?)(S`lcZA^<+ORaT'@: +bfSG@5bX?1D/F67EHcS@@GB5Zd(22^Ljsf4N/*% +!ri5urr2rt!q>@+rr2updJj1G"o\K$eFVSsrrrE%q>('hl2Cqfo@Q9[NJ)lYKHGu&Kn=u1Kf\r" +qY$"HEH?5>EI)YC7%U5Siq`KDrVucos8V?_$ig2(qV]?2`7=eas8N!0s82T`_Mrr2p"kj8*Drr:sVs8O,:s8N&lHA/P0@rld/FE2AB>#4ejr;WBkK7eo4IJJO& +Jprr9LMK9LrVu]mr;6Wnq>C6l"oeDpq>U +&,lP,rr;uroX(ErnbE.]s3^fUs7lW`S$]EZrr2iqrr2r`rr)j&o%-!SM1^;0K)C6EJqS],J:`E. +3VDt@pQ83iEH5l6G]7IdSY8p=q>L'es8VEarr;us%KHG,s8N&si5NUPec#IGrW)oqrrLulrPMgU +`5KNJFF87VH$js`G^=X[I"m`JP)7#q]>)1dGBSCZFa&.XGBnIWG'\h"O,]IKaM>@,`0bakI=HEc +IW^'dH?jpiLl[UUWQ)`i`koRbs8W&srr)]UnGh;C*rl-;rVcD6KrC9lrVqB~> +%f-##rr;ogeok55[_g8*dE)@-%_fuj=D(Zn\]2b9aMu?@nAmf9bfn/I_o'^<\LVr[JUiH.JU`,t +JVB#>MhQe1GU1nbc-()hDK^5BE-ZMC6(!s'a48JN`6?6Bb08#L`l@SjIE'7Gbfn/IaN2E@bL4JB +^Uh&-bJq]Ia2uKMgsXsHoC;;=o_81![(X&b_8F4+^Vn15`lQ`PTI.`PoO%h#-d6n_qg\f?)(S`lcZA^<+ORa<\pIbK\Pf +@&Zrl-,#`l?0B`Pp!D +a2l3>aMY&q76*e"Qb:2X_nj@8ccsJI`o>)>b5]K[a:-,-a2u)e +"TJH"rVlfr#k[!-s8W)nq>A_@s8NT-s8VHFm.:8WrVcNds8D-["\Xi(L4P3WKHGqsJVer38C%88 +r:2RDF)Q/ADf'Q-D6A;FqZ$Hmr;>OQ$ig2(qV]?2`7=eas8N!1s82T`_Mp=B6C!;c]prqt^R!rVrnrr3`4r;6Eip](9] +kj7]umJm4bs8W#prdX~> +s8W,t%0-;)qSAl%ht[0Ks8UOH$N9l%qR`N+`q]T4rVllqmJd%`0E+P"H@g[&JqAW-KS4u0K6i!% +J;$VAs8W)i0i`40EcGr3EF`jeHAVLurVuips8;lrs760gs8N!,s8N#trr;rT`P]XErVc`p!<)lr +,i6>S_o0F/ai/XHHusRWG^=[]H$FUYH%:^3OGgfd^;74$H[Ym<3.67"G("X\H$XpmN/j:F_oKg. +Sp5[0H$jsbH@:-fH?jd`J;'5EXhhur`50:_s8W&srr)]UnGh;C+ohK?qZ$6L8$ALPDffu9DKKi9 +7aUr1q"KGIL4k87JUrFPKE$N0JVSQ.K76&[r;HHjq>^Km!r`,trr3Z1s8;cY^Uq%]SFZUXs8Doq +s8N#ss5X+Xs8Mrsrqud(rqOL0St2Urr;HQmrVqB~> +%f6)$s8W)kif%2NS%Ze[dDum=`PBO.J6Z,jZH()3a2Q9Bn]3r;bfn5L_nj79fJ7o"K78W1Kn4]# +I"-j-K85D5Gr2bXe'5oJ89/cqFDbo:B5FM\E7iaccbmZ?aND`LaMu6ja=YEN`luZJ`Q6-@`QQ]N +\\G_fe]YtTb/_WHceQt'nFQ;Ep](9(YJ7Za_SjF4rkpV7`l#[2_nNYMp%J7Q\A,qt_8=14^qe%2 +`59=(^r*t*mdU&Po\@!n^r+14_nj70`l>pq^_OW)]&35Tp$^kcm+9A"aMuBL]tVV2h8h=m`llNS +cc%Z6R724CFDu5BDdtB#bgFhhBL[#cJV])8K7SN%K7ei7H\?QW,Lk#\b5KQ`b5]N_`rc-42H`o>&Bb/hTBaSs?^`s]i)]n'6V86_PDo_SLcJ,~> +s8N0"rVlfr#l<63q>^Kkp\`M>&HDb0q#CBW`7JG=d=IZ/o4>3u7b +rV4o0E,9l=DgHJH3MNHJo(`.Yq#1-LrX8c)rVGHk`5L4(rVulr)ZT^0oYQB/F`D5:>S7DU"U,)4 +!s&K-"U##4r;]%g)f0bA;\'6 +s8NK+rVuloqTkk1anYc4s3glRr;ZfqkE3$Ukl:Y\rrDuarr)jMqtNU+L4G&/JqAW-KS+o/JU<9+ +KO"!Gr;HKC6>gO_CMe<:E]9Yf:%J,Zr;6Klqu6Wqo)AXgrr*B,rr2rss8Clp_o1+(rVlcrrVca- +hS@%H`5^'7G&r%QGC"OZH2`.aH?XU\H[^[.O2A`OWH!96F`i(XI"$BgH?OLYH$OdkMNu<'`4hFQ +H@1-aG'\@SI!Bp]G^"@TH%q0W_Sa7,`kh?Js8DrrrVG[Gs4mSoqu?]kqZ$SYD6%\^C2S03Dfoh_ +[JBk#s7oYWF+sUEs+:9's+1Q*Lk0u1J33W*rV?HhrrE&rr;ciqrso#(g:Ou+UV6O's8W#prr)lU +rr2p"rVZTlqu7#oZ)*q[UYPeHq>U?mJ,~> +s8)fqrr3<"kG;cpJ%=eu!`Pom:`Pf[3_7mIk]tX15r8Olk_Rd@s^qmt)_SX"$ +^q@1e^:h;Pp%\4+Y.VQf^V@\"\A,bo^V@In\[T2`hXg@.mHDm_f?)(S`lcZA^<+OSacHaMT +f[k1IU2XOZF*M\DFCHkgd*p:jd5)nPI=hHP%tfFaK7e]4JpDic-JQhfb5BK`b5]N_`r +s8N0"rVc]p#MeA,s8W&lqpGBOs7cHkg%"\+s8M`fp\t3Zrr;m#qYip2Ne)cVKH?&/G]-!Cp\k-f +s3NiSE,]oCBQ%"$[qDW5s8Muss5 +rr;us#Q4G\WhZrjrVliFrX&Q's8DnoVQJ5Br;Qcpmf*.a$2j`hG_pp#K7\^QK,oPuL3.6!U&"`g +qZ"o'G]%ASnI'[C]pAb-jrr;lps8VZhrr;us%KHG,s8N&si5NUPec#IGrW)oqrsdi#_o'F5 +VL*`3FFn^]rceBe!dAm7rd$/CI>*Eg`h.I&Ed`RdI`4s.(p&G'jrr2lmk4&E-rrr;6Nms76-b:na[MEHH&:Ec61mWVcPi +rr)lb:O@]mJHCFUKDgB-JVSZ.7IC$OrV6Bjs8N#trVucqrVca+r:J1E]X=3hrVZNlr;?Nms5 +s82cp$Ms,/F]i:Y_9C-Gd`;s1`6--jaT'Hqb/V94^;J4P2Kb"2IY!3,Jc:-C +JV/i8EFUYRda?4Qe#F^6EHHGMASP.gYZZb(e',kSa2Z4!ao]Z(`U_(u`l5sAbfIcEaN)9Cd`Au6 +]"?M9`lcHEai_rbdbF9_pAX!Y](kd]"5Vc\\#Mb +\$icS\+9+3\@ATP\&61u]XkP\]">Ve]=GDYZGY&bp@%;+cg99*a2l9Cd(R08b2:8_`lQ' +"TSH"rqlZo#N"P(s8W&kqpPKDr!WAss8([Lm/R+Yq=agfm/I%_#6+6\JU`?.pk0`?Lh:Dnq>1!c +s7WrjEHZ;BDfTqfWgd#^s82iprVufSrX8c)rVGHk`5L4(rVulr&c_b'oYQB/F`D+f6:+.-3^>k- +56!eG5".Ur3^,ko2)Jr\<_uRf8k;QJ8lAP\<)HCb91qlK8P;*IDe2jQ=&Vpj:Jt.m<`N:';,'b^ +>Zjm$0Ond=H\%:.o`+mhrr3)am.gSZs5Er!qu?Wnr;Q`lql+G2KiDo3E--&=:i5t*rql`frU:3ll1+?9d/X.ErVQTorqlfrs5O"Zr;$6grsel$s7uQls5`M9 +lfA*DrVlruqu2*~> +%KHG-s8;lpr;*aoV<7XRs3goGrs&>se<[2LpAY*lrW)obrql^"o07YOJqepSJfo\oKk+oiqu-No +s7j)kDKK`8D/jVbWgHcXs82iqrr;rprr2rgrr2rsrXJo,rr;utrSYZ4`7=hbrr)orrVm>`^r+(/ +_l09&VPBf]V#I4gU_fc!U84W\S\MkGZF%'GYdCgB[^*!AZa0S;0=.sgYb&AF\>HU@]"5D\[^ +!W2]krsJ_rj+^Z7T=i=ib0e<1`sTW#Q:kCsWkld!_sb\Haq)S4_8!b(e(6C)Jqo#/K8'5U+G"if +=&d`"d)j/Ga-JGoGBA"IDf.\3O[@@BaihZBai+/#"3AL%`U_)!`l5sAbfIcEaN)9Cd`Au6]"?M9 +`lcHEai_rbdbF9_o_74qgZ%/Jk2u[+s5kckinrSIhVmACc118aj6H.(n*of6o'bi5nF#c5md09) +k0N2cmbI0uo`"P-o^VJ@m-jK6n*oi:nF6"ko^MG>hp:Z@aiDKBb0[i9ai`M^,K@UCbKS/Rcc==b +>+U=GDK^#@D/2F;e'Q7S`k^'N2-PQbKDpE&K8';X$%d\TFZ7Uba2l@"b5]Q]`Z*(A`Pp!Ecd0eT +begTF5qt&^:qF]laMPp9b08V]'un>;b0A2Z_o&pD +s8Mlps5jLKrr;rmr6tZFr!`8ts8DuUo'HDQrV63fs7-(@s8MoqqY^6cp.KmiJq8]/KRno2Lk(>; +@Y"=NrVQNhs7ol8Cj'o=F_XU;V-q6prX8c)rVGHk`5L4(rVulr&-)P%oYQB/F`VPBE,]]3D>e8L +D&$r*EFs<8D/`uuE,fc2Ci464D/4$.rc/0^G%GN.AH$rVHHkrr)Y:BodjtM1L;3 +Jr+o.Knt:Eq#:L?k +s6K"@mcO9DpAFpi!ri,sJ,~> +rVuos$N9o"_PaqH]C2IkfEW^8e +oD\[f)#a5OArD+eLk(&-J;8K&JV8G8p](9mrquNis8Dut"9&/prVca0q9?RZ[%ke>rVQWprr2lp +s8W)sir8rW(&e(.rVuors8N&-U7\!MbPqP@s8;lqs*t~> +s82`o$23bX>uQ]l`QcQRa:HP6`PfX(>?P6r[`ut7`lIPh29*MQ^VRt=gcp1CK7&6"KnP>;M1'r# +9k2c$d*'MHbK`4UATr?=G%F(#QVsp4aN2B@`Q#praof`)`l7Mi-cX-Fbfn/IaN2E@bL4JB^Uh&- +bJq]Ia2uKMgsXsHoCMPDoCMYLq>C*fq%ESorr;lqqtp3^o_/(VrVcZjr;?Bos76*epAXt@p&=[_ +q"OX[qtp?jqtg*_oDAC[r;?Bgs7?0]o'bu)cg99*a2l9Cd(R08b2:8u`l5p@c-4>L`QlIkO.T6d +EGoo;DJ)Ynd`9&9`R!/k@pt7CI>33&KS>A8KS"i&/Bc&S`PojkaT'E_`>ctEccs\S`l"ci4tnuX +JAKLRb/;6?bfn/JaNEJ_s2P)[s2tAd&'N,/\8G;@:0sO^rqlQ`q#:;D~> +s8Mlp#P[-:kPtSWr6tWQr;$*es82iljmVsDrqccsrr;Qg0DtkMq>(!brqBH8MgpV>IYWK1K8"o= +IVs]1q>L!dqYp*]q/pq!EclD:?)Eg"pt>WSs8Domi5NXQeboCGrr*-%qtTg#LO&c>s)e3[rH/'^% +s*/BD0Ki&4E5I_EH?;KH2_pdGPubUEos8Mus$2aDks8V3MrqOtArs&H%s8;fps5*_Vr;6Ejs8Vrrr;Q^%l0Rd&h +uE`Lr;HWrr;M3~> +rVuos$N9o$g7k7Lo_ngie,KCI%fZM-s89U$ZI&LKs8Mupnbt6@s8Vros8;om4ItiK' +I>iMiJb]-Bq#Cr;Zfms7uX0r;HZqrVZQks8DusmC]j=[@Za`r;6Kms8W&t +s5 +!W2inrsAPo]O=TQZGk#0e&W-Dc,doC`4pn*=`q0maN)<<`q%2)`5^!9_T'L>e3Ii-Jr>5*KS#,; +M1^_,=CKS#c,7fGa2-3^B5qa/G]RCqQ[i&gc2P`_`<+'#aSs?^aT'9Na`RN#J]#)S7fB?LPH\$KsKS>)=L5L\;I6jpSb/VTI_o_br+NhpN`Pp!Dc-=JN +_6oJ'2*"&iVT6s)`P]^!m:s8)Harr7K~> +s8Mio"lA=ms8W#FrXSl#r;Zfns8UjBl2U_]rr2rgrYkh4rVuomrV. ++>.R2FTH`4rd=`lrHU#AH$"CTAnOm`1LtKJG'\I[G^4[bI!U$^I!:$eD/XN*1*0),H$4C_NR[V# +rVlfr"6f+Hrr2rNrr;aFpN)=q@Ua@kF*VXuRJHLPrqHHmqt0bEFbGL#JVSc0K7ec2MKqY[s8DZk +q>^9is8W,srVllqrr39&nFQG:jT#2Xrr<#o!ri6"hYm]Vrr2rtrr2iprs@cPlfm:+s7Q +rVuoss8<3%nu/:WkPY8+rr2p,rr)lsjdWHbqYgHns8DNfs8Nu5rr<#ps895oMM6>3J;/`*KR\<& +HrO8CrVQU*rn]eWCOL&;B0i5o9]Q-Or;Z`pqu?6drr;us%KHG,s8N&si5NUPec#IGrW)oqrrLul +pqujC%Dg$$_90WRQGgVW`5BIk^]D9erPCD-^q.M'^;m[?R)R.c^qmq,_ns4(^qmn*`4s:2^;\=5 +UQ;Ora2#R0_=dj.rVlfpqW@;Ih>[HSrr2os0)PM>EJ^Su?>sLsG\Tm=qY'shr;Zfpo_C=bJqef+ +KmnZ)JUiH.G!tm#s7lWirr;lp#Q4Q#s8MuprVlg)rntW$[\pV7rVZWjrr3*"r;Q`RrW)urrX8c* +qZ$BJV4=!JWqZMms8E,us8W(K~> +s8Dlq#Q+AOCfXZ5`6lX?>.7^W+@8`5_Di0uhAO`QQNIcdA"8L5:;:I"?m"MM?\> +G="C9bKIrJbK\>\_CfP;HZ!h<4dVZqa4ec:`W*sAame>bQbkh;5n*TK.lg*s: +miCf^kOJ02pAX^1]A3&QmHir\m+9A"aMuBL]tVV2hT5`:rlR.=_o'@5do_$l>[MJ`E-,e^L>'V` +_7\"BdaI,"A9NELIY`W4LPCM=M/=QXeBZ(]_og!=aN4A's3)J*`Pop@bfn8Q^oi&Z2`sE;_8jdE +_SjO\obfRr9PZUXO=aJirs8Voiq>UDE~> +s8Mio#3b.(r;Zcre,B^PpAY*lq>L?QjQQUC!ri6"nbt3ArVZTnq#BkLLOXu4Ljk,.N/3.BLNZkt +qu?Kfs8;ifr1HW'GB%MA@8n&%CNXfFrcoE.I!g3aG'8+UH$sjSB2B9T2J[;RH@1!_H@5^A(jpURG^4gcE,T)E%2)Zb +G]n@]NR[V#rVlfr"6f+Hrr2rNr\"6Jq<1JMW((lUCi4B<3Ka7=r;$Berr;ch9m)DKJqJl7Kn+]+ +L5BGsp%SL`s7uZns8W#qrrDoprs7r]o^L6-s7lTmrrW#kr;Q]srqtaSs8W&ss83?*s8VTKlg3`r +s8Volr;?SF~> +r;R-'rVc`o\Yu:Oqtnh@rr3B(qu?]lYGSVequ6Qns7?6is"FBLqu?Qnnj8.]Jq\r-L4+r3ItE;p +>5J3trVHQlr:Tu[7W_1j^r"") +_8X=/b/'s2M7(C>^;e..p&G'jrr2lmk4&E'rr)jNrqbeKUn^7qH>@A;EAisXs8W&tq>^Kipe>jf +Kn4f0KnFi'JUrPbM"UQCrVulss8;lqrVum1rr)fprVufl`P/^aRcsbLr;ZTlrrrE#rr2rth>[BQ% +fHA"`1WZlTtC4$s8W)urVh<~> +s8Dors8<3#l@iVKMS[<\aT'Bnc,[c?^qt%f=I?Vi`-`59O;eBlmq.XHJrMMZV0H]akD_=D/sN0FCK3\?u+B:b/M@!`otJe`l5sAbfIcEaN)9Cd`Au6]"?M9`lcHE +ai_rbdbF9_naHDCqsXLN&+&KOq")2.bkL_tmHa'&li$5MlP/aQoC;DEkHqSDs8;HWmHNftlKdd8 +m2bNVkO7p1q=)n>ZfV&SmdfJcm+9A"aMuBL]tVV2fuP5S_o'^?d)\)4T0[IAB5)C*/U>gd_naR< +cd^P$2.6E3*.j$)LkC>7LOi*1cd:7ecH+#FaN2NHbfn>U`l7ks'$%GU=@>,56D2-7bKn&EaND`N +rl3g9s2tA]&]i,:ag?Cl928lZk4eoUqtg0gs*t~> +q>UWss7k=0mJd.7rW2rnrr3?$qu?KBl086JrVuBd1&1eFs8DleoLOacL4t;=K8P/2MM4crp&"R[ +s8)]ooZ,lLGAqGC9mrqtdTrr3)uqu$Bkrr70OrqZHjrVqB~> +rVuiq#lXbOUo1d"qu,"Crr3B'rVuoqe"!V[pAXpfs7?4Gs8)clrr)fep.:$dKS"f2Iti9!L4W'g +p&4gas82cpo>f]FF)Gf3F`'@>UI4\Rs8N#tr;QNlo)AXgrr*B,rr2rss8Clp_o1+(rVlcrrVca! +hS@%H`:Uq^`5BL2_TKu^LmFUP_SX4.`5T^5_SlGms2=rV'?%f-N/WdjaMP^1_na7/_8*k$_#D4i +_S^KfJpX&-:$grr<#trr2irrr2rsrXSu)qWkVs[]lq6p](0kqY^Bnrr<#Wrr;os +rr)j)rqu`^Y+_J\T@s/ArVuos!WW.L~> +s8Dors8*$!n#']$DSa]@&BW2;`l5g2P"f/%Xhhop`Q%Mj1WI&IaOSu"fA8H7I#3]6L4"c*J;&D8 +K@.u`]ue+2e&S6(/p)#KC2n5YV3`XUeBu@W`r*pV`rF-[b4As6Vo:mHs6*mHsH7oC2=\[^soao^D>:kNqL"lg=00 +mHs6*m-soFe@)p!k4S35o\e'^f?)(S`lcZA^<+OSaT'BaaMu7!`B1lWe'2K>QYf]@D/sN89.A%J +^<=O8cH",Vf+_5'Jq/K,L4k;8It;_cg"b-*bfe)I`lQ +q>UWps8UU.ir8u+rW)orrs&E"s8Um9hu3QTr:0b@s82fon[1Q%Ljt26J:`Q2LP^k>:g*emp](9m +rVuLs9QYSpG^+7K<._2hT(i*Vs8Vooqu#^X$ig2(qV]?2`7=eas8N!'s82T`_Mrr2p"kj8*Drr:XMs7n5GnO'OZ6uHsaGAh\B3`5qNs8Vrqs7u6`EGg8XJUrE*LPLM: +N/Ct+WW3"pqu6Tp#6+Msrr<#trr3/mmIg8&rr2otrVlg%qtTs`s8W)rir8rW%K-&!r;Q`qs8V3H +lKI%%rrVrjrVcbH~> +rVufp#QO(aU8[SXrR1ZUrVufps8VuhVQ-rdr;?Tpo)A[h(]=71n?bH&Ljk&1I=Qs%Jq\o.:0ISl +qYpL.rr;Op95o&bG'7kE;Lk]^TDJK_q>U9knG`Ferr*B,rr2rss8Clp_o1+(rVlcrrVca!hS@%H +`:UtH`(S7jb*\*LQ_2=8_8=(-`l5m6`5KX6`5KX5_o7:fQAqKU_o'I0^WOL4_SEt(_o0L4`5oou +O,9'\Z,+8l`kfLas8W&srr)]UnGh5Aqu?]o/cY?,XJA*uDfKo:F)!d9s7u]pqu?]noDETFIt<-" +J:WE.JV8f4>0AUS+6To(r@_s8W(K~> +s8Dors8*'"o>YKH?F@f#a:H>6aiMN@]s1mK?^ndJa2[\k0ZM2Nc.CI;.qF$QL5:M:KRnl4KQo^I +gs*g^`l5p@_DX&XGADPLChlt%VdP&$b/3tqrPeu]b08)Po>hum`Q$-GaMl6Aa2Q6MaLT's]@G*E +b0%cHb0Skkg[P15!qc*Vqt'dY$hjMjq8^"Y^rc?BnbqqUnc/(XmJlW3o(2ABYdqW_cM$l"o'>H- +mI0N6naGr6nF?/Hp=m`lQ +q>U`us8V*:i;EWTe,K=G#lFZ$r;ZcNk4S`R!W2fcrr;gHs5B,>DM*OpKS,&8IY`T/LMa:-jqu6Kjl2D(jrVcTN`Pf^Fr;HZprWrQ$q"2FYH$+9'G5l^b +EtiV/@OM`p!rr2p"kj8*Drr:[N0E:qJrqMCaWJ+SlF)Z,?BgD=ir;-Hnqu-?jp[WE3KS>29 +KS"f/K7&Q1F[q5_qYgEkruV1:qu6Wpr;-HniUcp4df9:Gs8Drqs8;Zdq#CBnr8R_Trr`/nq>:-j +"nq3HlKIa9rrW#kqu-PF~> +s8Vuqs8N;s\"9>Hq#/Y?"8r,trr)j#c(D;fo_ndhoDUKEr;6NPOATnJJqS`+KS4W(I=QudZ1n7s +r;QHjqu$,<1gFj=E,TW1:8F4IoDeagrr2lprql`brr2rsrXJo,rr;utrSYZ4`7=hbrr)orrVloT +_#D4S_Sa7._YM+K`"U&-Q]72lP+p"4^VIY%`5T[4_nuDh$Gsg%`J]bMj'*ZZc9u!_8a=as8W&srr)]UnGh>D!r`,trr<#t$ig,(s7hF\VL_rcErKr"AjH(i +rqZTorVufqq"&Q5KSG89K7JN)JTZWrEC>QUq>UBn!<2rq!<2ut&cVh1rVl,l]"5#:q==Rcrr;ln +rr`9!s8V'W!W2fmrsSi+p:d/lTV8pnrVl`prr.E~> +r;R0'qYU*6'IpSJld`fVI +]u\:=b$H/iF+ACMAn4]8Q93RH_nsLmb5]Ng`l5p:aND`Nb4E[q`l5sAbfIcEaN)9Cd`Au6]"?M9 +`lcHEai_rbdbF9jo)nOSnalYJrUU`squ4mV`P9.2p[e"HoCM\Lo^qbHrp^Tlp@e0k^VRq+ch$_t +na>c8oDS;'oC;ABpAO[=^q7In]&rqena5Jbm+9A"aMuBL]tVV2hoGoBc-49.`W+"5bJhTLdVr9] +ITL&tF*2S5.+-MgaihW8_SaaGdp>juJVA`-JU`<(I#*2_0ketXb5TC'aND`Nc-48K`Po[2`kn3B +2`*We]u84;`5BI4b08)PaSs3;h=0/pA"Xes8DutJ,~> +q>Ud!s8ViOiTgICqu6WprW3&urqt[QrVm?%s8;iqs30rls8W&or:9h>r;ZIM7=C&DJVo)0KnY;< +L5BJarqcHis7u]kr;Z]iAl!AgDfTtmOf2ECq"Oabs82fmr9=1gs8Domi5NXQeboCGrr*<*qtTg# +LO"#bG^4Q3G5c_YG'.kGCh#%3#Qk&0+DQ+JI!U$XEH6,DH$Xd^F)4kp"pk>2#rld@F*MnLDJjB5 +F`qnKEcZ&*5nX2%!!!F"Bm4fGIZ;kLs8Drrrr_KOq#:9mg&1'i +pAb-jqu?Qmpm4j$J:rZ0Jr"u9KnYD6N'I7>qu7*&qtp +s8N0"s8W)ts8N?"d\3DLp&4pirW)usrr2rSrr;p,s82ios8;GQ\$bJsrr<#srr)lnr\4nCN"'/F\7anpiF!5\ZQ3lAhN^qde( +`kILiP*1Z`Tu=d__oB[7`l5j4_Sa=2`Pfa#OGT*]PEiMh_na++_=dj.rVlfpqW@;Ig]%0Os8Ec0 +s7u]jeO,Y!9Q5)mDf%bgqY^9kpAFq*rVlVZ;KdPBKn=l1ItiK(KmS\>r;Q]qs8N&s!W;onrsnu* +f=JT!Ut>G@qt^9lr;?Tprr<#WrW<&rrr)j,rVuMiT:DUOd/*eAqu?Zps8W(K~> +qu79*rVucSVHd,N]ZA=:`Q#p=b1XiTaiM`Ha2#R(Zr1@?U;"Rb`lQLk^V7IoBS*ccO>P^s0grPK;YI7uLM4,:Ytb/2-;_oU!Cbf\$+`o4uP`lQBH`P]U4b.;:d +7S@'^li$VPrVlrts8RT~> +s8E6&rqucqs8Drs#MJ2!s8;Qis8N#srrr5nqu6Wqhu4,_r;Zfps8V]@lMCP\qu6NnrVl]l')/_6 +J;f,4JqJo3L4b>5Lg*i.rqc`rq>(!tpionWF`V;"W/O6frqlcqqu>RQ$ig2(qV]?2`7=eas8N!A +s82T`_M +qu?]p&cVh+ntW(do`"mjrVZ]ns8Drrs4mVRs8W$&s8DQ3T=!5Irr2utrquirrr;usrVm`.YZ,t* +JUrH+M1:2-KmJAQ;LJE=qu?Kkrr<#ts8Xc/7(OHYol[DTr!_nj.]s8W&srr)]UnGh>Dqu7<. +rVQWns8V^U:8F"HDJsDdSc&EbrVm?+s7lWfXY=gMKS>&/K`6Q&K*-^Rr;HTo"TJAtq>L9l%K6;* +pVF;I[& +rr)]n(%'F^?"^LfdE');`Q?EJaMu6Bb/hT[a>V2\_o'R8\qip]L9nY6_oBsGb/M-1`QHHMb/hZH +aGiW4M1U/)K8YJ@JqeZ'906G-b/_cEaSs0oaNDiVbum_UG]mXrU4bG+e',hQb0'_-$d-Q1`l5j7 +`lQBJb4E]&`l5sAbfIcEaN)9Cd`Au6]"?M9`lcHEai_rbdbF9_naGl8oCV\Hna,Z/kj\E9a2Gs=]?^!9mHa*+nauVJqY9IHnFle:]=c%t_SEqNq=X1D +iQplBaiDKBb0[i9ai`J]rPnlV.`TWScc=,Ubq2M`P"'"tBL.F(bfIlLb/M31^rOa?e'o;4\Mrqb/h['`r=$Zb2(,Q`l,[:cH!lAa1\9M +846 +s8E6&rqlWns8N#t"mXk&s8DKes8W)trr`)lqu6Tpir8rT"9/?#rr2p%cKX6ds8N#qs8Drqr;ZX1 +s/f7PL4Y#4It`B'Mh7"&=4I*Hrr;foq>Lp'pKMB)YFa8IteF`e>rr2p"kj8*Drr:sVrVZ]pr;R3!nD#d$ +M6'oqGu]UprVuiq(]+..s8;iqo_(n*JqJf/K7o#4K854uMu*GOrr`,lq>C6l#3b[Lh!+k=dJa7H +s8MrprrqiPm-Wlqp&BO~> +qu7?/rVlfppq*3!gAV!Hr;Zfps8;lqs5*bRs8W$-rr)fWS$B9^rr<#trVc`os8N#qrt25,IY!$$ +LOY#+ItrK0@oC_Lrr3)rs8N#srtGD1rVu^tBQ%QLUnpRFk4S]Qs8Mrp!<2lqn,E=drr*B,rr2rs +s8Clp_o1+(rVlcrrVc`shSB-.s1n`Q_u@Re_o0F,_T0U7Ss,:tNf]iOc?-W`PTF+_8F:+aM,C2_o9cuNfB3`OHu,n[)9i!`507^s8W&srr)]UnGhAEqYpTqrVlg+ +q=EDr +s8)fpqYq<)i.kKAPKD(d]t_P0d)sGL`lcHF`nnd2`l#^:b/U2K>$[N,`Poj@c,df;^W"@?c-",K +bhA"EI>*<(Kn"l0Jr"i3>!B1:cc3uBc,duG`Q$!Dc-+@#?ug*JTV+@tb0A/V`lS/%$d?c7`l?!8 +`Q$!Ab4n*TN1nb);Ho'cGCo)%+S]>DD"`PB7Oq=X1B +iQplBaiDKBb0[i9ai`M^s2G)YaSs1OaNDcSbf%H3+]4,t;dF-*CXp\N`lQBJaMkp5`QZ9@eBHZ, +EI*(fL5:S>KS4r*=DQ7%^V@\-cd0hV`5':1aMY6:5r^kdFh>Q?a:ZD+^s13Jai;<7Ki(3) +s8W,u"T89!s8Dor$.Rkrs82fqs8;forr`)lqu$Hnir8uU!<2ip"lJ>(qu?Wfrr;orq\8k)1PgX= +L4=l,NJ;q=LcP/*p\OphrV?F'qt]>DDe3m_H;cMfq>Bsbg&;BZrVcTN`Pf^Fr;HZprYbb5q"2FY +H$+7QG'.kIF`r"WG'7tA@P/?!qu@?4,\hIHG^4OVF`_hMI;s(0*!cBA-Njc5BQ80?H$+7NFE`"O +EH>_T('OjB!!3-##Yo>\FE`.meF`e>rr2p"kj8*Drr:sVs8;ips8NT,rVZ]i@6efuWi/3nA+KQt +rVdW2s7Z?ipAP$bFDZVeJV8Q#L4Y/8DI*,9rX\r+s8W)qr;6Bks6T%Ao[ +qu?]q&cDY,qU_=6]`.s/rr<#rrVZZns53hUs8W&urVld$qY@P%[FYBs^L44l3 +ItW?1KR8B)2=^M9qZ$QnrVlfps8N!.rT6Od@rJ)e;_FR7rVHQoqu6Kmn,E=drr*B,rr2rss8Clp +_o1+(rVlcrrVc`shSB$+s25>`_SX:-_oTgM3Ds8W&s(&e.1rr<#n +?pAQoW2)Ua@IO6prr2lprrPeJeA&c_h0s8;osrV?,fTq%aJbk_84s*t~> +s8Dcn&bk@c?p-CKk5$[D9l+aN2C#`<"!"rQ6n:bg(q_H@(F% +ItW?4Km\N&.G3+j`lZ0>ai_cG`Poj@bf@oI2JQc>SodOJLYC.j_SuMq"Nng,`lA"s"3/F)b4o_?VD]tVG&`5'+3p[[e= +mHsH6nFQ)An+-(b]"H#&_SX7(d/NY:nL!bqnaQ2EnacJJg;(87^VRn)^q](.p$hD.cg99*a2l9C +d(R08b1OcLb/hN?aO/R33cIEdUH)7HcIg@^aSj79aMu?:`5f[;g"'A4G_L[&JpiB+K7@8ufZhFP +_8XL?ccjJJ_8XI:^Rnpr2+0O!]Z&@@&]VT)c-=GQa2,/q:IRcTV!7[Ks*t~> +s8W&ss8N)trVlrQguA;4$3'l$rVuopq>:*hs5X+Xr;6Ktr;ZZ9nEg/Ss8E#rq#230qtp0p\OpirquG*Lk:>7M1^S:LOaeBk5,)Wr;Za(qu-Qos8VrZme,`,rr:FG%K6>(qYgn*&^%s*t~> +qu?]q#lO`%qs1;UY4;Gi"9&,qrr)itrr(jUrr;rq$i^2'rn*UH]^Yt"rr)lqrr;uurr2p8qu*!a +L4+],Jq8W-JV-^lqY^Bnrr<#qrr2lrs8EQ/pAXA44K,)BDeq;Ws8W)ts8;lps6fmcs8N!,s8N#t +rr;rT`P]XErVc`p!<)lr"5^i2_u.Ff_ns7+^V\"0ad\6GNf]HeOcGQt`khVjrPSZP2oi[lLQn$a +NK9 +!<)]m&c(Y0F')q[aMc!;aNM`KaN2BWaT'9Zb"]mp_ns9V9O_\2^WOd>_o9Xb/hNSeg`_XTfHau.D"3T]>MY.r5],_`Q#p=aNDZr +a<8LA`luZJ`Q6-@`QQ]N\\G_fe]YtTb/_WHceQt'nFQ8InJ1Naq"FR/^:_4t`l,j1^cdH;nF`Lu,VJThud`KYQqoUV7bJ:s;b0A>[9lkE,KSP2:L5(%p1We:o +`l#^5aNVoRb/2$:ai_)@82i[tA@B4le&W-@_8sgCai265Qr[$W:1h<-qY1#?~> +s8W,urVuosrr3PrgZ//1s7lHfs8N&ur;6Bhrr;$Xrqu]o%0$/(s4u]%p&G'ir;6Kks8N&us8Er7 +qtpEmnm-?mMM$_:I=R'$/bJi:s8Dutqu?Kk&,cD)mX9bjBOQ+)E(Tcss4RAZs8Domi5NXQeboCG +rr+SNqtTg#LO"#_EH-#AG^4U]G'.J'-4^@c!s&B%!oF*`epo`+mhrr3)am.gSZs53hSs8W'/q>^$E5B^m_ +D*tD$8aZQUq>M3-rr<#trr<#pYuc($IXZp)HB*qkLA^lErr)`pqY^?rkjRp1e,B +!<2`m#laP8T;^Bs)3 +F,,R%LkC))JpJs&7J^;7_)`P]U/ +^WQ6=mHa0.nalACqYBj"]tM5!_SF.+^:hndrqIl7oC;26n*'ZKf"o;B_Sa=1_SNptjnJH;nDhj] +f?)(S`lcZA^<+OTaAL+(bf\)Qc-48A`l#VIF)c895cpb@cHaALaNDZHaNVoScGdW;`mW>^NB_$) +IKCY6qV`l5p:aND`PbJD-@c,ZVZ4"`cbU:SFce&W-@`Q60Fahu-2EDoS->(YQ$qtL,@~> +s8W,urVmW3qu6WqqqU3!s8VifqZ$Norr2imr;Q`UrW2rrrr3H,s8;Zjs8UIUBH;Q6!ODK9cB<-7j.r7_,Xs8Domi5NXQ +eboCGrr*c7qtTg#LO"#_DfKiAH$Xd^G&1V2"U"u2qu@<2#:+)/H$Xd^G]e%RBOqYR&GuMW!<<*, +2JR/NF`heKFa/1TCdSd9#mC;/!<<*(!";YBEc?)GN7@M"rVlfr"6f+Hrr2rTrr)lsrr2p+8Rup[ +F`1AhY).<$s7uX1s8)`pqY:!cqXmR'LkChAJ;8Dp=o&*tqu-`rqtU'arVm&tjmr''i;Wc'rXAi$ +rqu]os5EY@l/DF0s*t~> +!<2fo$2so(q:hO7^[qL)rWN9!rVlfqs8W&Wrr2rsquH`qrs/N%lBSlto_eXe!r`&qrVlcq)>jF1 +5(\$7K78N4K6'QWr;Q`rqZ$TfrVc`nrt#&-s4C,EPX9;/DKAWqqYg\h@%KHA+s8DufUS=3GU! +rVmi8qu-Qpr;H?OZsH^UYf4],bg+5Nb/hZD`lcH`aAKsr`QZTQb/(j4a3(JR@WJNhb/(g0b1"nc +aMl->b/h`NbKS?ZG'f7'I"6j"DEHk.b/q]9b0.`Lc,dlA_oB^8cI]]oT8bj>BQ&)h?H9asrl+oW +kf=gb`Q$-GaMl6Aa2Q6MaLT's]@G*Eb0%cHb0Skkg[P150CS;olgOHDrVt'O^W"42_o'=-_7dt` +nEoQ/n+62As7QAuZd-G+_8*k'^:h>/p&=_6p@@b?mI'WBhnHYAai2*:`4j.&]B/e[o((kfm+9A" +aMuBL]tVV2hoIq&bfn5Pc-OVT`6$Ra>]k%.APQL0H!&D8aN2NHaN2TMe]YkI]t__6c-J7WKn>83 +JV\>\5hX`6b/hTBrl>Ync-F2HbfRAK4u"oV@_TRsd)Za>`m)WC`N<6?8l&ulk4\]Hs*t~> +s8W,urr3c5s82`ns8V6@kl:\Yq=jpfrr2rsqu$Hni;WcV$NBu&qtg-gs4lW"rr<#rs8)iprr)j9 +rquZjr;Z`oQLp$s7TuiWFKU7G]InL7]Z.Zr8%>[s8Domi5NXQ +eboCGrr*`6qtTg#LO"#_EH62HH?sjZC1J[s!!!)t!##D=,\qULH?jaYF`hG.%KQP0!oFF9(to`+mhrr3)am.gSZs5EtSs8W'/r:5nAF*N"% +6h=QOXAIL@q#1 +!WE#ors8T'rr)2aSZh>XrsJ`)r;Q]orr<#srSmhUs8VutrVlfr#lOAiWi3Jaqu6Qo!WDrqrVulr +ru1n:rVr3dLOO`.KRnPA2Tbptp\k-lr;Z`orqud,qZ$.rPGM]#8p5)jE^[&)qZ$Eks8VZhrr;us% +KHG,s8N&si5NUPec#IGrW)oqrtF8)_o'F3`5KR0_8=((`05RoK8okk$':1/OHQ6U_8=%d_E,HKH +?aphNKfQdOctrjO.sY4_ns7,`59R1_k_L$IXR6@OH5NaO-5U2_o9O4_SPpFs8DrrrVG[Gs5!\Or +Vuj-s7D=CDf^1p6Ln3CW(tt>qYpNn!VlTirsR^EIX6]uJ:`B09t('!qu6Qo%Jp)&rU\7I\[eHlp +\k$:rW3&urr3<(fqFn)R],?Jrq?AB~> +rVmi6qYU6ir;Z]cc>QTiUVb:&c-!uGb0%fF`lcH`a;i4=`QZTQbeq9Z#:o'cD5\@o_mbK\,J`kf@%]B/e] +o((kfm+9A"aMuBL]tVV2hT5Z>3c94e4tYVgP+=P8_u%Llb0A>T_Sa@6aj/AI,^"?f +IX[$(JiT4JbkT6ibKe,NbeKfY1b(aUSA<+]dDumCbJq`I`P%@38kN!)`:*I!p]#a~> +s8W,urr3c5s8Mljs8VWPiW&rRr:pRf^rVcTN`Pf^F +r;HZprY,>/q"2FYH$+1LFa/1XH$41@/IVLWrW*W5!!*-*,\qULH$FLTEcP\(!!E3#rW2rt%L"b* +Ecu_RGBIq@Ce#0Cq>_'-"T\T0:2Y,nGC>J#o`+mhrr3)am.gSZs5EtTs8N!.q8u$HG&1qWo(pR4 +Wg[Ajq>M-+s8Vros7uWfL0]LkKR\i8JpUGgqYC+"r;63bqu?Zqs6&qFkMZ@>d/FUSs82chs8VET +meQ23s8Voop]#a~> +!WE#krt+t*ZBO-,WhPEE5j`P]U0_"Ia-rVlfpqW@;Ig]%3Nrr*K* +b!C&gBPTj(qoMg7QXKUfrr;rr(]+13qu?]os7_4OJr,)-LP:2&;tU"es82forsef%rVPrn]"4oH +q>('jd/FIRrr;oqpqihhStNOfo`'F~> +rVm#sq"t$grr3T-ieUf9P.Socbf[uIb0%fF`r=-@a;r:>`lcQNbf.Q@a325s9j2/;_84%/bg4V[ +b/hTBrl@%?`5g'J.sHZ%K7J>u?r;9t`Pfa3_9L-Kc,dlA_o9X@b+VLtKhgBW0P>EF?6n%FaMu6= +`Q#pqao]Z(`q%3!`l5sAbfIcEaN)9Cd`Au6]"?M9`lcHEai_rbdbF9_oChhHmHa02qZ#-`^;.S% +b/VHB`5TO)a7JffmI0Z?qYp?&[)g8*a2l<@`50=0^X;`Jo^hV@n+6#Fi4Ze@_nj:6bK.]B^V.8@ +p\47NjO*>GaiDKBb0[i9ai`D[s2tAc'$AGDW%Vq+AR?n6fsj\GLdKD2rl4rY)Tp:NahPX1`QlkF +9RDYNJ;Ar,Ccg"gb/VNDrlPkp`l?*Faiq`1MF&jJ5@;4JaMuZL&B`8D`Q-!;Z?&u2:L0"@o_nL` +J,~> +s8N,trr2rsrY,&%qu?]Uk3E!ErVZKkrr2rtqtpBmir8uXs8E3"qt^'dq>UBrgu[f"rr3)urr;ln +rsSi(qu?ZqqYQ^gK7NrU.tNA"9`"\^s8W&rqu6Tms82`krVuIhX/8\SqYH"9G'ItC:Aaqbs8Vij +rSd_`s8Domi5NXQeboCGrr*T2qtTg#LO"#bH?X[\F`qS7-4p=W!##J:"9AN+$7';)H[0dREc>A( +!Wi3!rri9#%L+\(F*DqZH#[Y95S!r"qZ$Tsr;[618T&TqG(>Y'o`+mhrr3)am.gSZs5EtVs"s`Q +s8Mlb2gB=cBM\F#q###hY%t<:q>^KlrVu`oq>^Hkr;-Bc8:?5LK7AW'I6RB$s8;oorWE)qr;-Bl +$1@ +!WE#nrs8Q&s81`GTsadsrs/B"rr2lqs8W)sj8K&Yr;QZp'DhY(qmNT4jS8cRr;ZfrrVZWmrr)jT +rVu]kRpCMmK8#&2KR$2dr;$Bmrr)]lrVZ]nrVZWnn5,pT9]Z'HLI-')D/E#ErVZ]qqYpNlrr<#h +rr2rsrXJo,rr;utrSYZ4`7=hbrr)orrVloT_#D5U`kK=,^Vn"/N.H5$IslZnO,oE`Nf]Hr_nO+0 +`5':0\UJUIH[gmeZn]s8UOH%K6>,qu?TfWLfQJS^dT0s*t~> +rVm#sq"jmarVmGrZs?XF]#`4C_o^!Bb/hTBrlX9B*6,t;b08)Pb/hZ?`PfN0Pb.tj2aj/-oR[6+Uf%=aoC2dir3Ru?rcca/D +a3)QKb0%fF`q%2E`l5sAbfIcEaN)9Cd`Au6]"?M9`lcHEai_rbdbF9_oD8%Kn*KW:r5upm`lQ-8 +^rj^>`5BF+a7/Hdo(;JKrq3q3^rFU?aMZ-@_u@Rn_pS/Ln*BH3nG*%A]"5o$`Po[1aNDQ?^Uq); +rq?olj3d5FaiDKBb0[i9ai`M^3l].ZaiVQFb0A +s8W,srVuos#P\#hs8V0Ej8T&ar;ZZnrr;upr;Q`Urr('grVlrMmc=?H"9%ukrr)j3 +rqu]is8)clqK=lSKnP50LP/+@rVulos8O2>qZ$Kls8N&uQ?TKYNVi\Nqti'gEbe:Np%eIUrr;cP +rX8c)rVGHk`5L4(rVulr#64SqoYQB/rcJKlI!TpPB.+5kq#D!/"9S`1+_uLEFDc/=>T3\J!rN$6 +!X/]/!!!3YC34fOHZX.>3YDZ%!!!&t!"]56!!!3oCiFKFL6'jVs8Drrrr_KOq#:9miVioSs8)`p +0`(Q:DJsi/=TA-pqYobMWh`GhrqQNnqYpNjs8N&nqZ$5s8!/OZL5CLI;#9e^s8)Tks83E+qu6Wq +qW@GMg@bLDq>^EArWE)squ$Hn$N&fNna#B +!WE#krs&GbWM-9Squ6U$r;Q]orr<#srSIPNrtG;0s7YuT[D_h7rVlips8MuprVc`q#Q"Jss82Y7 +2u\F7L4+i06HoB-rqufr+8l!8rVlirs8J1$Vg"'rrqlTh06(oE8$DX_r:^0jqtpBms760gs8N!, +s8N#trr;rT`P]XErVc`p!<)lr!T(Wk_csdg_Sj@0`K,@iFaAI^G^Y-sNfT3[O.+,4]u@e,`jpS: +H[^0eH[C!gLQ.L^P`h]Y`PfU._8OEgIUCLr:risCNa#ds82ips62nIT1o4`q>^Kks8Vrqrr;oqs7WlhNIcV3LO_N`q"+F`qu?]o +rr2rtqu?[(kJ"XESAk*ps8W&te,KCIs8Dut$Mr>MSsl(Gli$k_pA]X~> +rVm#tq"jmarVmN&_J`R^V8:BuaMZ*Ab/hTBb0&\as2P#[s3+Qc_TBj5Y=r/?XhDj"bJM9Cc-=DN +`Q#p5bf8#Uem0eZLk1+sH\"2Zbg4/A_TpEMaNMN?c,eAaF_.7_G1G$gfA7HWBPKerbg+AIaN_TE +b08)PaMu6jaF2(I`luZJ`Q6-@`QQ]N\\G_fe]YtTb/_WHceQt'nFQ8@oC_eJo_HVA]YMP._ns7* +_9'd;^:VAXqs3nDqZ$9&YJA/rcHOJN`l5m;a2l6Io^q\?lL"3BgqgbFa2Z?B`5T^:aMu'.]]/YV +n+5_gm+9A"aMuBL]tVV2hoJ[7]?.t9ccO>W1h1?C:H[@Qa2HNQ3hi$&f?V1Rai)0@_9U-F^VS4> +Si_mbJV/o62EfsDcHj>G`lQJ`6#`J:JFP[En:*e +rV$8A~> +s8N-!r;HZqrWr;pqu?]bjPfP*rrDrprW2oorr:gR$iKeqrr<#rqu?$;gALsPpAFpgs#U/Wr;ZWm +s8Vuc3J<0:J<,/6?AA@Qs7ZKiqu6Wns8)`pp$YhUX\n`cs8VikP#HLJG +s8Moq!<2rs$NBS1T;0[0qu6WnrVliss8CaPrr3]2s8Vups1P28k4ncLs8;orrVZTlrVnDDrr2rq +ml5lNI=I<,KNj-*q#C*gqtpBmr;ZZnrq#SUTr:WRp](9hr/jnVEreGar;QcqlMge_rr*B,rr2rs +s8Clp_o1+(rVlcrrVca$hS@%H_T'4$rl,5)H$O^`I=6Khrd7:kMiWm[S]A@\aMu!+GB\1[HZjg^ +GBnL^JW,VMOe0P1^qR\(`h@g"H$OX_H?X^aI=[9:OHu0?aMbd0]YF.>s8DrrrVG[Gs5*bTrsei) +qXsdbX$plFAQJ['rr<#o,*?f@G*2P!s8Dorqu$KjrVuolr+fnrIt3B$J:9]Ts7u]pqYpNp&H)D) +p\N4N]=4-qqYL6lr;Y7Fs8NN,r;ZZe[%Wt\S&P7&o`'F~> +rVm$!qYL*erVmN(f8j0?MSR-LbeqNEb/hTBb0&M\>0>19`59I1bJnHo>aN+Ca3;9;b0A2T`l5s; +aMH*IeC)\gI"ZimK62fJCXU;K]u\17bgFGN_T:$FbrV5d4k7a!d)sp[4_K%^.Dsied)a8Gb0%rP +b/hTBo#Q7!`Q$-GaMl6Aa2Q6MaLT's]@G*Eb0%cHb0Skkg[Oh+qXF%Oq>A@C]YVV1b/VE;^:_D) +`koL3p?_DFqtKim\%9]&`QcKE`l#R-`l>s7cLg_qlgXNAgUt#8`l6$=_o0L-^rFC2^qf(.p$VM4 +cg99*a2l9Cd(R08b2:9;`lPg?aMH$HN&kfs?TliXa25a5eq._8D0*nBb/_QF^Ve46a3)N?eQc[A +Kn5&.Ir?X^g<%LX`Q$!Abf\#H`P]U@\Y<@d/O)8!aiquO_oC0H%a*)@^r+!s@nTKq>FFjWo`'F~> +s8N0"r;Q]qs8N&o!<2ut!o;nor;ZcqrqufriVrlTrr3]3q"asirVcZis3Tils8W)uqtpCPirVulrru_(:p](9ls8RS&WbAI1s7uKjs7<0aDfT_^p\+R\oDe^e +s8V?_$ig2(qV]?2`7=eas8N!/s82T`_ML*frVccioMq]c7e-NTq#16lrr<#rrV6E`22-[8MLUX_7H4(?s8Dur +s8W&s!W;rprsIuWo&93?s8Dfls3^fIqu6TorsIcOlKR%&s8D]hrqHGC~> +s8Moq&,uV.s8W)pgmk.JqY1!hs8N#ss53hUs8Drsrs\o,qu-Qel_(c-p@e1Xrr`8ur;QZps8q>^6is8DurI=e>,VYL2fq>^KeVbLrDCdIjks82NilMge_rr*B, +rr2rss8Clp_o1+(rVlcrrVca'hS@%H_SX%$^r294H2i1eG]n7SGC=^`KT(nOR`WLgaMYZ:G(4a\ +Fa/7WI=$9aHA.@(_o9O3]>+%=s8DrrrVG[Gs5*_V +s82ZlrsAJ87<3?]4o,-TrVn/9nkl!R7.L +rVm$!qtg3hrVm6"l*t2-FLo$#aN=G(g;s95>0>19`PTF2d_2GM?ZNNe^<=F5aNVoQ`l5s;aiDTN +`m`;eG'\[gH$k!j2:U($aN)HK`R2HDbfeMiA9"/CP1A'u_p-QPM*#Nn?nC!Yd)NiFaND`Nb/hTA +o#Q7!`Q$-GaMl6Aa2Q6MaLT's]@G*Eb0%cHb0Skkg[Oh+p%%\IrQ)LZ^;Iq-_SX.'_n3Y"a25R2 +q=aX\qY%G.`4s.*aNMTGa2G[*`5]d6dJ3D(p%dq-]=Gi%`Q66=`PfX,^V[q,]=-_lp@@h5cg99* +a2l9Cd(R08b2:9:`kB+0d*U"+/o5K=0%\Cc_7dS(akK@XT.eI;`kod<`Pfj@`lH$Kdj]s*KnXc, +67fq!d*0JK_oBd?b/hZD`PfU5Z%#7u2*,`kcHaVQa3r$>b0/#G]tC%<92/](_sm^)p&BO~> +s8N3#r;?QnrrW,or;HWshr<;frrE#srrr>tr;?Tpir0#Wq>:-js7m!$rr2rlr;Z*:hYmHVqtU'd +rr2utrqnbUqu?Tns6*!CML^D8M1(%_qYU6kp&+^crql`pqV+uGTiq0gs8Duns8Vql9QYAn;#1(i +s7H6erVlisl2D(jrVcTN`Pf^Fr;HZpr_!4fq"2FYH$+7KIW]-I%Kut9!Wi?("pP26!!*3.#mqe] +HY@%q$k*FB!!3?2"98W,"9\].#QtMjAo2X8C-)q4!s/Q."9JW0"o\K5!T#QH$Fn$eF`e> +rr2p"kj8*Drr:sVs8W,p#ljNnAoD]Zc1q;<-2dcBs8/j+YEEl"r;ZfqrVulls8Vig<)&%&JVo1i +K_kHCs8)Zls8Dotr;QZps6U-Wm+VL>r;Z]ks3^iGr;Q^"o]GW0hq7r.!WMrhs*t~> +!WW/ss8W'0rVlisrVc>aTr$ZBr;?TnrVccSrr2p"rr)cnrr3B(rVu`jq8]S@h>-dBs8W#trr2pR +r;ZTmr;Q`\7n&2]KS>81J6;RBrVuThqu6Wns8D`E;59acp\k-ks8)cqqP-T"EGJAHrr3&os8VHb +rr;us%KHG,s8N&si5NUPec#IGrW)oqrrLulrkhsOb/hAXI!U3fI!U'`I!g6hH@CO)N/j=?cG7<. +Ed2nUGBS4VF``+WH?OF\MNEmi_8+"1^RKLqG]n:VH@(!aGBnL[H\%$;N3g:9`kT=)p&G'jrr2lm +k4&E-rr2p)q>:3`:h4UEorVccpq#CBiqG^.?L44l0?A/1Ms8Vrn +s8Vuqrr3K-pAW.I\@AI%o_eahqZ"tBrr3E'qoGD$U7eLZqu6WppA]X~> +!<)lr!r`#nrVm?*p[m0\?XoS7]Yhk6b1aoP`l5pEcP-a2Gsrb!a=j`lQ6@ +ai;QGb0[mP0n+@tK8Fhp6Ia<&aM#U4`Q#gAcdB);&`Q#d4`l,a5^;7e0 +`4s=]s75pVYdsbKs1oSl_7n",`4rq"`5TO8nFHDTpsld`]t_G&`;[XR_#M+b]YD;$\``YVo^1\b +m+9A"aMuBL]tVV2hoIjua2uBGf[Ml^Ana*-c-FDI^Ve1>f9B=4JQC+@c,n#HaMl$AcH+Hs7u*.Z +KmHU4f$)Rf`l?*B`l@qt&B;f.Z):Vb00W(-^rjpC`m)oPs2kej]Xr_l9Mo#@hY7'MrV$8A~> +rr3&tqu$Hns82lrrVlumiS<\srs8T's82Wirr2rWrW;ukq#16mqZ?]qrquctdH0Tkrr`)nqu$Hn +s8Ef3s7lWorr)fqppU,(Og8-1q>:0irVuQjp\.[(Ec=7oo_J@` +r;?Nms8V?_$ig2(qV]?2`7=eas8N!-s82T`_M1)bs8;orqYC$c?C%3ge+`kApAP",rVHHB8;)VIL51=GpA=Ua +rr;`mqZ$TorXf#,rVuookO@rpn,NFarr;rDrX]&'rr<#YkO@Zgn,NFcs8DZkJ,~> +qu?Zp%K6>,rVHNk_P*[:s8DusrVlftrr:sVrr2usrqufr%fQG+s8W&qnY*(up\t-hrr;oqs8Nf- +rr;urs8Vo$9n7kLIu&S?kkb>Wrr4#9s8;]koP'>h=NL@;rr)irpAap];J9rb4kB?*rVli`rr2rs +rXJo,rr;utrSYZ4`7=hbrr)orrVp9^^r+(.a2,TLFa&+UH?a[YH$ag[G]nCZI"RHOai)9-HZs[U +H@L?hH?j^[G'\FYI"@$/TZG9r\!qniG^O[UG^+CYH?OLYG]e:_M2np]_oB@,_=dj.rVlfpqW@;I +h>TA2rr;fgM,nV8:8@Uap](-js82Zkqd#DU>LWEIs7ZKls8W)srROJkJU`?*ImNl.qZ$Qpp]('d +rXo20r;Z`S]=PMOaS>f3s8W&rdJa[VqYpKcXdP`PU! +s8Dors82cp'D_:um?_*(ai_cIaNDZF`o+oW`l#d:bfn/E`5TsGb/18V=Dk7S_o9gAaMu3= +rl@=L_8spCa2u]UPs0PJLOXu&1X"7m_o^$C_9'U8dEtjGW'mW5bf[uEah#a@f0:iT`luZJ`Q6-@`QQ]N\\G_fe]YtTb/_WHceQt'nFQ8Enb0r/]Y_S*`59=,_83k$ +^;9f]7_d7HqYTQd[Ca,jbJqB6^V.Cs_ns.%]tM)'o_nd\gVUD2_7dIr^V%D!^V@S!]=bhk^utUd +oBGA_m+9A"aMuBL]tVV2hT.^saOADdF@p@a6Aj4>_8jF5`kfL:fh73d8[6FZb/2KGa2u2ZH+_;<`Q$*Gb0n?AbJVE;Y%(4$9jXaaqYpNnpA]X~> +rr3&tq>C6ls8N#t"oA9!kMk7qrrrE%s7uKghu3]So_8=a;uZ[hs8;fpr;Q`ejPg%:s8;]gqu6Wq +rr2iqqu?Hjs82Wgq2Ag=Iu&]3>*Aj_s8)ZnrVuops2/'DMJ2hbo_nges8VfmrUE$jE-42.pAad_ +r;HWps69Ljs8Domi5NXQeboCGrr-7(qtTg#LO"#_EF1%,#6=o,!s8`4#Qk&,#6k>3!!NZNA8P'X% +1PeBqs8;oqs7lTlF_?;ZJ;8_WX8;epr +;ZZos8N&urVlip#Q+Q$iU-4+h#@!<)QiJ,~> +qu?Zp&H2V-r;HZpj//TOo)JahrVc`q!ri6"ir8rW'`In*r;Q`ps8;`nq>^H.VR#%Rrr2iqrr2rt +3;NUKs8W#nr;)=ZKm\]-Jl@[*r;ZZms8N&uqu=H6WekEds7cKlqZ$Tis82:HD/OARn+m"Xs8VHb +rr;us%KHG,s8N&si5NUPec#IGrW)oqs'X^!_o'F3\qb`\H@C3fG^+L[H?a[]H@'j_K8Z,9`2n9- +H[^<`GBJ%RI=69`H$XgaGC>@8`kng:G]\4QI=6<`G^4X^H$Xd]G'A:`P+fb3`l,m5p&G'jrr2lm +k4&E,rXJo'rqUeCCN!`[q>U9hrr51Ys8W)ne5`W:>5S?rs82ios7u]nF_-,UI>*/NXSr2!rVu]n +s8Drrs8W)ts8VuqpqXSQ[ArTgs82iqs814C%KH>*rmdd3S=QnSrr2fes*t~> +s8)fprr3#tqu-QppBU`l]PLn\VRcZJs2b5_s2O$==j"b%_og3E`P'@4a3V]K^iN@VMR1.Cd*0MI +_8aR=b0S)P^;\73_912L=c.idI"+e5f?DFT_oBX7b/r;07Akf6e'GnQcG@?:^!bEX-Z!^8,Ke0V +^;e7nao]Z(`q%2X`l5sAbfIcEaN)9Cd`Au6]"?M9`lcHEai_rbdbF9_oC;"T\@of'aiVN<^qd[t +^Vn%-]Xtkja8#JgZ*M![`PTU.\@K8e]>2;#^q@%`^Vo^:kK^cP^UV.t]=YbhqnO#^]Y(hrg%b4/ +m,ZLZf?)(S`lcZA^<+OTa>h>ha3;k9:MOiQ3S)R"`lQ?LaiM]FagFU:NBYb3^sC3M`l5^ +rr3-!qu$KorVlis&c)D*jQ,4os8W)urqZ?drr<#XrW;uiq#14+rqufms8W&tpAb0>ki)O@s7c?d +qYgWtrVufmrr3,rnO/(]re2bX6gO^Nr;Zcrs7u]h:8Xp`l1b2Ss82irqu?Zks-HH*Dg"8Ao)JXc +rVlisl2Gc(rVcTN`Pf^Cq>L?mrr)lrqt.[ZH$+.G4YJH8+s\E]-n$Po-71/i-RL#_,8_G:C.13I +1bggG3&`fU2*3cY2)-sD/O!H&E+hm+5Jb5X7=h91a2HE--DbeFEM:s8W)s +k3W!Es5ukje?$mf37brrW)rr7_,Mr;HWps8W'.rVliskj.g-kNr6Hs8Vofs*t~> +qYq3-r;HZnr;Q`oq66Wif_bXHrVlfrhubV.[.4r;ZQhrr)lkks'cNLk1##<;6Cl +rVulsqYg?jrr<#urX]&*g:t;3UW!0.rVccns8C[N!<;op&HDb0s7NaoS=64frVZ]pp\smdJ,~> +rr)irs8Dor'DMA'pYC:*=GsT)aNDZHaNVfH`Snm>b/hK>b07rG`l#sC_9U3?X@ZT&S%[.kb/V96 +`lQqX`1_g"G6CjlGC[gXk36iniPOh:(3M`:W]Zg#_M]kht@XiS`\WiTB:_ioT4V +hs/kgp$M2+cg9?,a2lEId(@$8mE#7GrlG&\rl@(=b0AGbasgh?D'WN8_TU-Bbg"JV^rOC>>'uo@ +Oj(hnaNDT?bfIgVI=I**H>GXgai;0:`QcKGrl4uZs2G\oaN(H(5r(D\EkoT4_SO"4dELIgrlY&X +&&uT.c+@[e:Jk5IjRi +rr;usq>V!)s8VlMlK8-Hrr;okp\Fgfs5X([r;6Ejs82fqrrDurrs[*?q#CBmrV6?grr;oos8;j) +qY@*iLOk26IT*BAqu6U*r;QZgT5^i[MYd;Orqu`nrr2j-qk6],G[ODCrVcZfrVulps69M&s8Dom +i5NXPcLq/9rqlQls8Mc/KQqZ\F)u>>D>\5MDZ4JNC]A)WBP2'NDK]i8E+j0,DuOVODuFMcDfB`= +FE2A?DJj<.DfBZ6Df'FlD$FotE,TW3ErC+lI#H>@q>C9mq=s";rr<#tqs"(rpAb0js7uQlrUo27 +Ecu@\h=(@CrVuorrVlis)#3PlWi&efp]('hr;HZcF)$DcK8"_Lp@nRd$i^)$qu$BlrVuosrVlg& +qWdPAmFD7:rr)iur;6EOrX/T&rr;usr;6Eirr)itrqucq"Qo=Jm+Lk-J,~> +qYpQprVllsrr39%f:AbDo`"ggrVlrurVbaTrr3-#rVlcprr;rr$ig4uk*^Hn +rVulrruV.8W)84rJqSSMXnVbnrr;iprqE%&WI0R"r;ZcorVccrrVud"T1X0I?;UFrrrr5us8Moq +qYpEmrVlisrr+#>rr2rss8Clp_o:=/rVlisrr;lns5Cc2`PfX0_8=(g_u7FO_>qFN_Z.L\_Sa6Z +^W=41aMPsr_Z.OM_Z.OR_>qLP_Z%FX_Sa7,_8=(,r5/KM"N&*q_SQ5g&AZ3Us8Mios8;l\n,3+^ +rr;Qgqu?Zp(\Rh.r;ZWks8VoT4`GIZ2r*p%s8N&ur;QX8rr<#nmmj4L;"XS`r;Z`ps71/BJ:rB' +HqsG3s8Mio&cVb.rVlisro:o/\[&.+qu?ZprVliVrWE3"rr)iqrVm!!rVc`prse_[US"$GSDX2C +s82cmpA]X~> +p&G'j&c_at[TusKZ,"`lZ??`59[@`6-1"au[V` +`PojBM*QE6JU_c0PK(J]aNhiF`Qa$DSS)]dcHseVa2Z*;`lH3Fe:p&"Cf3CKe]u:RbK\2KbP]N_ +aT'71`Q#p=b08#J`luZJ`Q6-@`QQ]N\\G_fe]YtM`QQNHbhgq'lg3p(n+-,GrqQQhrqHHcqtCcs +o^_LomeH8FqY'g^q"XRVo_/"Wq#C$lo^_SBoC_kWq#L3cpAF^cp)!JroCDD?mc2a^h8mO\dEg+K +^<=U;aNF(p!64uV<6!#%bf/)VaNhW=bLbCg.:d1%,JD%:`l-$Fbg4V[b/D6r.aSj*Y +aSs0e_kg=&8Q033lMC/Go`'F~> +n,EdVjk]n8s8Mihq"t'is3goHrrV!;lMgedrql]kr;-HlrZD%;q#=eXLPgh9IT-%?r;HQnr;HF] +Vl!)\s8D]gs8Dlprr!B!9O;Xa>^c5>p](*gqu?KVrYY\6rVGHk`5Bmprr;upq#16lo=fj!EcQBq +H2MmdG5l[jDL?YHG'J(RGk-1VH1?4WGmf(\cggo4s8;]dipZmH!rVrnlMaNXq"t$err;iflT&m' +68rTLr;Zfprr;rqrr)fqs8;VRI&D"Sr;$9is8DlM8V2\KM2$MFrVuirs8Momq>:*is8;iqrqZTo +nE003f)G[Mr;Q]qs8)foir8uU#lal'rquZjr;QZp$3'o$s6T(Eo'"p,rrE#ks*t~> +nG`a_XIZ!1p\b$hrrW2trR(TKrV!Cq\Erkdrr`9!s8;lqs8Duss8O2=s82h)/qSh3J::Mos8;cj +s8Dun7]3%Rp&Fs`qZ$NmrtGD1rVZ7Z>\nXgI.[@7s8Dons7lHir;Zfr"9&6!s8N!-s8N#trr;rT +`P][Js8;iors8T"rnkN-`5BOb_uI[S`W*mV_[*ot`P'40_8aIb`;.=@`;7CO_@62=s82`ks8VBP +qu$Els7?6es8N!Es7cEhqu?]pp[("\DEp*no`"mjrVlipr;HQls8W#iO*IC:Rf3-_rt#)*gIH^D +I"d6'Q2gm]rVlWm'DhY,rqZEccF:9oU"]GCs8W)rrVliVrr +o)B:"qU]^a,Gcc4)IbehI!askEO`l5p:aNVoQ`l?6H +aMl6Aa2Q6MaLT's]@P3G_8FIAb0/Yoh!OIrnFHSMs763[#O;*Ulgj]:o^VPKo'u>Jndt!4mbc7/ +bKnY_\%^&*`lQccF2H_o9dBb/h]Ha2Z$6`P86Y/LNS>PJY;Y`lQBJ`l5sWa90H'b0'_- +( +nc''ss7kO5mJm4aq>:'err2rGrr'dW6%"'5K7?/*q>C6k +rs\LFJu!Ffo`+sfs8Mrorr2j,rq%gdDJh[dq"sjdrr;ipl2D"hrVcTN`Pf^Cr;Q^(r;-Blr9h+J +FE)ACqK2=Os)\HiGB._KG&kuQ$[dr\med%aqYU!Gn,E=gr;6EWrY>2,s8;iqq>#ItEd;cOeare> +s8Dlor;IZ6rr<#sohDHi7.BpMs82imQ;rZrMhP6$s82KgrrE&tq[`W)rr;ros8W&troWV;iT:(= +!W2lqrrW)nr8R_Ur;HWnr;Zcrs8N#trrq-@mI0'+rr3*"rVuljs*t~> +nc&gmr5bM)\bZ.&!ri/sci++#S[-<1r;Q]urVHQoq>UEo%f6+uo07JFK7n\>`;9B1rr3E!G^uT/ +X7Q>jq>^HlrVmQ1rVcZoo.4otCd*7CrqcZos7u]krqufprr<#trX]&.rr;utrSYZ4`7Fk^qYpKo +#QFW"i53=I`;.7@_Z.FV`PfO+`P]I<_@FAto`+shr;$BmlL+QIrVlifrr2rqrX\c&s8;iqqYPb% +F*_lMeF`b?!ri/sr;H]prr3o7oLl'^61=RJs82ikPu<3eL4N +o)Asnq<4/LW%QeB-.]r5KDka2uQWe/)_+?n>^7ccF;NaM?%!aSs<^aSa%'aND`L`Q$-GaMl6A +a2Q6MaLT's^"CQK_8FC>b0Ao$jn8BDnbV_GnGhq]oCD;9oC;4qn.=X+kh=2#bKJA[\%^&*`lQfi +>c$WUqY0gXs*t~> +nc&sqs8Us;huE`Uq>C6ks8ULGrr38XjQljGqt9mdrr3&srr;io*rGp9qohNfK8##'=S`!os8;ZM +=0.ukp\ascs8;lrq>LcuogqtiG]6MEr;ZKirrDfXrWrQ&rVGHk`5L4)s![mCr;Z`a\qYHPF`qqP +G'A+RG'A+RG'A+RG'J4UGBe:TG'.hKH?sc6G<'hjG'A+RG'A+RG'A+RG'J4UGBe=VGB\4SG'A+R +G'A+RG'A+RG'J4UGBe=VJ!&7Lq>^KmqtK+=rr3&tqu#aYs8N]/qu??ho/CH(E+3SOs82WhrVlfp +rrN,trr*u8Zsg4nGlIL9s7u+JMhcn;HVXD1rVufqs8Mrnqu6Qo!W;oqrrh]Wp$^!$rs8Q"rr<#t +qt^0Lrr;oorqcO!rr;utnDEEnlJqjC!ri&qp&BO~> +nG`^kk,+oNhY-mI!ri/sd/FFLpU7'-iVNQQs8Vuqs8)`pruM%;s80r+M1UG6FB85;qu6Keh,C;C +;>9tbq>^Blr;Z`p$iKZg:18<`:dG$[q>UBpp]('gs8W#rs8W)t&-)Y.s8N&si5NUPebf+:rVlg% +rVliU_Sj=1n\k@Erko&Y^r+76`5KXb`;.CB`;7F_`5D6Irr2rps8VBPqu-Kms6BU`rser)s7QEa +2JdAQ?to-1rqllts8N#rru_7=rr2lnZX0bbFoM77s7kqDLP(#*GYIr.s8Vrnr;Q]q&cV_(rr;us +s8Vi0[_BGFp@\@_rrW2trr2rWrr<#rrqcZprXAW&a/,H!Su1cKq>L?mrq?AB~> +o)B3uqX)%5=')!,`lQ0=`lS/%d`=Ae_745SqhW4D*q"4.Jr:BpY#Oq0Op@\"IoC;DIoC;DJo+:$-jjqGl +bfeDX\%^&*`lQ_p-$HbTU;&@o64ThpBE]`5]m@bK%WCaN;TIc-_bOUip5$bKJ>X +aX2CgK7Rque]H(aao9Eb`kfR8rm)A#]tD2!X&(T86oh'P`5T^8aNVfH`Q$iWr5o#\rPnlY&'Du0 +_hD;k9N,fSoC_nWrUg,?~> +nc&pps8V?UBqrqu]Arr)j$dIHB!s7lHirrN)rq>MK5s8)`op1\;qJVo.MUAXids8?Jk +V-M"3s82`mq>^KjrX]&.q.Ma2DK\Rhqu?Hcs8V?_#ljl%qV]?2`n(+gAcDK&rVuDsL4+>kF`MSE +FE2JDFE2JDFE2JDFE2MFF`MSEF`DPFEH$)BF`V\HF`V\HF`V\HF`V\HFE2JDFE2JDF`V\HF`V\H +F`V\HF`V\HFE2JDFE2JNOkBC+s8W)qpuCiBrrW,qr9=1squ?]ms7qUDF`VY1]_qU'qu6WqrVc`p +rr3r:rVc`iqd>bn:tG@=qYOfFM1:A2<5A>0qZ$NnrrW,qr;?R0rqZTop%%hMe`d&4rVQKks8W)q +qu#=Mrr3'!r;?Nj!;uir"l/>'ki)(2rr`8uqu-3fJ,~> +nG`pppUZih^\Ig.rr2rtcMe%Es6Q;b\+BRu"oeH"s8N&rrZ;+;s8Dutp1J,nIt`G>T_\B_s8-/^ +Tj#G.s8)Zlq>:3jrrL:!ds8W)ks*t~> +nc'1!n_]:&;gc6s`l5p7`QZTLdE"5`a/MR2?`1lea2Pp4c-FDMaND`LaMu*@`m32c:0;moMh3pH +f#YhQe4GUn9rZCeb0%iDaiFA"s2b5_&C8bQ9-\(YB/?F7d_NN8a2S%touJ5o`luZJ`Q6-@`QQ]N +\\G_hf$).O`Q?BHf&Y<1ki_4!mf)\SmKW.In*fT/nF5oBmd]cBmL\8"eS_c,muHaN)?@_ns@4bfe2Pa3mP8V*VZs2b2Zs2b5_%Euo0Y?t='<*tdO +qY0mXs*t~> +nc&Ufrr3/Wm,%dBr;Q]urquZkdf04F!pJ7uqu6csqu-HhrZD":qtL!dq*p-lKRo+WqYguqu$Eds*t~> +nG`dmqr+6LWUB`brr*$"rr2rErW`<"_kaKaq>LB>%:Mg];brVHQoqu-EhrVlg-r;6Hfs8W)tlG:*B +U:gErr;Zcqs8UdOqu7-)r;P!:St)OPh"UaFrUTu=~> +nc'0up[,\#>@XkO`Q#m5_p$HLd)\)b_KALLICRJ@`l5g8:=>&+Fb0%94`Poj:rQ+u\rQ$/%`Q$-GaMl6A +a2Q6MaLT's]@G*E`Q$*GaO/\[`n8hoh"on%h>Q41h$;lphVHuEi7l]:%ahl=e&fJIb0A/>^rsa: +rlXfQs2nBdc-=JT`l5R0a33,[88;sT5(1r.ccX>Na2l9@`k]=+a3DiOaN;Z+8=br;hUU4B@WHjW +HsL14aiV`Fb08)P`P975cdTqQ_S +nc&Ugrr3)cj4mZ(B=@3qV]?2`7"P^s8;]eqY^6^d_*3#rk2.B]tV1o +]tV1o]tV1o]tV1o]tV1o]tM(m^V[e$]>)(p^;%Cs^;%Cs^;%Cs^;%Cs^;%Cs^;%Cs^;%Cs^;%Cs +^;%Cs^;%Cs^;%Cs^qJ\"r;R#ujmW3Ks8;cYrY52.qtg-T4)o1_75s]8o`"acrr)forZ(k7rr;us +s7uQjFH!/3Xn\eJMMd+FE+&D5r;HEhrs8W%r;Q`rrqQ3drri#]p&*)6rr_ulqu#.H!W;rqrrrE" +q=sa^rr3/alg!cmi;NZYrqlWkrV$8A~> +nc&mos8Mi'URK'rrVlcqdf'aTrr2WbYHkUmr;Z]pr;HWpqu.W9q>^Enq#A0,IY<6!L+APcqb3]` +9^29Js8Vopq>:3jrr2p)rR*uHEG]MhfD>LBs7uZms8N!-s8N#trr;rT`P]XGrqu`ns(D9.r8l\l +gu7,Hh;6uEh;6uEh;6uEh;6uEh;6uEh;6rCh;I8NhV?uFhV[2IhV[2IhV[2IhV[2IhV[2IhV[2I +hV[2IhV[2IhV[2IhV[2IhV[2IhVQoVrr;cirr;u]mem%_s8VKc)?'R6s8Dutr;,_>D/4/W2"(D; +s8N&trVc`ps8Dp;rVliqrr$knUh-V$VCdOUItVTCp%SLcq>^Hlr;Q]qs83B+rVlisnC,"V]U\Wj +s8)Tlh>RESr;QTn%K6.mZ)!q^TY'ahr;HWcs*t~> +nc'1"rV5?#=]'OW_oB^4_p$BJd`<*BaNM?*@8g3g]>V_3`lZED`lQ7#are^J^rOLAb1N=KG)1p+ +K,/ORd5.&c6d +n,ERfs8:^A\?!WW)rrs6s;7BRf`DG,fkE +q>UEls8W#ss82Wk%fHA"s7o3!GBRsr_Yj3/kl)G!rVcTN`Pf[Ap\Xmaq"OXbrr2HSm-!m.o(2\I +rUL'\mI'Vpo)nONo(N%^#lFJ[n,E@er;>dX')DP'q419'F*:Pbo(i=^r;Q`qrr42>s8Mrqs8N#t +s7cBV9<+sgnOS:cLP^U^[J]t&r;QZls8W)trr3`0r:^-iq +n,EXhrRRaBXS;Ylrr)lFrXo2,s8N&dS[H<(rVQWprVlisqu.]9s8W#ss7lD4Bn1_eI:Rd!Quf-J +L&(cKr;Zfqs8W#qs8Dp-rVuQjpdJ_6EG\1_rVHQnqu?Nlr;Zcq%KHG,s8N&si5NUQf`1sKrs8W& +s8;osrVuo_rr)j!rqcNld/FOTrVucos82fZmem%_s8VWg!<;rqs8NT-s82S\8oSZg;-!2as8N#t +!<2ut,5hK@rVliqrr<#pr9R"QV+pDJIt*$%Hr.0Irr;rsrVQNkrr3'!rVc]p$N/Vi]=+Z_q"jsh +rVlfrrr(dSrr3*"rVlforseo$eXrA*US?? +n,Emon#9f%?a[YgaMGd:bf\AT'?S;?aMt/HOb/D?A_u7UTa:cY:_oogBfed2aG\f43dE'SR`rg1`l5p7`luZJ +`Q6-@`QQ]N\\GY`dE0JPbfn>Qa3`5gin<5GlJVX""5qtjj3ccoiSDVu`5p$?bdkU7`l7r"o#LmP +aNFM+>0+_(_T^?ZL-KNsF%ARAbg42HaN;NFb/_B=_o0^Bc-4;Q_p-7ZR$p=p0m%brLO;OZf$)=T +`Q-$Cbf7Q>`lcHGbK.N+I6/u40m:(KdF$.]b/hTA`lcNJilD8Hb0%`Drl"oXaSs?^a9obM=%>eX +?aK.nrVlg!rV66fp]#a~> +nGa$uqu?]]j5]k5s7lWoqY^9>rW3&srVluicL1N-s8VrrqXXUsr:EO4LP:J=4QK,9VG@!drUKje +rVlg/pPhslDg-5Dq>:$bs7ZKgq>]p_&-)V,qV]?2_pA)Qr;-3_r;Q^!r:p$]q=4@Pq9o-Bq=O@W +rVm0&qr[AGs8W#pn,=(%q>^Khs8W#mp+U!$EcZG1FSPk/s7-($s7cQgNdRmQEE%dHN.bncqtp?e +rr2p)r:fp^s8VK\qsDo4rs8K#r;ZfpqtpBls5O%Xs8Vusrr2p#rr;ugp\t0rk3D1&kNhsDs8M`l +J,~> +nc'1!rr;of\tPkDpAb$is8DutdJa^Rs8W&kd@dqjqYgHorr)lsqYpHnrr*K&8:Z;BJV?/E8>r:W +qY^Xs7uZorVlfrqYh--qZ$DP +HDYe&;MKXSIUmBnr;HTorr2rtrr2iq%K",U\@&:.qYU3jr;HTmrrW,qrSmhVrVlg0rr)fms8W&t +s7cAnTpMOI\b?%%rVulgs*t~> +nc&sqs8VcEM,dB.\]Xoi!QN=1a:lb;bg+;>L.GBb[DU21ai;?>aN4A's2Z"r`Q#p=aN`$bH%q*. +IP'#/S<>\\d)jB(`r3srb/hK>a3N.W89f3!AmF!;ccaMGc,%3;aN4A)s2lS+`P]U5bfn/IaN2E@ +bL4JB^UUc%bfe8TbfduEaNVuVc-=S@d14^\f#ktN`l?*D]>W"7`W"$Oa:?5/`Q5sDbJVTJb089M +<;pqIED9T`cG7H=`lQd)X,C`Q$'Eb/M9;`l?*A +aih5e;_BR_8$0YOc-FJVbfIc@`QZTLilD8Hb0%`Drl#GebL"5Jahbc/<'EoPIbXPmrVlusq"js` +s*t~> +n,EUfr;ZHIk26.;s8;uor6YEJs82cpr8-E.rr3#os7$!urN&nLKnP)-:O]?aVXXW`nbs@)r;HHk +Jm32>FE;7GV>gDms7lWoqZ$E^rX]&-rVGHk`5C!tqtpgUps/m=!ri/rrr3)uqtpBls5X+XrrW,qr;HWtr;--crr3/alLO9"q"Xjh +rq?AB~> +o)B=$rVuosps5S,Xml;hs82iqs3U`Qs8)ZnmCfL8h"C[DrVu`nqu79-s/f+IJ:E&q97*RSVXjcb +rqQNjrYPV3r;$AC=)2nrE,$btrr)lsq#CBks8)Zmr;Zcq$ig5*s8N&si5NUQf_YUPrr)fprr<#e +rpp*:rr2p+rr)fps8;'Ir;Q`qs760hrtP>0s7lKkqtL*_5=B:"FDa`OFo21:s8Drss8W&urVZX- +q>^Knr^TS"?1EbkqA +nc'.!s8Vu\W`W&/ZGXl*_TBgFa:le?ai)3AXDgd@NjH^EccX8IaN4A's2b5[!6+rW&^&IY6%"E@ +IWe8*Sm-fabf7a!`r3ssb/hZ@`5gPD:2bK%CKh7&g==Nq_T^- +n,EUgr;ZfTjOO5/!ri5sdf0:E$2X]%rr<#te*$&rrrMojqu$3f&,-#pKntJ=Gu1?+L?no`+lg2/75VI;N5F<8.BOs82?c&cD\(r;Ea/Y_c/3N.Q@[nbrFarWE)qqu6Tp% +fH5%q>1$Kk5Xu%s8;opr;QlsqtpBls5X+XrrW,qr;HWsqY0jcrrqfNmdfMprr<#rnGe"~> +o)B7"rVlisr9:2TRbn#Cs82iDrXf,/r;Zcos8D;\YIX?'s82fms8N#ort5&+7tH>EKm-:eQW*b\ +q#C?mqu?Kk*<5m8s7hh'5?_oDG%O.YoCi4aqZ$Tks8N#rrr2iqrr*E-rr2rss8Clp_o1+'r;HWo +!rr9!qu-*bnGgo8rr3?)rVc`qr9*JFs8VTf)ZTg:qYpNppAb,j2/$uMG\C01:tP^Gs8;osrVcit +rr2lrrW)utrXf,-s8T3/WeO9%LO=5HnGN7ZrrE&srsSf"mD?3AYHduqs8;lr!W2fnrrW,qrSmeW +r;HWp"TJAtrr)ir$2jA-St2OHVsO<[rr`8urVlHhJ,~> +nc&Uerr3B%ctQHYS\`=d`6$'Ja:QM=b/VB;ai:DY;IHE9bf%NraSs3Y`W*phfe.H%LPC%PVNM`P]U5bfn/IaN2E@bL4JB^Uh,2 +d*9k[`PfU1b5TTdc-488`X^)7bf7WA`l5sA]>i4;_u@gMa@!ta_nO(6bJ_iYL)X91F+8()E]:AP +aN;6:`lQ +n,Ejnqu?]ch;7Q!rr<#tqpPKDr!rT's8Dcls7Fk,qu?ZlrqlWfrX]&#JR=1\LJX&5>fZ[>s7u3a +'`\13s8;Tja[B3PEcQLg;#L+grV6BlnbrmqrVcTN`PfdIrr2os!<2`m%fZM-s8N&ts8N&ts8N&t +nbiFd0`V.Prr;utrr;utrr;utrr;utrr;utrr;utrr;utrr;utrr;utrr;utrr;uqr;QZp"TJA^ +n,;VPs8Nf1pAb-lo07D8Ec-&AJ+<=6r;HEjnGX!ls8)Ef8X-5TI"%#dJGT6Cr;Hfrq>($hs8W!+ +p](9Pmd9Yts8W)ur;QZp"9/2prr2rXrr2p"qt^-grVlonrVlg#j6,n!h=CRF!VuW^s*t~> +o)J[f$ig5&_P*^:p%A=as3^iGrseo+s82Wls4!gIbl.A7qZ$NnqYq-"J6[_OKhdT,=i^=;s7lTm +qu?Kk'`\(/s82Hg`^*OBDJse\;#L(erV?Hms8E)urr2iqrr*B,rr2rss8Clp_o("$qu-KnrrE&s +rVud*rr;utrr;utrr;utrr;ucs"+0Lrr;utrr;utrr;utrr;utrr;utrr;utrr;utrr;utrr;ut +rr;utrr;urs8Dp$s8;'Ir;Zfdrr)itr:g3j%eDi*C2Ra*Dg^sFrqlZirr;rr!WW/ur>GV7s8N#t +p](6fr^;gE<-NVB@Xe1Prr<#tqu?Zps8NH"s8U-\\[.mrp\b!i"8_omrr2rtr8IVUr;HTo!rVrn +rr3T-q;83CStVarqY^?ms8Mrprq-5@~> +nc&UfrVm5iNa#b6[CXB!`l6BI&B`AB`PoX1cH1o:;09=__TV\prl4uW'#r,7@7u-"Lf9M>;Qn0Z +`kTU9qo8HQ5K_!dbfe8mZT(d"CM7N637uF"ahZ$=a3)WNbf[rE_o'L +n,E[lr;Q`rg#:W_rr3#srR1ZRr;6Kns8DutrVtg7mJd+crqlWhrXo20s8A-bM264RTp7q=s8)cq +nbrObrr<#t$i9GcEHc5@Eckr"qu6TspAb*]rX/](rVGHk`5^I0rqufkrXJf)r;QWnr;QWnr;QWn +meeU7r;QWnr;QWnr;QWnr;QWnr;QWnr;QWnr;QWnr;QWnr;QWnr;QWnr;QWgrWiDcmJHn^s8VWg +!WVuort+hs8o/KcFEDP3Fo24;s82icrXer%rquZU:KXTV:5*,2oDeddrW<#pqu6Trrqucq"S:L; +o[3X;"8Dclqu6Ttrqu]nrr;$Xrr3)tq>'serrDoprrr,Tm-*WarVlonq>C6mrq?AB~> +o)J[f$ig2'j/AiMf_54BrR(TSs8N&tqYU?,q>U_DPGrVuiqrVuiqrr3T)d^R!.Sal^Zs82irqu?Tlrr2rTrW2rqrVlrsqtpBm$iKk? +Tq@gLU[e-WrVlirrUg,?~> +nc&UfrVm5r^2@CaP./BO`5U0G'["bI`4Wt1d)EY<8m%Ik`66"r5elW&(&U?6%Ol7=/(j: +i7PoebONY<`6ZWNb0A>\h.(J>EG]Jh5LS$/ah>d6aND`Nb/hTA_oBpEaMl6Aa2Q6MaLT'u^Y7&Y +c-!o?`Q6BQbfnDZ:aNDZGaN2ZH6<0h>:P)VfdFQFZaN2NF`l?*@`lA#! +(rO"Z?S3lk2kn47e&]VJ]>M_6bf[rE`Q$lX( +mJdOls8V06gueY:qZ"qA!W)forsAW%s8CO?kl:\Wqu$9hs8NW*p[C.iIRp0678p;`qu?WbrY,>2 +s8N&uqu;OSE-,o?B6?61rUg*h!;l^#ab]rVd'% +rr2imr;Zfrrr2p#m/-,*g]%6QpB(6fqYgHorW)lSrr2p"qtU!brVllmrr3/ejm20bn,E=grqQ +nG`sss8W&rqS&Ys[e]k"s3U`Ir;QZorr3?&qW+B_]D):%s8Moqq>Lp#p@1+fHq'd078U&Zqu?Ta +rY,2*s8Dutrr7mVDfTT8Aofp)qt'ge!W;uqrr)lrrXSu-rr;utrSYZ4_pnV^rr2lqrs&H$rr;rr +rpp*Zrm(QCrr +nc&UfrVm2sifRPICpq7&ajJ0Db0/#J_8aR=aMX`G?=p=Q`6-4aW,>N8Y2hC8!_NB +bJ`ql)9^1Ia2l?DfPbfIcEaN)9Cd`Au6]"?P=bg";K +`5]sIccF,Kbf[95&]V`+`lcNJ`Q$3`Q63Bcb\#VGtgqdX'oa942JqV`QHELb/VF"`Z<.Ec-=))Il0)73FB&)bf7`F_7db+ +b0A2R`l#^6ilM/Bs2YhmaND`Nc,IT3W+o7*;-fIIpAP!js8) +lMh.fgZ75ks7uZmd/F4Irr<#pqYpKun_W4!s82]kqu6Km%Iu)^C1aPo?#FWQs8DufrYPV2s8Dlq +r:K\OBQn?7J8AG?qZ$EerVuEe'EA%0qV]?2`7"GUqu6WprquZkrr)lerpg$9rr;uurr2iqrWiDc +mJHh\s8VWg(]XI4r;$Ba88iTmDfB`68,)iZrqcZprUKmequ?R$oK7h_8>DnFG$ak?rr<#trr;or +s8N#trrhWXr:S>5rs&B#qtKp^rr2p"rquZjir8rW"8hlgqu-O#qu?]fj6?!ph>[EWqYU*cr;Q]t +rql]hs*t~> +nGa!trVlfpr84HNV;V@Ps8ULG&cMY,s8Vums8Vc8XJsMCs8N#ps8DrqrVum,o.FKcB!$DdCiAhC +r;ZBf)ZTg:pAb'hs8Vih7;-gZDglD'IJEj=q>UEor;QZprr*E-rr2rss8Clp_o1+)s8W)srr<#s +r;X,&r;Qcrrr36$k3`*Hs8MuerYbb7rr)]no1!S9E,'90D+=?ts8Mlps8DrrrVuiqrVuos&c_k1 +rUW%#KL_f15]U0&rr<#srr)itrr)fn$LPU;]Xaa1qu?Wlqu6ctrVZZns5O"Yqu$Em&H2P)rVlfi +c_[2'T<.GTqtU*h!W;ogs*t~> +nc&Ufrr3B(p[Q"2<`YU*aNVcRa;N%b/hTA`Q$!?r5oVqeC2MM>AIiK +DbaYDcdBbQaS!`j<_u`l#^6b08#I`m2?@d`02Gb0':r)9p:B`50mH/RWL?EH?,2 +1!7>SaMuHIaiMR%`rF+$bf[i>_oBd=`5TmJf-kci7AHP=AjOMZ`Pp!FcHO<-`?*%Ae(*!`M*2k+ +5)>b5]Np`lQ +mf*:drVm2bj5]P,r;$;>L.gs8Vrq +qXOOsqYpHdZ;ZF/?%&Sm@8Qpurr2oss8N&r!<2lq)!^_iqUGQFqu-Qpp%\CXqu$Hns8Mrnqu#LR +rr3-!q>'pequ6iQipH6hnGW@eqYpBrrr<#tr;QHjJ,~> +nc/Uf%fQG,r:mb!U:L1!r;Z`prVuiqs8UpSrr2uprr36#rqQ<#Y.1s8W)sq>U>* +AO3;i5_OYRi;EWGrYkh9qu?Qks8W#sqc%'FDJj32F?THms8W#ss8;lps8W)ts![mHrVufR`P][F +rr2rrr;?Nlrqu`ps8N#rrr)iprr)iprr)iprr)fcr%7mHrVlcprVlcprVlcprVlcprVlcprVlcp +rVlcprVlcprVlcprVlcprVlcpq>L?m#Q*ZNr;ZfrrUKk)rVu]ns7uLNCMe'/EcYehqu-Nos8)cl +rr2lrrVlcqrr2rt%/$i#J:LmOUi]s@rqu]os8N#ts8Doo$cg&o\Xr!ar;-?kqY^?qrr)fprVlls +rr;oqrVu?c!W;oprt58/rquflkc12FURT@$qt^3grVuor!<2ZkJ,~> +o)B=#qtpEnrVQBMJ6l,j]uJ+;b5KB]`n&3EbK.T?b0%]F^:%cS?(JaObfIfDrl#esb0%fHb08,R +da^us6Dp8-FE]R\e]c"Rb0'_)r6##[6H7*fcH*rD`4X491feL7FDbr&*n&*V`ko[6aND`LaMu3< +`luZH`Q$!@a3E&P\@T/ZeBlOje'?4ce(3!f_o9^AZd03-b0%uVe'ZC`d_NuQaMl6Co#M`lbL"/P +b/r-Q?YX_(EGel9ahu*>b/V]GaN4>"s2[LKaMYj5`lQ6=b0\P*6[*fXI&Cp[1=F.]`Q? +n,EIdq>U?m!nuc%rr33#s8Voiqu6Tp"8r&nrr2rPrr2ips!u4Ok5YJXqZ$NoqYg?ks8Vlhr;Zfp +p0LsPV/:+%LO2tps8N&ms8MrrrVuWk!<;ur&-$9IA9)d;F*^"Js7u]pq!n@`r=&`'i5ijZg"+^# +cHsr9chu,ucd:"bcd:"bcd:"bcgK.4cd:"bcd:"bcd:"bcd:"bcd:"bcd:"bcd:"bcd:"bcd:"b +cd:"bcd:"bcd:&7dKIq?nGi:_s7$!ts7u]ns7q1DF_l/3Ff'$GrZ_C?s8W&trVuWlqr^A&LPURI +VQW0VoD/=`s8W)tr;?Nlr;HX'o'>r@kOANMo_eagr;?Hks83-$s82ipqZ$KYrr2p%r;6Ehp\4L_ +rrqrOm-UNqr;Q +o)AdjrVlfrs8EB'hP6[BhY.!Kr;HTos8;rsrr3#urSIPLs"=?H>2B3J_]Df]i?48]'Qs8Vops8)]rs8N#r +s8W$,s7tQl_8k3]e^2Ufcd)I7!77pqqp,5f"O5$UrV-^EnpO,eVAT)$uUMTo/oDTX- +qu?Zns8N&ps8D.KKS+r.4/&c@:A4Ycrr2rsrXJo,q>1-hs4b?$[]dmKrr3#trql`nrr[PsS"HP:-hrqufqrq?AB~> +o)Adgo_A@a'(`YK:0dmHK#AScF">8>T:aNhoC`l@kr ++3)CC`l5p:aii/^_6L5Q_nN[gZEpmAZa7'GYcb47Z*Ue8Z2_-;Z*(72V9%0,bfe-!a:cY>cGduK +da2;]ARB.Q@usF0`q.8.ai2EB`5op>_pR#V0n"Y+GrVb,0/(MlbfIZ<`lucTbJh?_o9jDb4E[h`l#d>bf7WEbfRuMZZf/;9NZ)E +jS/ZR!rMimnc++~> +n,EIbp\t-k'BS05li7"\s8Voiq>UEorquZjrr2rVrr;oprWE)qrr)ir!mBj'rVn,>r;Z`ps8W)q +qu$BkrqfPeZ(F@7K85=SebT7@s8D`lqu$?]rX\r!F\5D5C6ks8W'$r;6Elrr2p(j72d&iW&rPp\XO\#QOGrrVuoos69O_rs&K#rqlB_qu6U!jl5aq +h=LIB"9/5rrq-5@~> +o)AdjrVlfrs8EB(osU<^^\@^(qu-Kns8;rsrr:gRr;Qcrrr3B)rqb`M\'4UHr;HNlrrW2urr2rs +rW`>t:.h[]6N2QFKgX5\s7u]nq>^Bkqtg +o)AdgoD&7`'):=>;GD>Fai_lNb/hTA`Q$!?rlX$;rl-b8b082P`4).-=ECab_SjF7aiDQHaMu6@ +bfn/Sgc\$(PrO)=Ll"1(bK@fMa2#^4`5TmubQ>r.aSj*m`Q#p=bg"=0/N-0j7guoMcd0YSc2GZ^ +aT'E^aT'9[`=U&2b0eVV]u%e.`l5g2_o'?j_u7RS_[4/p_n"+Db07oGo#UjR&'rD?ahlWRF=8t# +4(bf7WAb0/2BX'A%a:h,pCmJHq`rVQHi +nc++~> +n,EIdq>U?m#lNf?gAh3Ns8MupfDbgJ#6+Z&rqu]jrVluPg#W&0ruM"4rqZToqu$Kor;$Bcrb.Ck +=EfLQLP1=rr`9#p\Xsi"RkaI +nBCn3!r`#oo)8mls8)]cs8Mr[rr2p+rqlTjrVcceh<"7tg&:pOqYpHnrr2QiJ,~> +nc/Xgrr3E+rVcWEX.?*DrVHKlqu?Nl!<;$Ws8W&s(]XL6s82irZ`CUlq#1*hs8W#rrr<#rr;Q^- +o_i?\Uf_hpJq8B"1&ghAqYUL?irqZQtrqQ3_qYL0g +s8Jtqq>:Nqp&G'js8;osnbs$ss8;orp]'m\o(2VKqYfm^/cYeLs8;oqqJfVjJ:iK+Imfd);U>C@ +rVuosrr)irrVlispWL:a]q+`lrVuorrr)lprr2p'r;ZZno`+pgrquf`rr;osrr)j-p%QM&T:VdQ +lMLPZrVuosr;Zcqp]#a~> +o)AdgpA4^e%/B%kCf=K(`lZHIb/jP$s2b5_rl>)ZiQ)#Ar5]Spbfn>L^pmlQ?\b`'bK%]Oa2Ps9 +rQ#hqb/E.7KUkkVJ:ic9J0s0sb/hcPai;?Gr6#&\!QN4Y`Y$;7bgar[JS8V/aOS_\e&ohNrPnlY +rlY8^r5Sc["jbWEd+HtJd/VOnd/_Yoec45#eHjUDdEoqS_T'Uda:QM7`kom;_q!&ae'uspcHXN& +a90W,ai48!/CMqsc-=JTaN4>"r5]Pk +`Q#pC_8Nq+b/h`F`P][7bfn6!aT'BnaMl':cG[AI;bBbfDT(W-rVlrtqu-'bJ,~> +n,EIgr;QWo%e\K1kl:\^r;Zfrqt^'crr:gRs8;iq$NBtus8Vurs2=$_rr4);pA=[cs82fqs8;]l +rOZF +mJm4c%K65&o>dQ!\G,k!s8Muprs&K$rVlfrs5EtWrrE#qrX/N%s7-!XT"2Pro_ndoqu6TprqlTl +rt>7=>cEo[Kn"f.J:fk(rVZ]gq>UBoqtg9ns8N#rs8W'/s8Dcio(2PJpAb-hs7u]mrVuZlrr3<' +r;Q`orr;oorqueprr)for! +o)AdiqYU6k%K6"hes0WDCqIX.b/h['`r=$Zb5TK^`o5#"&BN#@c-=_`dalsndEp(_`R"J% +s2b,\s2b2Z$-1'.c-F\ccH=3*aJm5[ao9K^bQuS=bfIfD_8jRda:HG0ahka1`lZf^g!A*o_9DGj +*QHCK_o0X=cd/X7H$t6tLP:/&9VIM6d*0YS`l#^n`Xfu7[]"!s-TWr[^!"[CcHQ:/rl4lWs2G\j +`llE@c-ODNb/hTA`Q$!Cbf]Lts2t>^%`Z?&dD3(k<)$+iNo'0srVuorr;QcqpA]X~> +mJd1ar;R$$fAtrks8Moprr`/mp\b!irqtaSs8;iq"TJ?!qtg9k$-;*&p](*aqZ$QkrtkV3:T:'T +:O\+QKR\H-I8fq8s8Vrqr;Z +m/I+crVl^%i2WWMgA:jLr;?Qmrr`5tr;Q]qhu +nc/XfrVm6%p@ddaF')G1^W-/lrlY5]rl3s=3QfRib0%fHbfnMX`6>cuU.n6sQ,1VhcHX8C`Q$!? +`Q$-T2O^'r7sK]AN/<(9BJe)Ye^MO]`5ostaT'EWa:H>:d*'qge'6IccHjSV_TMhss2b5_!mJg0 +rlG,Zs2G#["3/F*a8O)Va8a-i`5]g;aiV`KaiDB@`kod9o#MBc^W"@.^rsj?bKS5QaMbd3o>psS +0?qPWaN;WLgbF##IZSl4Im.1;KUu)/cH+)H`P]U4`l6$,C-!Xs1PNEacdC:cb599Zb5]Q_`XTo, +aNVrLcHF5H`l?*@rQ=]P!m8a2rl>Sh_84%(I8a$?=)5_@pAOacs8)fpp]#a~> +nc/Xgs8N,trqud#jkSnWs8Vuqrr`/kp&+dgrqtaSs8;fps8E)rs8Drs$1-gJ4JW!s82Niqu$!`&-)D#s8)Wms7cQnq>^9hqsj[arrE#srs/Q%r;HTl +rViJg"onQ"s8W&drXSu(s8W&qpAb!fs8;fos7-(+s8DlqrVQWpP?EHnMLL,3Kg +mf*mus8W&qrquQ.TVAgdrr;onrr)j!rVQNlrr:mT!WE#sr=Ao-q>^3hqtS=9ZI&IJs8)`p+8u3= +s8DhWQ#!E(It`P@ +c/h3`UHJDOrr*B,rr<#rrVjaS^T,*HqYpBpqu?Zqp\t0ls8E3%q=sshq>UElrW)uhrr~> +n,ECdrr3B'q"jU@Qrm7&[)'c\aSj9]aSj-rPnlYqo\oZ +&B;i4aN2<>aiDE?`5T^6`Q"ps&B)H$_SX71`Q-*DaiV]I`Q%Ghs2khhb/_H<^od +1 +o)Apnr;Q`rr;QWo#6*N>gAh3Prr3)tp\4[cs8MrTrr;oorrW2rqtpBqqV(02rr;urs8W,r)?0Z' +1lS5(pY%WYKS=]*MLC(Fq>U?mq>^KbrX\o+s8)Wmr;?Tpr;Z]js8VTf%K$)%qu$Hms8N#ts8N"j +rs/Q'rr<#ts8DKe#l=T$rV6Bls82fq"9/?#qsjY's8N#tp\FjW4aMd?GDM<0IRqWTO`!jXr;HQm +rVuo_"Rtm)s8Mus!;#^Z#P[V(nal\Ys69O^quH`orsn>Xkj%9ds8VuqqYBsarpKf:~> +mf*@fs8W&r$NK:iTV'p8s8;forr2utrqlcqrr:mT(&e.1rVlforVulnq#C$5W4q0ds8;ckrtkY2 +PV.]`8G(UrJqSf%Jr+o,7/-WWs8)Wmr;Q]qrVd9's8Vuos8Dors8;opqYU +n,ECdrr3]0q#(![aDY$VOhAZQaN2NJbf\)Lr5Ra;"3Sj3b5KE]at:f`bJV*4Z%5\UK=AqDb0.iC +_oBd:bAS)VbfnA4bn/(<`5]jhlncHOAN^;J@@-Z4KqHART.JO?TjG#gGEdEBW1`Z<.Dah4QN.4%2FXLc6bbg=2K`l5s= +aND`Nb0%fHrl,PmbfG_[Vo5@9iYrB~> +o)Apnr;Q`rr;QZp"o\JghrO&#rri>uq>:0irrW2tr8IYTr;-Epq>:*frrUU(l2CY^r;QZqr;QX0 +o6,5Oq;X_nJqJc3IYTp_ZMX[os7l*_&,cJ's8W#srVlZnq>^Kjr:0ass82cps8N#rrr)fqs8Doq +U&G#j"TAB!rVuBd&-)M)s8)cnqu6WmrVucns7-*gs8W':r;ZAu5_k#HMLgD6K4oB&pGqX>qYU3f +r;?Qnrri/ho'FX"rrrE%r;QNio)8mi?lgZ*r;$ +mf*mus8W&qrr;rq`2'*3q>L6irr2p#rr)cnrr2rVrr<#urr;rsrW<,trVlg'r;HJnYJ'5ps8Dip +)#aC.mW*6>pu4SmK7\c/I"jRYYPJ4js7uTmrVlcqrVd?*s8)cqrVulsqZ$Bks8)]ms7Q?ms82cn +s8W)urVuotr;chqr;cimr<3&tr;HZarX\i's8)cnqu-QkrVufps8VWg!WW/urtG(85D4N:Lk()2 +JnB0$oJYt1qu-Knrr*E$e&9#5T^_jYs8Durs8N#tp&5~> +n,ECdrr3]0qYgHkm$;*ZA@B=n`lQ_rPghTo#MEccH48W`m)THc-XVV +c,7KB`q.84b0J8Q`P]s?Q7IB9LPpV0I=>@#e'SoSgXFBh`l?*Baht#e3[QI>V8LKo]u.e1`5T^8 +aNDZLbf\*+a:ZbK6N[X^e&TGIaN`&Wbf.K>o#MTdaNVlNaND8_<(^"_@?fL@s8W&rqu-El"9&)m +rV->B~> +o)Apnr;Q`rr;QZp%/^))ddQ;ks8Vuqr;HKls8:jTs8;co#6+Puqu$Bkrr4:kkj8?LrVuQequ?Zo +p\OgN=nDKF?@m`^L4b28KO0f8s8;osqoSi2s2"[Ts82cps8;e9>DIfdL4=ko:haqIqYpBgrqQ0` +s8;lr"T7ZWpWid +li-tarr)ls%.p`SLWr;ZfprVuiqrVu`no)JUdrr;`lrr8Gd!<(mUrVc-_!rr/rrr48CF'=6G +K7\K)Dbk"bq>(!cqu?Zns8W#sqYT$]]"FR&qu$Elq>^Bl&c__*s8)cqoSjk.+!lC0s8W)tr;cir +s7?4&s8Mrrs8Drmp9U]hS"Qb +n,ECdrVmQ.rVlijeSSMgNP<>!p.@[rlc,df8^;\+2`Q$!ArQH(r`llBKccpYE$kEbN`luHDc-OYW_nj@a +a;Dq9_TpBKbJh&(:e+)ZEkLc;s8VumqYU6hrr`5squ-9hJ,~> +nc/Xgs8N,trr)j$q>C9eh<3brrri2urVuosrr]nl:MbW9JRh#<[\\BDs8N&p +pA=a\qu?Qns69@RjPU"8rWN9#qtp +li7"a!W2orrY!_JT!7n^s8Dunq>LQ4O!rr2irrr2rhrX]&-s8W&tp\WI? +RA$1Ba8#Z5qu?]q!r`,toDa=~> +lMhOrq#16im&X,]D76pm`6ZQIb/h[&`o"l:`r3mV`W4*Xau.5S[nKY/XM)g#dE'MJcHFJJb0e\_ +B,*I;I"m9/JUUB4f>u+R_T'R6`l?*@b/hQ@`l?*@r6#&\oZ$jN#Kk--`Q#p=b59E_b5]PV`rF0] +bl5cbbl5cIaT'E\bl5cUa>D&abK@]=ahU%t?$^m@<@]bhK3QXM`llEEcH=,JbIY*15V"3<hcg_T0d?d_s+h=?]8M?^fpE +s8W&opA"L_r;ZcppA]X~> +mJm1brr36$q#CBSlIYk.s8MrrrrN,sh>[BQs8FVJqtp3bq"4Rcs4lo5s8W)tqZ$Hfr;6Eiq>^9] +?\qlP?"/P79hVYfr;Zfrs+10Kr\"!GrVZ]is8B_l2_e$diO*V"r;?HeqZ$E`s8;Wks8D'Fo]ap+ +s8Dims8Vulr:p7$s7cQnq>^1>)D!*T.ba[]rr +lMhIqqYpNos7*"]SC$s/rr;uorVlirrW)uWrr)lqrqZR%rr;TUV6\MGrr<#trVmQ1rVZKkqt"6R +=@$+tK6L!]XShtms82fos7?6es7uZms82fqrVc_hs7uZhs7?6`s6KXsq#C(s7lWe-PIaF)(*u0rVclsrr2osoDTd1 +rVuors8)8pU7RpMVX=?^s8N&urr;uss8Murrq$/?~> +l2MCjqu?Zlen\GkNjHR@aiqoMaN4A#hoPf:qo/TTrl?M1bf\/>Ue4L-Y/JZ6bfI`GcH!iB`R;oN +3bgo8;-83`3\,p2bKe2Jrl4uZs2tA_s2G#Xs2b5_rlk>`rlFuVq8``Z`Q#p=b5KQac2Pofb/U3q +"3/F'b5B?\`r +m/ILnr;Q`rrVQKls52ehrr3*!s8W)tr;ZctrqtRNrr;us#5nAoq=sj_rr3AZjSSuWrVZHjqY^?l +rtG5.rVQMoBnV()8A=rprr;lqr;D3GWW!M0rVHQor;QQeahkr$o)8F^pAFpmo_JFZrVm#VjR_]Z +rVuoq"onStq>UEirXSu+rr<#gBI#&D*@A,js60Fns8Mrprr;iVipu3hp&G$hrq-3lr;6Kfs*t~> +l2M=nrr2rto$X,(W94!TqYgHnrr;us!<;$Wr;Zcqq#:m's81QL[b(3Pqu?Zqr;Q]prtPD2s8;es +BS:t(8A4flrVucprVliorquffrql`krr)lnrr)fqrhBGkrq-6^rq$0Xr\=HOqZ$TorqZ<0_89II +rVQQgrr;uts8)cqr;Z`fs1u@a[\!9orVuosr;HZqrr2rtqu.**rVuosmq!Rc%i-=mqZ$Ekrr;Qg% +fcM+rquW=W1KrVT[3Q6rr<#t#Q=Z%s8N&trpp)>~> +nc/Uer;Qfoqu6U(iM9deA"pQM_op@ +b.u-Ac-"2PbK%uVdaj=MChbFRT@1m.cH",H`Q%nus2k>_r5ScXrlY/_s2tA_qo8HQrPnlYrlY8b +rQPAeaJ-]QaSj-Y`W*jT_#_Hno>h*T_nj1,_u%FQ`pUo;c,moEaMc%ag.F(-S.#*UqOOab0AD_b/VND`l?*Bbfn5NaMZ$Cd`Frd*=WDdOjh_Wb5]Zgb/hQ@`q%1d +a2Gm6ai'*>8Pr&eWp&sLs8DffpA"Ubs8Muhs*t~> +nc&Ugr;R3'rr<#qr;6Nog>UfOrr3<$s8;forr<#tr8IYTs82fprrN,srqc`mrVlfup!WI2ru:q7 +s8;fls8)Qkqu?TiqY'[`rq6$`s8VloqYu-GW;Zeprr3`.s8W&qqtU!ds82`op](!erVQTkqYgEs +hWXFma8Z,=rr +l2M7mqtpEnqt$\YTu-?qs7cHkg]%6Q"9/?"s8N#qs!RdFs8)WFTtoLVr;HWpr;6?jqYC0gs82Tg +o_AIdpA"Oas7lWks8Vrp!<;!Vr;W)^nc/4[o)J1X(Ae%1s7cQnr;6<`p\b'fqu?Nmq#10grVmE- +p\hnF_nDfAqY^ +nGiIcrVm]1qu?]ddWAo"I':9)_T^0D`l?*@bfn5haSj*\aMu<@rP^>-aND`PcHX#3MFD*?[DB\o +`lQ?GccF/Oaj85UdEU%ke]Q+\cHaAP_TBg=r5o&]`q[XQaoT`/nAtOIrlG,^r61kW!6G)XrPeZO +!64WO"3//]s2OTM(!FY4`5/6Z8OlTZGiS>gqu?Wk +q"Xabrr`/pqYg'dJ,~> +nc/XgrVuoqrr3K-r;Zfjg$.2^s8W)nqu$Hn!ri,qiVrlWs8N&rs8Mus!<2uq!rMrmrr3)ieF*;7 +rsS]'rr;fos8;oms8N#t"8;Niq>UBsrr<#os+10KrW<-!qu6U/o`+pfs8Mcmq>^3hs7lWmrqQHk +rr3,bm-a#Zrr39$s8N&ur;$6fp\k^'q>^KN.N]i\,Z"74s7lWYrWN)tqu?]qlO!(Ah>70NrqlNh +rVm!!qtp +mf3:crr3H+s8N&uqTth3UsB#=rr2ourr(OLs8Vuqrr4,?qYU-gs89m0_;+tds82iqs7lWor;ZTm +rVlispA=mfrr3-#s8Vrqo)8Xhk5P5WQ2^OXnc&OfrVlZnmf"X5qZ$Tpo`+pfs8Mcmq>^]^Y%K-8's7O+%R@p+KfDPUF +s8Muos8N#js*t~> +n,NCarVm]5rVZ]jk,DTi?B)nCaN;NE`l?*Bc-4>ia9'B&aSj6^aN"4us2HM1bf\)H`lGZ48oB]s +\\u>-bg=GVbf7rKd*9kccGITH`QcZNaN2N?chtrbaSs?\a8j6YaT'Babf\)saSNpVaIUKNaSa$X +`VmgHaSs3Xa8j6Y`W*sGa@O@iaj%o@c-")Tbf.rJc,J#M^WO[DaN;<6W0pF?0/YS\[_Tc*bKS,K +`lu]Ob/hZHb08#L`QGp8cF"#b&/Z'9dE0SIccXE/aT'ERaT'BscG.<*H;m7%9l%$&q>:'hrVHBf +rVc`uqY9j_o`'F~> +nc/XgrVm*$qu$Hns8;lr"7PO2hu'pWs*t~> +n,N@cr;R-%qu?]j\>>e!meQh]s8CUL!<<#s,5qN?s8W)ts8Vokqtm(j_;b:jqu?]os8;iqqZ$El +qYL6jrr36$s8VloqYg?`rql`arW)urrqQMErql]orVc`qs6]dhs82ipp%n[f+T2$7s7ZKls8Vop +s8)cqr;QBhcc*N*U[n +n,ELeqYL0hrtbM+pA"@9GZRsa[(su/aN2B@aNDcPb2C>@b5KNbb/jM#s2lb5cI'VM_73EA@>qD/ +aN2NEdDj,J_9U'GaiDTCa2l<@bK[fB_8O@9rlbAbrlG)_"Nng,`l7nrs2alUrQ#5`aNDZHaMu6s +`;moLaS!^SbQ,fVa9'N.bl5ikbf\#J`l?+!b43PLbf.`F^VnI=b/:m6b.c*=a2c!9b/DNPg!m@! +7k,`<5,5QpbfnD]bf7E4_oU'Hb/h`Lbf[rE\]Vt7`DI9[$l$4taMQ!9aNDTD`lQBJb4E[hb082M +^6;et6psq4j7<6Jq>^Klqu-Hm"8_`bqt0o=~> +nc&Ugr;Qlur;?BirrDrqrs7NDjm`^Hks8;lr'E%h/rVucor;$Bfs8Dut +mcX!,f`(mQrqHUEls8N#tq#1d'qu?]Ykj.p/ +hYmKSr;Q]krVlutqt^0Zs*t~> +n,N@crr2uprr3<$s8(iQTV]^)r;Q]srVY%A.f]MIs7lTns7cEdVlmi.p&Fgerr)los8Doqrr;ip +qu?Wps8Dorr;ZfpoD\Xen,<=er;QHjs8Jbmo)8Xfmf*._kl(kas8Mfns8;oprr4#9rr;utqu?]o +s7lWhqYSg]_RQB!o)Jahs7lKhrr)llrr"j>s8Dusrr;usqu?WopA]X~> +n,ELeqYU6jrsnu(qYKpal*4W%AVn.,aN)B=ai)6@bK\&P_TKd9a2c-?_oC$Bb0%rNb5TK]bR2M6aMu3=`Q#p=aS!^Sa9T`+ +b0%fH`l@nps2P)[U;dJ[b0%rNbf\/Pqof,dbf]Ou%*HfQaN4>&n]3B%c,dcH`ko[0 +_T'U5`Q6$Ba3)K@ahlBPaJiMr*@EM%[`$8.bg+SZ`kT7(`lu^,b5]Zub/hQB^r4OLd=2Z;J(2W] +^;@hfaT'6`aNVoQb/jS%r5eoXs2Ynsd)a55AkYK]8mo:"rVuiks8W&rqu6cpq"XaYs*t~> +lMpn`q>UQVj6,J$rs&E$s8DusrTX:lr;Q`nrr)lns8Mlpr;ZfqqYgQoqtpU:"s8N&ss8W)[nFQ,#rr30"q#CBnrr)lqrp]r<~> +m/I(bp\td#]q:ahg\:^IrVuoqrr2ldrr)lqrXo)-s82fos82irqu?Torr)iqq>^Bl$N'Ic[_Vb; +r;6HkrVlosr;?Qms6KXcs8N&[rql_Hrn[SRr;cinrr`5trVc`q'_VD(qu?]pq#B9l_n2q^qYgEm +s8W)s!<2utpAPU#rr2iqs7"Q_pAb0krr<#orr)isrr2iss8;iq&,uP&s7Y9CS=6+=g@kRHr;?Tp +rp0T7~> +n,NCcr;Z`o&c_L]OC2$rS\N1c_oKm=aN2ElaSj-Wa>h2\bJhWGbeh96^WOXFcHFAO`l5p:`lQ6D +bfn/Lbep>B93A1*`QHE%`5Tg;qoBu(bg"AO_nj71b07oG`Pop@b/)97RScC@ +huK=rrMrprr3#ur9=1arVlWms8;lr#5eH"rVHKkq>UEl!WN#rqu?ZuqpFHar;R'%q=jdd +rr<#trqufnJc;ABs8N<&r;?Hirr2lr!ri,srr3&ms7ZHl"Rka;m+MC +i;X;NSYVg[qtL-gs8W#rrr;NfrVuiq"o\Grs8W#rrs8Q&s8DfmrVlforr`9#s8Mus&H2=TV7FS? +s8;]ls8W)us8DlprVqHJUAb5lrVl]o)#jL3r;HZqq#CBjs82imrmf-$^9$#^rVu3_&-)Y/rVQWp +q>('brql`qrVHNls8N!!rVlfqrser+rVlifor+FTQCkGJr;Qcqk5Tr~> +ir9Mco>tWR=`(pg`l#g:`Q%AfrPnfW&]_u1ccsPYb/V6:`lZ`Q? +hu=)ThX'+ms8Mfms8W)tr9F:]rsJT%r;?Ehqu?Zqrr2rorr2p"r;$-brr3H,s3KZjs8W)qs8W)t +r;?Qsqt^-dJc;8?rqufqr;Zcq%K6>'rqcZis8V?Jp!r7)s69Lcr;Zfqr;Q^#p](9krVlclrW<#p +r;HX$rquWls8N&ur;Q^*lJ1gkpYu&Ls7uWms8D*[J,~> +iVs5`qnnqrRa:m1s8Doqs760fs8DrsrsJT%r;?EhqZ$Norr)lnrW2rqrVuos%0,k\X0oqBrVuor +r;Q]qs82orrr)kJrh9>kr;ciprr`5trVlfrs8EQ/qu?Top\s3e]#CVcq>(!RrWN0!s8Dlprs&5t +s8;iprVHNns8;lorrE#rs8Vj#]UbgaUn-$6s8N#t!<)'[J,~> +ir9Vfp#;BI=&4jlb0.`@_o9dAb4 +hZ"&MkO@+'s8;lrs8Dimr9=1jr;Z]ps82imH2%49s7?-arr2p%rqZ?ds8W&srsHs5mJm4_r;Zfr +r;?Qsqt^-eJc;>Ar;6QoqYpd!r;ZEhqtpBms6p*[jN[Z'l2D1hrVuoqr;69ds7u]pqu?Kks8;iq +"T8)mrVQTo&GuM-qV(E+lf@U9s8Mrrr;GaWJ,~> +i;X5_o=1BiUA"TdrVc`nrr;QgrVufp&,cJ*s8VurpNH6+s8V`hs82csrVQNks8N!1s8D>V\&nFF +rV?Hmrr2rqqu$Hls+10@rr)j"rVZTlrqud*qu?Tks8D0"]XkMMr:oIS%f6/(s8;flq"t*es8Vur +q#19nrVlcq&,H/'rr2rmgRk=8St!=]rr2ouqu,XVJ,~> +ir9Vhq!6Ld=^#(>bL"2C_8FLBb4I0aNDZLb0%fF`P]^Ac,7<5 +bK$_X>&0tP`koa8^q[q2aMu6Bb(7X,a:?A:c-48J_o9dEccEr8^Ac(]\AuM/bd`R$.k*8G[(= +h>[o;mbmm?s8N#trquTil2D(ds8Vojs4JhIEqK))s8)`nrs\i&qu?]pqu?]ifAlf,rrN)trVm!! +r;6DCrh08hr;Zckrs\hurV6?js8VHUnF,-1s69L_s8DorrrE&trri&qqYC0erW2rrrr3T0qtU$c +q>^Kkr;ZfQl0\',h#@ +iVsAdrVH#RUnQ!'s8W)urr2rgrr)lprX8Q%s7uKjf-DGUo(Dt]rr)orrr)usrVlZn#QFMEVmFtJ +r;Q`rrW)utquH`qs+10Brr)lsrqu]prr)j-rr;uss8)N+]!f,Qo_SUfq>U9krVlZnrVccr!<2ut +"SVllq>^9i!WW/urVZ[$q>LctjUZ).NrVuosr8ms/~> +ir9Dbqt97!?Wg?`^X:(#_Z.j\b4beq9; +aN_PY;GD54]>_k5`P0++aN_rJ_h#n$aSZ5t+Xe^$POhr;6 +h>[oPhs'(qs8VurrVcTjlM_=oq>('jr8'%N,pAKKq>^9drr)lsr;Za%rV?Kjs6\J$qu6Trp\Xph +s8N&uJc;;@"oS8qr;Q]lrri?$r;?0brsA#^oAo!4s8;lel2C\]rr2uqrr32urVlispAape!W;rr +rt58-q=jd`s8Mrrs8(R8o(;/?rVllorr2utk5Tr~> +ir9Viqu6Hi^Rh6sgA1aIs8Duss760fs8Dp2s7uKjs8:_)*?H2]q"asds8N#rrVZZprVZ[1r;ZEd +`hp5so)Jadrr;rrrr)iqs8RZLT`4rj!<2rqr;QZp%f?;+r;=@B\ZWI8s8Dujq>U9krVl]o!<)os +!;lcq#5S5ss8Vfmq#: +iVsJeqt/s0>$"q#`5op7_9U9Io#UdLrQ$nC_o'XBaJoCS((#$-a3;?=aNVoRbfn/I`Q63EaMl': +`Ql96GsbAWVo-Qma2c'9aN_rJ_o@8KS]Dhqc-OYW`l5s;aMkp/`k]a5XHu1%-R_cb^;SF?bkfEX +`r4!U`X^&2bK7`Fc-!rEaN;ZAanWsW`r=*raMu3G^ +huE`U$ifSWkN`*IqYg9jqW[tiqu?]or;ZVE,U4EZ\,H4%qYgTpq>:0jrrN&squ7)bjQ?@>s82Zj +qYU0frVqHJT`4uhs8MrrrVd6'rqufrp](9Xp$hM&r;Qcpl2D4krr<#srVucprr)`ns8Vlgrr)j7 +rquKdq#C?ns81j9lgaEBs8W)us8;ips8M0\J,~> +ir9ShrVccko"Cch[HRPgs8N&snc&LerVd?)s8W#ps8%3d*#^$.qtg6err2p%rVZZos8VuqrsS\t +\Z`Eko_e[fs8Drs"TJ>trr7QKU&P)ls8N#q!<)os!ri/trVm6#rqXFK\@/=*qYL3kqu6'a!<)os +s8<9(qu?Zoqu6Wqq"k!hs8DorrrE&trt##*rnX`KSY)Ffk5YD[s8;lr!<)'[J,~> +hu=2blHtAj;/rVTbK%NFaNF(prPnfW%`QZ8`lQEE=:c5X%$T,^rl>)^rQH/#`Q$0KaMu6=^;\%5 +_mj2PmV`llQGa32NGaN)9@b0Im#a<8LA`lcNLb/VE;b085R`kn'M91V]PLX#Pfqtp6hs8VuYs*t~> +i;X;cqZ$Tpj6>A!s8Muls8D3]%fcJ*qZ$Njqe@LNpq=sjdqu76+s7cQni6pW[s8W)m +q"OR_rVllqJc;AB!rW&srVuoss82lorqlcqrVm#dnF?(krr3'!qYB@S&-)S)rVccrrVZZprVuil +s7cKnr;QZps8!,rq>UEohr=1qk2uR?rrrB$s8N#rjo9i~> +ir9ShrVQTorSF<>R+_66s8Duqnc&LerVd?-r;HKlrVH>#)]TnAh>7*Hrr2p3rr)fprr;ipq>^Bk +os:F(h"^pLrVca!rqlWms+10Crr^ +hZ"#Zl*k8(:QrN:b/MQDn]:[KrQ$q?`lH$Eai;b.'+bNT][P3Nb/hZHb08#I`mN2T`Poa0_Rd_+ +_l[<m\`5Td;aiqlHaN;KGa2?-ta +i;X>brr2rtrS?`!s8W)ms8N&XrWi9l+<_pYpA=[b"8quhq"k"#r;$?ls6%>[o)Jaep%%kUrrW,o +r.4j?rqucurquNdrqu]o#3tXIo$RL:rr<#t!<;lo&-)J*rV-?lrr;lqr;Zcqs60F`r;6EirrVue +pAY'qiU$%,kNMdB!ri,sjo9i~> +iVrrWqYpL%p!&nqV;V:Orr;lcrr)ljrX/Vt6lI!b-1^m1rr2rsrr)lor;cirrs/Dpae68koD/@b +#6+T!rVlcqJc;>Arr)iq!WW/urt>>0r;6Hh_n +hZ"#]p"Z0C;HTU0bf\&In]:[Kq8iQX)U[@t$4@1Oe^Mje`l5s=b0%`FcdBtV_8!h(rl#Pg_7G1i + +_90m@b/MQDaMu6?rPnlYs2soR(WOA3b0A8V`l6! +iW&rW%fcJ's81X8mGIsBqu?Wpir02XkU%As)IiI:rWN9!p\4U`rr`2rqu$Em#L)E,s8VH[qYgEq +rV6;Arh9>hrs&K#qtg-_q>C7!n+#u +iW&rW%KHG-rnOHDV69gmrVu`arr)ljrX/Vsj<5E_'OCA/rr)lrrr)lqr;ciqrt>8,q!b#ich7>3 +s8W)qr;Zfrs+10Crr2lrrr;uurr2p+rVuljs6%A8]=ag/qu6TtrVQQlrVlcq!rDrorr3<#rVl`p +s8N&rr;HZ`rqud-rVZNiqu?Wpq;eHDT9u+AjSf)8s*t~> +hZ*WO$LtfQ=]oIQ_9:0Bn]:[Kq8iQX1!e:i$O74G8(H)4`P]U5b0%fHbfn5L_84.4b/hQ@bfIAg +5ZW<:a2-*I_nX.6dE]mcaJ-cTarAF@`Q$'Hd*9MGb1+;.Fupum.kR-n_T0d=`lJ)$s2b/Y&&HH+ +b0J5Mai_]JbK.fC_u7UTaT'ERa;i4=`QHHMbfIc?ahPp,ULI(o78R^@pAP$krVQQQs*t~> +ir9)Zr;QWo"7tR7i;W`XrVuoWrWiK"Zm7+D,_l0prr3H)q"Xads8Mojq#: +i;X;ds8N&up!T_0T$m<3q#Bm`rVuQi$30e*+!_aHK)GWHrr`9!r;HTos8Dusrr2utrr3/ul^593 +nGE7crW)tLrh9>irVulrrso&.s8Dlor92/7[(;n-qu-NprVl]prVlfnrri2us8)QirrW#nq"t*Y +rr)j1rquWis8DuqqR`>lR\HA!qu-Qmrr1mVJ,~> +hu=,`q>0gHZYroCMS%*KnAtRJq8iQX1!J(nOpMg2$Y@l4`PKC0b08)N`P]^:`l?6KdET\Mc-4&3 +Tgi.,XN8;ua2l9@d+$9jaJ-cUas"jG`Poj +ir9)Zr;$6i"6\V-l2:S@rWi>sr/DpH,)Z6rrVm?)q"aphqtTp\s8Voiq>UBq`p*9trs&H%rqlNh +r.4jArql]urqlQeqY^@%jmh[!ec5[Ks8Mojr;HZlrX\u,s7lWorql`iq#C9lrVYjXs82lrrVmB+ +s8VN?m.BT&kPtSYr;Q]q"9/2proO01~> +i;WiUrVca%qn&MpWo!OKrUKmcs7Q?tqt^)F*ZlDWr;QZp"9/8rr;HWsrr)iqs8W)srseM`S%[>E +s8Dlqs8MrrJc;ABrr)iqqu7$&s7bira1JdZo_JCa!<2urrr2lrs8EK-q#CBmqZ$9`s8;oqrVcc^ +rr +hu<`Tq#:*rl&K.N?(\mL`5_AhrPnZSrQ6h7ajb,6$jULqb/M35`QHELb/(g0`lcNOdF6F_aNVlG +^pTt$>_&lf^;J"1`R!&XJ]OS,s2k>]rl#YmaNMWC_nELTI3omR0Li%R`Q#p?aiaV-s2tA_rPfAe +aNMNIeBQ.``lHQLbf@[#`rF-[b3m@LaplG3^:V"2=]A6l>)qS:rr3&sq"s%MJ,~> +ir9)Zr;6Kn#Q+Ats3pE%h#793rr +huE`U$N9i$s5KZHU8RV]nG`Cdo`"mj#4ZLW\+'@qrVm'#rVcZmrr2rtrr2rtrVlg,qtg3JV8(CK +q>U?ks8W"JrgNicrt,2+rr2'!^VI"VqYU*grr)fps8W&rrr)j-r;Q`ms7cQlp](9js8)corVu9a +s8Dlp')h\+p@Y>[S!g%LmJ6b\r;Zcqi;\<~> +hu=2`qY'X^oYbTP^W"IFci)*%bfIfJ +_SEjQ;-Ik7\A,boajA;TJ]OS,"Nng)`Q%nu)p-(7\[.uO2\?lZ9s21Hc,R`CajADU`lQ +ir9)ZrVlcq#5S/rmc!NfrVtjU#5%rpptu#IqYgQoqu6Tp!;uils8*'!s8W#pq>^9irrUd6li-nd +qZ$ToJc;8?s8W,u!rW&qrVm#lkOmTjrr3?%s8N&urqZBhrr;io&-)Y-s8DcnZhsRqrr2rrs69O] +rr`2rq"t'j#4CX@mI&X*rVm-$r;ZfrqtpBRs*t~> +hu=/brVlisr;":#SXIjus7-*es7Q?ts7H?ip>,TArVlfrrr*'#rqu`oqZ$Tos8NW+s8;oli2X?, +li7"]s8VtIrh'/is8DrsrtbS5s7kWu]>Ub^p%n^bs8W)srr<#tr;HWmrseu+s8;ZlZMF:lrVccp +r;Z0`rquirr;R?(o=UonS"ZA(rVlirrqucpqu6ZqkPp&~> +iVsJgs82ZirVuTQS6]#cL:>1Bo#UdLq8iQX1!%AKd*^1Je'ZF_`l5s=b08,S`PKC0bg4PXaN2TJ +`l5d<`Q#Z[8Q'N#]YD2&ccXC]aJ-a#b/hQ@`lQ +iVroUrVm9)r;HZqhWt!mrVuoVrW`Dur;Q]os8)]rr:p*drr`8rq>:0krr)ruqY^?pdF@[brrDur +s+10Drr;orrY>J4rqu`os8W&algX-0s8W)qs8)Zmrr3*!qYL-drX\o+s8MupZS>Y`qZ$KlrVu-] +rVm<(q"4=Zs7+t0o'5Jlrr3#sqYpKsr;$0fj8XW~> +iVsGes8Mrqs8W)nq4aIZT&TV:rr)lirrC6jr;Zcq!<<#ss8N3"qtg6hs8N#trt,20qZ$Qm +qqnBPbjbQ-qu$DDrh9>gs8W'5r;6Nii5WC@ZGZ)0qYpNos8MrnrVlfrrr2lr%f?;+rVZPt03J2K +s82cnr;Z0`"9&/rrr)j-r:n*tR@]hDXS);es82coqu6`ss8M3]J,~> +ir9Vhq"jsfs8W&kl.g/[<_K(#`q%4L`qd^Taqr.=c,IiLc-4PWaN2BBb08)Pb08#J`Q%nu'ZIu/ +`l?*E`6HBB]9Q8dCmq]F`Q*PNTZI/U+i_F;`QHHN`k%dW2]3\o?(/F>`Q5m7aNr8X`P&t)b/h[& +`Xg&4c-=P[L^#T`c.:(]aijY&s2b5_o#M]kc-42H`Q69I`4^_$8k;-JHeRc`s8VrjrVccqqr[p/~> +iVroWrVlorqu-NsjQGjZqZ$Kms8N0"r;?*a#QOSus8;iqqYL0nr;$0drVm#tq>C9mrr*'#rVuok +rVlrRg?AJ7#lac$rqu]kr;Q]q!<2uqJcUBqqt^-Ks*t~> +hu=2crVufos8MiITpV[Up\asgs8W)t!r`,tqu??g#QOW!s8;iqqYL3jrri?!qYU9kru(h7s8W)s +qu?]ls8M]Q['7C-r;HNmrr;usrVufprr7QK_>aH4q>LHorr2`n%K?>&s8(Hb^U^;Gq>0scrri?! +r;6Hls8N#qrso#'s8&rF*?nPYqu6Qlrr)llrr)lqrr;uurr2irrr)j*q"pSSTU_dNo_JLbs8Muo +rrE&[s*t~> +ir9Vhq>1$hs8;`ipuo,#92Js%_u@aU`rF-[b5KE[`qd^Tap?)2^rXd?a3DX&aSj6aaNDcPb5TE\ +a;;h5_o9^>b0S;Kb/Cl^=%m.e\%fc#b0'\(rlP;``l +f)GmChr=.gqYpWqr;?Nns8)foir8uU!<2ut"oeGtrr<#prW<#pqu6TseDB]os8Vm"qYp?jp%eOb +rr2utrqc]nJc +huE`UrVmW3q=qn&S#W^hrVZTjrr;uts8Dlorr2rWrr;uurr2j!rr<#trVZZpr;cirrtYM0p8=k# +f_kdIrVliqs8N&urVZTlr;V?I_u9r?r;6Ejrr2lqrquorrVlTl%fH2'beh0*VW[gRrVlirrr<#t +!WE#os8Dp-s8)ciY9G&)+"+YtrVuoqqu?]qrr)lrpAYa's8;cos8)WbV4sNMUn?B=rr)lsrnd[*~> +irB#Vs8O&:qu-Qppun8Y92o<2`l5p7`Q?'>b08)PaMu6WaS[b/M9 +iVroWqu?]qrr3,aj6>_'rVm#us8DlnrVuop!;t1B"8quiq#:9qk1oG&rVuop"T8/mp&=pi"8quj +r.4jarq-3rr;6Bip\4R^rr2p#jmDQsf)G^7rX8c$pqS-q*@<&)o_e^e!<;oprVlotr;HNkr;ZWt +r;Z`qs8)`p#3Y7 +huE]Trr<#r'D2%,URS"1r;Zcrqu6Tprr)cmrr2rWrr<#irr;osrr)j%rV#fhVS:[Urr3#srr2ou +qu6Tn!<2rsJcR$s8Vrqrqa:-R\-.>[J'RNs*t~> +h>dNP!<)os%di,)>XhGP_8s[>_SsI7rlbDa`o"l;`rF-[b5BK_as"jKc-=>Lb082S\>WV"?[o,n +a3_`Caj/2TbfIc@`Q$'CJ]P^L!6Y;b"3Sj3b5TBraND`Nb0&#L`5fj7_Qo_&.3T]`OKlXna9'B# +`W!mVa:HJ7c^kLQ',Lapaj82SaijS$s2b5_!6kDd!mJg.rPfJk`l>j8b/V`J^N`sF4[iD2iV(n' +J,~> +gAh3P!<)os"5W&"iVriZpAOphrr2oss8::DrVlutqtpBlrt",.jRW?NpAb0jr;Zfpqu$Hn!r;Wh +Jc,pOUhp&G'irr)fkrr2otrqu]k +rXSl'q>:-jrr;ZMk3qKtime!Y~> +hZ!TTrVmE-qu$;^MVsXB\fDg@~> +huiQ)2B`Q#p=aSa3[a8jB]aT'E_bR_e1_m4G] +C3ukiZHC>5bK0\&s2b5[!m8a0J]PaM#K=Hm`Q63C`r +gAh0Mrr39#g#M#Ls8Vohrr3-#r;Q`rd/NtC!<2uq#QO`%s7jFmoD\airVca%rqlNhs8W#or.4jb +rWW5pq"ajequ?Qm!<)iq"Q].Kk1oq8l2D4ij!>lk*[6F4rqHHks8)]err2iqrql]trquZlrVm&[ +l1F/qhUDLT~> +iVruYs8N#t%fZM.rVlWfc_ID0XS)Jirr3#trr)lTrqufhrr)cqrr)j,q>^0GTYAbIp](*hrVl`n +s8W)ts+10erql`qrr;rsrr2rtr;liprVm/f]tD"]Z2aIrmJd(a&H;La+s%X?*/!e[pAb*kqYgBm +q>U;dLVr@IKrn%1#~> +hu!l`1!pW+H!aMYp:b08#L`lQ$@^77u+ +DP4)J`QufL_SaC9b/h['b(7XOa90Dq^;9ce)90b;`P]U5c-abYaht]kHorf,0M/[`c-=E%a;<(C +aMu3<`lcK9!sJl5$uO;;aO/2U`5hhrp;m9Rrl+oW'$/5Bc,IK:_5(a<9hJ5m[-7>afDg@~> +g]%EUr:g*frr3Gge*6&ls8Dror;Q]nr6Gs8V<^&-#ue.N:!no`+jes8W)os7uZkquH`ls8W'.p&+jhs6AtB +l0%*\s8VuIs*t~> +iVroWq#CBn%Jfb3TV/(0qY^Blr;Q]os51*jrStr2[@kb=pAb*hnc&Re!<2rs&,uT6-RKTXJFW[:qu?]qq>C9k +rqcZmrr2j.rr;lqs7Z)gStVREWjqs)p\reEJ,~> +hu*leR_4;,E7d`mW&Qbf\#H`PpcVs2G,Z`lA#!r5ScX+Nh^?_8sjCaMl-Ac-k%W +X$'!\VR=Ie_oB[7`lQ`Q$!@`k%UN1F+@rEO!+#b/s4q(s:+J +b/VE>`lupm$4QtKB@>GUbK\;S_p&)!s2Y8aaN4>"qSa,faND`XbJqE/[;Ar?6q_$Jiq2rqs*t~> +g]%EUqt^$arVmG[i:#J#s8Vlkrr;uqqu$Hndf07G$2j\trr<#orpT^_rrUd"g%kXMr:os[rr7QK +_uBW7!ri,prV6Qmr;?QkrrhNEo((B1rrVoes69Lnq>XG=.=_6mq>^KorVHQmqYgQoqtpBj!<2cn% +fZ:uqZ$T]lLF?1in+50eGk%~> +iVroWp\ta&r;6#aS"ut^9is8;lp +rrN)rJc +hus2G)Y`r3sY`r3jq`lQ5bc-42HJ]P^L+NhsQ`PK:'`QHTWdEKVJ_847*[$4B7*$?Y\Xieu/]uKWa +(s:+Jb/VE>aNVrc1B@bef@7sfccXAJc,KY$s2b5_!6G/Zs2FuTs2>YkaNDZMccsAEZ[,VC7SQp' +f^\ggs*t~> +iVroWqu7*&q=s[_rVuooio&nTrr39"rr<#tq>($idf07G"8V`fr;HWrq=ade"7^Bg +q>C3kJc:-grVm#Zlgj&_rr3,us8W)ul2Ckdq"RsJqYpL!rVQWnqZ$ +i;WfVq>Uj%s7uTjfr1C4V<@CIs8W)trrN-!j8T#WrVl]os8N&s!<2rss8;rprVm<'p[ZY#^!lKN +rqHBjrr3#urIOsarWN2rq>1$ds8W)srsSN"lG^TUY+t:Qs8Dlqmf*7d&cVb/p@VF?q#C?nrVQWn +qu?His8N#ms8Dp.rVlcprVuomi0pI.S=Ze=rR:ds~> +hu'm'^V';-Tp+cHX>G`Q6h9jVk1]Z8(:bg"DT`l#^6J]PaM+j/'UccsPM`Q$0Me'H1U_nN=VFZ(6[*%R8ZbKIuK +_8sXfa;E(Dbf\#H`lcQUcdFRYdb3'raiDQE_Tfjo`rF-Zaof`)`l7qps2>&ZaNFM+%*Qu<\X6&i +7S6U"\an5LJ,~> +iW&rWr;R9+qY9m`s8Vurn_rcqnGiLes8N9%q>($is3glMs8;Zdq>C3k!r)Nfr;Qi:hWXt="9/2n +r;?SGrkna5rrN,srqccprr2iq"o[KGp>Y04rrr;ts8Dinl2D4lrr;ojr;6KmrVlisr;6NjrWN/r +qu$Hls8W)sr;Za,s8Dusi:641n_s +eGfjSo)$J)Tq/^jp&>!krr)lUrr<#qrqufqrW)oprri;ur;ZZnrt55-o^&-T`:Wd'rr2rsrVc`q +Jc +huC]ZS..`luiV`l#gUaT'6\aNFM+!Q`7Z_^*4Bb08#Nbf\#H_o'I7 +aN_lJ_SE^Y5YYd][*$V=dETbO_84-BaMZ(BbgFneccX8H`QHHQccX5@Z(>ed+!;@dQatDcbf7K7 +`l@De'$AGCcI(+eb0S;Vb/_TFa2Gm;rPnlYrQ5Gf`l5j5`Poj,Z:/YQ#kkb>Z +rmq+"~> +ir9)Zr;?Hl"8r&nr;?QtjPoOlrVca#qZ$Kfs8DuWrWE2qs8;lr%fHA)rVufqrVcZkq"Xacr;Qls +qtpBkrs[B2k5YJ\qtg?ls8Vuqs8W'"s8MnHrlP->rVHNqqu?TlrrqrQo',&_rr2utrr3*"r;6E@ +rWN/rqu$Hmrs/Q%q=sjaqYgBm#2eS2o]b91rVuosf)L7~> +huE]Tq#:s*r;=-rS"dt#r;Zfms8W&trSd_es7lWkrr<#rs8DrsrVuiprqud!rVZTlrr2rtr>5D1 +oWG4&hu!^?js82fqs8N#trqh9Gao3(OqY^ +h>[TSqYL*frtPG/qsiKu<_?;=]>;D)_pI#[ahc!Ua;)S9bL"bdb0%W=ahu3AbK\;Ub/hTArkfbq +`lcNMb.tZk>t\(LXi/W3d_s#?]uJ4;aN2NF`IZ+Qah6X`PojUbl,]`bQ,`Z`r4!Yb5]ZdaN"1t(!4P?cHOJTai:j!A5Plj8m7eC +pA4[9s*t~> +ir9,[r;?Qls8Drorrh9SkNMpDs8Viqqt^9NrY5;1p](3cqZ$Qpp%SL_s8Dijq>:0grrrE!q>'pc +rr3)fcg0oqrsSi+q#C9jrVZTms8RZLb5MYDrVZWns8W)trrE#rrsIcJkO$s^s8Vrnrr2p"r;6Bh +df0:E!<2rs#Q4Jtq=XOZr;Q`rk6gYIn*fQAs8)cqqpk^s~> +huE`Up\tm*rV5ZQX.#m6rVcWnr;Q`ls8V*X%K6>#rql?_s8N&lq#C6gs8W)srVZ[,rql]irP4u= +bjtf4qYU +h>[TUqY9pdrtYM/qZ$EWb%b +ir9,[r;?Qars[`BlJqpErr;rls8N&WrX&N"qSlInq>UBkrr3/os8)Qer;HWqrqlWnqtpBpakcIb +rrW2trVc`urr)irJc +huE]Trr2utr;RB.rVlTGUR@jThXgF?s8DusrSd_^r;6<.:uD!ErVZZp!qlTlrr;ur!<2ors8Mus +$iBkojdW?jn+lhYrVQTsrr)irJc +h#@HQq"k!i'`7\%s8VuYY[gI)>ai7Qb0&\a'ZS2:SLqS+f$DF\bfIHAaNVlNb/jM#(!+PA +bg"AR_nj*oSOH=eR'Fh'S_84.6rlkbl`PK=(_oBd?aSNpRa<8XLc-=JR`l5s=bL"JUcH*c7]7NpM91Ms"e+EG/ +o_/76s*t~> +ir9,[r;?Qdrt#&-s75.4jludEs8Durs8:jTs8NM^-79qnrqQHlo)A[hrqlZo"oeDoq"t!grWE)t +s7Q?j"6.bqnbrIhrVulrrrN,tJcs8Drpe,Op~> +huE]Ts8W)trVuos&,Z@naeY])Yh]*Rrr;utqr.PSrs@@',95J8pAFs^rr3*"s8W)tquH`ps8Dp, +s8N&js8;][ZCo"as7lNkrrE&trrN,tJc1$grrW/qrn%1#~> +h#@ZYqYU!!6Y;bs2t>^ +'YMW/^SY:"?%',g^W4IcH4,H^U9eg?8aAb/Q\pjaP+eU_84%.`lQ_nN[=>uF*d=)G28rqH-Yp=0+m~> +iW&oVo`"pjrr3B&g>CoRs8VurrV6EOrWrP_/gDJ_0\64%rrrE!r;QWnrVm'!q=jXZqu-Nsqu?]j +rVlunb2VL]s8W)uqZ?`rs+10irW`E%s8;`hqu-NumGmQjdd[58"oA9!qt^0hrrW)nr6kTEquH`p +rrr>tq#CBmrr3/Zk2tjgf)>UNrq?9heGk%~> +hZ*KPqu76,s8W&lcCUK!]Cl'os82QjiVj/`i%,rh*@oS7rVlisr!*0#s8Dlmr;6Nnr>,D0s8Vil +s7Z*0S@6<6r;QNjqtp?ls+10jrr)j1rr;uss8Vure\]/!S'1I(qY]pZrVlrurVlfro)A[hr;QQm +s8N&um/Ht`(&mk%r90oLTqe0Ff_>%;s8;osqY^?Es*t~> +iVroVq>UTrqtg0drr3N-o%]jFla:HM#"p+r8(qJ>Lc-ODI`lS/!rQ,#]rlc8& +aMu6=bgF>NbIt0-5#YjfZbsZ#`Pom>aaqOSa;Dn2^WF^A`lH*>WJa%_,UYNsZH159`5g.$`rF$X +_Z7^IaT'9[aT'BaaMu3u_Ze$!aN2B@oZ/,sbfn/J`Pop@bfnGT]=tnO>#S?r92r@cpAb$\pA4d= +s*t~> +eGoOI$2aZ!s8Ua;hqn#(rrW&qr8IVcpKT0i,:"V`rV?KirVufpr;Qruq=j[[r;?QurqucorVQTo +"3]-Mo)8Rkrqu`ps+10krr2p!rqZHirrr>WhW*&PrVllprr3)rqt^0hrrN&pdf'@HqtpBkrrW,q +q>C6skNqKsjP\hlrr`2rr;P4GJ,~> +hZ*WTs8Dusp\t^%q5C?aW6G,9CpAam[qu?Zjs8W)sr;HWpmf*(_ +r;Q`ro`"ghrVlis&,lP*q>]`hUR@dLTW.bZqY^BnrRV"!~> +irB#VqZ$Ql!<)iq%fZ(UH>ZbmL:=t4a32lQj2`1^bfVgQ#n[^YYgph;_Ssd<`l5s;aNDZLb0%g' +`YQhAb08,TaN(EN6qM'IY.DToaMu9BaaqOTaIb08)P +`kfL2o#UgQ!6G#Vr5eoXo>psS!65#W(WOVAbK\#?^SG^G7o3/fFQDuis8DilrRCjt~> +f)PdLrqm*"p\Xsis6Sb'h#.0Qp&*hK&-)J%IOZ?\,UTeoqu?]jrql]ur;6Bhrqud$rr;orq=t!d +rr3)YbM_mgrri?!s8W%KrlY6>rrW,prVlg#kk+N(de<\?"SVlqq#:9m!<2uq!<2ute,BIIqtpBk +rr`8ur;HWp#4'e,puUN'rVm)mp\b!grqb4GJ,~> +h>dHPq#:m's8;QU\"f[qg%b:@s8;oVrX]&(pN\#")'1!)qtpEnq#C6i!<2ors8N&s(]++-s82`o +qu-Qg_5"EXq=t!irqufrrIOsirW2lorVmQ*k/"jGVl&&As8Vins7lTns8N#qrUBgdrVulqs8)]p +s760errN-!rr*]2qYU3V_jd6jQ_M4`pAP$crVulrs81CIJ,~> +irB&Ws8)fpr;Zfo!<)lr&H2M+s6J!`?rpKn\%Bl3ai`Yb&'E5BemfO,%hK&*c,\#M^])5!`Q$!A +c-4>L_8!h*b08#PbL4PTcGIK:X`$j5@%OdJbK.]FaiAtRb/baG^r+78be]lp2Cp@*4+FKH_Rn"< +`5os:`QHTYe'5kJ`q.7Yb0A8VaMl'7`Q64$bQ>r.`r4!Sb596[`W!ah`lcNJa2YopI83@*6s>St +kP4rGq9f4m~> +fDkjLqtpHnrr3G]hW3Mgs8Vllr;Q`rrr2g!rr<#tr;?!^%K-8$JgDWb+Y1"urVu]ks8W)ur;Zck +rrMlnrqlfnq#:9qbhh7Rrr3*"s8W&qrW)lqrW)ukrr;nIrqucos6BU\rrr8`n*Sd%rr36%r;6?d +s7uZnrr`2rqu6Tpe,BIIqtpBlrrW2tqu-O"map^nkj[@"rr39#r;QTkrqlTlfDg@~> +h>[KSrr)Qj%K65$k,>#NV9er4qZ$Torr2rrrr<#drXSi)oR.f%)]U95qYgHjs8Muorqufrr<)rp +s7cHk%f-+tgnD'djn/TOr;Zfqr;H]rqu6Qoqu6WqJc>ZJs8W&s!<;Whrr;rr%f?;+rr2]M`4i[R +`Td-prr36%r;Z]ps8N#rrVuforr)lmrr;rsrr)lrrW)obrr)lqrY>J4s8;f_^RqEsPc(;)qtpBi +s8W#oe,Op~> +iVs#Yqtg9hs8VuorrE#srtkY&_fK!^=GON*aO//O`l?*@b0%fFaN4A'nAl-ac.L]a'+kTV$&csJ +bJD=!`Y$A;c-=>K^V7J#b08&Ncc+2SrlYee_6Stf9j3da]=u,%b/aG$rQ>,\rPjE0p;m*MrlG)] +prNHSs2ZM/aMGd3]="2E3$TIg@\UQQ`59F1`R2T@_SaIBe^`!e`Q63CaSj-YaSj6laNDcRbfIc@ +`Pop@bg"ASrQ+oZ"3AX+b5B?\`r3mVa:l\%k;1q"sd`s8LIHJ,~> +eGoRJ!WW/urtGA2rVbF6kiVpFq>L*ds8Vrlr;6Kn"TJ;qrr;Ke%fQ/%nqJJ8)(@$1r;Q`prr;cm +!rr9!rVm*$r;6 +g]%9Qq#;'+rr)`ns7GBHUn+@=rV6EkrVulorr<#t"o\H#rr2lcrXJi"s6kO_*>KkIp\Xsiqu6Wo +s8Moq!<2ur!<2rss8<9%rVl9+Tteb9p\t0mrVca#rr;uqrVc`ms8Drqs+:7Ms8W&us7QBdrri?! +s8W#rrt###k.J:?ZD6=WpAP!gs8W)trr3#us8DrsrVufqs8W$(s82fqq>L3is82corVu]ms8Vck +*rZ* +i;`iUqu?]pr;Zfqs82ir)=,:W=\;VY^qe=;`5KR1aj82N`Q$'FccjQ$a<8UGgX'R@#65#3cHFAP +`Q#p=b08,Tbf[rC_8F10`lQ6uapc>/_S^Kl!<(OLJ,~> +c2SLTq>C9lj6Z*is8V`ks8Dutr:0U^rr3&tqu#s_rr3E*r:cp1/L@e(rVuoro)AUf#QFYuqt^6i +rVlg"r:8(jir&fYrVQNkrr2lr!<2rprVlcnJc>]Is8Mlps8N#qs8N)urqufq#6"T$rVcThrVm6$ +iqi#nhZ*WNr;HWpo)8^jrq??k#lal%qqe+Dqt0CWs8;ipq#:EpqtpBm%Jff!s82irg?\S&mFM47 +rrN,sr;Qluq=ss@s*t~> +df1![r;HQkrr<#me"`P/W:Ku\s8Vuqrs/B"s8Muqrr;Hdrr3K+qXg@$.3Ytpr;Zfrs8W)ts8Drr +r;Qp!rVc`pqu73)qYg +dJs7F!W)Wkru(+$APZ!(X2VftahYj>bJqcG`Poj@c-=JTo#M`kb0nSad=DE1"HM'Yc,mrE`lQ^0^T`e`7TYG>Y//#o`Q$$Bbg+PYb/hZDrPefVs2b2^J]Ir7`l?!r +_Z[ruaND[)bl#Q]ar&.=`5BR4`ko$SP[Gmo+s0FN^VIt6aMl7"b5]O"`l5p:aN2NHbg"Y^^rF=0 +`Q?r.aSX!Wa;2q>`PfjDcc#@mV;HTdUp\FgkrVQKjfDg@~> +c2RhCrr2p.p#kQ!i;`iSr;-r,II@Is8;osnc&Of!WN#rqZ?]p +rql^)f[8aEs8W&pqu?]pq>:$g!ri,prqQZnrr<"MrW`;tq>:'er;?Qor;ZWor;Q`qrr2p$qu-Qp +qu$Hn%HQpMjkT\3s7Q0eq"t!Zrr;j)s7ZEkq>:$+,pT\ks8V9]s8W&s"9&/rrr2otrr2p%gu%,\ +mb-t*rrW#nrqufrqZ-WIs*t~> +dJs7G&c_k/rr;rhaJPZ(XlKHVr;6BhrrE&tr;cirs76-us82ipqu?,k+L1b@s8;iqq#:9mqu6Km% +K62%rr2ffZD=tMo)8OcrrrDuqu?ZprVZ`qqu?ZoK)YWHs8N#r!<2rsrr)iqs8<$!p\Ogf&,bV)^ +:gYLf(&e8rr;ors82fos82fqq[NT"s8VokpV.gmY5&%sli-k_qu6Wq'`J%2s8MuprS=?GSXuLF^ +@D'rrVZZp!ri/te,Op~> +ci5'br;6Eho@ojI;bp_oaMGm5`QHBIccF)C_o9^Ac-#Uu%`ZB0c-P4iOoUNkdEfnSrl+u[b5KNc +b/h['`rF-[`rF-Yao]Z(`;[Ro_RZXO7oj,bWjT^bbK@f?`Q?->b08,SaMu-8`Q$("blGn +d/O1Hr;QTn"PDc#hqJ&/#6+Grs82]krVlrsqu$$a&,ZD+rVlWgs6TIZr;Q]ns7-*gs8W)squQWl +q>Ucoe'ZkArVuopqu6Ttqu$BkrVlotqu6Blr;Q]qKDklKrV?Kjqu$Hj!;u]n%fZA*s8N#ts7>aF +m-E?]rr36!r;?9`qYL-\rX]&*s82imq>ZF*)CHcfs8(pXs8W&s&HD\*p\b'krr<#Vk2bpkj4aJ3 +"TJ8or;QZps8LULJ,~> +c2S1Nr;6Hkq50m\T!%Y_rs&E$s8N&urr2itrr<#irX]&,s8Muqq"OgRo`+gfrr)irn,E:c'E%h/ +s8Dfjqtp!5XK&_`li6qZqYpL#r;ZfrrVZWmrqucurVZTlKDt`Iqu6Qo!<)los8<]3qZ$Tnq>^?R +e%rf3WNtsis8)cqrr)lprr2rorX]&+s8;onp\osq'I"XUrqbs[rVucos8N`1r;?Tpq"s!JTqJ6M +T<%DTo)8Ics8LLIJ,~> +c2Re>rq.,shK<.'9P:ZMaNi#MaNMWHaMl'5`QZQKo>h`f_T0a@ccjbk`6HfVbfI]E`l?*@b0%s) +ap$#3aMu&b/_B=aNVoTc-48J_o9Xa>jrWW>uqu$ +bPr1Rs8VuVV4ONW\FKOsrVuopr;HWsrr)fcrr)j*rVuosp%\Lcqu?Klr;Q`irWE,urr;lp!<<&t +&HD\+rr;cnqU_RD]AiG^s8Moqs8N#r!<2ut"9/8srIY%Fs8N#orrN,trqlcqrr3`4q>L +dJk9drr<#no_/(Wn&00G;cIeC_og0Ga2#U8bf[rA_8c#drPf8dc-anYbg4YXbJ;08rl4rYr6##_ +"jP94`lQ7"ar/FEaN)<;_SjO3^p8Va7TY23\\c>*`5B[?rQP\nb/VE>`lcNOc,tXZrlkAdrlbJe +aMu7!`?3+@b08#L`l?'Ftrd"IRHQ +lcB%Es2b/]'@"VBcGdZB`N3BI:/k%pHc54@qYpNoq>gE?s*t~> +dJj=JqtKmarrDinrt"&MkMkJ#s7QElrVuciq"t!ho)8gkqYgHlrVca"qZ$HmqZ#gZ"98B!rr2p) +rqZTkqZ$TRh;Io'rs/Q%q=sd_r;QHjJc>QErr*-"rqucnrr2iq"TJ;oq"t'j"n1jIlIY>"rsA]) +s8;osrV-3eo)A[f%KH8(i$T`o*@ObBo_ngLrr +ao;kKrqtcPTUqsloDeF^s7uTms8E#snbramrql]pr;HTo"T&/rs82ZmqYpNns8E#uqu.?1rqu`p +s8N&rs8M`hm&d+cbO#*%qtpBrrr)cnrVlcurVlcoJc>WJr;H`srql]urr)fprql^.jN"g?[]@RG +q>UEms7u?bs8W&qs7ZF's8N#tq#&ki*#o_<9AT1;s6K[_s8;itrVl]mrso"l\YkdcR@L20qtL'f +qYC-nrr)fpfDg@~> +dJj4Frr3u7p@e@]qWbe1=A`.B[*$2.b.Pa:c-48H_8F73o>hH^`50F5`lZQQc-=8P_ofgl`r=$Z +b5TWbbll83`lQ7"asbKV`lH->`Q#sGa18^R<(9GpQ)qC*]u%e1b08,Tccs\T`Poj_FR`r4!Yb5BbhL)M +&ek`e28%&SbNm7J`rF-Yaqi1AbK\/O_l@WU78?HVFh@&2rVufqr;QNmrR(Xq~> +d/O7Hq=jabrr2utrr3)RmHEC&rri>uq"ajds76."qZ$Tns8Vuos8W&ms8;lrnc&Lbs8N&u!<)ip +"T%lgs7lNls4m_6oD\amrVQEgrr)lrrql_IrqQKrrr;utrr2p$rquTeq>C3k"n([@kLnYhrrDll +rri5us8DugrX]&*qtd]K-QsKZD"RT(qZ$*bs8W&sq"tX$s8W&koDejUk4eK +c2SIVs8MrrrVcWTTqe0Sh>I*Hs8;lns6optqu?]ps8Vuos8W&ns8Dutrr2iqq>U?ms8N&s!W2fo +rY#80r;Zfks8Vril*ROqaQ`['r;HX!rVZQirVlfr!ri,rJc5lQrVlfrrr2lps8M`l)#a?rcG6rj +U:'Lfs8W&ts8)]krqQBjqu6Tpq#:6l%f?+sYTY,-(F3_cq>^ +dJj4Frr3i6qYBseqtKBiBNRl*PeY/Yb/2*:b08#Jrke`Uo#M?YbK7]Dai29BbK%E@`5]puaT'6_ +`Q#p=aSs?^bQQ)0`lQ7"asY9Pb/hZD`59O=_9L0A];/n48RRCS\@fSk_8a^He^`'k`PK=*`Q!JM +29`aMu*6`5KmEcc*oK_SsF3`lQ7!b5]Q_ +`Xp,+_9CK$(E*tq&5(-he&KN"aSEjQaT'BobK.`Dbg3D39LqH@UBqr;ZNjq>gKAs*t~> +dJjCIs8;ckr;HX+rr<#^kiV!^pAb0is8N&trqccps8VWg%fcJ(rr<#srqcWorVufonG`Cas8N&u +(&e14rqlWlr;6 +dJj4Dqu79,rr2rtqn](rU8?98qY:*frqufrrW)uhrW<,uqu6U$rr;lqs8N&srVc`ns7uZms8W)u +r<3#ts8N#rrsnu,q>^Hns7XU2UqP@Eq>UC%rr)cmrVc`ps8N#rJc5ZKrr)cos8<&trVc`kru1k6 +k0UiT[]-t+qt:!brVuoprVccpr;?Nnrr2rnrql^(q7@jd)]U&ko)JXbs6fmYrrW3"qYpL-oZs)! +R@B_Cd.[D:s8N#tqu?Wmrr`9!rVkFKJ,~> +dJj4Dr;R]6qYg?lqW4#Q7nZd?_8jO<`5]g`koa9`Q?'=aNDZH`lA"s +s2b2^rlG,Zs2b/].*0WWb/_WHai;X`is_X5[/W*Xfo(B_91*QdEThQ_nj1,`Q!JM!QN+X +_(WdIbg"JYb/M33_o'=*^V$tNGu-%?/2CV)\@]r(bK@l@_o9jFc-42K`P][7aN4;%'?J25`P]R5 +c(5X\'bV"(`m2TCb4*LJ`r!ghb/hZ@`lZ93Le^N.6VV3ljSJfS"Sqriqu+nAJ,~> +cMn"GqtpBls8Vuqrs7HKjPT\2s8Mrprri5pqY^9LrX&W!s8Vuqs8;Zjrr;uqs8Moqs8E]0qtpUNps8;fo"8r&jrVca"p[@k;f@BWq!ri/s +rVm3&qYpHns8Mios7uX)rVuZfDB(/LaR]B.s8Vrqnc&RgrVlip'`It,qu6WprVuoms8Uj5m.'Z5 +iUQpI!rVlnr;Qp!r;6Eke,Op~> +dJs4FrVlrurVZZp$iAA@U7J40q#10js8;lqs6fm^s82d%s7lWor;Zfpq#13l!r`0!rr*-%rr2lp +rr2lrs8Dips83B*d@[5HanPT.s8)Zns8N#t"T/2urVqKK!r`&qrVm!!s8W)srVZ[(q"j="]"P,; +WTX0f)o_@Ir;Zfns6os_s8N!1s8Mros7u]j +\u20kS=cY(qu$ +b5VqJqYC0kpu7oE9LW-E_#DR`ai)*9a2lBGn&POPaSEjUaT'E_bR_t5aiM?O`l5j1]XW_n:L%LsTa_T0^: +bjidO`rF*raiMNCaN;NA_T'C4\oh.M7n69\U>tnDrVulqc2W:~> +c2RkCqu6Tp&,Z.us8VlVmG?b#s8;oqrr2rtq>pTnir0,]rVc`qrVca&r;Z?cr;Z]mrr2fps8Ec2 +qtp +dJs7Fs8Mus!WN&rrs\54U8"-VoC_nYqYC$cs6]g_s8;j"s8Doqs8Mus"T8;jrVc`qqu6Wos8Mus +s8;]m&,5bj_O7RBdH^T-s8W&trVl`ns+1.Xrqucorr<#qs8W&prqud0qrG`,\Zr*:i:HsBrr2lq +rVZWmrr3H(s8)Kds82fnqu6Wqq>LNkSVs7u]pqu?-aqu6ZqrVuor&H;_,s7Y'L +S"6"BTZd3/r;HTo!<2ur!<1=EJ,~> +b5VPAqY^?m%e7T"=&2Fq[(j`2`PKC2rlkJib4kk_nj:2aNDcMK#e;Ac-=AL_o0F1_T;`"/'cMa +]sYDPKN0i]/2C+i[DTJic-=5D`Q$-Eb/D->ai23B_SsO6aNr)Lb5TK]`Y$2,`6m2b'L'RXcc +aSuAAqt^!crrhiRk31\"rrrDtq>^Hei;O5dqu?]os8;`jrVlisrVHKlrVuiq!;uin#Q4T$s8;fl +r;-F)hq-fInc/XfrquWhr;Z`nqgnbGr;ZTsq"jm_qu$9i"mk^NleL4nrri<#rVZZnrrrE"qtL-c +rVm&qs8;oqq>UEirXSu+r;HQIp&+jir;?Tpr:'^as8W)uquZlqrVQU$rVucQm-sH/hsrr1FIJ,~> +dJs4E!<2or(B4@6rVuoe_5Ep$VY0W\s8W&mr;Zfli;O8equ?]ps8;]hr;HZqrql`hrqufqrr)j+ +rVQQmo(hmbSu9$DnG`7`!W;hGrr2onrrE&trsnr$qYK3i^qd7PWS@7KpAP!nrr)fprr3&ts7uWn +"oeQ"s8Dcms8Muts8N#trser)rVP:?qu?]or;ZfplMgb^(&n74rVccroDIFBU7RjHU!3?4s82`m +rri?!r;HT?s*t~> +ao<1Urr<#sqWuOfA5Q90[)(#7cH!fBd*0Dta90T/b0'P$s2t>b&'`/=a2H0DbKeJ\e&fPE`qmdR +b5B<\`r3mV`;dgjZaQoK9i+r1Oe];'cHaVTaMu6?K#e8@c-=JSa2Q0Cao9L!bK.T3ZD)M51bpX; +9p!'4_Tg->_o)Gms2>Mcb.l'?bgFSZaNquIbK@s+a8j6Za:ZG6_oBgAX2`?2d)a;Qbf\/Po#UjN +qoBf#aMl3>`5]j8[D%u.9hJ&W@\DNJqu-QprVQHgrVQWpqu?WGs*t~> +ao;PDrVZTgrr2p-khtRcirB&Trr<#rqu?]SrXSu+rr)lsr;4k3qZ$Ehs8DrrrrE#rrquZorr2p$ +rqu]os7uQl%ckpbf^]"Aq>'m^r;Q`rK)PoNqYC!arqQ]orr)fpr;RH(m.9Jli;N]Urr;ono_ndh +s8N#sr!iZ!s7l?fp&>!jq#C?ip\ko_eC^rVk=HJ,~> +dJj@KrVc`prr<#ts8NW-s8W)j\=]:cXS)G\r;ZfPrXSu+s8N&uqt\P,q#C0es8)]prVc`mrrW2u +rr2p0rr)Kfs8Mccjg1\a]A*2\q#1*iK)PfNrqZR/r;-6bqYpNXc,%?/VR+kEq"F^es8;lrrr2lr% +/^)(qu? +bl@_A!WW/us8W$0qX)dg>>J4-\AQ/+dEg%YaN!bkrQ=rWs2tAc&'E/:`l6'Ec-iQ5dFQFYbkfB\ +a8=!uaMu3:`Poj:aN2KC]Yhh+]XXYJ8PN30U9D&ArknlWa3'"T2Tj7gbK7iHb082Ua2,9kY,I.b +5r^535^BNMa3`,U_oKO.`lQ6@`Pos8beUs6`mN8[a4&8PrlG)YrQ#PaaMc6?aiMZH`lcWQbKJ/Q +o#UjNqoBc#a2Gs:`PfR*[uOrg8P)liOlZ60s8W#qqtg0dqu6cqqYU6As*t~> +ao;D@rVlg'rqlZos4?Mnl0/-H"8i&rr;Q`UrX\u-s8DrrrVu+30td8\qtp?lrr)utrquZmqYpWr +qYgBm$2X]"s8V<2fBi;3rri;tr;Q_JrX&Muq>0p^q>1'fqu6lYlgEodd-^f3#5e/hrqcTkrqc]p +rr3N-p\"%Uqu?]jq#C6krVu`irX\u-r:g6kq"k!gs8Vrms8VWgs8W&ss8;oqqYq!%jQ#Ckm,Qq% +s7lKgnc/Xgf)L7~> +dJs4Fs8W,us8W,u'`\.2s8W&kV5TfZ[dF+kqZ$Tlqu>XS&,lP.rr;uqs5kX[\Ffgtqtg9nrVlip +rr)isrr2g5rVZ]qrr)fjs7cQ\_P3m?dI7)7s8N&srr7WMqu7<.rVQ9fs7lKklGL6D[Ap=Up&4mi +"9/?#rVZ]qrr2lprsJPtmd^&OqZ$Noqu-QmrXSu,q#CBiqu6Qos7uQls6K[as8W&srt>8,q"E=? +T:2LFT!J"grr;orrr)isrr)cqrm:[q~> +c2RnEqtp?js8W'2s8;EAFCn0ID6:k"b0ePU_o]phaSs?UaT'E^`sfr,b0J_[#ni`TfZM82a8j9W +aF$VT:1,1t3 +UU\1eb/hTG`5fj9`r*mga2>a-cHG%nc-+b`d)jPLrPnlY&^&26aMY[/`4a%/bKnMVaj/,taT'E_ +aSa'p_SNmmOBbIQ<)?kUh"LaIrr)`mqtg0fr;Qlrq"Xa9s*t~> +ci=%Equ6Zqrr3<&qu6WqhrNbPnG`IfqYgHQrW)forsJW%n7a$f/V*Knr;?TprW<&rr;Q]irsJc( +p&Fmcs8)]jqu6U!pY4Q`oDJLcKDtoKs7l]mr;$?rm,[NncJAI!%K?1rp&"dgqu?QhqtpBkrso&% +pY_$=/q;7ErVuims7uWurVuins8Vrnrr`2us8;Eds8W&srquWm#P6a6n`o<"o`"jmq#:9go)Jah +f)L7~> +dJj4Gqu6j!s8Muqrr2p.rqlMpV4O9knG<(YqZ$QjiVilXqu6U0qY]_l*#^5Qnc/F_r;HWprr2lr +s8)`prsSi)r;?Nnr;ZZjs8Drss7H`d_kjKFe)p9%s8@NJrVllsrr3K-s7>[HiQApPZ_+V`o_JLd +!WN&srrDonrri?"r;?QnrsIbA:E=]*q#(0jqY^BlrW`?$rqufrqu$Hrr;Q`oli-qa)>sO7r;6El +rm7R8TpqUH^ZbXqqu?]ns8N#ss8MuurVl`p!<1RLJ,~> +c2RnEqYL*brt,+sg4!L-:N7M[)C&, +`Pfj@`l-!taT'E_bU:TXaNV5157Lhpcd:%\`6?3>`l?*@b0%cG`PTX9_8sdBcHXMSbf9%ks2tA_ +&]Vl4`50:.^l2Jj9MSVrNQ^qlrrr,nrVcWjqu6cno_A=5s*t~> +ci=%B!;u`o!<)`n"mF\"jP9V.s5Eqgqu6WqqYm?:.39]Y:=K";rr)lqr;ZcnrrE&rr!EB$s8W&t +s7ZHdr;Qoab15A8r;VBJ"9&,prql^#q<@25k0N/`r;R0!r;?Tpqu$Kor;?Qlrt"u+nq/PA'dY+J +oD&7_s82Tj!;?El"o&&rrVZWnrrN,rnc&RgrVlip%fZM.rr<#sqpt'!lM9`-qYpTjqYpKtrqu]n +rql`qrmq+"~> +dJj4Gqu?Zp!WDrnrXJi']V1pkWS%4Mr;ZfpnG`Feq>U^Ko +s8<#srVl]o(B4@6rr<#ps7u]pnbr*sS>WX2i9g1:K)YcL(&[t+r;-3go\@Bt\uV=qrVlisrqu^*pA4-&-Q`mE+ +bl7eBq"Xa^rsnnqiJV#:9NmRqc,n8Ua7.1L`qd^S`Xp&'_oKsBeqFJJ%1rt$YKY2haT'BW`W4*Z +bl>icaT'6r`QH6?bK7N<]#r1-`3a_Y8PEH=OI`_mK?,=W^qe%:eBYk0RX.pl1H76E@>Ckj\Auk3 +`l?-@_SjU?aN2NJrQQ)!d`c5<'ab][!6WL.b0%T?_o9X:aSs +ci="A!<2or!<)]m"mY.6hs'q8rrrE%r;6KmrVllsrVZ'^&HD\,rr2gu-QaNT,:+S,rVlcq!<)op +s8Mrrs8E#rrqd-%qu?TnrV-9hr;Z]kqu6fUcI^q>qYpQprquWl!;u!Y!W;rjquQfpmJd+brVl]l +rr2lop&=pis8N#qrr2Tj#4CU5j4)BDqZ$To!WW,rrrW)srr2rsrX\mu/L;Va)&jYEK(o +b5W:WrVlforr2lqrVuopp:R)oT!d8Fs82]mrrN-!r;QZp!<2lqq>U9k!<)or%Jj*L)&sM7+!-mG +qY^ +dJj4FrVm$!qY9mbrVllsrVmW%fSEU(8njU(b/q`Kb0%fF`Poj:aSs?^aSX!QaSj-Y`>$/,aNW$h +$jdIU&J#4sd)sJQbK7m%`[AjPccs_WaMl'3ahu3A_o]s6_o9R=bJ_<(MGlT+;eqGq[CElc_oDJm +s2P&ZrlY/[rl43D#0P$0aNDTHn&PRMaN"(tr6"rY!li=$r5el[s2b,\rlG,Zs2[FI`l5g4_S3.: +HVujW/0uZFQE@s?_p$ELbK7`D`lH?OaNDTJbg"J[e'`LQ&/Q6$'F4hHcI1"T`l5j7`lQ7#aq)k> +bKS;Sb0%`A`5TX3b/X;!!6Y8]rl4uZr5oVm`l>s6`4;">;b9Y`=aSceo)/OfrV6BqqtB[WrRCjt~> +ci="Dp&>?tq#:13jqu6NnrpKgdrW)lnqu6Nlqu?TorW2usrr3'!rVlcq$iU#$qtU$fs8;osrql^" +o^25*ceA-hs8N!!qZ$KmrttV4qYpKlrVlGd.jH;a*ul:D*@!2mq#CBYrqucrrqu]orr2g&qtg0e +r;-?jqZ$Hkrs% +aSu8>rVulr(B=@4rV<(`US=XFp\Odes8Dutr;-Bkq#Bpar;RE.r;)p,)]'V3)]r&C7)rVZQiqYL$P`MBEGa5H:Zs8)Wm"T8<"qYU0is8EB*rr;rqrr;ur +rr26`"9/?"s8N#srV?Hjr;uusrqQNmrqZRDrr;uts8MroqYU0fr;Q`rrVccrq>UEfs8)ZlnCl!s +]rIa2fCo4?rVc`prVuj:qZ$Kms8Vlor;ZcorVuPf-QX3G(Ddr0)BLB^pA4g\rqucrrr2lrrr2p" +rr;usq>V*+s8W&tqu?Hii2EH@USjQ]m/6k_rr0h8J,~> +bQ%S?p\u!+m+#TM;,CMl^;e7=cH+#H^:_;$b5TWgb/V?:`q%1N`r=!l`lH6GFp&$V(_R]"1pkHN +cca;KrPnfW6c[-M;aNDZDaM5a+ +^7/A)6r.)nHHPLInG`Uhqtp?@s*t~> +_>aoBrVQNls8VKEjQY7orr`,lqYpHn!;uil"8i#qs6oses8W)ur!rMM:*pr',TeGJpAb!fs7lTn +rrW,pr;6L!r:Tser;6BjrVlotrVZ["o$,G3i:?mFrr`2rqu-Kn!WDrpr;ciqs7ZHWr:'^as8Drm +r;HNkr;Zd#rr)cnrVlcq"oeAprr;lkrs/Mlk3(p`d-CT0!rMonqYpKo*;][4r;6Bip&Fj"9dCW$ ++s&$W,TJ'M+_LcLqZ#j[r;Qp!r;6EirVlfo#lXYtr;-Emrr)fq#2J>*n_W-frr3-#r;?Qn_Z,,~> +_>jQ5s8W,r$1YHqTW4aJqsaR`rrN,sp&FO\rVuoq&,4FC+Vbh5(aZifs8)]orr)lqrrV'*rr;rprqH3MW1KBKP+TA]p:UEU~> +^&K)EjMu[J:Kpts_S"%;bf.H5_oTm@c-=JR`l#^6nAkXPa8X'iaN:D5%1/]rPnlYs2kDeb/jP$s2b,\rlbDcaSNn)b/q`F`lH3AbKA#P +bfe2Ud)Eu@]=Y__X.4W?2(0^q/7+^T`PK@0aSs?^bl>g1c-4;JaMu6?bKe2Zd[)Qm":u1V()[o! +'+"q7gWR[^`l5s;mDoIN`Q$!Ab5TTeb/hZDrl+oYs2tA_&BD`,_ntdRV6sPMsiV'tbJ,~> +^]+Z?qu6NnrRg;pjk]q9!W)`nrri;qq>C0irrW2tr:0aurVlfrrr2lps7ZJD.Nol_II$k3!W2ik +rY#/-rVuils7Z?frr<#squ?Tlrr)iur:g3errgokdGO9drrr>srVHEhp\tBpqtg3equ$'pcrqQNlrquZtqu-HjrVlfr$N0_ss8Mros82Zlqu6lejm:mKf'WG9"ShT^qYU-g*rYp7 +s7u]pq#C0bdTS1L+"&16bk/4c+ +_>jQ7rr3B$r7e$FSY;n:qtpBls8W'#qu$Korr2osnbrUgrr2oss8<9(p&'4a)]0fGlM^_`qu-Kn +rVd<)rVccpq>^3erVlisrqu]orVdc5s8Vrgq=a@8[%=/$^tAM[qu$Hns8N&sqtpBkrr`2tr;QBh +s8Mrr!<2oorr)iq!WW/arrN,trVHZorVlcq!<2ips8E#sq#:Nrs8W∨Q^,qWuqP]#(qRZHW(= +q=jXZrr;usrVmu=qZ$Tls8VloqtSQ?-mKZV*`pMTYoar)(*4j@s7uZis7-*grVulqrrN,tr;Q`r +(&\%1rr<#sr;ZHKUn=KTTWFmGq#1$drrE&9s*t~> +_Z']9q>:0k)XlmuCL9_.=II%HbKnAP`l5s3DjdE*]u.q2_oKj= +`Q%nts2YJgbg"DUb/q`GqT9#``l?!:_o;Pprl4rV#/eEt_o9^>rQ+rWs2b,\"3AX-bl,ckbfIfC +_nj1/r5^>0bg+JWa2Pm1_8F1-`5T[;d*0MI^9F8jF]^RV3\r3OCT"VX`lH3Fci(r``ZN.7bg!uF +cbe&Od^)=](_@>e5dB"4%M0?d&eh(raiaG!n]:aMs2b)[rlG)Y( +^]4<2#lFT#s4Hf%lIZ%8#lX]"s8)Njr;QZp!W;ibrW)onrX\l*q=_lW-:m_-rr;fls82Wk!<<&t +!W;oqrs8T's8)cqqu$Hkrr`2to_81]#5Qcne)06_rVllrp](6ls8W,uqu$6gnc&Ugo)&^hq=sd_ +r;Q9es8E0!qtpU`uoB5&pkh=;:r;R!!qYgBfp&+[cs8O,3r;Zfis7,B&.NolV ++@`g9r;65.,U"BT,>n@;s69O_s8W)tquH`krrN)tqYpfrhWaFombc=fs8VusrkSPa~> +^],2Mrr;omqV\'FS#E+@q>1'erVulps8W)trVlcrs7-'grVc^.s8N#os7c-',9]JEs8Dunr;ZZm +s8Doss8Muur;HWp%/p5+qZ$Tns8N#trr2os(&Rk-s7uBcpA+R7WhH>t^tS8Pqt^-grri?!qu$Bj +qZ6Wnrr2fpr;QZp!<2inqYog\!WN&qqulutrr<#rrVlfrrUp1*r;-9is7Y^6d(m6"X/!/`rVZWl +qYgEn!<)Zl*qfL3s7QE`l?js")B0Ya[JKk!p2;)l)AsPiq#16lqZ#s^rr2utqu-Nn!rMoqrr*E) +r9Ve,TUV:BUS$W@rVHHl!<0k8J,~> +_Z'W7rqIN4s8M]V]4bJ><*,a/_o]m>c-+8Wb/hQ>`Q69Ib4/]s2k>crlk_mb/hQ> +_8!h+r6#&`s2ub3ai;98_8O:0_nj.$\@8lLRXf*K3@u^0.nt`"\A?/+cILRsbf]q)rP],^`k014 +c,7oH`*iQY&ets0QIaU8r?e^;X_qSqpDqo\fW( +_Z'l?rVZ]qqu$L9f +OXDOs+!;Vrs7QEkq#9G(+=/$M,ddUOkPkMZrr2Zl"9/?#rqud#iU,_!n`J6trri<"q#(-,s*t~> +^&JW@s8DojophbKV5r)Cs8)Nfs6KXarVZX+s8N&qqu?KfB%?hZo(rCcq>UEkrXf&.s7cNmqYg3d +r;-Hnq>^Hnr;cioru(e1p%S@YpAFRUq9l+:Wj'CslL=WGs8W#nr;Zfq"T/,orVcQk!WW/hs6TaX +rs\o*rVZQiqYU0frVlfprrW2trVlftqu6Tp&F\`1`kJmbX.H]Oo(MYJqYU9l"T8,mr;QQm!<)os +)Yj7-p5gRH(`OG6ScAHas8)cY,SqC6(a$$]rr2fpn,E@er;Hcrr;?Nl)?0R5s8;lrqY/O0SsH7F +TVMAVrVl`pr;Zfrrknbd~> +_Z(MPqY9j_rr<#sl-WsD:/tY^_90d:cHjb]aSs0ZaSs?Pa9'K+b5THs`lQBEbLFnf6a+kc_T:*H +_p$-?aN4A'3m>jpc,%BC`llHHbfIuK]#W%>b/V94_8FIBcd'\Rb0%W8_n!:cLJgc98m6@gMOh&k +aiDNLda-(UrknlWa2\+prkncTs2OrWqo/HPrQ+oZqT/ZY!6G)Xr5eiV"3&:$b5KO6b/VE<`PopA +c-=__aM5?sXI=QO;F3H&1,q-mKrMMm_T'U;b0%fHbfn0-`rF$X_]ck:ai_]MeC/LN((:`c#_C^N +cd'_c`=X"6'b1V7eBZ4Xqo8-HrlY&XrQ5l#bfe&E`llB:PuCOQ=\r:Bf%K9Zq#(0irPnkf~> +_Z'o@qYL6lrVZQlrr3,Uio\tQrVlusqYBpcrr;ltrr<#^rXSu-r;ZKdqu?Hjs8DrsqYC-jr;Q^& +rqQNnrVuios8)`or;Qcprq-EirVuosq#:Tkg!\F&iUQpErrDobs8W)uquZcnqu$9hqu-Hkrp]sf +rW<#pq>U-kq>:*hoD]!nr;?NnqY^@"rU]::j58M>j7rHM"9/5qr;?TkrZD1C6,s*t~> +^&S-2)?9^6qWt#PUmnF=oDedcrr)`os8N&urr)f]rr +_>aN5rqZWnrr3W.keq7@<_H__[E?V6bf[lD`lS)#n]:[Os2b5[!6G/^&'`)9bg+5PdE0JN_T'U: +aSs=Abg">SaN;HAf%JR,d*'SK`m;uT`l#R+_84+5cI(%baN)?LdEKSBZ'fAp3B]c1EKHotZaRK[ +^&Gqc_o9U7a2>a2_nj1,_o9U9aND`Nb/VEt`r4!Tap,r0aN2BB`r!jS`VdaUaSs?[bU^iU`Pf^4 +`Q66Kc+LZuZ`'.3>X:5"/hf.XFKVp\ajS\gdE0>D_8XRBc,fk'rl$&#`6H?Qc[lH7#S@RXHJ6fd +ahkpBb0=?6*uc"-7+06#aSX!IaSj9WaSs +_Z'l?q>'g`s8;fmrrqTEjQbXmrr3#qrr2p"r;6Bhrr;Qgs8Vuq%fcG(s7lWoo`"mjqYpNmq#1m* +rqQNmr;ZEGTum?1p](9krqucsrquck#P[les7Q?eq>($qma]V1hrXA)qYp`sqtg0er:U$ir;QKh +qtgEiqsF@_s8N#tr;QR!q>:!_q"agbrqcWqrVZWo$3'bjmHrf^dGFZprr`9#s8Mus"9/5rrV?Hm +r>kq9[oOIo*@MqOl1juIqu?Znq>^9G.3BWS*c(TOl2Ch`qu$Bkqu?Tn(]412s8N&so\o$"l0RTn +s8W&tq>U +^]4?4%fcD&rr2WcpUI#iUSPlqrr2rts8N#t!ri/snc&Rgqu.**qu$Khs8V`js8Vrps8Drsqu.6. +rV6Emr;Z?AS]1X'pAb0lrVc`pqYqQ5rr;rsrV$'es7ZEgqX;_3TVJm-bhVFQqu?Tnrr<#ts8W)t +qu?Wo!WE#fs8Muus8LsVs8E,urVc`pr>>J4oAeHD]:'frr`5tr;HKk +&c_h.rqa!!(*4>>)Kb30()\!'p](6ls8VKcrVuoss8Dcm!<)lr%fYe?WM,lK +SYNIdrV?Khrr3#us8Dr7s*t~> +^]+E3q#1*hrtY(deq@O/;,hqFa3DiPai26?bg"ASnAtXOqoB8i`Q$-=b0e#Ic-42MbJaD"s2b5_ +s3)2)c,.Q@`n&AIJuIPRb1"_`c-"&DrkTht`lQ6?^qn(.bf7E7`l#9sZ`]jE<_>_H6r[fCL6nj@ +]>VhjbQZ86b/hZDr5J]W"Nns5c-#n(q9&]X#0+a(`l5s:r5ScUr58QRs2GDeb08)Sc-OYYaN"1t +s2Gko^qI:\TSIVu:H^Tq1ce'8N2<\f`PomsaU-/1aN)9;`5]m?qT'r%a2uWUPrf6a%2K7Ub1+VV +aj%lF`QcN9*ZZ%-"%UY]b/hTBmDoIRbf\)LaSj-YaT'E_bl>iu`l#d3WJFeV91DfgIamZPqY0me +"9&,qrP\_d~> +_Z'rAr;-?jr;Z]prr)j0mcNWok4nuVrqucqs8;ckr;Zferr2rqrr;p(s8)cqq#C?is8Mops7uX( +q>^?lqZ$8Q,qUPmEn9s`quH`prt58.qYBm]qu$6_rV6EmrVlirqu6s$gsja(h;IYqr;Qltqu-Hh +rqcZmrqHUj%r;6C6frsJ]$n*0$$kM+_Jn,!%pqYUMK7s8'ef*[MjK+LCbrr*#sr;?Bes8W) +^&J03rqcWo%0$2!]V:pgWQk,9r;?Hl!ri/snc𝔒Q`p$NL#'s7u]oqZ$Qlr;ZZn&GZ;'s82ig +O!#eq+`>d#qYg?kq#;E7s8Vurs7lNlrVc`nq"O('Z)Xb-]"ueRo(`._rr)irq#:3iqYp6h"TJH# +s8MZjq#9sd,6%K;rVQ?Zl/^.+]",)@TrPrhp@\1Yrr2ios8W&ts8;cmqu?Kk,Q7Z<`@)QE()e3u +o_\Iarr;lqs7cQhVA^Ep'e-Nas8N#ts6KXas8MuurVlWm&H;_0r:o[&TqS$PUn+piq>:*i!W)ip +rke\c~> +^&J03s82fq(&7.HMd]CS=GXH0ai;<;_oBjCc-4?#aSs#>J4MLP3^cYLHBY#+ +\\5bpa7m[Rb5'9Zb596^`lQ0@qo/ZU`r$HO.jRW6K!ri6"rVaY6J,~> +^]+E6qtp^9j +r;Zfrrqucm!W;rmrs8JZcHO_iio]n#rrrE%rVZQlr;Qcro`+sjqu6cts8W)prs8W&qu$BjrVlfl +rsASnnF>Yqccb)8o`+sjrqmi;o`+g_qZ$?jrVHEkrqcZnr;ZFo,oS*R+)CKGrVlfn%K6=uqi)gD ++sA:bq>^EXrr;lrrr)j(rqZHfp\=[cq"t$hrs.66n*K<#hV\;3rVQZpqYpZsr;?Q7s*t~> +_Z0Z8p\tp)qsVLnS"u^iqY^ +_>jQ6rVufo(%geccsW'aSj-YaSa3MaSj7+aiD?;bK$4e'G2)i%L>(Z +cH"5Ra2c0<_T9^7ahu3=b08#NrlG&\3QB%S^UgkSQ#T_i5!DA-?[J*5XL5[S`5p'Bbg4Y_c-",H +`5U$Mcd'e^cd'_Va2Q$;`lH0Ab/ha)aT'9jaMu?Ba3)WObfRoE`lH*u`F$[-bfIT5]t:k`YGRnL +G@XW=4$G\a1d,&qTsM8C_8XF6aN2NFaMu6=`l?6=b/V96`kBL5`5U*G`6$'Be'C8m&0);h;Ua1A +b/D08ajS>`D@@$f$OL.bc,[oFaN4>&n]:aSs2tA_s2Gnm`Q,s +^]+H9qt^-grr3#trr2p$qrm2)i7e21#lal#rVuohrVY+Cs8N5srUg+=rZN@%-QFNY,UK/NqZ$Tp +s8W)us7uWnrVuosqt^$^q>C6krrW2trqcX%mG$(4ce.7?kP>#Hrr`9!s8Drp!;cKjqYpHn"9/8r +qX4@nr;6NhlfR3ci8NPIf&HK$rrE&orso&,qtg0dqtg3iqZ$NopAY(9rql`js8VcldO61\*[)]W +r:g$cqZ$K`SfT*s+sJD)s7uWWrW2rrr;R$$r;$'\qtKm`rs-sAoCDG:hr4P6"TJ>srr2`n"9/5r +rl>%h~> +_>jQ6q#CBm'Dpq7U77pY[.s@nrVu`ms8Vins7?6fs5j7[ruCn7o_p*S(`3l.(*X\@,bsc&s8Dlq +s8N&uq>L?mr;ciprrE&sr?)%=s82Q_pA".0^ojQ.VR""Ybi@jQp%nR`r;$3drVlfr#QFc'rVZTj +q>UBmrrN)rq>U?ms8E&sqYpEpr;HTnquQ]mrVuos&c_XlkN_$SaMPQrY,7n`Z-DV6q$6fsrVlcp +rVc]o!WW/prrE#srrDfms!%I>s7u]po_m&Z(`=23+4U8br;ZcrrpcO!+;l.>,FSQ+rVli_rW3&u +rVZ`qqYq0)s8Vuoj.**AS"QOQ\GZ'trql`qrW)orrke\c~> +_Z']9qu-Kn)ZBO0qu6KdmE_D085rr5[^sApb.b^7bJhfMo>psO"NAC#aN45#!Q`FUaSs=&aN;T: +_SFb5&/c>r(^_#j&-dO$c-aeXb0.lJbJX>"r5pA1c-=S\c-=DP`l?-@^q@1SK4@J72*=T?D0:l( +TW,6*]=tql^;'Z_&]Dc8bK7iH`P]d+WW!UD!Uons7lWWrqud2r:p-^pAP!gs8N&uj7)[8r:AS*s8Muss8Mcm"9/5rrl>%h~> +_Z']:rVcNk&H2V,qsq\$S"ZgipAOshrr;us!<;Whr;YmX*rkm3s8&H7'c.]1()n,0*?Q=OL?&%( +qY^0hqYC0dq>VT:rVcZmrVliqqtp^Bms8Dorrp"8A(`4,5:%eJb%J@,",9.OG*GOd4q>^9is60FarVZWnqYq3+rqZKEWhc)LR\#k` +rV- +_>aN6r;RZ5qtg3hrVcWeh3;>E:fqD:_8jX;b/M??bOWaS`WjE%`lQ6Db5BHbb08#uaC!0&^WaiO +'b_Q+*XiPg'GM)c&Sf86e'H7ZdDs8Qa3VcE`lQBKcdC4hccsVP_o'U@bJhE:_nNUfW/"kU7n,j3 +85ro/E-RY:TVnou[^`fY^qde&_ns=2a2Z*=aijM$s2QY0`5T^9aMl3@aiqoI^V@1XU7%-tH"U>W +7mo^05X%P+<+giPXKoOS_Ss[sbQH#/`l@trs2I%>a2cccF5L_84CCa&3N_ +*#fVLc-FGOccMJ-(D[`,#>2nZajIoF`l?*BrlkDblc9g\`Q?'9aiD37_82=@<^o5>9i[_Gn+m"] +rP8G`~> +])Vd/"9&/rrr2p-oASrqhrXV4qY^Bhrr;lCrZM%:s7H(^+t+WV+bV3e,T@aH)]U;>bP_;Uolk1J)-db!72i8j4qqUb`Xq=a@Glf[ +_>jQ6s8Mlprr!H.r:\1,Tq.d`g].-Js7cHkr:0dbs5s;'s8)cqo_(os*uPe3INfdQ'Gqi.)CB%9 +p\=[^q>^6dqYU +]`8$1s8)iqrr)j.p=YgEF+s%L2D@['f% +MBHb$PQ:8f@&*kb1+MTa2Z*2>-cHF>Qbfe)Mb5TK^`r +_Z0W7qu?]ns82rtrVlfr"oI9@kMt:qrrE#qs3goHr>kq:Zn!+:+r:U'prr;uqq>:3lqu6Wn!rMurqu7-'p]($\o_8(;W10=.r;Q^:rVu`hK.%`\,TfPQ +icHIe-QsU*\G?1#p](!fs7Y^V!W;rqrs&K"rq-'erVca$gZ.Dcp[[A:rr3'!s8KG+J,~> +^]4?5!WE#orso&.s8DW7URe$RX7#ueqYgHErr)lsr?)(;YpL/!(EA+tnWtOJ*?H.=*Z6A#[dj.f +qY1$_rr2lp!<2lq#6+T"s8W&qrVnSNs8W#nrVQBhqtKU>c+'mKTqeNdY-G:@]Yhk:e_8m=l1=fN +rr)ckqYC!`qYC!^rqRQ*m,QsSe'H7Z_nEUk[BHR)T:MOG[E7(apA4OXrr3,ur;Q]oq>^?kqu79- +rVlcmq#CBd2V59a^RL#:uq=t!irqZNlrW)utrk8>^~> +^Ae?5qY9sdqYq0+o\H6R:eOo#YJnW&bKIoH`p(SBao]f0b4`pT`rF(^bKPtZ&K)K&E7*$W&K)B' +(DRYn(H@o3eBlI\e&'2Ib08,Tbf[rC_84%,`P][3_o'UAccsSQ`P0!u]!AQ>VP'*#B3S#!7R]^4 +6UF79RFTa,`QZ0?c+_9Ab08#Nn&YOKs2b2^(s't=`lG[&^9N]&>Z"*e;I5jOnGWCerVlfrr;FA0 +J,~> +_Z']:qu$?k!WN#orW)iprrqEMi9'"jrr;uod/G'ar;::P,:"H`cM@M>oX%4;+X8!L*>fkJS,3-a +p\Fghrr)`prr2p+p\Omgqt^*crVlcmr:9jkpZ^VjcdVjD"P;2Vg=lP\!o2ViqVqJ3!oD_drn.Y1 +eCE$qd*p\0nc&:_s7ufoqYU3j#6"Gss8D`aqu6ctr;HWis!@43o\,3q-mp>h+1h7Go`+ses6:aQ ++!MOI<@T4?+!)Ssp\+X_rr3)tr;6NYrr;oprri?!qtL$ers7rKl/h9slK@g +^]4<4!WE#mrs\i(p')BTk;)AX;=QM1.Q +p&G!irVZ`qqu6ctrVl]mrs/Q%rr<#tr;HWps8b;$VO=!JTqeH_WNED3\@K5a +pq?X<+1\ni['?g7W268^SY2jd^s1WtnFQ>Fp\XshqYgEnrr2p"rr;rrrr3N.p\t0jr;HTns8N&t +s8N#srVumDoDSUGP"?lB+X.l7p\jdbs7u]X*?Z7@'Hp@$+!DO@*h +^Ae<4q"jsart#,&hPXpk9j)1l\\uP+_85Z_rlXuVrlXoTrPg#'bKA.%$6(0-)6D'-dF+F>'G)#n +'bLc\&UDjQd)=>SaSj6_aMu-s_)9-L`l>a0aN;TGaN;QD`59F4aN)05_8O4)\[8`AQ%3RJ7Q`=[ +2E*TX5X7h3:Jt1n='/I$qc3Yp*`5a/8k;953AW67,9IpN0LT)aLRP0J\@]MqbKIoHrl5Mjb0%fI +a2Q'=_n`k&`le8()Tp%<`lH3CaNDZLcGIlO[:q3'%h9*OQHRC^rl"rk`!$&U*!m6F)AF,)&J'NC +bKn5VbfmuC_p$9Gbfn5N`l@Sj"NJF"`lS)#&]DZ)^Vd=( +_Z']:r;?($Xrs\\ll/pjYf[A'jcd'T-`XL&5b0/)Yf@f'A +lLOrIrrrB!s8W)rrr3H)r;?Hdq#16kr;6Els7lTls"= +^&S-3!<)orqYq!&r:Ja3VOEpRg@kFBrr;?aqZ$3eqYpm!r5g3)&0;fsqYpL,qt^!2B-89<(Ej_? ++<6./s7uQls8E0"rr2lqr;SDJr;Q`pqu$Bks8W)rr;QZns8Muqrqu]kqY9m\p\O[UkMFb5a1]'k +XJr(nVP4!`rLk:1VP^8kYI(dS`6?immIg;Jq"agaqYU3jqtL-jr;6Kns8N&u$3'l$rr)clr;Zfp +rr>P6rVulnr:A+&UR@aBUSd8JrVHNls8W&gs8W) +^]4<3qZ$Tl')28&s7YBY?s?)g>*QM9bLFh[o>gpSrlbGdaN44toZ7!N,/qRIbKcgi&JHB,8^>At +`m<,]W_*X3(D@i*(D$UZbgOPQrl+oTs2>&ZaN4;%&'`58`Q63C`lH-Cc-4>Na8O4!ai208^V7@k +[^s>k9`@fc:bPaF:esth>$Y`TFF]C@V6-i'[(!TW]tVM%]u8"0_T0sE +air#SbK7lIaiMNDc-cI1s2I@Gbg"AQ`PTI/c-4J0C(M$l)%@N"'GM)"dE'JJbKnXd$5X9p',)K"% +M*@(d)aPQbJ1m7`l?*Ab08)PaMu3<`q.7q`l5p:aNDZLb/MH=]Y:b4=&;+N7U0iKi:QjFrVcWeq +YgHmrVHNrrVQKja8^Y~> +_Z'`;r;?QlrrE&qrr`9#qYU9l"m+n8j50#!rrW/sr;?Qor;Za!s8N#qr8IVsqu6DE.2jWT-aisO +rqufqs82]TJL;Q^)^-:K,Uh=Crqccprr2fp#6+Ptq>1!dqYpd!s8W)ss8W)t"o\Ats8N#prrE#M +rtYJ/qu$?fpA=mgrVlisrqucpr:g!aqu6`rqYpEjs8FtUrr;urr;-6)L+"Dk,9%gL+sA-M,pSHL +qY^^Bgrr2ifrr;onrqud$mFUXmmd')err<#t#5nN# +p\aaar;Zfrrqlcq_Z,,~> +^&S'1"T/2ts8Muss7m3(pu/3DTpqmon,!"]s8W)trri?$s8N&trW)uprqcZerql^;qu6>@,8215 ++L1nEs8N&rs7uKPJL)?W(`XA6+!fM;qu6m"rVcZlrVlcq!<2ut&cVb-rqlTks8N&urr)fprVZZo +s8N!#rVlfor;QWqr;-Eds7QEcrq-!Y!;?Bc!quB`r;$Nns8W)rrrE&qrs&K$r;Q`rrr2rtr<<3# +rVQHjqYrMPrVc`or;-3&JgM]]*Yob5)Aj>**Z^.9qYgEnqY^"5*>KJ2*>B]=k5>)Us8N&ss8N#t +q>^Bjrql`prr)lorr2rqrr<#uq?lZ+Tr=WQT;\^NrVlg#rVuoos82Efs8L% +_>jN5q>V90qYL!_s8Mrkk.5D-9L`-2[`6J5b0%g)`r4!Y`rF*[b5KNeb/hZD`r +_>jQ7o)A^hr;QrTio]I_g&:pVrr;rsrqQHhr;Q]ur;$0dq#CUEorrrr2fpqm.[i,pXWY +ZMaY#p](6ls76-hr;QTmr;6KkrrrDur;ZZhr;R#[j72L&j4<)ds8Mlqrr2rtrqZTnrk\Vb~> +Z2Y@6qZ$Qmr8FTKT:hjShY6sIrr`6"s82fqrr2os!ri/sqYgKprr2rtq>LBor;Q]q+T1FJ)\s5. +9(W#]rr2rss8W#os7)C'*Zc=>)Ajjcr;HWp"oA8urqu]irrE&srrW2urr2ourr)`nqZ$Ek!WE#r +rU0UYrVZZfrsA]&rqufrr;Z`qrr"/@rr<#ps82ijr;Z`ns8W)f_gWdM+WD.8*#Tb:,Tn-J(*[nu +r;Q^/r;ZVt,8;+:)',mVr;ZNkrr2rhrr2p!rr;uorrE&srVultrVlg/qu6WopuSEFV4=3OS[.5P +rr0)#J,~> +[K$7)s8+&:s8VfV]5_%P<*!P%\\cV;a2,^3_T9g<`Poj>c-OVVb/h[$`W4*Yb5'*Yao'4Hai;07 +_@@A#)Ab^]2.M_ZRlt`lS)#rQ#Jf_8!^t^r"+6b0S>TdEDO8!6tMc36&eW +`Qc6:bJVEHdF?=7B+Yaq(D.Aq%1W[V'G_Gm%T^oq`PKO2bKc4]%NQZ.&!PJbdD=)MaN=1t!6Y;^ +#KFp2ccs\V`r3jr`lQ:7;+F;W>(OZ]rVccqrUKpfrPnkf~> +YQ"\'r:U'h&aSKAki:Ums8W)rs82]nq#(-jrr`8tqu6BjrVlipo)9d3rVhZo,9J9\W;lhrs8Mrr +rr<#qq>^Kd\l'Uo+sS;'rr3E'rVuorrr2rtr;6HmXT&.t7K!2aqu?Tfs8;]ms7ZHls8Dfos8Dij +ql4Zc,U4NU*Zl[R)_+I>hRb*_B[unXqu?Tnrr;or9ICf"+!kUms763iq>^Kcrr;ltqu$Bjrr2fq +rr)j#rVZWko_JIc#l +Z2ak$s8Ni0s8;/kUS4?SW5eQ)rVQTls8W&ts8DrsrrN,to_njjo)AXg%#GfA(`jirs8Dutrqu`p +&Gu8&s7*Qm(`F82*1?d*s8;lr#Q4Q!s8W&qrVlirrr2rsrr2rnrr)j!rr;utc2RP=%/g/(qu?Tf +s8;]ms7cNm+oV9;s8Dilr2O`a+WhaC(`=G=(aqq4gUA=NA'suLqu?Wort,,,80JZ\(E[2Zs763i +q>^KcrW<-!s8Drpru:t9rVZWjqu?]ns8W)mo[B_6UmIaIVonW.q#.>pJ,~> +ZMu!Eq"Xmhq"EjhKk"7b='gKe^;n.1^r4L8`l?!:`le;)!m8U*qo8ZW"Nns4b0'=s6-$pfCCMF/ +*u0R^aiME9^;.M#b/qfUeB4.=&/Z<&&;/TZ`kB1-cd'qabJqB8aihN:b07rG_o9dBb/V98b08$+ +aSj*\aMu<@rlG)]q8iNWiQ+g;aMl!1^r47L +YQ"_&q=X^crs&8Tkh>7^k5G;_q#'pbrqZTnrr<#]r[Im80-MGX+sZ[Yqu?Zqr;Zfrrr;uor;ZK[ ++s.sL-(k,8rVu`oq>UEnrVlosql0Q"r;6?js8N&rrr5+[rVlisp](9kqu?EhRj':),8q[C*ZuIO +<0bu2s8W(3eG/tAs7lTks8W)sq9C96+=&0VbQ%V +Z2Xh'rr3]3s8DihaJ>c%Vl-p"o`+sgs8Dutr;H]pqYpHnli%7kmOT=q()n=`s8;lr!;lcq(]OI6 +qY^BblPgWX(E].Crr2rqs7uWmrVc`uqt^6jrr!-%s8Muqrr2rt^]+62s8E3%rr2imqYgEorVc`r +rr2pBq#CBlqZ$9dRNNpu+;Pq4)&sM?;O#Z.rVcY+de8aT);9s8Dcn +nc&Rgs8N#rr;QlurVZTjrt55-fZ9ndS>)CEU=K&7qu-NkY5a"~> +XoB%2qXj")RUol!='BIS]?JL=bJjJ#s2b5[s2>#[b5KE[`rF-[ao]f0b4E\>b1+QQ(a'_3$d?u8 +`l6!;aN;HEcHOAPe'QVW'c.GoK%/)baM#^7c-Xe]c-Xkgd`fq_dEThRaN`&TaMYp:b4is[b/h`H +b0e:,bgFh_b/hTDb0%iIbK7cG_oKa9`Pfa7`k9=8aNDiMe:%c=%1rs]%20Bb'Kp]Jf[n^)5HN5\ +e^DR^`lZ9@aj-ss(`45,$`DS*`QuK?ammIP`rF-YaoKZab5THrcca>H`l,d1Q$cJ+8l8&YC9-%O +p&+gnqY9j^qu*u'J,~> +Z2Y%-qtKm]qu-Kn$eXLuk2c(4s8N&nqtL-irr<#]rY"k&+=.pK-D1>9rVcZos8MurrVlg+rr;qh ++s\?X,0'Z[s7QBk#lO`$qYU6js8T5#rVZftrr2lr5Q(QVs8Vrms7lWkrr2rppg,3`+!_XJ,:=[B +Y2oESqZ$3fpAb!hrVH9gs8;fkqu?ToAge`E*@G4fqYpBks7$$arrrE"qtp +Z2Xn(r;HWp'E.e)p"-%:StDjqo_%tYrr<#trVc`qrVQTms6T^urUd!-+;>_:S,`Ecrqufqr;HWn +rr<#t$i6>3*#]h<_Z'E3pAY'pr;QZkqtp?lquH]prr2itrr<#trr<#:rW2uqqu$Trrr2lr4oYKX +s8Vuos7u]mrr2rnp0&US)^#e:+=&%7XQ0-Pqu?6ep&FmgqtTjas8;flqu?Ql@NlU*'d-]Oq>U9j +s760hs8W)rr;uuus8N#tr>55,rVlisp@5PdTUqsNXeOMBqtU-hqu3buJ,~> +YQ"V$rr3r7oBb,-AmA,-Sb/_N@^VRP$bJM0<^s0d +Z2ah$rqQQkrVm<&f&lD\khc@>qYU0cq#BFSs8=AB<$N2&-m@jPs8W)urVucns8Mllr;?N`-RBiZ +,Tlp\rVZ]qq>($grr3*"r;?Mmr^["fs8Mops8W)urVZ]prr;orq>^6fOWPPi+<)dT +Z2Xq)s8W)srt"o&o[BP4V449Xhu*3IrqlZmrr)orqu6QomJ[Ikr;';5&f`/;kPP8Y*<,j8q>C9l +qY^ +WrE\0o'P&-Bjt+5;d5j4`mN2Vb5TE\`<*lnaSs?^aSj-Ga?dkjfK0cW)&WRma2c0=cI1Cod*KqS +_Sa=9b7#'t((pc%cHF5Oa2,a=ai_cG`Q$*Hcd1(fbfIfFcdC"[`l6$?rl+lVs2b5_s31Je!mJa* +ouR0QilD,BrlkGerlPYjbfIoG_o9R3_oKg=rm*RRb0.cQbLCG7%iuGo((*'Qa2cBMccaGPfZDL^ +a2u`CEja<@aN)?GbL4!0()eJ:':@G"_SsU8o#M9[_8!n,aND`Occs_Yb5TC%dDs;I]!7B"9MIuD +8mcPXmIL&Ls8Durqtg*_qYU6!s*t~> +Z2Y+/r;QWkqtg6irVm2[f^.qfh>I^$br;Zfrqu6fuqtTsZrVm0& +jQlC$kjdcar;Qosq>C3fr;QluqtpB%s*t~> +Y5\M#r;R9'r;,l\RAZXMVq1hCr;QZnp\t-knGX7(rr2lo^De76(`di#rr;rss82clqYL3irtYCB +*>KG,)iF=cs7ZBcqu?QlrVZWnrr3-#rVc`prr36&rVc`ps8W)ts7?3is7QBks5EqWrVlfps"aTM +s8W)urVHQiqY^$Wo^htQs8)Zg@j2m.,>k&sr;Z`qs8Mfms8V]grV#--80T::p\t1)rV6?ipk0_# +'Ghrbo)&IdqZ$*b!<)or"98B!rVcWorr2p:qZ$HeqU;:5U6hCMUnR;Tq#: +WW*\2o^Ch]E`Q=::LBI-air&Sb/hTBrl"lYrlY8^rPn?J(!4P1CO1_8ajJf$r"E +b5]O3a3'hW%2KR`luZLbf%HEajJYgdF6Ij`QcKNeOU;g'-0Dpb1+h^aihZ>a3`A]f$VRFAh=Du +Cs1/Ebg"5NbL(#;%fRFP2UBRh_SF4_a9T`&_8F73aNFG)!6Y;^*5p1A]t05)91qQA>[VBtmIpS[ +r;?Nip%nO^qu*l$J,~> +Z2Xn&qYU6k"9&/qrVca"eE?2[h=LUF!;uiq!rVrmp\b!hs8Vims8W,u%fQU +Z2Y"+r;6Hlrr2p.rqZKgq:_F4T:ht#oDALbrVl!ks8EW/qjS]F*Z6KA#+rV:8 +*h<90r;Zferr;rprrrB!qYL*grVmi2s7*RaS"6%?URT@#o_eObs8N&uqu?ZprVc`%s*t~> +Z2Xn'qu-No(&e(1rV6$KfWAO[9i>,H[DgA7c-4?0aSs?ZaSEjMaT'B^a>(`YHjgE!&K&1.aMPX0 +a3;cPda#qM[_0]-/I3F7&dlCubIYg=\P\I+d*KtV_SO.-rl,,\_8!b$`r=*baMu6@bg"E3bR2M6 +`l5j5_8!b$`W!mQaSj-rldmZb1"hedDWekH=]Sf&Jkgug<\*mcsHqh&I_n"d`0,E +^;8%%4>gl1k2Vs8)Who(`+\YlB4~> +Yl=_&rVm'#s7uTlrr2p&pYFonkM>(nrr30$r;?Heq"O^brr<#orW2usrr3]3rVU@S,p"-Rc1h25 +s8Vinrql]mrVmc/dO6=Z+X1Y#qtg?jp7rrW/6n7]p&G!hs0)DrrVZQhq>'R2\W^u41*@ti,UOZU ++se_(r;HThX"#86+sZg\r;ZWlrqQ<^`.00]-lsBT*[DpUlMU\[rVlins8/-*+ +YlF\$(An(1rVuoor;$*8U7S!OTWd#Bqu-Nnn,N.]!WE#srtPJ2qdplj(De+5o_eRcs7lWor;QWm +ru1RV,9.=6*+f*Gr;Z]fTcb=&=H(Jrrr)fqrqQNirW)oorq6/)]Kp`r;Z`nrVucpq3)^7)^->M +p](9lrUKjfrVl]o"TA8qr;HWp&,Q%LVjX-IR@BkE_ts3*rVHNurr;urr;HW%s*t~> +Yl>O=s8Diiq>L +`PTd=`koR7`N0Ud',M-NeA],B`lW`9#STF>VT@'^b6c80`l#X-^VRn/qoAf^c2PreapH//`P]O, +^:qA$rl4cTrPmj<:rU2ca3E&\dF$(>Qul7f'a5*W&f2;t(DIBuc-+>WM@pU:&e*@AbfRW:a2ZEN +V.U>P%g<7T(`jD#^W+C6cHjYMda3.E',;5h;o?\sa3!kmrlY8^s2P&W'ZS5:b08#D\X$r0<),qV +=`'hspA+[e"oJ,jq"O`js*t~> +WW*)"r;Q]nrrpj0jlkshrr<#q%K-&$q>L?nrqlTjrVZTlrr<#gr\^f)+Bgdo`"mes8)Zn +qu$Elr+RAu+W;f[q>^Koq=e2@)^HUT+t.ZEl1b/Rr;Z]nrr4nTs8W&os8Drss7lWkqu?]nrr;ro +rqlTmrqu]or;Q`or;Q`qrr;los8Mrqs8N&ns82irr;Z)Ed,#ZP^qY^?mrUKjn +s8Mlgq>:'crr2lr%/U##qq^H+p[7Y4jR`BN"oSE#rr2ipqZ?]prilEQ~> +Z2ah&rVuosrVuos%/fajUn+$MW7U\>p\k'j!r`0!rr2`nnGXO.WZ`5r*>ou1Yl=7ns8;oqrVuiq +s8Mk+*#BG),LZAdrtG5#=WS7t)^-4HF0k!#qtg6jrVlfr#6+Z&rVHQmrr3i2s8;fps8;osrqufo +r;Zfqr;Z]os8;forVmE*rVulprr;utq#C6ks8;ofr[7aBs5V8$Me=4T+WVUG*$#e3)AsM7(D[l+ +-i!`ApZ`k<)]L*-q>^El,l``O*?Q18+!275(`4&4Vu-Jns8MoqrV6.3,90FtrVQQns8DKes8N-! +rVZ[3rVlisr;$XO$V;rVHQnq#:?nrr)lr[f:j~> +YQ"b&q"X^ar;Rf7q"F(%DduX68m%+_a2cELbg4ANaiVWEa2lBDaSX!JaDfI`%M9Eu(DKW*e]#\T +]u%@uahGI(aO*Zq(`Nu!Zc^;'_8jql&e5]i'+#+OR*=+/b/h`D`6$$=`Q69D`m2WEaiD3>_o'R: +_o9[7^r*t)bf7T@bfIrMaMuGZ,"V%1a-h()75d% +M9Hs)As:s#g1?8bK1/*(_ROIe()OX`llnJ'bM2o$kEjW&g/>7'7n3Ba3W,OaN)BM#7q;&VpE5t` +QlZLo>i#rcd'_SaN;NBa2Gs +WW2horr32nh=9gljl?@?%JTerqYpHlrr;onq>C0hrr<#gr^-9`-la?O+!W:%ZM3thrr<#qs8Vol +n/ro%+Y6:Xs8)Qks7%Q],on*S+=/6T- +Z2ak&r;Zcqr;RW5q>/+)W1TWY[.""op&G$irVZTms8W)rqu?0b%fPs$+qth/(`aqdYP%Jbrr4_N +s8Vrlm2?l`(aVZAs82]ns6V'L*>KG6)BTt<+BFKEp&+jbs8Dlqqtp0gr;Z]orr2ourr;us!WW/t +rs8N#s8Vuprr;uss8W)us8W#srsJc'r;6ElrVZ]mr:0b6s/.@n*Z#V5*?Z7<()@o1+r_gL&fDi1 +*@'D6rr;do*ZYt4)-rr48:PTUha*$-";+3YqY^$^s8W)tq>^Ko!<)lq\,Us~> +YQ"_%q"Xa]ru1e"gm;JQ8OZTpYK"f'b/VHA`5]m?aN)9@aSX!Ja?\"r5SaqK(D7;m,*:-ha2,X7 +_oTd3b0120+r_UZbL=5;b14iS',qPr'+>B^$ku0MUs.3:b0eDPa25g6e'-&8_CWaIaiMTFb0%oM +dE0MO_SjL;`Q?9Gb0.rL`Pom>`l?-DaMu6=`m2WEai29ia9p(8%M]`k%1`mZ&H3>0(D7Di(D75s +,Sq$uYJA6*dm"Zi&JS9uf?2@`dEQhD&/Q#l"pY\U-Pm[62:':]aNDcCaj/.o#a$R'-oDSF]rVllrrqZZmrVHNorO2`V~> +Y5\_*r;6Bhrr2lr&,uV,s8V`Bh^]s` +(]4.1s8DfhqXaF\rr<#kj6c:'jR)6en,<7grVl`krVlotr;HKnr;O#%J,~> +Z2Xk'rql]rrr;usrr3H)rq=a6SYMmSVTJ<,q>L,`h9br;$Bj +qu?>:,Sq%-*jP\Arr;`i\/Z;.*M@9t,T.aI(`atMD6,Tdm=*ZlOI*?l\8KoaTe*#02- +,K'HZs7hQq(E=>Do^r1`r;$^E_rr +U&Pr'oA-BZ;c$%]=+d]t_TBj@`l5s<`Q64!aT'9NaDf;Ja_qe2)%mc$((1e#bfn>RcbmWGb[qh5 +)&L>AoP/N&eboh$CAcT +bg1;F(DmZ"fZqsi`Pg'5"VV=Q$9*" +YQ"h+r;$-`qu6Km!ri#prr32kiT9Cjj5Tk6#5nK#r;?QnrVuEes8PR\dsrbg+rMaO+W_kZchIJ1 +s8W$C*?ZUS./!W=s8W)kF<2_RFo(t-_hq23-R0cY.46L&q#0scqRaDjkkOoMpAb'js82]n$2OT" +q>^?lrVc`nrVuj#qZ$Tmr;Zcq#5\8qs8N&unbt`PqBR4-,oA$a8SO +Z2ak'q>^Hm)?0[9rVuorjhRRYSYE'kmJ-YXrVZWorr)iqs6K[as&S^:H6=+F&g&)5)BaOTo`+I] +rq[ZN(E4D>o)J^hs8DJ*(EOW:p\46oL.N:,*?,tC+X)[6r:g0d\[g/Mp\+LWs8)coq>^Hmrr;um +rr;foqu?Wnrqu^"rr;ips82`orr*,ur;?Tos8VWg.0'&`)&F5(+tQ/oNNgaqq"OL]p%3bS*>fog +q>U?mf,Z"N*$)Qfr;$?l')#-N=/b>2q>]llTpqXDR&Q^fhYdBMqY^?qrVZWnWrIS~> +TDo;mkeE!Y8OuT[Dlp_P_Zn&ua2Z'=bkoK]`pq,]b0A/;C(q3m$lg-&&J8]\dFZ:cdb,*C*$?15 +e'Z.Ub0e^F&Ju-cf[S6>CGcG2%1np@eHos*t~> +YQ"h+r;$0cqu6Ek$i9eps8UI-k3hV +,paZ\+IW3-s8Musq'md2,.77Hs82ion"t=R.j#rX*GbKNq=cZk+sn[1D1\CdcKkE)p%JC[rr2p4 +rr<#qq#CBnr;?Nns8Dlqrr)lsrV6Bl"TAAts7u3a6iZj/+=&$ZU\"^9fr;OD"o_&7Ys8Vq2+L3bqu6Kms7-'hr;HTo% +fZM.rr;rRjQuO/m-WEPr;Zfrs7u`oq>UHorqlcqZN#F~> +VuHktr;?QnrttY5p\sf\WLTZQUo`VMp%\C]rr;urr;Zf`r_NRhs8W&mhNfB2(`OG;(*+K2Y5\.c +Q6.+`*ZC=@rVuors7IW\'-4CRs8VurqWstu*@2RB(`$`Xs7u@B+WV^M7VI4=YKH&(p[e%Up\t0l +(&n75qtL-jrqu]ms8W&qs8Muss8D`lrri<#qu?K^rX/\t,T%I9-(j`&p\st-s8Duos8Vb^)AO,4 +FSc%9s8,>%,8_A=q"t*jrr3bKo(DVRpAb*cAf2O()f,'Fp&G'fs8Drs#l=Puq#(-gs8VZhs8W&s +'`@k+s7ZEIXeMAWR@:"FYPS;!r;QQm!ri/srr0&"J,~> +Z2Xh&qu?ZorVlopqu6U4o'b+MC/Ii&=(Ir4\@fVo`5]g;`lQ6Db3m>U`k'(5eCVN`%209i*[DL; +'317Pe'WRW)AjG(I+?K^`lZfc()mVgPK_4qajee]KO"p"%2BTd:sRG*`X`=^%Lt0jB7uSSb1b@i +bKn5QcH=ARc-FGOe'H7\aSs9ma2Z6Ba3)TG_TU'Ga3MZG_stfDc-$Y5+;l&ObKS8[d`p%YcGmuN +c@ZZA'+e$`a2H9U2[gN3#ZT6pb.bU+b)XQfb0n;ZeCIM.(_dK\c-^Knq=s^\rV6BsrVQHfq"jrus*t~> +Z2ah&rqufqp\t^HlrVlisnc&Rg;>g:js8)>b:`p\t+C9mrr)iq!W)fls8N#&s*t~> +VuQbp*<-!>[qY^<_s7Z<#9HtGt,4bd3oc5+r)]9h;*$H^O+Wj +X8`;!qYL0hs8VuprtkS"g:(j':KLS#Ejrj&_na42ai;ECb0'.nE5oi7`lQQVc,t`!&JH$%)ANl$ +09G#u&Jc&m%b]7Q`5TaDW=fdZ'u\P=`PBR<_Um>qTfa>4)%Od6aN">o(DRGr%1j0k%Lre"9i>ha +T?kQuahZ3HccXPYc-4>SaiDQBa32KAbKn)Iahl$8ccbk":W1IQ*ZQ"-Us[N4c-4;M_TBj:bgNX3 +)As2Ccd'GHd!-02%gilscGdl;]#)e3cHsn`bgFq%%Mfcg1"=Ll^<+7=ai2W@bJMBFc-FAHbONXs +`5fs?a2Z6A[(1ci;b9AK>@hK +ZMt%+r;?Qgs8W)mrs7iGhX9Uiir&fQs8W#qrr<#grZ(b6s8Dusp](0`\n3B7+WDIH-6F?W,T\*X +JGJp;s#Tk9,p"..qYU +X8i1u!r`,trVmT0qtg9krr)]\\YGXkT;&IJo_n^ar;Z`ps8DKe*;KR4qu?]ks8;Gu@jN-9(DRf0 +)&aV<(E+NGp\+Rc3qeRU()Kd?qZ$KnqZ$ToqZ$?.(_e&9p\k-K,8q+6+!;pP(`"23*u>k>,oA/o +s8Dutp@n@Up\Y!jrr*K-s82irq#(0brr2Wks8DimnbtiSnpD>i)]>1?rVZ]qrVufnrqcT\V&U +Y5\_'q"FLXqu-?js8EK+qX`dlMe?$n:f1Yp\,O5G`llL"b43Pk_TpBJcc3W=aN9oJ)%mMi()dts +$5+'c&eeX!`6QWI`5$4#',3[acH3uH`luoTbgY"=$k=!\bK%l8%hoa$'+G`f$4%:T'+56]'a5Dp +d`9SZ`5g$Aaii#Tb0%fGb/MNG_T'a5aN20CbK%TAn]4ML`+B]$*XdJ@ai_lQa2Pj:bf%WCN#<`Z +'be[/_o^H@*"NMd$_>tobe_-8`QlrR`Qc_m?lBXh&dphOb0RQ/`6H`Yc-+#?_8=+2ccF)qa:ub? +bJqH9]<7W2;cud`7Sd +ZMt%+r;?Qhrr`8ur;QWo!;ZQm#3"D(l/U:]p](9ms8;lrs8Mros8MrrDZ0M5r;HZnr;Zcfc@@/b +-6"-Q,U"9T,U;[Ss8Vlos7fhF+!jOVl1b5Tr;QTls7lM\-mBp=qYg?=,9n:DpW^sYRr;de,Ut;b +,q:&9rquckC+:T8n+Zk^rVc`qs82iqrVuN*S"-8>r;ZNknc&Re9UdIQ+t.R1s8Domq"sjZe>S48 ++^Emq#C6kqu?]prVlfr +pAY*i!<2lq$N9JOnaQ#:lf?mlr;Qiqrr2iq"oS/kqu$Hhs8W)*s*t~> +X8`;$rVc`mrtkY3rVc`ks8DiefW(@5St`12o`"^arVlcos8N&ur;QWos8MuqDu]_2s8Drsrr)ls +o?Db0+Wh=9)]]h7*$-0cr;Zfls8Vjs*u>qcU#u%Hq>1'erVuWgQQd@i<;HLjc5mo>?h2=\TU'>! +-6FN\(a(+Dq>L9kph2$#=RGh]s8Doqs8W#srr)lg^R:OblMU\Vs7$"^r0JTC)'X%qrquZgpA4OS +dAD\-)]BS0*$t@Zr;ZTg7i< +YQ"e)qY'XXqYgBhrtPJ4q>^9Ygp(s'<_ZJ#O0l^<_8aRlb4`pSb&>YLaj%c@_S*e/e^:R1#7MI` +'b_5n',D2daO&5S_T0U53Y<)G3/bc$eBlUhaiVoMdd*BbTb/q`BaiMTO_i\nXFLoQ:_9MMk4iPWo)AsM1Z"'e:/YMeh!b1@"T%oepAFmh!W2ins8Mu%s*t~> +Z2ak'pAb-krVm!!r;?Qmrs.iCj5oCcmIg>U"TJH"q"k!i#QFYsq=sd_r;6Njrr;ors$QS]j,k]; +,U"BU+!E%]rVQWls8Mu],TmsM,9J=)P.pG_rV6^HkrVZWnpAYR#r;?Qns8Duss8;cn +r;R)ii9'RuoCV8(n+-MVri,pJ~> +WW3"tqu?Zpr;RK1qYKWlT:hdHUpnYCqtp(KqYp?gs7B56(`J>1r;3B6)BWeir;6UEorVu]nrq'eG+=#;4s8Muer]gG^as@c=*E2[thT_:2A0E$;+WMI@ +(E489Fn>Y5q>^JM*$H"A,k_07q>0jGX\p2^)&aM1*Z?7DF8bn6s8;iqr;Q]orVZ]os8Mus"9/5u +rr2p2rr;`kqt\40TqIgCT:DOehu*HOrVl`p!<2forVl`p!<0D+J,~> +Y5\Y'qtp?jnGa:!mF.2/>#7jlD2Gd;`5g-HaiM`Ob/sP#s2b2^r65/_s2\rp`Pod8cHjVZZtTpa +',29"'G;$ce]c@[bf\2G%20Br((Cm3J?7GYd`BV]d5VgM$?"/1c%HK>*FRCBcd:.gcHOA>SUYQM +>0=k&aO*g!&e,&>c-+>Mbg"5FaMZuONe6qgHdN4eBHqY^Bnr;lfor;QcqW;hA~> +U&Y/lrr3*"r;?EirsSh[ipH$kiTgFBs8;lr"9/,iqu6Trr;6Hg!W2lns8)^Xs8;`nrVZ]ir2<76 +,9e6W,lI]BqYpElqm.Ih,oRpR*@)^S.W26KqY'(q,9SP_q#C,Y-QsS+qYpKlrVc`q-M[K8s8DNg +rVlfmBI"]F,U]/_p&G'cs7QElqu?M),U4Yar;Q]onbt6?rS8YD,9S=11*n@o,q'r[,p+3h"-d1J,~> +RK"3(rqH0^e#&k3S=cdti;!?Drr<#trr<#trVlZns8N&s!W;olrb)9/qZ$Nls7Z8a7NNNg)'C't +rr;ior;QW#*uc=;*[;RH)BpMEWTa-KiuB$V-d28apR!-C(nLI$rqlWkrr<#or;?Tmnc/Ugs7g%B +(E4G@RfE$[s7ZKes8VurpL,'^+OBrbrr)Bds8>(6*??%8+&+@2,9.^I)]'J1)BKb;*[)WXrVuZm +s7bUs)BB_9_"@QfV-G2`+WhR>)BBqC,&Yd'r;$Bhr;Z`p!WE#rrVl`pr;ciprtkY-s82`gs82cd +cFTgES=5n>StsHtr;N&_J,~> +T)Sljqu-Kn(&I=TWGPj67o!B#%LP6V^ZtT%33&QiDR~> +RK!u,glPXrr+Xe9W)^64E+=&@U[Jg($rr3#rr;-Ejr;HKnr;QWo#QFVlqZ$9hrr)j(mG7$mlLOQ6ip$B) +s*t~> +T`=rhs8N`2qu-KeqWkeoSYDaIW7189s82fq!WE&trq$0drabp+rVuoprr;cko>55f/n*Z6qYpNm +s8Vk6*$#u?LfYiH+<)%;+=B`i9-"ud..I90rH9+u+JAE$qXsmbqY:*gs8Vups8)]os7p.E()\)2 +)K,BDrVufqs7Z?dqILTa+3scPrr2p\n0Snd)\jP:)AX;4&fr23*ZZ1?,Y*jis8Vfms7lTa:Db#e +)K1O3*[MUI(EO;1)BL,?Z24@nrr<#rrVucop\t6lrqm$"rr2ros8Voort5/(k.[RcTUhdJT;&pV +q>C3jQiDR~> +TDo&kqY9pcrVmT,kM=+5@7sHm:0ij]^V7=sb/hNDrlbJeaMu3p_Z@`rqT*3db/_WI`Q6EIe'Opj% +M_CBbf7WC^rXdI<=KQP@qme$#8%RW&-i\*<^@H<$5Cb0^X#mf&f?VP_T9^Fbf[rJ_oKpAcd^1Z` +Q$(s)&X>,%h)XoaihlEa3)'3aOElq&e(tgn&Rc6a3VmA(EXn<'F4pL'GLZ['abK_$OR@pDV!Fe_ +T^0;bfVgP'b_*aFup'I$Ps0`#nIFS&6G1Pe^2[hbJV9aNDNIdDErCb +eCZ`G#h[?77KX=A<+dsmdg7As*t~> +R/[0aqu7B"gYh2_i90"ps8Vlgrr;upq>:*hqu6]rr;QQnr;-Btqu?Zks8W&orVoLgoCDkXs8Vop +s8)Ze.N]lYY5%bWYAZ!?*[`'O+WqaD.!5Ccs7U(L+!Mn&Ck8RidGY$!s8Dorp\Y!hrr;h.,9J'P ++sS70i;!^3kq>:0irrrE!rV?*arVm5sf@o`] +mI9<%hY$jI!<&5`J,~> +TE"rjs8Drr(B+74q#('aaJl#1W0jHbg@bLGrVuorrVufpq>^^KnqYgFhqsa+Pqu?]n +s8Vuop*Ue$*j#25mBCIX,TA$N(E+/+'I%MmrVuM"*#KV7883OMXj5f$p](3js7ZP[Drr;fnrs&(*)]BgDqX=DJs8;oo<#?Df*#'>8+W;IL,9g-1QF,*4pA+FZqYgHms8VbK +,oR^B)C$1H(E+22*[<.RZMXIopAb!hrVQQnrr)cop](9ls82orrr2otq>UC+r:JLaJ,~> +T`5&kqYp6iqu-O7rUK7:esC2[<)uCf@["%2]Y2;*`QZTNb/hTA_tq1M_oDPoAAug7_o^'A`5g!G +f%&$fd`]kY]ZA"*b1%+9'Fg8RaLm7*(DR8e#n7R^%h9@VeB?7_7Lg%E%P("QKoE(Be&TnYaj%iL +dE0JLa\*6])&F,-&idJGbfIf>aN2]M7h$"'ZI@rmUnl +,fn*I_o^3DCD7I"(_IPp)%7)f%h/sY +U&P,lqYpcurqlTms8Drs#N=Osn*'&rn,<7hqu$6ar;6KprqlZh!VuZirW3&trr51\rr;lqqY'je +s8DuopAapcs8:%g)'C:#s8)NhqX;Ul;C*n>,9eH^c2I\>pa742+=/'g]r;Q]prr`8qs8)]o +$L?j;jmD^/l/q@/rr3)sp\FfTs*t~> +T)SunrVcZmqu$I*q#(!L[A9:fS><+%iq`WSr;HX!rquZkr;QNlqYgNqrVlg\rVliqs82Nes8W&t +qtU3frr;l;,SV4CpAb-is826,P>WYR*??+B,0Kf_qXl$N*>on>*>f_:+f\9',_Q&,I7:Gs8DusqYXnE*$EQ(rr<#hrr +U&Y/k!;c]i!rMrorVmN-o(24iL1EnJ6r.-=U:nRa_T2Yus2Y8]`PqenrPeTRB?J9:bfRoHb.ba/ +_TUBSaiD0,^q7A'bH_uq',&sE_njIBc`VIG"r@j^$kNiJda-(a$kaHl(`4&%',2&f#cuFubL+VY +b08)La[QdR(`X52(CUb8eBZF]a1oF66jsV9YKb/.`q%2@`l,g>@Mg4.*uG7l9kAgVYgU\AcI(1` +f$2Lcd)a8F_Saa0%Ls*i(CqAl%2KTp@@b +UAk;oqtp6i#5e>qpAFpbrr38ss5E5.l/1FprVlrpqu6Km!W;cmp]C9gr;-Bus7cQnrquWhqu6UW +rr)fqrVHQns8MonNZBJk1-es7lHis8W$= +r;Z]op](9mnb?rJ+Wh[H,U4[k^ZYXos82irqZ$Hkrr_fhs8Drrq>UNqr;?Ki!;ucp!;c]p$0C70 +melP3lKRs?rs&Duq#C6^rg3Y8~> +T)Tc/rVZTls82irqZ$ThqtKj.bFbK#TUi(.o)&@ars&K#qtg3frV?KirWrPus8W)rqYU6jrrrE# +rVulprVnSLqhuC:*`D_1s8Duss8;fdm]1FP-7-+qrVu`g,o7I>)]ft@*$H:D,h;YhrV6-err!0& +q-tH`*1n/h)ZCfhL\^ZDrqHHeA/u[5cMRV@nc&Rg')hWl*#9D2?h3^Xr:]sdq>^6drr<#s"T8;t +s7lTn(A.E<+rhL;*$HFNKYHUKqZ$Hms8)cmrVlujrVuiqrW)onrqQNlr>5M.qYp&sWh,ZWTp;4E +\(UZUs8Vlos7_iZJ,~> +T`>&jrql]n(]474rVuons750CNDiPE;,_.l\%ol&`p1WXb/)3FaMu08^;\7:aN;KC_S*t*`Poa@ +FUfB)5Ldln]u\FOeC;OWN`uSl#aNiccd(/U&Jl,n(`=2*(CgfZZHgnA_SO=6cd0bW8.Z:GQPCJW +(D.$kf[%sd]>qrX%1s&Sc,doDo#O>@aMc>M'H%r/9\%J;gXFEp`Qc9>bK\MZbK.oI`kTX9`P'Ys +()@Sr&J>TcD5,,)b/q]Jd)O;KaihlL\\uV1bfn5PaN2C"`W*sXa99N#_oBdraqr7:_o&d&?qrs\ +9LMcbJ?nD0rVuTks8A8`J,~> +UAkAoq"O[br;R#uq>C6dr;Zcprs8DZj66($jQQI7rrE&sr:^*ms82chqYgFSrqlTmrr)lsrU^'h +rql\%-6Fh*r;ZfrrV-'drVuZlp&4a^p&Fmes48qE+=d*BeYT$ZA1f5'r;HTos8F)>rqU1Q+skP, +@3Qa5-7;sopAb*kq.h3!-.;_jrr)Bd&bl8(_CZoV+(kHKs8Dfnr;ZZnrrN&irr3#pqu6U!r;$Bm +nlYl=&kdhoo_JOer;Q`ls7QEis8;omrr3#orr2fqrq??orqH*_qYprtr9<;-oChA>m+pe%rr`,p +q>?KWJ,~> +Sc9W-rVc`qqYUUC;rqH0drVu]lo_eOZo`+abs3iG4)'nb,d@m4L@4W\tqu-Kn+9)69"Fp+!=PXoDedhph1Ze+3sc_s7-($s7lTn^F'p?).NI>s8;]lr;Z]orrN)jrr3#pqu6U7rVHQo +mo(AQ,"@$so(W.`r;Zfns7ZKks8Duorr3,srr;utrr2ios82rsr;QZp!<)op&cV[]d]fC6St2"< +Unt]kr;?Qms8Vusrg3Y8~> +RK"Z5q"Xmhr;Zfqs7Z$)UMbK.`A_o9gA +a2l<<\B)h6ajWKb$Q"0BccF#B_o9pCaM?'?bfS&LfZVRk\/Geg'\gF1KRli_"ougEb9G!KaNr5X +c:el_&$sq^&.K$c(-pX$e&T\T7h61BZd6_4`U_)>`kKF@Sei"S$UrOjf$MUa`lPs8aiVK8bfS)H +`Q?0A_nOIIcohsQ%kqLcbg+S^aMu?;aLoR2a2>s6aN_oDaND`Lb/h[%`WaH+b08#IrkfMkb08)N +^6XR`:J=MV4AK!nPM,R'r;6Kn!WN%`s*t~> +UAkDpq"OR\rr2p"rVuosrr3&ts8Dlq#MSA*m-WfalMLS]rr2fqrqcZkr[IgFs8Dutp](3lrr<#t +qu-Nos8;iqqu4Hs9.Jp!s8)]orr<#qs8Duorr*f8qYpKjdip(^@f-*$qY^9dpA=^ds82irqYpL5 +rqU1Q,::b6q0je?*?c[UdJNt?q.Lrr-.2YYrrUEkqu?WBdd6i0q>^Bhs8Drls82irrr2rsrqu]ns8Dlmr;?Qfs8Vfnr;-F"k2PdpqX3e +ScA`h!r`,sr;RW5qYpBjqu$0CW2#lOT:_dnn+lkXr;HWorr)cm!<)`m&,lM-rVuols8Duss8W)q +rVlisr=K#*rP4Oc-JnY"qYpNos8W#rs$$;Zs8N&orVcN;*$-)+q"jm`qtp-\qYL6lqu?]ns8N#r +pL50a+jBcUH6j[K)''pGq#C0aA/lO1c27M>s7-*gs"X8o+;l+<,l%?7qZ$?jr;ZfmrVuoqrVHQo +rr;ips8;`lqT[=Lp\agdr;6Nns7u]mqZ$ToqZ$Tprr)lprVHTnrr4#)OK +kPP5Trr2rtr;HQkrg3Y8~> +RK*6_!<)lr(&n75p>N;o>Y\$o=^?HX]"Z#"aNW!/d0.e?bf\*(aCiQ7bf@iJ_9'a>b0/&Pa2c3A +a2H*Eb0cYs.LX#Ad) +`l>p=f%I:6bLG(bdDj&D_Sa(0^rQGn#KOg'`5K[;ao0B^aSs3Za9B`1c-=JPrl+oY'ZRtsQ=j#h +6r-9M>?>RVkkb>Zrr)ir!r_uoQiDR~> +UAkDrq=sd_r;?Qis8W)rrs.fIk2Pdiipm$J"oeJrpA4aas5O"_rV?-[q>L +SH&Wgqu6Zqrr)fq)Z9C&e[;9MS>DdN_!Umor;Zfpqtg9fr:p3gnG`Cbrr2osrr2oq#l4,cq#(-i +rr2oq#6+Z&rr2rtrr*`4s7Wc@*["kbrqu`ps8Dors8)cos8Durr>PBC)&aaEr;ZDq,U!m@(*]RL +rUj\C(`pius6osdr!`EH)&XD=q#C?nqu?Kis7lTlrs/Q%rVZTlrVl?er;QTnrr*u=qtp?irVZQl +s8Mokq!R1TXJ)A^TU_IAa2@<@qtpBm"TJAurr/2_J,~> +U&P,kq>Vf?qYL*fs8W)sqtg*Yl.iCg>#%I^;-SLO\%fc%c-4M[eBQ:X`l@Sj!QrXbblZ,3aSs1Y +aND`Oc,mrCair&Sai_iPccsVO`Q6->`Q63Gc-ae%$P3b5cHs_WcHaVVcHF5La3)<=_o^*HdomCp +$DGVic'/bW',M,kMpg2-:)=NUZ-g\7`UV"[`lQBR$4..J!mJs2c,IoArl+oWprNER%EcrCe'l^h +b/V?8_8F1f`VmgJa +U&P8pr;QWnr;6Qoqu6ZqrqlcprVm/PeE$)dn_3'urVllsq#B@Q#64Z!qu6WqnGY?Bs.1M[,,,&6 +s8W&qrr)Wjs8;ois8Mrrrr;gn+sJDbqYpKmgES-l,:+UWr:aeJ*[f\@rr)?crr3E#:*;&/-d;Ac +q=t!idJit>"o.ros8;fjrrhrLjQc45klTl,eF`bBrqub^s*t~> +Sc8]hqZ$Tp!rW#qr;R<*q>9]^T;/0LSsHP'oDSUdrs&Juq>1-jr:0darVlfqs8;lrrri8srr<#t +rr2lorr2rsr\s]QRNNOiSc8Kcs8DlprV6?kr;ZKjs8Duss7f;-*$`u0rr)`H*[;UC*Zo@so3`LQ ++kHVkrVuEerr3>t8K&il,Kfc\q=ssho`"dgqu6KmnG`7`*rGp9s8;`mrqufop$gtVStD[RTV8*K +VPr\Nr;6Hlrr<#s!W;n\s*t~> +UAk;nqYU*g-2[Q9qu?]qrV6*]q>'XIcZ3/e:J"G[BSW_$]Z&%=c,n,MbK%Tma9]r5cd0k\bf\$+ +``1%%b08#I^r+.6cHF;Obg"JYbfIlJb/VE?aNDZHdX;N5$@paNbg"8Nb/qZHe&]\Fahts8b0A@! +'bC_L`6-?Q[gEog(_dBWg=f@?',A.,aN)_84%/kf=gbaN`)Sb0J8Na32K;X+!i45=In4;G_%Pa6**nrql]ks8)fpPQ-.~> +SGrfmr;6Bhr;QZp!WN&rrrW3"rr2p'e)KicmI0&kq>UBur;HQmqYg:3e +BIFlD,.@ILrrDc;rXA`%q>'g^q>'g\qu6NlrsJDThs^+)mc*9\f(/hBr;6J[s*t~> +PlLd_!WE#os8W$-qraTCSXZ7LTr-*&rqZHhrrN)unG`Idrr2Eeq#1Borr2rrrXAi!J0GgKOR`/F +q>L'es!RX=s8N&qs8N&trq7f\)^+bLs8VrjqGn[V()S2kej^Pp-KkC.rr;Nf$MjT!p1#6[(`]jY +rr3#ns7$$cs8W)rrrE&trUTs\ru:q:s82Zgp#a2hSYr0RT9uCLWoisPrqlTkrql]o!r`,tPlH7~> +UAkAnp@e@]qZ$TorVmrO`r3mS +`X9Z%`Q$$A`l6$?b5TTgb08,SaN"2"2pK?P&eG\+eBQ+SahuL`5T^:cPdN1%*H]8 +cH+)U3>3)8$4T&94<#%Qb0\8Ob43Ob`Q?TU:Djl_%[Y\md`]>Cb09h,!6kA`r5]Dg`P][6aN2B@ +`Poj>dF$5^V..UKO@YU8H(se>A/H(hXUC;s8W&lqYL*fP5g%~> +S,`Eas8N#ts8Mus"TJ>rrVlfr'&W!AiToa`hY[3Ms7uB_q>1!dir/rVrr2lpnGY?>BcS<@.8Xc) +T<6Z#p%/4ZpAb$cqZ$Nlrq7HZ+"$pcq"Oggq=oF`.3Tca*[2gO/GT5Err;Nfs8NQ'rgY2T+sNBJ +p](3ks3^iGrsJc'qt^$]pA4^`q>C7#mbQ^^m-+$#mH*$krr3,trr<#sqYpZsr;?P\s*t~> +U&P2nrVlNj!<2`m&cVJ!pYDO>Tp24ESZ1#or;Q]ms6]gZrrE&ts8Drrs7uWqs8N#ss#0O^(E"/9 +94rI>X4,kqnc/@UrqcHfs8MusoGS\d+o;66p](9hp3I]')]C%>)B'D=p&4pis7-*grt"l%QQ-bY +)j9jes8Dutrr)Eequ?Zps8N3#rVZTmrUp-ks8N#lruV%:s8D`R`2TB'Tph[@USas7nbrLcrr;up +r;QZorfR52~> +UAkDop@S.VrU^%0rVH#Ra`<)-_QQ*[s3_8jgGc-#Y!!6Y;b!m8U(p;R$Nrl##Y +`Q#p=rlY5a"3AL'aSs1;`CC.H(`55';0R\p[EQhIdEU+^`PTg:_oBk,((^u*d`02Ib/;J7%M]?V +((D'#(`:iKb/h`qa:ZeCa45eV)]TH;dE9eU`Q--Gr65)]r5]&]_nj1,`r='Z`WjT3e^`!jc2>fa +b5TK^`[\sI`lQ6Db/_ZH`4j(,^9sS\?;sm#85DWU@s"[(nbDqXs8W)ss8DilrK@22~> +RfE3_s82lrqu6Zlqu76#hWO7emH +U&Y,jo)J[fs8N?#rr)Zeq=Vo0U^WW_SYWI?jSo2Zqu?Q]rq-6jrr;uurqHHmrr2rtrr +UAkGrqY9p`qu,m](&d^efpu\[>YnEu6b05e_'-.i[eCMdYahc.!bl#W[a:QM8_nj1,aNVlNaMuBIe^`"Ebl#W]a +T'6]`Q#pra;r7;^q[XsYEsWC:fUFd8m#)$F/\!bq"jsdqtg3gr;QcqP5g%~> +PlCmcr;?QnqYpQpqYq&nhr*Y^m,Hg[r;?Tos8V'Wrr;uss8VWgs84aAH"/s82fnqtp'E9-YE++<_jQqY^BlrUKjts8DrodNfq[,ZOO:qu?Wndf04F +!;uin!;u`o$Lcm/jQ>UimHNQcrVm9(s8Dlns7lNlrql]nquH_\s*t~> +UAt2kr;Z]or;Z`p)?9^8qu-Kkp&4gZ^S[ZoSY2RM[GC!Dp&G'\rql`nrr2rtrW)utrq$0hr]'rV +r0DJ3,UsfX)&=>7(_n)--6"$Wch.8;rr;O:*#9dms7lWls8DlloA)nX(*aV4(a&MMs8DodrXJo+ +s81+a)&s_qpAOmgmJd(a"9/8trr2p!rr)fcrW<&trqcX0rVH'DbH[b7TV/$TTq%t0mJ6VSrr2os +"o%oos82fns8N"as*t~> +TDo)nqtg0drU'UurU][Db):1J>?+Qo:LK0Q]XlA3n&YOKrl"lWr5_dU`Q$3Kc-",KaiVQA`P][6 +`l?!8_oBjCb/V9;D-0FH(((op&/Gle#7q(Q"Tet,`6ZHBbK1P9%MRCAaNhZ?_8FF<]IXBq*>fe3 +$e38ef](uao]YT%qu$Hni;W`Smf#'?s8Mfjp@mFn +WL\'G.k2hk.4-&_hu3TSqu?=<+!E!,q>^ +U&P,lqYp]trVc`prr<#tr;RZ6rVHQms8Vlop\X0gV4sERT9u@Nbh_sfrUBgbs8N#srV6?ls7cNl +rrE&trAFTPs8McfoCgteV3u47-RKrY,U"!Lh#%-Nqu?74(E+Ikq#C3hs7cQmrr;V$+VYk4*?b+U +rr;Nf&,Q2's7ddLEgjcCq>^Kjs8N#ks8W'!rVlcqrquirr;ZZn"98B#rr2rnrZ2%X2=0!q#(0hq>^Elrr2urq>^HnQiDR~> +Sc8ljqY9parVZZqrV6Emq\Ar(rUp$OjN)[6-@9d_8XLAdEThLa3)TUd)r]#ML88o$k3OP&IedG]@>6Pa3MpE'G:o'aOA)Gbe_TCaO\g5 +&Iod"(CJO3a32Zra:H;0a3;[,:L&1/cbIKF_or&#p;RZbb0A/M_o9X?ccsVM^V7J%qoAlZaMu=# +`r4!Y`rF-[arAFA^q6nAH=9oR;bKbX92TVjb3&0fqtBRTpA+I_s8DupQN)I~> +UAk8nr;QQor;QNls8N#t%K?;&r;HZqqu?Kep\4[crsJGWkjA!9ki:Xorqucrrr)cprr)llrW)ln +rW)utqucotrr)co!;uTj"985ps8Musq^qaCq"a^Vm*W/0L1gP_rVufqq'-n--2@N=rr;lqqu$Ki +qYuO$+W_mTp\t0lnG`Fe%/9f"pA4^eq#CBgs8Dior;?Ejq>C9lq>^Emrqu]np\tWij5B%cm-X-( +k2u=6rs\i$rr2forqZQmr;HNlrfR52~> +RK!EhrVc`prr<#tr;Zfr"985trr)j2rr)TLa.f2pS=l:CX30>rr;HTnrr)lqrr;rrrr2rrrr2lq +rql]rrr)co!rr9!rr2utrr!-%s82`or;?QkrqcZh.JE;rcEEUeAGu<$s8;ok*Z$"DpAY$is8;oo +rVuZfreMX7(EOamrr<#frr2p,q#C6_p\Y!ds8VinrVlHhs8N&srVulrr;ZZns8W,urr;uss8W)t +s8=/>qY9d>^oa9#T:MI@S=QOmiqiTLs8W)us8N&uqZ$TorVQQn!ri6!Q2c@~> +Sc8]grqZZmrVccrrVucqrVQTtqt9g\rr2p3qXNISQ=jAr9i4M\@=k#\^VRn/aSj9[aSs?^aSs0\ +aNDa*c2Yugb/aM##0+^+aiqoMrl@CJaMYp8b0SJ]b/h?8cHOMO`QZ`TbKeGWaKLbTAOY>#d*KeY +cj0pg#1(TaSj-X`V[X[aNDcP +aMu6@rlkVh_nWq#_u.LR`qd^S`ZW@B`l5d.\!qbV<`)^h;,U:oAr!kOmIL5UqYU'Zq"t!grrW/p +rVc`urVQKjQiDR~> +U&Y&io)J^gr;ZfrrquZn$LH[.kj.F"o&99@rr3/tqXsX[r;HWtrr;uqrr!3%rquZkr;Q]qs8;im +q>:dX!<)oo%K-2(rqu`i.junur;HWorr`9!qu?Wm$+290+>*Bfs82iTrr2rtrW)loqu6Nn +rr;orqu?Klp]C9gr;$?mrVlftqtg +R/d0bmJeL2s82Tgpt`TYT:hjHU8FU(i;3?Mq>U?mrr;uts8Dfor;6Ekrql`qrr;rcs82fqs7QBj +r;ccpq@3?#rr2iopF.F<.Js&Brr<#t&,cJ*qtg,o-QsK\p\t3is6oses8W)urVulss8)`gs8Drl +ruV1UWVS_BgJcGZJJ,~> +SH&Qdnc/Rdr;S8Do'PGINbVct9h.lT:3r;9]u7h3b0.uNbKS5Ub0J,J`5T[6a2Z-?b0'_-!6G)X +s2b)Ws2G#Xs2YVkbf\#H`lQ6Db/hZHr652c!RK'jbl>j/bf\#MaT;GE!mf*7bK7lI`P]j@c-t7- +$3gJ6bKS2Nam[=N`WsT/c-=JR`l@krpr<Uc-+5K +`P]g=`kf +JcGcLqYpomgu7VbmdfDlkP+rT!W;oqquH`mrrW,pqYpEmrr],jkK%ursAVtq>:*hs8W)tLAuc~> +JcG`Ls8^Blp\tHsrVZQiq>UBn#QF]"rVuosr;Q^1 +rVQNdjNOs'St)=DT:MOHTXrqOrdk+Hs*t~> +JcG`L/H5P?mG>jKC0FY.5Y4dSEfdTBbKS,Pb/hWEbg+GUbKS)J_o'I4`l?*@b0'P$q8VX>s2Y/Z +,0.dHd)=>Ub.ts$c-4DSbK7cDaihcNc-O_?G]n2RbK%cKh8oE3rlG#[q8iTY.*TiM_oBa=b0.rN +c-=AM`lQ6?_ns!\LhTa`8kVrV:JY)'L9fCoo_nagrr%NMJ,~> +Jc>`Mrr)rrqu$I$f[A^>k3;-oi9gL@s8W$*r;Q`prVZQhqYU9kr;Zfro`*kKs8N +JcG]K(&[n)qtg*AWLKWWTUqjPU:Jb?pAFpgrrN-!rqlcqrVuoss8Duss8N)ur;HTlrr(dSs8N +K)ZtlqY9sdr;?Tnp?]SE@TcDr92APfDMtU*_8jdFbK@oJrl4rX$HgT6aMu6=`P][9p<*BY!6X?C +s2bJ_`lZHNc--(0!m8^-rl,Gl_TC9Qf%.sgaiqlIaN)cN!QrLZ`rF-[b5KO1bKS8Wc-+8O`5Ta8 +a2lEDbIaO$@T#ol:.RoL;HdXQ[F+(&p&"^frr%KLJ,~> +Jc>uQq>1!cqYC-grsJJRg$.V]lg*Ejo(r@krr<#trVc`prVuosrquU?gqu$Hms8Dcn%->mkkNM:)nF#W(ip?RB +rqlcqJcG`LJ,~> +Jc>cNrr)lsr"o2(p\F7%XeDPWR@g:IZH2\2p\Y!jrr)irs8Dus"98>urqucsrVZWmqu$Km!W;oX +rW)utrX&W%qu-Hms8)Zlrr2os#l4N!qu6Khp\t0l"9&8trS@JQs8;lorVlfqrVl]qrVl]o!rVon +rr)ruqu6L1rVlflm_bluVOj +K)YuPq"OU_r;S/An`7f[C0+P4:/OteAq%"n]Yhb0`PfsA`lH-Bb0.rMaMu6=_o9^pb59E^blQ&2 +k/[PErl>Mo`Q-*Ccd^+]bKS,Mrl,Jabf@]Fai_ZLda$%VbJV9Ia90T+`l7nrr5eiZ--Xc`cHab[ +b/_B6^qRY'`4`=$>Zars7nQBK +K)YuQqt^!]rqQQlqYpokg$/%ikihHtj73$Hs8;rsr;Qitqt^3c!;ucps8;ln!W;rps5X(arV?Kn +qZ$Bgs7cKprVulprr30"q#C9js5 +JcGQG+TD?;qtg3Vbb:l2R[KV?UT25lq>L0fs8N#rr;HWnrVlZn"TA8rrr2iqs8E0"r;6Ejj8K>_ +q>^Kks7uQlr;QWo"9/?"r;Q^#r:pm4 +s8;Q`qXW=UW1Tc[U7@dGTqA=$iq`HJq>:0js8W)urVl`pr;chOs*t~> +JcGKE(&dgkjNXKtQ]=l2__un!!b/sG$qoJf[rQP8c!R/^Ha9]i(aj%iPa2uU* +bS84@`l?!;`l6'@`m2rTaMQ0>`Q-!WaT'9WaSEsZaN"2"rlY8^s2P)X,0%dKbg+MXbKJAW_7mXe +P'0r&:fC+Y77^9[E0\2pjR)R9qYpZpqYL/Cs*t~> +K)Z2Wqt^'_p\Oa^rVHBj$iB,Fm-3j%khk.VoCi1crqlNjp]:3grVlotqu-UBop\=^hs8)Zlrs8H#r;ZfqpAb'Mrr;luqu$BkpAb*jqu?]q!;uin!Vu]nrqcX(oAe`h +me-)5iT94Xm.UAWs8E&rp\ssgqtg +JcG`Ls8Dut%K?D(rr2]lrV#^&YG.onSI2$]Upnb6p&4acrr2crrVulns8MusrqcWsrqu]ml2C\] +rVlfp!rN#nrr2umr;QWo!W2iors8K$rVuosp](3Orqufrrr;rqr;HTmrqlWorqudIrr<#trVlis +pA=UFaK_V7S=H1>R@pIS]$BO9r;-0_s8W)us8Mrqrqu`nre(6$~> +JcG]K*W?!:qYp?krV$$]k0KZIB44Y18kVcUC5JXh^;%Sb_un$$b/jG%rPnfWrQ>,`!6XQI!6>&Z +rl5\kcGRcLdDa>Rb0%fF`l5p>_SjRq`sBN*`5g$>^C2gShsL(/qYC-oqtg*arIb-#~> +Jc>fIrVl]o!<2cn%/&W5jlu$un*/]cmf*.as82oprr)iurqu]mrr;oqqu?Qorr)lXrr2j"s82ip +r;$?lqYh$'s8W#lr;Zfpqu?ZpqZ$HPrr;luqu$Bkq#CBns8W,us8;cks82lrrVuoqrVmB'lf.!l +mHsW8n+5\pjRi?L#Q4JsqYC$drqcWsqt^'eL];l~> +Jc>cIrqcZprW)usrYYP2pX?RFTq@dFUSFN^^Y.c>qu6NjrVliqrpp*hrW)oWrr2j"s8;orr;$?l +rr2lr$2so(rV?Els8DlprrW)tqr7VQs8W)urVuforV?Heru(e8rqlTlqXN^r\"oXhSXH"2R&$IO +]\3&Vrr<#ts8N-!rVccprdk*"~> +Jc>`Jr;Qs!qY9d[qu-O3mGlj$LM:-s92&,V;-eC2XLlBi`59I3`r='Y`r*gK`oP5>`u`.?`Q#g? +bKJ&NaMu6=`Pfm?`4s40a2Gj9`Q#d<`Sno<`r4!Qb5]Q_b5]]bblc24aMn.r*6-.C_o'='Xdt/] +=&N$t:f'SR=^,BlY1;LtoD8Cb!<2ut!WDlop]:6iKE$H~> +JcGWIs8E6$s8W#srV?HlrVm8ohra4imHWcliR[8brrr>tqu$HmqZ#^W!<;op$30r&rVulsr;Zfp +rrS(rs\l(qY^6dq>C9mr;-Eirri8qq"XiDs*t~> +K)biLrquiprr)ls"TAAuq>UBn'DhL\^n[ToS=Z=CTVnX%i:QmCr;Q]orVulos8)`os69L_s8)^& +s8Duss8N&rs8W)tr;R9*r;Q`rqZ$Tprr)irqZ#ORrr;usqu$Nor;Qcrp&>I"r;?Eer:o3jWMcJ_ +rga"Xs.9Rk\)@,Zs8W)trr30#rr<#tr.4nFs*t~> +JcGcK!<2ut"oJ)fpA"C\rttY'n)rN=P\jf.:JXe_<*j'dU:%YI^r+(c`W*p[`Q#m:pr2L=!6P)Y +(rsS7`Q?3EaNMcJaMu6=a2uBA`QQ<;`lA"r"3&O'al1>@`r4!RaplG3`lQVbf\#HrP]\q +_nNdiQZlG.9hJ&R;,^V(@:t;&gZJ,'q>L9l%/p)%qt^*cqY9j^qu)0IJ,~> +JcGTH"9/5rrqucur;6BhrVmArm,mHrmd90%i8`_cs82cp!<)lr"8V]bqYL3qrr)ipqu!)cqu?]p +s83K)q"FU_r;$0gs8;iqrVZ]pqu$I(o]kArl/q6slg!j!gZ/&)rri5oq"ap^rrrE"qt^-gL];l~> +K)Z&Sr;6EirVlZn!ri,sr;S/Cp[Q/.Un"$LSslOKVPh;chYR0Ks8;ioq>L?nrr)lrq>(!eqt^0g +s5O%Vs7uZms8Drms5!\Ss8W)prVc`rrr2rtr;Zd@r;HZor;Zfps8DNJgVg@kTqS'LTq7gHTqf*E +l1OoNr;HWls8W(Ls7lVE~> +K)YrOqY9scrri;sq"jmes"F?Jqtg*Wj40ZPC0Oe?;bU1e`Pfs?`l6'@ +`50@3a2R#YrPnZSrPniZ!m&C$rPefV!6G/^iQ2&=s2b,\s2ch7aiMN?_o0O3`QQNKbKe5Nb/V?> +`jhh1G[O<@9hJ&R9M8&[BS`b5i9^(3qu6iuqY9j^qYL'hrIY'"~> +JcGWI"TJ>rr;QWo!<2um!VuZkrs\DVhraCilL=!!j5'2"rri5qqt^6err`2oq#$ibqu6]rqu6Nq +qt^*fr!*-"s8Dlqr;$?sp#G#ik3Va>m0)Y4hWF%rrr`2rqu$ +K)YiMrqccprVlZn!ri/tqu7Q4q>0U4\tbacUR@^NT;/?a`:ETtqu6Wjrr2p%r;6Bfrq?6cs5O%V +s7uZns82fms4mSRs8N#sr;uuqrVHNprVl`p,5_<9rVcQcpYEusVOa6IURe'RUnXT_[cQuRrr)cm +qY^ +K)YrOqtp?hrrE#squ?Trs8Drqs!dg7lIE2!D-U4G7n?KO<*Wg\YHk^P`lc6?aNV`E`lH-C`5]sB +a2Z*;iQ1u;q8iQT#ft04b0%fF`l7qs"j"j/bf\)faT'9[aSj6la2uNHaMu9A`P][:bfRrLrl#eo +_nNdqT8%)a8ju*>85<5h>$PZd][>g/q#1'h#Q=AgpA"L]rV6EmrJ(?&~> +JcGZJ!<2rps8Moq!WN&srW3&urVm?+khkLil/q6kjmM6rq#:9prVu`lrsJ]$s8;Zequ$?fr1a2h +s8Dp%s8Mrnr;6?frr3-"qY'XYqu72ujQPdjlL=91l0INggZA"krrE&tr;ZbIs*t~> +K)YuQrVZTloD\gir;RW1rVZQ\e@;L?nrqu]rrr)ips8;lmrr`9! +rr.ZPJ,~> +JcGBB#6"GrrVc`prVn8@p?gnbWeY7i;GB\T84crcBS;h^^V@n.b0.oNbK.`Lb/VKEbK@rcaSX!O +a90T/b0'_)!64uYs2kDeb0&_bs2P)[rQ5PnbfIcC`Pf[gSo(;YPrqud"rVH +JcGcLs8Vckqu6fur;6 +JcG`KqYpQpqu?]q!r`,trr3r:qYgBjn`@X"V4sfYSXGt=U8PTIhtm0HqY0sfrrE&srrW/us5EtS +s1eR4s8W)ts!%:UEorr2llrr<#qrr2rsrWE,s +r;DBMJ,~> +JcGZJ!<)co#6"DprVuioqu7u@i2HZe+F/q"t!c +qY^?krrrAuqYL*fo`#$lqYL/Gs*t~> +K)Z#Rq>'pcrql]urquZhqtg +JcGWI"oeJur;HWms8W$#r;HTnrqQL*p=I@s8W&np\XpbrVZE`p?LAFX.lDbUS=9MStDIGWOfk$me6JTrV?Hks8N#t!<2ors8E-!s8N&t +rr2rrrW<#rreCH'~> +JcGBB!r_ohrr3-"qtp?krVm<)q"4%?gpiu3DIQUCr_*u(='0*gTAK%\^=_Q9o_7tRqu-KnrVcTg +qu,s_"9&,orJ1E'~> +K)Z#Rq>'pcrql`qrr2cprqcWsrVZQirqQTlpAP"%q!Hu'jQ>Uflg!WkgtC][p&Ccc!rr9!r;?Ys~> +JcGWIs8<#srVcZo#6+T"rr)iqqu7''s8Vurqt]L#\"KSsSeI`kTV&!SUpJD.n+Q_Zs8N#trqtaS +rVuQirr;`lrr:jSqYq];r;Q`opAagGfZL\"S=l=@T:D@?TV.pNWP6sMp\+Oarr30"s8)TirV6Bo +rr)ips8Drqs8N"Os*t~> +JcGBB!r`#nrr<#s"8i&qrql^5\bhqdYq>L?mr;Zfq +rr)iurquWlqu?Wlrs/Gtq"FFVqYPjD!<7Q~> +JcGWIrVlZn#6+PtqYL-hp&>$kqu79-i8Ek`mHNcun*B3'jl,.[q=ajgrqu]WrW)lprr<#Wrqu]g +rq-4(mGQUKjlksnm-X93lL*ruhqI/\q>Up%rVZThqYC$ar;?QnrVlfnrr`8ur;QQm#6+Ptqt^-g +L];l~> +JcGBB!ri/sq#CBns8;lp.K'&?rr2rtrquHYc_mG2StV^CSYD[FUS4Na\'ja@pA4X_r;?Nmrr;uq +s8W&us6fjds8Muts82fms82fns760es7HSY)=BTV%jIX2ON$ +q#('hqu?Qmqu6Zqp&>$kJcGBBJ,~> +K)Z;YqYL*fs8W&rqtg0drV$6pqtg*`r;Q]q-iX/Gr;--Tkh!tNE+3-R$YZ[O06"# +^;%M#_o9U7`qd[U`pUnJ`q[UZ`l5j7`Q#prb5]Nc`l5j5`o"i^`l5d/^::_ZTo+)4@9HH%8kDNE +9h8/`>%(r`Qe:Nio_87\r;Qisrr)`o!<2inrVlrtqtU-`!r2ZkJcC6~> +JcG3=r;Q?gs8Mio(&%%Mio9%^kj%Etlg*cpjm2=-s8W)srs/K#rqcEcr;?Ek!ri/tr;HWms8N&u +s8E0!qu$Bkr;ZfrrqlltrVlfqrrrE%rVZQirr2oqs8EW/rr2inqtg3dqY^?kr;ZfrrqHF,qXES+ +k2kXblgF-,nF,]/l/(.Uq"4U]rq-6jrqQNkreCH'~> +JcFj3s8Mcm$NC#%r;,g6a/,N(rh'4]&>#MfTUqmWZ,G/Mh=pX@s82Zms8E6&rr2rsrVlTl"9/?# +rqcZmrqud#rr)cmrVc`os8W)ts8N#tr;cimrsAZ(s8Dlqs8Dorrqmi7p[7(rf>=kjU84QXTV%mK +SXuIET;/*V\C9g=qYgBl!WW.Ms5!^*~> +JcG`Jr;Z`op&G!hp]!&JqtTaKki:+'TPn@L>$"Tr8OuEH:/FnqBRPu5R^]fA_SX@:aiDKC`l?!< +`l?'=`PojpaTfi/aN2BA`V[[T`W*jS`W*sXb5TQibf\#G`lH*<`W!mS`W*pfaN;THb/q`Gb/_NB +aMl-t`tHJ5]s"&mMfiN0;H?dt;c-:_8H)3k;-dXNO1*[)nFl_Tqu-KTs8W&rqu?VGrrE(L~> +JcF^/q>LEprqZR!pugMjiofUorU:*]m,d +JcFC&$i^)(rr2lmpuKW+Vu<>#TqJ'MSt2FFVP^?0cIh7Srq[-&s8MoqrV? +JcF^/s8Dfo1&UkDq"F@FftF)4De!!O:eaSU8k_lQ;d!@4HAIl]\@fMg_8F.+a2Pm2`Q6*!rl5&Y`;[UZ`lH*=a2c`Q$!=a2Q* +JcFR+s8MTh(&[:Oh;@/PlL+**l0@?mm-EcunFZPCs8W)trr`9!qYgEkrVlrur;6Hg!W2lprri;u +r;-EirrMrmr;Qcro`#d'lJq$kkN1jilKdZumI0H,lL!]oiSWeeJcEsoJ,~> +JcF@%s8FSJs8N#qrVZQ^g:s\bTU_OETUq[IUR[jIT:;[Z[DL>MmI^,Fq>L +JcF^/s8Dfo0`CnEp\+=QoCMG7e[L`eC0ah8:/4AP9i4MU;H$CqAoN6\Trtl:]YVS+_Sa@6`Pqeq +$-103c-4>Qa2c3ub6,l,a2\%rs2G&[rlkDa4ibO\`lQBIbfS)P`5Kg@c-"2Ka2c3<_SX$qZa-j: +S;DK'=B&0p:Jk"g:/+JZ8k)6E=(H,lOfm!nmIU&Mp]:*eJcF@%J,~> +JcFR+s8N&u!<)co!rVrpqYqN*jPSnSj5K4gmIK`9p@7\AlK%$klg=3 +JcFF'5lL`_rr2lorVuoss8Dlhn`JB9XeheeTq%aIS=Q%6S=6"BTqeTn]?8X[io9%fq=j^^r;6Be +p\F[_r;HWps8;lps8E&trqZTor +JcF^/s8Dip48o3Xqtg'\q#C?kqXa(3eAA8HF_5)g=&2Xg92.uL:/+\j>[M,aH]"#XUS=Wi]Y(to +_ns7)_8aO8a8X-\b/sY+s3(MdaSX!WaSs<]`ra5u`W!t8aN)6;_og$:^V%:r^V.1_Un4'AN-T8L +=]/*s:ImlB7Rp*G:f^Y">?b9;B8WIrdH'cjr;QotqY'UZJcF@%J,~> +JcFC&!<2lqs8;rsp\u9-k2G=amH!^$na>i7nEoE"kNUs]gtpuMlL+B@rQY?Sr:p'Wk2PL_hWNq[ +kiqF!l0836$1@ +JcFC&"9/8urql`prr;mMqtg$Ujjh;XVPL,YU7@jFS"6.BR[ThCU8"E\X0B1PbL,&(mIU/Mp@\+P +p%@tMr;HWorrW/urr2rtrr;p\r;HTns8Mrlp\+CYq=sINp@n+>g![gS\?2[-VOs`YTV8'SURn*N +TUq^HT:MUJVR""dkOn]Lr;HTlqYg>Cs3L^q~> +JcF^/s8Dfos8GIbqtg0ap\4LZqY9dUn*K)eag@[sC0tCH=&Dmj9i4ee;H$_&UQ]tCqf\[oGfaihuVd*^7ec2,W_c2YucaT0:'h"8r&nrIP"#s*t~> +JcF7"!ri5tr;Qcrp&?6/fA5-?gu78Skj@d(lLF6,lf[g,oC)#- +jl,(Ng"Y?ElfmTrlg*d$kiqF!m-Nm6j9=N#iS`Pjq#:BorVQU!r;-9eq=sr?s4@:$~> +JcF@%s8<'!rVQKjrr`5tqYU3g1B%+Gk0h)?VP0oYTUq^GTq@mFTq@mJT:DOLT;&*XWN<8+]YDG/ +db*C6o(;SJp%J(Or:U-brq6Edo_&1T1[O5[f@%pb_n!4\WhlMdU7n6OS=Q=GSY)CASt)@BR\6IP +TqA$QTuYaLq"agarVccpr;6HmquH_Is3q!u~> +JcF^/s8Dcns8E)tq=ss_55P0Us8N&urVQ<[n*8cDUQ95/A8#.O=&i7$`N.l_'E+r`b=BJNt9hS&M9he5U +92&)T:f'ng?!UW<@:sACY0,YcmI^2Kqt^*er;Qfsqu6Nor.4n!s*t~> +JcFF'!WE#irrW2urq?@9rq>U +JcFX-rVlis!WE#ps8W&tquH]prW)onrs\i%r:]mNi6K +JcF^/s8DZkrr)ln!<2fo0)PG8naGi/khb.=\YGC@D.-UJ;bfhM7nQBC852lV;,C.g<**+%$+m+;Gg=j;c6UprDW_q!)EMhs%sY3;,gS!>?=s4@r?m^ +U9r,!k3MR/o^_PEqY^@#rVH?`qYL*dqYL,@s474#~> +JcF=$!ri/tqYpTqr;QTnquQcqqu6Zqq>UZmmdKo;j5g1&!p8b4rp0dTlg!d$rp9[N&*iEElKdg* +n*]Q/lg*p(mf)Z!md'0$l0e$/mdBH-lfm^"lg*j$l0.9kkN:gaj5/e^nF?AMrri?!qtg3hrri>t +q>1$_rrE%Ls474#~> +JcFX-rVl`p%0$5)s8Muqr;Q]qs8Mio)ZK[7s8Muss8Mc\jk%Sd[C3$(SYDjOSt)@CrL`tY!2'7^ +#+qQ]T:_dLrgs.^qORe[StDYPT)YE,S=Q:FT:VUESt;RJTqJ*STV\m%\\cbJlLarMqY^?ls8W)s +rrE&trr`6!rql]n!rDioJcF4!J,~> +JcF^/s8D]l#6"Q$s8Doqq#<5Jq=sa^q>:$^naGc&e&A\fN.#hjAQi;D>Zb!';,C%a9heAZ:ej\W +7n,s=84cBC779O68cDB_8H;9Z74Uo$91hW?77Tj>91qlM:/=_`:JXni='Jp7@:a"dH@gm6U9D\k +j65h"q#(-k"TJAsqY^6j$2j\sqY0d^qu-JEs474#~> +JcF4!!<2or#6+Puqu$BklMh=in`o9"lJUX^lg=$)nG_hUn,Dh`n*]W0n*]T6n*^,?,4=pfnaYr5 +kiV*so'u5?n*TT2n+#o7m-j?%h;dhglg=EFoDejip&+dfJcF'rJ,~> +JcFX-qu6$`s8N#rpAPs0rVlfpnE8QO`4WUhV4jNTT:DCAS=H.@SGo)ZSd1g[St)LGStGnOs.(=+ +S"cIGTU_UES=Q4@St)CFT:DC@TqA$W[(*W^bhD.Jq>U6or;HTnrp'O]rdk+#s*t~> +JcF^/s8DQhs82ipp](9ls82ip+TME=qtTgRm-!BdhUK`_Y+Ll7Jo,"&>#e?l:Jak_91f+Qs%*Gd +9LhH@77TlH8MEY'6:41.9M/#Q7Rfm;8kVcN9i"V_9h\;_?=e)'KSbqh[`-hVk3D:$o_/(TqYU5B +s1SG_~> +JcF4!!<2rss8N&r!rMonn,ELgqtp?brs8A`iS`_UjQ5V)l2U#Kk5OZKn)s-,rTkEin+,u +JcFX-qu6Ek!<2`ms8E9%r;HWps8N#srVlfnrt>>/qYBp]pZUMab.FaMTVA-QT`1S`TE_*\T:VUF +Qhm9XSXuIHS"lVTTH0c"T;&$OU8"?RStW3r`RNW'o(VkQqt9d`rr;usjT#8Z!r`,tJcF@%J,~> +JcF^/s8DNgq#0[]-2dW8q=s[TmHNZefYb+nQA'Bn@qB1Z?!:9.;cQdn;,0bX6:jcI9*n0[7Rfm; +:et(krDXY<>?kTG@q&kYE. +JcF:#rr2lrs8N#q"8i#orr)j!qt^-eq#:EprVc'^s8E?$r:p-crVZ0OmeuMPmeuMXq"OX\q>:*g +l2Ue^!rW&srr;ioq>^ +JcFL)rVl]os8;rspAY-lr;Zfrs8;rqrr!!!rVlfprr*o9r;6?hqtg6ep\4LSn*/leeBc=X`4W^l +\$Vs&qORYU*M9"/ZaREV^r4=BfA#9Kme-AOqYU3equ-NnrVQQls8W)js8MutrVc`jrrE&tr;chJ +s4@:$~> +JcEpn!<)oorr)9b9)SP^q"F=Lmd9?(kiLg^iRcJu]s4E'P)P0EG]I_9<_Q1^:/F\Z91MKG:h4Bb +H[^X+P+JVV]>r:Qi8j%bm- +%%EndData +showpage +%%Trailer +end +%%EOF diff --git a/doc/gnupg-badge-openpgp.jpg b/doc/gnupg-badge-openpgp.jpg new file mode 100644 index 000000000..d396b7c38 Binary files /dev/null and b/doc/gnupg-badge-openpgp.jpg differ diff --git a/doc/gnupg-badge-openpgp.pdf b/doc/gnupg-badge-openpgp.pdf new file mode 100644 index 000000000..bd647016a Binary files /dev/null and b/doc/gnupg-badge-openpgp.pdf differ diff --git a/doc/gnupg-card-architecture.fig b/doc/gnupg-card-architecture.fig new file mode 100644 index 000000000..49351c720 --- /dev/null +++ b/doc/gnupg-card-architecture.fig @@ -0,0 +1,420 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +# Copyright 2005 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. +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 32 #414541 +0 33 #808080 +0 34 #c0c0c0 +0 35 #c6b797 +0 36 #eff8ff +0 37 #dccba6 +0 38 #e0e0e0 +0 39 #8e8f8e +0 40 #aaaaaa +0 41 #555555 +0 42 #404040 +0 43 #868286 +0 44 #c7c3c7 +0 45 #e7e3e7 +0 46 #8e8e8e +0 47 #444444 +0 48 #868686 +0 49 #c7c7c7 +0 50 #666666 +0 51 #e2e2ee +0 52 #94949a +0 53 #dbdbdb +0 54 #a1a1b7 +0 55 #9c0000 +0 56 #ededed +0 57 #86acff +0 58 #7070ff +0 59 #bebebe +0 60 #515151 +0 61 #000049 +0 62 #797979 +0 63 #303430 +0 64 #c7b696 +0 65 #d7d7d7 +0 66 #aeaeae +0 67 #85807d +0 68 #d2d2d2 +0 69 #3a3a3a +0 70 #4573aa +0 71 #000000 +0 72 #e7e7e7 +0 73 #f7f7f7 +0 74 #d6d7d6 +0 75 #7b79a5 +0 76 #effbff +0 77 #9e9e9e +0 78 #717571 +0 79 #73758c +0 80 #414141 +0 81 #635dce +0 82 #565151 +0 83 #dd9d93 +0 84 #f1ece0 +0 85 #c3c3c3 +0 86 #e2c8a8 +0 87 #e1e1e1 +0 88 #da7a1a +0 89 #f1e41a +0 90 #887dc2 +0 91 #d6d6d6 +0 92 #8c8ca5 +0 93 #4a4a4a +0 94 #8c6b6b +0 95 #5a5a5a +0 96 #636363 +0 97 #b79b73 +0 98 #4193ff +0 99 #bf703b +0 100 #db7700 +0 101 #dab800 +0 102 #006400 +0 103 #5a6b3b +0 104 #d3d3d3 +0 105 #8e8ea4 +0 106 #f3b95d +0 107 #89996b +0 108 #646464 +0 109 #b7e6ff +0 110 #86c0ec +0 111 #bdbdbd +0 112 #d39552 +0 113 #98d2fe +0 114 #8c9c6b +0 115 #f76b00 +0 116 #5a6b39 +0 117 #8c9c6b +0 118 #8c9c7b +0 119 #184a18 +0 120 #adadad +0 121 #f7bd5a +0 122 #636b9c +0 123 #de0000 +0 124 #adadad +0 125 #f7bd5a +0 126 #adadad +0 127 #f7bd5a +0 128 #636b9c +0 129 #526b29 +0 130 #949494 +0 131 #006300 +0 132 #00634a +0 133 #7b844a +0 134 #e7bd7b +0 135 #a5b5c6 +0 136 #6b6b94 +0 137 #846b6b +0 138 #529c4a +0 139 #d6e7e7 +0 140 #526363 +0 141 #186b4a +0 142 #9ca5b5 +0 143 #ff9400 +0 144 #ff9400 +0 145 #00634a +0 146 #7b844a +0 147 #63737b +0 148 #e7bd7b +0 149 #184a18 +0 150 #f7bd5a +0 151 #dedede +0 152 #f3eed3 +0 153 #f5ae5d +0 154 #95ce99 +0 155 #b5157d +0 156 #eeeeee +0 157 #848484 +0 158 #7b7b7b +0 159 #005a00 +0 160 #e77373 +0 161 #ffcb31 +0 162 #29794a +0 163 #de2821 +0 164 #2159c6 +0 165 #f8f8f8 +0 166 #e6e6e6 +0 167 #21845a +0 168 #ff9408 +0 169 #007000 +0 170 #d00000 +0 171 #fed600 +0 172 #d82010 +0 173 #003484 +0 174 #d62010 +0 175 #389000 +0 176 #ba0000 +0 177 #003380 +0 178 #00a7bd +0 179 #ffc500 +0 180 #087bd0 +0 181 #fbc100 +0 182 #840029 +0 183 #07399c +0 184 #0063bd +0 185 #39acdf +0 186 #42c0e0 +0 187 #31ceff +0 188 #ffde00 +0 189 #085a00 +0 190 #ff2100 +0 191 #f75e08 +0 192 #ef7b08 +0 193 #ff8200 +0 194 #007d00 +0 195 #0000be +0 196 #757575 +0 197 #f3f3f3 +0 198 #d7d3d7 +0 199 #aeaaae +0 200 #c2c2c2 +0 201 #303030 +0 202 #515551 +0 203 #f7f3f7 +0 204 #717171 +6 9270 1980 13230 6570 +6 9471 3906 13014 5677 +2 4 0 1 0 7 50 -1 -1 0.000 0 0 5 0 0 5 + 10540 4394 10540 3936 9471 3936 9471 4394 10540 4394 +2 4 0 1 0 7 50 -1 -1 0.000 0 0 5 0 0 5 + 10387 5616 10387 5158 9471 5158 9471 5616 10387 5616 +2 4 0 1 0 7 50 -1 -1 0.000 0 0 5 0 0 5 + 12984 5005 12984 4547 9471 4547 9471 5005 12984 5005 +2 4 0 1 0 7 50 -1 -1 0.000 0 0 5 0 0 5 + 12984 5616 12984 5158 12067 5158 12067 5616 12984 5616 +2 4 0 1 0 7 50 -1 -1 0.000 0 0 5 0 0 5 + 11701 5627 11701 5168 10784 5168 10784 5627 11701 5627 +4 0 0 50 -1 16 11 0.0000 4 173 835 9623 4242 OpenPGP\001 +4 0 0 50 -1 16 11 0.0000 4 132 2770 9776 4853 APDU and ISO-7816 access code\001 +4 0 0 50 -1 16 11 0.0000 4 132 448 9623 5464 CCID\001 +4 0 0 50 -1 16 11 0.0000 4 132 601 12220 5464 CT-API\001 +4 0 0 50 -1 16 11 0.0000 4 132 560 10957 5464 PC/SC\001 +-6 +6 10693 3906 13014 4394 +2 4 0 1 0 7 50 -1 -1 0.000 0 0 5 0 0 5 + 11762 4394 11762 3936 10693 3936 10693 4394 11762 4394 +2 4 0 1 0 7 50 -1 -1 0.000 0 0 5 0 0 5 + 12984 4394 12984 3936 11915 3936 11915 4394 12984 4394 +4 0 0 50 -1 16 11 0.0000 4 132 377 10998 4242 NKS\001 +4 0 0 50 -1 16 11 0.0000 4 132 804 12067 4242 PKCS#15\001 +-6 +2 4 0 2 0 6 60 -1 20 0.000 0 0 5 0 0 5 + 13137 2072 9318 2072 9318 5739 13137 5739 13137 2072 +2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2 + 9318 3753 13137 3753 +2 4 0 2 0 6 60 -1 20 0.000 0 0 5 0 0 5 + 11691 6360 10774 6360 10774 5901 11691 5901 11691 6360 +2 1 2 2 0 7 50 -1 -1 4.500 0 0 -1 0 0 1 + 11762 5739 +2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 4 + 10693 5739 10693 6502 11762 6502 11762 5739 +4 0 0 50 -1 18 15 0.0000 4 183 1293 10540 2989 SCDaemon\001 +4 0 0 50 -1 16 11 0.0000 4 133 662 10896 6176 wrapper\001 +-6 +6 90 1980 4050 5760 +6 306 3906 3849 5677 +2 4 0 1 0 7 50 -1 -1 0.000 0 0 5 0 0 5 + 1375 4394 1375 3936 306 3936 306 4394 1375 4394 +2 4 0 1 0 7 50 -1 -1 0.000 0 0 5 0 0 5 + 1222 5616 1222 5158 306 5158 306 5616 1222 5616 +2 4 0 1 0 7 50 -1 -1 0.000 0 0 5 0 0 5 + 3819 5005 3819 4547 306 4547 306 5005 3819 5005 +2 4 0 1 0 7 50 -1 -1 0.000 0 0 5 0 0 5 + 3819 5616 3819 5158 2902 5158 2902 5616 3819 5616 +2 4 0 1 0 7 50 -1 -1 0.000 0 0 5 0 0 5 + 2536 5627 2536 5168 1619 5168 1619 5627 2536 5627 +4 0 0 50 -1 16 11 0.0000 4 173 835 458 4242 OpenPGP\001 +4 0 0 50 -1 16 11 0.0000 4 132 2770 611 4853 APDU and ISO-7816 access code\001 +4 0 0 50 -1 16 11 0.0000 4 132 448 458 5464 CCID\001 +4 0 0 50 -1 16 11 0.0000 4 132 601 3055 5464 CT-API\001 +4 0 0 50 -1 16 11 0.0000 4 132 560 1792 5464 PC/SC\001 +-6 +6 2139 3753 3208 4211 +2 4 0 1 0 7 50 -1 -1 4.000 0 0 5 0 0 5 + 3208 4211 3208 3753 2139 3753 2139 4211 3208 4211 +4 0 0 50 -1 16 11 0.0000 4 132 784 2291 4058 Gluecode\001 +-6 +2 1 2 2 0 7 50 -1 -1 4.500 0 0 -1 0 0 1 + 2597 5739 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 2 + 1 1 1.00 40.73 81.47 + 2139 4028 1405 4150 +2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 4 + 153 3753 1833 3753 1833 4364 3972 4364 +2 4 0 2 0 6 60 -1 20 0.000 0 0 5 0 0 5 + 3972 2072 153 2072 153 5739 3972 5739 3972 2072 +4 0 0 50 -1 18 15 0.0000 4 224 866 1375 2989 gpg 1.4\001 +-6 +6 4888 4058 5346 5433 +2 4 0 1 0 7 50 -1 -1 4.000 0 0 5 0 0 5 + 5346 5433 5346 4058 4888 4058 4888 5433 5346 5433 +4 0 0 50 -1 16 11 1.5708 4 132 611 5194 5128 Assuan\001 +-6 +6 4680 1980 8640 5760 +2 4 0 1 0 7 50 -1 -1 4.000 0 0 5 0 0 5 + 5346 3753 5346 2378 4888 2378 4888 3753 5346 3753 +2 4 0 2 0 6 60 -1 20 0.000 0 0 5 0 0 5 + 8554 5739 4735 5739 4735 2072 8554 2072 8554 5739 +4 0 0 50 -1 16 11 1.5708 4 173 804 5194 3447 ssh-agent\001 +-6 +6 5805 3447 7332 4975 +6 5957 3447 7179 4211 +2 4 0 1 0 7 50 -1 -1 4.000 0 0 5 0 0 5 + 7179 4211 7179 3447 5957 3447 5957 4211 7179 4211 +4 0 0 50 -1 16 11 0.0000 4 173 937 6110 3753 Private Key\001 +4 0 0 50 -1 16 11 0.0000 4 173 896 6110 4058 Operations\001 +-6 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 1 + 7195 4883 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 1 + 7195 4883 +2 4 0 1 0 7 50 -1 -1 4.000 0 0 5 0 0 5 + 7332 4975 7332 4517 6721 4517 6721 4975 7332 4975 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 1 2 + 1 1 1.00 40.73 81.47 + 1 1 1.00 40.73 81.47 + 6568 4211 7027 4517 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 1 2 + 1 1 1.00 40.73 81.47 + 1 1 1.00 40.73 81.47 + 6568 4211 6110 4517 +2 4 0 1 0 7 50 -1 -1 4.000 0 0 5 0 0 5 + 6416 4975 6416 4517 5805 4517 5805 4975 6416 4975 +4 0 0 50 -1 16 11 0.0000 4 132 397 6874 4822 Card\001 +4 0 0 50 -1 16 11 0.0000 4 132 356 5957 4822 Disk\001 +-6 +6 7638 3600 8401 4058 +2 4 0 1 0 7 50 -1 -1 4.000 0 0 5 0 0 5 + 8401 4058 8401 3600 7638 3600 7638 4058 8401 4058 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 1 + 7638 3814 +4 0 0 50 -1 16 11 0.0000 4 132 530 7790 3905 Cache\001 +-6 +6 9471 2225 9929 3600 +2 4 0 1 0 7 50 -1 -1 4.000 0 0 5 0 0 5 + 9929 3600 9929 2225 9471 2225 9471 3600 9929 3600 +4 0 0 50 -1 16 11 1.5708 4 132 611 9776 3294 Assuan\001 +-6 +6 6480 360 8640 1440 +2 4 0 2 0 6 60 -1 20 0.000 0 0 5 0 0 5 + 8554 1339 6568 1339 6568 423 8554 423 8554 1339 +4 0 0 50 -1 18 15 0.0000 4 234 967 7027 881 pinentry\001 +4 0 0 50 -1 16 10 0.0000 4 153 1375 6874 1187 (GTK+, Qt, Curses)\001 +-6 +6 10570 270 13137 1003 +2 1 1 1 1 2 50 -1 -1 4.000 0 0 -1 1 0 2 + 1 1 1.00 40.73 81.47 + 10632 331 11181 331 +2 1 0 2 1 2 50 -1 -1 6.000 0 0 -1 1 0 2 + 1 1 2.00 81.47 162.94 + 10632 637 11181 637 +2 1 0 1 0 2 50 -1 -1 4.000 0 0 -1 1 0 2 + 1 1 1.00 40.73 81.47 + 10632 942 11181 942 +4 0 0 50 -1 16 10 0.0000 4 163 1762 11365 392 Alternative access paths\001 +4 0 0 50 -1 16 10 0.0000 4 163 1426 11365 698 IPC (pipe or socket)\001 +4 0 0 50 -1 16 10 0.0000 4 122 1232 11365 1003 Internal data flow\001 +-6 +# Smartcard ID-1 +6 6840 6120 8550 7200 +6 7069 6526 7307 6746 +2 1 0 1 0 7 48 -1 -1 0.000 0 0 -1 0 0 2 + 7234 6691 7307 6691 +2 1 0 1 0 0 48 -1 20 0.000 0 0 -1 0 0 2 + 7069 6636 7143 6636 +2 1 0 1 0 7 48 -1 -1 0.000 0 0 -1 0 0 2 + 7069 6581 7143 6581 +2 1 0 1 0 7 48 -1 -1 0.000 0 0 -1 0 0 2 + 7069 6691 7143 6691 +2 1 0 1 0 7 48 -1 -1 0.000 0 0 -1 0 0 2 + 7143 6526 7143 6746 +2 1 0 1 0 7 48 -1 -1 0.000 0 0 -1 0 0 3 + 7307 6581 7234 6581 7234 6746 +2 1 0 1 0 7 48 -1 -1 0.000 0 0 -1 0 0 2 + 7234 6636 7307 6636 +2 4 0 1 0 31 49 -1 20 0.000 0 0 1 0 0 5 + 7069 6526 7307 6526 7307 6746 7069 6746 7069 6526 +-6 +2 4 0 1 -1 7 50 -1 20 0.000 0 0 1 0 0 5 + 8472 7185 6904 7185 6904 6197 8472 6197 8472 7185 +-6 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 2 + 1 1 1.00 40.73 81.47 + 5346 3142 5957 3753 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 2 + 1 1 1.00 40.73 81.47 + 5346 4669 5957 3905 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 1 2 + 1 1 1.00 40.73 81.47 + 1 1 1.00 40.73 81.47 + 7179 3814 7638 3814 +2 4 0 2 0 6 60 -1 20 0.000 0 0 5 0 0 5 + 11731 7480 10693 7480 10693 6991 11731 6991 11731 7480 +3 2 0 2 1 2 50 -1 -1 6.000 0 1 0 3 + 1 1 2.00 81.47 162.94 + 8022 3600 8096 2225 7513 1360 + 0.000 -1.000 0.000 +3 2 0 2 1 2 50 -1 -1 0.000 0 1 0 3 + 0 0 2.00 81.47 162.94 + 7332 4730 8737 4486 9471 2897 + 0.000 -1.000 0.000 +3 2 0 2 1 2 50 -1 -1 6.000 0 1 0 3 + 1 1 2.00 81.47 162.94 + 3238 3997 4216 4242 4888 4730 + 0.000 -1.000 0.000 +3 2 0 2 1 2 50 -1 -1 6.000 0 1 0 3 + 1 1 2.00 81.47 162.94 + 11243 6502 11304 6747 11181 6991 + 0.000 -1.000 0.000 +3 2 1 1 1 2 50 -1 -1 4.000 0 1 0 3 + 1 1 1.00 40.73 81.47 + 10693 7235 9471 7174 8493 6869 + 0.000 -1.000 0.000 +3 2 1 1 1 2 50 -1 -1 4.000 0 1 0 3 + 1 1 1.00 40.73 81.47 + 9898 5647 9532 6380 8493 6563 + 0.000 -1.000 0.000 +3 2 1 1 1 2 50 -1 -1 4.000 0 1 0 3 + 1 1 1.00 40.73 81.47 + 12465 5647 11731 6624 8493 6747 + 0.000 -1.000 0.000 +3 2 1 1 1 2 50 -1 -1 4.000 0 1 0 3 + 1 1 1.00 40.73 81.47 + 2077 5647 3177 6502 6843 6624 + 0.000 -1.000 0.000 +3 2 1 1 1 2 50 -1 -1 4.000 0 1 0 3 + 1 1 1.00 40.73 81.47 + 733 5647 2444 6808 6843 6747 + 0.000 -1.000 0.000 +3 2 1 1 1 2 50 -1 -1 4.000 0 1 0 3 + 1 1 1.00 40.73 81.47 + 3361 5647 4155 6319 6843 6502 + 0.000 -1.000 0.000 +4 0 0 50 -1 18 15 0.0000 4 214 1191 5957 2989 gpg-agent\001 +4 0 0 50 -1 16 11 0.0000 4 173 387 10998 7297 pcsd\001 diff --git a/doc/gnupg-w32.reg b/doc/gnupg-w32.reg deleted file mode 100644 index 0605abd56..000000000 --- a/doc/gnupg-w32.reg +++ /dev/null @@ -1,19 +0,0 @@ -REGEDIT4 - - -[HKEY_CURRENT_USER\Control Panel\Mingw32] - -[HKEY_CURRENT_USER\Control Panel\Mingw32\NLS] - -[HKEY_CURRENT_USER\Control Panel\Mingw32\NLS] -"MODir"="C:\\GnuPG\\Locale" - - - - - - - - - - diff --git a/doc/gnupg.7 b/doc/gnupg.7 deleted file mode 100644 index a3dd29066..000000000 --- a/doc/gnupg.7 +++ /dev/null @@ -1,15 +0,0 @@ -.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/gnupg.texi b/doc/gnupg.texi new file mode 100644 index 000000000..dd0b12fc6 --- /dev/null +++ b/doc/gnupg.texi @@ -0,0 +1,188 @@ +\input texinfo @c -*-texinfo-*- +@c %**start of header +@setfilename gnupg.info +@include version.texi +@settitle Using the GNU Privacy Guard + +@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} (version +@value{VERSION}, @value{UPDATED}). + +@iftex +Published by the Free Software Foundation@* +59 Temple Place - Suite 330@* +Boston, MA 02111-1307 USA +@end iftex + +Copyright @copyright{} 2002, 2004, 2005 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: (gnupg). OpenPGP encryption and signing tool. +* gpgsm: (gnupg). S/MIME encryption and signing tool. +@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 +@subtitle Version @value{VERSION} +@subtitle @value{UPDATED} + +@sp 3 + +@image{gnupg-badge-openpgp,8cm,,The GnuPG Logo} + +@sp 3 + +@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 + +This manual documents how to use the GNU Privacy Guard system as well as +the administration and the architecture. +@end ifnottex + +@menu +* Invoking GPG:: Using the OpenPGP protocol. +* Invoking GPGSM:: Using the S/MIME protocol. +* Invoking GPG-AGENT:: How to launch the secret key daemon. +* Invoking SCDAEMON:: How to handle Smartcards. + +* Helper Tools:: Description of small helper tools + +* System Notes:: Notes pertaining to certain OSes. +* Debugging:: How to solve problems +* Assuan:: Description of the Assuan protocol. +* Copying:: GNU General Public License says + how you can copy and share GnuPG +* Contributors:: People who have contributed to GnuPG. + +* Glossary:: Short descrition of used terms. +* Option Index:: Index to command line options. +* Index:: Index of concepts and symbol names. +@end menu + +@ifhtml + +@center @image{gnupg-badge-openpgp,6cm,,The GnuPG Logo} + +@end ifhtml + + +@ifhtml +@page +@summarycontents +@contents +@end ifhtml + + +@include gpg.texi +@include gpgsm.texi +@include gpg-agent.texi +@include scdaemon.texi + +@include tools.texi + +@include sysnotes.texi + +@include debugging.texi + +@include assuan.texi +@include gpl.texi + +@include contrib.texi + +@c --------------------------------------------------------------------- +@c Indexes +@c --------------------------------------------------------------------- + +@include glossary.texi + +@node Option Index +@unnumbered Option Index + +@printindex op + +@node Index +@unnumbered Index + +@printindex cp + +@c --------------------------------------------------------------------- +@c Epilogue +@c --------------------------------------------------------------------- + +@bye + + diff --git a/doc/gpg-agent.texi b/doc/gpg-agent.texi new file mode 100644 index 000000000..39b79d306 --- /dev/null +++ b/doc/gpg-agent.texi @@ -0,0 +1,1030 @@ +@c Copyright (C) 2002 Free Software Foundation, Inc. +@c This is part of the GnuPG manual. +@c For copying conditions, see the file gnupg.texi. + +@node Invoking GPG-AGENT +@chapter Invoking GPG-AGENT +@cindex GPG-AGENT command options +@cindex command options +@cindex options, GPG-AGENT command + +@c man begin DESCRIPTION + +@command{gpg-agent} is a daemon to manage secret (private) keys +independently from any protocol. It is used as a backend for +@command{gpg} and @command{gpgsm} as well as for a couple of other +utilities. + +@noindent +The usual way to run the agent is from the @code{~/.xsession} file: + +@example +eval `gpg-agent --daemon` +@end example + +@noindent +If you don't use an X server, you can also put this into your regular +startup file @code{~/.profile} or @code{.bash_profile}. It is best not +to run multiple instance of the @command{gpg-agent}, so you should make +sure that only one is running: @command{gpg-agent} uses an environment +variable to inform clients about the communication parameters. You can +write the content of this environment variable to a file so that you can +test for a running agent. This short script may do the job: + +@smallexample +if test -f $HOME/.gpg-agent-info && \ + kill -0 `cut -d: -f 2 $HOME/.gpg-agent-info` 2>/dev/null; then + GPG_AGENT_INFO=`cat $HOME/.gpg-agent-info` + export GPG_AGENT_INFO +else + eval `gpg-agent --daemon` + echo $GPG_AGENT_INFO >$HOME/.gpg-agent-info +fi +@end smallexample + +@noindent +Note that the new option @option{--write-env-file} may be used instead. + + +@noindent +You should always add the following lines to your @code{.bashrc} or +whatever initialization file is used for all shell invocations: + +@smallexample +GPG_TTY=`tty` +export GPG_TTY +@end smallexample + +@noindent +It is important that this environment variable always reflects the +output of the @code{tty} command. For W32 systems this option is not +required. + +Please make sure that a proper pinentry program has been installed +under the default filename (which is system dependant) or use the +option @code{pinentry-pgm} to specify the full name of that program. +It is often useful to install a symbolic link from the actual used +pinentry (e.g. @file{/usr/bin/pinentry-gtk}) to the expected +one (e.g. @file{/usr/bin/pinentry}). + +@c man end + +@noindent +@xref{Option Index}, for an index to @command{GPG-AGENT}'s commands and options. + +@menu +* Agent Commands:: List of all commands. +* Agent Options:: List of all options. +* Agent Configuration:: Configuration files. +* Agent Signals:: Use of some signals. +* Agent Examples:: Some usage examples. +* Agent Protocol:: The protocol the agent uses. +@end menu + +@c man begin COMMANDS + +@node Agent Commands +@section Commands + +Commands are not distinguished from options execpt for the fact that +only one one command is allowed. + +@table @gnupgtabopt +@item --version +@opindex version +Print the program version and licensing information. Not that you can +abbreviate this command. + +@item --help, -h +@opindex help +Print a usage message summarizing the most usefule command-line options. +Not that you can abbreviate this command. + +@item --dump-options +@opindex dump-options +Print a list of all available options and commands. Not that you can +abbreviate this command. + +@item --server +@opindex server +Run in server mode and wait for commands on the @code{stdin}. The +default mode is to create a socket and listen for commands there. + +@item --daemon +@opindex daemon +Run the program in the background. This option is required to prevent +it from being accidently running in the background. A common way to do +this is: +@example +@end example +$ eval `gpg-agent --daemon` +@end table + + +@c man begin OPTIONS + +@node Agent Options +@section Option Summary + +@table @gnupgtabopt + +@anchor{option --options} +@item --options @var{file} +@opindex options +Reads configuration from @var{file} instead of from the default +per-user configuration file. The default configuration file is named +@file{gpg-agent.conf} and expected in the @file{.gnupg} directory directly +below the home directory of the user. + +@anchor{option --homedir} +@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 +@var{HKCU\Software\GNU\GnuPG:HomeDir}. + +@item -v +@item --verbose +@opindex v +@opindex verbose +Outputs additional information while running. +You can increase the verbosity by giving several +verbose commands to @sc{gpgsm}, such as @samp{-vv}. + +@item -q +@item --quiet +@opindex q +@opindex quiet +Try to be as quiet as possible. + +@item --batch +@opindex batch +Don't invoke a pinentry or do any other thing requiring human interaction. + +@item --faked-system-time @var{epoch} +@opindex faked-system-time +This option is only useful for testing; it sets the system time back or +forth to @var{epoch} which is the number of seconds elapsed since the year +1970. + +@item --debug-level @var{level} +@opindex debug-level +Select the debug level for investigating problems. @var{level} may be +one of: + + @table @code + @item none + no debugging at all. + @item basic + some basic debug messages + @item advanced + more verbose debug messages + @item expert + even more detailed messages + @item guru + all of the debug messages you can get + @end table + +How these messages are mapped to the actual debugging flags is not +specified and may change with newer releaes of this program. They are +however carefully selected to best aid in debugging. + +@item --debug @var{flags} +@opindex debug +This option is only useful for debugging and the behaviour may change at +any time without notice. FLAGS are bit encoded and may be given in +usual C-Syntax. The currently defined bits are: + + @table @code + @item 0 (1) + X.509 or OpenPGP protocol related data + @item 1 (2) + values of big number integers + @item 2 (4) + low level crypto operations + @item 5 (32) + memory allocation + @item 6 (64) + caching + @item 7 (128) + show memory statistics. + @item 9 (512) + write hashed data to files named @code{dbgmd-000*} + @item 10 (1024) + trace Assuan protocol + @item 12 (4096) + bypass all certificate validation + @end table + +@item --debug-all +@opindex debug-all +Same as @code{--debug=0xffffffff} + +@item --debug-wait @var{n} +@opindex debug-wait +When running in server mode, wait @var{n} seconds before entering the +actual processing loop and print the pid. This gives time to attach a +debugger. + +@item --no-detach +@opindex no-detach +Don't detach the process from the console. This is manly usefule for +debugging. + +@item -s +@itemx --sh +@itemx -c +@itemx --csh +@opindex s +@opindex sh +@opindex c +@opindex csh +Format the info output in daemon mode for use with the standard Bourne +shell respective the C-shell . The default ist to guess it based on the +environment variable @code{SHELL} which is in almost all cases +sufficient. + +@item --write-env-file @var{file} +@opindex write-env-file +Often it is required to connect to the agent from a process not being an +inferior of @command{gpg-agent} and thus the environment variable with +the socket name is not available. To help setting up those variables in +other sessions, this option may be used to write the information into +@var{file}. If @var{file} is not specified the default name +@file{$@{HOME@}/.gpg-agent-info} will be used. The format is suitable +to be evaluated by a Bourne shell like in this simple example: + +@example +eval `cat @var{file}` +eval `cut -d= -f 1 < @var{file} | xargs echo export` +@end example + + + +@item --no-grab +@opindex no-grab +Tell the pinentryo not to grab the keyboard and mouse. This option +should in general not be used to avaoid X-sniffing attacks. + +@item --log-file @var{file} +@opindex log-file +Append all logging output to @var{file}. This is very helpful in +seeing what the agent actually does. + +@anchor{option --allow-mark-trusted} +@item --allow-mark-trusted +@opindex allow-mark-trusted +Allow clients to mark keys as trusted, i.e. put them into the +@file{trustlist.txt} file. This is by default not allowed to make it +harder for users to inadvertly accept Root-CA keys. + +@item --ignore-cache-for-signing +@opindex ignore-cache-for-signing +This option will let @command{gpg-agent} bypass the passphrase cache for all +signing operation. Note that there is also a per-session option to +control this behaviour but this command line option takes precedence. + +@item --default-cache-ttl @var{n} +@opindex default-cache-ttl +Set the time a cache entry is valid to @var{n} seconds. The default are +600 seconds. + +@item --default-cache-ttl-ssh @var{n} +@opindex default-cache-ttl +Set the time a cache entry used for SSH keys is valid to @var{n} +seconds. The default are 1800 seconds. + +@item --max-cache-ttl @var{n} +@opindex max-cache-ttl +Set the maximum time a cache entry is valid to @var{n} seconds. After +this time a cache entry will get expired even if it has been accessed +recently. The default are 2 hours (7200 seconds). + +@item --max-cache-ttl-ssh @var{n} +@opindex max-cache-ttl-ssh +Set the maximum time a cache entry used for SSH keys is valid to @var{n} +seconds. After this time a cache entry will get expired even if it has +been accessed recently. The default are 2 hours (7200 seconds). + +@item --pinentry-program @var{filename} +@opindex pinentry-program +Use program @var{filename} as the PIN entry. The default is installation +dependend and can be shown with the @code{--version} command. + +@item --scdaemon-program @var{filename} +@opindex scdaemon-program +Use program @var{filename} as the Smartcard daemon. The default is +installation dependend and can be shown with the @code{--version} +command. + +@item --disable-scdaemon +@opindex disable-scdaemon +Do not make use of the scdaemon tool. This option has the effect of +disabling the ability to do smartcard operations. Note, that enabling +this option at runtime does not kill an already forked scdaemon. + +@item --use-standard-socket +@itemx --no-use-standard-socket +@opindex use-standard-socket +@opindex no-use-standard-socket +By enabling this option @command{gpg-agent} will listen on the socket +named @file{S.gpg-agent}, located in the home directory, and not create +a random socket below a temporary directory. Tools connecting to +@command{gpg-agent} should first try to connect to the socket given in +environment variable @var{GPG_AGENT_INFO} and the fall back to this +socket. This option may not be used if the home directory is mounted as +a remote file system. + +@noindent +Note, that as of now, W32 systems default to this option. + + +@item --display @var{string} +@itemx --ttyname @var{string} +@itemx --ttytype @var{string} +@itemx --lc-type @var{string} +@itemx --lc-messages @var{string} +@opindex display +@opindex ttyname +@opindex ttytype +@opindex lc-type +@opindex lc-messages +These options are used with the server mode to pass localization +information. + +@item --keep-tty +@itemx --keep-display +@opindex keep-tty +@opindex keep-display +Ignore requests to change change the current @sc{tty} respective the X +window system's @code{DISPLAY} variable. This is useful to lock the +pinentry to pop up at the @sc{tty} or display you started the agent. + +@anchor{option --enable-ssh-support} +@item --enable-ssh-support +@opindex enable-ssh-support + +Enable emulation of the OpenSSH Agent protocol. + +In this mode of operation, the agent does not only implement the +gpg-agent protocol, but also the agent protocol used by OpenSSH +(through a seperate socket). Consequently, it should possible to use +the gpg-agent as a drop-in replacement for the well known ssh-agent. + +SSH Keys, which are to be used through the agent, need to be added to +the gpg-agent initially through the ssh-add utility. When a key is +added, ssh-add will ask for the password of the provided key file and +send the unprotected key material to the agent; this causes the +gpg-agent to ask for a passphrase, which is to be used for encrypting +the newly received key and storing it in a gpg-agent specific +directory. + +Once, a key has been added to the gpg-agent this way, the gpg-agent +will be ready to use the key. + +Note: in case the gpg-agent receives a signature request, the user might +need to be prompted for a passphrase, which is necessary for decrypting +the stored key. Since the ssh-agent protocol does not contain a +mechanism for telling the agent on which display/terminal it is running, +gpg-agent's ssh-support will use the TTY or X display where gpg-agent +has been started. To switch this display to the current one, the +follwing command may be used: + +@smallexample +echo UPDATESTARTUPTTY | gpg-connect-agent +@end smallexample + + + +@end table + +All the long options may also be given in the configuration file after +stripping off the two leading dashes. + + +@c man begin FILES + +@node Agent Configuration +@section Configuration + +There are a few configuration files needed for the operation of the +agent. By default they may all be found in the current home directory +(@pxref{option --homedir}). + +@table @file + +@item gpg-agent.conf +@cindex gpg-agent.conf + This is the standard configuration file read by @command{gpg-agent} 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 file is also read after a @code{SIGHUP} however only a few + options will actually have an effect. This default name may be + changed on the command line (@pxref{option --options}). + +@item trustlist.txt + This is the list of trusted keys. Comment lines, indicated by a leading + hash mark, as well as empty lines are ignored. To mark a key as trusted + you need to enter its fingerprint followed by a space and a capital + letter @code{S}. Colons may optionally be used to separate the bytes of + a fingerprint; this allows to cut and paste the fingeperint from a key + listing output. + + Here is an example where two keys are marked as ultimately trusted: + + @example + # CN=Wurzel ZS 3,O=Intevation GmbH,C=DE + A6935DD34EF3087973C706FC311AA2CCF733765B S + + # CN=PCA-1-Verwaltung-02/O=PKI-1-Verwaltung/C=DE + DC:BD:69:25:48:BD:BB:7E:31:6E:BB:80:D3:00:80:35:D4:F8:A6:CD S + @end example + + Before entering a key into this file, you need to ensure its + authenticity. How to do this depends on your organisation; your + administrator might have already entered those keys which are deemed + trustworthy enough into this file. Places where to look for the + fingerprint of a root certificate are letters received from the CA or + the website of the CA (after making 100% sure that this is indeed the + website of that CA). You may want to consider allowing interactive + updates of this file by using the @xref{option --allow-mark-trusted}. + This is however not as secure as maintaining this file manually. It is + even advisable to change the permissions to read-only so that this file + can't be changed inadvertently. + + @item sshcontrol + + This file is used when support for the secure shell agent protocol has + been enabled (@pxref{option --enable-ssh-support}). Only keys present in + this file are used in the SSH protocol. The @command{ssh-add} tool y be + used to add new entries to this file; you may also add them manually. + Comment lines, indicated by a leading hash mark, as well as empty lines + are ignored. An entry starts with optional white spaces, followed by + the keygrip of the key given as 40 hex digits, optionally followed by + the caching TTL in seconds and another optional field for arbitrary + flags. A @code{!} may be prepended to the keygrip to disable this + entry. + + The follwoing example lists exactly one key. Note that keys available + through a OpenPGP smartcard in the active smartcard reader are implictly + added to this list; i.e. there is no need to list them. + + @example + # Key added on 2005-02-25 15:08:29 + 5A6592BF45DC73BD876874A28FD4639282E29B52 0 + @end example +@end table + +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. For existing users the +a small helper script is provied to create these files (@pxref{addgnupghome}). + + + +@c +@c Agent Signals +@c +@node Agent Signals +@section Use of some signals. +A running @command{gpg-agent} may be controlled by signals, i.e. using +the @command{kill} command to send a signal to the process. + +Here is a list of supported signals: + +@table @gnupgtabopt + +@item SIGHUP +@cpindex SIGHUP +This signal flushes all chached passphrases and if the program has been +started with a configuration file, the configuration file is read again. +Only certain options are honored: @code{quiet}, @code{verbose}, +@code{debug}, @code{debug-all}, @code{debug-level}, @code{no-grab}, +@code{pinentry-program}, @code{default-cache-ttl}, @code{max-cache-ttl}, +@code{ignore-cache-for-signing}, @code{allow-mark-trusted} and +@code{disable-scdaemon}. @code{scdaemon-program} is also supported but +due to the current implementation, which calls the scdaemon only once, +it is not of much use unless you manually kill the scdaemon. + + +@item SIGTERM +@cpindex SIGTERM +Shuts down the process but waits until all current requests are +fulfilled. If the process has received 3 of these signals and requests +are still pending, a shutdown is forced. + +@item SIGINT +@cpindex SIGINT +Shuts down the process immediately. + +@item SIGUSR1 +@cpindex SIGUSR1 +Dump internal information to the log file. + +@item SIGUSR2 +@cpindex SIGUSR2 +This signal is used for internal purposes. + +@end table + +@c +@c Examples +@c +@node Agent Examples +@section Examples + +@c man begin EXAMPLES + +The usual way to invoke @command{gpg-agent} is + +@example +$ eval `gpg-agent --daemon` +@end example + +@c man end + +An alternative way is by replacing @command{ssh-agent} with +@command{gpg-agent}. If for example @command{ssh-agent} is started as +part of the Xsession intialization you may simply replace +@command{ssh-agent} by a script like: + +@cartouche +@example +#!/bin/sh + +exec /usr/local/bin/gpg-agent --enable-ssh-support --daemon \ + --write-env-file $@{HOME@}/.gpg-agent-info "$@@" +@end example +@end cartouche + +@noindent +and add something like (for Bourne shells) + +@cartouche +@example + if [ -f "$@{HOME@}/.gpg-agent-info" ]; then + . "$@{HOME@}/.gpg-agent-info" + export GPG_AGENT_INFO + export SSH_AUTH_SOCK + export SSH_AGENT_PID + fi +@end example +@end cartouche + +@noindent +to your shell initialization file (e.g. @file{~/.bashrc}). + +@c +@c Assuan Protocol +@c +@node Agent Protocol +@section Agent's Assuan Protocol + +Note: this section does only document the protocol, which is used by +GnuPG components; it does not deal with the ssh-agent protocol. + +The @command{gpg-agent} should be started by the login shell and set an +environment variable to tell clients about the socket to be used. +Clients should deny to access an agent with a socket name which does +not match its own configuration. An application may choose to start +an instance of the gpgagent if it does not figure that any has been +started; it should not do this if a gpgagent is running but not +usable. Because @command{gpg-agent} can only be used in background mode, no +special command line option is required to activate the use of the +protocol. + +To identify a key we use a thing called keygrip which is the SHA-1 hash +of an canoncical encoded S-Expression of the the public key as used in +Libgcrypt. For the purpose of this interface the keygrip is given as a +hex string. The advantage of using this and not the hash of a +certificate is that it will be possible to use the same keypair for +different protocols, thereby saving space on the token used to keep the +secret keys. + +@menu +* Agent PKDECRYPT:: Decrypting a session key +* Agent PKSIGN:: Signing a Hash +* Agent GENKEY:: Generating a Key +* Agent IMPORT:: Importing a Secret Key +* Agent EXPORT:: Exporting a Secret Key +* Agent ISTRUSTED:: Importing a Root Certificate +* Agent GET_PASSPHRASE:: Ask for a passphrase +* Agent GET_CONFIRMATION:: Ask for confirmation +* Agent HAVEKEY:: Check whether a key is available +* Agent LEARN:: Register a smartcard +* Agent PASSWD:: Change a Passphrase +* Agent UPDATESTARTUPTTY:: Change the Standard Display +@end menu + +@node Agent PKDECRYPT +@subsection Decrypting a session key + +The client asks the server to decrypt a session key. The encrypted +session key should have all information needed to select the +appropriate secret key or to delegate it to a smartcard. + +@example + SETKEY +@end example + +Tell the server about the key to be used for decryption. If this is +not used, @command{gpg-agent} may try to figure out the key by trying to +decrypt the message with each key available. + +@example + PKDECRYPT +@end example + +The agent checks whether this command is allowed and then does an +INQUIRY to get the ciphertext the client should then send the cipher +text. + +@example + S: INQUIRE CIPHERTEXT + C: D (xxxxxx + C: D xxxx) + C: END +@end example + +Please note that the server may send status info lines while reading the +data lines from the client. The data send is a SPKI like S-Exp with +this structure: + +@example + (enc-val + ( + ( ) + ... + ( ))) +@end example + +Where algo is a string with the name of the algorithm; see the libgcrypt +documentation for a list of valid algorithms. The number and names of +the parameters depend on the algorithm. The agent does return an error +if there is an inconsistency. + +If the decryption was successful the decrypted data is returned by +means of "D" lines. + +Here is an example session: + +@example + C: PKDECRYPT + S: INQUIRE CIPHERTEXT + C: D (enc-val elg (a 349324324) + C: D (b 3F444677CA))) + C: END + S: # session key follows + S: D 1234567890ABCDEF0 + S: OK descryption successful +@end example + + +@node Agent PKSIGN +@subsection Signing a Hash + +The client ask the agent to sign a given hash value. A default key +will be chosen if no key has been set. To set a key a client first +uses: + +@example + SIGKEY +@end example + +This can be used multiple times to create multiple signature, the list +of keys is reset with the next PKSIGN command or a RESET. The server +test whether the key is a valid key to sign something and responds with +okay. + +@example + SETHASH +@end example + +The client can use this command to tell the server about the data +(which usually is a hash) to be signed. + +The actual signing is done using + +@example + PKSIGN +@end example + +Options are not yet defined, but my later be used to choosen among +different algorithms (e.g. pkcs 1.5) + +The agent does then some checks, asks for the passphrase and +if SETHASH has not been used asks the client for the data to sign: + +@example + S: INQUIRE HASHVAL + C: D ABCDEF012345678901234 + C: END +@end example + +As a result the server returns the signature as an SPKI like S-Exp +in "D" lines: + +@example + (sig-val + ( + ( ) + ... + ( ))) +@end example + + +The operation is affected by the option + +@example + OPTION use-cache-for-signing=0|1 +@end example + +The default of @code{1} uses the cache. Setting this option to @code{0} +will lead @command{gpg-agent} to ignore the passphrase cache. Note, that there is +also a global command line option for @command{gpg-agent} to globally disable the +caching. + + +Here is an example session: + +@example + C: SIGKEY + S: OK key available + C: SIGKEY + S: OK key available + C: PKSIGN + S: # I did ask the user whether he really wants to sign + S: # I did ask the user for the passphrase + S: INQUIRE HASHVAL + C: D ABCDEF012345678901234 + C: END + S: # signature follows + S: D (sig-val rsa (s 45435453654612121212)) + S: OK +@end example + + +@node Agent GENKEY +@subsection Generating a Key + +This is used to create a new keypair and store the secret key inside the +active PSE -w which is in most cases a Soft-PSE. An not yet defined +option allows to choose the storage location. To get the secret key out +of the PSE, a special export tool has to be used. + +@example + GENKEY +@end example + +Invokes the key generation process and the server will then inquire +on the generation parameters, like: + +@example + S: INQUIRE KEYPARM + C: D (genkey (rsa (nbits 1024))) + C: END +@end example + +The format of the key parameters which depends on the algorithm is of +the form: + +@example + (genkey + (algo + (parameter_name_1 ....) + .... + (parameter_name_n ....))) +@end example + +If everything succeeds, the server returns the *public key* in a SPKI +like S-Expression like this: + +@example + (public-key + (rsa + (n ) + (e ))) +@end example + +Here is an example session: + +@example + C: GENKEY + S: INQUIRE KEYPARM + C: D (genkey (rsa (nbits 1024))) + C: END + S: D (public-key + S: D (rsa (n 326487324683264) (e 10001))) + S OK key created +@end example + +@node Agent IMPORT +@subsection Importing a Secret Key + +This operation is not yet supportted by GpgAgent. Specialized tools +are to be used for this. + +There is no actual need because we can expect that secret keys +created by a 3rd party are stored on a smartcard. If we have +generated the key ourself, we do not need to import it. + +@node Agent EXPORT +@subsection Export a Secret Key + +Not implemented. + +Should be done by an extra tool. + +@node Agent ISTRUSTED +@subsection Importing a Root Certificate + +Actually we do not import a Root Cert but provide a way to validate +any piece of data by storing its Hash along with a description and +an identifier in the PSE. Here is the interface desription: + +@example + ISTRUSTED +@end example + +Check whether the OpenPGP primary key or the X.509 certificate with the +given fingerprint is an ultimately trusted key or a trusted Root CA +certificate. The fingerprint should be given as a hexstring (without +any blanks or colons or whatever in between) and may be left padded with +00 in case of an MD5 fingerprint. GPGAgent will answer with: + +@example + OK +@end example + +The key is in the table of trusted keys. + +@example + ERR 304 (Not Trusted) +@end example + +The key is not in this table. + +Gpg needs the entire list of trusted keys to maintain the web of +trust; the following command is therefore quite helpful: + +@example + LISTTRUSTED +@end example + +GpgAgent returns a list of trusted keys line by line: + +@example + S: D 000000001234454556565656677878AF2F1ECCFF P + S: D 340387563485634856435645634856438576457A P + S: D FEDC6532453745367FD83474357495743757435D S + S: OK +@end example + +The first item on a line is the hexified fingerprint where MD5 +ingerprints are @code{00} padded to the left and the second item is a +flag to indicate the type of key (so that gpg is able to only take care +of PGP keys). P = OpenPGP, S = S/MIME. A client should ignore the rest +of the line, so that we can extend the format in the future. + +Finally a client should be able to mark a key as trusted: + +@example + MARKTRUSTED @var{fingerprint} "P"|"S" +@end example + +The server will then pop up a window to ask the user whether she +really trusts this key. For this it will probably ask for a text to +be displayed like this: + +@example + S: INQUIRE TRUSTDESC + C: D Do you trust the key with the fingerprint @@FPR@@ + C: D bla fasel blurb. + C: END + S: OK +@end example + +Known sequences with the pattern @@foo@@ are replaced according to this +table: + +@table @code +@item @@FPR16@@ +Format the fingerprint according to gpg rules for a v3 keys. +@item @@FPR20@@ +Format the fingerprint according to gpg rules for a v4 keys. +@item @@FPR@@ +Choose an appropriate format to format the fingerprint. +@item @@@@ +Replaced by a single @code{@@} +@end table + +@node Agent GET_PASSPHRASE +@subsection Ask for a passphrase + +This function is usually used to ask for a passphrase to be used for +conventional encryption, but may also be used by programs which need +special handling of passphrases. This command uses a syntax which helps +clients to use the agent with minimum effort. + +@example + GET_PASSPHRASE @var{cache_id} [@var{error_message} @var{prompt} @var{description}] +@end example + +@var{cache_id} is expected to be a hex string used for caching a +passphrase. Use a @code{X} to bypass the cache. With no other +arguments the agent returns a cached passphrase or an error. + +@var{error_message} is either a single @code{X} for no error message or +a string to be shown as an error message like (e.g. "invalid +passphrase"). Blanks must be percent escaped or replaced by @code{+}'. + +@var{prompt} is either a single @code{X} for a default prompt or the +text to be shown as the prompt. Blanks must be percent escaped or +replaced by @code{+}. + +@var{description} is a text shown above the entry field. Blanks must be +percent escaped or replaced by @code{+}. + +The agent either returns with an error or with a OK followed by the +hex encoded passphrase. Note that the length of the strings is +implicitly limited by the maximum length of a command. + +@example + CLEAR_PASSPHRASE @var{cache_id} +@end example + +may be used to invalidate the cache entry for a passphrase. The +function returns with OK even when there is no cached passphrase. + + +@node Agent GET_CONFIRMATION +@subsection Ask for confirmation + +This command may be used to ask for a simple confirmation by +presenting a text and 2 bottonts: Okay and Cancel. + +@example + GET_CONFIRMATION @var{description} +@end example + +@var{description}is displayed along with a Okay and Cancel +button. Blanks must be percent escaped or replaced by @code{+}. A +@code{X} may be used to display confirmation dialog with a default +text. + +The agent either returns with an error or with a OK. Note, that the +length of @var{description} is implicitly limited by the maximum +length of a command. + + + +@node Agent HAVEKEY +@subsection Check whether a key is available + +This can be used to see whether a secret key is available. It does +not return any information on whether the key is somehow protected. + +@example + HAVEKEY @var{keygrip} +@end example + +The Agent answers either with OK or @code{No_Secret_Key} (208). The +caller may want to check for other error codes as well. + + +@node Agent LEARN +@subsection Register a smartcard + +@example + LEARN [--send] +@end example + +This command is used to register a smartcard. With the --send +option given the certificates are send back. + + +@node Agent PASSWD +@subsection Change a Passphrase + +@example + PASSWD @var{keygrip} +@end example + +This command is used to interactively change the passphrase of the key +indentified by the hex string @var{keygrip}. + + +@node Agent UPDATESTARTUPTTY +@subsection Change the standard display + +@example + UPDATESTARTUPTTY +@end example + +Set the startup TTY and X-DISPLAY variables to the values of this +session. This command is useful to direct future pinentry invocations +to another screen. It is only required because there is no way in the +ssh-agent protocol to convey this information. diff --git a/doc/gpg.ru.sgml b/doc/gpg.ru.sgml deleted file mode 100644 index 5c7be9c78..000000000 --- a/doc/gpg.ru.sgml +++ /dev/null @@ -1,3073 +0,0 @@ - - - - - -directory"> -file"> -&ParmFile;"> -files"> -&ParmFiles;"> -names"> -&ParmNames;"> -name"> -&ParmName;"> -key IDs"> -&ParmKeyIDs"> -n"> -flags"> -string"> -value"> -name=value"> -name=value1 value2 value3 ..."> -=value"> -]> - - - - gpg - 1 - GNU Tools - - - - - - -gpg --homedir --options command - - - - - - - - - GnuPG. -GnuPG GNU General Public License, -Free Software Foundation; 2, ( ) - . - - - . - GNU Privacy Handbook (GPH) - , -http://www.gnupg.org. - - - , , - . - , - "--". - - - - - - - - - - - - - - - --s, --sign - - . ---encrypt ( ), ---symmetric ( - ) --encrypt --symmetric ( - , - ). - - - - ---clearsign - - . - - - - --b, --detach-sign - - ̣ . - - - - --e, --encrypt - - . --sign ( - ), --symmetric ( - , - , ) ---sign --symmetric ( -, , - ). - - - - --c, --symmetric - - (). - CAST5. - --cipher-algo. - --sign ( ), ---encrypt ( , - , -) --sign --encrypt ( - , - , ). - - - ---store - - RFC1991. - - - - ---decrypt &OptParmFile; - - &ParmFile; ( , ) - ( ̣ ---output). , -. , - - - . - - - - ---verify - - -, - - . , ̣ -, - . - - - ---multifile - - , - . - . - . - --multifile --verify, ---encrypt, --decrypt. , "--multifile --verify" - ̣ . - - - ---verify-files - - --multifile --verify. - - - ---encrypt-files - - --multifile --encrypt. - - - ---decrypt-files - - --multifile --decrypt. - - - - - ---list-keys &OptParmNames; ---list-public-keys &OptParmNames; - - , - . - - -, .. GnuPG. - ---with-colons. - - - - --K, --list-secret-keys &OptParmNames; - - , - . '#' sec , - (., ---export-secret-subkeys). - - - - ---list-sigs &OptParmNames; - - , --list-keys, . - - "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). - - - - ---check-sigs &OptParmNames; - - , --list-sigs, . - - - ---fingerprint &OptParmNames; - - . , --list-keys, - , . - --list-sigs --check-sigs. - , Σ . - - - - ---list-packets - - . , , . - - - - ---gen-key - - . , , - . - - - , - . doc/DETAILS - . - - - - ---edit-key &ParmName; - - , -: - - - - sign - - - &ParmName;. ݣ - ( --u), , - . - , -u. - - - lsign - - , "sign", - . , - . - - - nrsign - - , "sign", . - . - - - nrlsign - - nrsign lsign, - . - - - tsign - - . -( ) ( "trust"). -, , . - - - - -, "l" ( / ), "nr" ( -) "t" ( ) - "sign" . - - - - - revsig - - . GnuPG - , - . - - - trust - - . -, . - - - disable - enable - - (disable) (enable). - -. - - - adduid - - . - - addphoto - - . - JPEG, - . , - . , , - (GnuPG), - (PGP). - - - deluid - - . - - delsig - - . - - revuid - - . - - addkey - - . - - addcardkey - - . - - - keytocard - - ( , - ) . -Σ , - save. ̣ - . - . , - - , - , . - - - delkey - - . - - addrevoker sensitive - - . : -"sensitive". sensitive, - (. export-options). - - - revkey - - . - - expire - - . , - . , - . - - - passwd - - , ݣ . - - - primary - - , . - , - -. , - -. - - - uid &ParmN; - -/ &ParmN;. - 0 . - - - key &ParmN; - -/ &ParmN;. - 0 . - - check - - (, ) -. - - showphoto - - . - - - pref - - . - , - - . - - - showpref - - - , pref. -, 3DES ( ), SHA-1 -(-) Uncompressed (), -. - - - setpref &ParmString; - - -&ParmString;. &ParmString; , - "pref". - , "none" - . - "gpg --version". - , - (, updpref) , . - - - updpref - - ( - ) . - - . , - ( -), GnuPG -, , , -. - - - keyserver - - -. -, (. ---keyserver-option honor-keyserver-url). , - PGP URL - PGP/MIME . - "none". - - - toggle - - . - - save - - . - - quit - - . - - - - -. -ף. : - , , - . -: - - - / . - e - ; - - . - q . - n . - m /. - f /. - u /. - - - - ---sign-key &ParmName; - - . , -"sign" --edit-key. - - - ---lsign-key &ParmName; - - . - , -"lsign" --edit-key. - - - ---delete-key &ParmName; - - . - --yes, . - . - - - ---delete-secret-key &ParmName; - - . - . - - - ---delete-secret-and-public-key &ParmName; - - , --delete-key, , - ̣ . -. - - - ---gen-revoke &ParmName; - - . - --edit-key. - - - ---desig-revoke &ParmName; - - . - ( ) - . - - - ---export &OptParmNames; - - ( - ---keyring), , , - . - "output". - , - --armor. - - - - ---send-keys &OptParmNames; - - , --export . - ---keyserver. - - , . - - - - ---export-secret-keys &OptParmNames; ---export-secret-subkeys &OptParmNames; - - , --export, . - . - , , -; GNU OpenPGP - . - - --simple-sk-checksum, - OpenPGP. - - - - ---import &OptParmFiles; ---fast-import &OptParmFiles; - -/ . - . --fast-import, - --import. - - - , . - - --keyserver-option --merge-only, - -, . - - - - ---recv-keys &ParmKeyIDs; - - . - --keyserver. - - - ---refresh-keys &ParmKeyIDs; - - , - . , - .. ģ - . ---keyserver, , - -(. --keyserver-option honor-keyserver-url). - - - ---search-keys &OptParmNames; - - . ͣ, - , . - --keyserver. - - - ---update-trustdb - - . - (Web of Trust). - , .. - . - - () . -, ݣ . - --edit-key . - - - ---check-trustdb - - -. , - ԣ - . GnuPG - , ---no-auto-check-trustdb. - , . -, --update-trustdb, - ̣ . - - - cron, - --batch, -. - --yes. - - - - ---export-ownertrust - - . - , .. , - . - - - ---import-ownertrust &OptParmFiles; - - Σ -&ParmFiles; ( , ); - . - - - ---rebuild-keydb-caches - - 1.0.6 1.0.7 - . - . - - - ---print-md algo &OptParmFiles; ---print-mds &OptParmFiles; - - - ALGO - . ( "*" algo -) -. - - - ---gen-random 0|1|2 - count - - COUNT . -COUNT , - . ! - ; - ! - - - ---gen-prime mode - bits - qbits - - . . . - - - - ---version - - -. - - - - ---warranty - - . - - - - --h, --help - - . -, . - , . - - - - - - - - - - - ( - "~/.gnupg/gpg.conf"). - - , "armor" , "" -. , -. "#" ( ) -. , , - , . - - - - - - - - --a, --armor - - ASCII . - - - - --o, --output &ParmFile; - - &ParmFile;. - - - ---max-output &ParmN; - - , - . OpenPGP - , , - OpenPGP. GnuPG - , -ߣ . 0, -. - - - ---mangle-dos-filenames ---no-mangle-dos-filenames - - Windows - . --mangle-dos-filenames GnuPG - , ݣ , . - - Windows. - - - --u, --local-user &ParmName; - - &ParmName;. , - --default-key. - - - ---default-key &ParmName; - - &ParmName; . - , - . -, -u --local-user -. - - - - --r, --recipient &ParmName; - - - &ParmName;. ---hidden-recipient , --default-recipient, - GnuPG . - - - --R, --hidden-recipient &ParmName; - - - &ParmName;, . - - . ---recipient , --default-recipient, - GnuPG . - - - ---default-recipient &ParmName; - - &ParmName; , - --recipient -&ParmName; . -&ParmName; . - - - ---default-recipient-self - - , ---recipient, - . - - , --default-key. - - - - ---no-default-recipient - - --default-recipient --default-recipient-self. - - - ---encrypt-to &ParmName; - - , --recipient, - -. , - --recipient, - . - -, . - - - ---hidden-encrypt-to &ParmName; - - , --hidden-recipient, - - "encrypt-to-self". - , - --recipient, - . - -, . - - - ---no-encrypt-to - - --encrypt-to --hidden-encrypt-to. - - - --v, --verbose - - . , - . - - - - --q, --quiet - - . - - - - --z &ParmN; ---compress-level &ParmN; ---bzip2-compress-level &ParmN; - ---compress-level &ParmN; - ZIP ZLIB. zlib -( 6). --bzip2-compress-level - BZIP2 ( 6 ). - BZIP2 , - ߣ - . -z . 0 -. - - - - ---bzip2-decompress-lowmem - - -BZIP2. , - . - --bzip2-compress-level. - - - - --t, --textmode ---no-textmode - -, - OpenPGP "CRLF". - , , - - , - . - - (UNIX - Mac, Mac - Windows ..). --no-textmode - . . - - -t ( --textmode) --armor - --sign, . - PGP; - --sign --clearsign . - - - - --n, --dry-run - - ( ). - - - - --i, --interactive - - . - - - - ---batch ---no-batch - - . , - . ---no-batch . - - - ---no-tty - - TTY () . - , .. GnuPG TTY - --batch. - - - - ---yes - - . - - - - ---no - - . - - - ---ask-cert-level ---no-ask-cert-level - - , . - , ---default-cert-level. . --default-cert-level - . ---no-ask-cert-level . - . - - - ---min-cert-level - - - . 2, - 1. - - - ---default-cert-level &ParmN; - - . - -0 , - , . - -1 , , - . , - . - -2 , . , - - . - -3 , . , - , - , - , - , , , (ԣ ), - , - . - -, ģ 2 3 -. ޣ, -, . - - 0 ( ). - - - - - ---trusted-key long key ID - -, ( 8 - ) , -. - ( ) , - -. - - - ---trust-model pgp|classic|always - - - , GnuPG. - : - - - -pgp - , - PGP 5.x . - . - - -classic - PGP 2.x . - - -direct - - . - - -always - , - . , - - -. , , -"[uncertain]" , , - Σ . - - - - - ---always-trust - - `--trust-model always'. -. - - - ---keyid-format short|0xshort|long|0xlong - - . -"short" -- 8- . -"long" -- ( Σ) 16- - . "0x" - "0x" , , 0x99242560. - - - ---keyserver &ParmName; - - &ParmName;. - , - --recv-keys, --send-keys --search-keys. -&ParmName; URI: `scheme:[//]keyservername[:port]' -- - : "hkp" HTTP ( ) , -"ldap" NAI LDAP , "mailto" Graf email keyserver. -, GnuPG - . . - - , .. - . -"hkp://subkeys.pgp.net" -. - - - ---keyserver-options parameters - - ̣ - . `no-' - . - - . : - - - -include-revoked - - --search-keys, , - . , - , - ۣ . , , - , - , - . - . - - - -include-disabled - - --search-keys, , - . , - HKP . - - - -honor-keyserver-url - - --refresh-keys, - , - . . - - - -include-subkeys - - , . , - HKP, .. - . - - - -use-temp-files - - Unix- GnuPG - , - . GnuPG - . ( -Win32 RISC OS) . - - - -keep-temp-files - -, `use-temp-files' - . - . - - - -verbose - - - . - . - - - -timeout - - - . , - - . , ---recv-keys, -. 30 . - - - -http-proxy &OptEqualsValue; - - HTTP ( HKP), - -. -, - -"http_proxy". - - - -auto-key-retrieve - - - , -. - -, ̣ -. ; - , ( -), IP , -. - - - - - - ---import-options parameters - - , , -, . - `no-' . -: - - - -import-local-sigs - - , . - , -. . - - - -repair-hkp-subkey-bug - - -PKS ( 0.9.6), . -, , -.. , -. --import ---recv-keys. - - - -merge-only - - , - . . - - - - - - ---export-options parameters - - , , -, . - `no-' . -: - - - -export-local-sigs - - , . - , -. . - - - -export-attributes - - ( -). , - OpenPGP, . - . - - - -export-sensitive-revkeys - - , - "sensitive". . - - - -export-minimal - - . - ޣ , - . . - - - - - - ---list-options parameters - - ̣ , - ( , --list-keys, ---list-sigs, --list-public-keys, --list-secret-keys ---edit-key). `no-' - . : - - - -show-photos - - --list-keys, --list-sigs, --list-public-keys ---list-secret-keys photo ID . - . . --photo-viewer. - - - -show-policy-url - - URL --list-sigs --check-sigs. - . - - - -show-notations -show-std-notations -show-user-notations - - --list-sigs --check-sigs. -, , IETF, ̣ . - . - - - -show-keyserver-urls - - URL ---list-sigs --check-sigs. . - - - -show-uid-validity - - - . . - - - -show-unusable-uids - - ԣ . - . - - - -show-unusable-subkeys - - ԣ . - . - - - -show-keyring - - , - . . - - - -show-sig-expire - - - --list-sigs --check-sigs. . - - - -show-sig-subpackets - - . - , -, . , - . . - --with-colons --list-sigs --check-sigs. - - - - - - ---verify-options parameters - - ̣ , - . `no-' - . : - - - -show-photos - - photo ID , . - . . --photo-viewer. - - - -show-policy-url - - URL . . - - - -show-notations -show-std-notations -show-user-notations - - . -, , IETF, ̣ . - IETF. - - - -show-keyserver-url - - URL . - . - - - -show-uid-validity - - - . . - - - -show-unusable-uids - - ԣ - . . - - - - - - ---show-photos ---no-show-photos - - , --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 . - - - ---photo-viewer &ParmString; - - , - . "%i" , - . "%I" , ̣ - . "%k" -, "%K" -- , "%f" -- , -"%t" -- (., "jpg"), "%T" -- -MIME (., "image/jpeg"), "%%" -- . - "%i", "%I", - . - - : -"xloadimage -fork -quiet -title 'KeyID 0x%k' stdin" -, , -GnuPG ţ ݣ. - - - ---exec-path &ParmString; - - , - . , - ̣ -, - $PATH. - - - ---show-keyring - - , - . . - `--list-options [no-]show-keyring' - - - ---keyring &ParmFile; - - &ParmFile; . &ParmFile; - , - . , -, GnuPG ("~/.gnupg" - --homedir $GNUPGHOME). - -, . - , - --no-default-keyring. - - - - ---secret-keyring &ParmFile; - - , --keyring . - - - ---primary-keyring &ParmFile; - - &ParmFile; . , - ( --import --recv-keys) - . - - - ---trustdb-name &ParmFile; - - - &ParmFile; . - &ParmFile; , - $HOME. -, , GnuPG -("~/.gnupg", --homedir $GNUPGHOME). - - - - - ---homedir &ParmDir; - - &ParmDir; - , -"~/.gnupg". . - $GNUPGHOME. - - - - ---display-charset &ParmName; - - . - , , -UTF-8. , - . - 3 -v . - &ParmName;: - - -iso-8859-1 Latin 1. - - -iso-8859-2 Latin 2. - - -iso-8859-15 - Latin 1. - - -koi8-r (rfc1489). - - -utf-8 -, OS UTF-8. - - - - - - ---utf8-strings ---no-utf8-strings - -, UTF8. -(--no-utf8-strings), - ̣ --display-charset. - . - . - - - - ---options &ParmFile; - - &ParmFile; -. -. - - - - ---no-options - - "--options /dev/null". - . , , -"~./gnupg". - - - - ---load-extension &ParmName; - - . &ParmName; , - ( -"/usr/local/lib/gnupg"). , , -, . - - - - ---debug &ParmFlags; - - . -OR &ParmFlags; C (., 0x0042). - - - - ---debug-all - - . - - - ---debug-ccid-driver - - CCID . -, . - - - ---enable-progress-filter - - . - gpg - . -. - - - ---status-fd &ParmN; - - &ParmN;. -. DETAILS . - - - - ---logger-fd &ParmN; - - &ParmN;, . - - - ---attribute-fd &ParmN; - - &ParmN;. - --status-fd, .. - . - - - ---sk-comments ---no-sk-comments - - - . GnuPG OpenPGP. -. , - ASCII . ---no-sk-comments . - - - ---comment &ParmString; ---no-comments - - &ParmString; , -ASCII (. --armor). - . --comment - . --no-comments - . - - - - ---emit-version ---no-emit-version - - ASCII . ---no-emit-version . - - - - ---sig-notation &ParmNameValue; ---cert-notation &ParmNameValue; --N, --set-notation &ParmNameValue; - - - , . -&ParmName; , - '@'. - IETF ͣ. --expert - '@'. &ParmValue; -; UTF8, - --display-charset. - &ParmName; (!), - (rfc2440:5.2.3.15). ---sig-notation , ---cert-notation (), --set-notation - . - - - , . -"%k" Σ , -"%K" - , -"%f" - , -"%s" - , -"%S" - , -"%g" - () , -"%p" - , -"%c" - ޣ OpenPGP , -"%%" Σ "%". -%k, %K, %f (), %c - OpenPGP . - - - ---show-notation ---no-show-notation - - --list-sigs ---check-sigs , . - . -`--list-options [no-]show-notation' / -`--verify-options [no-]show-notation'. - - - ---sig-policy-url &ParmString; ---cert-policy-url &ParmString; ---set-policy-url &ParmString; - - &ParmString; URL -(rfc2440:5.2.3.19). (!), - URL . --sig-policy-url - URL , --cert-policy-url URL - (), -set-policy-url - . - - '%', . - - - ---show-policy-url ---no-show-policy-url - - URL --list-sigs ---check-sigs , URL . - . -`--list-options [no-]show-policy-url' / -`--verify-options [no-]show-policy-url'. - - - ---sig-keyserver-url &ParmString; - - &ParmString; URL - . , - URL . - - '%', . - - - - ---set-filename &ParmString; - - &ParmString; , . - . - - - ---for-your-eyes-only ---no-for-your-eyes-only - - `for your eyes only'. -, GnuPG ---output, PGP "secure viewer" . - --set-filename. ---no-for-your-eyes-only . - ---use-embedded-filename ---no-use-embedded-filename - - . -, .. . -. - - - - ---completes-needed &ParmN; - - , -, ( 1). - - - - ---marginals-needed &ParmN; - - , -, ( 3). - - - - ---max-cert-depth &ParmN; - - ( 5). - - - - ---cipher-algo &ParmName; - - &ParmName;. - --version . - , - . - - - ---digest-algo &ParmName; - - - &ParmName;. - --version -. - - - ---compress-algo &ParmName; - - &ParmName;. "zlib" ZLIB -̣ RFC1950. "zip" ZIP ̣ -RFC-1951 PGP. "bzip2" -, , - ߣ . "uncompressed" "none" -. , - . - , ZIP - . - -ZLIB , ZIP, .. - 8. BZIP2 ݣ -, , - ߣ . , , PGP ( -) ZIP. -ZIP "none" PGP. - - - ---cert-digest-algo &ParmName; - - - &ParmName; . - --version -. -, .. GnuPG, - OpenPGP, - , . - - - ---s2k-cipher-algo &ParmName; - - &ParmName;. - CAST5. , , - , ---personal-cipher-preferences --cipher-algo. - - - - ---s2k-digest-algo &ParmName; - - - &ParmName; -(). SHA-1. - - - - ---s2k-mode &ParmN; - - (). &ParmN; 0, - ( ), 1, - "" ( ) 3 ( -), . - --rfc1991, . - - - - ---simple-sk-checksum - - -SHA-1. -OpenPGP, GnuPG - . , - -. -. , - , - - ( ). - - - - ---disable-cipher-algo &ParmName; - - &ParmName;. -, . - - - ---disable-pubkey-algo &ParmName; - - &ParmName;. - , -. - - - ---no-sig-cache - - . - . -, - , - . , - - -, . - - - ---no-sig-create-check - -GnuPG, , ţ - , - . - ( 115% DSA ). - . , - , - . - - - ---auto-check-trustdb ---no-auto-check-trustdb - - GnuPG , -, --check-trustdb. - . ---no-auto-check-trustdb . - - - ---throw-keyids ---no-throw-keyids - - . - -. , -GnuPG - . --no-throw-keyids -. - - - ---not-dash-escaped - - -, . - , .. - . - . - , GnuPG - . - - - - ---escape-from-lines ---no-escape-from-lines - - "From " -"<From ", - -. , PGP - . . ---no-escape-from-lines . - - - - ---passphrase-fd &ParmN; - - &ParmN;. - 0 &ParmN;, . - - . -. - - - ---command-fd &ParmN; - - IPC. - , , - . - --status-fd. . doc/DETAILS - . - - - ---use-agent ---no-use-agent - GnuPG-Agent. , - . , GnuPG - , , - . --no-use-agent . - - - ---gpg-agent-info - - -GPG_AGENT_INFO. - --use-agent. - - - - - - GnuPG . - . , - . - - OPENPGP . - - - ---gnupg - - GnuPG. , -OpenPGP (. --openpgp), - PGP. - , , - , - , gpg.conf. - - - ---openpgp - - , - - OpenPGP. - , --rfc1991, ---force-v3-sigs, --s2k-*, --cipher-algo, --digest-algo ---compress-algo OpenPGP. - PGP . - - - ---rfc2440 - - , - - RFC-2440. - --openpgp. - - - ---rfc1991 - - RFC1991 (PGP 2.x). - - - ---pgp2 - - PGP 2.x. - - PGP 2.x (., RSA ), - . , `PGP 2.x' - 'MIT PGP 2.6.2'. - - -`--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 . - - - ---pgp6 - - PGP 6. - IDEA, 3DES CAST5, -- MD5, SHA1 RIPEMD160 ZIP . - , , --throw-keyids - , .. PGP 6 . - - - `--disable-mdc --no-sk-comment --escape-from-lines ---force-v3-sigs --no-ask-sig-expire'. - - - ---pgp7 - - PGP 7. - --pgp6, , MDC - AES128, AES192, AES256, TWOFISH. - - - ---pgp8 - - PGP 8. -PGP 8 OpenPGP, -PGP, ӣ - --throw-keyids - --escape-from-lines. -, - SHA-384 SHA-512. - - - - - - ---force-v3-sigs ---no-force-v3-sigs - - OpenPGP , v4, - PGP 5, 6 7 . - GnuPG v3. -, --ask-sig-expire, .. v3 - . --no-force-v3-sigs -. - - - ---force-v4-certs ---no-force-v4-certs - - v4 , v3 . -, , - -v3 RSA MD5 SHA-1. ---no-force-v4-certs . - - - - ---force-mdc - - GnuPG . - ( -64 ) MDC. - - - ---disable-mdc - - . , - - . - - - ---allow-non-selfsigned-uid ---no-allow-non-selfsigned-uid - - - . , .. - . ---no-allow-non-selfsigned-uid . - - - ---allow-freeform-uid - - . - , .. - - -. - - - - ---ignore-time-conflict - -GnuPG, , , - . , - - . - . . ---ignore-valid-from, - . - - - ---ignore-valid-from - -GnuPG, , - . . - أ -. . --ignore-time-conflict - . - - - ---ignore-crc-error - -ASCII , OpenPG CRC - . , - , ( - OpenPGP) . - . - - - ---ignore-mdc-error - - , MDC - . - , - ģ . , , -MDC . - - - ---lock-once - - - . - - - - ---lock-multiple - - . - --lock-once . - - - ---lock-never - - . - , , - . - -. - . - - - ---no-random-seed-file - -GnuPG - . ; - . - -. - - - - ---no-verbose - - 0. - - - - ---no-greeting - - . - - - ---no-secmem-warning - - . - - - ---no-permission-warning - - - (--homedir). -, , GnuPG, - - , - . , - ݣ . - -, , - , .. - ݣ - gpg.conf . - . - - - ---no-mdc-warning - - - MDC. - - - ---require-secmem ---no-require-secmem - - GnuPG . - (.. GnuPG , -). - - - ---no-armor - -, ASCII . - - - - ---no-default-keyring - - . -, GnuPG , - - --keyring --secret-keyring, - -. - - - - ---skip-verify - - . - . - - - - ---with-colons - - ̣ . , - UTF-8 ---display-charset. -, .. . - doc/DETAILS, - GnuPG. - - - - ---with-key-data - - ̣ ( - --with-colons) . - - - ---with-fingerprint - - , --fingerprint - . - - - ---fast-list-mode - - ; ޣ -ߣ . - . - . - . - - - ---fixed-list-mode - - - --with-colon -1970-01-01. - - - ---list-only - - . --dry-run, - . . - - . - - - ---no-literal - - . - . - - - ---set-filesize - - . - . - - - ---show-session-key - - , -. . --override-session-key. - - - - . - , - . - - , . - . - - - ---override-session-key &ParmString; - - , - &ParmString;. - --show-session-key. - , - ; - . - - - ---ask-sig-expire ---no-ask-sig-expire - - . -, . ---no-ask-sig-expire . - ---ask-cert-expire ---no-ask-cert-expire - - . -, . ---no-ask-cert-expire . - ---expert ---no-expert - - -, , , - , , - . - . , - , . - , - , . ---no-expert . - - - ---allow-secret-key-import - - , . - - - ---try-all-secrets - - , - , ģ - . - - ( --throw-keyids) - -. - - - ---enable-special-filenames - - --&n, n -- , - n. - - - ---no-expensive-trust-checks - - . - - - ---group &ParmNameValues; - - , . - (-r or ---recipient), . - , - . - - , , =, -&ParmKeyIDs; , - . , - . , , - - -. , - , - , . - - - ---ungroup &ParmName; - - --group. - - - ---no-groups - - --group. - - - ---preserve-permissions - - - / . - , . - - - ---personal-cipher-preferences &ParmString; - - &ParmString;, - , , -"pref" . - -. , , - --symmetric. - - - ---personal-digest-preferences &ParmString; - - - &ParmString;, - , , -"pref" . - -. -, , - (--clearsign --sign). - "H2", SHA-1. - - - ---personal-compress-preferences &ParmString; - - &ParmString;, - , , -"pref" . - -. , , - , (, ---symmetric). - - - ---default-preference-list &ParmString; - - &ParmString;, - , , -"pref" . - "updpref" . - - - ---list-config &OptParmNames; - - GnuPG. - , - GnuPG. . doc/DETAILS - GnuPG. --list-config - --with-colons. - - - - - - - - - - -GnuPG; : - - - - - - - - - -234567C4 -0F34E556E -01347A56A -0xAB123456 - - . - - - - -234AABBCC34567C4 -0F323456784E56EAB -01AB3FED1347A5612 -0x234AABBCC34567C4 - - , OpenPGP ( - ---with-colons). - - - - -1234343434343434C434343434343434 -123434343434343C3434343434343734349A3434 -0E12343434343434343434EAB3484343434343434 -0xE12343434343434343434EAB3484343434343434 - - -- . - - ( ). - - - - -=Heinrich Heine <heinrichh@uni-duesseldorf.de> - - . -. - - - - -<heinrichh@uni-duesseldorf.de> - - . - , . - - - - -+Heinrich Heine duesseldorf - - ( - ) - . , , - 7- . - - - - -Heine -*Heine - - ( - ). , - ף . - - - - - - -, (!) - . , GnuPG, - - - . - - - - - - - - - 0 , 1 - - . - - - - - - - - -gpg -se -r - Bob - - - -gpg --clearsign &ParmFile; - - - - -gpg -sb &ParmFile; - ̣ - - - -gpg --list-keys - - - - -gpg --fingerprint - - - - -gpg --verify -gpg --verify - - , . - ̣ , - - - - - - - - - - -HOME - . - - -GNUPGHOME -, "~/.gnupg". - - -GPG_AGENT_INFO - gpg-agent; - --use-agent. - 3 , ̣ . -- - UNIX, -- gpg-agent, -- - , 1. gpg-agent, - , -. --gpg-agent-info - . - - - -http_proxy - ---honor-http-proxy. - - - -COLUMNS -LINES - - . - - - - - - - - - - -~/.gnupg/secring.gpg - - - - -~/.gnupg/secring.gpg.lock - - - - -~/.gnupg/pubring.gpg - - - - -~/.gnupg/pubring.gpg.lock - - - - -~/.gnupg/trustdb.gpg - - - - -~/.gnupg/trustdb.gpg.lock - ţ - - - -~/.gnupg/random_seed - - - - -~/.gnupg/gpg.conf - - - - -~/.gnupg/options - . - gpg.conf - - - -/usr[/local]/share/gnupg/options.skel - - - - -/usr[/local]/lib/gnupg/ -, - - - - - - - - - - - - ** ** - . - . , - ģ , - "~/.gnupg/". - - -, (, - telnet), ** ! - - - ̣ , , - ; , - - . - - - - - OPENPGP - -GnuPG OpenPGP. -, GnuPG , - - SHA-512 ZLIB BZIP2. , - OpenPGP , - ---cipher-algo, --digest-algo, --cert-digest-algo --compress-algo -GnuPG , , - OpenPGP, , - OpenPGP. - - - OpenPGP, - ϣ . -, , -PGP BLOWFISH. PGP - . -GnuPG ̣ OpenPGP, - , - , , -OpenPGP . , - , . - - - - , - , - - , --pgp6, ---pgp7 --pgp8. , .. - - OpenPGP, - . - - - - - - - - -SUID. . - ( - ) . - - , , - -. - , . - - - - - - - : <zwon@severodvinsk.ru>. - - - - diff --git a/doc/gpg.sgml b/doc/gpg.sgml deleted file mode 100644 index c3adc6ad4..000000000 --- a/doc/gpg.sgml +++ /dev/null @@ -1,3366 +0,0 @@ - - - - -directory"> -file"> -&ParmFile;"> -files"> -&ParmFiles;"> -name"> -&ParmName;"> -names"> -&ParmNames;"> -key IDs"> -&ParmKeyIDs"> -n"> -flags"> -string"> -URIs"> -value"> -name=value"> -name=value1 value2 value3 ..."> -name=value1 value2 value3 ..."> -=value"> -]> - - - - gpg - 1 - GNU Tools - - - encryption and signing tool - - - -gpg - --homedir - --options - - command - - - - - - DESCRIPTION - - - -This man page only lists the commands and options available. For more -verbose documentation get the GNU Privacy Handbook (GPH) or one of the -other documents at http://www.gnupg.org/documentation/ . - - -Please remember that option parsing stops as soon as a non option is -encountered, you can explicitly stop option parsing by using the -special option "--". - - - - -COMMANDS - - - - - - - - - - --s, --sign &OptParmFile; - -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 &OptParmFile; - -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. - - - - --b, --detach-sign &OptParmFile; - -Make a detached signature. - - - - --e, --encrypt &OptParmFile; - -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). - - - - --c, --symmetric &OptParmFile; - -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 &OptParmFile; - -Store only (make a simple RFC1991 packet). - - - - --d, --decrypt &OptParmFile; - -Decrypt &ParmFile; (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 - 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 &OptParmNames; ---list-public-keys &OptParmNames; - -List all keys from the public keyrings, or just the ones given on the -command line. - -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. - - - - --K, --list-secret-keys &OptParmNames; - -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 &OptParmNames; - -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 &OptParmNames; - -Same as --list-sigs, but the signatures are verified. - - - ---fingerprint &OptParmNames; - -List all keys 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. - - - - ---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. - - - - ---edit-key &ParmName; - -Present a menu which enables you to do all key -related tasks: - - - - sign - -Make a signature on key of user &ParmName; 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. - - delsig - -Delete a signature. - - 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 &ParmFile; - -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. - - addrevoker sensitive - -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 &ParmN; - -Toggle selection of user id with index &ParmN;. -Use 0 to deselect all. - - key &ParmN; - -Toggle selection of subkey with index &ParmN;. -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 &ParmString; - -Set the list of user ID preferences to &ParmString; 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. - eTrust -calculation has failed; probably due to an expired key. - qNot enough information for calculation. - nNever trust this key. - mMarginally trusted. - fFully trusted. - uUltimately trusted. - - - - - ---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. - - - - ---sign-key &ParmName; - -Signs a public key with your secret key. This is a shortcut version of -the subcommand "sign" from --edit. - - - ---lsign-key &ParmName; - -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. - - - ---delete-key &ParmName; - -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 &ParmName; - -Remove key from the secret and public keyring. In batch mode the key -must be specified by fingerprint. - - - ---delete-secret-and-public-key &ParmName; - -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. - - - ---gen-revoke &ParmName; - -Generate a revocation certificate for the complete key. To revoke -a subkey or a signature, use the --edit command. - - - ---desig-revoke &ParmName; - -Generate a designated revocation certificate for a key. This allows a -user (with the permission of the keyholder) to revoke someone else's -key. - - - ---export &OptParmNames; - -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 &OptParmNames; - -Same as --export but sends the keys to a keyserver. -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 &OptParmNames; ---export-secret-subkeys &OptParmNames; - -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 &OptParmFiles; ---fast-import &OptParmFiles; - -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 &ParmKeyIDs; - -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 &OptParmKeyIDs; - -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 &ParmNames; - -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 &ParmURIs; - -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 &OptParmFiles; - -Update the trustdb with the ownertrust values stored -in &ParmFiles; (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 &OptParmFiles; ---print-mds &OptParmFiles; - -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 - count - -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 - qbits - -Use the source, Luke :-). The output format is still subject to change. - - - - ---version - -Print version information along with a list -of supported algorithms. - - - - ---warranty - -Print warranty information. - - - - --h, --help - -Print usage information. This is a really long list even though it -doesn't list all options. For every option, consult this manual. - - - - - - -OPTIONS - -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. - - - - - - - - --a, --armor - -Create ASCII armored output. - - - - --o, --output &ParmFile; - -Write output to &ParmFile;. - - - - ---max-output &ParmN; - -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". - - - ---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. - - - - --u, --local-user &ParmName; - -Use &ParmName; as the key to sign with. Note that this option -overrides --default-key. - - - ---default-key &ParmName; - -Use &ParmName; 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. - - - --r, --recipient &ParmName; - -Encrypt for user id &ParmName;. If this option or --hidden-recipient -is not specified, GnuPG asks for the user-id unless ---default-recipient is given. - - - --R, --hidden-recipient &ParmName; - -Encrypt for user ID &ParmName;, 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. - - - ---default-recipient &ParmName; - -Use &ParmName; as default recipient if option --recipient is not used and -don't ask if this is a valid one. &ParmName; 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. - - - ---encrypt-to &ParmName; - -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 &ParmName; - -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. - - - - --v, --verbose - -Give more information during processing. If used -twice, the input data is listed in detail. - - - - --q, --quiet - -Try to be as quiet as possible. - - - - --z &ParmN; ---compress-level &ParmN; ---bzip2-compress-level &ParmN; - -Set compression level to &ParmN; 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 &ParmN; 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. - - - - --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. - - - - --n, --dry-run - -Don't make any changes (this is not completely implemented). - - - - --i, --interactive - -Prompt before overwriting any files. - - - ---batch ---no-batch - -Use batch mode. Never ask, do not allow interactive commands. ---no-batch disables this option. - - - - ---no-tty - -Make sure that the TTY (terminal) is never used for any output. -This option is needed in some cases because GnuPG sometimes prints -warnings to the TTY if --batch is used. - - - - ---yes - -Assume "yes" on most questions. - - - - ---no - -Assume "no" on most questions. - - - - ---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 &ParmN; - -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. - - - - - ---always-trust - -Identical to `--trust-model always'. This option is deprecated. - - - ---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 &ParmName; &OptParmNameValues; - -Use &ParmName; 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 &ParmName; 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 &ParmNameValues; - -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&OptEqualsValue; - -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&OptEqualsValue; - -For HTTP-like keyserver schemes that (such as HKP and HTTP itself), -try to access the keyserver over a proxy. If a &ParmValue; is -specified, use this as the HTTP proxy. If no &ParmValue; is -specified, the value of the environment variable "http_proxy", if any, -will be used. - - - -max-cert-size&OptEqualsValue; - -When retrieving a key via DNS CERT, only accept keys up to this size. -Defaults to 16384 bytes. - - - - - - ---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. - - - - - - ---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-' 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. - - - - ---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. - - - ---photo-viewer &ParmString; - -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 &ParmString; - -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. - - - ---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. - - - ---keyring &ParmFile; - -Add &ParmFile; to the current list of keyrings. If &ParmFile; 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 &ParmFile; - -Same as --keyring but for the secret keyrings. - - - ---primary-keyring &ParmFile; - -Designate &ParmFile; as the primary public keyring. This means that -newly imported keys (via --import or keyserver --recv-from) will go to -this keyring. - - - ---trustdb-name &ParmFile; - -Use &ParmFile; instead of the default trustdb. If &ParmFile; 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 &ParmDir; - -Set the name of the home directory to &ParmDir; If this option is not -used it defaults to "~/.gnupg". It does not make sense to use this in -a options file. This also overrides the environment variable -$GNUPGHOME. - - - ---pcsc-driver &ParmFile; - -Use &ParmFile; 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. - - - ---ctapi-driver &ParmFile; - -Use &ParmFile; 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. - - - ---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 &ParmName; - -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 &ParmName; are: - - -iso-8859-1This is the Latin 1 set. - - -iso-8859-2The Latin 2 set. - - -iso-8859-15This is currently an alias for -the Latin 1 set. - - -koi8-rThe usual Russian set (rfc1489). - - -utf-8Bypass 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 &ParmFile; - -Read options from &ParmFile; 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. - - - - ---load-extension &ParmName; - -Load an extension module. If &ParmName; 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. - - - - ---debug &ParmFlags; - -Set debugging flags. All flags are or-ed and &ParmFlags; 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 &ParmN; - -Write special status strings to the file descriptor &ParmN;. -See the file DETAILS in the documentation for a listing of them. - - - ---status-file &ParmFile; - -Same as --status-fd, except the status data is written to file -&ParmFile;. - - - ---logger-fd &ParmN; - -Write log output to file descriptor &ParmN; and not to stderr. - - - ---logger-file &ParmFile; - -Same as --logger-fd, except the logger data is written to file -&ParmFile;. - - - ---attribute-fd &ParmN; - -Write attribute subpackets to the file descriptor &ParmN;. 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 &ParmFile; - -Same as --attribute-fd, except the attribute data is written to file -&ParmFile;. - - - - ---comment &ParmString; ---no-comments - -Use &ParmString; 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 &ParmNameValue; ---cert-notation &ParmNameValue; --N, --set-notation &ParmNameValue; - -Put the name value pair into the signature as notation data. -&ParmName; 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. &ParmValue; -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 -&ParmName; 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. - - - - - ---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. - - - ---sig-policy-url &ParmString; ---cert-policy-url &ParmString; ---set-policy-url &ParmString; - -Use &ParmString; 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. - - - ---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. - - - - ---sig-keyserver-url &ParmString; - -Use &ParmString; 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 &ParmString; - -Use &ParmString; 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. - - - - ---completes-needed &ParmN; - -Number of completely trusted users to introduce a new -key signer (defaults to 1). - - - - ---marginals-needed &ParmN; - -Number of marginally trusted users to introduce a new -key signer (defaults to 3) - - - - ---max-cert-depth &ParmN; - -Maximum depth of a certification chain (default is 5). - - - - ---cipher-algo &ParmName; - -Use &ParmName; 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 &ParmName; - -Use &ParmName; 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 &ParmName; - -Use compression algorithm &ParmName;. "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 &ParmName; - -Use &ParmName; 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. - - - - ---s2k-cipher-algo &ParmName; - -Use &ParmName; 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 &ParmName; - -Use &ParmName; as the digest algorithm used to mangle the passphrases. -The default algorithm is SHA-1. - - - - ---s2k-mode &ParmN; - -Selects how passphrases are mangled. If &ParmN; 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 -couple of times. Unless --rfc1991 is used, this mode is also used for -conventional encryption. - - - - ---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). - - - - ---disable-cipher-algo &ParmName; - -Never allow the use of &ParmName; as cipher algorithm. -The given name will not be checked so that a later loaded algorithm -will still get disabled. - - - ---disable-pubkey-algo &ParmName; - -Never allow the use of &ParmName; as public key algorithm. -The given name will not be checked so that a later loaded algorithm -will still get disabled. - - - ---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. - - - ---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-fd &ParmN; - -Read the passphrase from file descriptor &ParmN;. Only the first line -will be read from file descriptor &ParmN;. If you use 0 for &ParmN;, -the passphrase will be read from stdin. This can only be used if only -one passphrase is supplied. - - - ---passphrase-file &ParmFile; - -Read the passphrase from file &ParmFile;. Only the first line will -be read from file &ParmFile;. 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 &ParmString; - -Use &ParmString; 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 &ParmN; - -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 &ParmFile; - -Same as --command-fd, except the commands are read out of file -&ParmFile; - - - ---use-agent ---no-use-agent - -Try to use the GnuPG-Agent. Please note that this agent is still under -development. 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 - - - -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. - - - - - ---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. - - - ---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. - - - ---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 &ParmN; - -With &ParmN; 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-verbose - -Reset verbose level to 0. - - - ---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). - - - ---no-armor - -Assume the input data is not in ASCII armored format. - - - - ---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-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. - - - - ---with-key-data - -Print key listings delimited by colons (like --with-colons) and print the public key data. - - - ---with-fingerprint - -Same as the command --fingerprint but changes only the format of the output -and may be used together with another command. - - - ---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. - - - ---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. - - - ---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. - - - ---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 &ParmString; - -Don't use the public key but the session key &ParmString;. 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. - - - ---require-cross-certification ---no-require-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. -Currently defaults to --no-require-cross-certification, but will be -changed to --require-cross-certification in the future. - - - ---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". - - - ---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. - - - ---allow-secret-key-import - -This is an obsolete option and is not used anywhere. - - - ---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. - - - ---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. - - - ---group &ParmNameValues; - -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 &ParmKeyIDs; 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 &ParmName; - -Remove a given entry from the --group list. - - - ---no-groups - -Remove all entries from the --group list. - - - ---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. - - - ---personal-cipher-preferences &ParmString; - -Set the list of personal cipher preferences to &ParmString;, 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 &ParmString; - -Set the list of personal digest preferences to &ParmString;, 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 &ParmString; - -Set the list of personal compression preferences to &ParmString;, 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). - - - ---default-preference-list &ParmString; - -Set the list of default preferences to &ParmString;. This preference -list is used for new keys and becomes the default for "setpref" in the -edit menu. - - - ---default-keyserver-url &ParmName; - -Set the default keyserver URL to &ParmName;. 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 &OptParmNames; - -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. - - - - - - - - How to specify a user ID - -There are different ways to specify a user ID to GnuPG; here are some -examples: - - - - - - - - - -234567C4 -0F34E556E -01347A56A -0xAB123456 - -Here the key ID is given in the usual short form. - - - - -234AABBCC34567C4 -0F323456784E56EAB -01AB3FED1347A5612 -0x234AABBCC34567C4 - -Here the key ID is given in the long form as used by OpenPGP -(you can get the long key ID using the option --with-colons). - - - - -1234343434343434C434343434343434 -123434343434343C3434343434343734349A3434 -0E12343434343434343434EAB3484343434343434 -0xE12343434343434343434EAB3484343434343434 - -The best way to specify a key ID is by using the fingerprint of -the key. This avoids any ambiguities in case that there are duplicated -key IDs (which are really rare for the long key IDs). - - - - -=Heinrich Heine <heinrichh@uni-duesseldorf.de> - -Using an exact to match string. The equal sign indicates this. - - - - -<heinrichh@uni-duesseldorf.de> - -Using the email address part which must match exactly. The left angle bracket -indicates this email address mode. - - - - -@heinrichh - -Match within the <email.address> part of a user ID. The at sign -indicates this email address mode. - - - - - - -Heine -*Heine - -By case insensitive substring matching. This is the default mode but -applications may want to explicitly indicate this by putting the asterisk -in front. - - - - - - -Note that you can append an exclamation mark (!) to key IDs or -fingerprints. This flag tells GnuPG to use the specified primary or -secondary key and not to try and calculate which primary or secondary -key to use. - - - - - - - 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. - - - - - EXAMPLES - - - -gpg -se -r -sign and encrypt for user Bob - - - -gpg --clearsign &ParmFile; -make a clear text signature - - - -gpg -sb &ParmFile; -make a detached signature - - - -gpg --list-keys -show keys - - - -gpg --fingerprint -show fingerprint - - - -gpg --verify -gpg --verify - -Verify the signature of the file but do not output the data. The -second form is used for detached signatures, where - - - - - - - ENVIRONMENT - - - -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; 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. - - - - - - - - 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 - - - -~/.gnupg/gpg.conf -Default configuration file - - - -~/.gnupg/options -Old style configuration file; only used when gpg.conf -is not found - - - -/usr[/local]/share/gnupg/options.skel -Skeleton options file - - - -/usr[/local]/lib/gnupg/ -Default location for extensions - - - - - - - - - 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. - - - - diff --git a/doc/gpg.texi b/doc/gpg.texi index aca21a0cb..3254c94df 100644 --- a/doc/gpg.texi +++ b/doc/gpg.texi @@ -1,2231 +1,27 @@ -\input texinfo -@setfilename gpg.info -@dircategory GnuPG -@direntry -* gpg: (gpg). GnuPG encryption and signing tool. -@end direntry +@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. -@node Top, , , (dir) -@top gpg -@chapheading Name +@node Invoking GPG +@chapter Invoking GPG +@cindex GPG command options +@cindex command options +@cindex options, GPG command -gpg --- encryption and signing tool -@chapheading Synopsis +@c man begin DESCRIPTION -@example -gpg - --homedir name - --options file - options - command - args - -@end example -@chapheading DESCRIPTION +@command{gpg} is the OpenPGP part of GnuPG. The version included in +this package is not as matured as the standard versions (1.2.x or +1.4.x) and thus we strongly suggest to keep on using the one of the +standard versions. Both versions may be installed side by side and +should coexists without problems. To help for that, the @command{gpg} +from this package gets installed under the name @command{gpg2}. If you +really want to use this @command{gpg2} command you should name the +configuration file @file{gpg.conf-1.9} to keep it separate from the +one used with the standard @command{gpg}. -@code{gpg} is the main program for the GnuPG system. +Documentation for the old standard @command{gpg} is available in a +man page and at @inforef{Top,GnuPG 1,gpg}. -This man page only lists the commands and options available. For more -verbose documentation get the GNU Privacy Handbook (GPH) or one of the -other documents at http://www.gnupg.org/documentation/ . -Please remember that option parsing stops as soon as a non option is -encountered, you can explicitly stop option parsing by using the -special option "--". -@chapheading COMMANDS - -@code{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). - -@code{gpg} recognizes these commands: - -@table @asis - -@item -s, --sign -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). - -@item --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 -b, --detach-sign -Make a detached signature. - -@item -e, --encrypt -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). - -@item -c, --symmetric -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). - -@item --store -Store only (make a simple RFC1991 packet). - -@item -d, --decrypt -Decrypt @code{file} (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. - -@item --verify -Assume that @code{sigfile} is a 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 -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. - -@item --verify-files -Identical to `--multifile --verify'. - -@item --encrypt-files -Identical to `--multifile --encrypt'. - -@item --decrypt-files -Identical to `--multifile --decrypt'. - -@item --list-keys -@itemx --list-public-keys -List all keys from the public keyrings, or just the ones given on the -command line. - -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. - -@item -K, --list-secret-keys -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). - -@item --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"). - -@item --check-sigs -Same as --list-sigs, but the signatures are verified. - -@item --fingerprint -List all keys 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. - -@item --list-packets -List only the sequence of packets. This is mainly -useful for debugging. - -@item --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 --edit-key @code{name} -Present a menu which enables you to do all key -related tasks: - -@table @asis - -@item 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 -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 -Same as "sign" but the signature is marked as non-revocable and can -therefore never be revoked. - -@item 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 - -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. - -@table @asis - -@item 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 -Change the owner trust value. This updates the -trust-db immediately and no save is required. - -@item disable -@itemx enable -Disable or enable an entire key. A disabled key can not normally be -used for encryption. - -@item adduid -Create an alternate user id. - -@item 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 -Delete a user id. - -@item delsig -Delete a signature. - -@item revuid -Revoke a user id. - -@item addkey -Add a subkey to this key. - -@item addcardkey -Generate a key on a card and add it -to this key. - -@item 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} -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 -Remove a subkey. - -@item 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 -Revoke a subkey. - -@item 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 -Change the passphrase of the secret key. - -@item 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} -Toggle selection of user id with index @code{n}. -Use 0 to deselect all. - -@item key @code{n} -Toggle selection of subkey with index @code{n}. -Use 0 to deselect all. - -@item check -Check all selected user ids. - -@item showphoto -Display the selected photographic user -id. - -@item pref -List preferences from the selected user ID. This shows the actual -preferences, without including any implied preferences. - -@item 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} -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 ---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. - -@item 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. - -@item 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. - -@item toggle -Toggle between public and secret key listing. - -@item 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 -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 -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. - -@item save -Save all changes to the key rings and quit. - -@item quit -Quit the program without updating the -key rings. -@end table - -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: - -@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 - -@item --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 -Show the content of the smart card. - -@item --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. - -@item --sign-key @code{name} -Signs a public key with your secret key. This is a shortcut version of -the subcommand "sign" from --edit. - -@item --lsign-key @code{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. - -@item --delete-key @code{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. - -@item --delete-secret-key @code{name} -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} -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. - -@item --gen-revoke @code{name} -Generate a revocation certificate for the complete key. To revoke -a subkey or a signature, use the --edit command. - -@item --desig-revoke @code{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. - -@item --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. - -@item --send-keys -Same as --export but sends the keys to a keyserver. -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 -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. - -@item --import -@itemx --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. - -@item --recv-keys @code{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. - -@item --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). - -@item --search-keys @code{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. - -@item --fetch-keys @code{URIs} -Retrieve keys located at the specified URIs. Note that different -installations of GnuPG may support different protocols (HTTP, FTP, -LDAP, etc.) - -@item --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. - -@item --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. - -@item --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 -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 -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 -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} -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! - -@item --gen-prime @code{mode} @code{bits} -Use the source, Luke :-). The output format is still subject to change. - -@item --version -Print version information along with a list -of supported algorithms. - -@item --warranty -Print warranty information. - -@item -h, --help -Print usage information. This is a really long list even though it -doesn't list all options. For every option, consult this manual. -@end table -@chapheading OPTIONS - -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. - -@code{gpg} recognizes these options: - -@table @asis - -@item -a, --armor -Create ASCII armored output. - -@item -o, --output @code{file} -Write output to @code{file}. - -@item --max-output @code{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". - -@item --mangle-dos-filenames -@itemx --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. - -@item -u, --local-user @code{name} -Use @code{name} as the key to sign with. Note that this option -overrides --default-key. - -@item --default-key @code{name} -Use @code{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. - -@item -r, --recipient @code{name} -Encrypt for user id @code{name}. If this option or --hidden-recipient -is not specified, GnuPG asks for the user-id unless ---default-recipient is given. - -@item -R, --hidden-recipient @code{name} -Encrypt for user ID @code{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. - -@item --default-recipient @code{name} -Use @code{name} as default recipient if option --recipient is not used and -don't ask if this is a valid one. @code{name} must be non-empty. - -@item --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. - -@item --no-default-recipient -Reset --default-recipient and --default-recipient-self. - -@item --encrypt-to @code{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. - -@item --hidden-encrypt-to @code{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. - -@item --no-encrypt-to -Disable the use of all --encrypt-to and --hidden-encrypt-to keys. - -@item -v, --verbose -Give more information during processing. If used -twice, the input data is listed in detail. - -@item -q, --quiet -Try to be as quiet as possible. - -@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). --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 @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 ---bzip2-compress-level. - -@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). --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. - -@item -n, --dry-run -Don't make any changes (this is not completely implemented). - -@item -i, --interactive -Prompt before overwriting any files. - -@item --batch -@itemx --no-batch -Use batch mode. Never ask, do not allow interactive commands. ---no-batch disables this option. - -@item --no-tty -Make sure that the TTY (terminal) is never used for any output. -This option is needed in some cases because GnuPG sometimes prints -warnings to the TTY if --batch is used. - -@item --yes -Assume "yes" on most questions. - -@item --no -Assume "no" on most questions. - -@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 ---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. - -@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 --always-trust -Identical to `--trust-model always'. This option is deprecated. - -@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 --keyserver -option. - -@item (keyserver URL) -In addition, a keyserver URL as used in the --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 ---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 @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 --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. - -@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 (--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: - -@table @asis - -@item 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. - -@item 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. - -@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 --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 --recv-keys, the -timeout applies separately to each key retrieval, and not to the ---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 --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 --import and to -yes for keyserver --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 --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 --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 "--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 --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 --edit-key command "minimize" before export except -that the local copy of the key is not modified. Defaults to no. -@end table - -@item --list-options @code{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-' to give the opposite meaning. -The options are: - -@table @asis - -@item 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. - -@item show-policy-urls -Show policy URLs in the --list-sigs or --check-sigs listings. -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 ---list-sigs or --check-sigs listings. Defaults to no. - -@item show-keyserver-urls -Show any preferred keyserver URL in the --list-sigs or --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 --list-sigs or ---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 --with-colons along with --list-sigs or ---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 --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 --show-photos -@itemx --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. - -@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 --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. - -@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 --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. - -@item --secret-keyring @code{file} -Same as --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 --import or keyserver --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 ("~/.gnupg" if --homedir or $GNUPGHOME -is not used). - -@item --homedir @code{directory} -Set the name of the home directory to @code{directory} If this option is not -used it defaults to "~/.gnupg". It does not make sense to use this in -a options file. This also overrides the environment variable -$GNUPGHOME. - -@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 --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 --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 (--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. - -@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 --homedir). This option is ignored if used -in an options file. - -@item --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. - -@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. - -@item --debug @code{flags} -Set debugging flags. All flags are or-ed and @code{flags} may -be given in C syntax (e.g. 0x0042). - -@item --debug-all -Set all useful debugging flags. - -@item --debug-ccid-driver -Enable debug output from the included CCID driver for smartcards. -Note that this option is only available on some system. - -@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 --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 --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 --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 --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 --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. - -@item --emit-version -@itemx --no-emit-version -Force inclusion of the version string in ASCII armored output. ---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 --expert flag overrides the '@@' check. @code{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 -@code{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. - -@item --show-notation -@itemx --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. - -@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. --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. - -@item --show-policy-url -@itemx --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. - -@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 --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. - -@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 --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 --cipher-algo @code{name} -Use @code{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. - -@item --digest-algo @code{name} -Use @code{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. - -@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. --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 --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 --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 --personal-cipher-preferences and ---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 -couple of times. Unless --rfc1991 is used, this mode is also used for -conventional encryption. - -@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 --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 --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 --check-trustdb command internally. -This may be a time consuming process. --no-auto-check-trustdb -disables this option. - -@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. ---no-throw-keyids disables this option. This option is essentially -the same as using --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. --no-escape-from-lines disables this option. - -@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. - -@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. - -@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. - -@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 --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 --command-fd, except the commands are read out of file -@code{file} - -@item --use-agent -@itemx --no-use-agent -Try to use the GnuPG-Agent. Please note that this agent is still under -development. With this option, GnuPG first tries to connect to the -agent before it asks for a passphrase. --no-use-agent disables this -option. - -@item --gpg-agent-info -Override the value of the environment variable -@samp{GPG_AGENT_INFO}. This is only used when --use-agent has been given - -@item 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 @asis - -@item --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. - -@item --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. - -@item --rfc2440 -Reset all packet, cipher and digest options to strict RFC-2440 -behavior. Note that this is currently the same thing as --openpgp. - -@item --rfc1991 -Try to be more RFC-1991 (PGP 2.x) compliant. - -@item --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. - -@item --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' - -@item --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. - -@item --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. -@end table - -@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 --ask-sig-expire, as v3 signatures -cannot have expiration dates. --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. ---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 --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. --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 --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 --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 --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 --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 ---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-verbose -Reset verbose level to 0. - -@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 (--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. - -@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 --no-armor -Assume the input data is not in ASCII armored format. - -@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 --keyring or ---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-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. - -@item --with-key-data -Print key listings delimited by colons (like --with-colons) and print the public key data. - -@item --with-fingerprint -Same as the command --fingerprint but changes only the format of the output -and may be used together with another command. - -@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. - -@item --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. - -@item --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. - -@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 --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 --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 --require-cross-certification -@itemx --no-require-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. -Currently defaults to --no-require-cross-certification, but will be -changed to --require-cross-certification in the future. - -@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 ---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. - -@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 ---default-cert-expire is used. --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 --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. --no-expert disables this option. - -@item --allow-secret-key-import -This is an obsolete option and is not used anywhere. - -@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 ---throw-keyids) and might come handy in case where an encrypted -message contains a bogus key ID. - -@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 --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 (-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 @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 --group list. - -@item --no-groups -Remove all entries from the --group list. - -@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 --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 ---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. --clearsign or --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. --symmetric). - -@item --default-preference-list @code{string} -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} -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 -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. --list-config is -only usable with --with-colons set. -@end table -@chapheading How to specify a user ID - -There are different ways to specify a user ID to GnuPG; here are some -examples: - -@table @asis - -@item - -@item 234567C4 -@itemx 0F34E556E -@itemx 01347A56A -@itemx 0xAB123456 -Here the key ID is given in the usual short form. - -@item 234AABBCC34567C4 -@itemx 0F323456784E56EAB -@itemx 01AB3FED1347A5612 -@itemx 0x234AABBCC34567C4 -Here the key ID is given in the long form as used by OpenPGP -(you can get the long key ID using the option --with-colons). - -@item 1234343434343434C434343434343434 -@itemx 123434343434343C3434343434343734349A3434 -@itemx 0E12343434343434343434EAB3484343434343434 -@itemx 0xE12343434343434343434EAB3484343434343434 -The best way to specify a key ID is by using the fingerprint of -the key. This avoids any ambiguities in case that there are duplicated -key IDs (which are really rare for the long key IDs). - -@item =Heinrich Heine -Using an exact to match string. The equal sign indicates this. - -@item -Using the email address part which must match exactly. The left angle bracket -indicates this email address mode. - -@item @@heinrichh -Match within the part of a user ID. The at sign -indicates this email address mode. - -@item Heine -@itemx *Heine -By case insensitive substring matching. This is the default mode but -applications may want to explicitly indicate this by putting the asterisk -in front. -@end table - -Note that you can append an exclamation mark (!) to key IDs or -fingerprints. This flag tells GnuPG to use the specified primary or -secondary key and not to try and calculate which primary or secondary -key to use. -@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. -@chapheading 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 -@chapheading ENVIRONMENT - -@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; 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. - -@item COLUMNS -@itemx LINES -Used to size some displays to the full size of the screen. -@end table -@chapheading FILES - -@table @asis - -@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 ~/.gnupg/gpg.conf -Default configuration file - -@item ~/.gnupg/options -Old style configuration file; only used when gpg.conf -is not found - -@item /usr[/local]/share/gnupg/options.skel -Skeleton options file - -@item /usr[/local]/lib/gnupg/ -Default location for extensions -@end table -@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. -@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 --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. -@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. - -@bye +@c man end diff --git a/doc/gpgsm.texi b/doc/gpgsm.texi new file mode 100644 index 000000000..5a8778add --- /dev/null +++ b/doc/gpgsm.texi @@ -0,0 +1,1006 @@ +@c Copyright (C) 2002 Free Software Foundation, Inc. +@c This is part of the GnuPG manual. +@c For copying conditions, see the file gnupg.texi. + +@node Invoking GPGSM +@chapter Invoking GPGSM +@cindex GPGSM command options +@cindex command options +@cindex options, GPGSM command + +@c man begin DESCRIPTION + +@command{gpgsm} is a tool similar to @command{gpg} to provide digital +encryption and signing servicesd on X.509 certificates and the CMS +protocol. It is mainly used as a backend for S/MIME mail processing. +@command{gpgsm} includes a full features certificate management and +complies with all rules defined for the German Sphinx project. + +@c man end + +@xref{Option Index}, for an index to @command{GPGSM}'s commands and options. + +@menu +* GPGSM Commands:: List of all commands. +* GPGSM Options:: List of all options. +* GPGSM Configuration:: Configuration files. +* GPGSM Examples:: Some usage examples. + +Developer information: +* Unattended Usage:: Using @command{gpgsm} from other programs. +* GPGSM Protocol:: The protocol the server mode uses. +@end menu + +@c man begin COMMANDS + +@node GPGSM Commands +@section Commands + +Commands are not distinguished from options execpt for the fact that +only one one command is allowed. + +@menu +* General Commands:: Commands not specific to the functionality. +* Operational Commands:: Commands to select the type of operation. +* Certificate Management:: How to manage certificates. +@end menu + +@node General Commands +@subsection Commands not specific to the function + +@table @gnupgtabopt +@item --version +@opindex version +Print the program version and licensing information. Not that you can +abbreviate this command. + +@item --help, -h +@opindex help +Print a usage message summarizing the most usefule command-line options. +Not that you can abbreviate this command. + +@item --dump-options +@opindex dump-options +Print a list of all available options and commands. Not that you can +abbreviate this command. +@end table + + + +@node Operational Commands +@subsection Commands to select the type of operation + +@table @gnupgtabopt +@item --encrypt +@opindex encrypt +Perform an encryption. + +@item --decrypt +@opindex decrypt +Perform a decryption; the type of input is automatically detmerined. It +may either be in binary form or PEM encoded; automatic determination of +base-64 encoding is not done. + +@item --sign +@opindex sign +Create a digital signature. The key used is either the fist one found +in the keybox or thise set with the -u option + +@item --verify +@opindex verify +Check a signature file for validity. Depending on the arguments a +detached signatrue may also be checked. + +@item --server +@opindex server +Run in server mode and wait for commands on the @code{stdin}. + +@item --call-dirmngr @var{command} [@var{args}] +@opindex call-dirmngr +Behave as a Dirmngr client issuing the request @var{command} with the +optional list of @var{args}. The output of the Dirmngr is printed +stdout. Please note that file names given as arguments should have an +absulte file name (i.e. commencing with @code{/} because they are +passed verbatim to the Dirmngr and the working directory of the +Dirmngr might not be the same as the one of this client. Currently it +is not possible to pass data via stdin to the Dirmngr. @var{command} +should not contain spaces. + +This is command is required for certain maintaining tasks of the dirmngr +where a dirmngr must be able to call back to @command{gpgsm}. See the Dirmngr +manual for details. + +@item --call-protect-tool @var{arguments} +@opindex call-protect-tool +Certain maintenance operations are done by an external program call +@command{gpg-protect-tool}; this is usually not installed in a directory +listed in the PATH variable. This command provides a simple wrapper to +access this tool. @var{arguments} are passed verbatim to this command; +use @samp{--help} to get a list of supported operations. + + +@end table + + +@node Certificate Management +@subsection How to manage the certificate and keys + +@table @gnupgtabopt +@item --gen-key +@opindex gen-key +Generate a new key and a certificate request. + +@item --list-keys +@itemx -k +@opindex list-keys +List all available certificates stored in the local key database. +Note that the displayed data might be reformatted for better human +readability and illegal characters are replaced by safe substitutes. + +@item --list-secret-keys +@itemx -K +@opindex list-secret-keys +List all available certificates for which a corresponding a secret key +is available. + +@item --list-external-keys @var{pattern} +@opindex list-keys +List certificates matching @var{pattern} using an external server. This +utilizes the @code{dirmngr} service. + +@item --dump-keys +@opindex dump-keys +List all available certificates stored in the local key database using a +format useful mainly for debugging. + +@item --dump-secret-keys +@opindex dump-secret-keys +List all available certificates for which a corresponding a secret key +is available using a format useful mainly for debugging. + +@item --dump-external-keys @var{pattern} +@opindex dump-external-keys +List certificates matching @var{pattern} using an external server. +This utilizes the @code{dirmngr} service. It uses a format useful +mainly for debugging. + +@item --keydb-clear-some-cert-flags +@opindex keydb-clear-some-cert-flags +This is a debugging aid to reset certain flags in the key database +which are used to cache certain certificate stati. It is especially +useful if a bad CRL or a weird running OCSP reponder did accidently +revoke certificate. There is no security issue with this command +because @command{gpgsm} always make sure that the validity of a certificate is +checked right before it is used. + +@item --delete-keys @var{pattern} +@opindex delete-keys +Delete the keys matching @var{pattern}. + +@item --export [@var{pattern}] +@opindex export +Export all certificates stored in the Keybox or those specified by the +optional @var{pattern}. When using along with the @code{--armor} option +a few informational lines are prepended before each block. + +@item --export-secret-key-p12 @var{key-id} +@opindex export +Export the private key and the certificate identified by @var{key-id} +in a PKCS#12 format. When using along with the @code{--armor} option +a few informational lines are prepended to the output. Note, that the +PKCS#12 format is higly insecure and this command is only provided if +there is no other way to exchange the private key. + +@item --import [@var{files}] +@opindex import +Import the certificates from the PEM or binary encoded files as well as +from signed-only messages. This command may also be used to import a +secret key from a PKCS#12 file. + +@item --learn-card +@opindex learn-card +Read information about the private keys from the smartcard and import +the certificates from there. This command utilizes the @sc{gpg-agent} +and in turn the @sc{scdaemon}. + +@item --passwd @var{user_id} +@opindex passwd +Change the passphrase of the private key belonging to the certificate +specified as @var{user_id}. Note, that changing the passphrase/PIN of a +smartcard is not yet supported. + +@end table + + +@node GPGSM Options +@section Option Summary + +@command{GPGSM} comes features a bunch ofoptions to control the exact behaviour +and to change the default configuration. + +@menu +* Configuration Options:: How to change the configuration. +* Certificate Options:: Certificate related options. +* Input and Output:: Input and Output. +* CMS Options:: How to change how the CMS is created. +* Esoteric Options:: Doing things one usually don't want to do. +@end menu + +@c man begin OPTIONS + +@node 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 --options @var{file} +@opindex options +Reads configuration from @var{file} instead of from the default +per-user configuration file. The default configuration file is named +@file{gpgsm.conf} and expected in the @file{.gnupg} directory directly +below the home directory of the user. + +@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 +@var{HKCU\Software\GNU\GnuPG:HomeDir}. + + +@item -v +@item --verbose +@opindex v +@opindex verbose +Outputs additional information while running. +You can increase the verbosity by giving several +verbose commands to @command{gpgsm}, such as @samp{-vv}. + +@item --policy-file @var{filename} +@opindex policy-file +Change the default name of the policy file to @var{filename}. + +@item --agent-program @var{file} +@opindex agent-program +Specify an agent program to be used for secret key operations. The +default value is the @file{/usr/local/bin/gpg-agent}. This is only used +as a fallback when the envrionment variable @code{GPG_AGENT_INFO} is not +set or a running agent can't be connected. + +@item --dirmngr-program @var{file} +@opindex dirmnr-program +Specify a dirmngr program to be used for @acronym{CRL} checks. The +default value is @file{/usr/sbin/dirmngr}. This is only used as a +fallback when the environment variable @code{DIRMNGR_INFO} is not set or +a running dirmngr can't be connected. + +@item --prefer-system-dirmngr +@opindex prefer-system-dirmngr +If a system wide @command{dirmngr} is running in daemon mode, first try +to connect to this one. Fallback to a pipe based server if this does +not work. + +@item --no-secmem-warning +@opindex no-secmem-warning +Don't print a warning when the so called "secure memory" can't be used. + +@item --log-file @var{file} +@opindex log-file +When running in server mode, append all logging output to @var{file}. + +@end table + + +@node Certificate Options +@subsection Certificate related options + +@table @gnupgtabopt + +@item --enable-policy-checks +@itemx --disable-policy-checks +@opindex enable-policy-checks +@opindex disable-policy-checks +By default policy checks are enabled. These options may be used to +change it. + +@item --enable-crl-checks +@itemx --disable-crl-checks +@opindex enable-crl-checks +@opindex disable-crl-checks +By default the @acronym{CRL} checks are enabled and the DirMngr is used +to check for revoked certificates. The disable option is most useful +with an off-line network connection to suppress this check. + +@item --enable-trusted-cert-crl-check +@itemx --disable-trusted-cert-crl-check +@opindex enable-trusted-cert-crl-check +@opindex disable-trusted-cert-crl-check +By default the @acronym{CRL} for trusted root certificates are checked +like for any other certificates. This allows a CA to revoke its own +certificates voluntary without the need of putting all ever issued +certificates into a CRL. The disable option may be used to switch this +extra check off. Due to the caching done by the Dirmngr, there won't be +any noticeable performance gain. Note, that this also disables possible +OCSP checks for trusted root certificates. + +@item --force-crl-refresh +@opindex force-crl-refresh +Tell the dirmngr to reload the CRL for each request. For better +performance, the dirmngr will actually optimize this by suppressing +the loading for short time intervalls (e.g. 30 minutes). This option +is useful to make sure that a fresh CRL is available for certificates +hold in the keybox. The suggested way of doing this is by using it +along with the option @option{--with-validation} for a ke listing +command. This option should not be used in a configuration file. + +@item --enable-ocsp +@itemx --disable-ocsp +@opindex enable-ocsp +@opindex disable-ocsp +Be default @acronym{OCSP} checks are disabled. The enable opton may +be used to enable OCSP checks via Dirmngr. If @acronym{CRL} checks +are also enabled, CRLs will be used as a fallback if for some reason an +OCSP request won't succeed. Note, that you have to allow OCSP +requests in Dirmngr's configuration too (option +@option{--allow-ocsp} and configure dirmngr properly. If you don't do +so you will get the error code @samp{Not supported}. + +@end table + +@node Input and Output +@subsection Input and Output + +@table @gnupgtabopt +@item --armor +@itemx -a +@opindex armor +@opindex -a +Create PEM encoded output. Default is binary output. + +@item --base64 +@opindex base64 +Create Base-64 encoded output; i.e. PEM without the header lines. + +@item --assume-armor +@opindex assume-armor +Assume the input data is PEM encoded. Default is to autodetect the +encoding but this is may fail. + +@item --assume-base64 +@opindex assume-base64 +Assume the input data is plain base-64 encoded. + +@item --assume-binary +@opindex assume-binary +Assume the input data is binary encoded. + +@item --local-user @var{user_id} +@item -u @var{user_id} +@opindex local-user +@opindex -u +Set the user(s) to be used for signing. The default is the first +secret key found in the database. + +@item --with-key-data +@opindex with-key-data +Displays extra information with the @code{--list-keys} commands. Especially +a line tagged @code{grp} is printed which tells you the keygrip of a +key. This string is for example used as the file name of the +secret key. + +@item --with-validation +@opindex with-validation +When doing a key listing, do a full validation check for each key and +print the result. This is usually a slow operation because it +requires a CRL lookup and other operations. + +When used along with --import, a validation of the certificate to +import is done and only imported if it succeeds the test. Note that +this does not affect an already available cwertificate in the DB. +This option is therefore useful to simply verify a certificate. + + +@item --with-md5-fingerprint +For standard key listings, also print the MD5 fingerprint of the +certificate. + +@end table + +@node CMS Options +@subsection How to change how the CMS is created. + +@table @gnupgtabopt +@item --include-certs @var{n} +Using @var{n} of -2 includes all certificate except for the root cert, +-1 includes all certs, 0 does not include any certs, 1 includes only +the signers cert (this is the default) and all other positive +values include up to @var{n} certificates starting with the signer cert. + +@end table + + + +@node Esoteric Options +@subsection Doing things one usually don't want to do. + + +@table @gnupgtabopt + +@item --faked-system-time @var{epoch} +@opindex faked-system-time +This option is only useful for testing; it sets the system time back or +forth to @var{epoch} which is the number of seconds elapsed since the year +1970. + +@item --with-ephemeral-keys +@opindex with-ephemeral-keys +Include ephemeral flagged keys in the output of key listings. + +@item --debug-level @var{level} +@opindex debug-level +Select the debug level for investigating problems. @var{level} may be +one of: + + @table @code + @item none + no debugging at all. + @item basic + some basic debug messages + @item advanced + more verbose debug messages + @item expert + even more detailed messages + @item guru + all of the debug messages you can get + @end table + +How these messages are mapped to the actual debugging flags is not +specified and may change with newer releaes of this program. They are +however carefully selected to best aid in debugging. + +@item --debug @var{flags} +@opindex debug +This option is only useful for debugging and the behaviour may change +at any time without notice; using @code{--debug-levels} is the +preferred method to select the debug verbosity. FLAGS are bit encoded +and may be given in usual C-Syntax. The currently defined bits are: + + @table @code + @item 0 (1) + X.509 or OpenPGP protocol related data + @item 1 (2) + values of big number integers + @item 2 (4) + low level crypto operations + @item 5 (32) + memory allocation + @item 6 (64) + caching + @item 7 (128) + show memory statistics. + @item 9 (512) + write hashed data to files named @code{dbgmd-000*} + @item 10 (1024) + trace Assuan protocol + @end table + +Note, that all flags set using this option may get overriden by +@code{--debug-level}. + +@item --debug-all +@opindex debug-all +Same as @code{--debug=0xffffffff} + +@item --debug-allow-core-dump +@opindex debug-allow-core-dump +Usually @command{gpgsm} tries to avoid dumping core by well written code and by +disabling core dumps for security reasons. However, bugs are pretty +durable beasts and to squash them it is sometimes useful to have a core +dump. This option enables core dumps unless the Bad Thing happened +before the option parsing. + +@item --debug-no-chain-validation +@opindex debug-no-chain-validation +This is actually not a debugging option but only useful as such. It +lets @command{gpgsm} bypass all certificate chain validation checks. + +@item --debug-ignore-expiration +@opindex debug-ignore-expiration +This is actually not a debugging option but only useful as such. It +lets @command{gpgsm} ignore all notAfter dates, this is used by the regresssion +tests. + +@item --fixed-passphrase @var{string} +@opindex fixed-passphrase +Supply the passphrase @var{string} to the gpg-protect-tool. This +option is only useful for the regression tests included with this +package and may be revised or removed at any time without notice. + +@end table + +All the long options may also be given in the configuration file after +stripping off the two leading dashes. + + +@c man begin FILES + +@node GPGSM Configuration +@section Configuration files + +There are a few configuration files to control certain aspects of +@command{gpgsm}'s operation. Unless noted, they are expected in the +current home directory (@pxref{option --homedir}). + +@table @file + +@item gpgsm.conf +@cindex gpgsm.conf +This is the standard configuration file read by @command{gpgsm} 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}). + +@item policies.txt +@cindex policies.txt +This is a list of allowed CA policies. This file should list the +object identifiers of the policies line by line. Empty lines and +lines starting with a hash mark are ignored. Policies missing in this +file and not marked as critical in the certificate will print only a +warning; certificates with policies marked as critical and not listed +in this file will fail the signature verification. + +For example, to allow only the policy 2.289.9.9, the file should look +like this: + +@example +# Allowed policies +2.289.9.9 +@end example + +@item qualified.txt +@cindex qualified.txt +This is the list of root certificates used for qualified certificates. +They are defined as certificates capable of creating legally binding +signatures in the same way as handwritten signatures are. Comments +start with a hash mark and empty lines are ignored. Lines do have a +length limit but this is not a serious limitation as the format of the +entries is fixed and checked by gpgsm: A non-comment line starts with +optional white spaces, followed by exactly 40 hex character, white space +and a lowercased 2 letter country code. Additional data delimited with +by a white space is current ignored but might late be used for other +purposes. + +Note that even if a certificate is listed in this file, this does not +mean that thecertificate is trusted; in general the certificates listed +in this file need to be listed also in @file{trustlist.txt}. + +This is a global file an installed in the data directory +(e.g. @file{/usr/share/gnupg/qualified.txt}). GnuPG installs a suitable +file with root certificates as used in Germany. As new Root-CA +certificates may be issued over time, these entries may need to be +updated; new distributions of this software should come with an updated +list but it is still the responsibility of the Administrator to check +that this list is correct. + +Everytime @command{gpgsm} uses a certificate for signing or verification +this file will be consulted to check whether the certificate under +question has ultimately been issued by one of these CAs. If this is the +case the user will be informed that the verified signature represents a +legally binding (``qualified'') signature. When creating a signature +using such a certificate an extra prompt will be issued to let the user +confirm that such a legally binding signature shall really be created. + +Because this software has not yet been approved for use with such +certificates, appropriate notices will be shown to indicate this fact. + +@end table + +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. For existing users the a small +helper script is provided to create these files (@pxref{addgnupghome}). + + +For internal purposes gpgsm creates and maintaines a few other files; +They all live in in the current home directory (@pxref{option +--homedir}). Only @command{gpgsm} may modify these files. + +@table @file +@item pubring.kbx +@cindex pubring.kbx +This a database file storing the certificates as well as meta +information. For debugging purposes the tool @command{kbxutil} may be +used to show the internal structure of this file. + +@item random_seed +@cindex random_seed +This content of this file is used to maintain the internal state of the +random number generator accross invocations. The same file is used by +other programs of this software too. + +@end table + + +@c +@c Examples +@c +@node GPGSM Examples +@section Examples + +@c man begin EXAMPLES + +@example +$ gpgsm -er goo@@bar.net

ciphertext +@end example + +@c man end + + + +@c --------------------------------- +@c The machine interface +@c -------------------------------- +@node Unattended Usage +@section Unattended Usage + +@command{gpgsm} is often used as a backend engine by other software. To help +with this a machine interface has been defined to have an unambiguous +way to do this. This is most likely used with the @code{--server} command +but may also be used in the standard operation mode by using the +@code{--status-fd} option. + +@menu +* Automated signature checking:: Automated signature checking. +@end menu + +@node Automated signature checking,,,Unattended Usage +@section Automated signature checking + +It is very important to understand the semantics used with signature +verification. Checking a signature is not as simple as it may sound and +so the ooperation si a bit complicated. In mosted cases it is required +to look at several status lines. Here is a table of all cases a signed +message may have: + +@table @asis +@item The signature is valid +This does mean that the signature has been successfully verified, the +certificates are all sane. However there are two subcases with +important information: One of the certificates may have expired or a +signature of a message itself as expired. It is a sound practise to +consider such a signature still as valid but additional information +should be displayed. Depending on the subcase @command{gpgsm} will issue +these status codes: + @table @asis + @item signature valid and nothing did expire + @code{GOODSIG}, @code{VALIDSIG}, @code{TRUST_FULLY} + @item signature valid but at least one certificate has expired + @code{EXPKEYSIG}, @code{VALIDSIG}, @code{TRUST_FULLY} + @item signature valid but expired + @code{EXPSIG}, @code{VALIDSIG}, @code{TRUST_FULLY} + Note, that this case is currently not implemented. + @end table + +@item The signature is invalid +This means that the signature verification failed (this is an indication +of af a transfer error, a programm error or tampering with the message). +@command{gpgsm} issues one of these status codes sequences: + @table @code + @item @code{BADSIG} + @item @code{GOODSIG}, @code{VALIDSIG} @code{TRUST_NEVER} + @end table + +@item Error verifying a signature +For some reason the signature could not be verified, i.e. it can't be +decided whether the signature is valid or invalid. A common reason for +this is a missing certificate. + +@end table + + +@c +@c Assuan Protocol +@c +@node GPGSM Protocol +@section The Protocol the Server Mode Uses. + +Description of the protocol used to access @command{GPGSM}. +@command{GPGSM} does implement the Assuan protocol and in addition +provides a regular command line interface which exhibits a full client +to this protocol (but uses internal linking). To start +@command{gpgsm} as a server the command line the option +@code{--server} must be used. Additional options are provided to +select the communication method (i.e. the name of the socket). + +We assume that the connection has already been established; see the +Assuan manual for details. + +@menu +* GPGSM ENCRYPT:: Encrypting a message. +* GPGSM DECRYPT:: Decrypting a message. +* GPGSM SIGN:: Signing a message. +* GPGSM VERIFY:: Verifying a message. +* GPGSM GENKEY:: Generating a key. +* GPGSM LISTKEYS:: List available keys. +* GPGSM EXPORT:: Export certificates. +* GPGSM IMPORT:: Import certificates. +* GPGSM DELETE:: Delete certificates. +@end menu + + +@node GPGSM ENCRYPT +@subsection Encrypting a Message + +Before encrytion can be done the recipient must be set using the +command: + +@example + RECIPIENT @var{userID} +@end example + +Set the recipient for the encryption. @var{userID} should be the +internal representation of the key; the server may accept any other way +of specification. If this is a valid and trusted recipient the server +does respond with OK, otherwise the return is an ERR with the reason why +the recipient can't be used, the encryption will then not be done for +this recipient. If the policy is not to encrypt at all if not all +recipients are valid, the client has to take care of this. All +@code{RECIPIENT} commands are cumulative until a @code{RESET} or an +successful @code{ENCRYPT} command. + +@example + INPUT FD=@var{n} [--armor|--base64|--binary] +@end example + +Set the file descriptor for the message to be encrypted to @var{n}. +Obviously the pipe must be open at that point, the server establishes +its own end. If the server returns an error the client should consider +this session failed. + +The @code{--armor} option may be used to advice the server that the +input data is in @acronym{PEM} format, @code{--base64} advices that a +raw base-64 encoding is used, @code{--binary} advices of raw binary +input (@acronym{BER}). If none of these options is used, the server +tries to figure out the used encoding, but this may not always be +correct. + +@example + OUTPUT FD=@var{n} [--armor|--base64] +@end example + +Set the file descriptor to be used for the output (i.e. the encrypted +message). Obviously the pipe must be open at that point, the server +establishes its own end. If the server returns an error he client +should consider this session failed. + +The option armor encodes the output in @acronym{PEM} format, the +@code{--base64} option applies just a base 64 encoding. No option +creates binary output (@acronym{BER}). + +The actual encryption is done using the command + +@example + ENCRYPT +@end example + +It takes the plaintext from the @code{INPUT} command, writes to the +ciphertext to the file descriptor set with the @code{OUTPUT} command, +take the recipients from all the recipients set so far. If this command +fails the clients should try to delete all output currently done or +otherwise mark it as invalid. @command{GPGSM} does ensure that there won't be any +security problem with leftover data on the output in this case. + +This command should in general not fail, as all necessary checks have +been done while setting the recipients. The input and output pipes are +closed. + + +@node GPGSM DECRYPT +@subsection Decrypting a message + +Input and output FDs are set the same way as in encryption, but +@code{INPUT} refers to the ciphertext and output to the plaintext. There +is no need to set recipients. @command{GPGSM} automatically strips any +@acronym{S/MIME} headers from the input, so it is valid to pass an +entire MIME part to the INPUT pipe. + +The encryption is done by using the command + +@example + DECRYPT +@end example + +It performs the decrypt operation after doing some check on the internal +state. (e.g. that all needed data has been set). Because it utilizes +the GPG-Agent for the session key decryption, there is no need to ask +the client for a protecting passphrase - GpgAgent takes care of this by +requesting this from the user. + + +@node GPGSM SIGN +@subsection Signing a Message + +Signing is usually done with these commands: + +@example + INPUT FD=@var{n} [--armor|--base64|--binary] +@end example + +This tells @command{GPGSM} to read the data to sign from file descriptor @var{n}. + +@example + OUTPUT FD=@var{m} [--armor|--base64] +@end example + +Write the output to file descriptor @var{m}. If a detached signature is +requested, only the signature is written. + +@example + SIGN [--detached] +@end example + +Sign the data set with the INPUT command and write it to the sink set by +OUTPUT. With @code{--detached}, a detached signature is created +(surprise). + +The key used for signining is the default one or the one specified in +the configuration file. To get finer control over the keys, it is +possible to use the command + +@example + SIGNER @var{userID} +@end example + +to the signer's key. @var{userID} should be the +internal representation of the key; the server may accept any other way +of specification. If this is a valid and trusted recipient the server +does respond with OK, otherwise the return is an ERR with the reason why +the key can't be used, the signature will then not be created using +this key. If the policy is not to sign at all if not all +keys are valid, the client has to take care of this. All +@code{SIGNER} commands are cumulative until a @code{RESET} is done. +Note that a @code{SIGN} does not reset this list of signers which is in +contrats to the @code{RECIPIENT} command. + + +@node GPGSM VERIFY +@subsection Verifying a Message + +To verify a mesage the command: + +@example + VERIFY +@end example + +is used. It does a verify operation on the message send to the input FD. +The result is written out using status lines. If an output FD was +given, the signed text will be written to that. If the signature is a +detached one, the server will inquire about the signed material and the +client must provide it. + +@node GPGSM GENKEY +@subsection Generating a Key + +This is used to generate a new keypair, store the secret part in the +@acronym{PSE} and the public key in the key database. We will probably +add optional commands to allow the client to select whether a hardware +token is used to store the key. Configuration options to +@command{GPGSM} can be used to restrict the use of this command. + +@example + GENKEY +@end example + +@command{GPGSM} checks whether this command is allowed and then does an +INQUIRY to get the key parameters, the client should then send the +key parameters in the native format: + +@example + S: INQUIRE KEY_PARAM native + C: D foo:fgfgfg + C: D bar + C: END +@end example + +Please note that the server may send Status info lines while reading the +data lines from the client. After this the key generation takes place +and the server eventually does send an ERR or OK response. Status lines +may be issued as a progress indicator. + + +@node GPGSM LISTKEYS +@subsection List available keys + +To list the keys in the internal database or using an external key +provider, the command: + +@example + LISTKEYS @var{pattern} +@end example + +is used. To allow multiple patterns (which are ORed during the search) +quoting is required: Spaces are to be translated into "+" or into "%20"; +in turn this requires that the usual escape quoting rules are done. + +@example + LISTSECRETKEYS @var{pattern} +@end example + +Lists only the keys where a secret key is available. + +The list commands commands are affected by the option + +@example + OPTION list-mode=@var{mode} +@end example + +where mode may be: +@table @code +@item 0 +Use default (which is usually the same as 1). +@item 1 +List only the internal keys. +@item 2 +List only the external keys. +@item 3 +List internal and external keys. +@end table + +Note that options are valid for the entire session. + + +@node GPGSM EXPORT +@subsection Export certificates + +To export certificate from the internal key database the command: + +@example + EXPORT @var{pattern} +@end example + +is used. To allow multiple patterns (which are ORed) quoting is +required: Spaces are to be translated into "+" or into "%20"; in turn +this requires that the usual escape quoting rules are done. + +The format of the output depends on what was set with the OUTPUT +command. When using @acronym{PEM} encoding a few informational lines +are prepended. + + +@node GPGSM IMPORT +@subsection Import certificates + +To import certificates into the internal key database, the command + +@example + IMPORT +@end example + +is used. The data is expected on the file descriptor set with the +@code{INPUT} command. Certain checks are performend on the +certificate. Note that the code will also handle PKCS\#12 files and +import private keys; a helper program is used for that. + + +@node GPGSM DELETE +@subsection Delete certificates + +To delete certificate the command + +@example + DELKEYS @var{pattern} +@end example + +is used. To allow multiple patterns (which are ORed) quoting is +required: Spaces are to be translated into "+" or into "%20"; in turn +this requires that the usual escape quoting rules are done. + +The certificates must be specified unambiguously otherwise an error is +returned. + diff --git a/doc/gpgv.sgml b/doc/gpgv.sgml deleted file mode 100644 index ee16d0e94..000000000 --- a/doc/gpgv.sgml +++ /dev/null @@ -1,225 +0,0 @@ -<!-- gpgv.sgml - the man page 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. ---> -<!-- 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 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>"> -]> - -<refentry id="gpgv"> -<refmeta> - <refentrytitle>gpgv</refentrytitle> - <manvolnum>1</manvolnum> - <refmiscinfo class="gnu">GNU Tools</refmiscinfo> -</refmeta> -<refnamediv> - <refname/gpgv/ - <refpurpose>signature verification tool</> -</refnamediv> -<refsynopsisdiv> - <synopsis> -<command>gpgv</command> - <optional><parameter/options/</optional> - <optional><parameter/signed files/</optional> - </synopsis> -</refsynopsisdiv> - -<refsect1> - <title>DESCRIPTION</title> - <para> -<command/gpgv/ is the OpenPGP signature checking tool. - </para> - <para> -This program is a stripped down version of <command/gpg/ which is able -only -to check signatures. It is somewhat smaller than the fully blown -<command/gpg/ and uses a different (and simpler) way to check that -the public keys used to make the signature are trustworthy. There are -no options files and only very few options are implemented. -</para> -<para> -<command/gpgv/ assumes that all keys in the keyring are trustworthy. -By default it uses a keyring named <filename/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. -</para> -</refsect1> - -<refsect1> -<title>OPTIONS</title> -<para> -<command/gpgv/ recognizes these options: -</para> - -<variablelist> - - -<varlistentry> -<term>-v, --verbose</term> -<listitem><para> -Gives more information during processing. If used -twice, the input data is listed in detail. -</para></listitem></varlistentry> - - -<varlistentry> -<term>-q, --quiet</term> -<listitem><para> -Try to be as quiet as possible. -</para></listitem></varlistentry> - - -<varlistentry> -<term>--keyring &ParmFile;</term> -<listitem><para> -Add &ParmFile to the list of keyrings. -If &ParmFile 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). -The filename may be prefixed with a scheme:</para> -<para>"gnupg-ring:" is the default one.</para> -</listitem></varlistentry> - - -<varlistentry> -<term>--homedir &ParmDir;</term> -<listitem><para> -Set the name of the home directory to &ParmDir; If this -option is not used, it defaults to "~/.gnupg". It does -not make sense to use this in an options file. This -also overrides the environment variable "GNUPGHOME". -</para></listitem></varlistentry> - - -<varlistentry> -<term>--status-fd &ParmN;</term> -<listitem><para> -Write special status strings to the file descriptor &ParmN;. -See the file DETAILS in the documentation for a listing of them. -</para></listitem></varlistentry> - - -<varlistentry> -<term>--logger-fd &ParmN;</term> -<listitem><para> -Write log output to file descriptor &ParmN; and not to stderr. -</para></listitem></varlistentry> - - -<varlistentry> -<term>--ignore-time-conflict</term> -<listitem><para> -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 warnings. -</para></listitem></varlistentry> - - -</variablelist> -</refsect1> - - -<refsect1> - <title>RETURN VALUE</title> - <para> -The program returns 0 if everything was fine, 1 if at least -one signature was bad, and other error codes for fatal errors. - </para> -</refsect1> - -<refsect1> - <title>EXAMPLES</title> - <variablelist> - -<varlistentry> -<term>gpgv <parameter/pgpfile/</term> -<term>gpgv <parameter/sigfile/ &OptParmFiles;</term> -<listitem><para> -Verify the signature of the file. The second form -is used for detached signatures, where <parameter/sigfile/ is the detached -signature (either ASCII armored or binary) and &OptParmFiles 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 -<parameter/sigfile/. -</para></listitem></varlistentry> - - </variablelist> -</refsect1> - - -<refsect1> - <title>ENVIRONMENT</title> - - <variablelist> -<varlistentry> -<term>HOME</term> -<listitem><para>Used to locate the default home directory.</para></listitem> -</varlistentry> -<varlistentry> -<term>GNUPGHOME</term> -<listitem><para>If set directory used instead of "~/.gnupg".</para></listitem> -</varlistentry> - - </variablelist> - -</refsect1> - -<refsect1> - <title>FILES</title> - <variablelist> - -<varlistentry> -<term>~/.gnupg/trustedkeys.gpg</term> -<listitem><para>The default keyring with the allowed keys</para></listitem> -</varlistentry> - - </variablelist> -</refsect1> - -<!-- SEE ALSO not yet needed--> - -</refentry> - diff --git a/doc/gpgv.texi b/doc/gpgv.texi deleted file mode 100644 index 2985a5dbb..000000000 --- a/doc/gpgv.texi +++ /dev/null @@ -1,114 +0,0 @@ -\input texinfo -@setfilename gpgv.info -@dircategory GnuPG -@direntry -* gpgv: (gpgv). GnuPG signature verification tool. -@end direntry - -@node Top, , , (dir) -@top gpgv -@chapheading Name - -gpgv --- signature verification tool -@chapheading Synopsis - -@example -gpgv - options - signed files - -@end example -@chapheading DESCRIPTION - -@code{gpgv} is the OpenPGP signature checking tool. - -This program is a stripped down version of @code{gpg} which is able -only -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 trustworthy. There are -no options files and only very few options are implemented. - -@code{gpgv} 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. -@chapheading OPTIONS - -@code{gpgv} recognizes these options: - -@table @asis - -@item -v, --verbose -Gives more information during processing. If used -twice, the input data is listed in detail. - -@item -q, --quiet -Try to be as quiet as possible. - -@item --keyring @code{file} -Add @code{file} to the 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 -home-directory ("~/.gnupg" if --homedir is not used). -The filename may be prefixed with a scheme: - -"gnupg-ring:" is the default one. - -@item --homedir @code{directory} -Set the name of the home directory to @code{directory} If this -option is not used, it defaults to "~/.gnupg". It does -not make sense to use this in an options file. This -also overrides the environment variable "GNUPGHOME". - -@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 --logger-fd @code{n} -Write log output to file descriptor @code{n} and not to stderr. - -@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 warnings. -@end table -@chapheading 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. -@chapheading EXAMPLES - -@table @asis - -@item gpgv @code{pgpfile} -@itemx gpgv @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 -@chapheading ENVIRONMENT - -@table @asis - -@item HOME -Used to locate the default home directory. - -@item GNUPGHOME -If set directory used instead of "~/.gnupg". -@end table -@chapheading FILES - -@table @asis - -@item ~/.gnupg/trustedkeys.gpg -The default keyring with the allowed keys -@end table - -@bye diff --git a/doc/gph/ChangeLog b/doc/gph/ChangeLog deleted file mode 100644 index 0d42fa163..000000000 --- a/doc/gph/ChangeLog +++ /dev/null @@ -1,9 +0,0 @@ -Tue Sep 7 16:18:03 1999 Werner Koch (wk@gnupg.org) - - * Makefile.am: Ugly workarounds to do a VPATH build. - -Fri Sep 3 13:24:45 1999 Werner Koch (wk@gnupg.org) - - * Makefile.am: New - - diff --git a/doc/gph/Makefile.am b/doc/gph/Makefile.am deleted file mode 100644 index d36b0013a..000000000 --- a/doc/gph/Makefile.am +++ /dev/null @@ -1,54 +0,0 @@ -# GPH - GNU Privacy Handbook - -PARTS = manual.sgml c1.sgml c2.sgml c3.sgml c4.sgml c5.sgml c6.sgml c7.sgml \ - signatures.fig signatures.jpg.asc - -EXTRA_DIST = $(PARTS) index.html -#BUILT_SOURCES = index.html - -all-local: ./signatures.jpg - -./signatures.jpg: $(srcdir)/signatures.jpg.asc - ../../g10/gpg --yes --dearmor \ - -o ./signatures.jpg $(srcdir)/signatures.jpg.asc - -test -d manual && cp ./signatures.jpg ./manual/signatures.jpg - - -index.html: $(PARTS) - @set -e; \ - for i in $(PARTS); do \ - [ -f $$i ] || cat /dev/null $(srcdir)/$$i >./$$i ; \ - done - db2html manual.sgml - echo '<html><body>' >index.html - echo '<ul>' >>index.html - echo '<li><a href="manual/book1.html">GnuPG User Manual</a>' >>index.html - echo '</ul>' >>index.html - echo '</body></html>' >>index.html - -rm -r manual.junk - -rm manual/signatures.jpg -## (cd manual; rm -r stylesheet-images; ls | grep -v distfiles >distfiles) - - -dist-hook: index.html - - -%.dvi: %.sgml - db2dvi $< - -%.ps: %.dvi - dvips -o $@ $< - -%/%.html: %.sgml - db2html $< - - -%.png: %.fig - fig2dev -L png $< $@ - -%.jpg: %.fig - fig2dev -L jpeg $< $@ - -%.eps: %.fig - fig2dev -L ps $< $@ - diff --git a/doc/gph/c1.sgml b/doc/gph/c1.sgml deleted file mode 100644 index 2839f7c62..000000000 --- a/doc/gph/c1.sgml +++ /dev/null @@ -1,627 +0,0 @@ -<chapter id="intro" xreflabel="1"> -<docinfo> -<date> -$Id$ -</date> -</docinfo> -<title> -Getting Started -</title> - -<para> -&Gnupg; is a tool for secure communication. -This chapter is a quick-start guide that covers the core functionality -of &gnupg;. -This includes keypair creation, exchanging and verifying keys, encrypting -and decrypting documents, and making and verifying signatures. -It does not explain in detail the concepts behind public-key cryptography, -encryption, and digital signatures. -This is covered in Chapter <xref linkend="concepts">. -It also does not explain how to use &gnupg; wisely. -This is covered in Chapters <xref linkend="management"> and -<xref linkend="wise">. -</para> - -<para> -&Gnupg; uses public-key cryptography so that users may communicate securely. -In a public-key system, each user has a public/private keypair. -A user's private key is kept secret; it need never be revealed. -The public key may be given to anyone with whom the user wants to -communicate. -&Gnupg; uses a somewhat more sophisticated scheme in which a user has -a primary keypair and then zero or more additional subordinate keypairs. -The primary and subordinate keypairs are bundled to facilitate key -management and the bundle can often be considered simply as one keypair. -</para> - -<sect1> -<title> -Generating a new keypair -</title> - -<para> -The command-line option <link linkend="gen-key"><option>--gen-key</option></link> -is used to create a new primary keypair. - -<screen width="80"> -<prompt>alice%</prompt> <userinput>gpg --gen-key</userinput> -gpg (GnuPG) 0.9.4; Copyright (C) 1999 Free Software Foundation, Inc. -This program comes with ABSOLUTELY NO WARRANTY. -This is free software, and you are welcome to redistribute it -under certain conditions. See the file COPYING for details. - -Please select what kind of key you want: - (1) DSA and ElGamal (default) - (2) DSA (sign only) - (4) ElGamal (sign and encrypt) -Your selection? -</screen> - -<!-- -REWRITE -From Thomas Zander (zander@microweb.nl): -In GPG you can create 3 type of keypairs. A keypair is the combination -of a publ ic key and a private key, see chapter X. A DSA keypair can -only be used to sign a message. A ElGamal subordinate keypair can be -used for encryption as well as s igning, but is not as compatible with -former standards. - -Option 1 creates 2 keypairs; a DSA (signing) and a ElGamal (Encryption). -Option 2 creates a DSA keypair (Signing) -Option 4 creates a ElGemal keypair (Signing & Encryption). - -note: option 3 xxxx - -This doesn't quite work, but I agree the following paragraph is rough. ---> - -&Gnupg; is able to create several different types of keypairs, but a primary -key must be capable of making signatures. -There are therefore only three options. -Option 1 actually creates two keypairs. -A DSA keypair is the primary keypair usable only for making signatures. -An ElGamal subordinate keypair is also created for encryption. -Option 2 is similar but creates only a DSA keypair. -Option 4<footnote><para>Option 3 is to generate an ElGamal keypair that is -not usable for making signatures.</para></footnote> creates a single ElGamal -keypair usable for both making signatures and performing encryption. -In all cases it is possible to later add additional subkeys for encryption -and signing. -For most users the default option is fine. -</para> - -<para> -You must also choose a key size. -The size of a DSA key must be between 512 and 1024 bits, and an ElGamal -key may be of any size. -&Gnupg;, however, requires that keys be no smaller than 768 bits. -Therefore, if Option 1 was chosen and you choose a keysize larger than -1024 bits, the ElGamal key will have the requested size, but the DSA -key will be 1024 bits. - -<screen width="80"> -About to generate a new ELG-E keypair. - minimum keysize is 768 bits - default keysize is 1024 bits - highest suggested keysize is 2048 bits -What keysize do you want? (1024) -</screen> - -The longer the key the more secure it is against brute-force attacks, -but for almost all purposes the default keysize is adequate since -it would be cheaper to circumvent the encryption than try to break it. -Also, encryption and decryption will be slower as the -key size is increased, and a larger keysize may affect signature length. -Once selected, the keysize can never be changed. -</para> - -<para> -Finally, you must choose an expiration date. -If Option 1 was chosen, the expiration date will be used for both the -ElGamal and DSA keypairs. - -<screen width="80"> -Please specify how long the key should be valid. - 0 = key does not expire - &lt;n> = key expires in n days - &lt;n>w = key expires in n weeks - &lt;n>m = key expires in n months - &lt;n>y = key expires in n years -Key is valid for? (0) -</screen> - -For most users a key that does not expire is adequate. -The expiration time should be chosen with care, however, -since although it is possible to change the expiration date after the key -is created, it may be difficult to communicate a change -to users who have your public key. -</para> - -<para> -You must provide a user ID in addition to the key parameters. -The user ID is used to associate the key being created with a real -person. - -<screen width="80"> -You need a User-ID to identify your key; the software constructs the user id -from Real Name, Comment and Email Address in this form: - "Heinrich Heine (Der Dichter) &lt;heinrichh@duesseldorf.de>" - -Real name: -</screen> - -Only one user ID is created when a key is created, but it is possible -to create additional user IDs if you want to use the key in two or -more contexts, &eg;, as an employee at work and a political activist -on the side. -A user ID should be created carefully since it cannot be edited after -it is created. -</para> - -<para> -&Gnupg; needs a passphrase to protect the primary and subordinate -private keys that you keep in your possession. - -<screen width="80"> -You need a Passphrase to protect your private key. - -Enter passphrase: -</screen> - -There is no limit on the length of a passphrase, and it should be -carefully chosen. -From the perspective of security, the passphrase to unlock the private -key is one of the weakest points in &gnupg; (and other public-key -encryption systems as well) since it is the only protection you -have if another individual gets your private key. -Ideally, the passphrase should not use words from a dictionary and -should mix the case of alphabetic characters as well as use -non-alphabetic characters. -A good passphrase is crucial to the secure use of &gnupg;. -</para> - -<sect2 id="revocation"> -<title> -Generating a revocation certificate -</title> - -<para> -After your keypair is created you should immediately generate a revocation -certificate for the primary public key using the option -<link linkend="gen-revoke"><option>--gen-revoke</option></link>. -If you forget your passphrase or if your private key is compromised -or lost, this revocation certificate may be published to notify others -that the public key should no longer be used. -A revoked public key can still be used to verify signatures made -by you in the past, but it cannot be used to encrypt future messages -to you. -It also does not affect your ability to decrypt messages sent to -you in the past if you still do have access to the private key. - -<screen width="80"> -<prompt>alice%</prompt> <userinput>gpg --output revoke.asc --gen-revoke mykey</userinput> -[...] -</screen> - -The argument <userinput>mykey</userinput> must be a <emphasis>key -specifier</emphasis>, -either the key ID of your primary keypair or any part of a user ID -that identifies your keypair. -The generated certificate will be left in the file -<parameter>revoke.asc</parameter>. -If the <link linkend="output"><option>--output</option></link> option is -omitted, the result will be placed on standard output. -Since the certificate is short, you may wish to print a hardcopy of -the certificate to store somewhere safe such as your safe deposit box. -The certificate should not be stored where others can access it since -anybody can publish the revocation certificate and render the -corresponding public key useless. -</para> -</sect2> -</sect1> - -<sect1> -<title> -Exchanging keys -</title> - -<para> -To communicate with others you must exchange public keys. -To list the keys on your public keyring use the command-line -option <link linkend="list-keys"><option>--list-keys</option></link>. -</para> - -<screen width="80"> -<prompt>alice%</prompt> <userinput>gpg --list-keys</userinput> -/users/alice/.gnupg/pubring.gpg ---------------------------------------- -pub 1024D/BB7576AC 1999-06-04 Alice (Judge) &lt;alice@cyb.org> -sub 1024g/78E9A8FA 1999-06-04 -</screen> - -<sect2> -<title> -Exporting a public key -</title> - -<para> -To send your public key to a correspondent you must first export it. -The command-line option <link linkend="export"><option>--export</option></link> -is used to do this. -It takes an additional argument identifying the public key to export. -As with the <option>--gen-revoke</option> option, either the key ID or any part of -the user ID may be used to identify the key to export. -</para> - -<screen width="80"> -<prompt>alice%</prompt> <userinput>gpg --output alice.gpg --export alice@cyb.org</userinput> -</screen> - -<para> -The key is exported in a binary format, but this can be inconvenient -when the key is to be sent though email or published on a web page. -&Gnupg; therefore supports a command-line option -<link linkend="armor"><option>--armor</option></link><footnote> -<para>Many -command-line options that are frequently used can also be set in a -<link linkend="optionsfile">configuration file</link>. -</para> -</footnote> -that that -causes output to be generated in an ASCII-armored format similar to -uuencoded documents. -In general, any output from &gnupg;, &eg;, keys, encrypted documents, and -signatures, can be ASCII-armored by adding the <option>--armor</option> option. -</para> - -<screen width="80"> -<prompt>alice%</prompt> <userinput>gpg --armor --export alice@cyb.org</userinput> ------BEGIN PGP PUBLIC KEY BLOCK----- -Version: GnuPG v0.9.7 (GNU/Linux) -Comment: For info see http://www.gnupg.org - -[...] ------END PGP PUBLIC KEY BLOCK----- -</screen> -</sect2> - -<sect2> -<title> -Importing a public key -</title> - -<para> -A public key may be added to your public keyring with the -<link linkend="import"><option>--import</option></link> option. -</para> - -<screen width="80"> -<prompt>alice%</prompt> <userinput>gpg --import blake.gpg</userinput> -gpg: key 9E98BC16: public key imported -gpg: Total number processed: 1 -gpg: imported: 1 -<prompt>alice%</prompt> <userinput>gpg --list-keys</userinput> -/users/alice/.gnupg/pubring.gpg ---------------------------------------- -pub 1024D/BB7576AC 1999-06-04 Alice (Judge) &lt;alice@cyb.org> -sub 1024g/78E9A8FA 1999-06-04 - -pub 1024D/9E98BC16 1999-06-04 Blake (Executioner) &lt;blake@cyb.org> -sub 1024g/5C8CBD41 1999-06-04 -</screen> - -<para> -Once a key is imported it should be validated. -&Gnupg; uses a powerful and flexible trust model that does not require -you to personally validate each key you import. -Some keys may need to be personally validated, however. -A key is validated by verifying the key's fingerprint and then signing -the key to certify it as a valid key. -A key's fingerprint can be quickly viewed with the -<link linkend="fingerprint"><option>--fingerprint</option></link> -command-line option, but in order to certify the key you must edit it. - -<screen width="80"> -<prompt>alice%</prompt> <userinput>gpg --edit-key blake@cyb.org</userinput> - -pub 1024D/9E98BC16 created: 1999-06-04 expires: never trust: -/q -sub 1024g/5C8CBD41 created: 1999-06-04 expires: never -(1) Blake (Executioner) &lt;blake@cyb.org> - -<prompt>Command></prompt> <userinput>fpr</userinput> -pub 1024D/9E98BC16 1999-06-04 Blake (Executioner) &lt;blake@cyb.org> - Fingerprint: 268F 448F CCD7 AF34 183E 52D8 9BDE 1A08 9E98 BC16 -</screen> - -Key verification is a weak point in public-key cryptography, so you -must be sure that the fingerprint is correct. -The fingerprint displayed should be checked with the key's owner. -This may be done in person or over the phone or through any other means -as long as you can guarantee that you are communicating with the key's -true owner. -Once verified you may sign the key to validate it. -</para> - -<screen width="80"> -<prompt>Command></prompt> <userinput>sign</userinput> - -pub 1024D/9E98BC16 created: 1999-06-04 expires: never trust: -/q - Fingerprint: 268F 448F CCD7 AF34 183E 52D8 9BDE 1A08 9E98 BC16 - - Blake (Executioner) &lt;blake@cyb.org> - -Are you really sure that you want to sign this key -with your key: "Alice (Judge) &lt;alice@cyb.org>" - -Really sign? -</screen> - -<para> -Once signed you can check the key to list the signatures on it and -see the signature that you have added. -Every user ID on the key will have one or more self-signatures as well -as a signature for each user that has validated the key. -</para> - -<screen width="80"> -<prompt>Command></prompt> <userinput>check</userinput> -uid Blake (Executioner) &lt;blake@cyb.org> -sig! 9E98BC16 1999-06-04 [self-signature] -sig! BB7576AC 1999-06-04 Alice (Judge) &lt;alice@cyb.org> -</screen> -</sect2> -</sect1> - -<sect1> -<title> -Encrypting and decrypting documents -</title> - -<para> -To encrypt a document the option -<link linkend="encrypt"><option>--encrypt</option></link> is used. -You must have the public keys of the intended recipients. -The software expects the name of the document to encrypt as input or, if -omitted, on standard input. -The encrypted result is placed on standard output or as specified using -the option <option>--output</option>. -The document is compressed for additional security in addition to -encrypting it. - -<screen width="80"> -<prompt>alice%</prompt> <userinput>gpg --output doc.gpg --encrypt --recipient blake@cyb.org doc</userinput> -</screen> - -The <link linkend="recipient"><option>--recipient</option></link> option -is used once for each recipient and takes an extra argument specifying -the public key to which the document should be encrypted. -The encrypted document can only be decrypted by someone with a private -key that complements one of the recipients' public keys. -In particular, you cannot decrypt a document encrypted by you unless -you included your own public key in the recipient list. -</para> - -<para> -To decrypt a message the option -<link linkend="decrypt"><option>--decrypt</option></link> is used. -You need the private key to which the message was encrypted. -Similar to the encryption process, the document to decrypt is -input, and the decrypted result is output. -</para> - -<screen width="80"> -<prompt>blake%</prompt> <userinput>gpg --output doc --decrypt doc.gpg</userinput> - -You need a passphrase to unlock the secret key for -user: "Blake (Executioner) &lt;blake@cyb.org>" -1024-bit ELG-E key, ID 5C8CBD41, created 1999-06-04 (main key ID 9E98BC16) - -Enter passphrase: -</screen> - -<para> -Documents may also be encrypted without using public-key cryptography. -Instead, only a symmetric cipher is used to encrypt the document. -The key used to drive the symmetric cipher is derived from a passphrase -supplied when the document is encrypted, and for good security, it -should not be the same passphrase that you use to protect your private key. -Symmetric encryption is useful for securing documents when the -passphrase does not need to be communicated to others. -A document can be encrypted with a symmetric cipher by using the -<link linkend="symmetric"><option>--symmetric</option></link> option. -</para> - -<screen width="80"> -<prompt>alice%</prompt> <userinput>gpg --output doc.gpg --symmetric doc</userinput> -Enter passphrase: -</screen> -</sect1> - -<sect1> -<title> -Making and verifying signatures -</title> - -<para> -A digital signature certifies and timestamps a document. -If the document is subsequently modified in any way, a verification -of the signature will fail. -A digital signature can serve the same purpose as a hand-written signature -with the additional benefit of being tamper-resistant. -The &gnupg; source distribution, for example, is signed so that users can -verify that the source code has not been modified since it was packaged. -</para> - -<para> -Creating and verifying signatures uses the public/private keypair -in an operation different from encryption and decryption. -A signature is created using the private key of the signer. -The signature is verified using the corresponding public key. -A consequence is that it is difficult to deny that you made a digital -signature since that would imply your private key had been compromised. -</para> - -<para> -The command-line option <link linkend="sign"><option>--sign</option></link> is -used to make a digital signature. -The document to sign is input, and the signed document is output. - -<screen width="80"> -<prompt>alice%</prompt> <userinput>gpg --output doc.sig --sign doc</userinput> - -You need a passphrase to unlock the private key for -user: "Alice (Judge) &lt;alice@cyb.org>" -1024-bit DSA key, ID BB7576AC, created 1999-06-04 - -Enter passphrase: -</screen> - -The document is compressed before signed, and the output is in binary -format. -</para> - -<para> -Given a signed document, you can either check the signature or -check the signature and recover the original document. -To check the signature use the -<link linkend="verify"><option>--verify</option></link> option. -To verify the signature and extract the document use the -<option>--decrypt</option> -option. -The signed document to verify and recover is input and the recovered -document is output. -</para> - -<screen width="80"> -<prompt>blake%</prompt> <userinput>gpg --output doc --decrypt doc.sig</userinput> -gpg: Signature made Fri Jun 4 12:02:38 1999 CDT using DSA key ID BB7576AC -gpg: Good signature from "Alice (Judge) &lt;alice@cyb.org>" -</screen> - -<sect2> -<title> -Clearsigned documents -</title> - -<para> -A common use of digital signatures is to sign usenet postings or -email messages. -In such situations it is undesirable to compress the document while -signing it. -The option -<link linkend="clearsign"><option>--clearsign</option></link> -causes the document to be wrapped in an ASCII-armored signature but -otherwise does not modify the document. -</para> - -<screen width="80"> -<prompt>alice%</prompt> <userinput>gpg --clearsign doc</userinput> - -You need a passphrase to unlock the secret key for -user: "Alice (Judge) &lt;alice@cyb.org>" -1024-bit DSA key, ID BB7576AC, created 1999-06-04 - ------BEGIN PGP SIGNED MESSAGE----- -Hash: SHA1 - -[...] ------BEGIN PGP SIGNATURE----- -Version: GnuPG v0.9.7 (GNU/Linux) -Comment: For info see http://www.gnupg.org - -iEYEARECAAYFAjdYCQoACgkQJ9S6ULt1dqz6IwCfQ7wP6i/i8HhbcOSKF4ELyQB1 -oCoAoOuqpRqEzr4kOkQqHRLE/b8/Rw2k -=y6kj ------END PGP SIGNATURE----- -</screen> -</sect2> - -<sect2> -<title> -Detached signatures -</title> - -<para> -A signed document has limited usefulness. -Other users must recover the original document from the signed -version, and even with clearsigned documents, the signed document -must be edited to recover the original. -Therefore, there is a third method for signing a document that -creates a detached signature. -A detached signature is created using the -<link linkend="detach-sig"><option>--detach-sig</option></link> -option. -</para> - -<screen width="80"> -<prompt>alice%</prompt> <userinput>gpg --output doc.sig --detach-sig doc</userinput> - -You need a passphrase to unlock the secret key for -user: "Alice (Judge) &lt;alice@cyb.org>" -1024-bit DSA key, ID BB7576AC, created 1999-06-04 - -Enter passphrase: -</screen> - -<para> -Both the document and detached signature are needed to verify -the signature. -The <option>--verify</option> option can be to check the -signature. -</para> - -<screen width="80"> -<prompt>blake%</prompt> <userinput>gpg --verify doc.sig doc</userinput> -gpg: Signature made Fri Jun 4 12:38:46 1999 CDT using DSA key ID BB7576AC -gpg: Good signature from "Alice (Judge) &lt;alice@cyb.org>" -</screen> -</sect2> -</sect1> -</chapter> - -<!-- -In the "Getting Started" chapter, it would be interesting to provide -a checklist of assumptions that the reader can consult to determine -whether or not she fits the "most users" profile. Perhaps put this -at the end of the chapter (perhaps w/ forward pointer?). You could -include cross references for each item on the list. For example: - - 23. Your use of public key encryption has property X with attribute Y. - (see Section 3.4.1 for a more detailed discussion of other - attributes of property X) - -What prompted this was wondering, as I read through the generating keypair -section, "under what circumstances would these defaults be inappropriate?" - -The notion of using the same key with different user IDs "as an employee at -work and a political activist on the side" is interesting. Knowing one, -could you be traced to the other? (Are they separate numeric ids, and is -that enough?) (seems someone could just match the public keys) - -It's a very nice touch that you don't cover every single prompt that the -system throws at you, but instead treat them functionally. For example, -I can imagine other books going through the "Comment:" and "Email Address:" -prompts. ---> - -<!-- -"Key verification is a weak point in public-key cryptography ..." -Saying "weak point" makes it sound like a slam on public key stuff. -Although we've talked about weaknesses of the trust model, I'm guessing -the point here is that communication is only secure if you verify the -identity of the key's owner. - -Key verification can be done through any means "as long as you can -guarantee that you are communicating with the key's true owner". -I suspect we'd also like to prevent leaking information that an -interceptor could use to pose as us in a key verification step with -another party. I suppose the notion of bootstrapping may not be widely -appreciated as an analogy. - -I'm almost inclined to want to see a section in the Getting Started -guide called "Why you should read the rest of this book". Failing -that, or perhaps better yet, maybe it would work to have some margin -notes that point to other sections of the book for more information -("a discussion of trust models begins on p. 95"). ---> - diff --git a/doc/gph/c2.sgml b/doc/gph/c2.sgml deleted file mode 100644 index b045ed4ee..000000000 --- a/doc/gph/c2.sgml +++ /dev/null @@ -1,345 +0,0 @@ -<chapter id="concepts" xreflabel="2"> -<docinfo> -<date> -$Id$ -</date> -</docinfo> -<title> -Concepts -</title> - -<para> -&Gnupg; makes uses of several cryptographic concepts including -<firstterm>symmetric ciphers</firstterm>, -<firstterm>public-key ciphers</firstterm>, and -<firstterm>one-way hashing</firstterm>. -You can make basic use &gnupg; without fully understanding these concepts, -but in order to use it wisely some understanding of them is necessary. -</para> - -<para> -This chapter introduces the basic cryptographic concepts used in GnuPG. -Other books cover these topics in much more detail. -A good book with which to pursue further study is -<ulink url="http://www.counterpane.com/schneier.html">Bruce -Schneier</ulink>'s -<ulink url="http://www.counterpane.com/applied.html">"Applied -Cryptography"</ulink>. -</para> - -<sect1> -<title> -Symmetric ciphers -</title> - -<para> -A symmetric cipher is a cipher that uses the same key for both encryption -and decryption. -Two parties communicating using a symmetric cipher must agree on the -key beforehand. -Once they agree, the sender encrypts a message using the key, sends it -to the receiver, and the receiver decrypts the message using the key. -As an example, the German Enigma is a symmetric cipher, and daily keys -were distributed as code books. -Each day, a sending or receiving radio operator would consult his copy -of the code book to find the day's key. -Radio traffic for that day was then encrypted and decrypted using the -day's key. -Modern examples of symmetric ciphers include 3DES, Blowfish, and IDEA. -</para> - -<para> -A good cipher puts all the security in the key and none in the algorithm. -In other words, it should be no help to an attacker if he knows which -cipher is being used. -Only if he obtains the key would knowledge of the algorithm be needed. -The ciphers used in &gnupg; have this property. -</para> - -<para> -Since all the security is in the key, then it is important that it be -very difficult to guess the key. -In other words, the set of possible keys, &ie;, the <emphasis>key -space</emphasis>, needs -to be large. -While at Los Alamos, Richard Feynman was famous for his ability to -crack safes. -To encourage the mystique he even carried around a set of tools -including an old stethoscope. -In reality, he used a variety of tricks to reduce the number of -combinations he had to try to a small number and then simply guessed -until he found the right combination. -In other words, he reduced the size of the key space. -</para> - -<para> -Britain used machines to guess keys during World War 2. -The German Enigma had a very large key space, but the British built -speciailzed computing engines, the Bombes, to mechanically try -keys until the day's key was found. -This meant that sometimes they found the day's key within hours of -the new key's use, but it also meant that on some days they never -did find the right key. -The Bombes were not general-purpose computers but were precursors -to modern-day computers. -</para> - -<para> -Today, computers can guess keys very quickly, and this is why key -size is important in modern cryptosystems. -The cipher DES uses a 56-bit key, which means that there are -<!-- inlineequation --> -2<superscript>56</superscript> possible keys. -<!-- inlineequation --> -2<superscript>56</superscript> is 72,057,594,037,927,936 keys. -This is a lot of keys, but a general-purpose computer can check the -entire key space in a matter of days. -A specialized computer can check it in hours. -On the other hand, more recently designed ciphers such as 3DES, -Blowfish, and IDEA -<!-- inlineequation --> -all use 128-bit keys, which means there are 2<superscript>128</superscript> -possible keys. -This is many, many more keys, and even if all the computers on the -planet cooperated, it could still take more time than the age of -the universe to find the key. -</para> -</sect1> - -<sect1> -<title> -Public-key ciphers -</title> - -<para> -The primary problem with symmetric ciphers is not their security but -with key exchange. -Once the sender and receiver have exchanged keys, that key can be -used to securely communicate, but what secure communication channel -was used to communicate the key itself? -In particular, it would probably be much easier for an attacker to work -to intercept the key than it is to try all the keys in the key space. -Another problem is the number of keys needed. -<!-- inlineequation --> -If there are <emphasis>n</emphasis> people who need to communicate, then -<!-- inlineequation --> -<emphasis>n(n-1)/2</emphasis> keys -are needed for each pair of people to communicate privately. -This may be ok for a small number of people but quickly becomes unwieldly -for large groups of people. -</para> - -<para> -Public-key ciphers were invented to avoid the key-exchange problem -entirely. -A public-key cipher uses a pair of keys for sending messages. -The two keys belong to the person receiving the message. -One key is a <emphasis>public key</emphasis> and may be given to anybody. -The other key is a <emphasis>private key</emphasis> and is kept -secret by the owner. -A sender encrypts a message using the public key and once encrypted, -only the private key may be used to decrypt it. -</para> - -<para> -This protocol solves the key-exchange problem inherent with symmetric -ciphers. -There is no need for the sender and receiver to agree -upon a key. -All that is required is that some time before secret communication the -sender gets a copy of the receiver's public key. -Furthermore, the one public key can be used by anybody wishing to -communicate with the receiver. -<!-- inlineequation --> -So only <emphasis>n</emphasis> keypairs are needed for <emphasis>n</emphasis> -people to communicate secretly -with one another, -</para> - -<para> -Public-key ciphers are based on one-way trapdoor functions. -A one-way function is a function that is easy to compute, -but the inverse is hard to compute. -For example, it is easy to multiply two prime numbers together to get -a composite, but it is difficult to factor a composite into its prime -components.a -A one-way trapdoor function is similar, but it has a trapdoor. -That is, if some piece of information is known, it becomes easy -to compute the inverse. -For example, if you have a number made of two prime factors, then knowing -one of the factors makes it easy to compute the second. -Given a public-key cipher based on prime factorization, the public -key contains a composite number made from two large prime factors, and -the encryption algorithm uses that composite to encrypt the -message. -The algorithm to decrypt the message requires knowing the prime factors, -so decryption is easy if you have the private key containing one of the -factors but extremely difficult if you do not have it. -</para> - -<para> -As with good symmetric ciphers, with a good public-key cipher all of the -security rests with the key. -Therefore, key size is a measure of the system's security, but -one cannot compare the size of a symmetric cipher key and a public-key -cipher key as a measure of their relative security. -In a brute-force attack on a symmetric cipher with a key size of 80 bits, -<!-- inlineequation --> -the attacker must enumerate up to 2<superscript>81</superscript>-1 keys to -find the right key. -In a brute-force attack on a public-key cipher with a key size of 512 bits, -the attacker must factor a composite number encoded in 512 bits (up to -155 decimal digits). -The workload for the attacker is fundamentally different depending on -the cipher he is attacking. -While 128 bits is sufficient for symmetric ciphers, given today's factoring -technology public keys with 1024 bits are recommended for most purposes. -</para> -</sect1> - -<sect1> -<title> -Hybrid ciphers -</title> - -<para> -Public-key ciphers are no panacea. -Many symmetric ciphers are stronger from a security standpoint, -and public-key encryption and decryption are more expensive than the -corresponding operations in symmetric systems. -Public-key ciphers are nevertheless an effective tool for distributing -symmetric cipher keys, and that is how they are used in hybrid cipher -systems. -</para> - -<para> -A hybrid cipher uses both a symmetric cipher and a public-key cipher. -It works by using a public-key cipher to share a key for the symmetric -cipher. -The actual message being sent is then encrypted using the key and sent -to the recipient. -Since symmetric key sharing is secure, the symmetric key used is different -for each message sent. -Hence it is sometimes called a session key. -</para> - -<para> -Both PGP and &gnupg; use hybrid ciphers. -The session key, encrypted using the public-key cipher, and the message -being sent, encrypted with the symmetric cipher, are automatically -combined in one package. -The recipient uses his private-key to decrypt the session key and the -session key is then used to decrypt the message. -</para> - -<para> -A hybrid cipher is no stronger than the public-key cipher or symmetric -cipher it uses, whichever is weaker. -In PGP and &gnupg;, the public-key cipher is probably the weaker of -the pair. -Fortunately, however, if an attacker could decrypt a session key it -would only be useful for reading the one message encrypted with that -session key. -The attacker would have to start over and decrypt another session -key in order to read any other message. -</para> -</sect1> - -<sect1> -<title> -Digital signatures -</title> - -<para> -A hash function is a many-to-one function that maps its input to a -value in a finite set. -Typically this set is a range of natural numbers. -<!-- inlineequation --> -A simple ehash function is <emphasis>f</emphasis>(<emphasis>x</emphasis>) = 0 -for all integers <emphasis>x</emphasis>. -A more interesting hash function is -<emphasis>f</emphasis>(<emphasis>x</emphasis>) = <emphasis>x</emphasis> -<emphasis>mod</emphasis> 37, which -maps <emphasis>x</emphasis> to the remainder of dividing <emphasis>x</emphasis> by 37. -</para> - -<para> -A document's digital signature is the result of applying a hash -function to the document. -To be useful, however, the hash function needs to satisfy two -important properties. -First, it should be hard to find two documents that hash to the -same value. -Second, given a hash value it should be hard to recover the document -that produced that value. -</para> - -<para> -Some public-key ciphers<footnote><para> -The cipher must have the property that the actual public key or private -key could be used by the encryption algorithm as the public key. -RSA is an example of such an algorithm while ElGamal is not an example. -</para> -</footnote> could be used to sign documents. -The signer encrypts the document with his <emphasis>private</emphasis> key. -Anybody wishing to check the signature and see the document simply -uses the signer's public key to decrypt the document. -This algorithm does satisfy the two properties needed from a good hash -function, but in practice, this algorithm is too slow to be useful. -</para> - -<para> -An alternative is to use hash functions designed to satisfy these -two important properties. -SHA and MD5 are examples of such algorithms. -Using such an algorithm, a document is signed by hashing it, and -the hash value is the signature. -Another person can check the signature by also hashing their copy of the -document and comparing the hash value they get with the hash value of -the original document. -If they match, it is almost certain that the documents are identical. -</para> - -<para> -Of course, the problem now is using a hash function for digital -signatures without permitting an attacker to interfere with signature -checking. -If the document and signature are sent unencrypted, an attacker could -modify the document and generate a corresponding signature without the -recipient's knowledge. -If only the document is encrypted, an attacker could tamper with the -signature and cause a signature check to fail. -A third option is to use a hybrid public-key encryption to encrypt both -the signature and document. -The signer uses his private key, and anybody can use his public key -to check the signature and document. -This sounds good but is actually nonsense. -If this algorithm truly secured the document it would also -secure it from tampering and there would be no need for the signature. -The more serious problem, however, is that this does not protect either -the signature or document from tampering. -With this algorithm, only the session key for the symmetric cipher -is encrypted using the signer's private key. -Anybody can use the public key to recover the session key. -Therefore, it is straightforward for an attacker to recover the session -key and use it to encrypt substitute documents and signatures to send -to others in the sender's name. -</para> - -<para> -An algorithm that does work is to use a public key algorithm to -encrypt only the signature. -In particular, the hash value is encrypted using the signer's private -key, and anbody can check the signature using the public key. -The signed document can be sent using any other encryption algorithm -including none if it is a public document. -If the document is modified the signature check will fail, but this -is precisely what the signature check is supposed to catch. -The Digital Signature Standard (DSA) is a public key signature -algorithm that works as just described. -DSA is the primary signing algorithm used in &Gnupg;. -</para> - -</sect1> -</chapter> - diff --git a/doc/gph/c3.sgml b/doc/gph/c3.sgml deleted file mode 100644 index 541cf6c9d..000000000 --- a/doc/gph/c3.sgml +++ /dev/null @@ -1,885 +0,0 @@ -<chapter id="management" xreflabel="3"> -<docinfo> -<date> -$Id$ -</date> -</docinfo> -<title> -Key Management -</title> - -<para> -Key tampering is a major security weakness with public-key cryptography. -An eavesdropper may tamper with a user's keyrings or forge a -user's public key and post it for others to download and use. -For example, suppose Chloe wants to monitor the messages that Alice -sends to Blake. -She could mount what is called a <firstterm>man in the -middle</firstterm> attack. -In this attack, Chloe creates a new public/private keypair. -She replaces Alice's copy of Blake's public key with the new public key. -She then intercepts the messages that Alice sends to Blake. -For each intercept, she decrypts it using the new private key, reencrypts -it using Blake's true public key, and forwards the reencrypted -message to Blake. -All messages sent from Alice to Blake can now be read by Chloe. -</para> - -<para> -Good key management is crucial in order to ensure not just the integrity -of your keyrings but the integrity of other users' keyrings as well. -The core of key management in &gnupg; is the notion of signing keys. -Key signing has two main purposes: it permits you to detect tampering -on your keyring, and it allows you to certify that a key truly belongs -to the person named by a user ID on the key. -Key signatures are also used in a scheme known as the <firstterm>web of -trust</firstterm> to extend certification to keys not directly signed by you -but signed by others you trust. -Responsible users who practice good key management can defeat key -tampering as a practical attack on secure communication with &gnupg;. -</para> - -<sect1> -<title> -Managing your own keypair -</title> - -<para> -A keypair has a public key and a private key. -A public key consists of -the public portion of the master signing key, -the public portions of the subordinate signing and encryption subkeys, and -a set of user IDs used to associate the public key with a real person. -Each piece has data about itself. -For a key, this data includes its ID, when it was created, when it -will expire, etc. -For a user ID, this data includes the name of the real person it identifies, -an optional comment, and an email address. -The structure of the private key is similar, except that it contains only -the private portions of the keys, and there is no user ID information. -</para> - -<para> -The command-line option -<link linkend="edit-key"><option>--edit-key</option></link> -may be used to view a keypair. -For example, - -<screen width="80"> -<prompt>chloe%</prompt> <userinput>gpg --edit-key chloe@cyb.org</userinput> -Secret key is available. - -pub 1024D/26B6AAE1 created: 1999-06-15 expires: never trust: -/u -sub 2048g/0CF8CB7A created: 1999-06-15 expires: never -sub 1792G/08224617 created: 1999-06-15 expires: 2002-06-14 -sub 960D/B1F423E7 created: 1999-06-15 expires: 2002-06-14 -(1) Chloe (Jester) &lt;chloe@cyb.org> -(2) Chloe (Plebian) &lt;chloe@tel.net> -<prompt>Command></prompt> -</screen> - -The public key is displayed along with an indication of whether -or not the private key is available. -Information about each component of the public key is then listed. -The first column indicates the type of the key. -The keyword <literal>pub</literal> identifies the public master signing key, -and the keyword <literal>sub</literal> identifies a public subordinate key. -The second column indicates the key's bit length, type, and ID. -The type is <literal>D</literal> for a DSA key, <literal>g</literal> for an -encryption-only -ElGamal key, and <literal>G</literal> for an ElGamal key that may be used for -both encryption and signing. -The creation date and expiration date are given in columns three and four. -The user IDs are listed following the keys. -</para> - -<para> -More information about the key can be obtained with interactive commands. -The command <link linkend="toggle"><command>toggle</command></link> -switches between the public and private -components of a keypair if indeed both components are available. - -<screen width="80"> -<prompt>Command></prompt> <userinput>toggle</userinput> - -sec 1024D/26B6AAE1 created: 1999-06-15 expires: never -sbb 2048g/0CF8CB7A created: 1999-06-15 expires: never -sbb 1792G/08224617 created: 1999-06-15 expires: 2002-06-14 -sbb 960D/B1F423E7 created: 1999-06-15 expires: 2002-06-14 -(1) Chloe (Jester) &lt;chloe@cyb.org> -(2) Chloe (Plebian) &lt;chloe@tel.net> -</screen> - -The information provided is similar to the listing for the public-key -component. -The keyword <literal>sec</literal> identifies the private master signing key, -and the keyword <literal>sbb</literal> identifies the private subordinates keys. -The user IDs from the public key are also listed for convenience. -</para> - -<sect2> -<title id="integrity"> -Key integrity -</title> - -<para> -When you distribute your public key, you are distributing the public -components of your master and subordinate keys as well as the user IDs. -Distributing this material alone, however, is a security risk since -it is possible for an attacker to tamper with the key. -The public key can be modified by adding or substituting keys, or by -adding or changing user IDs. -By tampering with a user ID, the attacker could change the user ID's email -address to have email redirected to himself. -By changing one of the encryption keys, the attacker would -also be able to decrypt the messages redirected to him. -</para> - -<para> -Using digital signatures is a solution to this problem. -When data is signed by a private key, the corresponding public key -is bound to the signed data. -In other words, only the corresponding public key can be used to -verify the signature and ensure that the data has not been modified. -A public key can be protected from tampering by using its corresponding -private master key to sign the public key components and user IDs, thus -binding the components to the public master key. -Signing public key components with the corresponding private master -signing key is called <firstterm>self-signing</firstterm>, and a public key that has -self-signed user IDs bound to it is called a <firstterm>certificate</firstterm>. -</para> - -<!-- -%\begin{figure} -%Blank -%\caption{This should depict how self-signatures bind information to -%a public key.}\label{fig:selfsignedkey} -%\end{figure} -% -%As an example, Figure~\ref{fig:selfsignedkey} illustrates Chloe's public -%key, which has been self-signed to bind the user IDs and public subkeys -%to the public master key. -%The signatures on the user IDs can be checked with the \texttt{check} -%command from the key edit menu. ---> - -<para> -As an example, Chloe has two user IDs and three subkeys. -The signatures on the user IDs can be checked with the command -<link linkend="check"><command>check</command></link> from the key edit menu. - -<screen width="80"> -<prompt>chloe%</prompt> <userinput>gpg --edit-key chloe</userinput> -Secret key is available. - -pub 1024D/26B6AAE1 created: 1999-06-15 expires: never trust: -/u -sub 2048g/0CF8CB7A created: 1999-06-15 expires: never -sub 1792G/08224617 created: 1999-06-15 expires: 2002-06-14 -sub 960D/B1F423E7 created: 1999-06-15 expires: 2002-06-14 -(1) Chloe (Jester) &lt;chloe@cyb.org> -(2) Chloe (Plebian) &lt;chloe@tel.net> - -<prompt>Command></prompt> <userinput>check</userinput> -uid Chloe (Jester) &lt;chloe@cyb.org> -sig! 26B6AAE1 1999-06-15 [self-signature] -uid Chloe (Plebian) &lt;chloe@tel.net> -sig! 26B6AAE1 1999-06-15 [self-signature] -</screen> - -As expected, the signing key for each signature is the master signing -key with key ID <literal>0x26B6AAE1</literal>. -The self-signatures on the subkeys are present in the public key, but -they are not shown by the &gnupg; interface. -</para> -</sect2> - -<sect2> -<title> -Adding and deleting key components -</title> - -<para> -Both new subkeys and new user IDs may be added to your keypair after -it has been created. -A user ID is added using the command -<link linkend="adduid"><command>adduid</command></link>. -You are prompted for a real name, email address, and comment just -as when you create an initial keypair. -A subkey is added using the command -<link linkend="addkey"><command>addkey</command></link>. -The interface is similar to the interface used when creating an initial -keypair. -The subkey may be a DSA signing key, and encrypt-only ElGamal -key, or a sign-and-encrypt ElGamal key. -When a subkey or user ID is generated it is self-signed using your -master signing key, which is why you must supply your passphrase -when the key is generated. -</para> - -<para> -Additional user IDs are useful when you need multiple identities. -For example, you may have an identity for your job and an identity -for your work as a political activist. -Coworkers will know you by your work user ID. -Coactivists will know you by your activist user ID. -Since those groups of people may not overlap, though, each group -may not trust the other user ID. -Both user IDs are therefore necessary. -</para> - -<para> -Additional subkeys are also useful. -The user IDs associated with your public master key are validated by -the people with whom you -communicate, and changing the master key therefore requires recertification. -This may be difficult and time consuming if you communicate with -many people. -On the other hand, it is good to periodically change encryption subkeys. -If a key is broken, all the data encrypted with that key will be -vulnerable. -By changing keys, however, only the data encrypted with the one broken -key will be revealed. -</para> - -<para> -Subkeys and user IDs may also be deleted. -To delete a subkey or user ID you must first select it using the -<link linkend="key"><command>key</command></link> or -<link linkend="uid"><command>uid</command></link> commands respectively. -These commands are toggles. -For example, the command <command>key <parameter>2</parameter></command> -selects the second subkey, -and invoking <command>key <parameter>2</parameter></command> again -deselects it. -If no extra argument is given, all subkeys or user IDs are deselected. -Once the user IDs to be deleted are selected, the command -<link linkend="deluid"><command>deluid</command></link> -actually deletes the user IDs from your key. -Similarly, the command <link linkend="delkey"><command>delkey</command></link> -deletes all selected subkeys from both your public and private keys. -</para> - -<para> -For local keyring management, deleting key components is a good way -to trim other people's public keys of unnecessary material. -Deleting user IDs and subkeys on your own key, however, is not always -wise since it complicates key distribution. -By default, when a user imports your updated public key it will be merged -with the old copy of your public key on his ring if it exists. -The components from both keys are combined in the merge, and this -effectively restores any components you deleted. -To properly update the key, the user must first delete the old version -of your key and then import the new version. -This puts an extra burden on the people with whom you communicate. -Furthermore, if you send your key to a keyserver, the merge will -happen regardless, and anybody who downloads your key from a keyserver -will never see your key with components deleted. -Consequently, for updating your own key it is better to revoke key -components instead of deleting them. -</para> -</sect2> - -<sect2> -<title> -Revoking key components -</title> - -<para> -To revoke a subkey it must be selected. -Once selected it may be revoked with the -<link linkend="revkey"><command>revkey</command></link> command. -The key is revoked by adding a revocation self-signature to the key. -Unlike the command-line option <option>--gen-revoke</option>, the effect of -revoking a subkey is immediate. -</para> - -<screen width="80"> -<prompt>Command></prompt> <userinput>revkey</userinput> -Do you really want to revoke this key? y - -You need a passphrase to unlock the secret key for -user: "Chloe (Jester) &lt;chloe@cyb.org>" -1024-bit DSA key, ID B87DBA93, created 1999-06-28 - - -pub 1024D/B87DBA93 created: 1999-06-28 expires: never trust: -/u -sub 2048g/B7934539 created: 1999-06-28 expires: never -sub 1792G/4E3160AD created: 1999-06-29 expires: 2000-06-28 -rev! subkey has been revoked: 1999-06-29 -sub 960D/E1F56448 created: 1999-06-29 expires: 2000-06-28 -(1) Chloe (Jester) &lt;chloe@cyb.org> -(2) Chloe (Plebian) &lt;chloe@tel.net> -</screen> - -<para> -A user ID is revoked differently. -Normally, a user ID collects signatures that attest that the user ID -describes the person who actually owns the associated key. -In theory, a user ID describes a person forever, since that person will -never change. -In practice, though, elements of the user ID such as the email address -and comment may change over time, thus invalidating the user ID. -</para> - -<para> -The OpenPGP -<comment>First reference to OpenPGP</comment> -specification does not support user ID revocation, but -a user ID can effectively be revoked by revoking the self-signature -on the user ID. -For the security reasons described -<link linkend="integrity">previously</link>, -correspondents will not trust a user ID with no valid self-signature. -</para> - -<para> -A signature is revoked by using the command -<link linkend="revsig"><command>revsig</command></link>. -Since you may have signed any number of user IDs, the user interface -prompts you to decide for each signature whether or not to revoke it. -</para> - -<screen width="80"> -<prompt>Command></prompt> <userinput>revsig</userinput> -You have signed these user IDs: - Chloe (Jester) &lt;chloe@cyb.org> - signed by B87DBA93 at 1999-06-28 - Chloe (Plebian) &lt;chloe@tel.net> - signed by B87DBA93 at 1999-06-28 -user ID: "Chloe (Jester) &lt;chloe@cyb.org>" -signed with your key B87DBA93 at 1999-06-28 -Create a revocation certificate for this signature? (y/N)n -user ID: "Chloe (Plebian) &lt;chloe@tel.net>" -signed with your key B87DBA93 at 1999-06-28 -Create a revocation certificate for this signature? (y/N)y -You are about to revoke these signatures: - Chloe (Plebian) &lt;chloe@tel.net> - signed by B87DBA93 at 1999-06-28 -Really create the revocation certificates? (y/N)y - -You need a passphrase to unlock the secret key for -user: "Chloe (Jester) &lt;chloe@cyb.org>" -1024-bit DSA key, ID B87DBA93, created 1999-06-28 - - -pub 1024D/B87DBA93 created: 1999-06-28 expires: never trust: -/u -sub 2048g/B7934539 created: 1999-06-28 expires: never -sub 1792G/4E3160AD created: 1999-06-29 expires: 2000-06-28 -rev! subkey has been revoked: 1999-06-29 -sub 960D/E1F56448 created: 1999-06-29 expires: 2000-06-28 -(1) Chloe (Jester) &lt;chloe@cyb.org> -(2) Chloe (Plebian) &lt;chloe@tel.net> -</screen> - -<para> -A revoked user ID is indicated by the revocation signature on -the ID when the signatures on the key's user IDs are listed. -</para> - -<screen width="80"> -<prompt>Command></prompt> <userinput>check</userinput> -uid Chloe (Jester) &lt;chloe@cyb.org> -sig! B87DBA93 1999-06-28 [self-signature] -uid Chloe (Plebian) &lt;chloe@tel.net> -rev! B87DBA93 1999-06-29 [revocation] -sig! B87DBA93 1999-06-28 [self-signature] -</screen> - -<para> -Revoking both subkeys and self-signatures on user IDs adds revocation -self-signatures to the key. -Since signatures are being added and no material is deleted, a -revocation will always be visible to others when your updated public -key is distributed and merged with older copies of it. -Revocation therefore guarantees that everybody has a consistent -copy of your public key. -</para> -</sect2> - -<sect2> -<title> -Updating a key's expiration time -</title> - -<para> -The expiration time of a key may be updated with the command -<link linkend="expire"><command>expire</command></link> from the key edit menu. -If no key is selected the expiration time of the primary key -is updated. -Otherwise the expiration time of the selected subordinate key -is updated. -</para> - -<para> -A key's expiration time is associated with the key's self-signature. -The expiration time is updated by deleting the old self-signature -and adding a new self-signature. -Since correspondents will not have deleted the old self-signature, they -will see an additional self-signature on the key when they update -their copy of your key. -The latest self-signature takes precedence, however, so all correspondents -will unambiguously know the expiration times of your keys. -</para> -</sect2> -</sect1> - -<sect1> -<title> -Validating other keys on your public keyring -</title> - -<para> -In Chapter <xref linkend="intro"> a procedure was given to validate your -correspondents' public keys: a correspondent's key is validated by -personally checking his key's fingerprint and then signing his public -key with your private key. -By personally checking the fingerprint you can be sure that the -key really does belong to him, and since you have signed they key, you -can be sure to detect any tampering with it in the future. -Unfortunately, this procedure is awkward when either you must validate -a large number of keys or communicate with people whom you do not -know personally. -</para> - -<para> -&Gnupg; addresses this problem with a mechanism popularly known -as the <firstterm>web of trust</firstterm>. -In the web of trust model, responsibility for validating public -keys is delegated to people you trust. -For example, suppose -<itemizedlist spacing="compact"> -<listitem> -<para> -Alice has signed Blake's key, and -</para> -</listitem> -<listitem> -<para> -Blake has signed Chloe's key and Dharma's key. -</para> -</listitem> -</itemizedlist> - -If Alice trusts Blake to properly validate keys that he signs, then -Alice can infer that Chloe's and Dharma's keys are valid without -having to personally check them. -She simply uses her validated copy of Blake's public key to -check that Blake's signatures on Chloe's and Dharma's are good. -In general, assuming that Alice fully trusts everybody to properly -validate keys they sign, then any key signed by a valid key is also -considered valid. -The root is Alice's key, which is axiomatically assumed to be valid. -</para> - -<sect2> -<title> -Trust in a key's owner -</title> - -<para> -In practice trust is subjective. -For example, Blake's key is valid to Alice since she signed it, but she -may not trust Blake to properly validate keys that he signs. -In that case, she would not take Chloe's and Dharma's key as valid -based on Blake's signatures alone. -The web of trust model accounts for this by associating with each -public key on your keyring an indication of how much you trust the -key's owner. -There are four trust levels. - -<variablelist> -<varlistentry> -<term> -unknown -</term> -<listitem> -<para> -Nothing is known about the owner's judgement in key signing. -Keys on your public keyring that you do not own initially have -this trust level. -</para> -</listitem> -</varlistentry> -<varlistentry> -<term> -none -</term> -<listitem> -<para> -The owner is known to improperly sign other keys. -</para> -</listitem> -</varlistentry> -<varlistentry> -<term> -marginal -</term> -<listitem> -<para> -The owner understands the implications of key signing and -properly validates keys before signing them. -</para> -</listitem> -</varlistentry> -<varlistentry> -<term> -full -</term> -<listitem> -<para> -The owner has an excellent understanding of key signing, -and his signature on a key would be as good as your own. -</para> -</listitem> -</varlistentry> -</variablelist> - -A key's trust level is something that you alone assign to the -key, and it is considered private information. -It is not packaged with the key when it is exported; it is even -stored separately from your keyrings in a separate database. -</para> - -<para> -The &gnupg; key editor may be used to adjust your trust in a key's owner. -The command is <link linkend="trust"><command>trust</command></link>. -In this example Alice edits her trust in Blake and then updates -the trust database to recompute which keys are valid based on her new -trust in Blake. - -<screen width="80"> -<prompt>alice%</prompt> <userinput>gpg --edit-key blake</userinput> - -pub 1024D/8B927C8A created: 1999-07-02 expires: never trust: q/f -sub 1024g/C19EA233 created: 1999-07-02 expires: never -(1) Blake (Executioner) &lt;blake@cyb.org> - -<prompt>Command></prompt> <userinput>trust</userinput> -pub 1024D/8B927C8A created: 1999-07-02 expires: never trust: q/f -sub 1024g/C19EA233 created: 1999-07-02 expires: never -(1) Blake (Executioner) &lt;blake@cyb.org> - -Please decide how far you trust this user to correctly -verify other users' keys (by looking at passports, -checking fingerprints from different sources...)? - - 1 = Don't know - 2 = I do NOT trust - 3 = I trust marginally - 4 = I trust fully - s = please show me more information - m = back to the main menu - -<prompt>Your decision?</prompt> <userinput>3</userinput> - -pub 1024D/8B927C8A created: 1999-07-02 expires: never trust: m/f -sub 1024g/C19EA233 created: 1999-07-02 expires: never -(1) Blake (Executioner) &lt;blake@cyb.org> - -<prompt>Command></prompt> <userinput>quit</userinput> -[...] -</screen> - -Trust in the key's owner and the key's validity are indicated to the -right when the key is displayed. -Trust in the owner is displayed first and the key's validity is -<!-- HERE, need to fix quotation marks --> -second<footnote> -<para> -&Gnupg; overloads the word "trust" by using it to mean -trust in an owner and trust in a key. -This can be confusing. -Sometimes trust in an owner is referred to as -<firstterm>owner-trust</firstterm> to -distinguish it from trust in a key. -<!-- HERE, need to fix quotation marks --> -Throughout this manual, however, "trust" is used to -mean trust in a key's -<!-- HERE, need to fix quotation marks --> -owner, and "validity" is used to mean trust that a key -belongs to the human associated with the key ID. -</para> -</footnote>. -The four trust/validity levels are abbreviated: unknown (<literal>q</literal>), -none (<literal>n</literal>), marginal (<literal>m</literal>), and -full (<literal>f</literal>). -In this case, Blake's key is fully valid since Alice signed it herself. -She initially has an unknown trust in Blake to properly sign other keys -but decides to trust him marginally. -</para> -</sect2> - -<sect2> -<title> -Using trust to validate keys -</title> - -<para> -The web of trust allows a more elaborate algorithm to be used to -validate a key. -Formerly, a key was considered valid only if you signed it personally. -<!-- HERE, math --> -A more flexible algorithm can now be used: a key <emphasis>K</emphasis> is considered valid -if it meets two conditions: -<orderedlist spacing="compact"> -<listitem> -<para> -it is signed by enough valid keys, meaning -<itemizedlist spacing="compact"> -<listitem> -<para> -you have signed it personally, -</para> -</listitem> -<listitem> -<para> -it has been signed by one fully trusted key, or -</para> -</listitem> -<listitem> -<para> -it has been signed by three marginally trusted keys; and -</para> -</listitem> -</itemizedlist> -</para> -</listitem> -<listitem> -<para> -<!-- HERE, math --> -the path of signed keys leading from <emphasis>K</emphasis> back -to your own key is five steps or shorter. -</para> -</listitem> -</orderedlist> - -The path length, number of marginally trusted keys required, and number -of fully trusted keys required may be adjusted. -The numbers given above are the default values used by &gnupg;. -</para> - -<para> -<xref linkend="wot-examples"> shows a web of trust rooted at Alice. -The graph illustrates who has signed who's keys. -The table shows which keys Alice considers valid based on her -trust in the other members of the web. -<comment>Potential bug: <option>--completes-needed</option> on command -line seems to be ignored when combined with <option>--update-trustdb</option>. -Value is taken correctly if put in options file, however.</comment> -This example assumes that two marginally-trusted keys or one -fully-trusted key is needed to validate another key. -The maximum path length is three. -</para> - -<para> -When computing valid keys in the example, Blake and Dharma's are -always considered fully valid since they were signed directly -by Alice. -The validity of the other keys depends on trust. -In the first case, Dharma is trusted fully, which implies -that Chloe's and Francis's keys will be considered valid. -In the second example, Blake and Dharma are trusted marginally. -Since two marginally trusted keys are needed to fully validate a -key, Chloe's key will be considered fully valid, but Francis's -key will be considered only marginally valid. -In the case where Chloe and Dharma are marginally trusted, -Chloe's key will be marginally valid since Dharma's key is -fully valid. -Francis's key, however, will also be considered marginally -valid since only a fully valid key can be used to validate -other keys, and Dharma's key is the only fully valid key -that has been used to sign Francis's key. -When marginal trust in Blake is added, Chloe's key becomes -fully valid and can then be used to fully validate Francis's -key and marginally validate Elena's key. -Lastly, when Blake, Chloe, and Elena are fully trusted, this is -still insufficient to validate Geoff's key since the maximum -certification path is three, but the path length from Geoff -back to Alice is four. -</para> - -<para> -The web of trust model is a flexible approach to the problem of safe -public key exchange. -It permits you to tune &gnupg; to reflect how you use it. -At one extreme you may insist on multiple, short paths from your -<!-- HERE, math --> -key to another key <emphasis>K</emphasis> in order to trust it. -On the other hand, you may be satisfied with longer paths and -<!-- HERE, math --> -perhaps as little as one path from your key to the other -key <emphasis>K</emphasis>. -<!-- HERE, math --> -Requiring multiple, short paths is a strong guarantee -that <emphasis>K</emphasis> belongs to whom your think it does. -The price, of course, is that it is more difficult to validate keys -since you must personally sign more keys than if you accepted fewer -and longer paths. -</para> - -<figure id="wot-examples" float=1> -<title> -A hypothetical web of trust -</title> -<!-- -The graph indicates who has signed who's keys. -The table, in which names have been abbreviated, shows which keys are -valid depending on how Alice trusts other members in the web. -Alice considers different keys valid depending on how she trusts -the members of the web. ---> - -<graphic fileref="signatures.jpg"></graphic> - -<informaltable frame="all"> -<tgroup cols="4" rowsep="1" colsep="1"> -<colspec colname="one" colnum="1"> -<colspec colname="two" colnum="2"> -<colspec colname="three" colnum="3"> -<colspec colname="four" colnum="4"> -<spanspec spanname="lefthalf" namest="one" nameend="two" align="center"> -<spanspec spanname="righthalf" namest="three" nameend="four" align="center"> - -<thead> -<colspec -<row> -<entry spanname="lefthalf">trust</entry> -<entry spanname="righthalf">validity</entry> -</row> -<row> -<entry align="center">marginal</entry> -<entry align="center">full</entry> -<entry align="center">marginal</entry> -<entry align="center">full</entry> -</row> -</thead> -<tbody> -<row> -<entry></entry> -<entry>Dharma</entry> -<entry></entry> -<entry>Blake, Chloe, Dharma, Francis</entry> -</row> - -<row> -<entry>Blake, Dharma</entry> -<entry></entry> -<entry>Francis</entry> -<entry>Blake, Chloe, Dharma</entry> -</row> - -<row> -<entry>Chloe, Dharma</entry> -<entry></entry> -<entry>Chloe, Francis</entry> -<entry>Blake, Dharma</entry> -</row> - -<row> -<entry>Blake, Chloe, Dharma</entry> -<entry></entry> -<entry>Elena</entry> -<entry>Blake, Chloe, Dharma, Francis</entry> -</row> - -<row> -<entry></entry> -<entry>Blake, Chloe, Elena</entry> -<entry></entry> -<entry>Blake, Chloe, Elena, Francis</entry> -</row> -</tbody> -</tgroup> -</informaltable> -</figure> -</sect2> -</sect1> - -<sect1> -<title> -Distributing keys -</title> - -<para> -Ideally, you distribute your key by personally giving it to your -correspondents. -In practice, however, keys are often distributed by email or some -other electronic communication medium. -Distribution by email is good practice when you have only a few -correspondents, and even if you have many correspondents, you can use -an alternative means such as posting your public key on your World Wide -Web homepage. -This is unacceptable, however, if people who need your public key do -not know where to find it on the Web. -</para> - -<para> -To solve this problem public key servers are used to collect -and distribute public keys. -A public key received by the server is either added to the server's -database or merged with the existing key if already present. -When a key request comes to the server, the server consults its -database and returns the requested public key if found. -</para> - -<para> -A keyserver is also valuable when many people are frequently signing other -people's keys. -Without a keyserver, when Blake sign's Alice's key then Blake would send -Alice a copy of her public key signed by him so that Alice could -add the updated key to her ring as well as distribute it to all of her -correspondents. -Going through this effort fulfills Alice's and Blake's responsibility -to the community at large in building tight webs of trust and thus -improving the security of PGP. -It is nevertheless a nuisance if key signing is frequent. -</para> - -<para> -Using a keyserver makes the process somewhat easier. -When Blake signs Alice's key he sends the signed key to the key server. -The key server adds Blake's signature to its copy of Alice's key. -Individuals interested in updating their copy of Alice's key then consult -the keyserver on their own initiative to retrieve the updated key. -Alice need never be involved with distribution and can retrieve signatures -on her key simply by querying a keyserver. -<comment><option>--keyserver</option> must come before -<option>--send-key</option> or <option>--recv-key</option>. -This appears to be a bug.</comment> -</para> - -<para> -One or more keys may be sent to a keyserver using the command-line -option <link linkend="send-keys"><option>--send-keys</option></link>. -The option takes one or more key specifiers and sends the specified -keys to the key server. -The key server to which to send the keys is specified with the -command-line option <link linkend="keyserver"><option>--keyserver</option></link>. -Similarly, the option -<link linkend="recv-keys"><option>--recv-keys</option></link> is used -to retrieve keys from a keyserver, but the option <option>--recv-keys</option> -requires a key ID be used to specify the key. -In the following example Alice sends her public key to the keyserver -<parameter>certserver.pgp.com</parameter> and then updates her copy -of Blake's key from the same keyserver. - -<screen width="80"> -<prompt>alice%</prompt> <userinput>gpg --keyserver certserver.pgp.com --recv-key 0xBB7576AC</userinput> -gpg: requesting key BB7576AC from certserver.pgp.com ... -gpg: key BB7576AC: 1 new signature - -gpg: Total number processed: 1 -gpg: new signatures: 1 -<prompt>alice%</prompt> <userinput>gpg --keyserver certserver.pgp.com --send-key blake@cyb.org</userinput> -gpg: success sending to 'certserver.pgp.com' (status=200) -</screen> - -There are several popular keyservers in use around the world. -The major keyservers synchronize themselves, so it is fine to -pick a keyserver close to you on the Internet and then use it -regularly for sending and receiving keys. -</para> -</sect1> - -</chapter> - diff --git a/doc/gph/c4.sgml b/doc/gph/c4.sgml deleted file mode 100644 index 1932da7ae..000000000 --- a/doc/gph/c4.sgml +++ /dev/null @@ -1,433 +0,0 @@ -<chapter id="wise" xreflabel="4"> -<docinfo> -<date> -$Id$ -</date> -</docinfo> -<title> -Daily use of &Gnupg; -</title> - -<para> -&Gnupg; is a complex tool with technical, social, and legal issues -surrounding it. -Technically, it has been designed to be used in situations having -drastically different security needs. -This complicates key management. -Socially, using &gnupg; is not strictly a personal decision. -To use &gnupg effectively both parties communicating must use it. -Finally, as of 1999, laws regarding digital encryption, and in particular -whether or not using &gnupg; is legal, vary from country to country and -is currently being debated by many national governments. -</para> - -<para> -This chapter addresses these issues. -It gives practical advice on how to use &gnupg; to meet your security needs. -It also suggests ways to promote the use of &gnupg; for secure -communication between yourself and your colleagues when your colleagues -are not currently using &gnupg;. -Finally, the legal status of &gnupg; is outlined given the current status -of encryption laws in the world. -</para> - -<sect1> -<title> -Defining your security needs -</title> - -<para> -&Gnupg; is a tool you use to protect your privacy. -Your privacy is protected if you can correspond with others without -eavesdroppers reading those messages. -</para> - -<para> -How you should use &gnupg; depends on the determination and resourcefulness -of those who might want to read your encrypted messages. -An eavesdropper may be an unscrupulous system administrator casually -scanning your mail, it might be an industrial spy trying to collect -your company's secrets, or it might be a law enforcement agency trying -to prosecute you. -Using &gnupg; to protect against casual eavesdropping is going to be -different than using &gnupg; to protect against a determined adversary. -Your goal, ultimately, is to make it more expensive to recover the -unencrypted data than that data is worth. -</para> - -<para> -Customizing your use of &gnupg; revolves around three issues: -<itemizedlist spacing="compact"> -<listitem> -<para> -the key size of your public/private keypair, -</para> -</listitem> - -<listitem> -<para> -protecting your private key, and -</para> -</listitem> - -<listitem> -<para> -managing your web of trust. -</para> -</listitem> -</itemizedlist> - -A well-chosen key size protects you against brute-force attacks on -encrypted messages. -Protecting your private key prevents an attacker from simply using your -private key to decrypt encrypted messages and sign messages in your name. -Correctly managing your web of trust prevents attackers from masquarading -as people with whom you communicate. -Ultimately, addressing these issues with respect to your own security -needs is how you balance the extra work required to use &gnupg; with -the privacy it gives you. -</para> - -<sect2> -<title> -Choosing a key size -</title> - -<para> -Selecting a key size depends on the key. -In OpenPGP, a public/private keypair usually has multiple keys. -At the least it has a master signing key, and it probably has one or -more additional subkeys for encryption. -Using default key generation parameters with &gnupg;, the master -key will be a DSA key, and the subkeys will be ElGamal keys. -</para> - -<para> -DSA allows a key size up to 1024 bits. -This is not especially good given today's factoring technology, but -that is what the standard specifies. -Without question, you should use 1024 bit DSA keys. -</para> - -<para> -ElGamal keys, on the other hand, may be of any size. -Since &gnupg; is a hybrid public-key system, the public key is used -to encrypt a 128-bit session key, and the private key is used to -decrypt it. -Key size nevertheless affects encryption and decryption speed -since the cost of these algorithms is exponential in the size of -the key. -Larger keys also take more time to generate and take more space -to store. -Ultimately, there are diminishing returns on the extra security -a large key provides you. -After all, if the key is large enough to resist a brute-force -attack, an eavesdropper will merely switch to some other method for -obtaining your plaintext data. -Examples of other methods include robbing your home or office -and mugging you. -1024 bits is thus the recommended key size. -If you genuinely need a larger key size then you probably already -know this and should be consulting an expert in data security. -</para> -</sect2> - -<sect2> -<title> -Protecting your private key -</title> - -<para> -Protecting your private key is the most important job you have to -use &gnupg; correctly. -If someone obtains your private key, then all data encrypted to -the private key can be decrypted and signatures can be made in your name. -If you lose your private key, then you will no longer be able to -decrypt documents encrypted to you in the future or in the past, -and you will not be able to make signatures. -Losing sole possession of your private key is catastrophic. -</para> - -<para> -Regardless of how you use &gnupg; you should store the public -key's <link linkend="revocation">revocation certificate</link> -and a backup of your private key on write-protected media in a safe place. -For example, you could burn them on a CD-ROM and store them in your -safe deposit box at the bank in a sealed envelope. -Alternatively, you could store them on a floppy and hide it in your -house. -Whatever you do, they should be put on media that is safe to store -for as long as you expect to keep the key, and you should store -them more carefully than the copy of your private key you use daily. -</para> - -<para> -To help safeguard your key, &Gnupg; does not store your raw -private key on disk. -Instead it encrypts it using a symmetric encryption algorithm. -That is why you need a passphrase to access the key. -Thus there are two barriers an attacker must cross to access your private -key: (1) he must actually acquire the key, and (2) he must get past -the encryption. -</para> - -<para> -Safely storing your private key is important, but there is a cost. -Ideally, you would keep the private key on a removable, write-protected disk -such as a floppy disk, and you would use it on a single-user machine -not connected to a network. -This may be inconvenient or impossible for you to do. -For example, you may not own your own machine and must use a computer -at work or school, or it may mean you have to physically disconnect -your computer from your cable modem every time you want to use &gnupg; -</para> - -<para> -This does not mean you cannot or should not use &gnupg;. -It means only that you have decided that the data you are protecting is -important enough to encrypt but not so important as to take extra -steps to make the first barrier stronger. -It is your choice. -</para> - -<para> -A good passphrase is absolutely critical when using &gnupg;. -Any attacker who gains access to your private key must bypass the -encryption on the private key. -Instead of brute-force guessing the key, an attacker will almost -certainly instead try to guess the passphrase. -</para> - -<para> -The motivation for trying passphrases is that most people choose -a passphrase that is easier to guess than a random 128-bit key. -If the passphrase is a word, it is much cheaper to try all the -words in the dictionaries of the world's languages. -Even if the word is permuted, &eg, k3wldood, it is still easier -to try dictionary words with a catalog of permutations. -The same problem applies to quotations. -In general, passphrases based on natural-language utterances -are poor passphrases since there is little randomness and lots -of redundancy in natural language. -You should avoid natural language passphrases if you can. -</para> - -<para> -A good passphrase is one that you can remember but is hard for -someone to guess. -It should include characters from the whole range of printable characters -on your keyboard. -This includes uppercase alphabetics characters, numbers, and special -characters such as <literal>}</literal> and <literal>|</literal>. -Be creative and spend a little time considering your passphrase; a -good choice is important to ensure your privacy. -</para> -</sect2> - -<!-- -<sect2> -<title> -Reacting to a compromised private key -</title> - -<para> -Despite your precautions you may lose sole access to your private key. -For example, you may forget the passphrase, or someone who you think -can bypass the encryption gets access to it. -In that case then you need to spread the word that your key is no -longer valid. -To do that you use the key revocation certificate you should have generated -when you created the key. -Importing it onto your public keyring will revoke the public key -of the keypair you no longer wish to use. -It is then up to you to distribute the revoked public key to all -those who may encrypt documents to you. -</para> - -<para> -A revoked public key only prevents future use of the private key. -Others will neither be able to encrypt documents to the key nor will -they be able to check signatures made with the private key. -Documents signed in the past can still be checked, however, and -documents encrypted in the past can still be decrypted. -</para> - -<para> -It is important that you protect the revocation certificate carefully. -Anybody can add the certificate to your public key and distribute it, -and there is no way to revoke a revocation certificate. -Therefore, you should store the revocation certificate in a safe -place such as with the backup of your private key. -</para> -</sect2> ---> - -<sect2> -<title> -Managing your web of trust -</title> - -<para> -As with protecting your private key, managing your web of trust is -another aspect of using &gnupg; that requires balancing security against -ease of use. -If you are using &gnupg; to protect against casual eavesdropping and -forgeries then you can afford to be relatively trusting of other -people's signatures. -On the other hand, if you are concerned that there may be a determined -attacker interested in invading your privacy, then -you should be much less trusting of other signatures and spend more time -personally verifying signatures. -</para> - -<para> -Regardless of your own security needs, through, you should -<emphasis>always be careful</emphasis> when signing other keys. -It is selfish to sign a key with just enough confidence in the key's -validity to satisfy your own security needs. -Others, with more stringent security needs, may want to depend on -your signature. -If they cannot depend on you then that weakens the web of trust -and makes it more difficult for all &gnupg; users to communicate. -Use the same care in signing keys that you would like others to use when -you depend on their signatures. -</para> - -<para> -In practice, managing your web of trust reduces to assigning trust to -others and tuning the options -<link linkend="marginals-needed"><option>--marginals-needed</option></link> -and -<link linkend="completes-needed"><option>--completes-needed</option></link>. -Any key you personally sign will be considered valid, but except for small -groups, it will not be practical to personally sign the key of every person -with whom you communicate. -You will therefore have to assign trust to others. -</para> - -<para> -It is probably wise to be accurate when assigning trust and then -use the options to tune how careful &gnupg; is with key validation. -As a concrete example, you may fully trust a few close friends that -you know are careful with key signing and then marginally -trust all others on your keyring. -From there, you may set <option>--completes-needed</option> to -<literal>1</literal> and <option>--marginals-needed</option> to -<literal>2</literal>. -If you are more concerned with security you might choose values of -<literal>1</literal> and <literal>3</literal> or <literal>2</literal> -and <literal>3</literal> respectively. -If you are less concerned with privacy attacks and just want some -reasonable confidence about validity, set the values to <literal>1</literal> -and <literal>1</literal>. -In general, higher numbers for these options imply that more people -would be needed to conspire against you in order to have a key validated -that does not actually belong to the person whom you think it does. -</para> -</sect2> -</sect1> - -<sect1> -<title> -Building your web of trust -</title> - -<para> -Wanting to use &gnupg; yourself is not enough. -In order to use to communicate securely with others you must have -a web of trust. -At first glance, however, building a web of trust is a daunting task. -The people with whom you communicate need to use -&gnupg;<footnote><para>In this section, &gnupg; refers to the -&gnupg; implementation of OpenPGP as well as other implementations -such as NAI's PGP product.</para></footnote>, and there needs to be enough -key signing so that keys can be considered valid. -These are not technical problems; they are social problems. -Nevertheless, you must overcome these problems if you want to -use &gnupg;. -</para> - -<para> -When getting started using &gnupg; it is important to realize that you -need not securely communicate with every one of your correspondents. -Start with a small circle of people, perhaps just yourself and -one or two others who also want to exercise their right -to privacy. -Generate your keys and sign each other's public keys. -This is your initial web of trust. -By doing this you will appreciate the value of a small, robust -web of trust and will be more cautious as you grow your web -in the future. -</para> - -<para> -In addition to those in your initial web of trust, you may want to -communicate securely with others who are also using &gnupg;. -Doing so, however, can be awkward for two reasons: -(1) you do not always know when someone uses or is willing to use -&gnupg;, and (2) if you do know of someone who uses it, you may still have -trouble validating their key. -The first reason occurs because people do not always advertise that -they use &gnupg;. -The way to change this behavior is to set the example and advertise -that you use &gnupg;. -There are at least three ways to do this: you can sign messages you mail -to others or post to message boards, you can put your public key on your -web page, or, if you put your key on a keyserver, you can put your key -ID in your email signature. -If you advertise your key then you make it that much more acceptable -for others to advertise their keys. -Furthermore, you make it easier for others to start communicating -with you securely since you have taken the initiative and made it clear -that you use &gnupg;. -</para> - -<para> -Key validation is more difficult. -If you do not personally know the person whose key you want to sign, -then it is not possible to sign the key yourself. -You must rely on the signatures of others and hope to find a chain -of signatures leading from the key in question back to your own. -To have any chance of finding a chain, you must take the intitive -and get your key signed by others outside of your intitial web of trust. -An effective way to accomplish this is to participate in key -signing parties. -If you are going to a conference look ahead of time for a key -signing party, and if you do not see one being held, offer to -<ulink url="http://www.herrons.com/kb2nsx/keysign.html">hold one</ulink>. -You can also be more passive and carry your fingerprint with you -for impromptu key exchanges. -In such a situation the person to whom you gave the fingerprint -would verify it and sign your public key once he returned home. -</para> - -<para> -Keep in mind, though, that this is optional. -You have no obligation to either publically advertise your key or -sign other people's keys. -The power of &gnupg; is that it is flexible enough to adapt to your -security needs whatever they may be. -The social reality, however, is that you will need to take the initiative -if you want to grow your web of trust and use &gnupg; for as much of -your communication as possible. -</para> -</sect1> - -<sect1> -<title> -Using &Gnupg; legally -</title> - -<para> -The legal status of encryption software varies from country to country, -and law regarding encryption software is rapidly evolving. -<ulink url="http://cwis.kub.nl/~frw/people/koops/bertjaap.htm">Bert-Japp -Koops</ulink> has an excellent -<ulink url="http://cwis.kub.nl/~frw/people/koops/lawsurvy.htm">Crypto -Law Survey</ulink> to which you should refer for the legal status of -encryption software in your country. -</para> - -</sect1> -</chapter> - diff --git a/doc/gph/c5.sgml b/doc/gph/c5.sgml deleted file mode 100644 index b847e5853..000000000 --- a/doc/gph/c5.sgml +++ /dev/null @@ -1,38 +0,0 @@ -<chapter id="Modules" xreflabel="5"> -<docinfo> -<date> -$Id$ -</date> -</docinfo> -<title> -Programming with &Gnupg; -</title> - -<para>...</para> - -<sect1> -<title> -Using &gpg in batch mode -</title> - -<para>...</para> - -<sect2> -<title> -Invoking &gpg from mail clients -</title> - -<para>...</para> -</sect2> -</sect1> - -<sect1> -<title> -Writing extension modules -</title> - -<para>...</para> -</sect1> - -</chapter> - diff --git a/doc/gph/c6.sgml b/doc/gph/c6.sgml deleted file mode 100644 index 1b82a8c9a..000000000 --- a/doc/gph/c6.sgml +++ /dev/null @@ -1,804 +0,0 @@ -<reference> -<docinfo> -<date> -$Id$ -</date> -</docinfo> -<title> -Command Reference -</title> - -<partintro> -<sect1> -<title> -Key specifiers -</title> - -<para> -Many commands and options require a <firstterm>key specifier</firstterm>. -A key specifier is the key ID or any portion of ther user ID of -a key. -Consider the following example. - -<screen width="80"> -<prompt>alice%</prompt> <userinput>gpg --list-keys chloe</userinput> -pub 1024D/B87DBA93 1999-06-28 Chloe (Jester) &lt;chloe@cyb.org> -uid Chloe (Plebian) &lt;chloe@tel.net> -sub 2048g/B7934539 1999-06-28 -</screen> - -For this key, <literal>0xB87DBA93</literal>, -<literal>Chloe</literal>, -<literal>Plebian</literal>, and -<literal>oe@tel</literal> -are all examples of key specifiers that match the above key. -</para> -</sect1> -</partintro> - -<refentry id="send-keys"> -<refnamediv> -<refname> -send-keys -</refname> -<refpurpose> -send keys to a key server -</refpurpose> - - -</refnamediv> -<refsynopsisdiv> -<synopsis> -send-keys <replaceable class="parameter">key</replaceable> -</synopsis> -</refsynopsisdiv> - -<refsect1> -<title> -Description -</title> - -<para> -This command sends a public key to a keyserver. -The parameter <replaceable class="parameter">key</replaceable> specifies -the public key that should be uploaded. -The command requires the option -<link linkend="keyserver"><option>keyserver</option></link> to specify -to which keyserver &gpg; should send the keys. -</para> -</refsect1> -</refentry> - -<refentry id="recv-keys"> -<refnamediv> -<refname> -recv-keys -</refname> -<refpurpose> -retrieve keys from a key server -</refpurpose> -</refnamediv> -<refsynopsisdiv> -<synopsis> -<option>recv-keys</option> <replaceable class="parameter">key-id key-id ...</replaceable> -</synopsis> -</refsynopsisdiv> - -<refsect1> -<title> -Description -</title> - -<para> -This command downloads one or more public keys from a keyserver. -Each <replaceable class="parameter">key-id</replaceable> is a key ID. -The command requires the option -<link linkend="keyserver"><option>keyserver</option></link> to -specify from which keyserver &gpg; should download the keys. -</para> -</refsect1> -</refentry> - -<refentry id="encrypt"> -<refnamediv> -<refname> -encrypt -</refname> -<refpurpose> -encrypt a document -</refpurpose> -</refnamediv> -<refsynopsisdiv> -<synopsis> -<option>encrypt</option> <replaceable class="parameter">filename</replaceable> -</synopsis> -</refsynopsisdiv> - -<refsect1> -<title> -Description -</title> - -<para> -This command encrypts the document -<replaceable class="parameter">filename</replaceable> to -recipients specified using the -option <link linkend="recipient"><option>recipient</option></link>. -If the parameter <replaceable class="parameter">filename</replaceable> -is omitted, then the document to encrypt is taken from standard input. -If the option <option>recipient</option> is omitted, -&gpg; will prompt for a recipient. -If the option <link linkend="output"><option>output</option></link> is used, -&gpg; will output the encrypted information to the specified file. -</para> -</refsect1> -</refentry> - -<refentry id="decrypt"> -<refnamediv> -<refname> -decrypt -</refname> -<refpurpose> -decrypt an encrypted document -</refpurpose> -</refnamediv> -<refsynopsisdiv> -<synopsis> -<option>decrypt</option> <replaceable class="parameter">filename</replaceable> -</synopsis> -</refsynopsisdiv> - -<refsect1> -<title> -Description -</title> - -<para> -This command decrypts <replaceable class="parameter">filename</replaceable> -and puts the result on standard output. -If the parameter <replaceable class="parameter">filename</replaceable> -is omitted, then the document to decrypt is taken from standard input. -Use the option <link linkend="output"><option>output</option></link> -to output the decrypted message to a file instead. -</para> -</refsect1> -</refentry> - - -<refentry id="clearsign"> -<refnamediv> -<refname> -clearsign -</refname> -<refpurpose> -make a cleartext signature -</refpurpose> -</refnamediv> -<refsynopsisdiv> -<synopsis> -<option>clearsign</option> <replaceable class="parameter">filename</replaceable> -</synopsis> -</refsynopsisdiv> - -<refsect1> -<title> -Description -</title> - -<para> -This command signs a message that can be verified to ensure that the -original message has not been changed. -Verification of the signed message is done using the command -<link linkend="verify"><option>verify</option></link>. - -</para> -</refsect1> -</refentry> - -<refentry id="fingerprint"> -<refnamediv> -<refname> -fingerprint -</refname> -<refpurpose> -display key fingerprints -</refpurpose> -</refnamediv> -<refsynopsisdiv> -<synopsis> -<option>fingerprint</option> <replaceable class="parameter">name ...</replaceable> -</synopsis> -</refsynopsisdiv> - -<refsect1> -<title> -Description -</title> - -<para> -This command prints the fingerprints of the specified public keys. -The parameter <replaceable class="parameter">name</replaceable> is a -key specifier. -If no parameter <replaceable class="parameter">name</replaceable> is -provided, &gpg; will print the fingerprints of all the keys on -your public keyring. -</para> -</refsect1> -</refentry> - -<refentry id="detach-sig"> -<refnamediv> -<refname> -detach-sig -</refname> -<refpurpose> -make a detached signature -</refpurpose> -</refnamediv> -<refsynopsisdiv> -<synopsis> -<option>detach-sig</option> <replaceable class="parameter">filename</replaceable> -</synopsis> -</refsynopsisdiv> - -<refsect1> -<title> -Description -</title> - -<para> -This command creates a signature file that can be used -to verify that the orginal file -<replaceable class="parameter">filename</replaceable> has not -been changed. -Verification of the file using a detached signature is done using the -command <link linkend="verify"><option>verify</option></link>. -</para> -</refsect1> -</refentry> - -<refentry id="gen-key"> -<refnamediv> -<refname> -gen-key -</refname> -<refpurpose> -generate a new keypair -</refpurpose> -</refnamediv> -<refsynopsisdiv> -<synopsis> -<option>gen-key</option> -</synopsis> -</refsynopsisdiv> - -<refsect1> -<title> -Description -</title> - -<para> -This command generates a private/public key pair for use in encrypting, -decrypting, and signing of messages. -You will br prompted for the kind of key you wish to create, the key -size, and the key's expiration date. -</para> -</refsect1> -</refentry> - -<refentry id="symmetric"> -<refnamediv> -<refname> -symmetric -</refname> -<refpurpose> -encrypt a document using only a symmetric encryption algorithm -</refpurpose> -</refnamediv> -<refsynopsisdiv> -<synopsis> -<option>symmetric</option> <replaceable class="parameter">filename</replaceable> -</synopsis> -</refsynopsisdiv> - -<refsect1> -<title> -Description -</title> - -<para> -This command encrypts a document using a symmetric algorithm with -a key derived from a passphrase supplied by you during execution. -The key should be selected to make it difficult to randomly guess the key. -To decrypt a document encrypted in this manner use the command. -<link linkend="decrypt"><option>decrypt</option></link>. -</para> -</refsect1> -</refentry> - -<refentry id="list-keys"> -<refnamediv> -<refname> -list-keys -</refname> -<refpurpose> -list information about the specified keys -</refpurpose> -</refnamediv> -<refsynopsisdiv> -<synopsis> -<option>list-keys</option> <replaceable class="parameter">key ...</replaceable> -</synopsis> -</refsynopsisdiv> - -<refsect1> -<title> -Description -</title> - -<para> -This command lists the public key specified by the key specifiers on the -command line. -If no key specifier is given, &gpg; will print all of the keys on the -public keyring. -</para> -</refsect1> -</refentry> - -<refentry id="import"> -<refnamediv> -<refname> -import -</refname> -<refpurpose> -import keys to a local keyring -</refpurpose> -</refnamediv> -<refsynopsisdiv> -<synopsis> -<option>import</option> <replaceable class="parameter">filename</replaceable> -</synopsis> -</refsynopsisdiv> - -<refsect1> -<title> -Description -</title> - -<para> -This command imports one or more public keys onto the user's public -keyring from the file <replaceable class="parameter">filename</replaceable>. -</para> -</refsect1> -</refentry> - -<refentry id="verify"> -<refnamediv> -<refname> -verify -</refname> -<refpurpose> -verify a signed document -</refpurpose> -</refnamediv> -<refsynopsisdiv> -<synopsis> -<option>verify</option> <replaceable class="parameter">signature document</replaceable> -</synopsis> -</refsynopsisdiv> - -<refsect1> -<title> -Description -</title> - -<para> -This command verifies a document against a signature -to ensure that the document has not been altered since the signature -was created. -If <replaceable class="parameter">signature</replaceable> is omitted, -&gpg; will look in <replaceable class="parameter">document</replaceable> -for a clearsign signature. -</para> -</refsect1> -</refentry> - -<refentry id="gen-revoke"> -<refnamediv> -<refname> -gen-revoke -</refname> -<refpurpose> -generate a revocation certificate for a public/private keypair -</refpurpose> -</refnamediv> -<refsynopsisdiv> -<synopsis> -<option>gen-revoke</option> <replaceable class="parameter">key</replaceable> -</synopsis> -</refsynopsisdiv> - -<refsect1> -<title> -Description -</title> - -<para> -This command generates a revocation certificate for a public/private -key pair. -The parameter <replaceable class="parameter">key</replaceable> is -a key specifier. -</para> -</refsect1> -</refentry> - -<refentry id="export"> -<refnamediv> -<refname> -export -</refname> -<refpurpose> -export keys from a local keyring -</refpurpose> -</refnamediv> -<refsynopsisdiv> -<synopsis> -<option>export</option> <replaceable class="parameter">key key ...</replaceable> -</synopsis> -</refsynopsisdiv> - -<refsect1> -<title> -Description -</title> - -<para> -This command exports the public keys components of the keys specified -by the key specifiers <replaceable class="parameter">key key ...</replaceable>. -The export command by default sends its output to standard output. -This key file can later be imported into another keyring using the command -<link linkend="import"><option>import</option></link>. -</para> -</refsect1> -</refentry> - -<refentry id="edit-key"> -<refnamediv> -<refname> -edit-key -</refname> -<refpurpose> -presents a menu for operating on keys -</refpurpose> -</refnamediv> -<refsynopsisdiv> -<synopsis> -<option>edit-key</option> <replaceable class="parameter">key</replaceable> -</synopsis> -</refsynopsisdiv> - -<refsect1> -<title> -Description -</title> - -<para> -This command presents a menu which enables you to perform -key-related taskes. -The key specifier <replaceable class="parameter">key</replaceable> -specifies the key pair to be edited. -If the specifier matches more than one key pair, &gpg; issues -an error and exits. -</para> - -<para> -Key listings displayed during key editing show the key with its -secondary keys and all user ids. -Selected keys or user ids are indicated by an asterisk. -The trust and validity values are displayed with the primary key: -the first is the assigned trust and the second is the -calculated validity. -Letters are used for the values: - -<informaltable> -<tgroup cols="2" rowsep="1" colsep="1"> -<thead> -<row> -<entry>Letter</entry> -<entry>Meaning</entry> -</row> -</thead> -<tbody> -<row> -<entry> -- -</entry> -<entry> -No ownertrust assigned / not yet calculated. -</entry> -</row> -<row> -<entry> -e -</entry> -<entry> -Trust calculation has failed. -</entry> -</row> - -<row> -<entry> -q -</entry> -<entry> -Not enough information for calculation. -</entry> -</row> - -<row> -<entry> -n -</entry> -<entry> -Never trust this key. -</entry> -</row> - -<row> -<entry> -m -</entry> -<entry> -Marginally trusted. -</entry> -</row> - -<row> -<entry> -f -</entry> -<entry> -Fully trusted. -</entry> -</row> - -<row> -<entry> -u -</entry> -<entry> -Ultimately trusted. -</entry> -</row> -</tbody> -</tgroup> -</informaltable> -</para> - -<para> -The following lists each key editing command and a description -of its behavior. -</para> - -<refsect2 id="sign"> -<title> -sign -</title> - -<para> -Makes a signature on the current key. -If th key is not yet signed by the default user or the user -given with the option -<link linkend="local-user"><option>local-user</option></link>, -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 the option -<option>local-user</option>. -</para> -</refsect2> - -<refsect2 id="lsign"> -<title> -lsign -</title> - -<para> -Same as <link linkend="sign">sign</link>, 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. -</para> -</refsect2> - -<refsect2 id="revsig"> -<title> -revsig -</title> - -<para> -Revoke a signature. -Asks for each signature makde by a one of the private keys whether -a revocation certificate should be generated. -</para> -</refsect2> - -<refsect2 id="trust"> -<title> -trust -</title> - -<para> -Change the owner trust value. -This updates the trust database immediately and no save is required. -</para> -</refsect2> - -<refsect2 id="disable"> -<title> -disable -</title> - -<para> -Disable the key. -A disabled key cannot normally be used for encryption. -</para> -</refsect2> - -<refsect2 id="enable"> -<title> -enable -</title> - -<para> -Enable a key that has been previously -<link linkend="disable">disabled</link>. -</para> -</refsect2> - -<refsect2 id="adduid"> -<title> -adduid -</title> - -<para> -Add a new user id to the current key. -</para> -</refsect2> - -<refsect2 id="deluid"> -<title> -deluid -</title> - -<para> -Delete a user id from the current key. -</para> -</refsect2> - -<refsect2 id="addkey"> -<title> -addkey -</title> - -<para> -Add a new subkey to the current key. -</para> -</refsect2> - -<refsect2 id="delkey"> -<title> -delkey -</title> - -<para> -Delete a subkey from the current key. -</para> -</refsect2> - -<refsect2 id="revkey"> -<title> -revkey -</title> - -<para> -Revoke a subkey of the current key. -</para> -</refsect2> - -<refsect2 id="expire"> -<title> -expire -</title> - -<para> -Change a key expiration time. -If a subkey is selected, the time of that key will be changed. -With no selection the expiration time of the current primary key is changed. -</para> -</refsect2> - -<refsect2 id="key"> -<title> -key n -</title> - -<para> -Toggle selection of subkey with index n. -Use 0 to deselect all. -</para> -</refsect2> - -<refsect2 id="uid"> -<title> -uid n -</title> - -<para> -Toggle selection of user id with index n. -Use 0 to deselect all. -</para> -</refsect2> - -<refsect2 id="passwd"> -<title> -toggle -</title> - -<para> -Change the passphrase of the private key of the selected key pair. -</para> -</refsect2> - -<refsect2 id="toggle"> -<title> -toggle -</title> - -<para> -Toggle between public and private key listings. -</para> -</refsect2> - -<refsect2 id="check"> -<title> -check -</title> - -<para> -Check all selected user ids. -</para> -</refsect2> - -<refsect2 id="pref"> -<title> -pref -</title> - -<para> -List preferences. -</para> -</refsect2> - -<refsect2 id="save"> -<title> -save -</title> - -<para> -Save all changes to the current key and quit. -</para> -</refsect2> - -<refsect2 id="quit"> -<title> -save -</title> - -<para> -Quit without updating the current key. -</para> -</refsect2> - -</refsect1> -</refentry> -</reference> diff --git a/doc/gph/c7.sgml b/doc/gph/c7.sgml deleted file mode 100644 index 17f3186f1..000000000 --- a/doc/gph/c7.sgml +++ /dev/null @@ -1,251 +0,0 @@ -<reference> -<docinfo> -<date> -$Id$ -</date> -</docinfo> -<title> -Options Reference -</title> - -<partintro> -<sect1 id="optionsfile"> -<title> -Setting options -</title> - -<para> -Options may be specified on the command line or in an options file. -The default location of the options file is -<literal>~/.gnupg/options</literal>. -When specifying options in the options file, omit the leading two -dashes and instead use simply the option name followed by any -arguments. -Lines in the file with a hash (<literal>#</literal>) as the -first non-white-space character are ignored. -</para> -</sect1> -</partintro> - -<refentry id="keyserver"> -<refnamediv> -<refname> -keyserver -</refname> -<refpurpose> -specify the keyserver to use to locate keys -</refpurpose> -</refnamediv> -<refsynopsisdiv> -<synopsis> -<option>keyserver</option> <replaceable class="parameter">server-name</replaceable> -</synopsis> -</refsynopsisdiv> - -<refsect1> -<title> -Description -</title> - -<para> -This option is used in conjunction with either -<link linkend="recv-keys"><option>recv-keys</option></link> or -<link linkend="send-keys"><option>send-keys</option></link> to specify a -keyserver to manage public key distribution. -</para> -</refsect1> -</refentry> - -<refentry id="output"> -<refnamediv> -<refname> -output -</refname> -<refpurpose> -specify the file in which to place output -</refpurpose> -</refnamediv> -<refsynopsisdiv> -<synopsis> -<option>output</option> <replaceable class="parameter">file-name</replaceable> -</synopsis> -</refsynopsisdiv> - -<refsect1> -<title> -Description -</title> - -<para> -This is a description. -</para> -</refsect1> -</refentry> - -<refentry id="recipient"> -<refnamediv> -<refname> -recipient -</refname> -<refpurpose> -specify the recipient of a public-key encrypted document -</refpurpose> -</refnamediv> -<refsynopsisdiv> -<synopsis> -</synopsis> -</refsynopsisdiv> - -<refsect1> -<title> -Description -</title> - -<para> -This is a description. -</para> -</refsect1> -</refentry> - -<refentry id="armor"> -<refnamediv> -<refname> -armor -</refname> -<refpurpose> -ASCII-armor encrypted or signed output -</refpurpose> -</refnamediv> -<refsynopsisdiv> -<synopsis> -</synopsis> -</refsynopsisdiv> - -<refsect1> -<title> -Description -</title> - -<para> -This is a description. -</para> -</refsect1> -</refentry> - -<refentry id="no-greeting"> -<refnamediv> -<refname> -no-greeting -</refname> -<refpurpose> -suppress the opening copyright notice but do not enter batch mode -</refpurpose> -</refnamediv> -<refsynopsisdiv> -<synopsis> -</synopsis> -</refsynopsisdiv> - -<refsect1> -<title> -Description -</title> - -<para> -This is a description. -</para> -</refsect1> -</refentry> - -<refentry id="local-user"> -<refnamediv> -<refname> -local-user -</refname> -<refpurpose> -specifies a user id to use for signing -</refpurpose> -</refnamediv> -<refsynopsisdiv> -<synopsis> -<option>localuser</option> <replaceable class="parameter">name</replaceable> -</synopsis> -</refsynopsisdiv> - -<refsect1> -<title> -Description -</title> - -<para> -Use <replaceable class="parameter">name</replaceable> as the user ID to sign. -This option is silently ignored for the list commands, so that it can be -used in an options file. -</para> -</refsect1> -</refentry> - -<refentry id="completes-needed"> -<refnamediv> -<refname> -completes-needed -</refname> -<refpurpose> -specifies the number of fully-trusted people needed to validate a new key. -</refpurpose> -</refnamediv> -<refsynopsisdiv> -<synopsis> -<option>completes-needed</option> <replaceable class="parameter">n</replaceable> -</synopsis> -</refsynopsisdiv> - -<refsect1> -<title> -Description -</title> - -<para> -A public key on your keyring is validated using those signatures on -the key that were made by other valid keys on your keyring. -The option specifies the number of signatures needed if you fully -trust the owners of the keys that made the signatures. -Your trust in a key's owner is set with the command -<link linkend="edit-key"><option>edit-key</option></link>. -</para> -</refsect1> -</refentry> - -<refentry id="marginals-needed"> -<refnamediv> -<refname> -marginals-needed -</refname> -<refpurpose> -specifies the number of marginally-trusted people needed to validate -a new key. -</refpurpose> -</refnamediv> -<refsynopsisdiv> -<synopsis> -<option>marginals-needed</option> <replaceable class="parameter">n</replaceable> -</synopsis> -</refsynopsisdiv> - -<refsect1> -<title> -Description -</title> - -<para> -A public key on your keyring is validated using those signatures on -the key that were made by other valid keys on your keyring. -The option specifies the number of signatures needed if you marginally -trust the owners of the keys that made the signatures. -Your trust in a key's owner is set with the command -<link linkend="edit-key"><option>edit-key</option></link>. -</para> -</refsect1> -</refentry> -</reference> - diff --git a/doc/gph/manual.sgml b/doc/gph/manual.sgml deleted file mode 100644 index f573bfd4f..000000000 --- a/doc/gph/manual.sgml +++ /dev/null @@ -1,71 +0,0 @@ -<!-- - ToDo - - acknowledge Joergen Grahn for his xfig version of Figure 3.1 - - 'inlineequation' marks places where formatting is ok now but not - semantically correct. - - need some story for formatting math - From Tom Goulet (tomg@iaw.on.ca): - > and the <SUP> tag doesn't seem to do much under Lynx, consider just - > using a ^ to show powers. - --> - -<!DOCTYPE BOOK PUBLIC "-//Davenport//DTD DocBook V3.0//EN" [ -<!--ArborText, Inc., 1988-1995, v.4001--> -<!NOTATION drw SYSTEM "DRW"> -<!ENTITY gpg "<application>gpg</application>"> -<!ENTITY gnupg "GnuPG"> -<!ENTITY Gnupg "GnuPG"> -<!ENTITY eg "e.g."> -<!ENTITY ie "i.e."> -<!ENTITY chapter1 SYSTEM "c1.sgml"> -<!ENTITY chapter2 SYSTEM "c2.sgml"> -<!ENTITY chapter3 SYSTEM "c3.sgml"> -<!ENTITY chapter4 SYSTEM "c4.sgml"> -<!ENTITY chapter5 SYSTEM "c5.sgml"> -<!ENTITY chapter6 SYSTEM "c6.sgml"> -<!ENTITY chapter7 SYSTEM "c7.sgml"> -]> -<book> -<bookinfo> -<title>The GNU Privacy Handbook</title> -<date> -August 25, 1999 -</date> -<copyright> -<year>1999</year> -<holder>Free Software Foundation</holder> -</copyright> -<abstract> -<para> -Please direct questions, bug reports, or suggesstions concerning -this manual to the maintainer, Mike Ashley (<email>jashley@acm.org</email>). -Contributors to this manual also include Matthew Copeland and -Joergen Grahn. -</para> - -<para> -This manual may be redistributed under the terms of the -<ulink url="http://www.gnu.org/copyleft/gpl.html">GNU General Public -License</ulink>. -</para> -<para> <!-- I have added this note (wk 06.09.99) --> -PLEASE NOTE, THAT THIS IS A DRAFT VERSION OF THE MANUAL AND NOT A COMPLETE -AND CORRECT MANUAL. CONSIDER IT AS WORK IN PROGRESS. The latest draft of -the manual should be available online; -<ulink url="http://www.gnupg.org/docs.html">www.gnupg.org</ulink> has a link -to it. -</para> -</abstract> -</bookinfo> - -<toc></toc> - -&chapter1 -&chapter2 -&chapter3 -&chapter4 -&chapter5 -&chapter6 -&chapter7 -</book> - diff --git a/doc/gph/signatures.fig b/doc/gph/signatures.fig deleted file mode 100644 index 57fdfe6f6..000000000 --- a/doc/gph/signatures.fig +++ /dev/null @@ -1,44 +0,0 @@ -#FIG 3.2 -Landscape -Center -Inches -Letter -100.00 -Single --2 -1200 2 -6 600 300 9450 2625 -6 1500 300 9450 2625 -2 1 0 3 0 7 100 0 -1 0.000 0 0 -1 1 0 2 - 1 1 3.00 90.00 180.00 - 1575 1050 2475 1950 -2 1 0 3 0 7 100 0 -1 0.000 0 0 -1 1 0 2 - 1 1 3.00 90.00 180.00 - 3675 1950 4575 1050 -2 1 0 3 0 7 100 0 -1 0.000 0 0 -1 1 0 2 - 1 1 3.00 90.00 180.00 - 5775 1050 6675 1050 -2 1 0 3 0 7 100 0 -1 0.000 0 0 -1 1 0 2 - 1 1 3.00 90.00 180.00 - 7875 1050 8475 1050 -2 1 0 3 0 7 100 0 -1 0.000 0 0 -1 1 0 2 - 1 1 3.00 90.00 180.00 - 3600 525 4500 1050 -2 1 0 3 0 7 100 0 -1 0.000 0 0 -1 1 0 2 - 1 1 3.00 90.00 180.00 - 3675 1950 5100 2550 -2 1 0 3 0 7 100 0 -1 0.000 0 0 -1 1 0 2 - 1 1 3.00 90.00 180.00 - 5175 1200 5625 2325 -4 0 0 100 0 14 18 0.0000 4 180 825 6825 1125 Elena\001 -4 0 0 100 0 14 18 0.0000 4 180 825 8625 1125 Geoff\001 -4 0 0 100 0 14 18 0.0000 4 180 825 4725 1125 Chloe\001 -4 0 0 100 0 14 18 0.0000 4 180 825 2625 525 Blake\001 -4 0 0 100 0 14 18 0.0000 4 180 990 2550 2025 Dharma\001 -4 0 0 100 0 14 18 0.0000 4 180 1155 5175 2625 Francis\001 --6 -2 1 0 3 0 7 100 0 -1 0.000 0 0 -1 1 0 2 - 1 1 3.00 90.00 180.00 - 1575 1050 2475 450 -4 0 0 100 0 14 18 0.0000 4 180 825 600 1125 Alice\001 --6 diff --git a/doc/gph/signatures.jpg.asc b/doc/gph/signatures.jpg.asc deleted file mode 100644 index 99f04e394..000000000 --- a/doc/gph/signatures.jpg.asc +++ /dev/null @@ -1,232 +0,0 @@ ------BEGIN PGP ARMORED FILE----- -Version: GnuPG v0.9.11 (GNU/Linux) -Comment: For info see http://www.gnupg.org -Comment: Use "gpg --dearmor" for unpacking - -/9j/4AAQSkZJRgABAQEAUABQAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkS -Ew8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJ -CQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy -MjIyMjIyMjIyMjIyMjL/wAARCACxAogDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEA -AAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIh -MUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6 -Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZ -mqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx -8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREA -AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAV -YnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hp -anN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPE -xcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3 -+iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiub8Z+MrbwRpaan -f6bqV1Zl9kktlGjiEnG3fudSAScA8jPBwSM5+i/Emx1bxBa6LcaH4g0i7vEka1/t -Sx8lZig3MqnceQvPpx1yQCAdpRXH6V4y1G7+Id74U1HQPsHk2kl7b3X2xZftEIlE -atsC/Lu5OCcjGMV0Gp67o+ieV/a2q2Nh52fL+13CRb8YzjcRnGR09RQBoUVyfi7x -NfWfgO78Q+EhpuqmBDN5jT7ovKQnzGUqcOQFPG4dDySNpuaF4x0fW7XTF/tCxh1O -+tIrn+zvtaNMm+ISbdvDHCnOcDjmgDoKKy9S8S6Do1wtvqmt6bYzsgdY7q6SJiuS -MgMQcZBGfY1qUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF -FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF -FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF -FFABRRRQAVz/AIk8ceGvCPljXNXgtJJMFYcNJIQc4bYgLbflI3YxkYzmjxZ400Lw -Vpy3mtXflebuEEKKXkmZRkhVH4DJwoJGSMivnTxl4Z8X/EB5/Htr4TktLS6SDZbw -ytNPOu3YJQnUj5V6KvylSAw3PQB29/8AHy+1zVLPSfAnh2S5vLhwoOoDlj82VCI2 -AAMNvL4ADZAAzXsmh2+o2mh2UGr3v23UliX7TOAoDyHltoVVG0HIHAOAM85Ncn8M -/hnY+ANLLuY7nWrhALq7A4A6+XHnkID36sRk9AF7ygDzf41zXlx4EuNDsNF1XUbr -Utux7G1MyReXLG58wjlcjOODnBrj/B2j6jL8XNI1a1s/GUlnFaTR3lx4qtlLxLtb -b5Up9WYDaoDD5uSrNj3iigDxf/hMLz/haf8AwlH/AAg/jL7D/Yn9n+X/AGSfM8zz -/MzjdjbjvnOe1SfFZtc1PWdHNrpF3Popsmljnh8ORalOJmYZR45sGIbQh6Kc5BBx -8vslFAHgfhNtS0n4UeNtKufDfiD7Xe3E4tUXRmiM32iLYpEacIF2EsB8qgqASSBR -4A0G58I+ILCDxD4Ru9bfUreyuLbVhYPLJpr4VRDJv4iEeOqkEBVyDwE98ooA+ZNZ -8JeKbbVNYg16DWdQnvLiVhfWvhi21EzxH5FcSl90JwvEYI2DGMZr2/4aWs1j8PNI -tJ21IvCkiD+0rcwThRIwUNGWbaAuAoyflA6dB1lFAGXrniPSPDVvbXGs30dnBcXC -20ckgO3zGBIBIGFGFJ3HAGOSK0IJ4bq3iuLeWOaCVA8ckbBldSMggjggjnNU9Z0P -S/EOnPYavYQXtq2TsmTO0kEblPVWwThhgjPBryufwV43+G1vLd+BdZk1bSYULtou -oqZGAA/5Z7cZO5nchPLJwB854oA9korh/B3xS0Lxdef2UVn0zXU3LLpt4hVwyAbw -p6Ng7hg4b5WJUAV3FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF -FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF -FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUVz/izx -poXgrTlvNau/K83cIIUUvJMyjJCqPwGThQSMkZFAHQV5P4i+LFxq2oyeGvhxZ/2z -q7xSFr1SBDalTgsC4Cv3wxITJTBfO2stNN8afGZEm1dpPDfg6ZIporOMrJLd4bOS -2AcHkgsNv+rIRvvV6xoHhzSPC2lrpui2MdpaBy+xSWLMepZmJLHoMkngAdAKAOL8 -J/Ce307WG8S+Kbz+3fEskq3H2iQERwOFxhFzhsHoSBgKm1UxXpFFFABRRRQAUUUU -AFFFFABRRRQAUUUUAFFFFAHJ+M/hz4c8dIjavbSLdxJsivLd9kqLuBxnBDDrwwON -zYwTmuHGpeP/AIWXDrrC3fi/wuqKft0Y/wBItuS0jMCWYgAN94lcbPnTla9kooAw -/C/i7RfGOlpf6PexzAorSwFgJYCcjbImcqcq3scZBI5rcrzPxR8G9IvnfVfC0knh -3Xo0YwTWMhhiLbQuGVfuAqCMpj7xJDdDn2fxQ1rwdqkGi/EzTo7QSI/kazaAvFOE -wMlFBOSQScYI3plFBzQB65RXPt458LLqOmWA16xkuNT3fYxFKHWXBK/eXKjLAqMk -ZYEDJGK6CgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA -KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA -KKKKACiiigAqnqt+2maXcXyWN3fGBN/2e0VWlcd9oYgE45xnJxgZOAblcf8AE7Vd -Y0vwNe/2BYX15qd1/osP2KF5Hh3A7pPkIZcKGww6MVoAj8D/ABP0Hx9cXlvpcd3B -PaortHdhFZ1JIyoV2JAIAJ7bl9aku/GWo2PxH07wxc6BssdS837JqX2xT5nlw+Y/ -7oLkYJ28kZ6ivLLHTPEfw88S+FdYtLfWdetH0z7Pc2dtoP2d7W1Y71Rtu5TLvZnI -yGymGbDZro/FfiW8k+Jnh3UYfB3iua10CW+iuJItMLCbzEEatEQcMuRnJxwRQB6Z -4h1y28PaNPf3E1ojqjCCO6ukt1nl2krGHc4BbHXtye1WNJvW1LRrG/eKOJ7m3jma -OOZZlUsoOA68OBn7w4PUVwfxB1q31fwCsR8H65qU2p2k5tov7JLvYzhCqtKrcxsC -5wwBzhiCRgk8J6pf618PG8MW+k65omr2uiLaxXOoWclvGZRF5e5JBnGGwezYOQDg -4AOsn8aeFbW4lt7jxLo0M8TlJI5L+JWRgcEEFsgg8Yq5qeu6Ponlf2tqtjYedny/ -tdwkW/GM43EZxkdPUV4fYabo48IW3hnUPhLrjazFshluILJAk8ySA5N4eVjcj5mH -CqxCnABpnjbw34ph8eavqF/FqWo2d26iwmt/DttqoWJRny9jtmEKX25wPMIZjzQB -7/BPDdW8VxbyxzQSoHjkjYMrqRkEEcEEc5qSvO/gxpk2j+CprKX+2Qkd7IYk1axN -o6KVQ4RN7/JuLHIIyS3Hc7nxC8LXHjPwXfaJa332Oaba6sygpIVIYI/BIUkDleRg -HkZUgHH+IvixcatqMnhr4cWf9s6u8Uha9UgQ2pU4LAuAr98MSEyUwXztrQ8J/Ce3 -07WG8S+Kbz+3fEskq3H2iQERwOFxhFzhsHoSBgKm1UxWX8G/EVjptvJ4C1DS49E8 -Q2DsZID/AMvhxkyAknc+3BIyQVAK/LwvrlABRRRQAUUUUAFFFFABRRRQAUUUUAFF -FFABRRRQAUUUUAFFFFABVe+sLPU7OSzv7SC7tZMb4Z4xIjYIIyp4OCAfwqxRQB8c -eMPh54p0u8uNRfwdPpmmvvkSG1lN2lvGgGd8gZiOOSzYB5wABger/B74w/2r9n8M -+Jrn/iYcR2V9I3/Hz6RyH/np6N/F0Pzff9wrj/H9h4G/sd9R8aWlj9n+SAXMsZ87 -725URk/edcnC9t2eM0AdhRXl/gXx1qnjrxGBotlPZeEdNiCvc3i+ZPdS7MCIuXOM -bg5I3N8g3MPMxXqFAHn9/wDFjTv9JXw9oeueJPJ3x/aNMsmktvOGf3Zl/wC+TuUM -MMCM1n3/AMVrhYPCev2OnQJ4V1i7NpdXN9MI5oH3sgJAJVVGxnzlsgEHZwTn+Dtc -134caDB4V1rwVrl59i3mC90eIXcdwrSyMScbdnUYBO4jkheMx+Pr6bVPD/hC2XwR -rPkQ6nDfzabDpxmWKzjLosbhRsDshB8r+HkNjjIB6xpurabrNu1xpeoWl9ArlGkt -ZllUNgHBKkjOCDj3Fc34N8Zaj4j1jW9J1bQP7GvtJ8jzIvti3G7zVZhyqgDgA8E9 -e2K5PwncL4a+IfjloPCWs2mmzpG1kttpTLFKbaNw6ptG3LnJToGz1BIBr+G/FlzZ -fEPxPrF14N8XRWetPZLC50hyYRFGUdpACTjJz8u44HTPFAHqmp67o+ieV/a2q2Nh -52fL+13CRb8YzjcRnGR09RVj7fZ/2d/aP2uD7D5Xn/afMHl+Xjdv3dNuOc9MV5P4 -j07+yfihqes+IPBl94p0y/tIo9Pe0tvtv2PYAHjMTfKu5stu+uM7nxzk/gnxoPhl -ZpaW93aWJ1iTUG0JQt08FmQrorJKR5hRkY+TzvMgLAMCAAe56Zruj635v9k6rY3/ -AJOPM+yXCS7M5xnaTjOD19DWhXz/APDvRL23+Jmm6lJbeI7X91LDIH8Lx6bbOmxy -BI0Um372CMqckKOwx9AUAFFZ+t6V/bejz6d9vvrDztv+k2E3lTJhg3ytg4zjB9ia -4/8A4VZ/1Pvjn/wcf/YUAegUV5//AMKs/wCp98c/+Dj/AOwo/wCFWf8AU++Of/Bx -/wDYUAegUV5//wAKs/6n3xz/AODj/wCwo/4VZ/1Pvjn/AMHH/wBhQBqJ8TfBbazd -6S/iC0t7y0d0mW63QKrI21gHcBSc9gTnkjgV1EE8N1bxXFvLHNBKgeOSNgyupGQQ -RwQRzmvli6+CfjTVvFWofZ7WQWD3twI9R1O5XdIquwDuBlyWxnOzncD0Oa7fwl8A -dS0a4ivbvxhd2M7IyXEejFomK54AmJBxkISCnbHoaAPdK5vxn4ytvBGlpqd/pupX -VmX2SS2UaOIScbd+51IBJwDyM8HBIzsaVYNpml29i99d3xgTZ9ou2VpXHbcVABOO -M4ycZOTkng/jXNeXHgS40Ow0XVdRutS27HsbUzJF5csbnzCOVyM44OcGgC5ofxV0 -3XPEFhow0LxBYT3zzJBJf2ixRs0IYyDO8nKlSpABweDirmleMtRu/iHe+FNR0D7B -5NpJe2919sWX7RCJRGrbAvy7uTgnIxjFcH8OJtS0fxPa6XaeH/ED2d9e3t1eapr2 -lNFPErxoVQShyCWaEb2IG47eAak/4TC8/wCFp/8ACUf8IP4y+w/2J/Z/l/2SfM8z -z/MzjdjbjvnOe1AHrmpatpujW63GqahaWMDOEWS6mWJS2CcAsQM4BOPY1H/buj/2 -P/a/9q2P9mf8/v2hPJ+9t+/nb97jr14rxv4l6J4kv/GMOuompX2gy2SLaRRaFDft -au2CyG2mYFSdm4yFQRkIelUPD+lzaX8PvHFpNpHie9Opoot7G48PG3UXDiTDxRI7 -qApCMSAoXYgGTtFAHt+m+JdB1m4a30vW9Nvp1Qu0drdJKwXIGSFJOMkDPuKjvvFn -hvTLySzv/EGlWl1HjfDPexxuuQCMqTkZBB/GvH9Esv7P8R/DK6tPBGq2cltaSRap -PHpXlkyOn2cNKw9GVnJbkI4bqSKyPHlh4n1PxH4k+1aDfGR5ZIrQ2XhSC7SaEIFi -Y3RPmKxGMkZKdsEbQAfR9Fc38P3mb4faAlxZXdlPBZR28kF3EY5FaMeWSVPIBK5H -qCDXSUAFFcfrfgD+29Yn1H/hLfFdh523/RrDUvKhTChflXacZxk+5NZ//CrP+p98 -c/8Ag4/+woA9Ark0+JvgttZu9JfxBaW95aO6TLdboFVkbawDuApOewJzyRwKy/8A -hVn/AFPvjn/wcf8A2FeKXXwT8aat4q1D7PayCwe9uBHqOp3K7pFV2AdwMuS2M52c -7gehzQB9TwTw3VvFcW8sc0EqB45I2DK6kZBBHBBHOakrwvwl8AdS0a4ivbvxhd2M -7IyXEejFomK54AmJBxkISCnbHoa9o0qwbTNLt7F767vjAmz7RdsrSuO24qACccZx -k4ycnJIBl+K/GOl+D7O3lv8Az57i6lENrZWieZPcOSBhEyM4yM89wOpAOHpHxPh1 -PxZZaDceGfEGlvfoxtZtRtRCJGRWeQYJ6BQuCM5LcgYBJ48sNXi8T+FfFOm6ZJqc -Givdfa7WBwJzHLGFLRqeHICn5Qck7QOpI5PTtV+IfiTxp9msr7xHpekT/aZXfUfD -9vbizXB8lVZt3m4YqCOGIBPqVAPVJvEug22qDS59b02LUC6oLR7pFlLNjaNhOcnI -wMc5FWNS1bTdGt1uNU1C0sYGcIsl1MsSlsE4BYgZwCcexr5gn8H+IVsJdM17TPEB -vHcvcy2nha3vmZmffkXgkDuTkZOeMlegr0PXNKvLfWPCGv614d1XxTo0OiJaSWrQ -GW5guiu4zS2zEgswwrZJwRycqmQD1yHVtNudLOqQahaS6eEZzdpMrRBVzuO8HGBg -5OeMGvN/DnxfvPFOs2drpvhu0NpdXBRHk123W4WIMQ0ht/v5CgttGeBwSOar+DdK -Wx0vxjrGo+E7u28N6hcRzWXh17Vp5SUyGb7NghS7bCB0XaOQiq1U/hAlnplno2lX -/gHVbTXY/P36xPo4jRcmRhmY/MMoQnTvjpQB0njP4pxeGfEqaDYafaaheLb/AGi4 -NxqsNkkIJAVd0nBcj5tvBwVIyCcdh4c1O71nw/Z6je2MdjPcIX8iO6S5ULk7SJE+ -Vgy4bI9a8j1yPS7b4v3upS/DrVdU0kae1tJ5Gg+Yk12Zt7TAMAG4JXf1PbIIJ9k0 -l4ZNGsXt7KSxga3jMdpJEImgXaMIUHClRxjtjFAFyiiigAooooAKKKKACiiigAoo -ooAKKKKACiiigAooooA4f4ifDu38a2cV3aTfYPENjh7G/QlSpB3BGI5255BHKnkd -w2f8O/iJcaveS+FPFcP2DxZY5SSNwFF2AM71xxuxyQOCPmX5chfSK4f4ifDu38a2 -cV3aTfYPENjh7G/QlSpB3BGI5255BHKnkdwwB3FFeb/Dv4iXGr3kvhTxXD9g8WWO -UkjcBRdgDO9ccbsckDgj5l+XIX0igAooooAKKKKACiiigAooooAKKKKACiiigAoo -ooAKKKKACiio554bW3luLiWOGCJC8kkjBVRQMkkngADnNAEd/N9n065n+0wWvlxO -/n3AzHFgE7nGV+UdTyOB1HWviTUrvWvF3ipYrjUZNY1C5uBbQSs5CyFnO0JvC7EL -NkDCgZ6Cvc76+1T4465JpWlST2HgWxlAu7wLte9cYIVQfwIU/d4dhnYg9csPDei6 -Xb6dBZ6XaRJpqMlmfKBaAMMNtY8gt/Ec5bvmgCn4L8J2fgrwva6LZv5vlZeacoEa -aRjlmIH4AZyQoUZOM10FFFABRRRQAVy/j/xZceCfC765BpX9pRwyok6faBD5aMcB -8kHPzFRgD+LPQGuoqnq2mw6zo19pdw0iwXtvJbyNGQGCupUkZBGcH0NAElhfW+p6 -dbX9nJ5lrdRJNC+0jcjAFTg8jII61Yryv4H6lNDomreD7tYzd+G72S3aSEHY6s7n -IJOSd6ydhxt75r1SgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii -gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii -gAooooAKKKKACiiigAooooAKKKKAOH+Inw7t/GtnFd2k32DxDY4exv0JUqQdwRiO -dueQRyp5HcNn/Dv4iXGr3kvhTxXD9g8WWOUkjcBRdgDO9ccbsckDgj5l+XIX0iuH -+Inw7t/GtnFd2k32DxDY4exv0JUqQdwRiOdueQRyp5HcMAdxRXm/w7+Ilxq95L4U -8Vw/YPFljlJI3AUXYAzvXHG7HJA4I+ZflyF9IoAKKKKACiiigAooooAKKKKACiii -gAooooAKKKjnnhtbeW4uJY4YIkLySSMFVFAySSeAAOc0AE88Nrby3FxLHDBEheSS -RgqooGSSTwABzmvE76+1T4465JpWlST2HgWxlAu7wLte9cYIVQfwIU/d4dhnYgL6 -+1T4465JpWlST2HgWxlAu7wLte9cYIVQfwIU/d4dhnYg9k0rSrHQ9Lt9M0y2jtrO -3TZFEnRR/MknJJPJJJOSaADStKsdD0u30zTLaO2s7dNkUSdFH8ySckk8kkk5Jq5R -RQAUUUUAFFFFABRRRQB4/wCLv+KI+NuieLW/caRrMX9n6jMOQJMYUuz/ACxrxCcg -g4ic4659gri/ir4XXxZ8PtRtFjke7tkN5aCNGdjLGCQoUEbiylk7/ezgkCrHw28U -N4v8B6bqs8kbXmww3e11J81DtJYAAKWAD7cDAcdsGgDrKKKKACiiigAooooAKKKK -ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK -ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA4f4i -fDu38a2cV3aTfYPENjh7G/QlSpB3BGI5255BHKnkdw2f8O/iJcaveS+FPFcP2DxZ -Y5SSNwFF2AM71xxuxyQOCPmX5chfSK8H/aH0XVNR+wXtl4b8+1tIi0+qw/PIo+Ym -NlU5EahSxZgQC3BXncAe4WN/Z6nZx3lhdwXdrJnZNBIJEbBIOGHBwQR+FWK+aPgD -46TR9Yk8K3xxa6nL5lrIWVVjn24IOcE7wqqOT8yqAPmJH0vQAUUVX+32f9o/2d9r -g+3eV5/2bzB5nl5279vXbnjPTNAFiiiigAooooAKKKKACiio554bW3luLiWOGCJC -8kkjBVRQMkkngADnNABPPDa28txcSxwwRIXkkkYKqKBkkk8AAc5rxO+vtU+OOuSa -VpUk9h4FsZQLu8C7XvXGCFUH8CFP3eHYZ2IC+vtU+OOuSaVpUk9h4FsZQLu8C7Xv -XGCFUH8CFP3eHYZ2IPZNK0qx0PS7fTNMto7azt02RRJ0UfzJJySTySSTkmgA0rSr -HQ9Lt9M0y2jtrO3TZFEnRR/MknJJPJJJOSauUUUAFFFFABRRRQAUUUUAFFFFABXj -/gr/AIoX4w6/4Qn+Sx1r/iZaWqfLGv3iyLGuQvAZcnbkQDjlQPYK8n+NtjcaXZ6P -460mPbqeh3aCSQMFDQOcbXxhmXeVXaD0lfjkkAHrFFV7C+t9T062v7OTzLW6iSaF -9pG5GAKnB5GQR1qxQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR -QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR -QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB5X4z+CWkaw6al4YaPw/rEL+aj26lYn -ZVGz5VI8shlU7kHGWJDEjHcaXbavf+DlsdekktdUe3e2ubizmG4sMp50bBQFLACQ -cDbuAxxW5Ve/tft2nXNn9ont/PieLzrd9kke4EbkbswzkHsaAPC/D+ja1ffB/wD4 -TZPHHiePVre3uLxY5L4y25MEj/KY26grHjkkZPII4NzXEv7/AMY/DXxPoVnpUHib -WdPmlne5EiwSEWyH5gpLcK7gHr90EkAY6SD4JaLDYRaY/iHxPPpKOGbTZNQAt3Af -ftKKg4Lc8YOeQQea3L/4d2F/4o0rXf7V1W2bSdgsbK1ljitoEUAFFQJnawGG55HG -cAAAGfonjq/ufA3iTUtaOlWGpaJd3VjJNuk+yNLGBtbH39pZlXAyx7ckKOb8FfFz -VNd8b6doV3ceH9QgvkmHmaXFdRNAyIXBbz1AYEKRgfXIxg9JZfCPR7XR9a0mbWNc -vbHWPnuoru5Rv324MJgQgIkyAckkNgbg2BgtvhPZwa5purzeKvFd7dadL5tv9r1A -SAZxuXlM7WAwwBGRxQBl6r4t+I1t4/uPC2naV4fvHlt/tlpLvkQQW5n2B5ssNxCg -5VBnLAjOCpk1nxJ8R9M1zw1oaR+FGv8AV4rjc5W4MSyRbnODnIUxmPHBO7d0GK0L -/wCE9nfeIbnXP+Eq8V299PvXfb6gE8uNnL+Uh2ZEYJ4XOBWpqfgK21bxLomvXWta -z9s0hFWERzoiSEHLs6hMZcfK+3aCABgCgDg/Cvxe1vUrG+l1xNDslbRJdUsrkeas -cZSZoAsq5YtucDAQ5xgDJbAk8FfFzVNd8b6doV3ceH9QgvkmHmaXFdRNAyIXBbz1 -AYEKRgfXIxg6i/Arw35EdvLquuS28Vo9msRuI0Xy2dpADsjBbEjeYNxI3BcggYrQ -tvhPZwa5purzeKvFd7dadL5tv9r1ASAZxuXlM7WAwwBGRxQB6BXz/wDEfxV/wlHx -FHgXWtT/AOEc8O2sqfapHOXvGO1lyVyqqdwI3EKv3m5AQfQFZ+s6HpfiHTnsNXsI -L21bJ2TJnaSCNynqrYJwwwRng0AGh2Ol6dodla6JHBHpiRKbYQNuQoeQwbndnOd2 -TnOcnNaFeT3Pwj1Tw9uufh74rvtKk815fsF5J5toxbC9MHGFzyyuTheQRmo4Pit4 -j8L3EUHxH8KyadBO4Eeo2A8yBNxwFYBmGQFkY4YtgDCd6APXKKx/D3irQvFdmbrQ -9TgvY1++EJDx5JA3IcMudpxkDOMjitigAooooAKKKKACiiigAooooAKp6tpsOs6N -faXcNIsF7byW8jRkBgrqVJGQRnB9DVyigDyv4H6lNDomreD7tYzd+G72S3aSEHY6 -s7nIJOSd6ydhxt75r1SvF/G99b/D3426N4rnk8jTNYtHtdQMamR2KADcVPRRm3Py -c/u24Ofm9Y0TW9O8R6PBq2k3H2ixn3eXLsZN21ip4YAjkEcigDQooooAKKKKACii -igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii -igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii -igAooooAKKKKACiiigAooooAKKKKACiiigAooooA871v4N+HL6//ALU0WS78Oaoi -OI7jSpPKUMU2glBwAB1CFN25snnNYf8AaHxa8C/ubrToPGGkQdLmAlbtk+4ikD5i -wwrMdkn3jlz1HsFFAHD+GPi34O8VSw21rqf2W+m4W0vV8pyd20KDyjMSRhVYk56c -HHcVzfivwH4c8Z25TWdOjknCbY7uP5J4+GxhxyQCxO05XPJBrh5vBfj/AMDuJ/BP -iCTWtPRFQaPrD7iqqoVQjEgADczYUx8Ko+bpQB65RXlem/Gi00+4bS/HmlXfhzVI -kJZmieSCbBC7k2gtgsHxgMuF++a9Msb+z1OzjvLC7gu7WTOyaCQSI2CQcMODggj8 -KALFFFFABRRRQAUUUUAfP/7QPgD/AJnTTo/7sephpf8AdSJ1U/gpwf7px941ufs3 -zwt4F1O3WWMzpqbO8YYblVoowpI6gEqwB77T6V7BPBDdW8tvcRRzQSoUkjkUMrqR -ggg8EEcYrzf4deCz4E8a+KbCJJDp9+kF1YusMmxIw0oMTOcjeu5RgsSwIb1AAPTK -KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK -KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK -KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAr -31hZ6nZyWd/aQXdrJjfDPGJEbBBGVPBwQD+FeZ3nwaXSXnvvAniDUvD94zpILfz2 -ktZCinarg/MQW5JYuACw2kHFeqUUAeP/APCxPHPgj/kffDH2nTE/d/2rpWG+78u9 -1ztG9imM+V1OAfuiSP8AaC8LnxZNp0qSLo4TMWrLvYM20HDRbA6jO5cjPIHGDkeu -V88az+zjrEu+6s/FMF/fTSl5jfQPFuzksxcM5LZx1HOSc+oB9BwTw3VvFcW8sc0E -qB45I2DK6kZBBHBBHOakrw/wj4S+KPw22/ZvsPiHTGzG2lR37J5edzB0aVVVPmPO -M7t3I6MvsF9Zf25oclrM99p7XMQyYJ/KngY4PDoSAwPoSpxjkHkA0KK+YPAq+JPG -9wNLi8WeK7O/fTxeLdT6jIIDtuvLkKJ1kXyyMfMv7xGBODx6n408W+OtA8Z2OlaP -pWjalb6qkw0+Eu6T7o4gzGRmYIAGbOB1UYyCc0AemUVwer+I/EvhbwHe6l4kvvDF -pqwuFS1dRcNaspK8MoBkZ8eYcKDwAegNY/w2+J2oeLfFV3ot7Jo12iWX2uO60tLi -NVIcIUZZgCT8wORgDHfPAB6pRXibfEn4g2Wia1r15Z+GJdP0PUzp97DD9oSWVldE -byySQAd4wT7/AC9j2ninxT4gj8W2XhTwpY2MupyWhv7i51JmEEUAYoOEO4sXAHHT -I4OSVAO4org9Kv8A4lXNv4gtb2x8Pw6haPAmn3AWcWs5YBpc5O8hVIAIAG7I5wcS -fCC4iu/hbo08NlBZRt5+IIC5RMTyDguzNz15J6+nFAHcUV4f4q+LnivRvEOo2EVr -odj5V2YLK01OG5Sa5j37BMJPlhEbHccllAAPJxk+4UAFFFFABRRRQAUUUUAFFFFA -BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA -BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA -BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVn63pX9t6PPp32++sPO2/6TYTe -VMmGDfK2DjOMH2JrQooA5PwZ4CtvA6PBp+tazc2bJtWzvZ0kijO4tuQBAVOS2cHB -zyCQCKfiH4ZWfiPxGNcm8R+I7S6j/wCPdLO+EaW2UCN5QKEpuA+bB5ya7iigDl9V -8D2et+F7LRNR1TVZmsZY57fUftAW7SRCdr7woBYAkZKk9/vfNWXpfwuttK8QLrie -KfE9xqCW72yy3d6k3yMDwd0fIVjvAORuAJBrvKKAPN/+FM6O2h6hpEniDxHJa6hd -peXO+8QmSRd2SfkwdxYFsgklEOflrY1r4c6XrkWkyS3+q22p6ZEIYdWtbnZeOm0q -Q8mDuzkk8dScY3MD2FFAHDp8M7ePTprdfFPisXU0sbyah/aZ+0siBwsW7bjywZHb -GOp68CpPCXw4tvBlxE2neIfEEtpGjILC6uke3wxycJsG07ucrg5z2JB7SigDzf8A -4UtoXkfYf7b8R/2N5vmf2R/aJ+ybd+/Zt2525993fOea9IoooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooA//2Q== -=ao7I ------END PGP ARMORED FILE----- diff --git a/doc/gpl.texi b/doc/gpl.texi new file mode 100644 index 000000000..00108d230 --- /dev/null +++ b/doc/gpl.texi @@ -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 deleted file mode 100644 index 615f6f0ac..000000000 --- a/doc/highlights-1.4.txt +++ /dev/null @@ -1,202 +0,0 @@ -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/mksamplekeys b/doc/mksamplekeys deleted file mode 100755 index 301ab9432..000000000 --- a/doc/mksamplekeys +++ /dev/null @@ -1,12 +0,0 @@ -#/bin/sh -# Generate a samplekeys.asc - -keys="5B0358A2 57548DCD 99242560 CA57AD7C B2D7795E 1CE0C630" - -for i in $keys; do - gpg --list-keys $i | awk ' { print " " $0 }' -done -echo -gpg --export-options export-minimal --export -a $keys - - diff --git a/doc/qualified.txt b/doc/qualified.txt new file mode 100644 index 000000000..083550734 --- /dev/null +++ b/doc/qualified.txt @@ -0,0 +1,115 @@ +# This is the list of root certificates used for qualified +# certificates. They are defined as certificates capable of creating +# legally binding signatures in the same way as a handwritten +# signatures are. Comments like this one and empty lines are allowed +# Lines do have a length limit but this is not a serious limitation as +# the format of the entries is fixed and checked by gpgsm: A +# non-comment line starts with optional white spaces, followed by +# exactly 40 hex character, white space and a lowercased 2 letter +# country code. Additional data delimited with by a white space is +# current ignored but might late be used for other purposes. +# +# Note: The subversion copy of this file carries a gpg:signature +# property with its OpenPGP signature. Check this signature before +# adding entries: +# svn pg gpg:signature qualified.txt | gpg --verify - qualified.txt + + +#******************************************* +# +# Belgium +# +# Need to figure out a reliable source. +#******************************************* + + + +#******************************************* +# +# Germany +# +# The information for Germany is available +# at http://www.bundesnetzagentur.de +#******************************************* + +#Serial number: 32D18D +# Issuer: /CN=6R-Ca 1:PN/NameDistinguisher=1/O=RegulierungsbehÈorde +# fÈur Telekommunikation und Post/C=DE +# Subject: /CN=6R-Ca 1:PN/NameDistinguisher=1/O=RegulierungsbehÈorde +# fÈur Telekommunikation und Post/C=DE +# validity: 2001-02-01 09:52:17 through 2005-06-01 09:52:17 +# key type: 1024 bit RSA +# key usage: certSign crlSign +#[checked: 2005-11-14] +EA:8D:99:DD:36:AA:2D:07:1A:3C:7B:69:00:9E:51:B9:4A:2E:E7:60 de + + +#Serial number: 00C48C8D +# Issuer: /CN=7R-CA 1:PN/NameDistinguisher=1/O=RegulierungsbehÈorde +# fÈur Telekommunikation und Post/C=DE +# Subject: /CN=7R-CA 1:PN/NameDistinguisher=1/O=RegulierungsbehÈorde +# fÈur Telekommunikation und Post/C=DE +# validity: 2001-10-15 11:15:15 through 2006-02-15 11:15:15 +# key type: 1024 bit RSA +# key usage: certSign crlSign +#[checked: 2005-11-14] +DB:45:3D:1B:B0:1A:F3:23:10:6B:DE:D0:09:61:57:AA:F4:25:E0:5B de + + +#Serial number: 01 +# Issuer: /CN=8R-CA 1:PN/O=Regulierungsbehörde für +# Telekommunikation und Post/C=DE +# Subject: /CN=8R-CA 1:PN/O=Regulierungsbehörde für +# Telekommunikation und Post/C=DE +# validity: 2004-11-25 14:10:37 through 2007-12-31 14:04:03 +# key type: 1024 bit RSA +# key usage: certSign +# policies: 1.3.36.8.1.1:N: +# chain length: unlimited +#[checked: 2005-11-14] +42:6A:F6:78:30:E9:CE:24:5B:EF:41:A2:C1:A8:51:DA:C5:0A:6D:F5 de + + +#Serial number: 02 +# Issuer: /CN=9R-CA 1:PN/O=Regulierungsbehörde für +# Telekommunikation und Post/C=DE +# Subject: /CN=9R-CA 1:PN/O=Regulierungsbehörde für +# Telekommunikation und Post/C=DE +# validity: 2004-11-25 14:59:11 through 2007-12-31 14:56:59 +# key type: 1024 bit RSA +# key usage: certSign +# policies: 1.3.36.8.1.1:N: +# chain length: unlimited +#[checked: 2005-11-14] +75:9A:4A:CE:7C:DA:7E:89:1B:B2:72:4B:E3:76:EA:47:3A:96:97:24 de + + +#Serial number: 2A +# Issuer: /CN=10R-CA 1:PN/O=Bundesnetzagentur/C=DE +# Subject: /CN=10R-CA 1:PN/O=Bundesnetzagentur/C=DE +# validity: 2005-08-03 15:30:36 through 2007-12-31 15:09:23 +# key type: 1024 bit RSA +# key usage: certSign +# policies: 1.3.36.8.1.1:N: +# chain length: unlimited +#[checked: 2005-11-14] +31:C9:D2:E6:31:4D:0B:CC:2C:1A:45:00:A6:6B:97:98:27:18:8E:CD de + + +#Serial number: 2D +# Issuer: /CN=11R-CA 1:PN/O=Bundesnetzagentur/C=DE +# Subject: /CN=11R-CA 1:PN/O=Bundesnetzagentur/C=DE +# validity: 2005-08-03 18:09:49 through 2007-12-31 18:04:28 +# key type: 1024 bit RSA +# key usage: certSign +# policies: 1.3.36.8.1.1:N: +# chain length: unlimited +#[checked: 2005-11-14] +A0:8B:DF:3B:AA:EE:3F:9D:64:6C:47:81:23:21:D4:A6:18:81:67:1D de + + +#******************************************* +# +# End of file +# +#******************************************* diff --git a/doc/samplekeys.asc b/doc/samplekeys.asc deleted file mode 100644 index 21c36d89e..000000000 --- a/doc/samplekeys.asc +++ /dev/null @@ -1,461 +0,0 @@ - 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/scdaemon.texi b/doc/scdaemon.texi new file mode 100644 index 000000000..6ddb55679 --- /dev/null +++ b/doc/scdaemon.texi @@ -0,0 +1,601 @@ +@c Copyright (C) 2002 Free Software Foundation, Inc. +@c This is part of the GnuPG manual. +@c For copying conditions, see the file gnupg.texi. + +@node Invoking SCDAEMON +@chapter Invoking the SCDAEMON +@cindex SCDAEMON command options +@cindex command options +@cindex options, SCDAEMON command + +@c man begin DESCRIPTION + +The @command{scdaemon} is a daemon to manage smartcards. It is usually +invoked by gpg-agent and in general not used directly. + +@c man end + +@xref{Option Index}, for an index to GPG-AGENTS's commands and options. + +@menu +* Scdaemon Commands:: List of all commands. +* Scdaemon Options:: List of all options. +* Card applications:: Description of card applications. +* Scdaemon Examples:: Some usage examples. +* Scdaemon Protocol:: The protocol the daemon uses. +@end menu + +@c man begin COMMANDS + +@node Scdaemon Commands +@section Commands + +Commands are not distinguished from options execpt for the fact that +only one one command is allowed. + +@table @gnupgtabopt +@item --version +@opindex version +Print the program version and licensing information. Not that you can +abbreviate this command. + +@item --help, -h +@opindex help +Print a usage message summarizing the most usefule command-line options. +Not that you can abbreviate this command. + +@item --dump-options +@opindex dump-options +Print a list of all available options and commands. Not that you can +abbreviate this command. + +@item --server +@opindex server +Run in server mode and wait for commands on the @code{stdin}. This is +default mode is to create a socket and listen for commands there. + +@item --multi-server +@opindex multi-server +Run in server mode and wait for commands on the @code{stdin} as well as +on an additional Unix Domain socket. The server command @code{GETINFO} +may be used to get the name of that extra socket. + +@item --daemon +@opindex daemon +Run the program in the background. This option is required to prevent +it from being accidently running in the background. + +@item --print-atr +@opindex print-atr +This is mainly a debugging command, used to print the ATR +(Answer-To-Reset) of a card and exit immediately. + +@end table + + +@c man begin OPTIONS + +@node Scdaemon Options +@section Option Summary + +@table @gnupgtabopt + +@item --options @var{file} +@opindex options +Reads configuration from @var{file} instead of from the default +per-user configuration file. The default configuration file is named +@file{scdaemon.conf} and expected in the @file{.gnupg} directory directly +below the home directory of the user. + +@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 +@var{HKCU\Software\GNU\GnuPG:HomeDir}. + +@item -v +@item --verbose +@opindex v +@opindex verbose +Outputs additional information while running. +You can increase the verbosity by giving several +verbose commands to @command{gpgsm}, such as @samp{-vv}. + +@item --debug-level @var{level} +@opindex debug-level +Select the debug level for investigating problems. @var{level} may be +one of: + + @table @code + @item none + no debugging at all. + @item basic + some basic debug messages + @item advanced + more verbose debug messages + @item expert + even more detailed messages + @item guru + all of the debug messages you can get + @end table + +How these messages are mapped to the actual debugging flags is not +specified and may change with newer releaes of this program. They are +however carefully selected to best aid in debugging. + +@quotation Note +All debugging options are subject to change and thus should not be used +by any application program. As the name says, they are only used as +helpers to debug problems. +@end quotation + + +@item --debug @var{flags} +@opindex debug +This option is only useful for debugging and the behaviour may change at +any time without notice. FLAGS are bit encoded and may be given in +usual C-Syntax. The currently defined bits are: + + @table @code + @item 0 (1) + command I/O + @item 1 (2) + values of big number integers + @item 2 (4) + low level crypto operations + @item 5 (32) + memory allocation + @item 6 (64) + caching + @item 7 (128) + show memory statistics. + @item 9 (512) + write hashed data to files named @code{dbgmd-000*} + @item 10 (1024) + trace Assuan protocol + @item 11 (2048) + trace APDU I/O to the card. This may reveal sensitive data. + @end table + +@item --debug-all +@opindex debug-all +Same as @code{--debug=0xffffffff} + +@item --debug-wait @var{n} +@opindex debug-wait +When running in server mode, wait @var{n} seconds before entering the +actual processing loop and print the pid. This gives time to attach a +debugger. + +@item --debug-ccid-driver +@opindex debug-wait +Enable debug output from the included CCID driver for smartcards. +Using this option twice will also enable some tracing of the T=1 +protocol. Note that this option may reveal sensitive data. + +@item --debug-disable-ticker +@opindex debug-disable-ticker +This option disables all ticker functions like checking for card +insertions. + +@item --debug-allow-core-dump +@opindex debug-allow-core-dump +For security reasons we won't create a core dump when the process +aborts. For debugging purposes it is sometimes better to allow core +dump. This options enables it and also changes the working directory to +@file{/tmp} when running in @option{--server} mode. + + +@item --no-detach +@opindex no-detach +Don't detach the process from the console. This is manly usefule for +debugging. + +@item --log-file @var{file} +@opindex log-file +Append all logging output to @var{file}. This is very helpful in +seeing what the agent actually does. + + +@item --pcsc-driver @var{library} +@opindex pcsc-driver +Use @var{library} to access the smartcard reader. The current default +is @file{libpcsclite.so}. Instead of using this option you might also +want to install a symbolic link to the default file name +(e.g. from @file{libpcsclite.so.1}). + +@item --ctapi-driver @var{library} +@opindex ctapi-driver +Use @var{library} to access the smartcard reader. The current default +is @file{libtowitoko.so}. Note that the use of this interface is +deprecated; it may be removed in future releases. + +@item --disable-ccid +@opindex 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 @var{number_or_string} +@opindex reader-port +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 --disable-keypad +@opindex disable-keypad +Even if a card reader features a keypad, do not try to use it. + + +@item --allow-admin +@itemx --deny-admin +@opindex allow-admin +@opindex deny-admin +This enables the use of Admin class commands for card applications +where this is supported. Currently we support it for the OpenPGP +card. Deny is the default. This commands is useful to inhibit +accidental access to admin class command which could ultimately lock +the card through worng PIN numbers. + +@item --disable-application @var{name} +@opindex disable-application +This option disables the use of the card application named +@var{name}. This is mainly useful for debugging or if a application +with lower priority should be used by default. + +@end table + +All the long options may also be given in the configuration file after +stripping off the two leading dashes. + + +@c man begin CARD APPLICATIONS + +@node Card applications +@section Description of card applications + +@command{scdaemon} supports the card applications as described below. + +@menu +* OpenPGP Card:: The OpenPGP card application +* NKS Card:: The Telesec NetKey card application +* DINSIG Card:: The DINSIG card application +* PKCS#15 Card:: The PKCS#15 card application +@end menu + +@node OpenPGP Card +@subsection The OpenPGP card application ``openpgp'' + +This application is currently only used by @command{gpg} but may in +future also be useful with @command{gpgsm}. + +The specification for such a card is available at +@uref{http://g10code.com/docs/openpgp-card-1.0.pdf}. + +@node NKS Card +@subsection The Telesec NetKey card ``nks'' + +This is the main application of the Telesec cards as available in +Germany. It is a superset of the German DINSIG card. The card is +used by @command{gpgsm}. + +@node DINSIG Card +@subsection The DINSIG card application ``dinsig'' + +This is an application as described in the German draft standard +@emph{DIN V 66291-1}. It is intended to be used by cards supporteing +the German signature law and its bylaws (SigG and SigV). + +@node PKCS#15 Card +@subsection The PKCS#15 card application ``p15'' + +This is common fraqmework for smart card applications. It is used by +@command{gpgsm}. + + + +@c +@c Examples +@c +@node Scdaemon Examples +@section Examples + +@c man begin EXAMPLES + +@example +$ scdaemon --server -v +@end example + +@c man end + +@c +@c Assuan Protocol +@c +@node Scdaemon Protocol +@section Scdaemon's Assuan Protocol + +The SC-Daemon should be started by the system to provide access to +external tokens. Using Smartcards on a multi-user system does not +make much sense expcet for system services, but in this case no +regular user accounts are hosted on the machine. + +A client connects to the SC-Daemon by connecting to the socket named +@file{/var/run/scdaemon/socket}, configuration information is read from +@var{/etc/scdaemon.conf} + +Each connection acts as one session, SC-Daemon takes care of +syncronizing access to a token between sessions. + +@menu +* Scdaemon SERIALNO:: Return the serial number. +* Scdaemon LEARN:: Read all useful information from the card. +* Scdaemon READCERT:: Return a certificate. +* Scdaemon READKEY:: Return a public key. +* Scdaemon PKSIGN:: Signing data with a Smartcard. +* Scdaemon PKDECRYPT:: Decrypting data with a Smartcard. +* Scdaemon GETATTR:: Read an attribute's value. +* Scdaemon SETATTR:: Update an attribute's value. +* Scdaemon WRITEKEY:: Write a key to a card. +* Scdaemon GENKEY:: Generate a new key on-card. +* Scdaemon RANDOM:: Return random bytes generate on-card. +* Scdaemon PASSWD:: Change PINs. +* Scdaemon CHECKPIN:: Perform a VERIFY operation. +* Scdaemon RESTART:: Restart connection +* Scdaemon APDU:: Send a verbatim APDU to the card +@end menu + +@node Scdaemon SERIALNO +@subsection Return the serial number + +This command should be used to check for the presence of a card. It is +special in that it can be used to reset the card. Most other commands +will return an error when a card change has been detected and the use of +this function is therefore required. + +Background: We want to keep the client clear of handling card changes +between operations; i.e. the client can assume that all operations are +done on the same card unless he call this function. + +@example + SERIALNO +@end example + +Return the serial number of the card using a status reponse like: + +@example + S SERIALNO D27600000000000000000000 0 +@end example + +The trailing 0 should be ignored for now, it is reserved for a future +extension. The serial number is the hex encoded value identified by +the @code{0x5A} tag in the GDO file (FIX=0x2F02). + + + +@node Scdaemon LEARN +@subsection Read all useful information from the card + +@example + LEARN [--force] +@end example + +Learn all useful information of the currently inserted card. When +used without the force options, the command might do an INQUIRE +like this: + +@example + INQUIRE KNOWNCARDP <hexstring_with_serialNumber> <timestamp> +@end example + +The client should just send an @code{END} if the processing should go on +or a @code{CANCEL} to force the function to terminate with a cancel +error message. The response of this command is a list of status lines +formatted as this: + +@example + S KEYPAIRINFO @var{hexstring_with_keygrip} @var{hexstring_with_id} +@end example + +If there is no certificate yet stored on the card a single "X" is +returned in @var{hexstring_with_keygrip}. + +@node Scdaemon READCERT +@subsection Return a certificate + +@example + READCERT @var{hexified_certid} +@end example + +This function is used to read a certificate identified by +@var{hexified_certid} from the card. + + +@node Scdaemon READKEY +@subsection Return a public key + +@example +READKEY @var{hexified_certid} +@end example + +Return the public key for the given cert or key ID as an standard +S-Expression. + + + +@node Scdaemon PKSIGN +@subsection Signing data with a Smartcard + +To sign some data the caller should use the command + +@example + SETDATA @var{hexstring} +@end example + +to tell @command{scdaemon} about the data to be signed. The data must be given in +hex notation. The actual signing is done using the command + +@example + PKSIGN @var{keyid} +@end example + +where @var{keyid} is the hexified ID of the key to be used. The key id +may have been retrieved using the command @code{LEARN}. If another +hash algorithm than SHA-1 is used, that algorithm may be given like: + +@example + PKSIGN --hash=@var{algoname} @var{keyid} +@end example + +With @var{algoname} are one of @code{sha1}, @code{rmd160} or @code{md5}. + + +@node Scdaemon PKDECRYPT +@subsection Decrypting data with a Smartcard + +To decrypt some data the caller should use the command + +@example + SETDATA @var{hexstring} +@end example + +to tell @command{scdaemon} about the data to be decrypted. The data +must be given in hex notation. The actual decryption is then done +using the command + +@example + PKDECRYPT @var{keyid} +@end example + +where @var{keyid} is the hexified ID of the key to be used. + + +@node Scdaemon GETATTR +@subsection Read an attribute's value. + +TO BE WRITTEN. + +@node Scdaemon SETATTR +@subsection Update an attribute's value. + +TO BE WRITTEN. + +@node Scdaemon WRITEKEY +@subsection Write a key to a card. + +@example + WRITEKEY [--force] @var{keyid} +@end example + +This command is used to store a secret key on a a smartcard. The +allowed keyids depend on the currently selected smartcard +application. The actual keydata is requested using the inquiry +@code{KEYDATA} and need to be provided without any protection. With +@option{--force} set an existing key under this @var{keyid} will get +overwritten. The key data is expected to be the usual canonical encoded +S-expression. + +A PIN will be requested in most saes. This however depends on the +actual card application. + + +@node Scdaemon GENKEY +@subsection Generate a new key on-card. + +TO BE WRITTEN. + +@node Scdaemon RANDOM +@subsection Return random bytes generate on-card. + +TO BE WRITTEN. + + +@node Scdaemon PASSWD +@subsection Change PINs. + +@example + PASSWD [--reset] @var{chvno} +@end example + +Change the PIN or reset the retry counter of the card holder +verification vector number @var{chvno}. + + +@node Scdaemon CHECKPIN +@subsection Perform a VERIFY operation. + +@example + CHECKPIN @var{idstr} +@end example + +Perform a VERIFY operation without doing anything else. This may be +used to initialize a the PIN cache earlier to long lasting +operations. Its use is highly application dependent: + +@table @strong +@item OpenPGP + +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. @var{idstr} is +the usual card's serial number in hex notation; an optional fingerprint +part will get ignored. + +There is however a special mode if @var{idstr} is suffixed with the +literal string @code{[CHV3]}: In this case the Admin PIN is checked if +and only if the retry counter is still at 3. + +@end table + + + +@node Scdaemon RESTART +@subsection Perform a RESTART operation. + +@example + RESTART +@end example + +Restart the current connection; this is a kind of warm reset. It +deletes the context used by this connection but does not actually +reset the card. + +This is used by gpg-agent to reuse a primary pipe connection and +may be used by clients to backup from a conflict in the serial +command; i.e. to select another application. + + + + +@node Scdaemon APDU +@subsection Send a verbatim APDU to the card. + +@example + APDU [--atr] [--more] [@var{hexstring}] +@end example + + +Send an APDU to the current reader. This command bypasses the high +level functions and sends the data directly to the card. +@var{hexstring} is expected to be a proper APDU. If @var{hexstring} is +not given no commands are send to the card; However the command will +implictly check whether the card is ready for use. + +Using the option @code{--atr} returns the ATR of the card as a status +message before any data like this: +@example + S CARD-ATR 3BFA1300FF813180450031C173C00100009000B1 +@end example + +Using the option @code{--more} handles the card status word MORE_DATA +(61xx) and concatenate all reponses to one block. + + + diff --git a/doc/sysnotes.texi b/doc/sysnotes.texi new file mode 100644 index 000000000..6ca10c195 --- /dev/null +++ b/doc/sysnotes.texi @@ -0,0 +1,107 @@ +@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. + +@node System Notes +@chapter Notes pertaining to certain OSes. + +GnuPG has been developed on GNU/Linux systems and is know to work on +almost all Free OSes. All modern POSIX systems should be supproted +right now, however there are probably a lot of smaller glitches we need +to fix first. The major problem areas are: + +@itemize +@item +For logging to sockets and other internal operations the +@code{fopencookie} function (@code{funopen} under *BSD) is used. This +is a very convient function which makes it possible to create outputs in +a structures and easy maintainable way. The drawback however is that +most proprietary OSes don't support this function. At g10@tie{}Code we +have looked into several ways on how to overcome this limitation but no +sufficiently easy and maintainable way has been found. Porting +@emph{glibc} to a general POSIX system is of course an option and would +make writing portable software much easier; this it has not yet been +done and the system administrator wouldneed to cope with the GNU +specific admin things in addition to the generic ones of his system. + +We have now settled to use explicit stdio wrappers with a functionality +similar to funopen. Although the code for this has already been written +(@emph{libestream}), we have not yet changed GnuPG to use it. + +This means that on systems not supporting either @code{funopen} or +@code{fopencookie}, logging to a socket won't work, prompts are not +formatted as pretty as theyshould be and @command{gpgsm}'s +@code{LISTKEYS} Assuan command does not work. + +@item +We are planning to use file descriptor passing for interprocess +communication. This will allow us save a lot of resources and improve +performance of certain operations a lot. Systems not supporting this +won't gain these benefits but we try to keep them working the satndard +way as it is done today. + +@item +We require more or less full POSIX compatibility. This has been +arround for 15 years now and thus we don't believe it makes sense to +support non POSIX systems anymore. Well, we of course the usual +workarounds for near POSIX systems well be applied. + +There is one exception of this rule: Systems based the Microsoft Windows +API (called here @emph{W32}) will be supported to some extend. + +@end itemize + + +@menu +* W32 Notes:: Microsoft Windows Notes +@end menu + + +@node W32 Notes +@section Microsoft Windows Notes + +The port to Microsoft Windows based OSes is pretty new and has some +limitations we might remove over time. Note, that we have not yet done +any security audit and you should not use any valuable private key. In +particular, @strong{using it on a box with more than one user, might +lead to a key compromise}. + +@noindent +Current limitations are: + +@itemize +@item +The @code{LISTKEYS} Assuan command of @command{gpgsm} is not supported. +Using the command line options @option{--list-keys} or +@option{--list-secret-keys} does however work. + +@item +No support for CRL checks. By default the option +@option{--disable-crl-checks} has been turned on and the log will show +an appropriate warning message. The reason for this is that the +separate CRL checking daemin (@command{dirmngr}) has not been ported to +W32. + +@item +@command{gpgconf} does not create backup files, so in case of trouble +your configuration file might get lost. + +@item +@command{watchgnupg} is not available. Logging to sockets is not +possible. + +@item +The periodical smartcard status checking done by @command{scdaemon} is +not yet supported. + +@item +Detached running of the gpg-agent is not directly supported. It needs +to be started in a console and left alone then. + +@end itemize + + + + + + diff --git a/doc/tools.texi b/doc/tools.texi new file mode 100644 index 000000000..d39d950f4 --- /dev/null +++ b/doc/tools.texi @@ -0,0 +1,884 @@ +@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. + +@node Helper Tools +@chapter Helper Tools + +GnuPG comes with a couple of smaller tools: + +@menu +* watchgnupg:: Read logs from a socket. +* addgnupghome:: Create .gnupg home directories. +* gpgconf:: Modify .gnupg home directories. +* gpgsm-gencert.sh:: Generate an X.509 certificate request. +* gpg-preset-passphrase:: Put a passphrase into the cache. +* gpg-connect-agent:: Communicate with a running agent. +* gpgparsemail:: Parse a mail message into an annotated format +* symcryptrun:: Call a simple symmetric encryption tool. +@end menu + +@c +@c WATCHGNUPG +@c +@manpage watchgnupg.1 +@node watchgnupg +@section Read logs from a socket +@ifset manverb + watchgnupg \- Read and print logs from a socket +@end ifset + +@mansect description +Most of the main utilities are able to write there log files to a +Unix Domain socket if configured that way. @command{watchgnupg} is a simple +listener for such a socket. It ameliorates the output with a time +stamp and makes sure that long lines are not interspersed with log +output from other utilities. + +@manpause +@noindent +@command{watchgnupg} is commonly invoked as + +@mansect synopsis +@example +watchgnupg --force ~/.gnupg/S.log +@end example +@manpause + +@noindent +This starts it on the current terminal for listening on the socket +@file{~/.gnupg/S.log}. + +@noindent +@command{watchgnupg} understands these options: + +@table @gnupgtabopt +@mansect options + +@item --force +@opindex force +Delete an already existing socket file. + +@item --verbose +@opindex verbose +Enable extra informational output. + +@item --version +@opindex version +print version of the program and exit + +@item --help +@opindex help +Display a brief help page and exit + +@manpause +@end table + + +@c +@c ADDGNUPGHOME +@c +@manpage addgnupghome.8 +@node addgnupghome +@section Create .gnupg home directories. +@ifset manverb + addgnupghome \- Create .gnupg home directories +@end ifset + +@mansect description +If GnuPG is installed on a system with existing user accounts, it is +sometimes required to populate the GnuPG home directory with existing +files. Especially a @file{trustlist.txt} and a keybox with some +initial certificates are often desired. This scripts help to do this +by copying all files from @file{/etc/skel/.gnupg} to the home +directories of the accounts given on the command line. It takes care +not to overwrite existing GnuPG home directories. + +@manpause +@noindent +@command{addgnupghome} is invoked by root as: + +@mansect synopsis +@example +addgnupghome account1 account2 ... accountn +@end example + + +@c +@c GPGCONF +@c +@manpage gpgconf.1 +@node gpgconf +@section Modify .gnupg home directories. +@ifset manverb + gpgconf \- Modify .gnupg home directories +@end ifset + +@mansect description +The @command{gpgconf} is a utility to automatically and reasonable +safely query and modify configuration files in the @file{.gnupg} home +directory. It is designed not to be invoked manually by the user, but +automatically by graphical user interfaces (GUI).@footnote{Please note +that currently no locking is done, so concurrent access should be +avoided. There are some precautions to avoid corruption with +concurrent usage, but results may be inconsistent and some changes may +get lost. The stateless design makes it difficult to provide more +guarantees.} + +@command{gpgconf} provides access to the configuration of one or more +components of the GnuPG system. These components correspond more or +less to the programs that exist in the GnuPG framework, like GnuPG, +GPGSM, DirMngr, etc. But this is not a strict one-to-one +relationship. Not all configuration options are available through +@command{gpgconf}. @command{gpgconf} provides a generic and abstract +method to access the most important configuration options that can +feasibly be controlled via such a mechanism. + +@command{gpgconf} can be used to gather and change the options +available in each component, and can also provide their default +values. @command{gpgconf} will give detailed type information that +can be used to restrict the user's input without making an attempt to +commit the changes. + +@command{gpgconf} provides the backend of a configuration editor. The +configuration editor would usually be a graphical user interface +program, that allows to display the current options, their default +values, and allows the user to make changes to the options. These +changes can then be made active with @command{gpgconf} again. Such a +program that uses @command{gpgconf} in this way will be called GUI +throughout this section. + +@manpause +@menu +* Invoking gpgconf:: List of all commands and options. +* Format conventions:: Formatting conventions relevant for all commands. +* Listing components:: List all gpgconf components. +* Listing options:: List all options of a component. +* Changing options:: Changing options of a component. +@end menu + + +@node Invoking gpgconf +@subsection Invoking gpgconf + +@mansect commands +One of the following commands must be given: + +@manpause +@table @gnupgtabopt +@mancont + +@item --list-components +List all components. This is the default command used if none is +specified. + +@item --list-options @var{component} +List all options of the component @var{component}. + +@item --change-options @var{component} +Change the options of the component @var{component}. +@manpause +@end table + +@mansect options + +The following options may be used: + +@manpause +@table @gnupgtabopt +@mancont +@c FIXME: Not yet supported. +@c @item -o @var{file} +@c @itemx --output @var{file} +@c Use @var{file} as output file. + +@item -v +@itemx --verbose +Outputs additional information while running. Specifically, this +extends numerical field values by human-readable descriptions. + +@c FIXME: Not yet supported. +@c @item -n +@c @itemx --dry-run +@c Do not actually change anything. Useful together with +@c @code{--change-options} for testing purposes. + +@item -r +@itemx --runtime +Only used together with @code{--change-options}. If one of the +modified options can be changed in a running daemon process, signal +the running daemon to ask it to reparse its configuration file after +changing. + +This means that the changes will take effect at run-time, as far as +this is possible. Otherwise, they will take effect at the next start +of the respective backend programs. +@manpause +@end table + + +@node Format conventions +@subsection Format conventions + +Some lines in the output of @command{gpgconf} contain a list of +colon-separated fields. The following conventions apply: + +@itemize @bullet +@item +The GUI program is required to strip off trailing newline and/or +carriage return characters from the output. + +@item +@command{gpgconf} will never leave out fields. If a certain version +provides a certain field, this field will always be present in all +@command{gpgconf} versions from that time on. + +@item +Future versions of @command{gpgconf} might append fields to the list. +New fields will always be separated from the previously last field by +a colon separator. The GUI should be prepared to parse the last field +it knows about up until a colon or end of line. + +@item +Not all fields are defined under all conditions. You are required to +ignore the content of undefined fields. +@end itemize + +There are several standard types for the content of a field: + +@table @asis +@item verbatim +Some fields contain strings that are not escaped in any way. Such +fields are described to be used @emph{verbatim}. These fields will +never contain a colon character (for obvious reasons). No de-escaping +or other formatting is required to use the field content. This is for +easy parsing of the output, when it is known that the content can +never contain any special characters. + +@item percent-escaped +Some fields contain strings that are described to be +@emph{percent-escaped}. Such strings need to be de-escaped before +their content can be presented to the user. A percent-escaped string +is de-escaped by replacing all occurences of @code{%XY} by the byte +that has the hexadecimal value @code{XY}. @code{X} and @code{Y} are +from the set @code{0-9a-f}. + +@item localised +Some fields contain strings that are described to be @emph{localised}. +Such strings are translated to the active language and formatted in +the active character set. + +@item @w{unsigned number} +Some fields contain an @emph{unsigned number}. This number will +always fit into a 32-bit unsigned integer variable. The number may be +followed by a space, followed by a human readable description of that +value (if the verbose option is used). You should ignore everything +in the field that follows the number. + +@item @w{signed number} +Some fields contain a @emph{signed number}. This number will always +fit into a 32-bit signed integer variable. The number may be followed +by a space, followed by a human readable description of that value (if +the verbose option is used). You should ignore everything in the +field that follows the number. + +@item option +Some fields contain an @emph{option} argument. The format of an +option argument depends on the type of the option and on some flags: + +@table @asis +@item no argument +The simplest case is that the option does not take an argument at all +(@var{type} @code{0}). Then the option argument is an unsigned number +that specifies how often the option occurs. If the @code{list} flag +is not set, then the only valid number is @code{1}. Options that do +not take an argument never have the @code{default} or @code{optional +arg} flag set. + +@item number +If the option takes a number argument (@var{alt-type} is @code{2} or +@code{3}), and it can only occur once (@code{list} flag is not set), +then the option argument is either empty (only allowed if the argument +is optional), or it is a number. A number is a string that begins +with an optional minus character, followed by one or more digits. The +number must fit into an integer variable (unsigned or signed, +depending on @var{alt-type}). + +@item number list +If the option takes a number argument and it can occur more than once, +then the option argument is either empty, or it is a comma-separated +list of numbers as described above. + +@item string +If the option takes a string argument (@var{alt-type} is 1), and it +can only occur once (@code{list} flag is not set) then the option +argument is either empty (only allowed if the argument is optional), +or it starts with a double quote character (@code{"}) followed by a +percent-escaped string that is the argument value. Note that there is +only a leading double quote character, no trailing one. The double +quote character is only needed to be able to differentiate between no +value and the empty string as value. + +@item string list +If the option takes a number argument and it can occur more than once, +then the option argument is either empty, or it is a comma-separated +list of string arguments as described above. +@end table +@end table + +The active language and character set are currently determined from +the locale environment of the @command{gpgconf} program. + +@c FIXME: Document the active language and active character set. Allow +@c to change it via the command line? + + +@mansect usage +@node Listing components +@subsection Listing components + +The command @code{--list-components} will list all components that can +be configured with @command{gpgconf}. Usually, one component will +correspond to one GnuPG-related program and contain the options of +that programs configuration file that can be modified using +@command{gpgconf}. However, this is not necessarily the case. A +component might also be a group of selected options from several +programs, or contain entirely virtual options that have a special +effect rather than changing exactly one option in one configuration +file. + +A component is a set of configuration options that semantically belong +together. Furthermore, several changes to a component can be made in +an atomic way with a single operation. The GUI could for example +provide a menu with one entry for each component, or a window with one +tabulator sheet per component. + +The command argument @code{--list-components} lists all available +components, one per line. The format of each line is: + +@code{@var{name}:@var{description}} + +@table @var +@item name +This field contains a name tag of the component. The name tag is used +to specify the component in all communication with @command{gpgconf}. +The name tag is to be used @emph{verbatim}. It is thus not in any +escaped format. + +@item description +The @emph{string} in this field contains a human-readable description +of the component. It can be displayed to the user of the GUI for +informational purposes. It is @emph{percent-escaped} and +@emph{localized}. +@end table + +Example: +@example +$ gpgconf --list-components +gpg:GPG for OpenPGP +gpg-agent:GPG Agent +scdaemon:Smartcard Daemon +gpgsm:GPG for S/MIME +dirmngr:Directory Manager +@end example + + +@node Listing options +@subsection Listing options + +Every component contains one or more options. Options may be gathered +into option groups to allow the GUI to give visual hints to the user +about which options are related. + +The command argument @code{@w{--list-options @var{component}}} lists +all options (and the groups they belong to) in the component +@var{component}, one per line. @var{component} must be the string in +the field @var{name} in the output of the @code{--list-components} +command. + +There is one line for each option and each group. First come all +options that are not in any group. Then comes a line describing a +group. Then come all options that belong into each group. Then comes +the next group and so on. There does not need to be any group (and in +this case the output will stop after the last non-grouped option). + +The format of each line is: + +@code{@var{name}:@var{flags}:@var{level}:@var{description}:@var{type}:@var{alt-type}:@var{argname}:@var{default}:@var{argdef}:@var{value}} + +@table @var +@item name +This field contains a name tag for the group or option. The name tag +is used to specify the group or option in all communication with +@command{gpgconf}. The name tag is to be used @emph{verbatim}. It is +thus not in any escaped format. + +@item flags +The flags field contains an @emph{unsigned number}. Its value is the +OR-wise combination of the following flag values: + +@table @code +@item group (1) +If this flag is set, this is a line describing a group and not an +option. +@end table + +The following flag values are only defined for options (that is, if +the @code{group} flag is not used). + +@table @code +@item optional arg (2) +If this flag is set, the argument is optional. This is never set for +@var{type} @code{0} (none) options. + +@item list (4) +If this flag is set, the option can be given multiple times. + +@item runtime (8) +If this flag is set, the option can be changed at runtime. + +@item default (16) +If this flag is set, a default value is available. + +@item default desc (32) +If this flag is set, a (runtime) default is available. This and the +@code{default} flag are mutually exclusive. + +@item no arg desc (64) +If this flag is set, and the @code{optional arg} flag is set, then the +option has a special meaning if no argument is given. +@end table + +@item level +This field is defined for options and for groups. It contains an +@emph{unsigned number} that specifies the expert level under which +this group or option should be displayed. The following expert levels +are defined for options (they have analogous meaning for groups): + +@table @code +@item basic (0) +This option should always be offered to the user. + +@item advanced (1) +This option may be offered to advanced users. + +@item expert (2) +This option should only be offered to expert users. + +@item invisible (3) +This option should normally never be displayed, not even to expert +users. + +@item internal (4) +This option is for internal use only. Ignore it. +@end table + +The level of a group will always be the lowest level of all options it +contains. + +@item description +This field is defined for options and groups. The @emph{string} in +this field contains a human-readable description of the option or +group. It can be displayed to the user of the GUI for informational +purposes. It is @emph{percent-escaped} and @emph{localized}. + +@item type +This field is only defined for options. It contains an @emph{unsigned +number} that specifies the type of the option's argument, if any. The +following types are defined: + +Basic types: + +@table @code +@item none (0) +No argument allowed. + +@item string (1) +An @emph{unformatted string}. + +@item int32 (2) +A @emph{signed number}. + +@item uint32 (3) +An @emph{unsigned number}. +@end table + +Complex types: + +@table @code +@item pathname (32) +A @emph{string} that describes the pathname of a file. The file does +not necessarily need to exist. + +@item ldap server (33) +A @emph{string} that describes an LDAP server in the format: + +@code{@var{hostname}:@var{port}:@var{username}:@var{password}:@var{base_dn}} +@end table + +More types will be added in the future. Please see the @var{alt-type} +field for information on how to cope with unknown types. + +@item alt-type +This field is identical to @var{type}, except that only the types +@code{0} to @code{31} are allowed. The GUI is expected to present the +user the option in the format specified by @var{type}. But if the +argument type @var{type} is not supported by the GUI, it can still +display the option in the more generic basic type @var{alt-type}. The +GUI must support all the defined basic types to be able to display all +options. More basic types may be added in future versions. If the +GUI encounters a basic type it doesn't support, it should report an +error and abort the operation. + +@item argname +This field is only defined for options with an argument type +@var{type} that is not @code{0}. In this case it may contain a +@emph{percent-escaped} and @emph{localised string} that gives a short +name for the argument. The field may also be empty, though, in which +case a short name is not known. + +@item default +This field is defined only for options. Its format is that of an +@emph{option argument} (@xref{Format conventions}, for details). If +the default value is empty, then no default is known. Otherwise, the +value specifies the default value for this option. Note that this +field is also meaningful if the option itself does not take a real +argument. + +@item argdef +This field is defined only for options for which the @code{optional +arg} flag is set. If the @code{no arg desc} flag is not set, its +format is that of an @emph{option argument} (@xref{Format +conventions}, for details). If the default value is empty, then no +default is known. Otherwise, the value specifies the default value +for this option. If the @code{no arg desc} flag is set, the field is +either empty or contains a description of the effect of this option if +no argument is given. Note that this field is also meaningful if the +option itself does not take a real argument. + +@item value +This field is defined only for options. Its format is that of an +@emph{option argument}. If it is empty, then the option is not +explicitely set in the current configuration, and the default applies +(if any). Otherwise, it contains the current value of the option. +Note that this field is also meaningful if the option itself does not +take a real argument. +@end table + + +@node Changing options +@subsection Changing options + +The command @w{@code{--change-options @var{component}}} will attempt +to change the options of the component @var{component} to the +specified values. @var{component} must be the string in the field +@var{name} in the output of the @code{--list-components} command. You +have to provide the options that shall be changed in the following +format on standard input: + +@code{@var{name}:@var{flags}:@var{new-value}} + +@table @var +@item name +This is the name of the option to change. @var{name} must be the +string in the field @var{name} in the output of the +@code{--list-options} command. + +@item flags +The flags field contains an @emph{unsigned number}. Its value is the +OR-wise combination of the following flag values: + +@table @code +@item default (16) +If this flag is set, the option is deleted and the default value is +used instead (if applicable). +@end table + +@item new-value +The new value for the option. This field is only defined if the +@code{default} flag is not set. The format is that of an @emph{option +argument}. If it is empty (or the field is omitted), the default +argument is used (only allowed if the argument is optional for this +option). Otherwise, the option will be set to the specified value. +@end table + +Examples: + +To set the force option, which is of basic type @code{none (0)}: + +@example +$ echo 'force:0:1' | gpgconf --change-options dirmngr +@end example + +To delete the force option: + +@example +$ echo 'force:16:' | gpgconf --change-options dirmngr +@end example + +The @code{--runtime} option can influence when the changes take +effect. + +@manpause +@c +@c GPGSM-GENCERT.SH +@c +@node gpgsm-gencert.sh +@section Generate an X.509 certificate request + +This is a simple tool to interactivly generate a certificate request +which will be printed to stdout. + +@noindent +@command{gpgsm-gencert.sh} is invoked as: + +@samp{gpgsm-cencert.sh} + + + +@c +@c GPG-PRESET-PASSPHRASE +@c +@node gpg-preset-passphrase +@section Put a passphrase into the cache. + +The @command{gpg-preset-passphrase} is a utility to seed the internal +cache of a running @command{gpg-agent} with passphrases. It is mainly +useful for unattended machines, where the usual @command{pinentry} tool +may not be used and the passphrases for the to be used keys are given at +machine startup. + +Passphrases set with this utility don't expire unless the +@option{--forget} option is used to explicitly clear them from the cache +--- or @command{gpg-agent} is either restarted or reloaded (by sending a +SIGHUP to it). It is necessary to allow this passphrase presetting by +starting @command{gpg-agent} with the +@option{--allow-preset-passphrase}. + +@menu +* Invoking gpg-preset-passphrase:: List of all commands and options. +@end menu + + +@node Invoking gpg-preset-passphrase +@subsection List of all commands and options. + +@noindent +@command{gpg-preset-passphrase} is invoked this way: + +@example +gpg-preset-passphrase [options] [command] @var{keygrip} +@end example + +@var{keygrip} is a 40 character string of hexadecimal characters +identifying the key for which the passphrase should be set or cleared. +This keygrip is listed along with the key when running the command: +@code{gpgsm --dump-secret-keys}. One of the following command options +must be given: + +@table @gnupgtabopt +@item --preset +Preset a passphrase. This is what you usually will +use. @command{gpg-preset-passphrase} will then read the passphrase from +@code{stdin}. + +@item --forget +Flush the passphrase for the given keygrip from the cache. + +@end table + +@noindent +The following additional options may be used: + +@table @gnupgtabopt +@item -v +@itemx --verbose +@opindex verbose +Output additional information while running. + +@item -P @var{string} +@itemx --passphrase @var{string} +@opindex passphrase +Instead of reading the passphrase from @code{stdin}, use the supplied +@var{string} as passphrase. Note that this makes the passphrase visible +for other users. +@end table + + + + + +@c +@c GPG-CONNECT-AGENT +@c +@node gpg-connect-agent +@section Communicate with a runnig agent. + +The @command{gpg-connect-agent} is a utility to communicate with a +running @command{gpg-agent}. It is useful to check out the commands +gpg-agent provides using the Assuan interface. It might also be useful +for scripting simple applications. Inputis expected at stdin and out +put gets printed to stdout. + +It is very similar to running @command{gpg-agent} in server mode; but +here we connect to a running instance. + +@menu +* Invoking gpg-connect-agent:: List of all commands and options. +@end menu + + +@node Invoking gpg-connect-agent +@subsection List of all commands and options. + +@noindent +@command{gpg-connect-agent} is invoked this way: + +@example +gpg-connect-agent [options] +@end example + +@noindent +The following options may be used: + +@table @gnupgtabopt +@item -v +@itemx --verbose +@opindex verbose +Output additional information while running. + +@item -q +@item --quiet +@opindex q +@opindex quiet +Try to be as quiet as possible. + +@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 +@var{HKCU\Software\GNU\GnuPG:HomeDir}. + + +@item -S +@itemx --raw-socket @var{name} +@opindex S +@opindex raw-socket +Connect to socket @var{name} assuming this is an Assuan style server. +Do not run any special initializations or environment checks. This may +be used to directly connect to any Assuan style socket server. + + +@end table + +@c +@c GPGPARSEMAIL +@c +@node gpgparsemail +@section Parse a mail message into an annotated format + +The @command{gpgparsemail} is a utility currentlu only useful for +debugging. Run it with @code{--help} for usage information. + + + +@c +@c SYMCRYPTRUN +@c +@node symcryptrun +@section Call a simple symmetric encryption tool. + +Sometimes simple encryption tools are already in use for a long time and +there might be a desire to integrate them into the GnuPG framework. The +protocols and encryption methods might be non-standard or not even +properly documented, so that a full-fledged encryption tool with an +interface like gpg is not doable. @command{symcryptrun} provides a +solution: It operates by calling the external encryption/decryption +module and provides a passphrase for a key using the standard +@command{pinentry} based mechanism through @command{gpg-agent}. + +Note, that @command{symcryptrun} is only available if GnuPG has been +configured with @samp{--enable-symcryptrun} at build time. + +@menu +* Invoking symcryptrun:: List of all commands and options. +@end menu + + +@node Invoking symcryptrun +@subsection List of all commands and options. + +@noindent +@command{symcryptrun} is invoked this way: + +@example +symcryptrun --class CLASS --program PROGRAM --keyfile KEYFILE + [--decrypt | --encrypt] [inputfile] +@end example + +For encryption, the plain text must be provided on STDIN or as the +argument @var{inputfile}, and the ciphertext will be output to STDOUT. +For decryption vice versa. + +@var{CLASS} describes the calling conventions of the external tool. +Currently it must be given as @samp{confucius}. @var{PROGRAM} is the +the full filename of that external tool. + +For the class @samp{confucius} the option @option{--keyfile} is +required; @var{keyfile} is the name of a file containing the secret key, +which may be protected by a passphrase. For detailed calling +conventions, see the source code. + +@noindent +Note, that @command{gpg-agent} must be running before starting +@command{symcryptrun}. + +@noindent +The following additional options may be used: + +@table @gnupgtabopt +@item -v +@itemx --verbose +@opindex verbose +Output additional information while running. + +@item -q +@item --quiet +@opindex q +@opindex quiet +Try to be as quiet as possible. + +@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 +@var{HKCU\Software\GNU\GnuPG:HomeDir}. + +@item --log-file @var{file} +@opindex log-file +Append all logging output to @var{file}. Default is to write logging +informaton to STDERR. + +@end table + +@noindent +The possible exit status codes of @command{symcryptrun} are: + +@table @code +@item 0 + Success. +@item 1 + Some error occured. +@item 2 + No valid passphrase was provided. +@item 3 + The operation was canceled by the user. + +@end table + diff --git a/g10/ChangeLog b/g10/ChangeLog index 2c4cef774..7f204cde9 100644 --- a/g10/ChangeLog +++ b/g10/ChangeLog @@ -1,31 +1,10 @@ -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. +2006-07-27 Werner Koch <wk@g10code.com> * 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> - +2006-07-24 David Shaw <dshaw@jabberwocky.com> (wk) + * keydb.h, pkclist.c (select_algo_from_prefs, algo_available): Pass a union for preference hints rather than doing void * games. @@ -40,38 +19,44 @@ * 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> +2006-06-30 Werner Koch <wk@g10code.com> - * import.c (check_prefs_warning): Fix change for better - translatability. + * misc.c (checksum_mpi): No need for nbits as they are alredy + included in the buffer. - * 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-29 Werner Koch <wk@g10code.com> + + * parse-packet.c (parse_signature, parse_key): Need store the + length of opaque data as number of bits. + * card-util.c (card_store_subkey): Ditto. + + * mainproc.c (print_pkenc_list, check_sig_and_print): Replaced + log_get_stream by calls to log_printf. This avoids the extra LFs + inserted by the logging function. They are a bit too smart + sometimes. + * pkclist.c (do_show_revocation_reason): Print final LF through + log_printf to avoid extra LFs. + * pubkey-enc.c (get_it): Ditto. + + * seskey.c (encode_md_value): Fix call to gcry. 2006-06-27 Werner Koch <wk@g10code.com> - * gpg.c (reopen_std) [HAVE_W32_SYSTEM]: Do not use it. + Applied patches from 1.4.x (2006-05-22 to 2006-06-23) from David: -2006-06-22 David Shaw <dshaw@jabberwocky.com> + * 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. + * options.h, gpg.c (main): Ditto. - * 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> + * sign.c (do_sign): For now don't accept a truncated hash even + for DSA1 keys (be liberal in what you accept, etc). * 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. @@ -85,20 +70,14 @@ 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. + * 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> + * exec.c (make_tempdir) [W32]: Fix bug with a temporary directory + on W32 that is over 256 bytes long. Noted by Israel G. Lugo. * 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 @@ -107,37 +86,83 @@ happened, and fail completely if we cannot reopen (should never happen). (main): Call it here. + + * parse-packet.c (dump_sig_subpkt, parse_signature): Fix meaning + of key expiration and sig expiration subpackets - zero means + "never expire" according to 2440, not "expire instantly". + * build-packet.c (build_sig_subpkt_from_sig): Ditto. + * getkey.c (fixup_uidnode, merge_selfsigs_main) + (merge_selfsigs_subkey): Ditto. + * keygen.c (keygen_add_key_expire): Ditto. -2006-05-22 David Shaw <dshaw@jabberwocky.com> + * 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. - * 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". +2006-05-24 Werner Koch <wk@g10code.com> - * 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. + * keyid.c (hash_public_key): Do not double hash the length bytes, + they are already included by mpi_print. -2006-04-26 David Shaw <dshaw@jabberwocky.com> + * misc.c (openpgp_pk_test_algo2): Get test call right. + * misc.c (string_to_cipher_algo, string_to_digest_algo): New. + * keygen.c (keygen_set_std_prefs): use them here. + * gpg.c (main): and here. + +2006-05-23 Werner Koch <wk@g10code.com> + + * card-util.c (generate_card_keys): Removed temporary kludge for + generate_keypair. + + * call-agent.c (agent_scd_setattr): Add arg SERIALNO. + (agent_scd_genkey): Ditto. + (agent_scd_change_pin): Ditto. + + * call-agent.h (struct agent_card_info_s): Updated to match the + one of 1.4.3. + + * Makefile.am (LDADD): Include ZLIBS. + + * gpgv.c: Removed stubs not anymore useful due to libgcrypt. + +2006-05-22 Werner Koch <wk@g10code.com> + + * keyserver.c (keyidlist): Replaced mpi_get_keyid by v3_keyid. + * keydb.h (v3_keyid): Added. + + * import.c (import): Better initialize KEYBLOCK as to quiet + compiler warning. + + * skclist.c (random_is_faked): New. + + * mainproc.c: Include pka.h. + +2006-05-19 Werner Koch <wk@g10code.com> + + * misc.c (openpgp_pk_test_algo2): Need to use gcry_pk_algo_info + directly. + (string_count_chr): New. + + * armor.c (parse_header_line): Use renamed function + length_sans_trailing_ws. + + * options.h, gpg.c: Option --strict is not used thus removed code + but kept option. + +2006-04-28 David Shaw <dshaw@jabberwocky.com> (wk) + * 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). + 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. @@ -154,32 +179,22 @@ --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): Add SHA-224. + * armor.c (armor_filter, parse_hash_header): Add SHA-224. - * gpg.c (print_mds), armor.c (armor_filter, parse_hash_header): - Add SHA-224. - - * sign.c (write_plaintext_packet), encode.c (encode_simple): + * sign.c (write_plaintext_packet): Factor common literal packet setup code from here, to... - + * encode.c (encode_simple): .. there. + * 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 @@ -192,2628 +207,95 @@ --refresh-keys, and --fetch-keys follow their arguments from left to right. Suggested by Peter Palfrader. -2006-04-08 Werner Koch <wk@g10code.com> +2006-04-18 Werner Koch <wk@g10code.com> - * mainproc.c (list_node): Print ring trust value only if not empty - and --with-colons has been given. + * tdbio.c (open_db, migrate_from_v2): Removed feature to migration + from old trustdb version 2. -2006-04-05 Werner Koch <wk@g10code.com> + * gpg.c, mainproc.c: Removed pipemode feature. - * getkey.c (user_id_not_found_utf8): New. - (get_primary_uid, get_user_id): Use it. Fixes Debian bug #205028 - in the right way. + * status.c: Removed shared memory coprocess stuff -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. + Merged with current gpg 1.4.3 code. - * 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. + * keygen.c, keyid.c, misc.c, openfile.c, verify.c, trustdb.c + * textfilter.c, tdbio.c, tdbdump.c, status.c, skclist.c, signal.c + * sign.c, sig-check.c, seskey.c, seckey-cert.c, revoke.c + * pubkey-enc.c, progress.c, plaintext.c, pkclist.c, photoid.c + * passphrase.c, parse-packet.c, mdfilter.c, mainproc.c + * keyserver.c, keyring.c, keylist.c, keyedit.c, keydb.c, kbnode.c + * import.c, getkey.c, gpgv.c, helptext.c, free-packet.c + * build-packet.c, cipher.c, compress.c, dearmor.c, decrypt.c + * delkey.c, encr-data.c, encode.c, exec.c, export.c + * gpg.c, armor.c: Updated from gnupg-1.4.3 and merged back gcry and + gnupg-1.9 related changes. + * trustdb.h, tdbio.h, status.h, photoid.h, packet.h, options.h + * main.h, keyserver-internal.h, keyring.h, keydb.h, filter.h + * exec.h: Ditto. + * global.h: Removed after merging constants with gpg.h. + * comment.c, pipemode.c: Removed. + * card-util.c: Updated from gnupg-1.4.3. + * compress-bz2.c: New. - * trustdb.c (validate_keys): Print no "ultimately trusted keys - found" only in non-quiet mode. +2005-06-15 Werner Koch <wk@g10code.com> -2005-12-19 David Shaw <dshaw@jabberwocky.com> + * g10.c (print_hashline, add_group): Fixes for signed/unsigned + pointer mismatch warnings. - * getkey.c (merge_selfsigs_main): All primary keys can certify. +2005-06-01 Werner Koch <wk@g10code.com> -2005-12-18 David Shaw <dshaw@jabberwocky.com> + * mkdtemp.c: Removed. + * exec.c: Include mkdtemp.h - * gpg.c (main): Restore convert-sk-to-pk as programs rely on it. +2004-12-21 Werner Koch <wk@g10code.com> - * keyid.c (usagestr_from_pk): Remove special PUBKEY_USAGE_CERT - flag. It's no longer needed. + * gpgv.c, g10.c (main): Use default_hoemdir (). -2005-12-14 David Shaw <dshaw@jabberwocky.com> +2004-12-18 Werner Koch <wk@g10code.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. + * gpg.h (map_assuan_err): Define in terms of + map_assuan_err_with_source. -2005-12-08 David Shaw <dshaw@jabberwocky.com> +2004-12-15 Werner Koch <wk@g10code.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@grover.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. + * Makefile.am (LDADD): Remove ZLIBS. 2004-10-22 Werner Koch <wk@g10code.com> + * g10.c (main): Display a bit fat warning that this gpg should not + be used. + * 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> +2004-09-30 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. + * Makefile.am (LDADD): Adjusted for gettext 0.14. 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. +2004-09-11 Moritz Schulte <moritz@g10code.com> - * cardglue.c (open_card): Use shutdown code if possible. - (check_card_serialno): Ditto. + * openfile.c (copy_options_file): Fixed last commit (added a `+'). - * ccid-driver.c (do_close_reader): Factored some code out from ... - (ccid_close_reader): ..here. - (ccid_shutdown_reader): New. +2004-08-31 Werner Koch <wk@g10code.de> - * apdu.c (apdu_shutdown_reader): New. - (shutdown_ccid_reader): New. + * openfile.c (copy_options_file): Use gpg-conf.skel. Better take + the length of SKELEXT into account, someone might make it larger. + * Makefile.am: Install options.skel as gpg-conf.skel. -2004-09-17 Werner Koch <wk@g10code.com> +2004-08-18 Marcus Brinkmann <marcus@g10code.de> - * g10.c (list_config): New config option ccid-reader-id. - (gpgconf_list): Add "reader-port". + * passphrase.c (agent_get_passphrase): Fix detection of gpg-agent + cancellation. - * 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. +2004-07-01 Werner Koch <wk@gnupg.org> - * 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. @@ -2821,6 +303,10 @@ (change_cafpr): New. (card_edit): New command CAFPR. + * call-agent.h: Add members for CA fingerprints. + * call-agent.c (agent_release_card_info): Invalid them. + (learn_status_cb): Store them. + 2004-04-30 Werner Koch <wk@gnupg.org> * g10.c (main) <gpgconf>: Use gpg.conf and not /dev/null as @@ -2832,1576 +318,180 @@ (generate_card_keys): New arg SERIALNO. Do PIN verification here after resetting forced_chv1. +2004-04-26 Werner Koch <wk@gnupg.org> + + * card-util.c (change_name): Check that the NAME is not too long. + (change_url): Likewise. + (change_login): Likewise. + +2004-03-23 Werner Koch <wk@gnupg.org> + + * g10.c: New options --gpgconf-list, --debug-level and --log-file + (set_debug): Add arg DEBUG_LEVEL. + (main): Look at less and less version specific config files. From + gnupg 1.3. + +2004-02-17 Werner Koch <wk@gnupg.org> + + * call-agent.c (start_agent): Ignore an empty GPG_AGENT_INFO. + * passphrase.c (agent_open): Ditto. + +2004-02-12 Werner Koch <wk@gnupg.org> + + * gpgv.c: Removed g10defs.h. + + * Makefile.am: Include cmacros.am for common flags. + +2004-02-11 Werner Koch <wk@gnupg.org> + + * openfile.c (try_make_homedir): Use GNUPG_DEFAULT_HOMEDIR. + * gpgv.c (main): Ditto. + * g10.c (main): Ditto. + +2004-01-19 Moritz Schulte <mo@g10code.com> + + * keygen.c (do_generate_keypair): Print member fname, instead of + newfname, again. + (do_generate_keypair): Don't try to execute certain pieces of code + in case an error occured. + (gen_card_key): Don't print out a message, which is already + printed by do_generate_keypair(). + +2004-01-18 Moritz Schulte <mo@g10code.com> + + * keygen.c (do_generate_keypair): Print member fname, instead of + newfname. + +2003-12-17 Werner Koch <wk@gnupg.org> + + * card-util.c (print_name): Fixed bad format string usage. + (print_isoname): Ditto. + + * trustdb.c (check_regexp): s/exp/expr/. + + * keyedit.c (trustsig_prompt): Removed a "> 255" term; it is + always false due to the data type. -2004-09-09 Werner Koch <wk@g10code.com> + * passphrase.c (agent_get_passphrase): Use xasprintf and avoid + non-literal format strings. - * 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. + * tdbio.c (upd_hashtable, drop_from_hashtable, lookup_hashtable): + Fixed log_error format string bugs. Kudos to the now working + gcc-3.3 -Wformat-nonliteral and Florian Weimer's investigations in + gnupg 1.2.3. - * photoid.c: Include ttyio.h. +2003-12-15 Werner Koch <wk@gnupg.org> - * parse-packet.c (skip_rest): Removed. Changed all callers to use - the new iobuf_skip_reset. Orginal patch by Florian Weimer. + * seckey-cert.c (protect_secret_key): Use gry_create_nonce for the + IV; there is not need for real strong random here and it even + better protect the random bits used for the key. -2004-09-07 Werner Koch <wk@g10code.de> +2003-11-16 Moritz Schulte <mo@g10code.com> - * photoid.c (generate_photo_id): Use tty_printf and not just - printf. Put _() around one string. + * signal.c: Removed unused file. -2004-09-03 David Shaw <dshaw@jabberwocky.com> +2003-11-10 Moritz Schulte <mo@g10code.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. + * Makefile.am (INCLUDES): Added: @LIBGCRYPT_CFLAGS@. 2003-10-25 Werner Koch <wk@gnupg.org> - * ccid-driver.c (ccid_open_reader): Return an error if no USB - devices are found. + * call-agent.c (learn_status_cb, scd_genkey_cb): Fixed faulty use + of !spacep(). - * Makefile.am: Replaced INTLLIBS by LIBINTL. +2003-10-20 Werner Koch <wk@gnupg.org> - * 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 + * call-agent.c (agent_scd_checkpin): New. 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. + * call-agent.c (agent_scd_getattr): Don't clear the passed info + structure, so that it can indeed be updated. - * 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. + * card-util.c (fpr_is_zero): New. + (generate_card_keys): New. + (card_edit): New command "generate". + * keygen.c (generate_keypair): New arg CARD_SERIALNO, removed call + to check_smartcard. + (check_smartcard,show_smartcard): Removed. + (show_sha1_fpr,fpr_is_zero): Removed. 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. + +2003-09-30 Werner Koch <wk@gnupg.org> + + * keylist.c (print_card_serialno): New. + (list_keyblock_print): Use it here. + + * card-util.c (toggle_forcesig): New. (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. + + * call-agent.c (agent_scd_getattr): New. + (learn_status_cb): Release values before assignment so that it can + be used by getattr to update the structure. + * 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. + * sign.c (do_sign): Removed disabled testcode. + +2003-09-26 Timo Schulz <twoaday@freakmail.de> + + * card_status (card_status): Do not use fputs since the fp + parameter can be NULL. This fixes a segv. -2003-09-25 David Shaw <dshaw@jabberwocky.com> +2003-09-24 Werner Koch <wk@gnupg.org> - * options.h, g10.c (main), keylist.c (list_keyblock_print): Add - "show-unusable-uids" list-option to show revoked and/or expired - user IDs. + * card-util.c (print_isoname,card_status): Handle opt.with_colons. + (print_sha1_fpr_colon): New. -2003-09-24 David Shaw <dshaw@jabberwocky.com> +2003-09-23 Werner Koch <wk@gnupg.org> - * 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]". + Merged most of David Shaw's changes in 1.3 since 2003-06-03. + + * Makefile.am: Include W32LIBS where appropriate. -2003-09-23 David Shaw <dshaw@jabberwocky.com> + * armor.c (parse_hash_header,armor_filter): Drop TIGER/192 support. + * g10.c (print_hex,print_mds): Ditto. + * pkclist.c (algo_available): Ditto. - * 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> + * armor.c (armor_filter): Allow using --comment multiple times to + get multiple Comment header lines. --no-comments resets list. + * options.h, g10.c (main): Ditto. Deprecate --default-comment in + favor of --no-comments. * 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). + --encrypt-files (plus --verify-files, --decrypt-files). Error out + if --multifile is used with the commands that don't support it yet. * 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> + (add_keyserver_url): Clarify a few strings. It's a + "preferred keyserver URL". + * keyedit.c (keyedit_menu): Ditto. + * sign.c (mk_notation_policy_etc): Ditto. * 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. @@ -4410,16 +500,12 @@ * 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 @@ -4430,8 +516,6 @@ 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. @@ -4450,10 +534,6 @@ * 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. @@ -4461,10 +541,6 @@ * 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. @@ -4482,8 +558,6 @@ 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. @@ -4504,14 +578,10 @@ 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. @@ -4520,8 +590,6 @@ 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 @@ -4537,26 +605,20 @@ * 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 + * 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. @@ -4565,16 +627,12 @@ --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. @@ -4586,8 +644,6 @@ 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. @@ -4623,8 +679,6 @@ 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 @@ -4635,22 +689,13 @@ * 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 @@ -4663,6 +708,315 @@ this is to make things consistent with --set-policy-url meaning both sigs and certs. + * 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. + + * keyedit.c (show_key_with_all_names): Fix assertion failure when + using toggle to see a secret key. Reported by Maxim Britov. + + +2003-09-22 Timo Schulz <twoaday@freakmail.de> + + * card-util.c (card_status): Free pk in case of an error + and return if the card is no OpenPGP card. + +2003-09-18 Werner Koch <wk@gnupg.org> + + * g10.c: New command --card-edit. + * card-util.c (card_status): Use tty_fprintf for all output. + (print_sha1_fpr, print_isoname): Ditto. + (get_one_name,change_name, change_url, change_login,change_lang) + (change_sex): New; taken from keygen.c. + * keygen.c (smartcard_get_one_name, smartcard_change_name) + (smartcard_change_url, smartcard_change_login_data) + (smartcard_change_lang, smartcard_change_sex): Removed. + (check_smartcard): Removed most menu items. + +2003-09-06 Werner Koch <wk@gnupg.org> + + * misc.c (openpgp_pk_algo_usage): Allow AUTH where SIGN is allowed. + + * keygen.c (ask_passphrase): No need to allocated S2K in secure + memory. + +2003-09-04 Werner Koch <wk@gnupg.org> + + * keygen.c (do_add_key_flags, parse_parameter_usage) + (do_generate_keypair): 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. + +2003-08-25 Timo Schulz <twoaday@freakmail.de> + + * pkglue.c (mpi_from_sexp): New. Used to factor out + some common code. + +2003-08-24 Werner Koch <wk@gnupg.org> + + * keygen.c (do_generate_keypair): Print a reminder to use --gen-revoke. + +2003-08-18 Timo Schulz <twoaday@freakmail.de> + + * encode.c (encode_sesskey): Checked the code and removed + the warning since all compatibility checks with PGP succeeded. + * mainproc.c (symkey_decrypt_sesskey): Better check for the + algorithm and check the return values of some functions. + * mdc.c (use_mdc): Simplified. + +2003-08-07 Werner Koch <wk@gnupg.org> + + * pkglue.c (pk_sign): Fix last change. + (pk_verify): Check for valid DATA array so that we don't segv in + Libgcrypt. + (pk_verify): Ditto. + +2003-08-06 Werner Koch <wk@gnupg.org> + + * pkglue.c (pk_sign): Allow signing using RSA. + +2003-08-05 Werner Koch <wk@gnupg.org> + + * Makefile.am (install-data-local): Dropped check for the ancient + gpgm tool. + (bin_PROGRAMS): Renamed gpg to gpg2 and gpgv to gpgv2. This is so + that it won't conflict with the current stable version of gpg. + + * pkglue.c (pk_check_secret_key): New. + * seckey-cert.c (do_check): Reenable this test here again. + + * g10.c (main): Add command -K as an alias for + --list-secret-keys. Command "-k" is now an alias to --list-keys. + Remove special treatment of -kv and -kvv. + (set_cmd): Ditto. + (main): Strip a "-cvs" suffix when testing for a version specific + config file. + + * status.h, status.c, g10.c [USE_SHM_COPROCESSING]: Removed. This + is not any longer available. + +2003-07-29 Werner Koch <wk@gnupg.org> + + * g10.c (main): Add secmem features and set the random seed file. + (g10_exit): Update the random seed file. + + * parse-packet.c (parse_signature,read_protected_v3_mpi) + (parse_key): Fixed use of mpi_set_opaque. + * keygen.c (gen_card_key): Ditto. + +2003-07-28 Werner Koch <wk@gnupg.org> + + * status.c (progress_cb): Adjusted for use with Libcgrypt. + (set_status_fd): Register that callback. + + * keygen.c (smartcard_change_login_data): New. + (smartcard_change_lang): New. + (smartcard_change_sex): New. + (check_smartcard): Add menu entries to edit the above. + (gen_elg,gen_dsa,gen_rsa): Reimplemented in terms of Libgcrypt. + (genhelp_protect, genhelp_factors, key_from_sexp): New. + * comment.c (make_comment_node_from_buffer): New. + (make_comment_node): Reimplemented in terms of above. + +2003-07-27 Werner Koch <wk@gnupg.org> + + Adjusted for gcry_mpi_print and gcry_mpi_scan API change. + +2003-07-24 Werner Koch <wk@gnupg.org> + + * g10.c: New command --card-status. + * card-util.c (card_status): New. + * call-agent.c (learn_status_cb): Parse more information. + + * keylist.c (print_pubkey_info): Add FP arg for optional printing + to a stream. Changed all callers. + +2003-07-23 Werner Koch <wk@gnupg.org> + + * keygen.c (generate_keypair): Create an AUTHKEYTYPE entry for cards. + (do_generate_keypair): Abd generate the authkey. + (check_smartcard): Changed menu accordingly. + +2003-07-22 Werner Koch <wk@gnupg.org> + + * g10.c: New command --change-pin. + * card-util.c: New. + * call-agent.c (agent_scd_change_pin): New. + (agent_release_card_info): New. + * keygen.c (check_smartcard): Use it here. + +2003-07-16 Werner Koch <wk@gnupg.org> + + * export.c (parse_export_options): New option sexp-format. + (export_seckeys,export_secsubkeys): Check sexp-format option. + (do_export): Ignore armor for sexp format. + (do_export_stream): Handle sexp-format. + (write_sexp_line,write_sexp_keyparm, build_sexp_seckey): New. + (build_sexp): New. + +2003-07-03 Werner Koch <wk@gnupg.org> + + * options.h (DBG_CIPHER): Reintroduced it. + * seskey.c (encode_session_key): Debug output of the session key. + + * pubkey-enc.c (get_it): Handle card case. + * call-agent.c (agent_scd_pkdecrypt): New. + * pkglue.c (pk_encrypt): Add RSA support. + + * g10.c (main): Default to --use-agent. + + * keygen.c (show_smartcard): Print info about the public key. + (check_smartcard): Check for existing key here. + (gen_card_key): And not anymore here. + (fpr_is_zero): New. + (generate_keypair): Generate both keys for a card. + (smartcard_change_url): Nw. + +2003-07-02 Werner Koch <wk@gnupg.org> + + * seckey-cert.c (is_secret_key_protected): Let it handle mode 1002. + +2003-07-01 Werner Koch <wk@gnupg.org> + + * keygen.c (gen_card_key): Obviously we should use the creation + date received from SCDAEMON, so that the fingerprints will match. + * sign.c (do_sign): Pass the serialno to the sign code. + * keyid.c (serialno_and_fpr_from_sk): New. + +2003-06-30 Werner Koch <wk@gnupg.org> + + * call-agent.h (agent_card_info_s): Add field serialno. + * call-agent.c (store_serialno): New. + (learn_status_cb): Store the serial number. + * keygen.c (gen_card_key): Store the serial number + (check_smartcard): New argument to return the serial number. + (generate_keypair): Get the serial number from check_smartcard and + store it as a parameter. + * parse-packet.c (parse_key): Use the protect.iv field to store the + serial number. + * build-packet.c (do_secret_key): Write the serial number. + +2003-06-27 Werner Koch <wk@gnupg.org> + + * seckey-cert.c (check_secret_key): Bypass the unprotection for + mode 1002. + * sign.c (do_sign): Handle card case (i.e. mode 1002). + +2003-06-26 Werner Koch <wk@gnupg.org> + + * build-packet.c (do_secret_key): Implement special protection + mode 1002. + * parse-packet.c (parse_key): Likewise. + + * keygen.c (smartcard_gen_key): New. + * call-agent.c (agent_scd_setattr): New. + +2003-06-24 Werner Koch <wk@gnupg.org> + + * Makefile.am: Removed signal.c + + * g10.c (emergency_cleanup): New. + (main): Use gnupg_init_signals and register malloc for assuan. + +2003-06-23 Werner Koch <wk@gnupg.org> + + * keyid.c (do_fingerprint_md): Made it work again. + +2003-06-19 Werner Koch <wk@gnupg.org> + + Fixed all "==" comparisons against error code constants to use + gpg_err_code(). + + * import.c (import_secret_one): + (import_revoke_cert): + (chk_self_sigs): + + * misc.c (openpgp_md_map_name): Check also for the Hx format. + (openpgp_cipher_map_name): Check also for the Sx format. + (pubkey_get_npkey): Adjusted for changed gcrypt API. + (pubkey_get_nskey): Ditto. + (pubkey_get_nsig): Ditto. + (pubkey_get_nenc): Ditto. + +2003-06-18 Werner Koch <wk@gnupg.org> + + Finished the bulk of changes for gnupg 1.9. This included + switching to libgcrypt functions, using shared error codes from + libgpg-error, replacing the old functions we used to have in + ../util by those in ../jnlib and ../common, renaming the malloc + functions and a couple of types. Note, that not all changes are + listed below becuause they are too similar and done at far too + many places. As of today the code builds using the current + libgcrypt from CVS but it is very unlikely that it actually works. + + * sig-check.c (cmp_help): Removed. Was never used. + + * pkglue.c: New. Most stuff taken from gnupg 1.1.2. + * pkglue.h: New. + + * misc.c (pull_in_libs): Removed. + + * keygen.c (count_chr): New. + (ask_user_id): Removed faked RNG support. + + * misc.c (openpgp_md_map_name,openpgp_cipher_map_name) + (openpgp_pk_map_name): New. + + * skclist.c (build_sk_list): Removed faked RNG support. + (is_insecure): Removed. + + * comment.c (make_mpi_comment_node): Use gcry MPI print function. + + * keyid.c (v3_keyid): New. + + * misc.c (mpi_write,mpi_write_opaque,mpi_read,mpi_read_opaque) + (mpi_print): New. Taken from gnupg 1.1.2. + (checksum_mpi): Replaced by implementation from 1.1.2. + + * g10.c (my_strusage): Renamed from strusage and return NULL + instead calling a default function. + (add_to_strlist2): New. Taken from ../util/strgutil.c of gnupg 1.2. + + * plaintext.c (handle_plaintext): New arg CREATE_FILE to cope with + the fact that gpg-error does not have this error code anymore. + + * mainproc.c (symkey_decrypt_sesskey): Ditto. + + * seskey.c (make_session_key): Adjusted for use with libgcrypt. + (encode_session_key): Ditto. + (do_encode_md): Ditto. + (encode_md_value): Ditto. + + * keyring.c: Use libgpg-error instead of READ_ERROR etc. + + * g10.c: Adjusted all algorithm name/id mapping functions. + (set_debug): Pass MPI and CRYPTO debug values to libgcrypt. + + * Makefile.am (INCLUDES): Define LOCALEDIR and the default error + source. + + * g10.c (i18n_init): s/G10_LOCALEDIR/LOCALEDIR/. + + Renamed m_alloc et al to xmalloc et al. + s/g10_errstr/gpg_strerror/ + s/MPI/gcry_mpi_t/ + Adjusted all md_open calls to the libgcrypt API. + + * build-packet.c (do_comment): Return error code from iobuf write + function. + (do_user_id): Ditto. + (do_public_key): Ditto. + + * Makefile.am: Add new files, link gpg with libgpg-error. + * g10.c, options.h: New option --agent-program. + * call-agent.c: New. + * gpg.h, call-agent.h: New. + 2003-06-03 David Shaw <dshaw@jabberwocky.com> * options.h, g10.c (main), keylist.c (list_keyblock_print): Add @@ -5009,7 +1363,7 @@ 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 is to be used. Noted by Ingo Klcker. (agent_get_passphrase): Inhibit caching when we have no fingerprint. This is required for key generation as well as for symmetric only encryption. @@ -5424,8 +1778,8 @@ (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. + * status.h: Add new status code. + * status.c: Ditto. 2002-12-13 David Shaw <dshaw@jabberwocky.com> @@ -5952,7 +2306,7 @@ warning. * passphrase.c (agent_get_passphrase): Fixed signed/unsigned char - problem in %-escaping. Noted by Ingo Klöcker. + problem in %-escaping. Noted by Ingo Klcker. 2002-10-03 David Shaw <dshaw@jabberwocky.com> @@ -10280,12 +6634,12 @@ Fri Feb 11 17:44:40 CET 2000 Werner Koch <wk@gnupg.de> 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. + By Rmi. 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. + regulat output lines. By Rmi. * sig-check.c: Include options.h @@ -10875,7 +7229,7 @@ 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). + plaintext.c, free-packet.c: Speed patches (Rmi). Thu May 27 09:40:55 CEST 1999 Werner Koch <wk@isil.d.shuttle.de> @@ -10900,7 +7254,7 @@ Wed May 26 14:36:29 CEST 1999 Werner Koch <wk@isil.d.shuttle.de> 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 + onyl file becuase we can be sure the the verifier supports other algorithms. * build-packet.c (build_sig_subpkt): Support for notation data. @@ -11090,7 +7444,7 @@ Wed Apr 7 20:51:39 CEST 1999 Werner Koch <wk@isil.d.shuttle.de> (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) + * keygen.c (do_create): Fixed spelling (Gal Quri) (ask_keysize): Only allow keysizes up to 4096 * ringedit.c (add_keyblock_resource): chmod newly created secrings. @@ -11133,7 +7487,7 @@ Wed Mar 17 13:09:03 CET 1999 Werner Koch <wk@isil.d.shuttle.de> * trustdb.c (insert_trust_record): Always use the primary key. - * encode.c (encode_simple): Added text_mode filter (Rémi Guyomarch) + * encode.c (encode_simple): Added text_mode filter (Rmi Guyomarch) (encode_crypt): Ditto. * mainproc.c (proc_pubkey_enc): Added status ENC_TO. @@ -12514,7 +8868,7 @@ Wed Apr 8 13:40:33 1998 Werner Koch (wk@isil.d.shuttle.de) 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. + * sig-check.c (do_check): Applied small fix from Ulf Mller. Tue Apr 7 19:28:07 1998 Werner Koch (wk@isil.d.shuttle.de) @@ -12892,8 +9246,8 @@ 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. + 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 diff --git a/g10/Makefile.am b/g10/Makefile.am index fa4e0b536..a9847cfa7 100644 --- a/g10/Makefile.am +++ b/g10/Makefile.am @@ -1,5 +1,5 @@ -# Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005 Free Software Foundation, Inc. +# Copyright (C) 1998, 1999, 2000, 2001, 2002, +# 2003, 2006 Free Software Foundation, Inc. # # This file is part of GnuPG. # @@ -15,36 +15,29 @@ # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +# 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 +AM_CPPFLAGS = -I$(top_srcdir)/gl -I$(top_srcdir)/common \ + -I$(top_srcdir)/include -I$(top_srcdir)/intl -needed_libs = ../cipher/libcipher.a ../mpi/libmpi.a ../util/libutil.a -other_libs = $(LIBICONV) $(DNSLIBS) $(LIBINTL) $(CAPLIBS) +include $(top_srcdir)/am/cmacros.am -bin_PROGRAMS = gpg gpgv +AM_CFLAGS = $(LIBGCRYPT_CFLAGS) -if ENABLE_BZIP2_SUPPORT -bzip2_source = compress-bz2.c -else -bzip2_source = -endif +needed_libs = ../gl/libgnu.a ../common/libcommon.a ../jnlib/libjnlib.a + +bin_PROGRAMS = gpg2 gpgv2 common_source = \ - global.h \ + gpg.h \ build-packet.c \ compress.c \ - $(bzip2_source) \ + compress-bz2.c \ filter.h \ free-packet.c \ getkey.c \ @@ -69,28 +62,10 @@ common_source = \ plaintext.c \ sig-check.c \ keylist.c \ - signal.c + pkglue.c pkglue.h -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 \ +gpg2_SOURCES = gpg.c \ $(common_source) \ - $(card_support_source) \ pkclist.c \ skclist.c \ pubkey-enc.c \ @@ -114,43 +89,33 @@ gpg_SOURCES = gpg.c \ tdbio.h \ delkey.c \ keygen.c \ - pipemode.c \ helptext.c \ keyserver.c \ keyserver-internal.h \ photoid.c photoid.h \ + call-agent.c call-agent.h \ + card-util.c \ exec.c exec.h -gpgv_SOURCES = gpgv.c \ +gpgv2_SOURCES = gpgv.c \ $(common_source) \ verify.c -LDADD = $(needed_libs) $(other_libs) @ZLIBS@ @W32LIBS@ @LIBREADLINE@ -gpg_LDADD = $(LDADD) @DLLIBS@ @NETLIBS@ @LIBUSB@ +#gpgd_SOURCES = gpgd.c \ +# ks-proto.h \ +# ks-proto.c \ +# ks-db.c \ +# ks-db.h \ +# $(common_source) + +LDADD = $(needed_libs) $(ZLIBS) @LIBINTL@ @CAPLIBS@ @W32LIBS@ +gpg2_LDADD = $(LIBGCRYPT_LIBS) $(LDADD) -lassuan -lgpg-error +gpgv2_LDADD = $(LIBGCRYPT_LIBS) $(LDADD) -lassuan -lgpg-error $(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 + $(DESTDIR)$(pkgdatadir)/gpg-conf.skel -# 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/armor.c b/g10/armor.c index e437d3db0..2336ff6f9 100644 --- a/g10/armor.c +++ b/g10/armor.c @@ -28,9 +28,9 @@ #include <assert.h> #include <ctype.h> +#include "gpg.h" #include "errors.h" #include "iobuf.h" -#include "memory.h" #include "util.h" #include "filter.h" #include "packet.h" @@ -336,7 +336,7 @@ parse_header_line( armor_filter_context_t *afx, byte *line, unsigned int len ) int hashes=0; unsigned int len2; - len2 = check_trailing_ws( line, len ); + len2 = length_sans_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 */ @@ -431,7 +431,7 @@ check_input( armor_filter_context_t *afx, IOBUF a ) if( hdr_line == BEGIN_SIGNED_MSG_IDX ) { if( afx->in_cleartext ) { log_error(_("nested clear text signatures\n")); - rc = G10ERR_INVALID_ARMOR; + rc = gpg_error (GPG_ERR_INV_ARMOR); } afx->in_cleartext = 1; } @@ -662,10 +662,10 @@ fake_packet( armor_filter_context_t *afx, IOBUF a, static int invalid_crc(void) { - if ( opt.ignore_crc_error ) - return 0; - log_inc_errorcount(); - return G10ERR_INVALID_ARMOR; + if ( opt.ignore_crc_error ) + return 0; + log_inc_errorcount(); + return gpg_error (GPG_ERR_INV_ARMOR); } diff --git a/g10/build-packet.c b/g10/build-packet.c index a7ac5d829..878481961 100644 --- a/g10/build-packet.c +++ b/g10/build-packet.c @@ -27,13 +27,12 @@ #include <assert.h> #include <ctype.h> +#include "gpg.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" @@ -151,6 +150,27 @@ build_packet( IOBUF out, PACKET *pkt ) return rc; } + +/* + * Write the mpi A to OUT. + */ +static int +mpi_write (iobuf_t out, gcry_mpi_t a) +{ + char buffer[(MAX_EXTERN_MPI_BITS+7)/8]; + size_t nbytes; + int rc; + + nbytes = (MAX_EXTERN_MPI_BITS+7)/8; + rc = gcry_mpi_print (GCRYMPI_FMT_PGP, buffer, nbytes, &nbytes, a ); + if( !rc ) + rc = iobuf_write( out, buffer, nbytes ); + + return rc; +} + + + /**************** * calculate the length of a packet described by PKT */ @@ -188,31 +208,32 @@ calc_packet_length( PACKET *pkt ) } static void -write_fake_data( IOBUF out, MPI a ) +write_fake_data (IOBUF out, gcry_mpi_t a) { - if( a ) { - unsigned int i; - void *p; - - p = mpi_get_opaque( a, &i ); - iobuf_write( out, p, i ); + if (a) + { + unsigned int n; + void *p; + + p = gcry_mpi_get_opaque ( a, &n ); + iobuf_write (out, p, (n+7)/8 ); } } static int do_user_id( IOBUF out, int ctb, PKT_user_id *uid ) { + int rc; + 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; + rc = iobuf_write( out, uid->attrib_data, uid->attrib_len ); } else { write_header2( out, ctb, uid->len, 2 ); - if( iobuf_write( out, uid->name, uid->len ) ) - return G10ERR_WRITE_FILE; + rc = iobuf_write( out, uid->name, uid->len ); } return 0; } @@ -245,8 +266,7 @@ do_public_key( IOBUF out, int ctb, PKT_public_key *pk ) 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; + rc = iobuf_write_temp( out, a ); iobuf_close(a); return rc; @@ -352,21 +372,21 @@ do_secret_key( IOBUF out, int ctb, PKT_secret_key *sk ) else if( sk->is_protected && sk->version >= 4 ) { /* The secret key is protected - write it out as it is */ byte *p; - unsigned int ndata; + unsigned int ndatabits; - assert( mpi_is_opaque( sk->skey[npkey] ) ); - p = mpi_get_opaque( sk->skey[npkey], &ndata ); - iobuf_write(a, p, ndata ); + assert (gcry_mpi_get_flag (sk->skey[npkey], GCRYMPI_FLAG_OPAQUE)); + p = gcry_mpi_get_opaque (sk->skey[npkey], &ndatabits ); + iobuf_write (a, p, (ndatabits+7)/8 ); } else if( sk->is_protected ) { /* The secret key is protected te old v4 way. */ for( ; i < nskey; i++ ) { byte *p; - unsigned int ndata; + unsigned int ndatabits; - assert (mpi_is_opaque (sk->skey[i])); - p = mpi_get_opaque (sk->skey[i], &ndata); - iobuf_write (a, p, ndata); + assert (gcry_mpi_get_flag (sk->skey[i], GCRYMPI_FLAG_OPAQUE)); + p = gcry_mpi_get_opaque (sk->skey[i], &ndatabits); + iobuf_write (a, p, (ndatabits+7)/8); } write_16(a, sk->csum ); } @@ -382,8 +402,7 @@ do_secret_key( IOBUF out, int ctb, PKT_secret_key *sk ) 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; + rc = iobuf_write_temp( out, a ); iobuf_close(a); /* close the remporary buffer */ return rc; @@ -413,8 +432,7 @@ do_symkey_enc( IOBUF out, int ctb, PKT_symkey_enc *enc ) 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; + rc = iobuf_write_temp( out, a ); iobuf_close(a); return rc; @@ -445,8 +463,7 @@ do_pubkey_enc( IOBUF out, int ctb, PKT_pubkey_enc *enc ) 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; + rc = iobuf_write_temp( out, a ); iobuf_close(a); return rc; @@ -479,16 +496,16 @@ do_plaintext( IOBUF out, int ctb, PKT_plaintext *pt ) 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; + rc = write_32(out, pt->timestamp ); + if (rc) + return rc; 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; + rc = iobuf_write (out, buf, nbytes); + if (rc) + break; + n += nbytes; } wipememory(buf,1000); /* burn the buffer */ if( (ctb&0x40) && !pt->len ) @@ -1103,8 +1120,7 @@ do_signature( IOBUF out, int ctb, PKT_signature *sig ) 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; + rc = iobuf_write_temp( out, a ); iobuf_close(a); return rc; @@ -1126,8 +1142,7 @@ do_onepass_sig( IOBUF out, int ctb, PKT_onepass_sig *ops ) iobuf_put(a, ops->last ); write_header(out, ctb, iobuf_get_temp_length(a) ); - if( iobuf_write_temp( out, a ) ) - rc = G10ERR_WRITE_FILE; + rc = iobuf_write_temp( out, a ); iobuf_close(a); return rc; @@ -1149,9 +1164,7 @@ 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; + return iobuf_put(out, a); } diff --git a/g10/call-agent.c b/g10/call-agent.c new file mode 100644 index 000000000..e3bd7ed57 --- /dev/null +++ b/g10/call-agent.c @@ -0,0 +1,925 @@ +/* call-agent.c - divert operations to the agent + * 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. + */ + +#if 0 /* let Emacs display a red warning */ +#error fixme: this shares a lot of code with the file in ../sm +#endif + +#include <config.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include <unistd.h> +#include <time.h> +#include <assert.h> +#ifdef HAVE_LOCALE_H +#include <locale.h> +#endif +#include <assuan.h> + +#include "gpg.h" +#include "util.h" +#include "membuf.h" +#include "options.h" +#include "i18n.h" +#include "call-agent.h" + +#ifndef DBG_ASSUAN +# define DBG_ASSUAN 1 +#endif + +static ASSUAN_CONTEXT agent_ctx = NULL; +static int force_pipe_server = 1; /* FIXME: set this back to 0. */ + +struct cipher_parm_s { + ASSUAN_CONTEXT ctx; + const char *ciphertext; + size_t ciphertextlen; +}; + +struct genkey_parm_s { + ASSUAN_CONTEXT ctx; + const char *sexp; + size_t sexplen; +}; + + + +/* Try to connect to the agent via socket or fork it off and work by + pipes. Handle the server's initial greeting */ +static int +start_agent (void) +{ + int rc = 0; + char *infostr, *p; + ASSUAN_CONTEXT ctx; + char *dft_display = NULL; + char *dft_ttyname = NULL; + char *dft_ttytype = NULL; + char *old_lc = NULL; + char *dft_lc = NULL; + + if (agent_ctx) + return 0; /* fixme: We need a context for each thread or serialize + the access to the agent. */ + + infostr = force_pipe_server? NULL : getenv ("GPG_AGENT_INFO"); + if (!infostr || !*infostr) + { + const char *pgmname; + const char *argv[3]; + int no_close_list[3]; + int i; + + if (opt.verbose) + log_info (_("no running gpg-agent - starting one\n")); + + if (fflush (NULL)) + { + gpg_error_t tmperr = gpg_error_from_errno (errno); + log_error ("error flushing pending output: %s\n", strerror (errno)); + return tmperr; + } + + if (!opt.agent_program || !*opt.agent_program) + opt.agent_program = GNUPG_DEFAULT_AGENT; + if ( !(pgmname = strrchr (opt.agent_program, '/'))) + pgmname = opt.agent_program; + else + pgmname++; + + argv[0] = pgmname; + argv[1] = "--server"; + argv[2] = NULL; + + i=0; + if (log_get_fd () != -1) + no_close_list[i++] = log_get_fd (); + no_close_list[i++] = fileno (stderr); + no_close_list[i] = -1; + + /* connect to the agent and perform initial handshaking */ + rc = assuan_pipe_connect (&ctx, opt.agent_program, (char**)argv, + no_close_list); + } + else + { + int prot; + int pid; + + infostr = xstrdup (infostr); + if ( !(p = strchr (infostr, ':')) || p == infostr) + { + log_error (_("malformed GPG_AGENT_INFO environment variable\n")); + xfree (infostr); + force_pipe_server = 1; + return start_agent (); + } + *p++ = 0; + pid = atoi (p); + while (*p && *p != ':') + p++; + prot = *p? atoi (p+1) : 0; + if (prot != 1) + { + log_error (_("gpg-agent protocol version %d is not supported\n"), + prot); + xfree (infostr); + force_pipe_server = 1; + return start_agent (); + } + + rc = assuan_socket_connect (&ctx, infostr, pid); + xfree (infostr); + if (rc == ASSUAN_Connect_Failed) + { + log_error (_("can't connect to the agent - trying fall back\n")); + force_pipe_server = 1; + return start_agent (); + } + } + + if (rc) + { + log_error ("can't connect to the agent: %s\n", assuan_strerror (rc)); + return gpg_error (GPG_ERR_NO_AGENT); + } + agent_ctx = ctx; + + if (DBG_ASSUAN) + log_debug ("connection to agent established\n"); + + rc = assuan_transact (agent_ctx, "RESET", NULL, NULL, NULL, NULL, NULL, NULL); + if (rc) + return map_assuan_err (rc); + +#ifdef __GNUC__ +#warning put this code into common/asshelp.c +#endif + + dft_display = getenv ("DISPLAY"); + if (opt.display || dft_display) + { + char *optstr; + if (asprintf (&optstr, "OPTION display=%s", + opt.display ? opt.display : dft_display) < 0) + return gpg_error_from_errno (errno); + rc = assuan_transact (agent_ctx, optstr, NULL, NULL, NULL, NULL, NULL, + NULL); + free (optstr); + if (rc) + return map_assuan_err (rc); + } + if (!opt.ttyname) + { + dft_ttyname = getenv ("GPG_TTY"); + if ((!dft_ttyname || !*dft_ttyname) && ttyname (0)) + dft_ttyname = ttyname (0); + } + if (opt.ttyname || dft_ttyname) + { + char *optstr; + if (asprintf (&optstr, "OPTION ttyname=%s", + opt.ttyname ? opt.ttyname : dft_ttyname) < 0) + return gpg_error_from_errno (errno); + rc = assuan_transact (agent_ctx, optstr, NULL, NULL, NULL, NULL, NULL, + NULL); + free (optstr); + if (rc) + return map_assuan_err (rc); + } + dft_ttytype = getenv ("TERM"); + if (opt.ttytype || (dft_ttyname && dft_ttytype)) + { + char *optstr; + if (asprintf (&optstr, "OPTION ttytype=%s", + opt.ttyname ? opt.ttytype : dft_ttytype) < 0) + return gpg_error_from_errno (errno); + rc = assuan_transact (agent_ctx, optstr, NULL, NULL, NULL, NULL, NULL, + NULL); + free (optstr); + if (rc) + return map_assuan_err (rc); + } +#if defined(HAVE_SETLOCALE) && defined(LC_CTYPE) + old_lc = setlocale (LC_CTYPE, NULL); + if (old_lc) + { + old_lc = strdup (old_lc); + if (!old_lc) + return gpg_error_from_errno (errno); + + } + dft_lc = setlocale (LC_CTYPE, ""); +#endif + if (opt.lc_ctype || (dft_ttyname && dft_lc)) + { + char *optstr; + if (asprintf (&optstr, "OPTION lc-ctype=%s", + opt.lc_ctype ? opt.lc_ctype : dft_lc) < 0) + rc = gpg_error_from_errno (errno); + else + { + rc = assuan_transact (agent_ctx, optstr, NULL, NULL, NULL, NULL, NULL, + NULL); + free (optstr); + if (rc) + rc = map_assuan_err (rc); + } + } +#if defined(HAVE_SETLOCALE) && defined(LC_CTYPE) + if (old_lc) + { + setlocale (LC_CTYPE, old_lc); + free (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 = strdup (old_lc); + if (!old_lc) + return gpg_error_from_errno (errno); + } + dft_lc = setlocale (LC_MESSAGES, ""); +#endif + if (opt.lc_messages || (dft_ttyname && dft_lc)) + { + char *optstr; + if (asprintf (&optstr, "OPTION lc-messages=%s", + opt.lc_messages ? opt.lc_messages : dft_lc) < 0) + rc = gpg_error_from_errno (errno); + else + { + rc = assuan_transact (agent_ctx, optstr, NULL, NULL, NULL, NULL, NULL, + NULL); + free (optstr); + if (rc) + rc = map_assuan_err (rc); + } + } +#if defined(HAVE_SETLOCALE) && defined(LC_MESSAGES) + if (old_lc) + { + setlocale (LC_MESSAGES, old_lc); + free (old_lc); + } +#endif + + return rc; +} + + +/* 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. Function returns NULL to indicate + an out of memory status. */ +static char * +unescape_status_string (const unsigned char *s) +{ + char *buffer, *d; + + buffer = d = xtrymalloc (strlen (s)+1); + if (!buffer) + return NULL; + 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; +} + +/* 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 = xtrymalloc (s + 1 - line); + if (p) + { + memcpy (p, line, s-line); + p[s-line] = 0; + } + return p; +} + + + +#if 0 +/* Handle a KEYPARMS inquiry. Note, we only send the data, + assuan_transact takes care of flushing and writing the end */ +static AssuanError +inq_genkey_parms (void *opaque, const char *keyword) +{ + struct genkey_parm_s *parm = opaque; + AssuanError rc; + + rc = assuan_send_data (parm->ctx, parm->sexp, parm->sexplen); + return rc; +} + + + +/* Call the agent to generate a new key */ +int +agent_genkey (KsbaConstSexp keyparms, KsbaSexp *r_pubkey) +{ + int rc; + struct genkey_parm_s gk_parm; + membuf_t data; + size_t len; + char *buf; + + *r_pubkey = NULL; + rc = start_agent (); + if (rc) + return rc; + + rc = assuan_transact (agent_ctx, "RESET", NULL, NULL, + NULL, NULL, NULL, NULL); + if (rc) + return map_assuan_err (rc); + + init_membuf (&data, 1024); + gk_parm.ctx = agent_ctx; + gk_parm.sexp = keyparms; + gk_parm.sexplen = gcry_sexp_canon_len (keyparms, 0, NULL, NULL); + if (!gk_parm.sexplen) + return gpg_error (GPG_ERR_INV_VALUE); + rc = assuan_transact (agent_ctx, "GENKEY", + membuf_data_cb, &data, + inq_genkey_parms, &gk_parm, NULL, NULL); + if (rc) + { + xfree (get_membuf (&data, &len)); + return map_assuan_err (rc); + } + buf = get_membuf (&data, &len); + if (!buf) + return gpg_error (GPG_ERR_ENOMEM); + if (!gcry_sexp_canon_len (buf, len, NULL, NULL)) + { + xfree (buf); + return gpg_error (GPG_ERR_INV_SEXP); + } + *r_pubkey = buf; + return 0; +} +#endif /*0*/ + + + +/* Ask the agent whether the corresponding secret key is available for + the given keygrip. */ +int +agent_havekey (const char *hexkeygrip) +{ + int rc; + char line[ASSUAN_LINELENGTH]; + + rc = start_agent (); + if (rc) + return rc; + + if (!hexkeygrip || strlen (hexkeygrip) != 40) + return gpg_error (GPG_ERR_INV_VALUE); + + snprintf (line, DIM(line)-1, "HAVEKEY %s", hexkeygrip); + line[DIM(line)-1] = 0; + + rc = assuan_transact (agent_ctx, line, NULL, NULL, NULL, NULL, NULL, NULL); + return map_assuan_err (rc); +} + + +/* Release the card info structure INFO. */ +void +agent_release_card_info (struct agent_card_info_s *info) +{ + 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->cafpr1valid = info->cafpr2valid = info->cafpr3valid = 0; + info->fpr1valid = info->fpr2valid = info->fpr3valid = 0; +} + +static AssuanError +learn_status_cb (void *opaque, const char *line) +{ + struct agent_card_info_s *parm = opaque; + const char *keyword = line; + int keywordlen; + int i; + + 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_status_string (line); + } + else if (keywordlen == 9 && !memcmp (keyword, "DISP-LANG", keywordlen)) + { + xfree (parm->disp_lang); + parm->disp_lang = unescape_status_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_status_string (line); + } + else if (keywordlen == 10 && !memcmp (keyword, "LOGIN-DATA", keywordlen)) + { + xfree (parm->login_data); + parm->login_data = unescape_status_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_status_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 == 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); + } + + return 0; +} + +/* Call the agent to learn about a smartcard */ +int +agent_learn (struct agent_card_info_s *info) +{ + int rc; + + rc = start_agent (); + if (rc) + return rc; + + memset (info, 0, sizeof *info); + rc = assuan_transact (agent_ctx, "LEARN --send", + NULL, NULL, NULL, NULL, + learn_status_cb, info); + + return map_assuan_err (rc); +} + +/* Call the agent to retrieve a data object. This function returns + the data in the same structure as used by the learn command. It is + allowed to update such a structure using this commmand. */ +int +agent_scd_getattr (const char *name, struct agent_card_info_s *info) +{ + int rc; + char line[ASSUAN_LINELENGTH]; + + if (!*name) + return gpg_error (GPG_ERR_INV_VALUE); + + /* We assume that NAME does not need escaping. */ + if (12 + strlen (name) > DIM(line)-1) + return gpg_error (GPG_ERR_TOO_LARGE); + stpcpy (stpcpy (line, "SCD GETATTR "), name); + + rc = start_agent (); + if (rc) + return rc; + + rc = assuan_transact (agent_ctx, line, NULL, NULL, NULL, NULL, + learn_status_cb, info); + + return map_assuan_err (rc); +} + + +/* Send an setattr command to the SCdaemon. SERIALNO is not actually + used here but required by gpg 1.4's implementation of this code in + cardglue.c. */ +int +agent_scd_setattr (const char *name, + const unsigned char *value, size_t valuelen, + const char *serialno) +{ + int rc; + char line[ASSUAN_LINELENGTH]; + char *p; + + if (!*name || !valuelen) + return gpg_error (GPG_ERR_INV_VALUE); + + /* We assume that NAME does not need escaping. */ + if (12 + strlen (name) > DIM(line)-1) + return gpg_error (GPG_ERR_TOO_LARGE); + + p = stpcpy (stpcpy (line, "SCD SETATTR "), name); + *p++ = ' '; + for (; valuelen; value++, valuelen--) + { + if (p >= line + DIM(line)-5 ) + return gpg_error (GPG_ERR_TOO_LARGE); + if (*value < ' ' || *value == '+' || *value == '%') + { + sprintf (p, "%%%02X", *value); + p += 3; + } + else if (*value == ' ') + *p++ = '+'; + else + *p++ = *value; + } + *p = 0; + + rc = start_agent (); + if (rc) + return rc; + + rc = assuan_transact (agent_ctx, line, NULL, NULL, NULL, NULL, NULL, NULL); + return map_assuan_err (rc); +} + + +/* Status callback for the SCD GENKEY command. */ +static AssuanError +scd_genkey_cb (void *opaque, const char *line) +{ + struct agent_card_genkey_s *parm = opaque; + const char *keyword = line; + int keywordlen; + gpg_error_t rc; + + 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)) + { + gcry_mpi_t a; + const char *name = line; + + while (*line && !spacep (line)) + line++; + while (spacep (line)) + line++; + + rc = gcry_mpi_scan (&a, GCRYMPI_FMT_HEX, line, 0, NULL); + if (rc) + log_error ("error parsing received key data: %s\n", gpg_strerror (rc)); + 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"); + gcry_mpi_release (a); + } + } + 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. SERIALNO is not used in + this implementation. */ +int +agent_scd_genkey (struct agent_card_genkey_s *info, int keyno, int force, + const char *serialno) +{ + int rc; + char line[ASSUAN_LINELENGTH]; + + rc = start_agent (); + if (rc) + return rc; + + memset (info, 0, sizeof *info); + snprintf (line, DIM(line)-1, "SCD GENKEY %s%d", + force? "--force ":"", keyno); + line[DIM(line)-1] = 0; + + memset (info, 0, sizeof *info); + rc = assuan_transact (agent_ctx, line, + NULL, NULL, NULL, NULL, + scd_genkey_cb, info); + + return map_assuan_err (rc); +} + + +static AssuanError +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 sign command to the scdaemon via gpg-agent's pass thru + mechanism. */ +int +agent_scd_pksign (const char *serialno, int hashalgo, + const unsigned char *indata, size_t indatalen, + char **r_buf, size_t *r_buflen) +{ + int rc, i; + char *p, line[ASSUAN_LINELENGTH]; + membuf_t data; + size_t len; + + /* Note, hashalgo is not yet used but hardwired to SHA1 in SCdaemon. */ + + *r_buf = NULL; + *r_buflen = 0; + + rc = start_agent (); + if (rc) + return rc; + + if (indatalen*2 + 50 > DIM(line)) + return gpg_error (GPG_ERR_GENERAL); + + sprintf (line, "SCD SETDATA "); + p = line + strlen (line); + for (i=0; i < indatalen ; i++, p += 2 ) + sprintf (p, "%02X", indata[i]); + rc = assuan_transact (agent_ctx, line, NULL, NULL, NULL, NULL, NULL, NULL); + if (rc) + return map_assuan_err (rc); + + init_membuf (&data, 1024); +#if 0 + if (!hashalgo) /* Temporary test hack. */ + snprintf (line, DIM(line)-1, "SCD PKAUTH %s", serialno); + else +#endif + snprintf (line, DIM(line)-1, "SCD PKSIGN %s", serialno); + line[DIM(line)-1] = 0; + rc = assuan_transact (agent_ctx, line, membuf_data_cb, &data, + NULL, NULL, NULL, NULL); + if (rc) + { + xfree (get_membuf (&data, &len)); + return map_assuan_err (rc); + } + *r_buf = get_membuf (&data, r_buflen); + + return 0; +} + + +/* Decrypt INDATA of length INDATALEN using the card identified by + SERIALNO. Return the plaintext in a nwly allocated buffer stored + at the address of R_BUF. + + Note, we currently support only RSA or more exactly algorithms + taking one input data element. */ +int +agent_scd_pkdecrypt (const char *serialno, + const unsigned char *indata, size_t indatalen, + char **r_buf, size_t *r_buflen) +{ + int rc, i; + char *p, line[ASSUAN_LINELENGTH]; + membuf_t data; + size_t len; + + *r_buf = NULL; + rc = start_agent (); + if (rc) + return rc; + + /* FIXME: use secure memory where appropriate */ + if (indatalen*2 + 50 > DIM(line)) + return gpg_error (GPG_ERR_GENERAL); + + sprintf (line, "SCD SETDATA "); + p = line + strlen (line); + for (i=0; i < indatalen ; i++, p += 2 ) + sprintf (p, "%02X", indata[i]); + rc = assuan_transact (agent_ctx, line, NULL, NULL, NULL, NULL, NULL, NULL); + if (rc) + return map_assuan_err (rc); + + init_membuf (&data, 1024); + snprintf (line, DIM(line)-1, "SCD PKDECRYPT %s", serialno); + line[DIM(line)-1] = 0; + rc = assuan_transact (agent_ctx, line, + membuf_data_cb, &data, + NULL, NULL, NULL, NULL); + if (rc) + { + xfree (get_membuf (&data, &len)); + return map_assuan_err (rc); + } + *r_buf = get_membuf (&data, r_buflen); + if (!*r_buf) + return gpg_error (GPG_ERR_ENOMEM); + + return 0; +} + + +/* Change the PIN of an OpenPGP card or reset the retry counter. + CHVNO 1: Change the PIN + 2: Same as 1 + 3: Change the admin PIN + 101: Set a new PIN and reset the retry counter + 102: Same as 101 + SERIALNO is not used. + */ +int +agent_scd_change_pin (int chvno, const char *serialno) +{ + int rc; + char line[ASSUAN_LINELENGTH]; + const char *reset = ""; + + if (chvno >= 100) + reset = "--reset"; + chvno %= 100; + + rc = start_agent (); + if (rc) + return rc; + + snprintf (line, DIM(line)-1, "SCD PASSWD %s %d", reset, chvno); + line[DIM(line)-1] = 0; + rc = assuan_transact (agent_ctx, line, NULL, NULL, + NULL, NULL, NULL, NULL); + return map_assuan_err (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 *serialno) +{ + int rc; + char line[ASSUAN_LINELENGTH]; + + rc = start_agent (); + if (rc) + return rc; + + snprintf (line, DIM(line)-1, "SCD CHECKPIN %s", serialno); + line[DIM(line)-1] = 0; + return assuan_transact (agent_ctx, line, + NULL, NULL, + NULL, NULL, NULL, NULL); +} + + +/* Dummy function, only used by the gpg 1.4 implementation. */ +void +agent_clear_pin_cache (const char *sn) +{ + +} diff --git a/g10/call-agent.h b/g10/call-agent.h new file mode 100644 index 000000000..d09b87e3a --- /dev/null +++ b/g10/call-agent.h @@ -0,0 +1,110 @@ +/* call-agent.h - Divert operations to the agent + * 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_G10_CALL_AGENT_H +#define GNUPG_G10_CALL_AGENT_H + + +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; + gcry_mpi_t n; + gcry_mpi_t e; +}; + + +/* 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); + +/* Update INFO with the attribute NAME. */ +int agent_scd_getattr (const char *name, 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); + +/* 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 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, + 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, + 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 the CHECKPIN command to the SCdaemon. */ +int agent_scd_checkpin (const char *serialno); + +/* Dummy function, only implemented by gpg 1.4. */ +void agent_clear_pin_cache (const char *sn); + + +#endif /*GNUPG_G10_CALL_AGENT_H*/ + diff --git a/g10/card-util.c b/g10/card-util.c index 0c8365405..b7da1ba98 100644 --- a/g10/card-util.c +++ b/g10/card-util.c @@ -27,7 +27,7 @@ #include <assert.h> #if GNUPG_MAJOR_VERSION != 1 -#include "gpg.h" +# include "gpg.h" #endif /*GNUPG_MAJOR_VERSION != 1*/ #include "util.h" #include "i18n.h" @@ -37,13 +37,13 @@ #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" +# 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" +# include "call-agent.h" #endif /*GNUPG_MAJOR_VERSION!=1*/ #define CONTROL_D ('D' - 'A' + 1) @@ -1091,12 +1091,8 @@ generate_card_keys (const char *serialno) 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); @@ -1275,7 +1271,7 @@ card_store_subkey (KBNODE node, int use) sk->skey[i] = NULL; } i = pubkey_get_npkey (sk->pubkey_algo); - sk->skey[i] = mpi_set_opaque (NULL, xstrdup ("dummydata"), 10); + sk->skey[i] = gcry_mpi_set_opaque (NULL, xstrdup ("dummydata"), 10*8); sk->is_protected = 1; sk->protect.s2k.mode = 1002; s = info.serialno; diff --git a/g10/cardglue.c b/g10/cardglue.c deleted file mode 100644 index 1bfb9e413..000000000 --- a/g10/cardglue.c +++ /dev/null @@ -1,1432 +0,0 @@ -/* 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*/ - - -/* 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 deleted file mode 100644 index b1f2811df..000000000 --- a/g10/cardglue.h +++ /dev/null @@ -1,211 +0,0 @@ -/* 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/cipher.c b/g10/cipher.c index f7332ba3e..b33deb28b 100644 --- a/g10/cipher.c +++ b/g10/cipher.c @@ -1,5 +1,6 @@ /* cipher.c - En-/De-ciphering filter - * Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. + * Copyright (C) 1998, 1999, 2000, 2001, 2003, + * 2006 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -26,9 +27,9 @@ #include <errno.h> #include <assert.h> +#include "gpg.h" #include "errors.h" #include "iobuf.h" -#include "memory.h" #include "util.h" #include "filter.h" #include "packet.h" @@ -43,14 +44,15 @@ static void write_header( cipher_filter_context_t *cfx, IOBUF a ) { + gcry_error_t err; PACKET pkt; PKT_encrypted ed; byte temp[18]; - unsigned blocksize; - unsigned nprefix; + unsigned int blocksize; + unsigned int nprefix; - blocksize = cipher_get_blocksize( cfx->dek->algo ); - if( blocksize < 8 || blocksize > 16 ) + blocksize = gcry_cipher_get_algo_blklen (cfx->dek->algo); + if ( blocksize < 8 || blocksize > 16 ) log_fatal("unsupported blocksize %u\n", blocksize ); memset( &ed, 0, sizeof ed ); @@ -59,9 +61,9 @@ write_header( cipher_filter_context_t *cfx, IOBUF a ) 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 ); + gcry_md_open (&cfx->mdc_hash, DIGEST_ALGO_SHA1, 0); if ( DBG_HASHING ) - md_start_debug( cfx->mdc_hash, "creatmdc" ); + gcry_md_start_debug (cfx->mdc_hash, "creatmdc"); } { @@ -77,21 +79,31 @@ write_header( cipher_filter_context_t *cfx, IOBUF a ) if( build_packet( a, &pkt )) log_bug("build_packet(ENCR_DATA) failed\n"); nprefix = blocksize; - randomize_buffer( temp, nprefix, 1 ); + gcry_randomize (temp, nprefix, GCRY_STRONG_RANDOM ); 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 ); + err = gcry_cipher_open (&cfx->cipher_hd, + cfx->dek->algo, + GCRY_CIPHER_MODE_CFB, + (GCRY_CIPHER_SECURE + | ((cfx->dek->use_mdc || cfx->dek->algo >= 100)? + 0 : GCRY_CIPHER_ENABLE_SYNC))); + if (err) { + /* We should never get an error here cause we already checked, + * that the algorithm is available. */ + BUG(); + } + + /* 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 ); + gcry_cipher_setkey( cfx->cipher_hd, cfx->dek->key, cfx->dek->keylen ); + gcry_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 ); + if (cfx->mdc_hash) /* Hash the "IV". */ + gcry_md_write (cfx->mdc_hash, temp, nprefix+2 ); + gcry_cipher_encrypt (cfx->cipher_hd, temp, nprefix+2, NULL, 0); + gcry_cipher_sync (cfx->cipher_hd); iobuf_write(a, temp, nprefix+2); cfx->header=1; } @@ -117,34 +129,34 @@ cipher_filter( void *opaque, int control, 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; + if (cfx->mdc_hash) + gcry_md_write (cfx->mdc_hash, buf, size); + gcry_cipher_encrypt (cfx->cipher_hd, buf, size, NULL, 0); + rc = iobuf_write( a, buf, size ); } else if( control == IOBUFCTRL_FREE ) { if( cfx->mdc_hash ) { byte *hash; - int hashlen = md_digest_length( md_get_algo( cfx->mdc_hash ) ); + int hashlen = gcry_md_get_algo_dlen (gcry_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] ); + gcry_md_putc (cfx->mdc_hash, temp[0]); + gcry_md_putc (cfx->mdc_hash, temp[1]); - md_final( cfx->mdc_hash ); - hash = md_read( cfx->mdc_hash, 0 ); + gcry_md_final (cfx->mdc_hash); + hash = gcry_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; + gcry_cipher_encrypt (cfx->cipher_hd, temp, 22, NULL, 0); + gcry_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); + gcry_cipher_close (cfx->cipher_hd); } else if( control == IOBUFCTRL_DESC ) { *(char**)buf = "cipher_filter"; diff --git a/g10/comment.c b/g10/comment.c new file mode 100644 index 000000000..193087107 --- /dev/null +++ b/g10/comment.c @@ -0,0 +1,113 @@ +/* comment.c - write comment stuff + * Copyright (C) 1998, 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 <stdlib.h> +#include <string.h> +#include <errno.h> +#include <assert.h> + +#include "options.h" +#include "packet.h" +#include "errors.h" +#include "iobuf.h" +#include "memory.h" +#include "util.h" +#include "main.h" +#include "keydb.h" + + + +int +write_comment( iobuf_t out, const char *s ) +{ + PACKET pkt; + size_t n = strlen(s); + int rc=0; + + pkt.pkttype = PKT_COMMENT; + if( *s != '#' ) { + pkt.pkt.comment = xmalloc ( sizeof *pkt.pkt.comment + n ); + pkt.pkt.comment->len = n+1; + *pkt.pkt.comment->data = '#'; + strcpy(pkt.pkt.comment->data+1, s); + } + else { + pkt.pkt.comment = xmalloc ( sizeof *pkt.pkt.comment + n - 1 ); + pkt.pkt.comment->len = n; + strcpy(pkt.pkt.comment->data, s); + } + if( (rc = build_packet( out, &pkt )) ) + log_error("build_packet(comment) failed: %s\n", gpg_strerror (rc) ); + free_packet( &pkt ); + return rc; +} + + +KBNODE +make_comment_node_from_buffer (const char *s, size_t n) +{ + PACKET *pkt; + + pkt = gcry_xcalloc( 1, sizeof *pkt ); + pkt->pkttype = PKT_COMMENT; + pkt->pkt.comment = gcry_xmalloc( sizeof *pkt->pkt.comment + n - 1 ); + pkt->pkt.comment->len = n; + strcpy(pkt->pkt.comment->data, s); + return new_kbnode( pkt ); +} + +KBNODE +make_comment_node( const char *s ) +{ + return make_comment_node_from_buffer (s, strlen (s)); +} + + +KBNODE +make_mpi_comment_node( const char *s, gcry_mpi_t a ) +{ + PACKET *pkt; + byte *buf, *pp; + size_t n1, nb1; + size_t n = strlen(s); + + nb1 = mpi_get_nbits( a ); + if (gcry_mpi_print (GCRYMPI_FMT_PGP, NULL, 0, &n1, a)) + BUG (); + /* fixme: allocate it on the stack */ + buf = xmalloc (n1); + if (gcry_mpi_print (GCRYMPI_FMT_PGP, buf, n1, &n1, a)) + BUG (); + + pkt = xcalloc (1, sizeof *pkt ); + pkt->pkttype = PKT_COMMENT; + pkt->pkt.comment = xmalloc ( sizeof *pkt->pkt.comment + n + 2 + n1 ); + pkt->pkt.comment->len = n+1+2+n1; + pp = pkt->pkt.comment->data; + memcpy(pp, s, n+1); + memcpy(pp+n+1, buf, n1 ); + xfree (buf); + return new_kbnode( pkt ); +} + + diff --git a/g10/compress-bz2.c b/g10/compress-bz2.c deleted file mode 100644 index 7a8075ae4..000000000 --- a/g10/compress-bz2.c +++ /dev/null @@ -1,242 +0,0 @@ -/* 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 index 0cee5ae54..030a4c1d1 100644 --- a/g10/compress.c +++ b/g10/compress.c @@ -1,6 +1,6 @@ /* compress.c - compress filter * Copyright (C) 1998, 1999, 2000, 2001, 2002, - * 2003 Free Software Foundation, Inc. + * 2003, 2006 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -36,10 +36,10 @@ #include <zlib.h> #if defined(__riscos__) && defined(USE_ZLIBRISCOS) # include "zlib-riscos.h" -#endif +#endif +#include "gpg.h" #include "util.h" -#include "memory.h" #include "packet.h" #include "filter.h" #include "main.h" @@ -87,6 +87,7 @@ init_compress( compress_filter_context_t *zfx, z_stream *zs ) static int do_compress( compress_filter_context_t *zfx, z_stream *zs, int flush, IOBUF a ) { + int rc; int zrc; unsigned n; @@ -116,9 +117,9 @@ do_compress( compress_filter_context_t *zfx, z_stream *zs, int flush, IOBUF a ) (unsigned)zs->avail_in, (unsigned)zs->avail_out, (unsigned)n, zrc ); - if( iobuf_write( a, zfx->outbuf, n ) ) { + if( (rc=iobuf_write( a, zfx->outbuf, n )) ) { log_debug("deflate: iobuf_write failed\n"); - return G10ERR_WRITE_FILE; + return rc; } } while( zs->avail_in || (flush == Z_FINISH && zrc != Z_STREAM_END) ); return 0; diff --git a/g10/dearmor.c b/g10/dearmor.c index 8d7c60a5f..7f69a1bba 100644 --- a/g10/dearmor.c +++ b/g10/dearmor.c @@ -26,9 +26,9 @@ #include <errno.h> #include <assert.h> +#include "gpg.h" #include "errors.h" #include "iobuf.h" -#include "memory.h" #include "util.h" #include "filter.h" #include "packet.h" @@ -58,9 +58,9 @@ dearmor_file( const char *fname ) errno = EPERM; } if (!inp) { + rc = gpg_error_from_errno (errno); log_error(_("can't open `%s': %s\n"), fname? fname: "[stdin]", strerror(errno) ); - rc = G10ERR_OPEN_FILE; goto leave; } @@ -107,9 +107,9 @@ enarmor_file( const char *fname ) errno = EPERM; } if (!inp) { + rc = gpg_error_from_errno (errno); log_error(_("can't open `%s': %s\n"), fname? fname: "[stdin]", strerror(errno) ); - rc = G10ERR_OPEN_FILE; goto leave; } diff --git a/g10/decrypt.c b/g10/decrypt.c index 171e265a9..9a37283c1 100644 --- a/g10/decrypt.c +++ b/g10/decrypt.c @@ -27,12 +27,12 @@ #include <errno.h> #include <assert.h> +#include "gpg.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" @@ -57,7 +57,7 @@ decrypt_message( const char *filename ) int rc; int no_out=0; - /* open the message file */ + /* Open the message file. */ fp = iobuf_open(filename); if (fp && is_secured_file (iobuf_get_fd (fp))) { @@ -66,8 +66,10 @@ decrypt_message( const char *filename ) errno = EPERM; } if( !fp ) { - log_error(_("can't open `%s'\n"), print_fname_stdin(filename)); - return G10ERR_OPEN_FILE; + rc = gpg_error_from_errno (errno); + log_error (_("can't open `%s': %s\n"), print_fname_stdin(filename), + gpg_strerror (rc)); + return rc; } handle_progress (&pfx, fp, filename); @@ -183,7 +185,6 @@ decrypt_messages(int nfiles, char *files[]) 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); } diff --git a/g10/delkey.c b/g10/delkey.c index 354851d1f..bb8108754 100644 --- a/g10/delkey.c +++ b/g10/delkey.c @@ -1,6 +1,6 @@ /* delkey.c - delete keys * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, - * 2005 Free Software Foundation, Inc. + * 2005, 2006 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -28,12 +28,12 @@ #include <assert.h> #include <ctype.h> +#include "gpg.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" diff --git a/g10/encode.c b/g10/encode.c index 251ea3e2c..292e2bc5a 100644 --- a/g10/encode.c +++ b/g10/encode.c @@ -27,18 +27,20 @@ #include <errno.h> #include <assert.h> +#include "gpg.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" +#include "pkglue.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 ); @@ -63,10 +65,11 @@ encode_store( const char *filename ) return encode_simple( filename, 0, 0 ); } + static void encode_seskey( DEK *dek, DEK **seskey, byte *enckey ) { - CIPHER_HANDLE hd; + gcry_cipher_hd_t hd; byte buf[33]; assert ( dek->keylen <= 32 ); @@ -79,14 +82,19 @@ encode_seskey( DEK *dek, DEK **seskey, byte *enckey ) /*log_hexdump( "thekey", c->key, c->keylen );*/ } + /* The encrypted session key is prefixed with a one-octet algorithm id. */ 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 ); + /* We only pass already checked values to the following fucntion, + thus we consider any failure as fatal. */ + if (gcry_cipher_open (&hd, dek->algo, GCRY_CIPHER_MODE_CFB, 1)) + BUG (); + if (gcry_cipher_setkey (hd, dek->key, dek->keylen)) + BUG (); + gcry_cipher_setiv (hd, NULL, 0); + gcry_cipher_encrypt (hd, buf, (*seskey)->keylen + 1, NULL, 0); + gcry_cipher_close (hd); memcpy( enckey, buf, (*seskey)->keylen + 1 ); wipememory( buf, sizeof buf ); /* burn key */ @@ -136,7 +144,7 @@ use_mdc(PK_LIST pk_list,int algo) /* Last try. Use MDC for the modern ciphers. */ - if(cipher_get_blocksize(algo)!=8) + if (gcry_cipher_get_algo_blklen (algo) != 8) return 1; return 0; /* No MDC */ @@ -181,9 +189,10 @@ encode_simple( const char *filename, int mode, int use_seskey ) errno = EPERM; } if( !inp ) { + rc = gpg_error_from_errno (errno); log_error(_("can't open `%s': %s\n"), filename? filename: "[stdin]", strerror(errno) ); - return G10ERR_OPEN_FILE; + return rc; } handle_progress (&pfx, inp, filename); @@ -206,11 +215,11 @@ encode_simple( const char *filename, int mode, int use_seskey ) default_cipher_algo(), s2k, 2, NULL, NULL); if( !cfx.dek || !cfx.dek->keylen ) { - rc = G10ERR_PASSPHRASE; + rc = gpg_error (GPG_ERR_INV_PASSPHRASE); xfree(cfx.dek); xfree(s2k); iobuf_close(inp); - log_error(_("error creating passphrase: %s\n"), g10_errstr(rc) ); + log_error(_("error creating passphrase: %s\n"), gpg_strerror (rc)); return rc; } if (use_seskey && s2k->mode != 1 && s2k->mode != 3) { @@ -222,14 +231,15 @@ encode_simple( const char *filename, int mode, int use_seskey ) if ( use_seskey ) { DEK *dek = NULL; - seskeylen = cipher_get_keylen( default_cipher_algo() ) / 8; + + seskeylen = gcry_cipher_get_algo_keylen (default_cipher_algo ()); 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)); + gcry_cipher_algo_name (cfx.dek->algo)); cfx.dek->use_mdc=use_mdc(NULL,cfx.dek->algo); } @@ -341,9 +351,9 @@ encode_simple( const char *filename, int mode, int use_seskey ) 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) ); + if ( (rc=iobuf_write(out, copy_buffer, bytes_copied)) ) { + log_error ("copying input to output failed: %s\n", + gpg_strerror (rc) ); break; } wipememory(copy_buffer, 4096); /* burn buffer */ @@ -379,7 +389,7 @@ setup_symkey(STRING2KEY **symkey_s2k,DEK **symkey_dek) { xfree(*symkey_dek); xfree(*symkey_s2k); - return G10ERR_PASSPHRASE; + return gpg_error (GPG_ERR_BAD_PASSPHRASE); } return 0; @@ -388,7 +398,7 @@ setup_symkey(STRING2KEY **symkey_s2k,DEK **symkey_dek) static int write_symkey_enc(STRING2KEY *symkey_s2k,DEK *symkey_dek,DEK *dek,IOBUF out) { - int rc,seskeylen=cipher_get_keylen(dek->algo)/8; + int rc, seskeylen = gcry_cipher_get_algo_keylen (dek->algo); PKT_symkey_enc *enc; byte enckey[33]; @@ -471,9 +481,10 @@ encode_crypt( const char *filename, STRLIST remusr, int use_symkey ) errno = EPERM; } if( !inp ) { - log_error(_("can't open `%s': %s\n"), filename? filename: "[stdin]", - strerror(errno) ); - rc = G10ERR_OPEN_FILE; + rc = gpg_error_from_errno (errno); + log_error(_("can't open `%s': %s\n"), + filename? filename: "[stdin]", + gpg_strerror (rc) ); goto leave; } else if( opt.verbose ) @@ -517,7 +528,7 @@ encode_crypt( const char *filename, STRLIST remusr, int use_symkey ) 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), + gcry_cipher_algo_name (opt.def_cipher_algo), opt.def_cipher_algo); cfx.dek->algo = opt.def_cipher_algo; @@ -544,7 +555,7 @@ encode_crypt( const char *filename, STRLIST remusr, int use_symkey ) make_session_key( cfx.dek ); if( DBG_CIPHER ) - log_hexdump("DEK is: ", cfx.dek->key, cfx.dek->keylen ); + log_printhex ("DEK is: ", cfx.dek->key, cfx.dek->keylen ); rc = write_pubkey_enc_from_list( pk_list, cfx.dek, out ); if( rc ) @@ -649,10 +660,9 @@ encode_crypt( const char *filename, STRLIST remusr, int use_symkey ) 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) ); + if ( (rc=iobuf_write(out, copy_buffer, bytes_copied)) ) { + log_error ("copying input to output failed: %s\n", + gpg_strerror (rc)); break; } wipememory(copy_buffer, 4096); /* burn buffer */ @@ -714,7 +724,7 @@ encrypt_filter( void *opaque, int control, NULL)!=opt.def_cipher_algo) log_info(_("forcing symmetric cipher %s (%d) " "violates recipient preferences\n"), - cipher_algo_to_string(opt.def_cipher_algo), + gcry_cipher_algo_name (opt.def_cipher_algo), opt.def_cipher_algo); efx->cfx.dek->algo = opt.def_cipher_algo; @@ -724,8 +734,8 @@ encrypt_filter( void *opaque, int control, make_session_key( efx->cfx.dek ); if( DBG_CIPHER ) - log_hexdump("DEK is: ", - efx->cfx.dek->key, efx->cfx.dek->keylen ); + log_printhex ("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 ) @@ -770,7 +780,7 @@ write_pubkey_enc_from_list( PK_LIST pk_list, DEK *dek, IOBUF out ) int rc; for( ; pk_list; pk_list = pk_list->next ) { - MPI frame; + gcry_mpi_t frame; pk = pk_list->pk; @@ -800,18 +810,19 @@ write_pubkey_enc_from_list( PK_LIST pk_list, DEK *dek, IOBUF out ) * 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 ); + frame = encode_session_key (dek, pubkey_nbits (pk->pubkey_algo, + pk->pkey) ); + rc = pk_encrypt (pk->pubkey_algo, enc->data, frame, pk->pkey); + gcry_mpi_release (frame); if( rc ) - log_error("pubkey_encrypt failed: %s\n", g10_errstr(rc) ); + log_error ("pubkey_encrypt failed: %s\n", gpg_strerror (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 ); + gcry_pk_algo_name (enc->pubkey_algo), + gcry_cipher_algo_name (dek->algo), + ustr ); xfree(ustr); } /* and write it */ @@ -858,7 +869,6 @@ encode_crypt_files(int nfiles, char **files, STRLIST remusr) 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 @@ -870,7 +880,6 @@ encode_crypt_files(int nfiles, char **files, STRLIST remusr) 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 index 23ab0a662..cf2e43da7 100644 --- a/g10/encr-data.c +++ b/g10/encr-data.c @@ -1,5 +1,6 @@ /* encr-data.c - process an encrypted data packet - * Copyright (C) 1998, 1999, 2000, 2001, 2005 Free Software Foundation, Inc. + * Copyright (C) 1998, 1999, 2000, 2001, 2005, + * 2006 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -24,10 +25,10 @@ #include <stdlib.h> #include <string.h> #include <assert.h> + +#include "gpg.h" #include "util.h" -#include "memory.h" #include "packet.h" -#include "mpi.h" #include "cipher.h" #include "options.h" #include "i18n.h" @@ -38,12 +39,13 @@ static int mdc_decode_filter( void *opaque, int control, IOBUF a, 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[20]; - int defer_filled; - int eof_seen; +typedef struct +{ + gcry_cipher_hd_t cipher_hd; + gcry_md_hd_t mdc_hash; + char defer[20]; + int defer_filled; + int eof_seen; } decode_filter_ctx_t; @@ -62,16 +64,17 @@ decrypt_data( void *procctx, PKT_encrypted *ed, DEK *dek ) memset( &dfx, 0, sizeof dfx ); if( opt.verbose && !dek->algo_info_printed ) { - const char *s = cipher_algo_to_string( dek->algo ); - if( s ) + const char *s = gcry_cipher_algo_name (dek->algo); + if (s && *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)) ) + rc = openpgp_cipher_test_algo (dek->algo); + if (rc) goto leave; - blocksize = cipher_get_blocksize(dek->algo); + blocksize = gcry_cipher_get_algo_blklen (dek->algo); if( !blocksize || blocksize > 16 ) log_fatal("unsupported blocksize %u\n", blocksize ); nprefix = blocksize; @@ -79,16 +82,28 @@ decrypt_data( void *procctx, PKT_encrypted *ed, DEK *dek ) BUG(); if( ed->mdc_method ) { - dfx.mdc_hash = md_open( ed->mdc_method, 0 ); + if (gcry_md_open (&dfx.mdc_hash, ed->mdc_method, 0 )) + BUG (); if ( DBG_HASHING ) - md_start_debug(dfx.mdc_hash, "checkmdc"); + gcry_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 ); + + rc = gcry_cipher_open (&dfx.cipher_hd, dek->algo, + GCRY_CIPHER_MODE_CFB, + (GCRY_CIPHER_SECURE + | ((ed->mdc_method || dek->algo >= 100)? + 0 : GCRY_CIPHER_ENABLE_SYNC))); + if (rc) + { + /* We should never get an error here cause we already checked + * that the algorithm is available. */ + BUG(); + } + + /* log_hexdump( "thekey", dek->key, dek->keylen );*/ - rc = cipher_setkey( dfx.cipher_hd, dek->key, dek->keylen ); - if( rc == G10ERR_WEAK_KEY ) + rc = gcry_cipher_setkey (dfx.cipher_hd, dek->key, dek->keylen); + if ( gpg_err_code (rc) == GPG_ERR_WEAK_KEY ) { log_info(_("WARNING: message was encrypted with" " a weak key in the symmetric cipher.\n")); @@ -105,7 +120,7 @@ decrypt_data( void *procctx, PKT_encrypted *ed, DEK *dek ) goto leave; } - cipher_setiv( dfx.cipher_hd, NULL, 0 ); + gcry_cipher_setiv (dfx.cipher_hd, NULL, 0); if( ed->len ) { for(i=0; i < (nprefix+2) && ed->len; i++, ed->len-- ) { @@ -122,19 +137,20 @@ decrypt_data( void *procctx, PKT_encrypted *ed, DEK *dek ) else temp[i] = c; } - cipher_decrypt( dfx.cipher_hd, temp, temp, nprefix+2); - cipher_sync( dfx.cipher_hd ); + + gcry_cipher_decrypt (dfx.cipher_hd, temp, nprefix+2, NULL, 0); + gcry_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; + rc = GPG_ERR_BAD_KEY; goto leave; } if( dfx.mdc_hash ) - md_write( dfx.mdc_hash, temp, nprefix+2 ); + gcry_md_write (dfx.mdc_hash, temp, nprefix+2); if( ed->mdc_method ) iobuf_push_filter( ed->buf, mdc_decode_filter, &dfx ); @@ -144,23 +160,23 @@ decrypt_data( void *procctx, PKT_encrypted *ed, DEK *dek ) proc_packets( procctx, ed->buf ); ed->buf = NULL; if( ed->mdc_method && dfx.eof_seen == 2 ) - rc = G10ERR_INVALID_PACKET; + rc = gpg_error (GPG_ERR_INV_PACKET); else if( ed->mdc_method ) { /* check the mdc */ - int datalen = md_digest_length( ed->mdc_method ); + int datalen = gcry_md_get_algo_dlen (ed->mdc_method); - cipher_decrypt( dfx.cipher_hd, dfx.defer, dfx.defer, 20); - md_final( dfx.mdc_hash ); - if( datalen != 20 - || memcmp(md_read( dfx.mdc_hash, 0 ), dfx.defer, datalen) ) - rc = G10ERR_BAD_SIGN; + gcry_cipher_decrypt (dfx.cipher_hd, dfx.defer, 20, NULL, 0); + gcry_md_final (dfx.mdc_hash); + if (datalen != 20 + || memcmp (gcry_md_read( dfx.mdc_hash, 0 ), dfx.defer, datalen) ) + rc = gpg_error (GPG_ERR_BAD_SIGNATURE); /*log_hexdump("MDC calculated:", md_read( dfx.mdc_hash, 0), datalen);*/ /*log_hexdump("MDC message :", dfx.defer, 20);*/ } leave: - cipher_close(dfx.cipher_hd); - md_close( dfx.mdc_hash ); + gcry_cipher_close (dfx.cipher_hd); + gcry_md_close (dfx.mdc_hash); return rc; } @@ -226,8 +242,8 @@ mdc_decode_filter( void *opaque, int control, IOBUF a, } if( n ) { - cipher_decrypt( dfx->cipher_hd, buf, buf, n); - md_write( dfx->mdc_hash, buf, n ); + gcry_cipher_decrypt (dfx->cipher_hd, buf, n, NULL, 0); + gcry_md_write (dfx->mdc_hash, buf, n); } else { assert( dfx->eof_seen ); @@ -253,7 +269,7 @@ decode_filter( void *opaque, int control, IOBUF a, byte *buf, size_t *ret_len) n = iobuf_read( a, buf, size ); if( n == -1 ) n = 0; if( n ) - cipher_decrypt( fc->cipher_hd, buf, buf, n); + gcry_cipher_decrypt (fc->cipher_hd, buf, n, NULL, 0); else rc = -1; /* eof */ *ret_len = n; diff --git a/g10/exec.c b/g10/exec.c index d99bb5e1e..203c4c78f 100644 --- a/g10/exec.c +++ b/g10/exec.c @@ -35,11 +35,13 @@ #include <unistd.h> #include <string.h> #include <errno.h> + +#include "gpg.h" #include "options.h" -#include "memory.h" #include "i18n.h" #include "iobuf.h" #include "util.h" +#include "mkdtemp.h" /* From gnulib. */ #include "exec.h" #ifdef NO_EXEC @@ -56,15 +58,11 @@ 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) +static int w32_system(const char *command) { PROCESS_INFORMATION pi; STARTUPINFO si; @@ -131,9 +129,9 @@ static int make_tempdir(struct exec_info *info) #if defined (_WIN32) int err; - tmp=xmalloc(MAX_PATH); - err=GetTempPath(MAX_PATH,tmp); - if(err==0 || err>MAX_PATH) + tmp=xmalloc(MAX_PATH+2); + err=GetTempPath(MAX_PATH+1,tmp); + if(err==0 || err>MAX_PATH+1) strcpy(tmp,"c:\\windows\\temp"); else { @@ -443,8 +441,8 @@ int exec_write(struct exec_info **info,const char *program, (*info)->tochild=fdopen(to[1],binary?"wb":"w"); if((*info)->tochild==NULL) { + ret = gpg_error_from_errno (errno); close(to[1]); - ret=G10ERR_WRITE_FILE; goto fail; } @@ -453,8 +451,8 @@ int exec_write(struct exec_info **info,const char *program, (*info)->fromchild=iobuf_fdopen(from[0],"r"); if((*info)->fromchild==NULL) { + ret = gpg_error_from_errno (errno); close(from[0]); - ret=G10ERR_READ_FILE; goto fail; } @@ -478,9 +476,9 @@ int exec_write(struct exec_info **info,const char *program, (*info)->tochild=fopen((*info)->tempfile_in,binary?"wb":"w"); if((*info)->tochild==NULL) { + ret = gpg_error_from_errno (errno); log_error(_("can't create `%s': %s\n"), (*info)->tempfile_in,strerror(errno)); - ret=G10ERR_WRITE_FILE; goto fail; } @@ -503,7 +501,7 @@ int exec_read(struct exec_info *info) log_debug("system() command is %s\n",info->command); #if defined (_WIN32) - info->progreturn=win_system(info->command); + info->progreturn=w32_system(info->command); #else info->progreturn=system(info->command); #endif @@ -552,9 +550,9 @@ int exec_read(struct exec_info *info) } if(info->fromchild==NULL) { + ret = gpg_error_from_errno (errno); log_error(_("unable to read external program response: %s\n"), strerror(errno)); - ret=G10ERR_READ_FILE; goto fail; } diff --git a/g10/exec.h b/g10/exec.h index b4a6f0ec1..66d13c72b 100644 --- a/g10/exec.h +++ b/g10/exec.h @@ -24,7 +24,8 @@ #include <unistd.h> #include <stdio.h> -#include "iobuf.h" + +#include "../common/iobuf.h" struct exec_info { @@ -39,7 +40,7 @@ struct exec_info } flags; pid_t child; FILE *tochild; - IOBUF fromchild; + iobuf_t fromchild; char *command,*name,*tempdir,*tempfile_in,*tempfile_out; }; diff --git a/g10/export.c b/g10/export.c index 626b7d06c..2760ea054 100644 --- a/g10/export.c +++ b/g10/export.c @@ -27,11 +27,11 @@ #include <errno.h> #include <assert.h> +#include "gpg.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" @@ -51,6 +51,8 @@ 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 ); +static int build_sexp (iobuf_t out, PACKET *pkt, int *indent); + int parse_export_options(char *str,unsigned int *options,int noisy) @@ -69,6 +71,8 @@ parse_export_options(char *str,unsigned int *options,int noisy) 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")}, + {"export-sexp-format",EXPORT_SEXP_FORMAT, NULL, + N_("export keys in an S-expression based format")}, /* Aliases for backward compatibility */ {"include-local-sigs",EXPORT_LOCAL_SIGS,NULL,NULL}, {"include-attributes",EXPORT_ATTRIBUTES,NULL,NULL}, @@ -115,43 +119,52 @@ export_pubkeys_stream( IOBUF out, STRLIST users, int export_seckeys( STRLIST users ) { - return do_export( users, 1, 0 ); + /* Use only relevant options for the secret key. */ + unsigned int options = (opt.export_options & EXPORT_SEXP_FORMAT); + return do_export( users, 1, options ); } int export_secsubkeys( STRLIST users ) { - return do_export( users, 2, 0 ); + /* Use only relevant options for the secret key. */ + unsigned int options = (opt.export_options & EXPORT_SEXP_FORMAT); + return do_export( users, 2, options ); } 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); + 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 (!(options & EXPORT_SEXP_FORMAT)) + { + 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; } @@ -289,6 +302,7 @@ do_export_stream( IOBUF out, STRLIST users, int secret, subkey_list_t subkey_list = NULL; /* Track alreay processed subkeys. */ KEYDB_HANDLE kdbhd; STRLIST sl; + int indent = 0; *any = 0; init_packet( &pkt ); @@ -502,7 +516,10 @@ do_export_stream( IOBUF out, STRLIST users, int secret, */ 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 ); + if ((options&EXPORT_SEXP_FORMAT)) + rc = build_sexp (out, node->pkt, &indent); + else + 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 @@ -568,16 +585,26 @@ do_export_stream( IOBUF out, STRLIST users, int secret, sha1_warned=1; } - rc = build_packet( out, node->pkt ); + if ((options&EXPORT_SEXP_FORMAT)) + rc = build_sexp (out, node->pkt, &indent); + else + 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; } } + + if ((options&EXPORT_SEXP_FORMAT) && indent) + { + for (; indent; indent--) + iobuf_put (out, ')'); + iobuf_put (out, '\n'); + } + ++*any; if(keyblock_out) { @@ -585,6 +612,12 @@ do_export_stream( IOBUF out, STRLIST users, int secret, break; } } + if ((options&EXPORT_SEXP_FORMAT) && indent) + { + for (; indent; indent--) + iobuf_put (out, ')'); + iobuf_put (out, '\n'); + } if( rc == -1 ) rc = 0; @@ -598,3 +631,124 @@ do_export_stream( IOBUF out, STRLIST users, int secret, log_info(_("WARNING: nothing exported\n")); return rc; } + + + +static int +write_sexp_line (iobuf_t out, int *indent, const char *text) +{ + int i; + + for (i=0; i < *indent; i++) + iobuf_put (out, ' '); + iobuf_writestr (out, text); + return 0; +} + +static int +write_sexp_keyparm (iobuf_t out, int *indent, const char *name, gcry_mpi_t a) +{ + int rc; + unsigned char *buffer; + + write_sexp_line (out, indent, "("); + iobuf_writestr (out, name); + iobuf_writestr (out, " #"); + + rc = gcry_mpi_aprint (GCRYMPI_FMT_HEX, &buffer, NULL, a); + assert (!rc); + iobuf_writestr (out, buffer); + iobuf_writestr (out, "#)"); + gcry_free (buffer); + return 0; +} + +static int +build_sexp_seckey (iobuf_t out, PACKET *pkt, int *indent) +{ + PKT_secret_key *sk = pkt->pkt.secret_key; + char tmpbuf[100]; + + if (pkt->pkttype == PKT_SECRET_KEY) + { + iobuf_writestr (out, "(openpgp-key\n"); + (*indent)++; + } + else + { + iobuf_writestr (out, " (subkey\n"); + (*indent)++; + } + (*indent)++; + write_sexp_line (out, indent, "(private-key\n"); + (*indent)++; + if (is_RSA (sk->pubkey_algo) && !sk->is_protected) + { + write_sexp_line (out, indent, "(rsa\n"); + (*indent)++; + write_sexp_keyparm (out, indent, "n", sk->skey[0]); iobuf_put (out,'\n'); + write_sexp_keyparm (out, indent, "e", sk->skey[1]); iobuf_put (out,'\n'); + write_sexp_keyparm (out, indent, "d", sk->skey[2]); iobuf_put (out,'\n'); + write_sexp_keyparm (out, indent, "p", sk->skey[3]); iobuf_put (out,'\n'); + write_sexp_keyparm (out, indent, "q", sk->skey[4]); iobuf_put (out,'\n'); + write_sexp_keyparm (out, indent, "u", sk->skey[5]); + iobuf_put (out,')'); iobuf_put (out,'\n'); + (*indent)--; + } + else if (sk->pubkey_algo == PUBKEY_ALGO_DSA && !sk->is_protected) + { + write_sexp_line (out, indent, "(dsa\n"); + (*indent)++; + write_sexp_keyparm (out, indent, "p", sk->skey[0]); iobuf_put (out,'\n'); + write_sexp_keyparm (out, indent, "q", sk->skey[1]); iobuf_put (out,'\n'); + write_sexp_keyparm (out, indent, "g", sk->skey[2]); iobuf_put (out,'\n'); + write_sexp_keyparm (out, indent, "y", sk->skey[3]); iobuf_put (out,'\n'); + write_sexp_keyparm (out, indent, "x", sk->skey[4]); + iobuf_put (out,')'); iobuf_put (out,'\n'); + (*indent)--; + } + else if (is_ELGAMAL (sk->pubkey_algo) && !sk->is_protected) + { + write_sexp_line (out, indent, "(elg\n"); + (*indent)++; + write_sexp_keyparm (out, indent, "p", sk->skey[0]); iobuf_put (out,'\n'); + write_sexp_keyparm (out, indent, "g", sk->skey[2]); iobuf_put (out,'\n'); + write_sexp_keyparm (out, indent, "y", sk->skey[3]); iobuf_put (out,'\n'); + write_sexp_keyparm (out, indent, "x", sk->skey[4]); + iobuf_put (out,')'); iobuf_put (out,'\n'); + (*indent)--; + } + write_sexp_line (out, indent, "(attrib\n"); (*indent)++; + sprintf (tmpbuf, "(created \"%lu\"", (unsigned long)sk->timestamp); + write_sexp_line (out, indent, tmpbuf); + iobuf_put (out,')'); (*indent)--; /* close created */ + iobuf_put (out,')'); (*indent)--; /* close attrib */ + iobuf_put (out,')'); (*indent)--; /* close private-key */ + if (pkt->pkttype != PKT_SECRET_KEY) + iobuf_put (out,')'), (*indent)--; /* close subkey */ + iobuf_put (out,'\n'); + + return 0; +} + + +/* For some packet types we write them in a S-expression format. This + is still EXPERIMENTAL and subject to change. */ +static int +build_sexp (iobuf_t out, PACKET *pkt, int *indent) +{ + int rc; + + switch (pkt->pkttype) + { + case PKT_SECRET_KEY: + case PKT_SECRET_SUBKEY: + rc = build_sexp_seckey (out, pkt, indent); + break; + default: + rc = 0; + break; + } + return rc; +} + diff --git a/g10/filter.h b/g10/filter.h index bb06ecc6e..5c1b9372a 100644 --- a/g10/filter.h +++ b/g10/filter.h @@ -26,8 +26,8 @@ #include "cipher.h" typedef struct { - MD_HANDLE md; /* catch all */ - MD_HANDLE md2; /* if we want to calculate an alternate hash */ + gcry_md_hd_t md; /* catch all */ + gcry_md_hd_t md2; /* if we want to calculate an alternate hash */ size_t maxbuf_size; } md_filter_context_t; @@ -92,9 +92,9 @@ typedef struct compress_filter_context_s compress_filter_context_t; typedef struct { DEK *dek; u32 datalen; - CIPHER_HANDLE cipher_hd; + gcry_cipher_hd_t cipher_hd; int header; - MD_HANDLE mdc_hash; + gcry_md_hd_t mdc_hash; byte enchash[20]; int create_mdc; /* flag will be set by the cipher filter */ } cipher_filter_context_t; @@ -109,7 +109,7 @@ typedef struct { int truncated; /* number of truncated lines */ int not_dash_escaped; int escape_from; - MD_HANDLE md; + gcry_md_hd_t md; int pending_lf; int pending_esc; } text_filter_context_t; @@ -126,36 +126,36 @@ typedef struct { /* 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); +int md_filter( void *opaque, int control, iobuf_t a, byte *buf, size_t *ret_len); void free_md_filter_context( md_filter_context_t *mfx ); /*-- armor.c --*/ -int use_armor_filter( IOBUF a ); +int use_armor_filter( iobuf_t a ); int armor_filter( void *opaque, int control, - IOBUF chain, byte *buf, size_t *ret_len); + iobuf_t 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, +void push_compress_filter(iobuf_t out,compress_filter_context_t *zfx,int algo); +void push_compress_filter2(iobuf_t out,compress_filter_context_t *zfx, int algo,int rel); /*-- cipher.c --*/ int cipher_filter( void *opaque, int control, - IOBUF chain, byte *buf, size_t *ret_len); + iobuf_t 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 ); + iobuf_t chain, byte *buf, size_t *ret_len); +int copy_clearsig_text (iobuf_t out, iobuf_t inp, gcry_md_hd_t 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); + iobuf_t a, byte *buf, size_t *ret_len); void handle_progress (progress_filter_context_t *pfx, - IOBUF inp, const char *name); + iobuf_t inp, const char *name); #endif /*G10_FILTER_H*/ diff --git a/g10/free-packet.c b/g10/free-packet.c index be49bb5e4..8aab06370 100644 --- a/g10/free-packet.c +++ b/g10/free-packet.c @@ -26,13 +26,13 @@ #include <string.h> #include <assert.h> +#include "gpg.h" #include "packet.h" -#include "iobuf.h" -#include "mpi.h" +#include "../common/iobuf.h" #include "util.h" #include "cipher.h" -#include "memory.h" -#include "options.h" +#include "options.h" + void free_symkey_enc( PKT_symkey_enc *enc ) @@ -46,9 +46,9 @@ free_pubkey_enc( PKT_pubkey_enc *enc ) int n, i; n = pubkey_get_nenc( enc->pubkey_algo ); if( !n ) - mpi_free(enc->data[0]); + mpi_release(enc->data[0]); for(i=0; i < n; i++ ) - mpi_free( enc->data[i] ); + mpi_release( enc->data[i] ); xfree(enc); } @@ -59,9 +59,9 @@ free_seckey_enc( PKT_signature *sig ) n = pubkey_get_nsig( sig->pubkey_algo ); if( !n ) - mpi_free(sig->data[0]); + mpi_release(sig->data[0]); for(i=0; i < n; i++ ) - mpi_free( sig->data[i] ); + mpi_release( sig->data[i] ); xfree(sig->revkey); xfree(sig->hashed); @@ -83,9 +83,9 @@ 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]); + mpi_release(pk->pkey[0]); for(i=0; i < n; i++ ) { - mpi_free( pk->pkey[i] ); + mpi_release( pk->pkey[i] ); pk->pkey[i] = NULL; } if (pk->prefs) { @@ -265,9 +265,9 @@ release_secret_key_parts( PKT_secret_key *sk ) n = pubkey_get_nskey( sk->pubkey_algo ); if( !n ) - mpi_free(sk->skey[0]); + mpi_release(sk->skey[0]); for(i=0; i < n; i++ ) { - mpi_free( sk->skey[i] ); + mpi_release( sk->skey[i] ); sk->skey[i] = NULL; } } diff --git a/g10/getkey.c b/g10/getkey.c index 74c0a74d6..c0088c38c 100644 --- a/g10/getkey.c +++ b/g10/getkey.c @@ -26,9 +26,10 @@ #include <string.h> #include <assert.h> #include <ctype.h> + +#include "gpg.h" #include "util.h" #include "packet.h" -#include "memory.h" #include "iobuf.h" #include "keydb.h" #include "options.h" @@ -2135,7 +2136,7 @@ merge_selfsigs_subkey( KBNODE keyblock, KBNODE subnode ) subpk->expiredate = key_expire; /* algo doesn't exist */ - if(check_pubkey_algo(subpk->pubkey_algo)) + if(openpgp_pk_test_algo(subpk->pubkey_algo)) return; subpk->is_valid = 1; diff --git a/g10/gpg.c b/g10/gpg.c index 2b14feaa2..c558b7246 100644 --- a/g10/gpg.c +++ b/g10/gpg.c @@ -35,32 +35,28 @@ #include <sys/stat.h> /* for stat() */ #endif #include <fcntl.h> +#include <assuan.h> #ifdef HAVE_W32_SYSTEM #include <windows.h> #endif #define INCLUDED_BY_MAIN_MODULE 1 +#include "gpg.h" #include "packet.h" -#include "iobuf.h" -#include "memory.h" +#include "../common/iobuf.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 @@ -152,7 +148,6 @@ enum cmd_and_opt_values aDeArmor, aEnArmor, aGenRandom, - aPipeMode, aRebuildKeydbCaches, aCardStatus, aCardEdit, @@ -186,6 +181,7 @@ enum cmd_and_opt_values oNoDefRecipient, oOptions, oDebug, + oDebugLevel, oDebugAll, oDebugCCIDDriver, oStatusFD, @@ -243,7 +239,6 @@ enum cmd_and_opt_values oAlwaysTrust, oTrustModel, oForceOwnertrust, - oRunAsShmCP, oSetFilename, oForYourEyesOnly, oNoForYourEyesOnly, @@ -337,6 +332,7 @@ enum cmd_and_opt_values oPersonalCipherPreferences, oPersonalDigestPreferences, oPersonalCompressPreferences, + oAgentProgram, oDisplay, oTTYname, oTTYtype, @@ -354,10 +350,6 @@ enum cmd_and_opt_values oKeyidFormat, oExitOnStatusWriteError, oLimitCardInsertTries, - oReaderPort, - octapiDriver, - opcscDriver, - oDisableCCID, oRequireCrossCert, oNoRequireCrossCert, oAutoKeyLocate, @@ -505,6 +497,7 @@ static ARGPARSE_OPTS opts[] = { { oDisplayCharset, "charset", 2, "@"}, { oOptions, "options", 2, "@"}, { oDebug, "debug" ,4|16, "@"}, + { oDebugLevel, "debug-level" ,2, "@"}, { oDebugAll, "debug-all" ,0, "@"}, { oStatusFD, "status-fd" ,1, "@"}, { oStatusFile, "status-file" ,2, "@"}, @@ -569,7 +562,6 @@ static ARGPARSE_OPTS opts[] = { { 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, "@" }, @@ -603,7 +595,6 @@ static ARGPARSE_OPTS opts[] = { { 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, "@" }, @@ -628,7 +619,7 @@ static ARGPARSE_OPTS opts[] = { { oLockMultiple, "lock-multiple", 0, "@" }, { oLockNever, "lock-never", 0, "@" }, { oLoggerFD, "logger-fd",1, "@" }, - { oLoggerFile, "logger-file",2, "@" }, + { oLoggerFile, "log-file",2, "@" }, { oUseEmbeddedFilename, "use-embedded-filename", 0, "@" }, { oNoUseEmbeddedFilename, "no-use-embedded-filename", 0, "@" }, { oUtf8Strings, "utf8-strings", 0, "@" }, @@ -677,6 +668,7 @@ static ARGPARSE_OPTS opts[] = { { oPersonalCipherPreferences, "personal-cipher-prefs", 2, "@"}, { oPersonalDigestPreferences, "personal-digest-prefs", 2, "@"}, { oPersonalCompressPreferences, "personal-compress-prefs", 2, "@"}, + { oAgentProgram, "agent-program", 2 , "@" }, { oDisplay, "display", 2, "@" }, { oTTYname, "ttyname", 2, "@" }, { oTTYtype, "ttytype", 2, "@" }, @@ -695,13 +687,6 @@ static ARGPARSE_OPTS opts[] = { { 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, "@"}, @@ -718,6 +703,7 @@ static ARGPARSE_OPTS opts[] = { { oNoRequireCrossCert, "no-require-cross-certification", 0, "@"}, { oAutoKeyLocate, "auto-key-locate", 2, "@"}, { oNoAutoKeyLocate, "no-auto-key-locate", 0, "@"}, + {0,NULL,0,NULL} }; @@ -742,9 +728,11 @@ 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 ); +static void emergency_cleanup (void); -const char * -strusage( int level ) + +static const char * +my_strusage( int level ) { static char *digests, *pubkeys, *ciphers, *zips; const char *p; @@ -787,31 +775,35 @@ strusage( int level ) #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 ); + if (!pubkeys) + pubkeys = build_list (_("Pubkey: "), 0, + gcry_pk_algo_name, + openpgp_pk_test_algo ); p = pubkeys; break; case 35: if( !ciphers ) - ciphers = build_list(_("Cipher: "), 'S', cipher_algo_to_string, - check_cipher_algo ); + ciphers = build_list(_("Cipher: "), 'S', + gcry_cipher_algo_name, + openpgp_cipher_test_algo ); p = ciphers; break; case 36: if( !digests ) - digests = build_list(_("Hash: "), 'H', digest_algo_to_string, - check_digest_algo ); + digests = build_list(_("Hash: "), 'H', + gcry_md_algo_name, + openpgp_md_test_algo ); p = digests; break; case 37: if( !zips ) - zips = build_list(_("Compression: "),'Z',compress_algo_to_string, - check_compress_algo); + zips = build_list(_("Compression: "),'Z', + compress_algo_to_string, + check_compress_algo); p = zips; break; - default: p = default_strusage(level); + default: p = NULL; } return p; } @@ -826,8 +818,8 @@ build_list( const char *text, char letter, size_t n=strlen(text)+2; char *list, *p, *line=NULL; - if( maybe_setuid ) - secmem_init( 0 ); /* drop setuid */ + if (maybe_setuid) + gcry_control (GCRYCTL_INIT_SECMEM, 0, 0); /* Drop setuid. */ for(i=0; i <= 110; i++ ) if( !chkf(i) && (s=mapf(i)) ) @@ -876,12 +868,12 @@ static void i18n_init(void) { #ifdef USE_SIMPLE_GETTEXT - set_gettext_file (PACKAGE, "Software\\GNU\\GnuPG"); + set_gettext_file (PACKAGE_GT, "Software\\GNU\\GnuPG"); #else #ifdef ENABLE_NLS - setlocale( LC_ALL, "" ); - bindtextdomain( PACKAGE, G10_LOCALEDIR ); - textdomain( PACKAGE ); + setlocale (LC_ALL, ""); + bindtextdomain (PACKAGE_GT, LOCALEDIR); + textdomain (PACKAGE_GT); #endif #endif } @@ -908,31 +900,55 @@ make_username( const char *string ) } +/* Setup the debugging. With a LEVEL of NULL only the active debug + flags are propagated to the subsystems. With LEVEL set, a specific + set of debug flags is set; thus overriding all flags already + set. */ static void -set_debug(void) +set_debug (const char *level) { - 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; + if (!level) + ; + else if (!strcmp (level, "none")) + opt.debug = 0; + else if (!strcmp (level, "basic")) + opt.debug = DBG_MEMSTAT_VALUE; + else if (!strcmp (level, "advanced")) + opt.debug = DBG_MEMSTAT_VALUE|DBG_TRUST_VALUE|DBG_EXTPROG_VALUE; + else if (!strcmp (level, "expert")) + opt.debug = (DBG_MEMSTAT_VALUE|DBG_TRUST_VALUE|DBG_EXTPROG_VALUE + |DBG_CACHE_VALUE|DBG_FILTER_VALUE|DBG_PACKET_VALUE); + else if (!strcmp (level, "guru")) + opt.debug = ~0; + else + { + log_error (_("invalid debug-level `%s' given\n"), level); + g10_exit (2); + } + 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) + gcry_control (GCRYCTL_SET_DEBUG_FLAGS, 2); + if (opt.debug & DBG_CIPHER_VALUE ) + gcry_control (GCRYCTL_SET_DEBUG_FLAGS, 1); + if (opt.debug & DBG_IOBUF_VALUE ) + iobuf_debug_mode = 1; + gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose); } + /* 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) +set_homedir (const char *dir) { if (!dir) dir = ""; - g10_opt_homedir = opt.homedir = dir; + opt.homedir = dir; } @@ -941,7 +957,7 @@ set_homedir (char *dir) static void set_screen_dimensions(void) { -#ifndef _WIN32 +#ifndef HAVE_W32_SYSTEM char *str; str=getenv("COLUMNS"); @@ -1363,7 +1379,7 @@ list_config(char *items) for(sl=iter->values;sl;sl=sl->next) { - print_string2(stdout,sl->d,strlen(sl->d),':',';'); + print_sanitized_string2 (stdout, sl->d, ':',';'); if(sl->next) printf(";"); } @@ -1385,7 +1401,7 @@ list_config(char *items) if(show_all || ascii_strcasecmp(name,"pubkey")==0) { printf("cfg:pubkey:"); - print_algo_numbers(check_pubkey_algo); + print_algo_numbers (openpgp_pk_test_algo); printf("\n"); any=1; } @@ -1393,7 +1409,7 @@ list_config(char *items) if(show_all || ascii_strcasecmp(name,"cipher")==0) { printf("cfg:cipher:"); - print_algo_numbers(check_cipher_algo); + print_algo_numbers(openpgp_cipher_test_algo); printf("\n"); any=1; } @@ -1403,7 +1419,7 @@ list_config(char *items) || ascii_strcasecmp(name,"hash")==0) { printf("cfg:digest:"); - print_algo_numbers(check_digest_algo); + print_algo_numbers(openpgp_md_test_algo); printf("\n"); any=1; } @@ -1627,7 +1643,17 @@ parse_trust_model(const char *model) log_error("unknown trust model `%s'\n",model); } -/* Must be called before we open any files. */ + + +/* Make sure that the standard file descriptors are opened. Obviously + some folks close them before an exec and the next file we open will + get one of them assigned and thus any output (i.e. diagnostics) end + up in that file (e.g. the trustdb). Not actually a gpg problem as + this will hapenn with almost all utilities when called in a wrong + way. However we try to minimize the damage here and raise + awareness of the problem. + + Must be called before we open any files! */ static void reopen_std(void) { @@ -1688,6 +1714,7 @@ reopen_std(void) #endif /* HAVE_STAT && !HAVE_W32_SYSTEM */ } + int main (int argc, char **argv ) { @@ -1712,8 +1739,10 @@ main (int argc, char **argv ) int default_keyring = 1; int greeting = 0; int nogreeting = 0; + char *logfile = NULL; int use_random_seed = 1; enum cmd_and_opt_values cmd = 0; + const char *debug_level = NULL; const char *trustdb_name = NULL; char *def_cipher_string = NULL; char *def_digest_string = NULL; @@ -1730,27 +1759,43 @@ main (int argc, char **argv ) 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 */ + when adding any stuff between here and the call to + secmem_init() somewhere after the option parsing. */ + reopen_std (); + trap_unaligned(); + set_strusage (my_strusage); + gcry_control (GCRYCTL_SUSPEND_SECMEM_WARN); + /* We don't need any locking in libgcrypt unless we use any kind of + threading. */ + gcry_control (GCRYCTL_DISABLE_INTERNAL_LOCKING); + log_set_prefix ("gpg", 1); + + /* Check that the libraries are suitable. Do it right here because the + option parsing may need services of the library. */ + if (!gcry_check_version (NEED_LIBGCRYPT_VERSION) ) + { + log_fatal ( _("libgcrypt is too old (need %s, have %s)\n"), + NEED_LIBGCRYPT_VERSION, gcry_check_version (NULL) ); + } + + /* Put random number into secure memory */ + gcry_control (GCRYCTL_USE_SECURE_RNDPOOL); + may_coredump = disable_core_dumps(); - init_signals(); - create_dotlock(NULL); /* register locking cleanup */ + + gnupg_init_signals (0, emergency_cleanup); + + 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 */ @@ -1789,19 +1834,7 @@ main (int argc, char **argv ) opt.def_cert_expire="0"; set_homedir ( default_homedir () ); -#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 */ + /* Check whether we have a config file on the command line. */ orig_argc = argc; orig_argv = argv; pargs.argc = &argc; @@ -1824,27 +1857,12 @@ main (int argc, char **argv ) opt.no_perm_warn=1; else if (pargs.r_opt == oStrict ) { - opt.strict=1; - log_set_strict(1); + /* Not used */ } else if (pargs.r_opt == oNoStrict ) { - opt.strict=0; - log_set_strict(0); + /* Not used */ } -#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 @@ -1863,22 +1881,23 @@ main (int argc, char **argv ) 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 */ + /* Initialize the secure memory. */ + gcry_control (GCRYCTL_INIT_SECMEM, 32768, 0); + got_secmem = 1; /* FIXME: gcry_control should return an indicator. */ #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 + maybe_setuid = 0; + + /* Okay, we are now working under our real uid */ + + /* malloc hooks go here ... */ + assuan_set_malloc_hooks (gcry_malloc, gcry_realloc, gcry_free); + set_native_charset (NULL); /* Try to auto set the character set */ @@ -2044,25 +2063,8 @@ main (int argc, char **argv ) "--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; @@ -2071,8 +2073,8 @@ main (int argc, char **argv ) case oDryRun: opt.dry_run = 1; break; case oInteractive: opt.interactive = 1; break; case oVerbose: - g10_opt_verbose++; opt.verbose++; + gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose); opt.list_options|=LIST_SHOW_UNUSABLE_UIDS; opt.list_options|=LIST_SHOW_UNUSABLE_SUBKEYS; break; @@ -2101,13 +2103,11 @@ main (int argc, char **argv ) "--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 oDebugLevel: debug_level = pargs.r.ret_str; break; + case oStatusFD: set_status_fd( iobuf_translate_file_handle (pargs.r.ret_int, 1) ); break; @@ -2121,11 +2121,10 @@ main (int argc, char **argv ) 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)); + log_set_fd (iobuf_translate_file_handle (pargs.r.ret_int, 1)); break; - case oLoggerFile: - log_set_logfile( NULL, open_info_file (pargs.r.ret_str, 1) ); + case oLoggerFile: + logfile = pargs.r.ret_str; break; case oWithFingerprint: @@ -2146,9 +2145,13 @@ main (int argc, char **argv ) 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 oNoVerbose: + opt.verbose = 0; + gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose); + opt.list_sigs=0; + break; + /* Disabled for now: + 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; @@ -2243,23 +2246,12 @@ main (int argc, char **argv ) 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 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: @@ -2441,8 +2433,14 @@ main (int argc, char **argv ) 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 oCertDigestAlgo: + cert_digest_string = xstrdup(pargs.r.ret_str); + break; + + case oNoSecmemWarn: + gcry_control (GCRYCTL_DISABLE_SECMEM_WARN); + break; + case oRequireSecmem: require_secmem=1; break; case oNoRequireSecmem: require_secmem=0; break; case oNoPermissionWarn: opt.no_perm_warn=1; break; @@ -2458,7 +2456,6 @@ main (int argc, char **argv ) case oLockOnce: opt.lock_once = 1; break; case oLockNever: disable_dotlock (); - random_disable_locking (); break; case oLockMultiple: #ifndef __riscos__ @@ -2592,11 +2589,17 @@ main (int argc, char **argv ) 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; + { + int algo = string_to_cipher_algo (pargs.r.ret_str); + gcry_cipher_ctl (NULL, GCRYCTL_DISABLE_ALGO, &algo, sizeof algo); + } + break; case oDisablePubkeyAlgo: - disable_pubkey_algo( string_to_pubkey_algo(pargs.r.ret_str) ); - break; + { + int algo = gcry_pk_map_name (pargs.r.ret_str); + gcry_pk_ctl (GCRYCTL_DISABLE_ALGO, &algo, sizeof algo); + } + 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; @@ -2676,6 +2679,7 @@ main (int argc, char **argv ) case oPersonalCompressPreferences: pers_compress_list=pargs.r.ret_str; break; + case oAgentProgram: opt.agent_program = 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; @@ -2692,8 +2696,12 @@ main (int argc, char **argv ) xfree(iter); } break; - case oStrict: opt.strict=1; log_set_strict(1); break; - case oNoStrict: opt.strict=0; log_set_strict(0); break; + + case oStrict: + case oNoStrict: + /* Not used */ + 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; @@ -2796,6 +2804,18 @@ main (int argc, char **argv ) } #endif + log_info ("WARNING: This version of gpg is not ready for use, use gpg 1.4.x\n"); + + /* FIXME: We should use logging to a file only in server mode; + however we have not yet implemetyed that. Thus we try to get + away with --batch as indication for logging to file + required. */ + if (logfile && opt.batch) + { + log_set_file (logfile); + log_set_prefix (NULL, 1|2|4); + } + if (opt.verbose > 2) log_info ("using character set `%s'\n", get_native_charset ()); @@ -2821,20 +2841,13 @@ main (int argc, char **argv ) "--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 */ + gcry_control (GCRYCTL_RESUME_SECMEM_WARN); if(require_secmem && !got_secmem) { @@ -2843,7 +2856,7 @@ main (int argc, char **argv ) g10_exit(2); } - set_debug(); + set_debug (debug_level); /* Do these after the switch(), so they can override settings. */ if(PGP2) @@ -2875,7 +2888,7 @@ main (int argc, char **argv ) preference, but those have their own error messages). */ - if(check_cipher_algo(CIPHER_ALGO_IDEA)) + if (openpgp_cipher_test_algo(CIPHER_ALGO_IDEA)) { log_info(_("encrypting a message in --pgp2 mode requires " "the IDEA cipher\n")); @@ -2934,47 +2947,46 @@ main (int argc, char **argv ) 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); + 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) ) + if ( openpgp_cipher_test_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); + 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) ) + if ( openpgp_md_test_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")); + log_error(_("selected compression algorithm is invalid\n")); } if( cert_digest_string ) { - opt.cert_digest_algo = string_to_digest_algo(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 (openpgp_md_test_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); + 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 (openpgp_cipher_test_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); + 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 (openpgp_md_test_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")); @@ -3069,26 +3081,26 @@ main (int argc, char **argv ) 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; + badalg = gcry_cipher_algo_name (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; + badalg = gcry_md_algo_name (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; + badalg = gcry_md_algo_name (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; + badalg = compress_algo_to_string(opt.compress_algo); + badtype = PREFTYPE_ZIP; } if(badalg) @@ -3118,10 +3130,10 @@ main (int argc, char **argv ) } } - /* set the random seed file */ + /* Set the random seed file. */ if( use_random_seed ) { char *p = make_filename(opt.homedir, "random_seed", NULL ); - set_random_seed_file(p); + gcry_control (GCRYCTL_SET_RANDOM_SEED_FILE, p); if (!access (p, F_OK)) register_secured_file (p); xfree(p); @@ -3143,7 +3155,6 @@ main (int argc, char **argv ) opt.list_sigs++; opt.verbose = opt.verbose > 1; - g10_opt_verbose = opt.verbose; } /* kludge to let -sat generate a clear text signature */ @@ -3604,6 +3615,7 @@ main (int argc, char **argv ) case aPrimegen: +#if 0 /*FIXME*/ { int mode = argc < 2 ? 0 : atoi(*argv); if( mode == 1 && argc == 2 ) { @@ -3635,6 +3647,8 @@ main (int argc, char **argv ) wrong_args("--gen-prime mode bits [qbits] "); putchar('\n'); } +#endif + wrong_args("--gen-prime not yet supported "); break; case aGenRandom: @@ -3654,7 +3668,7 @@ main (int argc, char **argv ) other tools */ size_t n = !endless && count < 99? count : 99; - p = get_random_bits( n*8, level, 0); + p = gcry_random_bytes (n, level); #ifdef HAVE_DOSISH_SYSTEM setmode ( fileno(stdout), O_BINARY ); #endif @@ -3683,7 +3697,7 @@ main (int argc, char **argv ) wrong_args("--print-md algo [files]"); { int all_algos = (**argv=='*' && !(*argv)[1]); - int algo = all_algos? 0 : string_to_digest_algo(*argv); + int algo = all_algos? 0 : gcry_md_map_name (*argv); if( !algo && !all_algos ) log_error(_("invalid hash algorithm `%s'\n"), *argv ); @@ -3756,12 +3770,6 @@ main (int argc, char **argv ) 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"); @@ -3852,23 +3860,34 @@ main (int argc, char **argv ) } +/* Note: This function is used by signal handlers!. */ +static void +emergency_cleanup (void) +{ + gcry_control (GCRYCTL_TERM_SECMEM ); +} + + void g10_exit( int rc ) { #ifdef ENABLE_CARD_SUPPORT - card_close (); + card_close (); #endif - update_random_seed_file(); - if( opt.debug & DBG_MEMSTAT_VALUE ) { - m_print_stats("on exit"); - random_dump_stats(); + + gcry_control (GCRYCTL_UPDATE_RANDOM_SEED_FILE); + if ( (opt.debug & DBG_MEMSTAT_VALUE) ) + { + gcry_control (GCRYCTL_DUMP_MEMORY_STATS); + gcry_control (GCRYCTL_DUMP_RANDOM_STATS); } - if( opt.debug ) - secmem_dump_stats(); - secmem_term(); - rc = rc? rc : log_get_errorcount(0)? 2 : - g10_errors_seen? 1 : 0; - exit(rc ); + if (opt.debug) + gcry_control (GCRYCTL_DUMP_SECMEM_STATS ); + + emergency_cleanup (); + + rc = rc? rc : log_get_errorcount(0)? 2 : g10_errors_seen? 1 : 0; + exit (rc); } @@ -3876,7 +3895,7 @@ g10_exit( int rc ) 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 ) +print_hex( gcry_md_hd_t md, int algo, const char *fname ) { int i,n,count,indent=0; const byte *p; @@ -3893,16 +3912,16 @@ print_hex( MD_HANDLE md, int algo, const char *fname ) if(algo==DIGEST_ALGO_RMD160) indent+=printf("RMD160 = "); else if(algo>0) - indent+=printf("%6s = ",digest_algo_to_string(algo)); + indent+=printf("%6s = ", gcry_md_algo_name (algo)); else algo=abs(algo); count=indent; - p = md_read( md, algo ); - n = md_digest_length(algo); + p = gcry_md_read (md, algo); + n = gcry_md_get_algo_dlen (algo); - count+=printf("%02X",*p++); + count += printf ("%02X",*p++); for(i=1;i<n;i++,p++) { @@ -3956,7 +3975,7 @@ print_hex( MD_HANDLE md, int algo, const char *fname ) } static void -print_hashline( MD_HANDLE md, int algo, const char *fname ) +print_hashline( gcry_md_hd_t md, int algo, const char *fname ) { int i, n; const byte *p; @@ -3971,8 +3990,8 @@ print_hashline( MD_HANDLE md, int algo, const char *fname ) } putchar(':'); printf("%d:", algo ); - p = md_read( md, algo ); - n = md_digest_length(algo); + p = gcry_md_read (md, algo); + n = gcry_md_get_algo_dlen (algo); for(i=0; i < n ; i++, p++ ) printf("%02X", *p ); putchar(':'); @@ -3985,7 +4004,7 @@ print_mds( const char *fname, int algo ) FILE *fp; char buf[1024]; size_t n; - MD_HANDLE md; + gcry_md_hd_t md; if( !fname ) { fp = stdin; @@ -4007,43 +4026,44 @@ print_mds( const char *fname, int algo ) return; } - md = md_open( 0, 0 ); + gcry_md_open (&md, 0, 0); if( algo ) - md_enable( md, algo ); + gcry_md_enable (md, algo); else { - md_enable( md, DIGEST_ALGO_MD5 ); - md_enable( md, DIGEST_ALGO_SHA1 ); - md_enable( md, DIGEST_ALGO_RMD160 ); + gcry_md_enable (md, GCRY_MD_MD5); + gcry_md_enable (md, GCRY_MD_SHA1); + gcry_md_enable (md, GCRY_MD_RMD160); #ifdef USE_SHA256 - md_enable( md, DIGEST_ALGO_SHA224 ); - md_enable( md, DIGEST_ALGO_SHA256 ); + gcry_md_enable (md, DIGEST_ALGO_SHA224); + gcry_md_enable (md, GCRY_MD_SHA256); #endif #ifdef USE_SHA512 - md_enable( md, DIGEST_ALGO_SHA384 ); - md_enable( md, DIGEST_ALGO_SHA512 ); + gcry_md_enable (md, GCRY_MD_SHA384); + gcry_md_enable (md, GCRY_MD_SHA512); #endif } while( (n=fread( buf, 1, DIM(buf), fp )) ) - md_write( md, buf, n ); + gcry_md_write (md, buf, n); if( ferror(fp) ) log_error("%s: %s\n", fname?fname:"[stdin]", strerror(errno) ); else { - md_final(md); + gcry_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 ); + print_hashline( md, GCRY_MD_MD5, fname ); + print_hashline( md, GCRY_MD_SHA1, fname ); + print_hashline( md, GCRY_MD_RMD160, fname ); #ifdef USE_SHA256 - print_hashline( md, DIGEST_ALGO_SHA224, fname ); - print_hashline( md, DIGEST_ALGO_SHA256, fname ); + if (!gcry_md_test_algo (DIGEST_ALGO_SHA224) + print_hashline (md, DIGEST_ALGO_SHA224, fname); + print_hashline( md, GCRY_MD_SHA256, fname ); #endif #ifdef USE_SHA512 - print_hashline( md, DIGEST_ALGO_SHA384, fname ); - print_hashline( md, DIGEST_ALGO_SHA512, fname ); + print_hashline( md, GCRY_MD_SHA384, fname ); + print_hashline( md, GCRY_MD_SHA512, fname ); #endif } } @@ -4051,21 +4071,22 @@ print_mds( const char *fname, int algo ) 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 ); + print_hex( md, GCRY_MD_MD5, fname ); + print_hex( md, GCRY_MD_SHA1, fname ); + print_hex( md, GCRY_MD_RMD160, fname ); #ifdef USE_SHA256 - print_hex( md, DIGEST_ALGO_SHA224, fname ); - print_hex( md, DIGEST_ALGO_SHA256, fname ); + if (!gcry_md_test_algo (DIGEST_ALGO_SHA224) + print_hex (md, DIGEST_ALGO_SHA224, fname); + print_hex( md, GCRY_MD_SHA256, fname ); #endif #ifdef USE_SHA512 - print_hex( md, DIGEST_ALGO_SHA384, fname ); - print_hex( md, DIGEST_ALGO_SHA512, fname ); + print_hex( md, GCRY_MD_SHA384, fname ); + print_hex( md, GCRY_MD_SHA512, fname ); #endif } } } - md_close(md); + gcry_md_close(md); if( fp != stdin ) fclose(fp); diff --git a/g10/gpg.h b/g10/gpg.h new file mode 100644 index 000000000..100a8e349 --- /dev/null +++ b/g10/gpg.h @@ -0,0 +1,102 @@ +/* gpg.h - top level include file for gpg etc. + * Copyright (C) 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_G10_GPG_H +#define GNUPG_G10_GPG_H + +/* Note, that this file should be the first one after the system + header files. This is required to set the error source to the + correct value and may be of advantage if we ever have to do + special things. */ + +#ifdef GPG_ERR_SOURCE_DEFAULT +#error GPG_ERR_SOURCE_DEFAULT already defined +#endif +#define GPG_ERR_SOURCE_DEFAULT GPG_ERR_SOURCE_GPG +#define map_assuan_err(a) \ + map_assuan_err_with_source (GPG_ERR_SOURCE_DEFAULT, (a)) +#include <gpg-error.h> +#include <gcrypt.h> + + +/* Number of bits we accept when reading or writing MPIs. */ +#define MAX_EXTERN_MPI_BITS 16384 + +/* The maximum length of a binary fingerprints. */ +#define MAX_FINGERPRINT_LEN 20 + + +/* Forward declarations. */ +typedef struct kbnode_struct *KBNODE; +typedef struct keydb_search_desc KEYDB_SEARCH_DESC; + + + +/* Simple wrappers. */ +#define g10_errstr(a) gpg_strerror ((a)) + + +/* Mapping of the old erro codes to the gpg-error ones. Fixme: This + is just a temporary solution: We need to do all these gpg_error() + calls in the code. */ +#define G10ERR_BAD_KEY GPG_ERR_BAD_KEY +#define G10ERR_BAD_PASS GPG_ERR_BAD_PASS +#define G10ERR_BAD_PUBKEY GPG_ERR_BAD_PUBKEY +#define G10ERR_BAD_SIGN GPG_ERR_BAD_SIGNATURE +#define G10ERR_BAD_URI GPG_ERR_BAD_URI +#define G10ERR_CHECKSUM GPG_ERR_CHECKSUM +#define G10ERR_CIPHER_ALGO GPG_ERR_CIPHER_ALGO +#define G10ERR_CLOSE_FILE GPG_ERR_CLOSE_FILE +#define G10ERR_COMPR_ALGO GPG_ERR_COMPR_ALGO +#define G10ERR_CREATE_FILE GPG_ERR_CREATE_FILE +#define G10ERR_DIGEST_ALGO GPG_ERR_DIGEST_ALGO +#define G10ERR_FILE_EXISTS GPG_ERR_EEXIST +#define G10ERR_GENERAL GPG_ERR_GENERAL +#define G10ERR_INV_ARG GPG_ERR_INV_ARG +#define G10ERR_INV_KEYRING GPG_ERR_INV_KEYRING +#define G10ERR_INV_USER_ID GPG_ERR_INV_USER_ID +#define G10ERR_INVALID_ARMOR GPG_ERR_INV_ARMOR +#define G10ERR_INVALID_PACKET GPG_ERR_INV_PACKET +#define G10ERR_KEYRING_OPEN GPG_ERR_KEYRING_OPEN +#define G10ERR_KEYSERVER GPG_ERR_KEYSERVER +#define G10ERR_NO_DATA GPG_ERR_NO_DATA +#define G10ERR_NO_PUBKEY GPG_ERR_NO_PUBKEY +#define G10ERR_NO_SECKEY GPG_ERR_NO_SECKEY +#define G10ERR_NO_USER_ID GPG_ERR_NO_USER_ID +#define G10ERR_NOT_PROCESSED GPG_ERR_NOT_PROCESSED +#define G10ERR_OPEN_FILE GPG_ERR_OPEN_FILE +#define G10ERR_PASSPHRASE GPG_ERR_PASSPHRASE +#define G10ERR_PUBKEY_ALGO GPG_ERR_PUBKEY_ALGO +#define G10ERR_READ_FILE GPG_ERR_READ_FILE +#define G10ERR_RENAME_FILE GPG_ERR_RENAME_FILE +#define G10ERR_RESOURCE_LIMIT GPG_ERR_RESOURCE_LIMIT +#define G10ERR_SIG_CLASS GPG_ERR_SIG_CLASS +#define G10ERR_TIME_CONFLICT GPG_ERR_TIME_CONFLICT +#define G10ERR_TRUSTDB GPG_ERR_TRUSTDB +#define G10ERR_UNEXPECTED GPG_ERR_UNEXPECTED +#define G10ERR_UNKNOWN_PACKET GPG_ERR_UNKNOWN_PACKET +#define G10ERR_UNSUPPORTED GPG_ERR_UNSUPPORTED +#define G10ERR_UNU_PUBKEY GPG_ERR_UNUSABLE_PUBKEY +#define G10ERR_UNU_SECKEY GPG_ERR_UNUSABLE_SECKEY +#define G10ERR_WRONG_SECKEY GPG_ERR_WRONG_SECKEY + + + +#endif /*GNUPG_G10_GPG_H*/ diff --git a/g10/gpgv.c b/g10/gpgv.c index 5192c26fc..f33c5fc63 100644 --- a/g10/gpgv.c +++ b/g10/gpgv.c @@ -36,22 +36,19 @@ #endif #define INCLUDED_BY_MAIN_MODULE 1 +#include "gpg.h" #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, @@ -85,8 +82,8 @@ static ARGPARSE_OPTS opts[] = { int g10_errors_seen = 0; -const char * -strusage( int level ) +static const char * +my_strusage( int level ) { const char *p; switch( level ) { @@ -106,29 +103,28 @@ strusage( int level ) "Check signatures against known trusted keys\n"); break; - default: p = default_strusage(level); + default: p = NULL; } return p; } - - static void i18n_init(void) { #ifdef USE_SIMPLE_GETTEXT - set_gettext_file (PACKAGE, "Software\\GNU\\GnuPG"); + set_gettext_file (PACKAGE_GT, "Software\\GNU\\GnuPG"); #else #ifdef ENABLE_NLS - setlocale( LC_ALL, "" ); - bindtextdomain( PACKAGE, G10_LOCALEDIR ); - textdomain( PACKAGE ); + setlocale (LC_ALL, ""); + bindtextdomain (PACKAGE_GT, LOCALEDIR); + textdomain (PACKAGE_GT); #endif #endif } + int main( int argc, char **argv ) { @@ -138,8 +134,9 @@ main( int argc, char **argv ) STRLIST nrings=NULL; unsigned configlineno; - log_set_name("gpgv"); - init_signals(); + set_strusage (my_strusage); + log_set_prefix ("gpgv", 1); + gnupg_init_signals (0, NULL); i18n_init(); opt.command_fd = -1; /* no command fd */ opt.pgp2_workarounds = 1; @@ -161,11 +158,16 @@ main( int argc, char **argv ) 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 oVerbose: + opt.verbose++; + opt.list_sigs=1; + gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose); + 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 oLoggerFD: + log_set_fd (iobuf_translate_file_handle (pargs.r.ret_int, 1)); + break; case oHomedir: opt.homedir = pargs.r.ret_str; break; case oIgnoreTimeConflict: opt.ignore_time_conflict = 1; break; default : pargs.err = 2; break; @@ -175,9 +177,7 @@ main( int argc, char **argv ) if( log_get_errorcount(0) ) g10_exit(2); - g10_opt_homedir = opt.homedir; - - if( opt.verbose > 1 ) + if( opt.verbose > 1 ) set_packet_list_mode(1); if( !nrings ) /* no keyring given: use default one */ @@ -371,41 +371,20 @@ int agent_scd_getattr (const char *name, struct agent_card_info_s *info) {return #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, +gcry_cipher_hd_t cipher_open( int algo, int mode, int secure ) { return NULL;} +void cipher_close( gcry_cipher_hd_t c ) {} +int cipher_setkey( gcry_cipher_hd_t c, byte *key, unsigned keylen ) { return -1;} +void cipher_setiv( gcry_cipher_hd_t c, const byte *iv, unsigned ivlen ){} +void cipher_encrypt( gcry_cipher_hd_t c, byte *outbuf, byte *inbuf, unsigned nbytes ) {} -void cipher_decrypt( CIPHER_HANDLE c, byte *outbuf, +void cipher_decrypt( gcry_cipher_hd_t 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) {} +void cipher_sync( gcry_cipher_hd_t c ) {} /* Stubs to avoid linking to ../util/ttyio.c */ diff --git a/g10/helptext.c b/g10/helptext.c index e1f785191..c720cc7cf 100644 --- a/g10/helptext.c +++ b/g10/helptext.c @@ -24,6 +24,8 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> + +#include "gpg.h" #include "util.h" #include "ttyio.h" #include "main.h" diff --git a/g10/import.c b/g10/import.c index e2ad0e314..3b41e08cf 100644 --- a/g10/import.c +++ b/g10/import.c @@ -27,11 +27,11 @@ #include <errno.h> #include <assert.h> +#include "gpg.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" @@ -243,7 +243,9 @@ 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; + KBNODE keyblock = NULL; /* Need to initialize because gcc can't + grasp the return semantics of + read_block. */ int rc = 0; getkey_disable_caches(); @@ -563,11 +565,8 @@ print_import_check (PKT_public_key * pk, PKT_user_id * id) 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")); + log_info(_("WARNING: key %s contains preferences for unavailable\n" + "algorithms on these user IDs:\n"), keystr_from_pk(pk)); } static void @@ -599,9 +598,9 @@ check_prefs(KBNODE keyblock) if(prefs->type==PREFTYPE_SYM) { - if(check_cipher_algo(prefs->value)) + if (openpgp_cipher_test_algo (prefs->value)) { - const char *algo=cipher_algo_to_string(prefs->value); + const char *algo = gcry_cipher_algo_name (prefs->value); if(!problem) check_prefs_warning(pk); log_info(_(" \"%s\": preference for cipher" @@ -611,9 +610,9 @@ check_prefs(KBNODE keyblock) } else if(prefs->type==PREFTYPE_HASH) { - if(check_digest_algo(prefs->value)) + if(openpgp_md_test_algo(prefs->value)) { - const char *algo=digest_algo_to_string(prefs->value); + const char *algo = gcry_md_algo_name (prefs->value); if(!problem) check_prefs_warning(pk); log_info(_(" \"%s\": preference for digest" @@ -623,7 +622,7 @@ check_prefs(KBNODE keyblock) } else if(prefs->type==PREFTYPE_ZIP) { - if(check_compress_algo(prefs->value)) + if(check_compress_algo (prefs->value)) { const char *algo=compress_algo_to_string(prefs->value); if(!problem) @@ -1560,9 +1559,9 @@ delete_inv_parts( const char *fname, KBNODE keyblock, 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 ) + else if (node->pkt->pkttype == PKT_SIGNATURE + && openpgp_pk_test_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 && diff --git a/g10/kbnode.c b/g10/kbnode.c index 9038f5b44..b09546451 100644 --- a/g10/kbnode.c +++ b/g10/kbnode.c @@ -25,8 +25,9 @@ #include <stdlib.h> #include <string.h> #include <assert.h> + +#include "gpg.h" #include "util.h" -#include "memory.h" #include "packet.h" #include "keydb.h" diff --git a/g10/keydb.c b/g10/keydb.c index b1a726858..b3595cf36 100644 --- a/g10/keydb.c +++ b/g10/keydb.c @@ -29,6 +29,7 @@ #include <sys/stat.h> #include <unistd.h> +#include "gpg.h" #include "util.h" #include "options.h" #include "main.h" /*try_make_homedir ()*/ @@ -91,7 +92,7 @@ maybe_create_keyring (char *filename, int force) /* 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; + return gpg_error (GPG_ERR_ENOENT); /* 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 @@ -111,7 +112,7 @@ maybe_create_keyring (char *filename, int force) } if (access (filename, F_OK)) { - rc = G10ERR_OPEN_FILE; + rc = gpg_error_from_errno (errno); *last_slash_in_filename = DIRSEP_C; goto leave; } @@ -133,9 +134,9 @@ maybe_create_keyring (char *filename, int force) log_info ("can't allocate lock for `%s'\n", filename ); if (!force) - return G10ERR_OPEN_FILE; + return gpg_error (GPG_ERR_ENOENT); else - return G10ERR_GENERAL; + return gpg_error (GPG_ERR_GENERAL); } if ( make_dotlock (lockhd, -1) ) @@ -165,9 +166,9 @@ maybe_create_keyring (char *filename, int force) umask (oldmask); if (!iobuf) { + rc = gpg_error_from_errno (errno); log_error ( _("error creating keyring `%s': %s\n"), filename, strerror(errno)); - rc = G10ERR_OPEN_FILE; goto leave; } diff --git a/g10/keydb.h b/g10/keydb.h index b58838108..2aab31cfa 100644 --- a/g10/keydb.h +++ b/g10/keydb.h @@ -23,13 +23,11 @@ #ifndef G10_KEYDB_H #define G10_KEYDB_H +#include <assuan.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) \ @@ -80,7 +78,7 @@ struct keyblock_pos_struct { enum resource_type rt; off_t offset; /* position information */ unsigned count; /* length of the keyblock in packets */ - IOBUF fp; /* used by enum_keyblocks */ + iobuf_t fp; /* Used by enum_keyblocks. */ int secret; /* working on a secret keyring */ PACKET *pkt; /* ditto */ int valid; @@ -146,6 +144,14 @@ struct keydb_search_desc { int exact; }; + +/* Helper type for preference fucntions. */ +union pref_hint +{ + int digest_length; +}; + + /*-- keydb.c --*/ /* @@ -177,14 +183,10 @@ 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 request, const union pref_hint *hint); int select_mdc_from_pklist (PK_LIST pk_list); /*-- skclist.c --*/ @@ -193,15 +195,8 @@ 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 ); @@ -268,7 +263,8 @@ 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 ); +u32 v3_keyid (gcry_mpi_t a, u32 *ki); +void hash_public_key( gcry_md_hd_t md, PKT_public_key *pk ); size_t keystrlen(void); const char *keystr(u32 *keyid); const char *keystr_from_pk(PKT_public_key *pk); diff --git a/g10/keyedit.c b/g10/keyedit.c index 56e30e5d3..80d714adc 100644 --- a/g10/keyedit.c +++ b/g10/keyedit.c @@ -31,12 +31,13 @@ #include <stdio.h> #include <readline/readline.h> #endif + +#include "gpg.h" #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" @@ -2310,7 +2311,7 @@ show_prefs (PKT_user_id *uid, PKT_signature *selfsig, int verbose) 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); + const char *s = gcry_cipher_algo_name (prefs[i].value); if (any) tty_printf (", "); @@ -2327,13 +2328,13 @@ show_prefs (PKT_user_id *uid, PKT_signature *selfsig, int verbose) if (!des_seen) { if (any) tty_printf (", "); - tty_printf ("%s",cipher_algo_to_string(CIPHER_ALGO_3DES)); + tty_printf ("%s", gcry_cipher_algo_name (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); + const char *s = gcry_md_algo_name (prefs[i].value); if (any) tty_printf (", "); @@ -2350,7 +2351,7 @@ show_prefs (PKT_user_id *uid, PKT_signature *selfsig, int verbose) if (!sha1_seen) { if (any) tty_printf (", "); - tty_printf ("%s",digest_algo_to_string(DIGEST_ALGO_SHA1)); + tty_printf ("%s", gcry_md_algo_name (DIGEST_ALGO_SHA1)); } tty_printf ("\n "); tty_printf (_("Compression: ")); @@ -2685,7 +2686,7 @@ show_key_with_all_names( KBNODE keyblock, int only_marked, int with_revoker, if(pk->is_revoked) { char *user=get_user_id_string_native(pk->revoked.keyid); - const char *algo=pubkey_algo_to_string(pk->revoked.algo); + const char *algo = gcry_pk_algo_name (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); @@ -2700,9 +2701,9 @@ show_key_with_all_names( KBNODE keyblock, int only_marked, int with_revoker, { u32 r_keyid[2]; char *user; - const char *algo= - pubkey_algo_to_string(pk->revkey[i].algid); + const char *algo; + algo = gcry_pk_algo_name (pk->revkey[i].algid); keyid_from_fingerprint(pk->revkey[i].fpr, MAX_FINGERPRINT_LEN,r_keyid); diff --git a/g10/keygen.c b/g10/keygen.c index 620274aef..ff4ce88b4 100644 --- a/g10/keygen.c +++ b/g10/keygen.c @@ -30,6 +30,8 @@ #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> + +#include "gpg.h" #include "util.h" #include "main.h" #include "packet.h" @@ -40,8 +42,9 @@ #include "trustdb.h" #include "status.h" #include "i18n.h" -#include "cardglue.h" #include "keyserver-internal.h" +#include "call-agent.h" + #define MAX_PREFS 30 @@ -319,13 +322,13 @@ keygen_set_std_prefs (const char *string,int personal) /* 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)) + if ( !openpgp_cipher_test_algo (CIPHER_ALGO_AES256) ) strcat(dummy_string,"S9 "); - if(!check_cipher_algo(CIPHER_ALGO_AES192)) + if ( !openpgp_cipher_test_algo (CIPHER_ALGO_AES192) ) strcat(dummy_string,"S8 "); - if(!check_cipher_algo(CIPHER_ALGO_AES)) + if ( !openpgp_cipher_test_algo (CIPHER_ALGO_AES) ) strcat(dummy_string,"S7 "); - if(!check_cipher_algo(CIPHER_ALGO_CAST5)) + if ( !openpgp_cipher_test_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 @@ -335,13 +338,13 @@ keygen_set_std_prefs (const char *string,int personal) 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)) + if ( !openpgp_cipher_test_algo (CIPHER_ALGO_IDEA) ) strcat(dummy_string,"S1 "); /* SHA-1 */ strcat(dummy_string,"H2 "); - if(!check_digest_algo(DIGEST_ALGO_SHA256)) + if (!openpgp_md_test_algo(DIGEST_ALGO_SHA256)) strcat(dummy_string,"H8 "); /* RIPEMD160 */ @@ -370,12 +373,12 @@ keygen_set_std_prefs (const char *string,int personal) while((tok=strsep(&prefstring," ,"))) { - if((val=string_to_cipher_algo(tok))) + 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))) + else if((val=string_to_digest_algo (tok))) { if(set_one_pref(val,2,tok,hash,&nhash)) rc=-1; @@ -1004,16 +1007,116 @@ write_keybinding( KBNODE root, KBNODE pub_root, } + 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) +key_from_sexp (gcry_mpi_t *array, gcry_sexp_t sexp, + const char *topname, const char *elems) +{ + gcry_sexp_t list, l2; + const char *s; + int i, idx; + int rc = 0; + + list = gcry_sexp_find_token (sexp, topname, 0); + if (!list) + return gpg_error (GPG_ERR_INV_OBJ); + l2 = gcry_sexp_cadr (list); + gcry_sexp_release (list); + list = l2; + if (!list) + return gpg_error (GPG_ERR_NO_OBJ); + + for (idx=0,s=elems; *s; s++, idx++) + { + l2 = gcry_sexp_find_token (list, s, 1); + if (!l2) + { + rc = gpg_error (GPG_ERR_NO_OBJ); /* required parameter not found */ + goto leave; + } + array[idx] = gcry_sexp_nth_mpi (l2, 1, GCRYMPI_FMT_USG); + gcry_sexp_release (l2); + if (!array[idx]) + { + rc = gpg_error (GPG_ERR_INV_OBJ); /* required parameter invalid */ + goto leave; + } + } + gcry_sexp_release (list); + + leave: + if (rc) + { + for (i=0; i<idx; i++) + { + xfree (array[i]); + array[i] = NULL; + } + gcry_sexp_release (list); + } + return rc; +} + + +static int +genhelp_protect (DEK *dek, STRING2KEY *s2k, PKT_secret_key *sk) +{ + int rc = 0; + + 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", gpg_strerror (rc) ); + } + + return rc; +} + +static void +genhelp_factors (gcry_sexp_t misc_key_info, KBNODE sec_root) +{ +#if 0 /* Not used anymore */ + size_t n; + char *buf; + + if (misc_key_info) + { + /* DSA: 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. */ + n = gcry_sexp_sprint (misc_key_info, 0, NULL, 0); + buf = xmalloc (n+4); + strcpy (buf, "#::"); + n = gcry_sexp_sprint (misc_key_info, 0, buf+3, n); + if (n) + { + n += 3; + add_kbnode (sec_root, make_comment_node_from_buffer (buf, n)); + } + xfree (buf); + gcry_sexp_release (misc_key_info); + } +#endif +} + + +static int +gen_elg(int algo, 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[4]; - MPI *factors; + gcry_sexp_t s_parms, s_key; + gcry_sexp_t misc_key_info; assert( is_ELGAMAL(algo) ); @@ -1027,11 +1130,22 @@ gen_elg(int algo, unsigned nbits, KBNODE pub_root, KBNODE sec_root, DEK *dek, 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; - } + + rc = gcry_sexp_build ( &s_parms, NULL, + "(genkey(%s(nbits %d)))", + algo == GCRY_PK_ELG_E ? "openpgp-elg" : + algo == GCRY_PK_ELG ? "elg" : "x-oops" , + (int)nbits); + if (rc) + log_bug ("gcry_sexp_build failed: %s\n", gpg_strerror (rc)); + + rc = gcry_pk_genkey (&s_key, s_parms); + gcry_sexp_release (s_parms); + if (rc) + { + log_error ("gcry_pk_genkey failed: %s\n", gpg_strerror (rc) ); + return rc; + } sk = xmalloc_clear( sizeof *sk ); pk = xmalloc_clear( sizeof *pk ); @@ -1041,13 +1155,35 @@ gen_elg(int algo, unsigned nbits, KBNODE pub_root, KBNODE sec_root, DEK *dek, 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]; +/* 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]; */ + + rc = key_from_sexp (pk->pkey, s_key, "public-key", "pgy"); + if (rc) + { + log_error ("key_from_sexp failed: %s\n", gpg_strerror (rc) ); + gcry_sexp_release (s_key); + free_secret_key (sk); + free_public_key (pk); + return rc; + } + rc = key_from_sexp (sk->skey, s_key, "private-key", "pgyx"); + if (rc) + { + log_error("key_from_sexp failed: %s\n", gpg_strerror (rc) ); + gcry_sexp_release (s_key); + free_secret_key (sk); + free_public_key (pk); + return rc; + } + misc_key_info = gcry_sexp_find_token (s_key, "misc-key-info", 0); + gcry_sexp_release (s_key); + sk->is_protected = 0; sk->protect.algo = 0; @@ -1055,30 +1191,29 @@ gen_elg(int algo, unsigned nbits, KBNODE pub_root, KBNODE sec_root, DEK *dek, 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; - } - } + rc = genhelp_protect (dek, s2k, sk); + if (rc) + { + free_public_key (pk); + free_secret_key (sk); + gcry_sexp_release (misc_key_info); + return rc; + } - pkt = xmalloc_clear(sizeof *pkt); + 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) */ + /* 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 )); + genhelp_factors (misc_key_info, sec_root); + return 0; } @@ -1087,29 +1222,29 @@ gen_elg(int algo, unsigned nbits, KBNODE pub_root, KBNODE sec_root, DEK *dek, * Generate a DSA key */ static int -gen_dsa(unsigned int nbits, KBNODE pub_root, KBNODE sec_root, DEK *dek, +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; + gcry_sexp_t s_parms, s_key; + gcry_sexp_t misc_key_info; unsigned int qbits; - if( nbits < 512 || (!opt.flags.dsa2 && nbits > 1024)) + if ( nbits < 512 || (!opt.flags.dsa2 && nbits > 1024)) { nbits = 1024; log_info(_("keysize invalid; using %u bits\n"), nbits ); } - else if(nbits>3072) + else if ( nbits > 3072 ) { - nbits = 3072; - log_info(_("keysize invalid; using %u bits\n"), nbits ); + nbits = 3072; + log_info(_("keysize invalid; using %u bits\n"), nbits ); } - if(nbits % 64) + if( (nbits % 64) ) { nbits = ((nbits + 63) / 64) * 64; log_info(_("keysize rounded up to %u bits\n"), nbits ); @@ -1117,54 +1252,73 @@ gen_dsa(unsigned int nbits, KBNODE pub_root, KBNODE sec_root, DEK *dek, /* 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; + + if (nbits > 2048) + qbits = 256; + else if ( nbits > 1024) + qbits = 224; else - qbits=160; + qbits = 160; + + if (qbits != 160 ) + log_info (_("WARNING: some OpenPGP programs can't" + " handle a DSA key with this digest size\n")); - 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 ) + rc = gcry_sexp_build (&s_parms, NULL, + "(genkey(dsa(nbits %d)(qbits %d)))", + (int)nbits, (int)qbits); + if (rc) + log_bug ("gcry_sexp_build failed: %s\n", gpg_strerror (rc)); + + rc = gcry_pk_genkey (&s_key, s_parms); + gcry_sexp_release (s_parms); + if (rc) { - log_error("dsa2_generate failed: %s\n", g10_errstr(rc) ); - return rc; + log_error ("gcry_pk_genkey failed: %s\n", gpg_strerror (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 ) + 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]; + + rc = key_from_sexp (pk->pkey, s_key, "public-key", "pqgy"); + if (rc) + { + log_error ("key_from_sexp failed: %s\n", gpg_strerror (rc)); + gcry_sexp_release (s_key); + free_public_key(pk); + free_secret_key(sk); + return rc; + } + rc = key_from_sexp (sk->skey, s_key, "private-key", "pqgyx"); + if (rc) + { + log_error ("key_from_sexp failed: %s\n", gpg_strerror (rc) ); + gcry_sexp_release (s_key); + free_public_key(pk); + free_secret_key(sk); + return rc; + } + misc_key_info = gcry_sexp_find_token (s_key, "misc-key-info", 0); + gcry_sexp_release (s_key); + sk->is_protected = 0; sk->protect.algo = 0; @@ -1172,24 +1326,21 @@ gen_dsa(unsigned int nbits, KBNODE pub_root, KBNODE sec_root, DEK *dek, 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; - } - } + rc = genhelp_protect (dek, s2k, sk); + if (rc) + { + free_public_key (pk); + free_secret_key (sk); + gcry_sexp_release (misc_key_info); + 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 + /* 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 @@ -1200,6 +1351,8 @@ gen_dsa(unsigned int nbits, KBNODE pub_root, KBNODE sec_root, DEK *dek, pkt->pkt.secret_key = sk; add_kbnode(sec_root, new_kbnode( pkt )); + genhelp_factors (misc_key_info, sec_root); + return 0; } @@ -1215,8 +1368,7 @@ gen_rsa(int algo, unsigned nbits, KBNODE pub_root, KBNODE sec_root, DEK *dek, PACKET *pkt; PKT_secret_key *sk; PKT_public_key *pk; - MPI skey[6]; - MPI *factors; + gcry_sexp_t s_parms, s_key; assert( is_RSA(algo) ); @@ -1230,11 +1382,19 @@ gen_rsa(int algo, unsigned nbits, KBNODE pub_root, KBNODE sec_root, DEK *dek, 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; - } + rc = gcry_sexp_build (&s_parms, NULL, + "(genkey(rsa(nbits %d)))", + (int)nbits); + if (rc) + log_bug ("gcry_sexp_build failed: %s\n", gpg_strerror (rc)); + + rc = gcry_pk_genkey (&s_key, s_parms); + gcry_sexp_release (s_parms); + if (rc) + { + log_error ("gcry_pk_genkey failed: %s\n", gpg_strerror (rc) ); + return rc; + } sk = xmalloc_clear( sizeof *sk ); pk = xmalloc_clear( sizeof *pk ); @@ -1244,14 +1404,27 @@ gen_rsa(int algo, unsigned nbits, KBNODE pub_root, KBNODE sec_root, DEK *dek, 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]; + + rc = key_from_sexp (pk->pkey, s_key, "public-key", "ne"); + if (rc) + { + log_error ("key_from_sexp failed: %s\n", gpg_strerror (rc)); + gcry_sexp_release (s_key); + free_public_key(pk); + free_secret_key(sk); + return rc; + } + rc = key_from_sexp (sk->skey, s_key, "private-key", "nedpqu"); + if (rc) + { + log_error ("key_from_sexp failed: %s\n", gpg_strerror (rc) ); + gcry_sexp_release (s_key); + free_public_key(pk); + free_secret_key(sk); + return rc; + } + gcry_sexp_release (s_key); + sk->is_protected = 0; sk->protect.algo = 0; @@ -1262,17 +1435,13 @@ gen_rsa(int algo, unsigned nbits, KBNODE pub_root, KBNODE sec_root, DEK *dek, 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; - } - } + rc = genhelp_protect (dek, s2k, sk); + if (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; @@ -1357,7 +1526,7 @@ ask_key_flags(int algo,int subkey) { tty_printf("\n"); tty_printf(_("Possible actions for a %s key: "), - pubkey_algo_to_string(algo)); + gcry_pk_algo_name (algo)); print_key_flags(possible); tty_printf("\n"); tty_printf(_("Current allowed actions: ")); @@ -1494,7 +1663,7 @@ ask_algo (int addmode, unsigned int *r_usage) static unsigned ask_keysize( int algo ) { - unsigned nbits,min,def=2048,max=4096; + unsigned int nbits, min, def=2048, max=4096; if(opt.expert) min=512; @@ -1522,7 +1691,7 @@ ask_keysize( int algo ) } tty_printf(_("%s keys may be between %u and %u bits long.\n"), - pubkey_algo_to_string(algo),min,max); + gcry_pk_algo_name (algo), min, max); for(;;) { @@ -1543,7 +1712,7 @@ ask_keysize( int algo ) if(nbits<min || nbits>max) tty_printf(_("%s keysizes must be in the range %u-%u\n"), - pubkey_algo_to_string(algo),min,max); + gcry_pk_algo_name (algo), min, max); else break; } @@ -1782,8 +1951,9 @@ ask_user_id( int mode ) /* 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!)" ); + /* FIXME: see skclist.c:random_is_faked */ + /* 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++ ) { @@ -2009,7 +2179,7 @@ get_parameter_algo( struct para_data_s *para, enum para_name key ) if( digitp( r->u.value ) ) i = atoi( r->u.value ); else - i = string_to_pubkey_algo( r->u.value ); + i = gcry_pk_map_name (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; @@ -2160,7 +2330,7 @@ proc_parameter_file( struct para_data_s *para, const char *fname, if(r) { algo=get_parameter_algo(para,pKEYTYPE); - if(check_pubkey_algo2(algo,PUBKEY_USAGE_SIG)) + if (openpgp_pk_test_algo2 (algo, PUBKEY_USAGE_SIG)) { log_error("%s:%d: invalid algorithm\n", fname, r->lnr ); return -1; @@ -2189,7 +2359,7 @@ proc_parameter_file( struct para_data_s *para, const char *fname, if(r) { algo=get_parameter_algo( para, pSUBKEYTYPE); - if(check_pubkey_algo(algo)) + if (openpgp_pk_test_algo (algo)) { log_error("%s:%d: invalid algorithm\n", fname, r->lnr ); return -1; @@ -2539,7 +2709,7 @@ read_parameter_file( const char *fname ) /* * Generate a keypair (fname is only used in batch mode) If - * CARD_SERIALNO is not NULL the fucntion will create the keys on an + * CARD_SERIALNO is not NULL the function 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 @@ -2775,30 +2945,42 @@ generate_raw_key (int algo, unsigned int nbits, u32 created_at, sk->version = 4; sk->pubkey_algo = algo; - rc = pubkey_generate (algo, nbits, sk->skey, NULL); - if (rc) + if ( !is_RSA (algo) ) { - log_error("pubkey_generate failed: %s\n", g10_errstr(rc) ); + log_error ("only RSA is supported for offline generated keys\n"); + rc = gpg_error (GPG_ERR_NOT_IMPLEMENTED); goto leave; } - + rc = gcry_sexp_build (&s_parms, NULL, + "(genkey(rsa(nbits %d)))", + (int)nbits); + if (rc) + log_bug ("gcry_sexp_build failed: %s\n", gpg_strerror (rc)); + rc = gcry_pk_genkey (&s_key, s_parms); + gcry_sexp_release (s_parms); + if (rc) + { + log_error ("gcry_pk_genkey failed: %s\n", gpg_strerror (rc) ); + goto leave; + } + rc = key_from_sexp (sk->skey, s_key, "private-key", "nedpqu"); + gcry_sexp_release (s_key); + if (rc) + { + log_error ("key_from_sexp failed: %s\n", gpg_strerror (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; - } - } + rc = genhelp_protect (dek, s2k, sk); + if (rc) + goto leave; + if (r_sk_protected) { *r_sk_protected = sk; @@ -3387,7 +3569,7 @@ write_keyblock( IOBUF out, KBNODE node ) { log_error("build_packet(%d) failed: %s\n", node->pkt->pkttype, g10_errstr(rc) ); - return G10ERR_WRITE_FILE; + return rc; } } } @@ -3446,9 +3628,9 @@ gen_card_key (int algo, int keyno, int is_primary, 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->skey[0] = gcry_mpi_copy (pk->pkey[0]); + sk->skey[1] = gcry_mpi_copy (pk->pkey[1]); + sk->skey[2] = gcry_mpi_set_opaque (NULL, xstrdup ("dummydata"), 10*8); sk->is_protected = 1; sk->protect.s2k.mode = 1002; s = get_parameter_value (para, pSERIALNO); @@ -3495,8 +3677,6 @@ gen_card_key_with_backup (int algo, int keyno, int is_primary, 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) @@ -3521,7 +3701,7 @@ gen_card_key_with_backup (int algo, int keyno, int is_primary, sk->skey[i] = NULL; } i = pubkey_get_npkey (sk->pubkey_algo); - sk->skey[i] = mpi_set_opaque (NULL, xstrdup ("dummydata"), 10); + sk->skey[i] = gcry_mpi_set_opaque (NULL, xstrdup ("dummydata"), 10*8); sk->is_protected = 1; sk->protect.s2k.mode = 1002; s = get_parameter_value (para, pSERIALNO); diff --git a/g10/keyid.c b/g10/keyid.c index 86a204ff3..0012a5604 100644 --- a/g10/keyid.c +++ b/g10/keyid.c @@ -1,6 +1,6 @@ /* keyid.c - key ID and fingerprint handling * Copyright (C) 1998, 1999, 2000, 2001, 2003, - * 2004 Free Software Foundation, Inc. + * 2004, 2006 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -27,11 +27,12 @@ #include <errno.h> #include <time.h> #include <assert.h> + +#include "gpg.h" #include "util.h" #include "main.h" #include "packet.h" #include "options.h" -#include "mpi.h" #include "keydb.h" #include "i18n.h" @@ -52,42 +53,49 @@ pubkey_letter( int algo ) /* This function is useful for v4 fingerprints and v3 or v4 key signing. */ void -hash_public_key( MD_HANDLE md, PKT_public_key *pk ) +hash_public_key( gcry_md_hd_t md, PKT_public_key *pk ) { - unsigned n=6; - unsigned nb[PUBKEY_MAX_NPKEY]; - unsigned nn[PUBKEY_MAX_NPKEY]; + unsigned int n = 6; + unsigned int nn[PUBKEY_MAX_NPKEY]; byte *pp[PUBKEY_MAX_NPKEY]; int i; - int npkey = pubkey_get_npkey( pk->pubkey_algo ); + size_t nbits, nbytes; + 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])) + if (npkey==0 && pk->pkey[0] + && gcry_mpi_get_flag (pk->pkey[0], GCRYMPI_FLAG_OPAQUE)) { - pp[0]=mpi_get_opaque(pk->pkey[0],&nn[0]); + pp[0] = gcry_mpi_get_opaque (pk->pkey[0], &nbits); + nn[0] = (nbits+7)/8; 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]; + if (gcry_mpi_print (GCRYMPI_FMT_PGP, NULL, 0, &nbytes, pk->pkey[i])) + BUG (); + pp[i] = xmalloc (nbytes); + if (gcry_mpi_print (GCRYMPI_FMT_PGP, pp[i], nbytes, + &nbytes, pk->pkey[i])) + BUG (); + nn[i] = nbytes; + n += nn[i]; } - md_putc( md, 0x99 ); /* ctb */ + gcry_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 ); + gcry_md_putc ( md, n >> 8 ); /* 2 byte length header */ + gcry_md_putc ( md, n ); + gcry_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 ); + gcry_md_putc ( md, pk->timestamp >> 24 ); + gcry_md_putc ( md, pk->timestamp >> 16 ); + gcry_md_putc ( md, pk->timestamp >> 8 ); + gcry_md_putc ( md, pk->timestamp ); if(pk->version<4) { @@ -95,37 +103,39 @@ hash_public_key( MD_HANDLE md, PKT_public_key *pk ) if(pk->expiredate) days=(u16)((pk->expiredate - pk->timestamp) / 86400L); - md_putc( md, days >> 8 ); - md_putc( md, days ); + gcry_md_putc ( md, days >> 8 ); + gcry_md_putc ( md, days ); } - md_putc( md, pk->pubkey_algo ); + gcry_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]); + if(npkey==0 && pk->pkey[0] + && gcry_mpi_get_flag (pk->pkey[0], GCRYMPI_FLAG_OPAQUE)) + { + gcry_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] ); + gcry_md_write ( md, pp[i], nn[i] ); xfree(pp[i]); } } -static MD_HANDLE +static gcry_md_hd_t do_fingerprint_md( PKT_public_key *pk ) { - MD_HANDLE md; + gcry_md_hd_t md; - md = md_open( DIGEST_ALGO_SHA1, 0); + if (gcry_md_open (&md, DIGEST_ALGO_SHA1, 0)) + BUG (); hash_public_key(md,pk); - md_final( md ); + gcry_md_final( md ); return md; } -static MD_HANDLE +static gcry_md_hd_t do_fingerprint_md_sk( PKT_secret_key *sk ) { PKT_public_key pk; @@ -145,6 +155,31 @@ do_fingerprint_md_sk( PKT_secret_key *sk ) return do_fingerprint_md( &pk ); } + +u32 +v3_keyid (gcry_mpi_t a, u32 *ki) +{ + byte *buffer; + size_t nbytes; + + if (gcry_mpi_print (GCRYMPI_FMT_USG, NULL, 0, &nbytes, a )) + BUG (); + /* fixme: allocate it on the stack */ + buffer = xmalloc (nbytes); + if (gcry_mpi_print( GCRYMPI_FMT_USG, buffer, nbytes, NULL, a )) + BUG (); + if (nbytes < 8) /* oops */ + ki[0] = ki[1] = 0; + else + { + memcpy (ki+0, buffer+nbytes-8, 4); + memcpy (ki+1, buffer+nbytes-4, 4); + } + xfree (buffer); + return ki[1]; +} + + size_t keystrlen(void) { @@ -232,14 +267,14 @@ keystr_from_desc(KEYDB_SEARCH_DESC *desc) { 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] ; + 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); } @@ -275,8 +310,8 @@ keyid_from_sk( PKT_secret_key *sk, u32 *keyid ) { if( is_RSA(sk->pubkey_algo) ) { - lowbits = pubkey_get_npkey(sk->pubkey_algo) ? - mpi_get_keyid( sk->skey[0], keyid ) : 0; /* take n */ + lowbits = (pubkey_get_npkey (sk->pubkey_algo) ? + v3_keyid( sk->skey[0], keyid ) : 0); /* Take n. */ sk->keyid[0]=keyid[0]; sk->keyid[1]=keyid[1]; } @@ -286,15 +321,16 @@ keyid_from_sk( PKT_secret_key *sk, u32 *keyid ) else { const byte *dp; - MD_HANDLE md; + gcry_md_hd_t md; + md = do_fingerprint_md_sk(sk); if(md) { - dp = md_read( md, 0 ); + dp = gcry_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); + gcry_md_close (md); sk->keyid[0] = keyid[0]; sk->keyid[1] = keyid[1]; } @@ -329,8 +365,8 @@ keyid_from_pk( PKT_public_key *pk, u32 *keyid ) { if( is_RSA(pk->pubkey_algo) ) { - lowbits = pubkey_get_npkey(pk->pubkey_algo) ? - mpi_get_keyid( pk->pkey[0], keyid ) : 0 ; /* from n */ + lowbits = (pubkey_get_npkey (pk->pubkey_algo) ? + v3_keyid ( pk->pkey[0], keyid ) : 0); /* From n. */ pk->keyid[0] = keyid[0]; pk->keyid[1] = keyid[1]; } @@ -340,15 +376,16 @@ keyid_from_pk( PKT_public_key *pk, u32 *keyid ) else { const byte *dp; - MD_HANDLE md; + gcry_md_hd_t md; + md = do_fingerprint_md(pk); if(md) { - dp = md_read( md, 0 ); + dp = gcry_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); + gcry_md_close (md); pk->keyid[0] = keyid[0]; pk->keyid[1] = keyid[1]; } @@ -412,14 +449,16 @@ namehash_from_uid(PKT_user_id *uid) { if(uid->namehash==NULL) { - uid->namehash=xmalloc(20); + uid->namehash = xmalloc(20); if(uid->attrib_data) - rmd160_hash_buffer(uid->namehash,uid->attrib_data,uid->attrib_len); + gcry_md_hash_buffer (GCRY_MD_RMD160, uid->namehash, + uid->attrib_data, uid->attrib_len); else - rmd160_hash_buffer(uid->namehash,uid->name,uid->len); + gcry_md_hash_buffer (GCRY_MD_RMD160, uid->namehash, + uid->name, uid->len); } - + return uid->namehash; } @@ -633,121 +672,143 @@ colon_expirestr_from_sig (PKT_signature *sig) 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); + byte *buf; + const byte *dp; + size_t len, nbytes; + int i; + + if ( pk->version < 4 ) + { + if ( is_RSA(pk->pubkey_algo) ) + { + /* RSA in version 3 packets is special. */ + gcry_md_hd_t md; + + if (gcry_md_open (&md, DIGEST_ALGO_MD5, 0)) + BUG (); + if ( pubkey_get_npkey (pk->pubkey_algo) > 1 ) + { + for (i=0; i < 2; i++) + { + if (gcry_mpi_print (GCRYMPI_FMT_USG, NULL, 0, + &nbytes, pk->pkey[i])) + BUG (); + /* fixme: Better allocate BUF on the stack */ + buf = xmalloc (nbytes); + if (gcry_mpi_print (GCRYMPI_FMT_USG, buf, nbytes, + NULL, pk->pkey[i])) + BUG (); + gcry_md_write (md, buf, nbytes); + xfree (buf); + } + } + gcry_md_final (md); + if (!array) + array = xmalloc (16); + len = 16; + memcpy (array, gcry_md_read (md, DIGEST_ALGO_MD5), 16); + gcry_md_close(md); + } + else + { + if (!array) + array = xmalloc(16); + len = 16; + memset (array,0,16); + } } - - *ret_len = len; - return array; + else + { + gcry_md_hd_t md; + + md = do_fingerprint_md(pk); + dp = gcry_md_read( md, 0 ); + len = gcry_md_get_algo_dlen (gcry_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] ; + gcry_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); + byte *buf; + const char *dp; + size_t len, nbytes; + int i; + + if (sk->version < 4) + { + if ( is_RSA(sk->pubkey_algo) ) + { + /* RSA in version 3 packets is special. */ + gcry_md_hd_t md; + + if (gcry_md_open (&md, DIGEST_ALGO_MD5, 0)) + BUG (); + if (pubkey_get_npkey( sk->pubkey_algo ) > 1) + { + for (i=0; i < 2; i++) + { + if (gcry_mpi_print (GCRYMPI_FMT_USG, NULL, 0, + &nbytes, sk->skey[i])) + BUG (); + /* fixme: Better allocate BUF on the stack */ + buf = xmalloc (nbytes); + if (gcry_mpi_print (GCRYMPI_FMT_USG, buf, nbytes, + NULL, sk->skey[i])) + BUG (); + gcry_md_write (md, buf, nbytes); + 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); - } + gcry_md_final(md); + if (!array) + array = xmalloc (16); + len = 16; + memcpy (array, gcry_md_read (md, DIGEST_ALGO_MD5), 16); + gcry_md_close (md); + } + else + { + if (!array) + array = xmalloc (16); + len=16; + memset (array,0,16); + } } - - *ret_len = len; - return array; + else + { + gcry_md_hd_t md; + + md = do_fingerprint_md_sk(sk); + if (md) + { + dp = gcry_md_read ( md, 0 ); + len = gcry_md_get_algo_dlen ( gcry_md_get_algo (md) ); + assert ( len <= MAX_FINGERPRINT_LEN ); + if (!array) + array = xmalloc( len ); + memcpy (array, dp, len); + gcry_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 index 19f3d3f62..441606299 100644 --- a/g10/keylist.c +++ b/g10/keylist.c @@ -1,4 +1,4 @@ -/* keylist.c +/* keylist.c - print keys * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, * 2004, 2005 Free Software Foundation, Inc. * @@ -27,11 +27,11 @@ #include <errno.h> #include <assert.h> +#include "gpg.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" @@ -249,7 +249,7 @@ 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; + FILE *fp=mode?log_get_stream():stdout; while((p=enum_sig_subpkt(sig->hashed,SIGSUBPKT_POLICY,&len,&seq,&crit))) { @@ -290,7 +290,7 @@ 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; + FILE *fp=mode?log_get_stream():stdout; while((p=enum_sig_subpkt(sig->hashed,SIGSUBPKT_PREF_KS,&len,&seq,&crit))) { @@ -332,7 +332,7 @@ show_keyserver_url(PKT_signature *sig,int indent,int mode) void show_notation(PKT_signature *sig,int indent,int mode,int which) { - FILE *fp=mode?log_stream():stdout; + FILE *fp=mode?log_get_stream():stdout; struct notation *nd,*notations; if(which==0) @@ -915,12 +915,13 @@ list_keyblock_print ( KBNODE keyblock, int secret, int fpr, void *opaque ) 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; + switch( gpg_err_code (rc) ) { + case 0: sigrc = '!'; break; + case GPG_ERR_BAD_SIGNATURE: + stats->inv_sigs++; sigrc = '-'; break; + case GPG_ERR_NO_PUBKEY: + case GPG_ERR_UNUSABLE_PUBKEY: stats->no_key++; continue; + default: stats->oth_err++; sigrc = '%'; break; } /* TODO: Make sure a cached sig record here still has @@ -1305,12 +1306,12 @@ list_keyblock_colon( KBNODE keyblock, int secret, int fpr ) 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; + switch ( gpg_err_code (rc) ) { + case 0: sigrc = '!'; break; + case GPG_ERR_BAD_SIGNATURE: sigrc = '-'; break; + case GPG_ERR_NO_PUBKEY: + case GPG_ERR_UNUSABLE_PUBKEY: sigrc = '?'; break; + default: sigrc = '%'; break; } if(opt.no_sig_cache) @@ -1500,7 +1501,7 @@ print_fingerprint (PKT_public_key *pk, PKT_secret_key *sk, int mode ) } if (mode == 1) { - fp = log_stream (); + fp = log_get_stream (); if(primary) text = _("Primary key fingerprint:"); else diff --git a/g10/keyring.c b/g10/keyring.c index 9ef5b1bd4..bd577a63b 100644 --- a/g10/keyring.c +++ b/g10/keyring.c @@ -29,6 +29,7 @@ #include <sys/types.h> #include <sys/stat.h> +#include "gpg.h" #include "util.h" #include "keyring.h" #include "packet.h" @@ -660,8 +661,9 @@ prepare_search (KEYRING_HANDLE hd) hd->current.iobuf = iobuf_open (hd->current.kr->fname); if (!hd->current.iobuf) { + hd->current.error = gpg_error_from_errno (errno); log_error(_("can't open `%s'\n"), hd->current.kr->fname ); - return (hd->current.error = G10ERR_OPEN_FILE); + return hd->current.error; } return 0; @@ -1198,10 +1200,11 @@ create_tmp_file (const char *template, umask(oldmask); if (!*r_fp) { + int rc = gpg_error_from_errno (errno); log_error(_("can't create `%s': %s\n"), tmpfname, strerror(errno) ); xfree (tmpfname); xfree (bakfname); - return G10ERR_OPEN_FILE; + return rc; } *r_bakfname = bakfname; @@ -1229,9 +1232,10 @@ rename_tmp_file (const char *bakfname, const char *tmpfname, #endif if (rename (fname, bakfname) ) { + rc = gpg_error_from_errno (errno); log_error ("renaming `%s' to `%s' failed: %s\n", fname, bakfname, strerror(errno) ); - return G10ERR_RENAME_FILE; + return rc; } } @@ -1243,10 +1247,10 @@ rename_tmp_file (const char *bakfname, const char *tmpfname, unregister_secured_file (fname); if (rename (tmpfname, fname) ) { + rc = gpg_error_from_errno (errno); 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" @@ -1311,10 +1315,12 @@ write_keyblock (IOBUF fp, KBNODE keyblock) 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; - } + if (iobuf_put (fp, cacheval)) + { + rc = gpg_error_from_errno (errno); + log_error ("writing sigcache packet failed\n"); + return rc; + } } } return 0; @@ -1356,9 +1362,9 @@ keyring_rebuild_cache (void *token,int noisy) { if (iobuf_close (tmpfp)) { + rc = gpg_error_from_errno (errno); 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 @@ -1403,8 +1409,8 @@ keyring_rebuild_cache (void *token,int noisy) 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))) + && (openpgp_md_test_algo(sig->digest_algo) + || openpgp_pk_test_algo(sig->pubkey_algo))) sig->flags.checked=sig->flags.valid=0; else check_key_signature (keyblock, node, NULL); @@ -1436,9 +1442,9 @@ keyring_rebuild_cache (void *token,int noisy) { if (iobuf_close (tmpfp)) { + rc = gpg_error_from_errno (errno); 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 @@ -1480,7 +1486,7 @@ do_copy (int mode, const char *fname, KBNODE root, int secret, /* 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; + return gpg_error_from_errno (errno); fp = iobuf_open (fname); if (mode == 1 && !fp && errno == ENOENT) { @@ -1498,8 +1504,9 @@ do_copy (int mode, const char *fname, KBNODE root, int secret, umask(oldmask); if( !newfp ) { + rc = gpg_error_from_errno (errno); log_error (_("can't create `%s': %s\n"), fname, strerror(errno)); - return G10ERR_OPEN_FILE; + return rc; } if( !opt.quiet ) log_info(_("%s: keyring created\n"), fname ); @@ -1510,20 +1517,21 @@ do_copy (int mode, const char *fname, KBNODE root, int secret, log_error("build_packet(%d) failed: %s\n", node->pkt->pkttype, g10_errstr(rc) ); iobuf_cancel(newfp); - return G10ERR_WRITE_FILE; + return rc; } } if( iobuf_close(newfp) ) { + rc = gpg_error_from_errno (errno); log_error ("%s: close failed: %s\n", fname, strerror(errno)); - return G10ERR_CLOSE_FILE; + return rc; } return 0; /* ready */ } if( !fp ) { + rc = gpg_error_from_errno (errno); log_error(_("can't open `%s': %s\n"), fname, strerror(errno) ); - rc = G10ERR_OPEN_FILE; goto leave; } @@ -1605,13 +1613,13 @@ do_copy (int mode, const char *fname, KBNODE root, int secret, /* close both files */ if( iobuf_close(fp) ) { + rc = gpg_error_from_errno (errno); log_error("%s: close failed: %s\n", fname, strerror(errno) ); - rc = G10ERR_CLOSE_FILE; goto leave; } if( iobuf_close(newfp) ) { + rc = gpg_error_from_errno (errno); log_error("%s: close failed: %s\n", tmpfname, strerror(errno) ); - rc = G10ERR_CLOSE_FILE; goto leave; } diff --git a/g10/keyring.h b/g10/keyring.h index 8c4ea73d4..773d7b492 100644 --- a/g10/keyring.h +++ b/g10/keyring.h @@ -22,7 +22,6 @@ #ifndef GPG_KEYRING_H #define GPG_KEYRING_H 1 -#include "global.h" typedef struct keyring_handle *KEYRING_HANDLE; diff --git a/g10/keyserver-internal.h b/g10/keyserver-internal.h index a36598695..a5e6e8c37 100644 --- a/g10/keyserver-internal.h +++ b/g10/keyserver-internal.h @@ -24,7 +24,7 @@ #include <time.h> #include "keyserver.h" -#include "iobuf.h" +#include "../common/iobuf.h" #include "types.h" int parse_keyserver_options(char *options); diff --git a/g10/keyserver.c b/g10/keyserver.c index a0893f1ef..bf1bf6cdc 100644 --- a/g10/keyserver.c +++ b/g10/keyserver.c @@ -26,20 +26,25 @@ #include <string.h> #include <stdlib.h> #include <assert.h> +#include <errno.h> + +#include "gpg.h" +#include "iobuf.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" +#include "dns-cert.h" +#include "pka.h" + struct keyrec { @@ -462,7 +467,7 @@ print_keyrec(int number,struct keyrec *keyrec) if(keyrec->type) { - const char *str=pubkey_algo_to_string(keyrec->type); + const char *str = gcry_pk_algo_name (keyrec->type); if(str) printf("%s ",str); @@ -1397,7 +1402,7 @@ keyserver_spawn(enum ks_action action,STRLIST list,KEYDB_SEARCH_DESC *desc, maxlen=1024; if(iobuf_read_line(spawn->fromchild,&line,&buflen,&maxlen)==0) { - ret=G10ERR_READ_FILE; + ret = gpg_error_from_errno (errno); goto fail; /* i.e. EOF */ } @@ -1728,8 +1733,8 @@ keyidlist(STRLIST users,KEYDB_SEARCH_DESC **klist,int *count,int fakev3) 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); + v3_keyid (node->pkt->pkt.public_key->pkey[0], + (*klist)[*count].u.kid); (*count)++; if(*count==num) @@ -1980,7 +1985,7 @@ keyserver_import_cert(const char *name,unsigned char **fpr,size_t *fpr_len) if(domain) *domain='.'; - type=get_cert(look,max_cert_size,&key,fpr,fpr_len,&url); + type=get_dns_cert(look,max_cert_size,&key,fpr,fpr_len,&url); if(type==1) { int armor_status=opt.no_armor; diff --git a/g10/main.h b/g10/main.h index b340b02eb..c6c0b29b1 100644 --- a/g10/main.h +++ b/g10/main.h @@ -21,9 +21,9 @@ */ #ifndef G10_MAIN_H #define G10_MAIN_H + #include "types.h" -#include "iobuf.h" -#include "mpi.h" +#include "../common/iobuf.h" #include "cipher.h" #include "keydb.h" @@ -79,11 +79,12 @@ 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 ); +u16 checksum_mpi( gcry_mpi_t 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_test_algo( int algo ); +int openpgp_pk_test_algo2 ( int algo, unsigned int use ); int openpgp_pk_algo_usage ( int algo ); int openpgp_md_test_algo( int algo ); @@ -105,6 +106,9 @@ void deprecated_warning(const char *configname,unsigned int configlineno, const char *option,const char *repl1,const char *repl2); void deprecated_command (const char *name); +int string_to_cipher_algo (const char *string); +int string_to_digest_algo (const char *string); + const char *compress_algo_to_string(int algo); int string_to_compress_algo(const char *string); int check_compress_algo(int algo); @@ -128,10 +132,18 @@ int parse_options(char *str,unsigned int *options, 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); +/* Temporary helpers. */ +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 int pubkey_nbits( int algo, gcry_mpi_t *pkey ); +int mpi_print( FILE *fp, gcry_mpi_t a, int mode ); + + /*-- helptext.c --*/ void display_online_help( const char *keyword ); @@ -142,11 +154,11 @@ 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); + iobuf_t a, byte *buf, size_t *ret_len); /*-- sign.c --*/ -int complete_sig( PKT_signature *sig, PKT_secret_key *sk, MD_HANDLE md ); +int complete_sig( PKT_signature *sig, PKT_secret_key *sk, gcry_md_hd_t 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 ); @@ -196,21 +208,21 @@ int save_unprotected_key_to_card (PKT_secret_key *sk, int keyno); 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 ); +int open_outfile( const char *iname, int mode, iobuf_t *a ); +iobuf_t 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 ); +gcry_mpi_t encode_session_key( DEK *dek, unsigned nbits ); +gcry_mpi_t encode_md_value( PKT_public_key *pk, PKT_secret_key *sk, + gcry_md_hd_t 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, +int import_keys_stream( iobuf_t 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); @@ -226,7 +238,7 @@ int auto_create_card_key_stub ( const char *serialnostr, /*-- 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, +int export_pubkeys_stream( iobuf_t out, STRLIST users, KBNODE *keyblock_out, unsigned int options ); int export_seckeys( STRLIST users ); int export_secsubkeys( STRLIST users ); @@ -272,13 +284,10 @@ int decrypt_message( const char *filename ); void decrypt_messages(int nfiles, char *files[]); /*-- plaintext.c --*/ -int hash_datafiles( MD_HANDLE md, MD_HANDLE md2, +int hash_datafiles( gcry_md_hd_t md, gcry_md_hd_t 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 ); diff --git a/g10/mainproc.c b/g10/mainproc.c index cb4432a44..ca5ea9ade 100644 --- a/g10/mainproc.c +++ b/g10/mainproc.c @@ -27,9 +27,9 @@ #include <assert.h> #include <time.h> +#include "gpg.h" #include "packet.h" #include "iobuf.h" -#include "memory.h" #include "options.h" #include "util.h" #include "cipher.h" @@ -41,6 +41,7 @@ #include "trustdb.h" #include "keyserver-internal.h" #include "photoid.h" +#include "pka.h" struct kidlist_item { @@ -74,11 +75,6 @@ struct mainproc_context 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. */ }; @@ -105,8 +101,6 @@ release_list( CTX c ) 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; } @@ -133,30 +127,6 @@ add_gpg_control( CTX c, PACKET *pkt ) * 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 )); @@ -233,7 +203,7 @@ add_signature( CTX c, PACKET *pkt ) static int symkey_decrypt_seskey( DEK *dek, byte *seskey, size_t slen ) { - CIPHER_HANDLE hd; + gcry_cipher_hd_t hd; if(slen < 17 || slen > 33) { @@ -242,13 +212,15 @@ symkey_decrypt_seskey( DEK *dek, byte *seskey, size_t 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 ); + if (gcry_cipher_open (&hd, dek->algo, GCRY_CIPHER_MODE_CFB, 1)) + BUG (); + if (gcry_cipher_setkey ( hd, dek->key, dek->keylen )) + BUG (); + gcry_cipher_setiv ( hd, NULL, 0 ); + gcry_cipher_decrypt ( hd, seskey, slen, NULL, 0 ); + gcry_cipher_close ( hd ); - /* now we replace the dek components with the real session key to + /* Now we replace the dek components with the real session key to decrypt the contents of the sequencing packet. */ dek->keylen=slen-1; @@ -281,7 +253,7 @@ proc_symkey_enc( CTX c, PACKET *pkt ) else if(!c->dek) { int algo = enc->cipher_algo; - const char *s = cipher_algo_to_string (algo); + const char *s = gcry_cipher_algo_name (algo); if(s) { @@ -296,7 +268,7 @@ proc_symkey_enc( CTX c, PACKET *pkt ) else log_error(_("encrypted with unknown algorithm %d\n"), algo ); - if(check_digest_algo(enc->s2k.hash_algo)) + if(openpgp_md_test_algo (enc->s2k.hash_algo)) { log_error(_("passphrase generated with unknown digest" " algorithm %d\n"),enc->s2k.hash_algo); @@ -460,7 +432,7 @@ print_pkenc_list( struct kidlist_item *list, int failed ) if ( !failed && list->reason ) continue; - algstr = pubkey_algo_to_string( list->pubkey_algo ); + algstr = gcry_pk_algo_name ( list->pubkey_algo ); pk = xmalloc_clear( sizeof *pk ); if( !algstr ) @@ -473,7 +445,7 @@ print_pkenc_list( struct kidlist_item *list, int failed ) 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); + log_printf (_(" \"%s\"\n"),p); xfree(p); } else @@ -539,8 +511,8 @@ proc_encrypted( CTX c, PACKET *pkt ) /* 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) ) + gcry_cipher_algo_name (algo)); + else if ( gcry_cipher_test_algo (CIPHER_ALGO_IDEA) ) { algo = opt.def_cipher_algo; if (!algo) @@ -548,7 +520,7 @@ proc_encrypted( CTX c, PACKET *pkt ) idea_cipher_warn(1); log_info (_("IDEA cipher unavailable, " "optimistically attempting to use %s instead\n"), - cipher_algo_to_string(algo)); + gcry_cipher_algo_name (algo)); } else { @@ -575,7 +547,8 @@ proc_encrypted( CTX c, PACKET *pkt ) if( result == -1 ) ; - else if( !result || (result==G10ERR_BAD_SIGN && opt.ignore_mdc_error)) { + else if( !result || (gpg_err_code (result) == GPG_ERR_BAD_SIGNATURE + && opt.ignore_mdc_error)) { write_status( STATUS_DECRYPTION_OKAY ); if( opt.verbose > 1 ) log_info(_("decryption okay\n")); @@ -624,7 +597,8 @@ proc_plaintext( CTX c, PACKET *pkt ) 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); + if (gcry_md_open (&c->mfx.md, 0, 0)) + BUG (); /* 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 @@ -639,7 +613,8 @@ proc_plaintext( CTX c, PACKET *pkt ) /* 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 ); + gcry_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; @@ -665,7 +640,7 @@ proc_plaintext( CTX c, PACKET *pkt ) * documents */ clearsig = (*data == 0x01); for( data++, datalen--; datalen; datalen--, data++ ) - md_enable( c->mfx.md, *data ); + gcry_md_enable (c->mfx.md, *data); any = 1; break; /* Stop here as one-pass signature packets are not expected. */ @@ -673,7 +648,7 @@ proc_plaintext( CTX c, PACKET *pkt ) 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 ); + gcry_md_enable ( c->mfx.md, n->pkt->pkt.signature->digest_algo ); any=1; } } @@ -685,9 +660,9 @@ proc_plaintext( CTX c, PACKET *pkt ) 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 ); + gcry_md_enable( c->mfx.md, DIGEST_ALGO_RMD160 ); + gcry_md_enable( c->mfx.md, DIGEST_ALGO_SHA1 ); + gcry_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 @@ -695,23 +670,24 @@ proc_plaintext( CTX c, PACKET *pkt ) * 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 ( gcry_md_open (&c->mfx.md2, DIGEST_ALGO_MD5, 0) ) + BUG (); } if ( DBG_HASHING ) { - md_start_debug( c->mfx.md, "verify" ); + gcry_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 ); - } + gcry_md_start_debug ( c->mfx.md2, "verify2" ); } + + rc = handle_plaintext( pt, &c->mfx, c->sigs_only, clearsig ); + if( gpg_err_code (rc) == GPG_ERR_ENOENT && !c->sigs_only) + { +#warning We need to change the test for the error code + /* 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); @@ -771,7 +747,7 @@ 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; + gcry_md_hd_t md = NULL, md2 = NULL; int algo, rc; assert( node->pkt->pkttype == PKT_SIGNATURE ); @@ -780,27 +756,39 @@ do_check_sig( CTX c, KBNODE node, int *is_selfsig, sig = node->pkt->pkt.signature; algo = sig->digest_algo; - if( (rc=check_digest_algo(algo)) ) - return rc; + rc = openpgp_md_test_algo(algo); + if (rc) + return rc; if( sig->sig_class == 0x00 ) { if( c->mfx.md ) - md = md_copy( c->mfx.md ); + { + if (gcry_md_copy (&md, c->mfx.md )) + BUG (); + } else /* detached signature */ - md = md_open( 0, 0 ); /* signature_check() will enable the md*/ + { + /* signature_check() will enable the md*/ + if (gcry_md_open (&md, 0, 0 )) + BUG (); + } } 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 ); + if (gcry_md_copy (&md, c->mfx.md )) + BUG (); + if( c->mfx.md2 && gcry_md_copy (&md2, c->mfx.md2 )) + BUG (); } 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 ); + log_debug("Do we really need this here?"); + /* signature_check() will enable the md*/ + if (gcry_md_open (&md, 0, 0 )) + BUG (); + if (gcry_md_open (&md2, 0, 0 )) + BUG (); } } else if( (sig->sig_class&~3) == 0x10 @@ -827,10 +815,10 @@ do_check_sig( CTX c, KBNODE node, int *is_selfsig, else return G10ERR_SIG_CLASS; rc = signature_check2( sig, md, NULL, is_expkey, is_revkey, NULL ); - if( rc == G10ERR_BAD_SIGN && md2 ) + if( gpg_err_code (rc) == GPG_ERR_BAD_SIGNATURE && md2 ) rc = signature_check2( sig, md2, NULL, is_expkey, is_revkey, NULL ); - md_close(md); - md_close(md2); + gcry_md_close(md); + gcry_md_close(md2); return rc; } @@ -1058,12 +1046,13 @@ list_node( CTX c, KBNODE node ) 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; + rc2=do_check_sig( c, node, &is_selfsig, NULL, NULL ); + switch (gpg_err_code (rc2)) { + case 0: sigrc = '!'; break; + case GPG_ERR_BAD_SIGNATURE: sigrc = '-'; break; + case GPG_ERR_NO_PUBKEY: + case GPG_ERR_UNUSABLE_PUBKEY: sigrc = '?'; break; + default: sigrc = '%'; break; } } else { /* check whether this is a self signature */ @@ -1206,7 +1195,8 @@ do_proc_packets( CTX c, IOBUF a ) 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 ) + if (gpg_err_code (rc) == GPG_ERR_INV_PACKET + && opt.list_packets != 2 ) break; continue; } @@ -1306,12 +1296,6 @@ do_proc_packets( CTX c, IOBUF a ) } 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" ); @@ -1513,7 +1497,7 @@ check_sig_and_print( CTX c, KBNODE node ) /* (Indendation below not yet changed to GNU style.) */ - astr = pubkey_algo_to_string( sig->pubkey_algo ); + astr = gcry_pk_algo_name ( sig->pubkey_algo ); if(keystrlen()>8) { log_info(_("Signature made %s\n"),asctimestamp(sig->timestamp)); @@ -1542,8 +1526,8 @@ check_sig_and_print( CTX c, KBNODE node ) 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() ); + print_utf8_string( log_get_stream(), p, n ); + log_printf ("\n"); if(opt.keyserver_options.options&KEYSERVER_AUTO_KEY_RETRIEVE && opt.keyserver_options.options&KEYSERVER_HONOR_KEYSERVER_URL) @@ -1612,7 +1596,7 @@ check_sig_and_print( CTX c, KBNODE node ) rc = do_check_sig(c, node, NULL, &is_expkey, &is_revkey ); } - if( !rc || rc == G10ERR_BAD_SIGN ) { + if( !rc || gpg_err_code (rc) == GPG_ERR_BAD_SIGNATURE ) { KBNODE un, keyblock; int count=0, statno; char keyid_str[50]; @@ -1683,9 +1667,9 @@ check_sig_and_print( CTX c, KBNODE node ) xfree(p); if(opt.verify_options&VERIFY_SHOW_UID_VALIDITY) - fprintf(log_stream()," [%s]\n",trust_value_to_string(valid)); + log_printf (" [%s]\n",trust_value_to_string(valid)); else - fputs("\n", log_stream() ); + log_printf ("\n"); count++; } if( !count ) { /* just in case that we have no valid textual @@ -1728,11 +1712,8 @@ check_sig_and_print( CTX c, KBNODE node ) 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() ); + log_printf (" %s",_("[uncertain]") ); + log_printf ("\n"); } /* If we have a good signature and already printed @@ -1776,10 +1757,10 @@ check_sig_and_print( CTX c, KBNODE node ) valid=trust_value_to_string(get_validity(pk, un->pkt-> pkt.user_id)); - fprintf(log_stream()," [%s]\n",valid); + log_printf (" [%s]\n",valid); } else - fputs("\n", log_stream() ); + log_printf ("\n"); } } release_kbnode( keyblock ); @@ -1871,7 +1852,7 @@ check_sig_and_print( CTX c, KBNODE node ) 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)); + gcry_md_algo_name (sig->digest_algo)); if( rc ) g10_errors_seen = 1; @@ -1935,13 +1916,16 @@ proc_tree( CTX c, KBNODE node ) if( !c->have_data ) { free_md_filter_context( &c->mfx ); /* prepare to create all requested message digests */ - c->mfx.md = md_open(0, 0); + if (gcry_md_open (&c->mfx.md, 0, 0)) + BUG (); /* 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); - } + for ( n1 = node; (n1 = find_next_kbnode(n1, PKT_SIGNATURE )); ) + { + gcry_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, @@ -2015,20 +1999,24 @@ proc_tree( CTX c, KBNODE node ) else if( !c->have_data ) { /* detached signature */ free_md_filter_context( &c->mfx ); - c->mfx.md = md_open(sig->digest_algo, 0); + if (gcry_md_open (&c->mfx.md, sig->digest_algo, 0)) + BUG (); + 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 ); + if (gcry_md_open (&c->mfx.md2, DIGEST_ALGO_MD5, 0)) + BUG (); } 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 (gcry_md_open (&c->mfx.md2, sig->digest_algo, 0 )) + BUG (); } #if 0 /* workaround disabled */ /* Here we have another hack to work around a pgp 2 bug @@ -2041,9 +2029,9 @@ proc_tree( CTX c, KBNODE node ) /* c->mfx.md2? 0 :(sig->sig_class == 0x01) */ #endif if ( DBG_HASHING ) { - md_start_debug( c->mfx.md, "verify" ); + gcry_md_start_debug( c->mfx.md, "verify" ); if ( c->mfx.md2 ) - md_start_debug( c->mfx.md2, "verify2" ); + gcry_md_start_debug( c->mfx.md2, "verify2" ); } if( c->sigs_only ) { rc = hash_datafiles( c->mfx.md, c->mfx.md2, @@ -2064,8 +2052,6 @@ proc_tree( CTX c, KBNODE node ) 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")); diff --git a/g10/mdfilter.c b/g10/mdfilter.c index 3605db8bf..06aa8386c 100644 --- a/g10/mdfilter.c +++ b/g10/mdfilter.c @@ -26,9 +26,9 @@ #include <errno.h> #include <assert.h> +#include "gpg.h" #include "errors.h" #include "iobuf.h" -#include "memory.h" #include "util.h" #include "filter.h" @@ -51,9 +51,9 @@ md_filter( void *opaque, int control, i = iobuf_read( a, buf, size ); if( i == -1 ) i = 0; if( i ) { - md_write(mfx->md, buf, i ); + gcry_md_write(mfx->md, buf, i ); if( mfx->md2 ) - md_write(mfx->md2, buf, i ); + gcry_md_write(mfx->md2, buf, i ); } else rc = -1; /* eof */ @@ -68,8 +68,8 @@ md_filter( void *opaque, int control, void free_md_filter_context( md_filter_context_t *mfx ) { - md_close(mfx->md); - md_close(mfx->md2); + gcry_md_close(mfx->md); + gcry_md_close(mfx->md2); mfx->md = NULL; mfx->md2 = NULL; mfx->maxbuf_size = 0; diff --git a/g10/misc.c b/g10/misc.c index fbe449299..33b97792c 100644 --- a/g10/misc.c +++ b/g10/misc.c @@ -1,6 +1,6 @@ -/* misc.c - miscellaneous functions +/* misc.c - miscellaneous functions * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, - * 2005 Free Software Foundation, Inc. + * 2005, 2006 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -38,7 +38,8 @@ #ifdef ENABLE_SELINUX_HACKS #include <sys/stat.h> #endif -#ifdef _WIN32 + +#ifdef HAVE_W32_SYSTEM #include <time.h> #include <process.h> #include <windows.h> @@ -52,18 +53,31 @@ #ifndef CSIDL_FLAG_CREATE #define CSIDL_FLAG_CREATE 0x8000 #endif -#include "errors.h" -#include "dynload.h" -#endif /*_WIN32*/ +#endif /*HAVE_W32_SYSTEM*/ +#include "gpg.h" +#ifdef HAVE_W32_SYSTEM +# include "errors.h" +# include "dynload.h" +#endif /*HAVE_W32_SYSTEM*/ #include "util.h" #include "main.h" #include "photoid.h" #include "options.h" #include "i18n.h" -#include "cardglue.h" +static int +string_count_chr (const char *string, int c) +{ + int count; + + for (count=0; *string; string++ ) + if ( *string == c ) + count++; + return count; +} + #ifdef ENABLE_SELINUX_HACKS @@ -157,7 +171,7 @@ register_secured_file (const char *fname) #endif /*ENABLE_SELINUX_HACKS*/ } -/* Remove a file registerd as secure. */ +/* Remove a file registered as secure. */ void unregister_secured_file (const char *fname) { @@ -278,19 +292,24 @@ checksum( byte *p, unsigned n ) } u16 -checksum_mpi( MPI a ) +checksum_mpi (gcry_mpi_t a) { - u16 csum; - byte *buffer; - unsigned nbytes; - unsigned nbits; + u16 csum; + byte *buffer; + unsigned int nbytes; - buffer = mpi_get_buffer( a, &nbytes, NULL ); - nbits = mpi_get_nbits(a); - csum = checksum_u16( nbits ); - csum += checksum( buffer, nbytes ); - xfree( buffer ); - return csum; + if ( gcry_mpi_print (GCRYMPI_FMT_PGP, NULL, 0, &nbytes, a) ) + BUG (); + /* Fixme: For numbers not in secure memory we should use a stack + * based buffer and only allocate a larger one if mpi_print returns + * an error. */ + buffer = (gcry_is_secure(a)? + gcry_xmalloc_secure (nbytes) : gcry_xmalloc (nbytes)); + if ( gcry_mpi_print (GCRYMPI_FMT_PGP, buffer, nbytes, NULL, a) ) + BUG (); + csum = checksum (buffer, nbytes); + xfree (buffer); + return csum; } u32 @@ -313,8 +332,8 @@ print_pubkey_algo_note( int algo ) if(!warn) { warn=1; - log_info(_("WARNING: using experimental public key algorithm %s\n"), - pubkey_algo_to_string(algo)); + log_info (_("WARNING: using experimental public key algorithm %s\n"), + gcry_pk_algo_name (algo)); } } } @@ -328,8 +347,8 @@ print_cipher_algo_note( int algo ) if(!warn) { warn=1; - log_info(_("WARNING: using experimental cipher algorithm %s\n"), - cipher_algo_to_string(algo)); + log_info (_("WARNING: using experimental cipher algorithm %s\n"), + gcry_cipher_algo_name (algo)); } } } @@ -343,60 +362,78 @@ print_digest_algo_note( int algo ) if(!warn) { warn=1; - log_info(_("WARNING: using experimental digest algorithm %s\n"), - digest_algo_to_string(algo)); + log_info (_("WARNING: using experimental digest algorithm %s\n"), + gcry_md_algo_name (algo)); } } else if(algo==DIGEST_ALGO_MD5) - log_info(_("WARNING: digest algorithm %s is deprecated\n"), - digest_algo_to_string(algo)); + log_info (_("WARNING: digest algorithm %s is deprecated\n"), + gcry_md_algo_name (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 ); + 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; + /* Although 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 takes place. + * Of course, we could 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; + *rlen = sizeof(marker); + return marker; } /**************** - * Wrapper around the libgcrypt function with addional checks on - * openPGP contraints for the algo ID. + * Wrapper around the libgcrypt function with additonal checks on + * the 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); + if ( algo < 0 || algo > 110 ) + return gpg_error (GPG_ERR_CIPHER_ALGO); + return gcry_cipher_test_algo (algo); } int -openpgp_pk_test_algo( int algo, unsigned int usage_flags ) +openpgp_pk_test_algo( int algo ) { - if( algo < 0 || algo > 110 ) - return G10ERR_PUBKEY_ALGO; - return check_pubkey_algo2( algo, usage_flags ); + if (algo == GCRY_PK_ELG_E) + algo = GCRY_PK_ELG; + + if (algo < 0 || algo > 110) + return gpg_error (GPG_ERR_PUBKEY_ALGO); + return gcry_pk_test_algo (algo); +} + +int +openpgp_pk_test_algo2( int algo, unsigned int use ) +{ + int use_buf = use; + + if (algo == GCRY_PK_ELG_E) + algo = GCRY_PK_ELG; + + if (algo < 0 || algo > 110) + return gpg_error (GPG_ERR_PUBKEY_ALGO); + + return gcry_pk_algo_info (algo, GCRYCTL_TEST_ALGO, NULL, &use_buf); } int @@ -404,10 +441,11 @@ openpgp_pk_algo_usage ( int algo ) { int use = 0; - /* they are hardwired in gpg 1.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; + use = (PUBKEY_USAGE_CERT | PUBKEY_USAGE_SIG + | PUBKEY_USAGE_ENC | PUBKEY_USAGE_AUTH); break; case PUBKEY_ALGO_RSA_E: use = PUBKEY_USAGE_ENC; @@ -430,9 +468,9 @@ openpgp_pk_algo_usage ( int algo ) int openpgp_md_test_algo( int algo ) { - if( algo < 0 || algo > 110 ) - return G10ERR_DIGEST_ALGO; - return check_digest_algo(algo); + if (algo < 0 || algo > 110) + return gpg_error (GPG_ERR_DIGEST_ALGO); + return gcry_md_test_algo (algo); } #ifdef USE_IDEA @@ -696,6 +734,54 @@ deprecated_command (const char *name) } +/* + * Wrapper around gcry_cipher_map_name to provide a fallback using the + * "Sn" syntax as used by the preference strings. + */ +int +string_to_cipher_algo (const char *string) +{ + int val; + + val = gcry_cipher_map_name (string); + if (!val && string && (string[0]=='S' || string[0]=='s')) + { + char *endptr; + + string++; + val = strtol (string, &endptr, 10); + if (!*string || *endptr || openpgp_cipher_test_algo (val)) + val = 0; + } + + return val; +} + +/* + * Wrapper around gcry_md_map_name to provide a fallback using the + * "Hn" syntax as used by the preference strings. + */ +int +string_to_digest_algo (const char *string) +{ + int val; + + val = gcry_md_map_name (string); + if (!val && string && (string[0]=='H' || string[0]=='h')) + { + char *endptr; + + string++; + val = strtol (string, &endptr, 10); + if (!*string || *endptr || openpgp_md_test_algo (val)) + val = 0; + } + + return val; +} + + + const char * compress_algo_to_string(int algo) { @@ -728,7 +814,7 @@ compress_algo_to_string(int algo) int string_to_compress_algo(const char *string) { - /* NOTE TO TRANSLATOR: See doc/TRANSLATE about this string. */ + /* TRANSLATORS: See doc/TRANSLATE about this string. */ if(match_multistr(_("uncompressed|none"),string)) return 0; else if(ascii_strcasecmp(string,"uncompressed")==0) @@ -1159,49 +1245,6 @@ w32_shgetfolderpath (HWND a, int b, HANDLE c, DWORD d, LPSTR e) #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 * @@ -1282,3 +1325,119 @@ path_access(const char *file,int mode) return ret; } + + + +/* Temporary helper. */ +int +pubkey_get_npkey( int algo ) +{ + size_t n; + + if (algo == GCRY_PK_ELG_E) + algo = GCRY_PK_ELG; + if (gcry_pk_algo_info( algo, GCRYCTL_GET_ALGO_NPKEY, NULL, &n)) + n = 0; + return n; +} + +/* Temporary helper. */ +int +pubkey_get_nskey( int algo ) +{ + size_t n; + + if (algo == GCRY_PK_ELG_E) + algo = GCRY_PK_ELG; + if (gcry_pk_algo_info( algo, GCRYCTL_GET_ALGO_NSKEY, NULL, &n )) + n = 0; + return n; +} + +/* Temporary helper. */ +int +pubkey_get_nsig( int algo ) +{ + size_t n; + + if (algo == GCRY_PK_ELG_E) + algo = GCRY_PK_ELG; + if (gcry_pk_algo_info( algo, GCRYCTL_GET_ALGO_NSIGN, NULL, &n)) + n = 0; + return n; +} + +/* Temporary helper. */ +int +pubkey_get_nenc( int algo ) +{ + size_t n; + + if (algo == GCRY_PK_ELG_E) + algo = GCRY_PK_ELG; + if (gcry_pk_algo_info( algo, GCRYCTL_GET_ALGO_NENCR, NULL, &n )) + n = 0; + return n; +} + + +/* Temporary helper. */ +unsigned int +pubkey_nbits( int algo, gcry_mpi_t *key ) +{ + int rc, nbits; + gcry_sexp_t sexp; + + if( algo == GCRY_PK_DSA ) { + rc = gcry_sexp_build ( &sexp, NULL, + "(public-key(dsa(p%m)(q%m)(g%m)(y%m)))", + key[0], key[1], key[2], key[3] ); + } + else if( algo == GCRY_PK_ELG || algo == GCRY_PK_ELG_E ) { + rc = gcry_sexp_build ( &sexp, NULL, + "(public-key(elg(p%m)(g%m)(y%m)))", + key[0], key[1], key[2] ); + } + else if( algo == GCRY_PK_RSA ) { + rc = gcry_sexp_build ( &sexp, NULL, + "(public-key(rsa(n%m)(e%m)))", + key[0], key[1] ); + } + else + return 0; + + if ( rc ) + BUG (); + + nbits = gcry_pk_get_nbits( sexp ); + gcry_sexp_release( sexp ); + return nbits; +} + + + +/* FIXME: Use gcry_mpi_print directly. */ +int +mpi_print( FILE *fp, gcry_mpi_t a, int mode ) +{ + int n=0; + + if( !a ) + return fprintf(fp, "[MPI_NULL]"); + if( !mode ) { + unsigned int n1; + n1 = gcry_mpi_get_nbits(a); + n += fprintf(fp, "[%u bits]", n1); + } + else { + unsigned char *buffer; + + if (gcry_mpi_aprint (GCRYMPI_FMT_HEX, &buffer, NULL, a)) + BUG (); + fputs( buffer, fp ); + n += strlen(buffer); + gcry_free( buffer ); + } + return n; +} + diff --git a/g10/openfile.c b/g10/openfile.c index 33e755d8f..8c0601c3e 100644 --- a/g10/openfile.c +++ b/g10/openfile.c @@ -30,8 +30,9 @@ #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> + +#include "gpg.h" #include "util.h" -#include "memory.h" #include "ttyio.h" #include "options.h" #include "main.h" @@ -183,8 +184,8 @@ open_outfile( const char *iname, int mode, IOBUF *a ) if( iobuf_is_pipe_filename (iname) && !opt.outfile ) { *a = iobuf_create(NULL); if( !*a ) { + rc = gpg_error_from_errno (errno); 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")); @@ -201,10 +202,10 @@ open_outfile( const char *iname, int mode, IOBUF *a ) #ifdef USE_ONLY_8DOT3 if (opt.mangle_dos_filenames) { - /* It is quite common for DOS system to have only one dot in a + /* It is quite common 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. + * replace the suffix execpt in cases where the suffix is + * larger than 3 characters and not the same as. * We should really map the filenames to 8.3 but this tends to * be more complicated and is probaly a duty of the filesystem */ @@ -214,22 +215,16 @@ open_outfile( const char *iname, int mode, IOBUF *a ) buf = xmalloc(strlen(iname)+4+1); strcpy(buf,iname); - dot = strrchr(buf, '.' ); + dot = strchr(buf, '.' ); if ( dot && dot > buf && dot[1] && strlen(dot) <= 4 - && CMP_FILENAME(newsfx, dot) - && !(strchr (dot, '/') || strchr (dot, '\\'))) + && CMP_FILENAME(newsfx, 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 ); + strcpy(dot, newsfx ); } - else if ( dot && !dot[1] ) /* Don't duplicate a trailing dot. */ - strcpy ( dot, newsfx+1 ); + else if ( dot && !dot[1] ) /* don't duplicate a dot */ + strcpy( dot, newsfx+1 ); else - strcat ( buf, newsfx ); /* Just append the new suffix. */ + strcat ( buf, newsfx ); } if (!buf) #endif /* USE_ONLY_8DOT3 */ @@ -248,7 +243,7 @@ open_outfile( const char *iname, int mode, IOBUF *a ) if ( !tmp || !*tmp ) { xfree (tmp); - rc = G10ERR_FILE_EXISTS; + rc = gpg_error (GPG_ERR_EEXIST); break; } xfree (buf); @@ -266,8 +261,8 @@ open_outfile( const char *iname, int mode, IOBUF *a ) *a = iobuf_create( name ); if( !*a ) { + rc = gpg_error_from_errno (errno); 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 ); @@ -336,7 +331,7 @@ copy_options_file( const char *destdir ) return; fname = xmalloc( strlen(datadir) + strlen(destdir) + 15 ); - strcpy(stpcpy(fname, datadir), DIRSEP_S "options" SKELEXT ); + strcpy(stpcpy(fname, datadir), DIRSEP_S "gpg-conf" SKELEXT ); src = fopen( fname, "r" ); if (src && is_secured_file (fileno (src))) { @@ -399,7 +394,7 @@ copy_options_file( const char *destdir ) void try_make_homedir( const char *fname ) { - const char *defhome = GNUPG_HOMEDIR; + const char *defhome = GNUPG_DEFAULT_HOMEDIR; /* Create the directory only if the supplied directory name * is the same as the default one. This way we avoid to create diff --git a/g10/options.h b/g10/options.h index 05f993db2..75c2745fc 100644 --- a/g10/options.h +++ b/g10/options.h @@ -86,7 +86,7 @@ struct int completes_needed; int max_cert_depth; const char *homedir; - + const char *agent_program; char *display; /* 5 options to be passed to the gpg-agent */ char *ttyname; char *ttytype; @@ -194,7 +194,6 @@ struct int preserve_permissions; int no_homedir_creation; struct groupitem *grouplist; - int strict; int mangle_dos_filenames; int enable_progress_filter; unsigned int screen_columns; @@ -210,6 +209,7 @@ struct int limit_card_insert_tries; #ifdef ENABLE_CARD_SUPPORT + /* FIXME: We don't needs this here as it is done in scdaemon. */ const char *ctapi_driver; /* Library to access the ctAPI. */ const char *pcsc_driver; /* Library to access the PC/SC system. */ int disable_ccid; /* Disable the use of the internal CCID driver. */ @@ -221,6 +221,7 @@ struct 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; @@ -264,6 +265,7 @@ struct { #define DBG_CARD_IO_VALUE 2048 /* debug smart card I/O. */ #define DBG_PACKET (opt.debug & DBG_PACKET_VALUE) +#define DBG_CIPHER (opt.debug & DBG_CIPHER_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) @@ -271,6 +273,14 @@ struct { #define DBG_EXTPROG (opt.debug & DBG_EXTPROG_VALUE) #define DBG_CARD_IO (opt.debug & DBG_CARD_IO_VALUE) +/* FIXME: We need to check whey we did not put this into opt. */ +#define DBG_MEMORY memory_debug_mode +#define DBG_MEMSTAT memory_stat_debug_mode + +EXTERN_UNLESS_MAIN_MODULE int memory_debug_mode; +EXTERN_UNLESS_MAIN_MODULE int memory_stat_debug_mode; + + #define GNUPG (opt.compliance==CO_GNUPG) #define RFC1991 (opt.compliance==CO_RFC1991 || opt.compliance==CO_PGP2) @@ -298,6 +308,7 @@ struct { #define EXPORT_RESET_SUBKEY_PASSWD (1<<3) #define EXPORT_MINIMAL (1<<4) #define EXPORT_CLEAN (1<<5) +#define EXPORT_SEXP_FORMAT (1<<6) #define LIST_SHOW_PHOTOS (1<<0) #define LIST_SHOW_POLICY_URLS (1<<1) diff --git a/g10/options.skel b/g10/options.skel index fa77daa86..3d15f811c 100644 --- a/g10/options.skel +++ b/g10/options.skel @@ -39,14 +39,6 @@ #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 @@ -66,8 +58,7 @@ # 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. +# as default character set. #charset utf-8 @@ -83,9 +74,14 @@ #group mynames = paige 0x12345678 joe patti +# Some old Windows platforms require 8.3 filenames. If your system +# can handle long filenames, uncomment this. + +#no-mangle-dos-filenames + # 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. +# it is needed - normally this is not needed. #lock-once @@ -100,6 +96,7 @@ # mailto:pgp-public-keys@keys.pgp.net # # Example LDAP keyservers: +# ldap://pgp.surfnet.nl:11370 # ldap://keyserver.pgp.com # # Regular URL syntax applies, and you can set an alternate port @@ -121,6 +118,7 @@ keyserver hkp://subkeys.pgp.net #keyserver mailto:pgp-public-keys@keys.nl.pgp.net +#keyserver ldap://pgp.surfnet.nl:11370 #keyserver ldap://keyserver.pgp.com # Common options for keyserver functions: @@ -157,14 +155,10 @@ keyserver hkp://subkeys.pgp.net #keyserver-options auto-key-retrieve -# Display photo user IDs in key listings +# Uncomment this line to display photo user IDs in key listings and +# when a signature from a key with a photo is verified. -# list-options show-photos - -# Display photo user IDs when a signature from a key with a photo is -# verified - -# verify-options show-photos +#show-photos # Use this program to display photo user IDs # @@ -182,13 +176,14 @@ keyserver hkp://subkeys.pgp.net # 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. +# The default program is "xloadimage -fork -quiet -title 'KeyID 0x%k' stdin" +# 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" +# photo-viewer "display -title 'KeyID 0x%k'" # # This one saves a copy of the photo ID in your home directory: # photo-viewer "cat > ~/photoid-for-key-%k.%t" @@ -215,27 +210,3 @@ keyserver hkp://subkeys.pgp.net # --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 index f3181332f..54eeda1a9 100644 --- a/g10/packet.h +++ b/g10/packet.h @@ -1,4 +1,4 @@ -/* packet.h - packet definitions +/* packet.h - OpenPGP packet definitions * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, * 2006 Free Software Foundation, Inc. * @@ -24,11 +24,10 @@ #define G10_PACKET_H #include "types.h" -#include "iobuf.h" -#include "mpi.h" +#include "../common/iobuf.h" +#include "../jnlib/strlist.h" #include "cipher.h" #include "filter.h" -#include "global.h" #define DEBUG_PARSE_PACKET 1 @@ -97,7 +96,7 @@ typedef struct { byte version; byte pubkey_algo; /* algorithm used for public key scheme */ byte throw_keyid; - MPI data[PUBKEY_MAX_NENC]; + gcry_mpi_t data[PUBKEY_MAX_NENC]; } PKT_pubkey_enc; @@ -171,7 +170,7 @@ typedef struct 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]; + gcry_mpi_t data[PUBKEY_MAX_NSIG]; } PKT_signature; #define ATTRIB_IMAGE 1 @@ -262,7 +261,7 @@ typedef struct { byte trust_depth; byte trust_value; const byte *trust_regexp; - MPI pkey[PUBKEY_MAX_NPKEY]; + gcry_mpi_t pkey[PUBKEY_MAX_NPKEY]; } PKT_public_key; /* Evaluates as true if the pk is disabled, and false if it isn't. If @@ -296,7 +295,7 @@ typedef struct { byte ivlen; /* used length of the iv */ byte iv[16]; /* initialization vector for CFB mode */ } protect; - MPI skey[PUBKEY_MAX_NSKEY]; + gcry_mpi_t skey[PUBKEY_MAX_NSKEY]; u16 csum; /* checksum */ } PKT_secret_key; @@ -310,7 +309,7 @@ typedef struct { u32 len; /* reserved */ byte new_ctb; byte algorithm; - IOBUF buf; /* IOBUF reference */ + iobuf_t buf; /* IOBUF reference */ } PKT_compressed; typedef struct { @@ -319,7 +318,7 @@ typedef struct { 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 */ + iobuf_t buf; /* IOBUF reference */ } PKT_encrypted; typedef struct { @@ -333,7 +332,7 @@ typedef struct { typedef struct { u32 len; /* length of encrypted data */ - IOBUF buf; /* IOBUF reference */ + iobuf_t buf; /* IOBUF reference */ byte new_ctb; byte is_partial; /* partial length encoded */ int mode; @@ -423,25 +422,25 @@ struct notation }; /*-- mainproc.c --*/ -int proc_packets( void *ctx, IOBUF a ); -int proc_signature_packets( void *ctx, IOBUF a, +int proc_packets( void *ctx, iobuf_t a ); +int proc_signature_packets( void *ctx, iobuf_t a, STRLIST signedfiles, const char *sigfile ); -int proc_encryption_packets( void *ctx, IOBUF a ); -int list_packets( IOBUF a ); +int proc_encryption_packets( void *ctx, iobuf_t a ); +int list_packets( iobuf_t 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, +int dbg_search_packet( iobuf_t inp, PACKET *pkt, off_t *retpos, int with_uid, const char* file, int lineno ); -int dbg_parse_packet( IOBUF inp, PACKET *ret_pkt, +int dbg_parse_packet( iobuf_t inp, PACKET *ret_pkt, const char* file, int lineno ); -int dbg_copy_all_packets( IOBUF inp, IOBUF out, +int dbg_copy_all_packets( iobuf_t inp, iobuf_t out, const char* file, int lineno ); -int dbg_copy_some_packets( IOBUF inp, IOBUF out, off_t stopoff, +int dbg_copy_some_packets( iobuf_t inp, iobuf_t out, off_t stopoff, const char* file, int lineno ); -int dbg_skip_some_packets( IOBUF inp, unsigned n, +int dbg_skip_some_packets( iobuf_t inp, unsigned n, const char* file, int lineno ); #define search_packet( a,b,c,d ) \ dbg_search_packet( (a), (b), (c), (d), __FILE__, __LINE__ ) @@ -454,14 +453,14 @@ int dbg_skip_some_packets( IOBUF inp, unsigned n, #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 ); +int search_packet( iobuf_t inp, PACKET *pkt, off_t *retpos, int with_uid ); +int parse_packet( iobuf_t inp, PACKET *ret_pkt); +int copy_all_packets( iobuf_t inp, iobuf_t out ); +int copy_some_packets( iobuf_t inp, iobuf_t out, off_t stopoff ); +int skip_some_packets( iobuf_t inp, unsigned n ); #endif -int parse_signature( IOBUF inp, int pkttype, unsigned long pktlen, +int parse_signature( iobuf_t inp, int pkttype, unsigned long pktlen, PKT_signature *sig ); const byte *enum_sig_subpkt ( const subpktarea_t *subpkts, sigsubpkttype_t reqtype, @@ -481,7 +480,7 @@ PACKET *create_gpg_control ( ctrlpkttype_t type, size_t datalen ); /*-- build-packet.c --*/ -int build_packet( IOBUF inp, PACKET *pkt ); +int build_packet( iobuf_t 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 ); @@ -521,8 +520,8 @@ 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 signature_check( PKT_signature *sig, gcry_md_hd_t digest ); +int signature_check2( PKT_signature *sig, gcry_md_hd_t digest, u32 *r_expiredate, int *r_expired, int *r_revoked, PKT_public_key *ret_pk ); /*-- seckey-cert.c --*/ @@ -536,7 +535,7 @@ 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 ); + int (*callback)(iobuf_t, void *), void *passthru ); /*-- encr-data.c --*/ int decrypt_data( void *ctx, PKT_encrypted *ed, DEK *dek ); @@ -544,7 +543,7 @@ 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, +int ask_for_detached_datafile( gcry_md_hd_t md, gcry_md_hd_t md2, const char *inname, int textmode ); /*-- sign.c --*/ diff --git a/g10/parse-packet.c b/g10/parse-packet.c index 363ade99f..33472da4d 100644 --- a/g10/parse-packet.c +++ b/g10/parse-packet.c @@ -26,12 +26,11 @@ #include <string.h> #include <assert.h> +#include "gpg.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" @@ -101,12 +100,67 @@ read_32(IOBUF inp) } +/* 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). + */ +static gcry_mpi_t +mpi_read (iobuf_t inp, unsigned int *ret_nread, int secure) +{ + /*FIXME: Needs to be synced with gnupg14/mpi/mpicoder.c*/ + + int c, c1, c2, i; + unsigned int nbits, nbytes, nread=0; + gcry_mpi_t a = NULL; + byte *buf = NULL; + byte *p; + + if( (c = c1 = iobuf_get(inp)) == -1 ) + goto leave; + nbits = c << 8; + if( (c = c2 = iobuf_get(inp)) == -1 ) + goto leave; + nbits |= c; + if( nbits > MAX_EXTERN_MPI_BITS ) + { + log_error("mpi too large (%u bits)\n", nbits); + goto leave; + } + nread = 2; + nbytes = (nbits+7) / 8; + buf = secure? gcry_xmalloc_secure( nbytes+2 ) : gcry_xmalloc( nbytes+2 ); + p = buf; + p[0] = c1; + p[1] = c2; + for( i=0 ; i < nbytes; i++ ) + { + p[i+2] = iobuf_get(inp) & 0xff; + nread++; + } + nread += nbytes; + if( gcry_mpi_scan( &a, GCRYMPI_FMT_PGP, buf, nread, &nread ) ) + a = NULL; + + leave: + gcry_free(buf); + if( nread > *ret_nread ) + log_bug("mpi larger than packet"); + else + *ret_nread = nread; + return a; +} + + + + int set_packet_list_mode( int mode ) { int old = list_mode; list_mode = mode; - mpi_print_mode = DBG_MPI; + /* FIXME(gcrypt) 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 @@ -330,7 +384,7 @@ parse( IOBUF inp, PACKET *pkt, int onlykeypkts, off_t *retpos, hdr[hdrlen++] = ctb; if( !(ctb & 0x80) ) { log_error("%s: invalid packet (ctb=%02x)\n", iobuf_where(inp), ctb ); - rc = G10ERR_INVALID_PACKET; + rc = gpg_error (GPG_ERR_INV_PACKET); goto leave; } pktlen = 0; @@ -339,7 +393,7 @@ parse( IOBUF inp, PACKET *pkt, int onlykeypkts, off_t *retpos, pkttype = ctb & 0x3f; if( (c = iobuf_get(inp)) == -1 ) { log_error("%s: 1st length byte missing\n", iobuf_where(inp) ); - rc = G10ERR_INVALID_PACKET; + rc = gpg_error (GPG_ERR_INV_PACKET); goto leave; } if (pkttype == PKT_COMPRESSED) { @@ -358,7 +412,7 @@ parse( IOBUF inp, PACKET *pkt, int onlykeypkts, off_t *retpos, { log_error("%s: 2nd length byte missing\n", iobuf_where(inp) ); - rc = G10ERR_INVALID_PACKET; + rc = gpg_error (GPG_ERR_INV_PACKET); goto leave; } hdr[hdrlen++] = c; @@ -373,7 +427,7 @@ parse( IOBUF inp, PACKET *pkt, int onlykeypkts, off_t *retpos, { log_error("%s: 4 byte length invalid\n", iobuf_where(inp) ); - rc = G10ERR_INVALID_PACKET; + rc = gpg_error (GPG_ERR_INV_PACKET); goto leave; } pktlen |= (hdr[hdrlen++] = c ); @@ -393,7 +447,7 @@ parse( IOBUF inp, PACKET *pkt, int onlykeypkts, off_t *retpos, { log_error("%s: partial length for invalid" " packet type %d\n",iobuf_where(inp),pkttype); - rc=G10ERR_INVALID_PACKET; + rc = gpg_error (GPG_ERR_INV_PACKET); goto leave; } } @@ -414,7 +468,7 @@ parse( IOBUF inp, PACKET *pkt, int onlykeypkts, off_t *retpos, { log_error ("%s: indeterminate length for invalid" " packet type %d\n", iobuf_where(inp), pkttype ); - rc = G10ERR_INVALID_PACKET; + rc = gpg_error (GPG_ERR_INV_PACKET); goto leave; } } @@ -437,11 +491,10 @@ parse( IOBUF inp, PACKET *pkt, int onlykeypkts, off_t *retpos, } if( out && pkttype ) { - if( iobuf_write( out, hdr, hdrlen ) == -1 ) - rc = G10ERR_WRITE_FILE; - else + rc = iobuf_write (out, hdr, hdrlen); + if (!rc) rc = copy_packet(inp, out, pkttype, pktlen, partial ); - goto leave; + goto leave; } if (with_uid && pkttype == PKT_USER_ID) @@ -558,29 +611,30 @@ static int copy_packet( IOBUF inp, IOBUF out, int pkttype, unsigned long pktlen, int partial ) { + int rc; 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 */ + if( (rc=iobuf_write(out, buf, n )) ) + return rc; /* 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 */ + if( (rc=iobuf_write(out, buf, n )) ) + return rc; /* 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 gpg_error (GPG_ERR_EOF); + if( (rc=iobuf_write(out, buf, n )) ) + return rc; /* write error */ } } return 0; @@ -645,18 +699,18 @@ parse_symkeyenc( IOBUF inp, int pkttype, unsigned long pktlen, PACKET *packet ) if( pktlen < 4 ) { log_error("packet(%d) too short\n", pkttype); - rc = G10ERR_INVALID_PACKET; + rc = gpg_error (GPG_ERR_INV_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; + rc = gpg_error (GPG_ERR_INV_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; + rc = gpg_error (GPG_ERR_INV_PACKET); goto leave; } cipher_algo = iobuf_get_noeof(inp); pktlen--; @@ -678,7 +732,7 @@ parse_symkeyenc( IOBUF inp, int pkttype, unsigned long pktlen, PACKET *packet ) } if( minlen > pktlen ) { log_error("packet with S2K %d too short\n", s2kmode ); - rc = G10ERR_INVALID_PACKET; + rc = gpg_error (GPG_ERR_INV_PACKET); goto leave; } seskeylen = pktlen - minlen; @@ -742,13 +796,13 @@ parse_pubkeyenc( IOBUF inp, int pkttype, unsigned long pktlen, PACKET *packet ) 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; + rc = gpg_error (GPG_ERR_INV_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; + rc = gpg_error (GPG_ERR_INV_PACKET); goto leave; } k->keyid[0] = read_32(inp); pktlen -= 4; @@ -776,7 +830,7 @@ parse_pubkeyenc( IOBUF inp, int pkttype, unsigned long pktlen, PACKET *packet ) putc ('\n', listfp); } if (!k->data[i]) - rc = G10ERR_INVALID_PACKET; + rc = gpg_error (GPG_ERR_INV_PACKET); } } @@ -1267,8 +1321,9 @@ parse_signature( IOBUF inp, int pkttype, unsigned long 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; + log_error("packet(%d) with unknown version %d\n", + pkttype, sig->version); + rc = gpg_error (GPG_ERR_INV_PACKET); goto leave; } @@ -1435,9 +1490,10 @@ parse_signature( IOBUF inp, int pkttype, unsigned long pktlen, 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 + /* 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 ); + sig->data[0]= gcry_mpi_set_opaque (NULL, read_rest(inp, pktlen, 0), + pktlen*8 ); pktlen = 0; } else { @@ -1470,13 +1526,13 @@ parse_onepass_sig( IOBUF inp, int pkttype, unsigned long pktlen, if( pktlen < 13 ) { log_error("packet(%d) too short\n", pkttype); - rc = G10ERR_INVALID_PACKET; + rc = gpg_error (GPG_ERR_INV_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; + rc = gpg_error (GPG_ERR_INV_PACKET); goto leave; } ops->sig_class = iobuf_get_noeof(inp); pktlen--; @@ -1499,13 +1555,13 @@ parse_onepass_sig( IOBUF inp, int pkttype, unsigned long pktlen, } -static MPI +static gcry_mpi_t read_protected_v3_mpi (IOBUF inp, unsigned long *length) { int c; unsigned int nbits, nbytes; unsigned char *buf, *p; - MPI val; + gcry_mpi_t val; if (*length < 2) { @@ -1541,7 +1597,7 @@ read_protected_v3_mpi (IOBUF inp, unsigned long *length) } /* convert buffer into an opaque MPI */ - val = mpi_set_opaque (NULL, buf, p-buf); + val = gcry_mpi_set_opaque (NULL, buf, (p-buf)*8); return val; } @@ -1580,13 +1636,13 @@ parse_key( IOBUF inp, int pkttype, unsigned long pktlen, is_v4=1; else if( version != 2 && version != 3 ) { log_error("packet(%d) with unknown version %d\n", pkttype, version); - rc = G10ERR_INVALID_PACKET; + rc = gpg_error (GPG_ERR_INV_PACKET); goto leave; } if( pktlen < 11 ) { log_error("packet(%d) too short\n", pkttype); - rc = G10ERR_INVALID_PACKET; + rc = gpg_error (GPG_ERR_INV_PACKET); goto leave; } @@ -1660,8 +1716,8 @@ parse_key( IOBUF inp, int pkttype, unsigned long pktlen, size_t snlen = 0; if( !npkey ) { - sk->skey[0] = mpi_set_opaque( NULL, - read_rest(inp, pktlen, 0), pktlen ); + sk->skey[0] = gcry_mpi_set_opaque (NULL, read_rest(inp, pktlen, 0), + pktlen*8 ); pktlen = 0; goto leave; } @@ -1839,15 +1895,17 @@ parse_key( IOBUF inp, int pkttype, unsigned long pktlen, 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); + sk->skey[npkey] = gcry_mpi_set_opaque(NULL, + xstrdup("dummydata"), 10*8); 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); + sk->skey[npkey] = gcry_mpi_set_opaque (NULL, + read_rest(inp, pktlen, 0), + pktlen*8); pktlen = 0; if( list_mode ) { fprintf (listfp, "\tencrypted stuff follows\n"); @@ -1887,8 +1945,9 @@ parse_key( IOBUF inp, int pkttype, unsigned long pktlen, PKT_public_key *pk = pkt->pkt.public_key; if( !npkey ) { - pk->pkey[0] = mpi_set_opaque( NULL, - read_rest(inp, pktlen, 0), pktlen ); + pk->pkey[0] = gcry_mpi_set_opaque ( NULL, + read_rest(inp, pktlen, 0), + pktlen*8 ); pktlen = 0; goto leave; } @@ -1989,13 +2048,13 @@ parse_user_id( IOBUF inp, int pkttype, unsigned long pktlen, PACKET *packet ) allocatable, and a very large pktlen could actually cause our allocation to wrap around in xmalloc to a small number. */ - if(pktlen>2048) + if (pktlen > 2048) { - log_error("packet(%d) too large\n", pkttype); + 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; @@ -2107,7 +2166,7 @@ parse_comment( IOBUF inp, int pkttype, unsigned long pktlen, PACKET *packet ) if( list_mode ) { int n = packet->pkt.comment->len; fprintf (listfp, ":%scomment packet: \"", pkttype == PKT_OLD_COMMENT? - "OpenPGP draft " : "GnuPG " ); + "OpenPGP draft " : "" ); for(p=packet->pkt.comment->data; n; p++, n-- ) { if( *p >= ' ' && *p <= 'z' ) putc (*p, listfp); @@ -2166,12 +2225,12 @@ parse_plaintext( IOBUF inp, int pkttype, unsigned long pktlen, if( !partial && pktlen < 6 ) { log_error("packet(%d) too short (%lu)\n", pkttype, (ulong)pktlen); - rc = G10ERR_INVALID_PACKET; + rc = gpg_error (GPG_ERR_INV_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. */ + /* Note that namelen will never exceed 255 bytes. */ pt = pkt->pkt.plaintext = xmalloc(sizeof *pkt->pkt.plaintext + namelen -1); pt->new_ctb = new_ctb; pt->mode = mode; @@ -2268,7 +2327,7 @@ parse_encrypted( IOBUF inp, int pkttype, unsigned long pktlen, log_error("encrypted_mdc packet with unknown version %d\n", version); /*skip_rest(inp, pktlen); should we really do this? */ - rc = G10ERR_INVALID_PACKET; + rc = gpg_error (GPG_ERR_INV_PACKET); goto leave; } ed->mdc_method = DIGEST_ALGO_SHA1; @@ -2309,7 +2368,7 @@ parse_mdc( IOBUF inp, int pkttype, unsigned long pktlen, 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; + rc = gpg_error (GPG_ERR_INV_PACKET); goto leave; } p = mdc->hash; @@ -2322,10 +2381,10 @@ parse_mdc( IOBUF inp, int pkttype, unsigned long pktlen, /* - * This packet is internally generated by GPG (by armor.c) to + * This packet is internally generated by PGG (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. + * we first check that tehre is a unique tag in it. * The format of such a control packet is: * n byte session marker * 1 byte control type CTRLPKT_xxxxx @@ -2384,7 +2443,7 @@ parse_gpg_control( IOBUF inp, int pkttype, putc ('\n', listfp); } iobuf_skip_rest(inp,pktlen, 0); - return G10ERR_INVALID_PACKET; + return gpg_error (GPG_ERR_INV_PACKET); } /* create a gpg control packet to be used internally as a placeholder */ diff --git a/g10/passphrase.c b/g10/passphrase.c index 01e9166b5..1c5cf3b27 100644 --- a/g10/passphrase.c +++ b/g10/passphrase.c @@ -42,8 +42,8 @@ #include <langinfo.h> #endif +#include "gpg.h" #include "util.h" -#include "memory.h" #include "options.h" #include "ttyio.h" #include "cipher.h" @@ -359,7 +359,7 @@ agent_open (int try, const char *orig_codeset) if (orig_codeset) bind_textdomain_codeset (PACKAGE, orig_codeset); #endif /*ENABLE_NLS*/ - log_info ( _("can't connect to `%s': %s\n"), + log_error ( _("can't connect to `%s': %s\n"), infostr, assuan_strerror (rc)); opt.use_agent = 0; } @@ -897,7 +897,7 @@ passphrase_to_dek( u32 *keyid, int pubkey_algo, xfree(p); if( !get_pubkey( pk, keyid ) ) { - const char *s = pubkey_algo_to_string( pk->pubkey_algo ); + const char *s = gcry_pk_algo_name ( pk->pubkey_algo ); tty_printf( _("%u-bit %s key, ID %s, created %s"), nbits_from_pk( pk ), s?s:"?", keystr(keyid), strtimestamp(pk->timestamp) ); @@ -1011,22 +1011,23 @@ passphrase_to_dek( u32 *keyid, int pubkey_algo, static void hash_passphrase( DEK *dek, char *pw, STRING2KEY *s2k, int create ) { - MD_HANDLE md; + gcry_md_hd_t md; int pass, i; int used = 0; int pwlen = strlen(pw); assert( s2k->hash_algo ); - dek->keylen = cipher_get_keylen( dek->algo ) / 8; + dek->keylen = gcry_cipher_get_algo_keylen (dek->algo); if( !(dek->keylen > 0 && dek->keylen <= DIM(dek->key)) ) BUG(); - md = md_open( s2k->hash_algo, 1); + if (gcry_md_open (&md, s2k->hash_algo, 1)) + BUG (); for(pass=0; used < dek->keylen ; pass++ ) { if( pass ) { - md_reset(md); + gcry_md_reset (md); for(i=0; i < pass; i++ ) /* preset the hash context */ - md_putc(md, 0 ); + gcry_md_putc (md, 0 ); } if( s2k->mode == 1 || s2k->mode == 3 ) { @@ -1034,7 +1035,7 @@ hash_passphrase( DEK *dek, char *pw, STRING2KEY *s2k, int create ) ulong count = len2; if( create && !pass ) { - randomize_buffer(s2k->salt, 8, 1); + gcry_randomize (s2k->salt, 8, GCRY_STRONG_RANDOM); if( s2k->mode == 3 ) s2k->count = 96; /* 65536 iterations */ } @@ -1046,27 +1047,27 @@ hash_passphrase( DEK *dek, char *pw, STRING2KEY *s2k, int create ) } /* 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 ); + gcry_md_write ( md, s2k->salt, 8 ); + gcry_md_write ( md, pw, pwlen ); count -= len2; } if( count < 8 ) - md_write( md, s2k->salt, count ); + gcry_md_write ( md, s2k->salt, count ); else { - md_write( md, s2k->salt, 8 ); + gcry_md_write ( md, s2k->salt, 8 ); count -= 8; - md_write( md, pw, count ); + gcry_md_write ( md, pw, count ); } } else - md_write( md, pw, pwlen ); - md_final( md ); - i = md_digest_length( s2k->hash_algo ); + gcry_md_write ( md, pw, pwlen ); + gcry_md_final( md ); + i = gcry_md_get_algo_dlen ( s2k->hash_algo ); if( i > dek->keylen - used ) i = dek->keylen - used; - memcpy( dek->key+used, md_read(md, s2k->hash_algo), i ); + memcpy (dek->key+used, gcry_md_read (md, s2k->hash_algo), i); used += i; } - md_close(md); + gcry_md_close(md); } diff --git a/g10/photoid.c b/g10/photoid.c index 3676d3869..cca32bc82 100644 --- a/g10/photoid.c +++ b/g10/photoid.c @@ -29,6 +29,8 @@ # define VER_PLATFORM_WIN32_WINDOWS 1 # endif #endif + +#include "gpg.h" #include "packet.h" #include "status.h" #include "exec.h" @@ -36,7 +38,6 @@ #include "util.h" #include "i18n.h" #include "iobuf.h" -#include "memory.h" #include "options.h" #include "main.h" #include "photoid.h" @@ -259,8 +260,7 @@ char *image_type_to_string(byte type,int style) } #if !defined(FIXED_PHOTO_VIEWER) && !defined(DISABLE_PHOTO_VIEWER) -static const char * -get_default_photo_command(void) +static const char *get_default_photo_command(void) { #if defined(_WIN32) OSVERSIONINFO osvi; @@ -279,14 +279,7 @@ get_default_photo_command(void) #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 ""; + return "xloadimage -fork -quiet -title 'KeyID 0x%k' stdin"; #endif } #endif @@ -324,12 +317,6 @@ void show_photos(const struct user_attribute *attrs, 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) diff --git a/g10/pipemode.c b/g10/pipemode.c deleted file mode 100644 index 750aa3b54..000000000 --- a/g10/pipemode.c +++ /dev/null @@ -1,318 +0,0 @@ -/* 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 index 4c0ffd779..f90137aff 100644 --- a/g10/pkclist.c +++ b/g10/pkclist.c @@ -1,4 +1,4 @@ -/* pkclist.c +/* pkclist.c - create a list of public keys * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, * 2006 Free Software Foundation, Inc. * @@ -27,11 +27,11 @@ #include <errno.h> #include <assert.h> +#include "gpg.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" @@ -73,10 +73,10 @@ do_show_revocation_reason( PKT_signature *sig ) log_info( _("reason for revocation: ") ); if( text ) - fputs( text, log_stream() ); + fputs( text, log_get_stream() ); else - fprintf( log_stream(), "code=%02x", *p ); - putc( '\n', log_stream() ); + fprintf( log_get_stream(), "code=%02x", *p ); + log_printf ("\n"); n--; p++; pp = NULL; do { @@ -88,9 +88,9 @@ do_show_revocation_reason( PKT_signature *sig ) 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() ); + log_info ( _("revocation comment: ") ); + print_string ( log_get_stream(), p, nn, 0 ); + log_printf ("\n"); p += nn; n -= nn; } } while( pp ); @@ -363,7 +363,7 @@ do_edit_ownertrust (PKT_public_key *pk, int mode, int edit_ownertrust (PKT_public_key *pk, int mode ) { - unsigned int trust = 0; /* Needs to be initialized to avoid gcc warning. */ + unsigned int trust = 0; int no_help = 0; for(;;) @@ -613,7 +613,7 @@ check_signatures_trust( PKT_signature *sig ) log_info(_(" The signature is probably a FORGERY.\n")); if (opt.with_fingerprint) print_fingerprint (pk, NULL, 1); - rc = G10ERR_BAD_SIGN; + rc = gpg_error (GPG_ERR_BAD_SIGNATURE); break; case TRUST_MARGINAL: @@ -824,7 +824,7 @@ build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned int use ) rov->d, strlen (rov->d), -1); goto fail; } - else if ( !(rc=check_pubkey_algo2 (pk->pubkey_algo, use )) ) + else if ( !(rc=openpgp_pk_test_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. */ @@ -897,7 +897,7 @@ build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned int use ) else if (backlog) { /* This is part of our trick to expand and display groups. */ - answer = pop_strlist (&backlog); + answer = strlist_pop (&backlog); } else { @@ -958,7 +958,7 @@ build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned int 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)) ) + else if ( !(rc=openpgp_pk_test_algo2 (pk->pubkey_algo, use)) ) { if ( have_def_rec ) { @@ -1032,7 +1032,7 @@ build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned int use ) 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)) ) + else if ( !(rc=openpgp_pk_test_algo2(pk->pubkey_algo, use)) ) { /* Mark any_recipients here since the default recipient would have been used if it wasn't already there. It @@ -1079,7 +1079,7 @@ build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned int use ) -1); goto fail; } - else if ( !(rc=check_pubkey_algo2(pk->pubkey_algo, use )) ) + else if ( !(rc=openpgp_pk_test_algo2(pk->pubkey_algo, use )) ) { /* Key found and usable. Check validity. */ int trustlevel; @@ -1186,7 +1186,7 @@ build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned int use ) preference list, so I'm including it. -dms */ int -algo_available( preftype_t preftype, int algo, const union pref_hint *hint ) +algo_available( preftype_t preftype, int algo, const union pref_hint *hint) { if( preftype == PREFTYPE_SYM ) { @@ -1206,22 +1206,22 @@ algo_available( preftype_t preftype, int algo, const union pref_hint *hint ) /* PGP8 supports all the ciphers we do.. */ - return algo && !check_cipher_algo( algo ); + return algo && !openpgp_cipher_test_algo ( algo ); } else if( preftype == PREFTYPE_HASH ) { - if(hint && hint->digest_length) + if (hint && hint->digest_length) { - if(hint->digest_length!=20 || opt.flags.dsa2) + 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)) + if (hint->digest_length > gcry_md_get_algo_dlen (algo)) return 0; } - else if(hint->digest_length != md_digest_length(algo)) + else if (hint->digest_length != gcry_md_get_algo_dlen (algo)) return 0; } @@ -1237,7 +1237,7 @@ algo_available( preftype_t preftype, int algo, const union pref_hint *hint ) && algo != DIGEST_ALGO_SHA256)) return 0; - return algo && !check_digest_algo( algo ); + return algo && !openpgp_md_test_algo (algo); } else if( preftype == PREFTYPE_ZIP ) { @@ -1259,8 +1259,8 @@ algo_available( preftype_t preftype, int algo, const union pref_hint *hint ) * 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) +select_algo_from_prefs(PK_LIST pk_list, int preftype, int request, + const union pref_hint *hint) { PK_LIST pkr; u32 bits[8]; diff --git a/g10/pkglue.c b/g10/pkglue.c new file mode 100644 index 000000000..3f9669d27 --- /dev/null +++ b/g10/pkglue.c @@ -0,0 +1,343 @@ +/* pkglue.c - public key operations glue code + * Copyright (C) 2000, 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 <stdlib.h> +#include <string.h> +#include <errno.h> +#include <assert.h> + +#include "gpg.h" +#include "util.h" +#include "pkglue.h" + + +static gcry_mpi_t +mpi_from_sexp (gcry_sexp_t sexp, const char * item) +{ + gcry_sexp_t list; + gcry_mpi_t data; + + list = gcry_sexp_find_token (sexp, item, 0); + assert (list); + data = gcry_sexp_nth_mpi (list, 1, 0); + assert (data); + gcry_sexp_release (list); + return data; +} + + +/**************** + * Emulate our old PK interface here - sometime in the future we might + * change the internal design to directly fit to libgcrypt. + */ +int +pk_sign (int algo, gcry_mpi_t * data, gcry_mpi_t hash, gcry_mpi_t * skey) +{ + gcry_sexp_t s_sig, s_hash, s_skey; + int rc; + + /* make a sexp from skey */ + if (algo == GCRY_PK_DSA) + { + rc = gcry_sexp_build (&s_skey, NULL, + "(private-key(dsa(p%m)(q%m)(g%m)(y%m)(x%m)))", + skey[0], skey[1], skey[2], skey[3], skey[4]); + } + else if (algo == GCRY_PK_RSA) + { + rc = gcry_sexp_build (&s_skey, NULL, + "(private-key(rsa(n%m)(e%m)(d%m)(p%m)(q%m)(u%m)))", + skey[0], skey[1], skey[2], skey[3], skey[4], + skey[5]); + } + else if (algo == GCRY_PK_ELG || algo == GCRY_PK_ELG_E) + { + rc = gcry_sexp_build (&s_skey, NULL, + "(private-key(elg(p%m)(g%m)(y%m)(x%m)))", + skey[0], skey[1], skey[2], skey[3]); + } + else + return GPG_ERR_PUBKEY_ALGO; + + if (rc) + BUG (); + + /* put hash into a S-Exp s_hash */ + if (gcry_sexp_build (&s_hash, NULL, "%m", hash)) + BUG (); + + rc = gcry_pk_sign (&s_sig, s_hash, s_skey); + gcry_sexp_release (s_hash); + gcry_sexp_release (s_skey); + + if (rc) + ; + else if (algo == GCRY_PK_RSA) + data[0] = mpi_from_sexp (s_sig, "s"); + else + { + data[0] = mpi_from_sexp (s_sig, "r"); + data[1] = mpi_from_sexp (s_sig, "s"); + } + + gcry_sexp_release (s_sig); + return rc; +} + +/**************** + * Emulate our old PK interface here - sometime in the future we might + * change the internal design to directly fit to libgcrypt. + */ +int +pk_verify (int algo, gcry_mpi_t hash, gcry_mpi_t * data, gcry_mpi_t * pkey) +{ + gcry_sexp_t s_sig, s_hash, s_pkey; + int rc; + + /* make a sexp from pkey */ + if (algo == GCRY_PK_DSA) + { + rc = gcry_sexp_build (&s_pkey, NULL, + "(public-key(dsa(p%m)(q%m)(g%m)(y%m)))", + pkey[0], pkey[1], pkey[2], pkey[3]); + } + else if (algo == GCRY_PK_ELG || algo == GCRY_PK_ELG_E) + { + rc = gcry_sexp_build (&s_pkey, NULL, + "(public-key(elg(p%m)(g%m)(y%m)))", + pkey[0], pkey[1], pkey[2]); + } + else if (algo == GCRY_PK_RSA) + { + rc = gcry_sexp_build (&s_pkey, NULL, + "(public-key(rsa(n%m)(e%m)))", pkey[0], pkey[1]); + } + else + return GPG_ERR_PUBKEY_ALGO; + + if (rc) + BUG (); + + /* put hash into a S-Exp s_hash */ + if (gcry_sexp_build (&s_hash, NULL, "%m", hash)) + BUG (); + + /* put data into a S-Exp s_sig */ + if (algo == GCRY_PK_DSA) + { + if (!data[0] || !data[1]) + rc = gpg_error (GPG_ERR_BAD_MPI); + else + rc = gcry_sexp_build (&s_sig, NULL, + "(sig-val(dsa(r%m)(s%m)))", data[0], data[1]); + } + else if (algo == GCRY_PK_ELG || algo == GCRY_PK_ELG_E) + { + if (!data[0] || !data[1]) + rc = gpg_error (GPG_ERR_BAD_MPI); + else + rc = gcry_sexp_build (&s_sig, NULL, + "(sig-val(elg(r%m)(s%m)))", data[0], data[1]); + } + else if (algo == GCRY_PK_RSA) + { + if (!data[0]) + rc = gpg_error (GPG_ERR_BAD_MPI); + else + rc = gcry_sexp_build (&s_sig, NULL, "(sig-val(rsa(s%m)))", data[0]); + } + else + BUG (); + + if (rc) + BUG (); + + + rc = gcry_pk_verify (s_sig, s_hash, s_pkey); + gcry_sexp_release (s_sig); + gcry_sexp_release (s_hash); + gcry_sexp_release (s_pkey); + return rc; +} + + + + +/**************** + * Emulate our old PK interface here - sometime in the future we might + * change the internal design to directly fit to libgcrypt. + */ +int +pk_encrypt (int algo, gcry_mpi_t * resarr, gcry_mpi_t data, gcry_mpi_t * pkey) +{ + gcry_sexp_t s_ciph, s_data, s_pkey; + int rc; + + /* make a sexp from pkey */ + if (algo == GCRY_PK_ELG || algo == GCRY_PK_ELG_E) + { + rc = gcry_sexp_build (&s_pkey, NULL, + "(public-key(elg(p%m)(g%m)(y%m)))", + pkey[0], pkey[1], pkey[2]); + } + else if (algo == GCRY_PK_RSA) + { + rc = gcry_sexp_build (&s_pkey, NULL, + "(public-key(rsa(n%m)(e%m)))", + pkey[0], pkey[1]); + } + else + return GPG_ERR_PUBKEY_ALGO; + + if (rc) + BUG (); + + /* put the data into a simple list */ + if (gcry_sexp_build (&s_data, NULL, "%m", data)) + BUG (); + + /* pass it to libgcrypt */ + rc = gcry_pk_encrypt (&s_ciph, s_data, s_pkey); + gcry_sexp_release (s_data); + gcry_sexp_release (s_pkey); + + if (rc) + ; + else + { /* add better error handling or make gnupg use S-Exp directly */ + resarr[0] = mpi_from_sexp (s_ciph, "a"); + if (algo != GCRY_PK_RSA) + resarr[1] = mpi_from_sexp (s_ciph, "b"); + } + + gcry_sexp_release (s_ciph); + return rc; +} + + + +/**************** + * Emulate our old PK interface here - sometime in the future we might + * change the internal design to directly fit to libgcrypt. + */ +int +pk_decrypt (int algo, gcry_mpi_t * result, gcry_mpi_t * data, + gcry_mpi_t * skey) +{ + gcry_sexp_t s_skey, s_data, s_plain; + int rc; + + *result = NULL; + /* make a sexp from skey */ + if (algo == GCRY_PK_ELG || algo == GCRY_PK_ELG_E) + { + rc = gcry_sexp_build (&s_skey, NULL, + "(private-key(elg(p%m)(g%m)(y%m)(x%m)))", + skey[0], skey[1], skey[2], skey[3]); + } + else if (algo == GCRY_PK_RSA) + { + rc = gcry_sexp_build (&s_skey, NULL, + "(private-key(rsa(n%m)(e%m)(d%m)(p%m)(q%m)(u%m)))", + skey[0], skey[1], skey[2], skey[3], skey[4], + skey[5]); + } + else + return GPG_ERR_PUBKEY_ALGO; + + if (rc) + BUG (); + + /* put data into a S-Exp s_data */ + if (algo == GCRY_PK_ELG || algo == GCRY_PK_ELG_E) + { + if (!data[0] || !data[1]) + rc = gpg_error (GPG_ERR_BAD_MPI); + else + rc = gcry_sexp_build (&s_data, NULL, + "(enc-val(elg(a%m)(b%m)))", data[0], data[1]); + } + else if (algo == GCRY_PK_RSA) + { + if (!data[0]) + rc = gpg_error (GPG_ERR_BAD_MPI); + else + rc = gcry_sexp_build (&s_data, NULL, "(enc-val(rsa(a%m)))", data[0]); + } + else + BUG (); + + if (rc) + BUG (); + + rc = gcry_pk_decrypt (&s_plain, s_data, s_skey); + gcry_sexp_release (s_skey); + gcry_sexp_release (s_data); + if (rc) + return rc; + + *result = gcry_sexp_nth_mpi (s_plain, 0, 0); + gcry_sexp_release (s_plain); + if (!*result) + return -1; /* oops */ + + return 0; +} + + +/* Check whether SKEY is a suitable secret key. */ +int +pk_check_secret_key (int algo, gcry_mpi_t *skey) +{ + gcry_sexp_t s_skey; + int rc; + + if (algo == GCRY_PK_DSA) + { + rc = gcry_sexp_build (&s_skey, NULL, + "(private-key(dsa(p%m)(q%m)(g%m)(y%m)(x%m)))", + skey[0], skey[1], skey[2], skey[3], skey[4]); + } + else if (algo == GCRY_PK_ELG || algo == GCRY_PK_ELG_E) + { + rc = gcry_sexp_build (&s_skey, NULL, + "(private-key(elg(p%m)(g%m)(y%m)(x%m)))", + skey[0], skey[1], skey[2], skey[3]); + } + else if (algo == GCRY_PK_RSA) + { + rc = gcry_sexp_build (&s_skey, NULL, + "(private-key(rsa(n%m)(e%m)(d%m)(p%m)(q%m)(u%m)))", + skey[0], skey[1], skey[2], skey[3], skey[4], + skey[5]); + } + else + return GPG_ERR_PUBKEY_ALGO; + + if (!rc) + { + rc = gcry_pk_testkey (s_skey); + gcry_sexp_release (s_skey); + } + return rc; +} diff --git a/g10/pkglue.h b/g10/pkglue.h new file mode 100644 index 000000000..866960bfd --- /dev/null +++ b/g10/pkglue.h @@ -0,0 +1,36 @@ +/* pkglue.h - public key operations definitions + * 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_G10_PKGLUE_H +#define GNUPG_G10_PKGLUE_H + +int pk_sign (int algo, gcry_mpi_t *data, gcry_mpi_t hash, + gcry_mpi_t *skey); +int pk_verify (int algo, gcry_mpi_t hash, gcry_mpi_t *data, + gcry_mpi_t *pkey); +int pk_encrypt (int algo, gcry_mpi_t *resarr, gcry_mpi_t data, + gcry_mpi_t *pkey); +int pk_decrypt (int algo, gcry_mpi_t *result, gcry_mpi_t *data, + gcry_mpi_t *skey); +int pk_check_secret_key (int algo, gcry_mpi_t *skey); + + +#endif /*GNUPG_G10_PKGLUE_H*/ diff --git a/g10/plaintext.c b/g10/plaintext.c index 243296b7f..8032f15f0 100644 --- a/g10/plaintext.c +++ b/g10/plaintext.c @@ -31,8 +31,8 @@ #include <fcntl.h> /* for setmode() */ #endif +#include "gpg.h" #include "util.h" -#include "memory.h" #include "options.h" #include "packet.h" #include "ttyio.h" @@ -96,8 +96,8 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx, if( !fname ) fname = ask_outfile_name( pt->name, pt->namelen ); if( !fname ) { - rc = G10ERR_CREATE_FILE; - goto leave; + rc = gpg_error (GPG_ERR_GENERAL); /* Can't create file. */ + goto leave; } } else @@ -118,7 +118,7 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx, char *tmp = ask_outfile_name (NULL, 0); if ( !tmp || !*tmp ) { xfree (tmp); - rc = G10ERR_CREATE_FILE; + rc = gpg_error (GPG_ERR_GENERAL); /* G10ERR_CREATE_FILE*/ goto leave; } xfree (fname); @@ -132,13 +132,13 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx, else if (is_secured_filename (fname)) { errno = EPERM; + rc = gpg_error_from_errno (errno); log_error(_("error creating `%s': %s\n"), fname, strerror(errno) ); - rc = G10ERR_CREATE_FILE; goto leave; } else if( !(fp = fopen(fname,"wb")) ) { + rc = gpg_error_from_errno (errno); log_error(_("error creating `%s': %s\n"), fname, strerror(errno) ); - rc = G10ERR_CREATE_FILE; goto leave; } #else /* __riscos__ */ @@ -187,13 +187,13 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx, 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; + rc = gpg_error_from_errno (errno); + log_error ("problem reading source (%u bytes remaining)\n", + (unsigned)pt->len); + goto leave; } if( mfx->md ) - md_putc(mfx->md, c ); + gcry_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 */ @@ -202,16 +202,19 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx, { 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; + log_error ("error writing to `%s': %s\n", + fname,"exceeded --max-output limit\n"); + rc = gpg_error (GPG_ERR_TOO_LARGE); goto leave; } else if( putc( c, fp ) == EOF ) { - log_error("Error writing to `%s': %s\n", - fname, strerror(errno) ); - rc = G10ERR_WRITE_FILE; + if (ferror (fp)) + rc = gpg_error_from_errno (errno); + else + rc = gpg_error (GPG_ERR_EOF); + log_error ("error writing to `%s': %s\n", + fname, strerror(errno) ); goto leave; } } @@ -223,29 +226,29 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx, 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; + rc = gpg_error_from_errno (errno); + log_error ("problem reading source (%u bytes remaining)\n", + (unsigned)pt->len); xfree( buffer ); goto leave; } if( mfx->md ) - md_write( mfx->md, buffer, len ); + gcry_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; + log_error ("error writing to `%s': %s\n", + fname,"exceeded --max-output limit\n"); + rc = gpg_error (GPG_ERR_TOO_LARGE); 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; + rc = gpg_error_from_errno (errno); + log_error ("error writing to `%s': %s\n", + fname, strerror(errno) ); xfree( buffer ); goto leave; } @@ -259,7 +262,7 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx, if( convert ) { /* text mode */ while( (c = iobuf_get(pt->buf)) != -1 ) { if( mfx->md ) - md_putc(mfx->md, c ); + gcry_md_putc (mfx->md, c ); #ifndef HAVE_DOSISH_SYSTEM if( convert && c == '\r' ) continue; /* fixme: this hack might be too simple */ @@ -270,14 +273,17 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx, { log_error("Error writing to `%s': %s\n", fname,"exceeded --max-output limit\n"); - rc = G10ERR_WRITE_FILE; + rc = gpg_error (GPG_ERR_TOO_LARGE); goto leave; } else if( putc( c, fp ) == EOF ) { - log_error("Error writing to `%s': %s\n", + if ( ferror (fp ) ) + rc = gpg_error_from_errno (errno); + else + rc = gpg_error (GPG_ERR_EOF); + log_error("error writing to `%s': %s\n", fname, strerror(errno) ); - rc = G10ERR_WRITE_FILE; goto leave; } } @@ -299,21 +305,22 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx, if( len < 32768 ) eof = 1; if( mfx->md ) - md_write( mfx->md, buffer, len ); + gcry_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", + log_error("error writing to `%s': %s\n", fname,"exceeded --max-output limit\n"); - rc = G10ERR_WRITE_FILE; + rc = gpg_error (GPG_ERR_TOO_LARGE); xfree( buffer ); goto leave; } else if( fwrite( buffer, 1, len, fp ) != len ) { - log_error("Error writing to `%s': %s\n", + rc = (errno? gpg_error_from_errno (errno) + : gpg_error (GPG_ERR_INTERNAL)); + log_error ("error writing to `%s': %s\n", fname, strerror(errno) ); - rc = G10ERR_WRITE_FILE; xfree( buffer ); goto leave; } @@ -331,24 +338,25 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx, { if(opt.max_output && (++count)>opt.max_output) { - log_error("Error writing to `%s': %s\n", + log_error ("error writing to `%s': %s\n", fname,"exceeded --max-output limit\n"); - rc = G10ERR_WRITE_FILE; + rc = gpg_error (GPG_ERR_TOO_LARGE); goto leave; } else if( putc( c, fp ) == EOF ) { - log_error("Error writing to `%s': %s\n", + rc = (errno? gpg_error_from_errno (errno) + : gpg_error (GPG_ERR_INTERNAL)); + 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' ); + gcry_md_putc (mfx->md, '\r' ); + gcry_md_putc (mfx->md, '\n' ); state = 0; } if( !state ) { @@ -357,18 +365,18 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx, else if( c == '\n' ) state = 2; else - md_putc(mfx->md, c ); + gcry_md_putc(mfx->md, c ); } else if( state == 1 ) { if( c == '\n' ) state = 2; else { - md_putc(mfx->md, '\r' ); + gcry_md_putc(mfx->md, '\r' ); if( c == '\r' ) state = 1; else { state = 0; - md_putc(mfx->md, c ); + gcry_md_putc(mfx->md, c ); } } } @@ -377,9 +385,10 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx, } if( fp && fp != stdout && fclose(fp) ) { - log_error("Error closing `%s': %s\n", fname, strerror(errno) ); + rc = (errno? gpg_error_from_errno (errno) + : gpg_error (GPG_ERR_INTERNAL)); + log_error ("error closing `%s': %s\n", fname, strerror(errno) ); fp = NULL; - rc = G10ERR_WRITE_FILE; goto leave; } fp = NULL; @@ -392,7 +401,7 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx, } static void -do_hash( MD_HANDLE md, MD_HANDLE md2, IOBUF fp, int textmode ) +do_hash( gcry_md_hd_t md, gcry_md_hd_t md2, IOBUF fp, int textmode ) { text_filter_context_t tfx; int c; @@ -406,27 +415,27 @@ do_hash( MD_HANDLE md, MD_HANDLE md2, IOBUF fp, int textmode ) int lc = -1; while( (c = iobuf_get(fp)) != -1 ) { if( c == '\n' && lc == '\r' ) - md_putc(md2, c); + gcry_md_putc (md2, c); else if( c == '\n' ) { - md_putc(md2, '\r'); - md_putc(md2, c); + gcry_md_putc (md2, '\r'); + gcry_md_putc (md2, c); } else if( c != '\n' && lc == '\r' ) { - md_putc(md2, '\n'); - md_putc(md2, c); + gcry_md_putc (md2, '\n'); + gcry_md_putc (md2, c); } else - md_putc(md2, c); + gcry_md_putc (md2, c); if( md ) - md_putc(md, c ); + gcry_md_putc (md, c ); lc = c; } } else { while( (c = iobuf_get(fp)) != -1 ) { if( md ) - md_putc(md, c ); + gcry_md_putc (md, c ); } } } @@ -437,7 +446,7 @@ do_hash( MD_HANDLE md, MD_HANDLE md2, IOBUF fp, int textmode ) * INFILE is the name of the input file. */ int -ask_for_detached_datafile( MD_HANDLE md, MD_HANDLE md2, +ask_for_detached_datafile (gcry_md_hd_t md, gcry_md_hd_t md2, const char *inname, int textmode ) { progress_filter_context_t pfx; @@ -462,7 +471,7 @@ ask_for_detached_datafile( MD_HANDLE md, MD_HANDLE md2, xfree(name); if( any && !*answer ) { - rc = G10ERR_READ_FILE; + rc = gpg_error (GPG_ERR_GENERAL); /*G10ERR_READ_FILE*/ goto leave; } fp = iobuf_open(answer); @@ -478,8 +487,8 @@ ask_for_detached_datafile( MD_HANDLE md, MD_HANDLE md2, } else if( !fp ) { + rc = gpg_error_from_errno (errno); log_error(_("can't open `%s': %s\n"), answer, strerror(errno)); - rc = G10ERR_READ_FILE; goto leave; } } while( !fp ); @@ -506,7 +515,7 @@ ask_for_detached_datafile( MD_HANDLE md, MD_HANDLE md2, * If FILES is NULL, hash stdin. */ int -hash_datafiles( MD_HANDLE md, MD_HANDLE md2, STRLIST files, +hash_datafiles( gcry_md_hd_t md, gcry_md_hd_t md2, STRLIST files, const char *sigfilename, int textmode ) { progress_filter_context_t pfx; @@ -522,7 +531,7 @@ hash_datafiles( MD_HANDLE md, MD_HANDLE md2, STRLIST files, return 0; } log_error (_("no signed data\n")); - return G10ERR_OPEN_FILE; + return gpg_error (GPG_ERR_NO_DATA); } @@ -535,9 +544,10 @@ hash_datafiles( MD_HANDLE md, MD_HANDLE md2, STRLIST files, errno = EPERM; } if( !fp ) { + int rc = gpg_error_from_errno (errno); log_error(_("can't open signed data `%s'\n"), print_fname_stdin(sl->d)); - return G10ERR_OPEN_FILE; + return rc; } handle_progress (&pfx, fp, sl->d); do_hash( md, md2, fp, textmode ); diff --git a/g10/progress.c b/g10/progress.c index 8c8265f36..148bf7e2d 100644 --- a/g10/progress.c +++ b/g10/progress.c @@ -1,4 +1,4 @@ -/* progress.c +/* progress.c - emit progress status lines * Copyright (C) 2003 Free Software Foundation, Inc. * * This file is part of GnuPG. @@ -22,6 +22,7 @@ #include <config.h> #include <stdio.h> +#include "gpg.h" #include "iobuf.h" #include "filter.h" #include "status.h" diff --git a/g10/pubkey-enc.c b/g10/pubkey-enc.c index cffa79c62..47aadc9a7 100644 --- a/g10/pubkey-enc.c +++ b/g10/pubkey-enc.c @@ -1,5 +1,6 @@ /* pubkey-enc.c - public key encoded packet handling - * Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. + * Copyright (C) 1998, 1999, 2000, 2001, 2002, + * 2006 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -24,10 +25,10 @@ #include <stdlib.h> #include <string.h> #include <assert.h> + +#include "gpg.h" #include "util.h" -#include "memory.h" #include "packet.h" -#include "mpi.h" #include "keydb.h" #include "trustdb.h" #include "cipher.h" @@ -35,7 +36,8 @@ #include "options.h" #include "main.h" #include "i18n.h" -#include "cardglue.h" +#include "pkglue.h" + static int get_it( PKT_pubkey_enc *k, DEK *dek, PKT_secret_key *sk, u32 *keyid ); @@ -74,7 +76,7 @@ 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); + rc = openpgp_pk_test_algo2 (k->pubkey_algo, PUBKEY_USAGE_ENC); if( rc ) goto leave; @@ -150,7 +152,7 @@ static int get_it( PKT_pubkey_enc *enc, DEK *dek, PKT_secret_key *sk, u32 *keyid ) { int rc; - MPI plain_dek = NULL; + gcry_mpi_t plain_dek = NULL; byte *frame = NULL; unsigned n, nframe; u16 csum, csum2; @@ -168,8 +170,7 @@ get_it( PKT_pubkey_enc *enc, DEK *dek, PKT_secret_key *sk, u32 *keyid ) snbuf = serialno_and_fpr_from_sk (sk->protect.iv, sk->protect.ivlen, sk); - indata = mpi_get_buffer (enc->data[0], &indatalen, NULL); - if (!indata) + if (gcry_mpi_aprint (GCRYMPI_FMT_USG, &indata, &indatalen, enc->data[0])) BUG (); rc = agent_scd_pkdecrypt (snbuf, indata, indatalen, &rbuf, &rbuflen); @@ -182,17 +183,18 @@ get_it( PKT_pubkey_enc *enc, DEK *dek, PKT_secret_key *sk, u32 *keyid ) nframe = rbuflen; card = 1; #else - rc = G10ERR_UNSUPPORTED; + rc = gpg_error (GPG_ERR_NOT_SUPPORTED); goto leave; #endif /*!ENABLE_CARD_SUPPORT*/ } else { - rc = pubkey_decrypt(sk->pubkey_algo, &plain_dek, enc->data, sk->skey ); + rc = pk_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; + if (gcry_mpi_aprint (GCRYMPI_FMT_USG, &frame, &nframe, plain_dek)) + BUG(); + gcry_mpi_release (plain_dek); plain_dek = NULL; } /* Now get the DEK (data encryption key) from the frame @@ -212,8 +214,8 @@ get_it( PKT_pubkey_enc *enc, DEK *dek, PKT_secret_key *sk, u32 *keyid ) * DEK is the encryption key (session key) with length k * CSUM */ - if( DBG_CIPHER ) - log_hexdump("DEK frame:", frame, nframe ); + if (DBG_CIPHER) + log_printhex ("DEK frame:", frame, nframe ); n=0; if (!card) { @@ -238,9 +240,9 @@ get_it( PKT_pubkey_enc *enc, DEK *dek, PKT_secret_key *sk, u32 *keyid ) dek->algo = frame[n++]; if( dek->algo == CIPHER_ALGO_IDEA ) write_status(STATUS_RSA_OR_IDEA); - rc = check_cipher_algo( dek->algo ); + rc = openpgp_cipher_test_algo (dek->algo); if( rc ) { - if( !opt.quiet && rc == G10ERR_CIPHER_ALGO ) { + if( !opt.quiet && gpg_err_code (rc) == GPG_ERR_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) @@ -249,8 +251,8 @@ get_it( PKT_pubkey_enc *enc, DEK *dek, PKT_secret_key *sk, u32 *keyid ) dek->algo = 0; goto leave; } - if( (dek->keylen*8) != cipher_get_keylen( dek->algo ) ) { - rc = G10ERR_WRONG_SECKEY; + if ( dek->keylen != gcry_cipher_get_algo_keylen (dek->algo) ) { + rc = GPG_ERR_WRONG_SECKEY; goto leave; } @@ -265,7 +267,7 @@ get_it( PKT_pubkey_enc *enc, DEK *dek, PKT_secret_key *sk, u32 *keyid ) goto leave; } if( DBG_CIPHER ) - log_hexdump("DEK is:", dek->key, dek->keylen ); + log_printhex ("DEK is:", dek->key, dek->keylen ); /* check that the algo is in the preferences and whether it has expired */ { PKT_public_key *pk = NULL; @@ -279,8 +281,8 @@ get_it( PKT_pubkey_enc *enc, DEK *dek, PKT_secret_key *sk, u32 *keyid ) && 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)); + log_info (_("WARNING: cipher algorithm %s not found in recipient" + " preferences\n"), gcry_cipher_algo_name (dek->algo)); if (!rc) { KBNODE k; @@ -306,7 +308,7 @@ get_it( PKT_pubkey_enc *enc, DEK *dek, PKT_secret_key *sk, u32 *keyid ) if ( pk && pk->is_revoked ) { log_info( _("NOTE: key has been revoked") ); - putc( '\n', log_stream() ); + log_printf ("\n"); show_revocation_reason( pk, 1 ); } @@ -316,8 +318,8 @@ get_it( PKT_pubkey_enc *enc, DEK *dek, PKT_secret_key *sk, u32 *keyid ) leave: - mpi_free(plain_dek); - xfree(frame); + gcry_mpi_release (plain_dek); + xfree (frame); return rc; } diff --git a/g10/revoke.c b/g10/revoke.c index c2deefa83..34f9f5c85 100644 --- a/g10/revoke.c +++ b/g10/revoke.c @@ -28,11 +28,11 @@ #include <assert.h> #include <ctype.h> +#include "gpg.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" diff --git a/g10/seckey-cert.c b/g10/seckey-cert.c index 79cf22aeb..ad5b75603 100644 --- a/g10/seckey-cert.c +++ b/g10/seckey-cert.c @@ -1,5 +1,6 @@ /* seckey-cert.c - secret key certificate packet handling - * Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. + * Copyright (C) 1998, 1999, 2000, 2001, 2002, + * 2006 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -24,31 +25,32 @@ #include <stdlib.h> #include <string.h> #include <assert.h> + +#include "gpg.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" - +#include "pkglue.h" static int do_check( PKT_secret_key *sk, const char *tryagain_text, int mode, int *canceled ) { + gpg_error_t err; byte *buffer; u16 csum=0; int i, res; - unsigned nbytes; + unsigned int 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; + gcry_cipher_hd_t cipher_hd=NULL; PKT_secret_key *save_sk; if( sk->protect.s2k.mode == 1001 ) { @@ -57,7 +59,7 @@ do_check( PKT_secret_key *sk, const char *tryagain_text, int mode, } if( sk->protect.algo == CIPHER_ALGO_NONE ) BUG(); - if( check_cipher_algo( sk->protect.algo ) ) { + if( openpgp_cipher_test_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) @@ -67,7 +69,7 @@ do_check( PKT_secret_key *sk, const char *tryagain_text, int mode, } return G10ERR_CIPHER_ALGO; } - if(check_digest_algo(sk->protect.s2k.hash_algo)) + if(gcry_md_test_algo (sk->protect.s2k.hash_algo)) { log_info(_("protection digest %d is not supported\n"), sk->protect.s2k.hash_algo); @@ -85,26 +87,43 @@ do_check( PKT_secret_key *sk, const char *tryagain_text, int mode, 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 ); + + err = gcry_cipher_open (&cipher_hd, sk->protect.algo, + GCRY_CIPHER_MODE_CFB, + (GCRY_CIPHER_SECURE + | (sk->protect.algo >= 100 ? + 0 : GCRY_CIPHER_ENABLE_SYNC))); + if (err) + log_fatal ("cipher open failed: %s\n", gpg_strerror (err) ); + + err = gcry_cipher_setkey (cipher_hd, dek->key, dek->keylen); + if (err) + log_fatal ("set key failed: %s\n", gpg_strerror (err) ); + xfree(dek); save_sk = copy_secret_key( NULL, sk ); - cipher_setiv( cipher_hd, sk->protect.iv, sk->protect.ivlen ); + + gcry_cipher_setiv ( cipher_hd, sk->protect.iv, sk->protect.ivlen ); + csum = 0; if( sk->version >= 4 ) { - unsigned int ndata; + int ndata; + unsigned int ndatabits; 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 ); + + assert ( gcry_mpi_get_flag (sk->skey[i], GCRYMPI_FLAG_OPAQUE )); + p = gcry_mpi_get_opaque ( sk->skey[i], &ndatabits ); + ndata = (ndatabits+7)/8; + 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 ; + data = xmalloc_secure ( ndata ); + gcry_cipher_decrypt ( cipher_hd, data, ndata, p, ndata ); + gcry_mpi_release (sk->skey[i]); sk->skey[i] = NULL ; + p = data; if (sk->protect.sha1chk) { /* This is the new SHA1 checksum method to detect @@ -115,21 +134,23 @@ do_check( PKT_secret_key *sk, const char *tryagain_text, int mode, 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 + gcry_md_hd_t h; + + if ( gcry_md_open (&h, DIGEST_ALGO_SHA1, 1)) + BUG(); /* Algo not available. */ + gcry_md_write (h, data, ndata - 20); + gcry_md_final (h); + if (!memcmp (gcry_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); + } + gcry_md_close (h); } } else { @@ -152,9 +173,8 @@ do_check( PKT_secret_key *sk, const char *tryagain_text, int mode, 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]) + if ( gcry_mpi_scan( &sk->skey[i], GCRYMPI_FMT_PGP, + p, ndata, &nbytes)) { /* Checksum was okay, but not correctly decrypted. */ @@ -174,22 +194,27 @@ do_check( PKT_secret_key *sk, const char *tryagain_text, int mode, for(i=pubkey_get_npkey(sk->pubkey_algo); i < pubkey_get_nskey(sk->pubkey_algo); i++ ) { byte *p; - unsigned int ndata; + int ndata; + unsigned int ndatabits; - assert (mpi_is_opaque (sk->skey[i])); - p = mpi_get_opaque (sk->skey[i], &ndata); + assert (gcry_mpi_get_flag (sk->skey[i], GCRYMPI_FLAG_OPAQUE)); + p = gcry_mpi_get_opaque (sk->skey[i], &ndatabits); + ndata = (ndatabits+7)/8; assert (ndata >= 2); assert (ndata == ((p[0] << 8 | p[1]) + 7)/8 + 2); buffer = xmalloc_secure (ndata); - cipher_sync (cipher_hd); + gcry_cipher_sync (cipher_hd); buffer[0] = p[0]; buffer[1] = p[1]; - cipher_decrypt (cipher_hd, buffer+2, p+2, ndata-2); + gcry_cipher_decrypt (cipher_hd, buffer+2, ndata-2, + p+2, ndata-2); csum += checksum (buffer, ndata); - mpi_free (sk->skey[i]); - sk->skey[i] = mpi_read_from_buffer (buffer, &ndata, 1); + gcry_mpi_release (sk->skey[i]); + + err = gcry_mpi_scan( &sk->skey[i], GCRYMPI_FMT_USG, + buffer, ndata, &ndata ); xfree (buffer); - if (!sk->skey[i]) + if (err) { /* Checksum was okay, but not correctly decrypted. */ @@ -200,21 +225,23 @@ do_check( PKT_secret_key *sk, const char *tryagain_text, int mode, /* csum += checksum_mpi (sk->skey[i]); */ } } - cipher_close( cipher_hd ); - /* now let's see whether we have used the right passphrase */ + gcry_cipher_close ( cipher_hd ); + + /* Now let's see whether we have used the correct 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; + return gpg_error (GPG_ERR_BAD_PASSPHRASE); } - /* the checksum may fail, so we also check the key itself */ - res = pubkey_check_secret_key( sk->pubkey_algo, sk->skey ); + + /* The checksum may fail, so we also check the key itself. */ + res = pk_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; + return gpg_error (GPG_ERR_BAD_PASSPHRASE); } free_secret_key( save_sk ); sk->is_protected = 0; @@ -242,11 +269,11 @@ do_check( PKT_secret_key *sk, const char *tryagain_text, int mode, int check_secret_key( PKT_secret_key *sk, int n ) { - int rc = G10ERR_BAD_PASS; + int rc = gpg_error (GPG_ERR_BAD_PASSPHRASE); int i,mode; if (sk && sk->is_protected && sk->protect.s2k.mode == 1002) - return 0; /* Let the card support stuff handle this. */ + return 0; /* Let the scdaemon handle this. */ if(n<0) { @@ -259,7 +286,7 @@ check_secret_key( PKT_secret_key *sk, int n ) 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++ ) { + for(i=0; i < n && gpg_err_code (rc) == GPG_ERR_BAD_PASSPHRASE; i++ ) { int canceled = 0; const char *tryagain = NULL; if (i) { @@ -267,7 +294,8 @@ check_secret_key( PKT_secret_key *sk, int n ) log_info (_("%s ...\n"), _(tryagain)); } rc = do_check( sk, tryagain, mode, &canceled ); - if( rc == G10ERR_BAD_PASS && is_status_enabled() ) { + if ( gpg_err_code (rc) == GPG_ERR_BAD_PASSPHRASE + && is_status_enabled () ) { u32 kid[2]; char buf[50]; @@ -316,23 +344,30 @@ protect_secret_key( PKT_secret_key *sk, DEK *dek ) return 0; if( !sk->is_protected ) { /* okay, apply the protection */ - CIPHER_HANDLE cipher_hd=NULL; + gcry_cipher_hd_t cipher_hd=NULL; - if( check_cipher_algo( sk->protect.algo ) ) - rc = G10ERR_CIPHER_ALGO; /* unsupport protection algorithm */ + if ( openpgp_cipher_test_algo ( sk->protect.algo ) ) { + /* Unsupport protection algorithm. */ + rc = gpg_error (GPG_ERR_CIPHER_ALGO); + } 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 ) ) + + if ( gcry_cipher_open (&cipher_hd, sk->protect.algo, + GCRY_CIPHER_MODE_CFB, + (GCRY_CIPHER_SECURE + | (sk->protect.algo >= 100 ? + 0 : GCRY_CIPHER_ENABLE_SYNC))) ) + BUG(); + if ( gcry_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 ); + sk->protect.ivlen = gcry_cipher_get_algo_blklen (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 ); + gcry_create_nonce (sk->protect.iv, sk->protect.ivlen); + gcry_cipher_setiv (cipher_hd, sk->protect.iv, sk->protect.ivlen); if( sk->version >= 4 ) { byte *bufarr[PUBKEY_MAX_NSKEY]; unsigned narr[PUBKEY_MAX_NSKEY]; @@ -340,15 +375,20 @@ protect_secret_key( PKT_secret_key *sk, DEK *dek ) 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] ); + for (j=0, i = pubkey_get_npkey(sk->pubkey_algo); + i < pubkey_get_nskey(sk->pubkey_algo); i++, j++ ) + { + assert (!gcry_mpi_get_flag (sk->skey[i], + GCRYMPI_FLAG_OPAQUE)); + if (gcry_mpi_aprint (GCRYMPI_FMT_USG, bufarr+j, + narr+j, sk->skey[i])) + BUG(); + nbits[j] = gcry_mpi_get_nbits (sk->skey[i]); ndata += narr[j] + 2; - } - for( ; j < PUBKEY_MAX_NSKEY; j++ ) - bufarr[j] = NULL; + } + for ( ; j < PUBKEY_MAX_NSKEY; j++ ) + bufarr[j] = NULL; + ndata += opt.simple_sk_checksum? 2 : 20; /* for checksum */ data = xmalloc_secure( ndata ); @@ -372,27 +412,29 @@ protect_secret_key( PKT_secret_key *sk, DEK *dek ) 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); + gcry_md_hd_t h; + + if (gcry_md_open (&h, GCRY_MD_SHA1, 1)) + BUG(); /* Algo not available. */ + gcry_md_write (h, data, ndata - 20); + gcry_md_final (h); + memcpy (p, gcry_md_read (h, DIGEST_ALGO_SHA1), 20); p += 20; - md_close (h); + gcry_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] ); + gcry_cipher_encrypt (cipher_hd, data, ndata, NULL, 0); + for (i = pubkey_get_npkey(sk->pubkey_algo); + i < pubkey_get_nskey(sk->pubkey_algo); i++ ) + { + gcry_mpi_release (sk->skey[i]); sk->skey[i] = NULL; - } + } i = pubkey_get_npkey(sk->pubkey_algo); - sk->skey[i] = mpi_set_opaque(NULL, data, ndata ); + sk->skey[i] = gcry_mpi_set_opaque (NULL, data, ndata*8 ); } else { csum = 0; @@ -402,24 +444,31 @@ protect_secret_key( PKT_secret_key *sk, DEK *dek ) 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]); + + if (gcry_mpi_aprint (GCRYMPI_FMT_USG, &buffer, + &nbytes, sk->skey[i] )) + BUG(); + gcry_cipher_sync (cipher_hd); + assert (!gcry_mpi_get_flag (sk->skey[i], + GCRYMPI_FLAG_OPAQUE)); + + data = xmalloc (nbytes+2); /* fixme: need xtrymalloc. */ + nbits = gcry_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); + gcry_cipher_encrypt (cipher_hd, data+2, nbytes, + buffer, nbytes); xfree( buffer ); - mpi_free (sk->skey[i]); - sk->skey[i] = mpi_set_opaque (NULL, data, nbytes+2); + gcry_mpi_release (sk->skey[i]); + sk->skey[i] = gcry_mpi_set_opaque (NULL, + data, (nbytes+2)*8 ); } sk->csum = csum; } sk->is_protected = 1; - cipher_close( cipher_hd ); + gcry_cipher_close (cipher_hd); } } return rc; diff --git a/g10/seskey.c b/g10/seskey.c index dd4dc0b6d..2ef00869f 100644 --- a/g10/seskey.c +++ b/g10/seskey.c @@ -25,9 +25,10 @@ #include <stdlib.h> #include <string.h> #include <assert.h> + +#include "gpg.h" #include "util.h" #include "cipher.h" -#include "mpi.h" #include "main.h" #include "i18n.h" @@ -38,26 +39,33 @@ void make_session_key( DEK *dek ) { - CIPHER_HANDLE chd; + gcry_cipher_hd_t chd; int i, rc; - dek->keylen = cipher_get_keylen( dek->algo ) / 8; + dek->keylen = gcry_cipher_get_algo_keylen (dek->algo); - 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 ); + if (gcry_cipher_open (&chd, dek->algo, GCRY_CIPHER_MODE_CFB, + (GCRY_CIPHER_SECURE + | (dek->algo >= 100 ? + 0 : GCRY_CIPHER_ENABLE_SYNC))) ) + BUG(); + gcry_randomize (dek->key, dek->keylen, GCRY_STRONG_RANDOM ); + for (i=0; i < 16; i++ ) + { + rc = gcry_cipher_setkey (chd, dek->key, dek->keylen); + if (!rc) + { + gcry_cipher_close (chd); return; - } + } + if (gpg_err_code (rc) != GPG_ERR_WEAK_KEY) + BUG(); 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); + gcry_randomize (dek->key, dek->keylen, GCRY_STRONG_RANDOM); + } + log_fatal (_("cannot avoid weak key for symmetric cipher; " + "tried %d times!\n"), i); } @@ -66,17 +74,17 @@ make_session_key( DEK *dek ) * for packing the session key. * returns: A mpi with the session key (caller must free) */ -MPI -encode_session_key( DEK *dek, unsigned nbits ) +gcry_mpi_t +encode_session_key (DEK *dek, unsigned int nbits) { int nframe = (nbits+7) / 8; byte *p; byte *frame; int i,n; u16 csum; - MPI a; + gcry_mpi_t a; - /* the current limitation is that we can only use a session key + /* 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. */ @@ -107,8 +115,8 @@ encode_session_key( DEK *dek, unsigned nbits ) 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 */ + p = gcry_random_bytes_secure (i, GCRY_STRONG_RANDOM); + /* Replace zero bytes by new values. */ for(;;) { int j, k; byte *pp; @@ -120,7 +128,7 @@ encode_session_key( DEK *dek, unsigned nbits ) if( !k ) break; /* okay: no zero bytes */ k += k/128 + 3; /* better get some more */ - pp = get_random_bits( k*8, 1, 1); + pp = gcry_random_bytes_secure (k, GCRY_STRONG_RANDOM); for(j=0; j < i && k ;) { if( !p[j] ) p[j] = pp[--k]; @@ -138,21 +146,21 @@ encode_session_key( DEK *dek, unsigned nbits ) 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 ); + if (gcry_mpi_scan( &a, GCRYMPI_FMT_USG, frame, n, &nframe)) + BUG(); xfree(frame); return a; } -static MPI -do_encode_md( MD_HANDLE md, int algo, size_t len, unsigned nbits, +static gcry_mpi_t +do_encode_md( gcry_md_hd_t 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; + gcry_mpi_t a; if( len + asnlen + 4 > nframe ) log_bug("can't encode a %d bit MD into a %d bits frame\n", @@ -164,7 +172,7 @@ do_encode_md( MD_HANDLE md, int algo, size_t len, unsigned nbits, * * PAD consists of FF bytes. */ - frame = md_is_secure(md)? xmalloc_secure( nframe ) : xmalloc( nframe ); + frame = gcry_md_is_secure (md)? xmalloc_secure (nframe) : xmalloc (nframe); n = 0; frame[n++] = 0; frame[n++] = 1; /* block type */ @@ -173,12 +181,11 @@ do_encode_md( MD_HANDLE md, int algo, size_t len, unsigned nbits, 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; + memcpy( frame+n, gcry_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 ); + + if (gcry_mpi_scan( &a, GCRYMPI_FMT_USG, frame, n, &nframe )) + BUG(); xfree(frame); /* Note that PGP before version 2.3 encoded the MD as: @@ -200,20 +207,20 @@ do_encode_md( MD_HANDLE md, int algo, size_t len, unsigned nbits, * 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 ) +gcry_mpi_t +encode_md_value (PKT_public_key *pk, PKT_secret_key *sk, + gcry_md_hd_t md, int hash_algo) { - MPI frame; + gcry_mpi_t frame; assert(hash_algo); assert(pk || sk); - if((pk?pk->pubkey_algo:sk->pubkey_algo) == PUBKEY_ALGO_DSA) + if((pk?pk->pubkey_algo:sk->pubkey_algo) == GCRY_PK_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]); + size_t qbytes = gcry_mpi_get_nbits (pk?pk->pkey[1]:sk->skey[1]); /* Make sure it is a multiple of 8 bits. */ @@ -243,28 +250,34 @@ encode_md_value( PKT_public_key *pk, PKT_secret_key *sk, /* Check if we're too short. Too long is safe as we'll automatically left-truncate. */ - if(md_digest_length(hash_algo) < qbytes) + if(gcry_md_get_algo_dlen (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 ); + if (gcry_mpi_scan (&frame, GCRYMPI_FMT_USG, + gcry_md_read (md, hash_algo), qbytes, &qbytes)) + BUG(); } else { - const byte *asn; - size_t asnlen,mdlen; + gpg_error_t rc; + byte *asn; + size_t asnlen; - 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 ); + rc = gcry_md_algo_info (hash_algo, GCRYCTL_GET_ASNOID, NULL, &asnlen); + if (rc) + log_fatal ("can't get OID of algo %d: %s\n", + hash_algo, gpg_strerror (rc)); + asn = xmalloc (asnlen); + if ( gcry_md_algo_info (hash_algo, GCRYCTL_GET_ASNOID, asn, &asnlen) ) + BUG(); + frame = do_encode_md (md, hash_algo, gcry_md_get_algo_dlen (hash_algo), + gcry_mpi_get_nbits (pk?pk->pkey[0]:sk->skey[0]), + asn, asnlen); + xfree (asn); } return frame; diff --git a/g10/sig-check.c b/g10/sig-check.c index 15703346c..5a3cb886f 100644 --- a/g10/sig-check.c +++ b/g10/sig-check.c @@ -1,6 +1,6 @@ /* sig-check.c - Check a signature * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, - * 2004 Free Software Foundation, Inc. + * 2004, 2006 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -25,23 +25,29 @@ #include <stdlib.h> #include <string.h> #include <assert.h> + +#include "gpg.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" +#include "pkglue.h" -struct cmp_help_context_s { - PKT_signature *sig; - MD_HANDLE md; +/* Context used by the compare function. */ +struct cmp_help_context_s +{ + PKT_signature *sig; + gcry_md_hd_t md; }; -static int do_check( PKT_public_key *pk, PKT_signature *sig, MD_HANDLE digest, + + +static int do_check( PKT_public_key *pk, PKT_signature *sig, + gcry_md_hd_t digest, int *r_expired, int *r_revoked, PKT_public_key *ret_pk); /**************** @@ -50,23 +56,23 @@ static int do_check( PKT_public_key *pk, PKT_signature *sig, MD_HANDLE digest, * is able to append some data, before finalizing the digest. */ int -signature_check( PKT_signature *sig, MD_HANDLE digest ) +signature_check (PKT_signature *sig, gcry_md_hd_t digest) { return signature_check2( sig, digest, NULL, NULL, NULL, NULL ); } int -signature_check2( PKT_signature *sig, MD_HANDLE digest, u32 *r_expiredate, +signature_check2 (PKT_signature *sig, gcry_md_hd_t 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)) + if ( (rc=openpgp_md_test_algo(sig->digest_algo)) ) + ; /* We don't have this digest. */ + else if ((rc=openpgp_pk_test_algo(sig->pubkey_algo))) + ; /* We don't have this pubkey algo. */ + else if (!gcry_md_is_enabled (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 @@ -127,36 +133,40 @@ signature_check2( PKT_signature *sig, MD_HANDLE digest, u32 *r_expiredate, * 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; + gcry_md_hd_t 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]); + if (gcry_md_open (&md, GCRY_MD_RMD160, 0)) + BUG (); - 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); + /* FIXME: Why the hell are we updating DIGEST here??? */ + gcry_md_putc( digest, sig->pubkey_algo ); + gcry_md_putc( digest, sig->digest_algo ); + gcry_md_putc( digest, (a >> 24) & 0xff ); + gcry_md_putc( digest, (a >> 16) & 0xff ); + gcry_md_putc( digest, (a >> 8) & 0xff ); + gcry_md_putc( digest, a & 0xff ); + for(i=0; i < nsig; i++ ) { + size_t n; + unsigned char *tmp; + + if (gcry_mpi_aprint (GCRYMPI_FMT_USG, &tmp, &n, sig->data[i])) + BUG(); + gcry_md_write (md, tmp, n); + xfree (tmp); } - md_final( md ); - p = make_radix64_string( md_read( md, 0 ), 20 ); + gcry_md_final (md); + p = make_radix64_string ( gcry_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); + gcry_md_close(md); } return rc; @@ -220,47 +230,48 @@ do_check_messages( PKT_public_key *pk, PKT_signature *sig, static int -do_check( PKT_public_key *pk, PKT_signature *sig, MD_HANDLE digest, +do_check( PKT_public_key *pk, PKT_signature *sig, gcry_md_hd_t digest, int *r_expired, int *r_revoked, PKT_public_key *ret_pk ) { - MPI result = NULL; - int rc=0; + gcry_mpi_t 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 ); + /* Make sure the digest algo is enabled (in case of a detached + signature). */ + gcry_md_enable (digest, sig->digest_algo); - /* complete the digest */ + /* Complete the digest. */ if( sig->version >= 4 ) - md_putc( digest, sig->version ); - md_putc( digest, sig->sig_class ); + gcry_md_putc( digest, sig->version ); + gcry_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 ); + gcry_md_putc( digest, (a >> 24) & 0xff ); + gcry_md_putc( digest, (a >> 16) & 0xff ); + gcry_md_putc( digest, (a >> 8) & 0xff ); + gcry_md_putc( digest, a & 0xff ); } else { byte buf[6]; size_t n; - md_putc( digest, sig->pubkey_algo ); - md_putc( digest, sig->digest_algo ); + gcry_md_putc( digest, sig->pubkey_algo ); + gcry_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); + gcry_md_putc (digest, (n >> 8) ); + gcry_md_putc (digest, n ); + gcry_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); + gcry_md_putc (digest, 0); + gcry_md_putc (digest, 0); n = 6; } /* add some magic */ @@ -270,17 +281,17 @@ do_check( PKT_public_key *pk, PKT_signature *sig, MD_HANDLE digest, buf[3] = n >> 16; buf[4] = n >> 8; buf[5] = n; - md_write( digest, buf, 6 ); + gcry_md_write( digest, buf, 6 ); } - md_final( digest ); + gcry_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 ); + rc = pk_verify( pk->pubkey_algo, result, sig->data, pk->pkey ); + gcry_mpi_release (result); if( !rc && sig->flags.unknown_critical ) { @@ -296,8 +307,9 @@ do_check( PKT_public_key *pk, PKT_signature *sig, MD_HANDLE digest, } + static void -hash_uid_node( KBNODE unode, MD_HANDLE md, PKT_signature *sig ) +hash_uid_node( KBNODE unode, gcry_md_hd_t md, PKT_signature *sig ) { PKT_user_id *uid = unode->pkt->pkt.user_id; @@ -310,9 +322,9 @@ hash_uid_node( KBNODE unode, MD_HANDLE md, PKT_signature *sig ) buf[2] = uid->attrib_len >> 16; buf[3] = uid->attrib_len >> 8; buf[4] = uid->attrib_len; - md_write( md, buf, 5 ); + gcry_md_write( md, buf, 5 ); } - md_write( md, uid->attrib_data, uid->attrib_len ); + gcry_md_write( md, uid->attrib_data, uid->attrib_len ); } else { if( sig->version >=4 ) { @@ -322,9 +334,9 @@ hash_uid_node( KBNODE unode, MD_HANDLE md, PKT_signature *sig ) buf[2] = uid->len >> 16; buf[3] = uid->len >> 8; buf[4] = uid->len; - md_write( md, buf, 5 ); + gcry_md_write( md, buf, 5 ); } - md_write( md, uid->name, uid->len ); + gcry_md_write( md, uid->name, uid->len ); } } @@ -335,7 +347,7 @@ cache_sig_result ( PKT_signature *sig, int result ) sig->flags.checked = 1; sig->flags.valid = 1; } - else if ( result == G10ERR_BAD_SIGN ) { + else if ( gpg_err_code (result) == GPG_ERR_BAD_SIGNATURE ) { sig->flags.checked = 1; sig->flags.valid = 0; } @@ -397,9 +409,10 @@ check_revocation_keys(PKT_public_key *pk,PKT_signature *sig) if(keyid[0]==sig->keyid[0] && keyid[1]==sig->keyid[1]) { - MD_HANDLE md; + gcry_md_hd_t md; - md=md_open(sig->digest_algo,0); + if (gcry_md_open (&md, sig->digest_algo, 0)) + BUG (); hash_public_key(md,pk); rc=signature_check(sig,md); cache_sig_result(sig,rc); @@ -422,23 +435,24 @@ int check_backsig(PKT_public_key *main_pk,PKT_public_key *sub_pk, PKT_signature *backsig) { - MD_HANDLE md; + gcry_md_hd_t md; int rc; if(!opt.no_sig_cache && backsig->flags.checked) { - if((rc=check_digest_algo(backsig->digest_algo))) + if((rc=openpgp_md_test_algo (backsig->digest_algo))) return rc; - return backsig->flags.valid? 0 : G10ERR_BAD_SIGN; + return backsig->flags.valid? 0 : gpg_error (GPG_ERR_BAD_SIGNATURE); } - md=md_open(backsig->digest_algo,0); + if (gcry_md_open (&md, backsig->digest_algo,0)) + BUG (); 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); + gcry_md_close(md); return rc; } @@ -466,7 +480,7 @@ 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; + gcry_md_hd_t md; PKT_public_key *pk; PKT_signature *sig; int algo; @@ -502,13 +516,13 @@ check_key_signature2( KBNODE root, KBNODE node, PKT_public_key *check_pk, actual pk */ if((rc=do_check_messages(pk,sig,r_expired,NULL))) return rc; - return sig->flags.valid? 0 : G10ERR_BAD_SIGN; + return sig->flags.valid? 0 : gpg_error (GPG_ERR_BAD_SIGNATURE); } } - if( (rc=check_pubkey_algo(sig->pubkey_algo)) ) + if( (rc=openpgp_pk_test_algo(sig->pubkey_algo)) ) return rc; - if( (rc=check_digest_algo(algo)) ) + if( (rc=openpgp_md_test_algo(algo)) ) return rc; if( sig->sig_class == 0x20 ) { /* key revocation */ @@ -520,23 +534,25 @@ check_key_signature2( KBNODE root, KBNODE node, PKT_public_key *check_pk, rc=check_revocation_keys(pk,sig); else { - md = md_open( algo, 0 ); + if (gcry_md_open (&md, algo, 0 )) + BUG (); hash_public_key( md, pk ); rc = do_check( pk, sig, md, r_expired, NULL, ret_pk ); cache_sig_result ( sig, rc ); - md_close(md); + gcry_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 ); + if (gcry_md_open (&md, algo, 0)) + BUG (); 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); + gcry_md_close(md); } else { @@ -557,12 +573,13 @@ check_key_signature2( KBNODE root, KBNODE node, PKT_public_key *check_pk, if( keyid[0] == sig->keyid[0] && keyid[1] == sig->keyid[1] ) *is_selfsig = 1; } - md = md_open( algo, 0 ); + if (gcry_md_open (&md, algo, 0)) + BUG (); 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); + gcry_md_close(md); } else { @@ -573,11 +590,12 @@ check_key_signature2( KBNODE root, KBNODE node, PKT_public_key *check_pk, } } else if( sig->sig_class == 0x1f ) { /* direct key signature */ - md = md_open( algo, 0 ); + if (gcry_md_open (&md, algo, 0 )) + BUG (); hash_public_key( md, pk ); rc = do_check( pk, sig, md, r_expired, NULL, ret_pk ); cache_sig_result ( sig, rc ); - md_close(md); + gcry_md_close(md); } else { /* all other classes */ KBNODE unode = find_prev_kbnode( root, node, PKT_USER_ID ); @@ -586,7 +604,8 @@ check_key_signature2( KBNODE root, KBNODE node, PKT_public_key *check_pk, u32 keyid[2]; keyid_from_pk( pk, keyid ); - md = md_open( algo, 0 ); + if (gcry_md_open (&md, algo, 0 )) + BUG (); hash_public_key( md, pk ); hash_uid_node( unode, md, sig ); if( keyid[0] == sig->keyid[0] && keyid[1] == sig->keyid[1] ) @@ -601,7 +620,7 @@ check_key_signature2( KBNODE root, KBNODE node, PKT_public_key *check_pk, rc=signature_check2(sig,md,r_expiredate,r_expired,NULL,ret_pk); cache_sig_result ( sig, rc ); - md_close(md); + gcry_md_close(md); } else { diff --git a/g10/sign.c b/g10/sign.c index 82076d78d..7b6a81e10 100644 --- a/g10/sign.c +++ b/g10/sign.c @@ -28,12 +28,12 @@ #include <assert.h> #include <unistd.h> /* need sleep() */ +#include "gpg.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" @@ -41,7 +41,8 @@ #include "trustdb.h" #include "status.h" #include "i18n.h" -#include "cardglue.h" +#include "pkglue.h" +#include "call-agent.h" #ifdef HAVE_DOSISH_SYSTEM @@ -188,7 +189,7 @@ mk_notation_policy_etc( PKT_signature *sig, * Helper to hash a user ID packet. */ static void -hash_uid (MD_HANDLE md, int sigversion, const PKT_user_id *uid) +hash_uid (gcry_md_hd_t md, int sigversion, const PKT_user_id *uid) { if ( sigversion >= 4 ) { byte buf[5]; @@ -207,13 +208,13 @@ hash_uid (MD_HANDLE md, int sigversion, const PKT_user_id *uid) buf[3] = uid->len >> 8; buf[4] = uid->len; } - md_write( md, buf, 5 ); + gcry_md_write( md, buf, 5 ); } if(uid->attrib_data) - md_write (md, uid->attrib_data, uid->attrib_len ); + gcry_md_write (md, uid->attrib_data, uid->attrib_len ); else - md_write (md, uid->name, uid->len ); + gcry_md_write (md, uid->name, uid->len ); } @@ -221,34 +222,34 @@ hash_uid (MD_HANDLE md, int sigversion, const PKT_user_id *uid) * Helper to hash some parts from the signature */ static void -hash_sigversion_to_magic (MD_HANDLE md, const PKT_signature *sig) +hash_sigversion_to_magic (gcry_md_hd_t md, const PKT_signature *sig) { if (sig->version >= 4) - md_putc (md, sig->version); - md_putc (md, sig->sig_class); + gcry_md_putc (md, sig->version); + gcry_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 ); + gcry_md_putc (md, (a >> 24) & 0xff ); + gcry_md_putc (md, (a >> 16) & 0xff ); + gcry_md_putc (md, (a >> 8) & 0xff ); + gcry_md_putc (md, a & 0xff ); } else { byte buf[6]; size_t n; - md_putc (md, sig->pubkey_algo); - md_putc (md, sig->digest_algo); + gcry_md_putc (md, sig->pubkey_algo); + gcry_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 ); + gcry_md_putc (md, (n >> 8) ); + gcry_md_putc (md, n ); + gcry_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); + gcry_md_putc (md, 0); /* always hash the length of the subpacket*/ + gcry_md_putc (md, 0); n = 6; } /* add some magic */ @@ -258,16 +259,16 @@ hash_sigversion_to_magic (MD_HANDLE md, const PKT_signature *sig) buf[3] = n >> 16; buf[4] = n >> 8; buf[5] = n; - md_write (md, buf, 6); + gcry_md_write (md, buf, 6); } } static int do_sign( PKT_secret_key *sk, PKT_signature *sig, - MD_HANDLE md, int digest_algo ) + gcry_md_hd_t md, int digest_algo ) { - MPI frame; + gcry_mpi_t frame; byte *dp; int rc; @@ -285,10 +286,10 @@ do_sign( PKT_secret_key *sk, PKT_signature *sig, print_pubkey_algo_note(sk->pubkey_algo); if( !digest_algo ) - digest_algo = md_get_algo(md); + digest_algo = gcry_md_get_algo (md); print_digest_algo_note( digest_algo ); - dp = md_read( md, digest_algo ); + dp = gcry_md_read ( md, digest_algo ); sig->digest_algo = digest_algo; sig->digest_start[0] = dp[0]; sig->digest_start[1] = dp[1]; @@ -302,19 +303,19 @@ do_sign( PKT_secret_key *sk, PKT_signature *sig, 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), + gcry_md_read (md, digest_algo), + gcry_md_get_algo_dlen (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); + if (gcry_mpi_scan (&sig->data[0], GCRYMPI_FMT_USG, + rbuf, rbuflen, NULL)) + BUG (); xfree (rbuf); } #else - return G10ERR_UNSUPPORTED; + return gpg_error (GPG_ERR_NOT_SUPPORTED); #endif /* ENABLE_CARD_SUPPORT */ } else @@ -322,12 +323,12 @@ do_sign( PKT_secret_key *sk, PKT_signature *sig, 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); + rc = pk_sign( sk->pubkey_algo, sig->data, frame, sk->skey ); + gcry_mpi_release (frame); } if (!rc && !opt.no_sig_create_check) { - /* check that the signature verification worked and nothing is + /* 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); @@ -337,11 +338,10 @@ do_sign( PKT_secret_key *sk, PKT_signature *sig, else { frame = encode_md_value (pk, NULL, md, sig->digest_algo ); if (!frame) - rc = G10ERR_GENERAL; + rc = G10ERR_GENERAL; else - rc = pubkey_verify (pk->pubkey_algo, frame, - sig->data, pk->pkey ); - mpi_free (frame); + rc = pk_verify (pk->pubkey_algo, frame, sig->data, pk->pkey ); + gcry_mpi_release (frame); } if (rc) log_error (_("checking created signature failed: %s\n"), @@ -354,8 +354,8 @@ do_sign( PKT_secret_key *sk, PKT_signature *sig, 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), + gcry_pk_algo_name (sk->pubkey_algo), + gcry_md_algo_name (sig->digest_algo), ustr ); xfree(ustr); } @@ -365,7 +365,7 @@ do_sign( PKT_secret_key *sk, PKT_signature *sig, int -complete_sig( PKT_signature *sig, PKT_secret_key *sk, MD_HANDLE md ) +complete_sig( PKT_signature *sig, PKT_secret_key *sk, gcry_md_hd_t md ) { int rc=0; @@ -374,21 +374,24 @@ complete_sig( PKT_signature *sig, PKT_secret_key *sk, MD_HANDLE md ) return rc; } + + static int -match_dsa_hash(unsigned int qbytes) +match_dsa_hash (unsigned int qbytes) { - if(qbytes<=20) + if (qbytes <= 20) return DIGEST_ALGO_SHA1; #ifdef USE_SHA256 - if(qbytes<=28) + if (qbytes <= 28) return DIGEST_ALGO_SHA224; - if(qbytes<=32) + if (qbytes <= 32) return DIGEST_ALGO_SHA256; #endif + #ifdef USE_SHA512 - if(qbytes<=48) + if (qbytes <= 48) return DIGEST_ALGO_SHA384; - if(qbytes<=64) + if (qbytes <= 64) return DIGEST_ALGO_SHA512; #endif return DEFAULT_DIGEST_ALGO; @@ -410,7 +413,6 @@ match_dsa_hash(unsigned int qbytes) the signing key prefs either before or after using the personal list? */ - static int hash_for(PKT_secret_key *sk) { @@ -420,7 +422,7 @@ hash_for(PKT_secret_key *sk) return recipient_digest_algo; else if(sk->pubkey_algo==PUBKEY_ALGO_DSA) { - unsigned int qbytes=mpi_get_nbits(sk->skey[1])/8; + unsigned int qbytes = gcry_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 @@ -429,27 +431,27 @@ hash_for(PKT_secret_key *sk) (i.e. allow truncation). If q is not 160, by definition it must be a new DSA key. */ - if(opt.personal_digest_prefs) + if (opt.personal_digest_prefs) { prefitem_t *prefs; - if(qbytes!=20 || opt.flags.dsa2) + if (qbytes != 20 || opt.flags.dsa2) { - for(prefs=opt.personal_digest_prefs;prefs->type;prefs++) - if(md_digest_length(prefs->value)>=qbytes) + for (prefs=opt.personal_digest_prefs; prefs->type; prefs++) + if (gcry_md_get_algo_dlen (prefs->value) >= qbytes) return prefs->value; } else { - for(prefs=opt.personal_digest_prefs;prefs->type;prefs++) - if(md_digest_length(prefs->value)==qbytes) + for (prefs=opt.personal_digest_prefs; prefs->type; prefs++) + if (gcry_md_get_algo_dlen (prefs->value) == qbytes) return prefs->value; } } return match_dsa_hash(qbytes); } - else if(sk->is_protected && sk->protect.s2k.mode==1002) + 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 @@ -459,20 +461,20 @@ hash_for(PKT_secret_key *sk) { prefitem_t *prefs; - for(prefs=opt.personal_digest_prefs;prefs->type;prefs++) - if(prefs->value==DIGEST_ALGO_SHA1 - || prefs->value==DIGEST_ALGO_RMD160) + 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 ) + 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 ) + else if ( opt.personal_digest_prefs ) { /* It's not DSA, so we can use whatever the first hash algorithm is in the pref list */ @@ -482,6 +484,7 @@ hash_for(PKT_secret_key *sk) return DEFAULT_DIGEST_ALGO; } + static int only_old_style( SK_LIST sk_list ) { @@ -633,10 +636,9 @@ write_plaintext_packet (IOBUF out, IOBUF inp, const char *fname, int ptmode) 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; + if ( (rc=iobuf_write(out, copy_buffer, bytes_copied)) ) { log_error ("copying input to output failed: %s\n", - g10_errstr(rc)); + gpg_strerror (rc)); break; } wipememory(copy_buffer,4096); /* burn buffer */ @@ -651,7 +653,7 @@ write_plaintext_packet (IOBUF out, IOBUF inp, const char *fname, int ptmode) * hash which will not be changes here. */ static int -write_signature_packets (SK_LIST sk_list, IOBUF out, MD_HANDLE hash, +write_signature_packets (SK_LIST sk_list, IOBUF out, gcry_md_hd_t hash, int sigclass, u32 timestamp, u32 duration, int status_letter) { @@ -661,7 +663,7 @@ write_signature_packets (SK_LIST sk_list, IOBUF out, MD_HANDLE hash, for (sk_rover = sk_list; sk_rover; sk_rover = sk_rover->next) { PKT_secret_key *sk; PKT_signature *sig; - MD_HANDLE md; + gcry_md_hd_t md; int rc; sk = sk_rover->sk; @@ -686,18 +688,18 @@ write_signature_packets (SK_LIST sk_list, IOBUF out, MD_HANDLE hash, sig->expiredate = sig->timestamp+duration; sig->sig_class = sigclass; - md = md_copy (hash); + if (gcry_md_copy (&md, hash)) + BUG (); 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); + gcry_md_final (md); rc = do_sign( sk, sig, md, hash_for (sk) ); - md_close (md); - + gcry_md_close (md); if( !rc ) { /* and write it */ PACKET pkt; @@ -804,11 +806,12 @@ sign_file( STRLIST filenames, int detached, STRLIST locusr, 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( !inp ) + { + rc = gpg_error_from_errno (errno); + log_error (_("can't open `%s': %s\n"), fname? fname: "[stdin]", + strerror(errno) ); + goto leave; } handle_progress (&pfx, inp, fname); @@ -823,8 +826,8 @@ sign_file( STRLIST filenames, int detached, STRLIST locusr, out = iobuf_create( outfile ); if( !out ) { + rc = gpg_error_from_errno (errno); log_error(_("can't create `%s': %s\n"), outfile, strerror(errno) ); - rc = G10ERR_CREATE_FILE; goto leave; } else if( opt.verbose ) @@ -840,9 +843,10 @@ sign_file( STRLIST filenames, int detached, STRLIST locusr, iobuf_push_filter( inp, text_filter, &tfx ); } - mfx.md = md_open(0, 0); + if ( gcry_md_open (&mfx.md, 0, 0) ) + BUG (); if (DBG_HASHING) - md_start_debug (mfx.md, "sign"); + gcry_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 @@ -861,15 +865,15 @@ sign_file( STRLIST filenames, int detached, STRLIST locusr, 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); + gcry_md_algo_name (opt.def_digest_algo), + opt.def_digest_algo ); } else { + int algo, smartcard=0; union pref_hint hint; - int algo,smartcard=0; - hint.digest_length=0; + hint.digest_length = 0; /* Of course, if the recipient asks for something unreasonable (like the wrong hash for a DSA key) then @@ -888,21 +892,22 @@ sign_file( STRLIST filenames, int detached, STRLIST locusr, usable on an implementation that doesn't understand DSA2 anyway. */ - for( sk_rover = sk_list; sk_rover; sk_rover = sk_rover->next ) + for (sk_rover = sk_list; sk_rover; sk_rover = sk_rover->next ) { - if(sk_rover->sk->pubkey_algo==PUBKEY_ALGO_DSA) + if (sk_rover->sk->pubkey_algo == PUBKEY_ALGO_DSA) { - int temp_hashlen=mpi_get_nbits(sk_rover->sk->skey[1])/8; + int temp_hashlen = gcry_mpi_get_nbits + (sk_rover->sk->skey[1])+7/8; /* Pick a hash that is large enough for our largest q */ - if(hint.digest_length<temp_hashlen) + 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; + 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 @@ -912,16 +917,16 @@ sign_file( STRLIST filenames, int detached, STRLIST locusr, 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) + 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)); + gcry_md_enable (mfx.md, hash_for(sk)); } if( !multifile ) @@ -998,9 +1003,9 @@ sign_file( STRLIST filenames, int detached, STRLIST locusr, } if( !inp ) { + rc = gpg_error_from_errno (errno); log_error(_("can't open `%s': %s\n"), sl->d,strerror(errno)); - rc = G10ERR_OPEN_FILE; goto leave; } handle_progress (&pfx, inp, sl->d); @@ -1051,7 +1056,7 @@ sign_file( STRLIST filenames, int detached, STRLIST locusr, write_status( STATUS_END_ENCRYPTION ); } iobuf_close(inp); - md_close( mfx.md ); + gcry_md_close ( mfx.md ); release_sk_list( sk_list ); release_pk_list( pk_list ); recipient_digest_algo=0; @@ -1068,7 +1073,7 @@ clearsign_file( const char *fname, STRLIST locusr, const char *outfile ) { armor_filter_context_t afx; progress_filter_context_t pfx; - MD_HANDLE textmd = NULL; + gcry_md_hd_t textmd = NULL; IOBUF inp = NULL, out = NULL; PACKET pkt; int rc = 0; @@ -1111,9 +1116,9 @@ clearsign_file( const char *fname, STRLIST locusr, const char *outfile ) errno = EPERM; } if( !inp ) { - log_error(_("can't open `%s': %s\n"), fname? fname: "[stdin]", - strerror(errno) ); - rc = G10ERR_OPEN_FILE; + rc = gpg_error_from_errno (errno); + log_error (_("can't open `%s': %s\n"), + fname? fname: "[stdin]", strerror(errno) ); goto leave; } handle_progress (&pfx, inp, fname); @@ -1127,8 +1132,8 @@ clearsign_file( const char *fname, STRLIST locusr, const char *outfile ) out = iobuf_create( outfile ); if( !out ) { + rc = gpg_error_from_errno (errno); log_error(_("can't create `%s': %s\n"), outfile, strerror(errno) ); - rc = G10ERR_CREATE_FILE; goto leave; } else if( opt.verbose ) @@ -1161,7 +1166,7 @@ clearsign_file( const char *fname, STRLIST locusr, const char *outfile ) int i = hash_for(sk); if( !hashs_seen[ i & 0xff ] ) { - s = digest_algo_to_string( i ); + s = gcry_md_algo_name ( i ); if( s ) { hashs_seen[ i & 0xff ] = 1; if( any ) @@ -1180,13 +1185,15 @@ clearsign_file( const char *fname, STRLIST locusr, const char *outfile ) "NotDashEscaped: You need GnuPG to verify this message" LF ); iobuf_writestr(out, LF ); - textmd = md_open(0, 0); + if ( gcry_md_open (&textmd, 0, 0) ) + BUG (); 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)); + gcry_md_enable (textmd, hash_for(sk)); } if ( DBG_HASHING ) - md_start_debug( textmd, "clearsign" ); + gcry_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 */ @@ -1206,7 +1213,7 @@ clearsign_file( const char *fname, STRLIST locusr, const char *outfile ) else iobuf_close(out); iobuf_close(inp); - md_close( textmd ); + gcry_md_close ( textmd ); release_sk_list( sk_list ); return rc; } @@ -1261,9 +1268,9 @@ sign_symencrypt_file (const char *fname, STRLIST locusr) errno = EPERM; } if( !inp ) { - log_error(_("can't open `%s': %s\n"), - fname? fname: "[stdin]", strerror(errno) ); - rc = G10ERR_OPEN_FILE; + rc = gpg_error_from_errno (errno); + log_error (_("can't open `%s': %s\n"), + fname? fname: "[stdin]", strerror(errno) ); goto leave; } handle_progress (&pfx, inp, fname); @@ -1276,12 +1283,12 @@ sign_symencrypt_file (const char *fname, STRLIST locusr) algo = default_cipher_algo(); if (!opt.quiet || !opt.batch) log_info (_("%s encryption will be used\n"), - cipher_algo_to_string(algo) ); + gcry_cipher_algo_name (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) ); + rc = gpg_error (GPG_ERR_BAD_PASSPHRASE); + log_error(_("error creating passphrase: %s\n"), gpg_strerror (rc) ); goto leave; } @@ -1300,13 +1307,14 @@ sign_symencrypt_file (const char *fname, STRLIST locusr) /* 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 ( gcry_md_open (&mfx.md, 0, 0) ) + BUG (); if ( DBG_HASHING ) - md_start_debug (mfx.md, "symc-sign"); + gcry_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)); + gcry_md_enable (mfx.md, hash_for (sk)); } iobuf_push_filter (inp, md_filter, &mfx); @@ -1371,7 +1379,7 @@ sign_symencrypt_file (const char *fname, STRLIST locusr) } iobuf_close(inp); release_sk_list( sk_list ); - md_close( mfx.md ); + gcry_md_close( mfx.md ); xfree(cfx.dek); xfree(s2k); return rc; @@ -1398,7 +1406,7 @@ make_keysig_packet( PKT_signature **ret_sig, PKT_public_key *pk, { PKT_signature *sig; int rc=0; - MD_HANDLE md; + gcry_md_hd_t md; assert( (sigclass >= 0x10 && sigclass <= 0x13) || sigclass == 0x1F || sigclass == 0x20 || sigclass == 0x18 || sigclass == 0x19 @@ -1435,14 +1443,15 @@ make_keysig_packet( PKT_signature **ret_sig, PKT_public_key *pk, && 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); + digest_algo = match_dsa_hash (gcry_mpi_get_nbits (sk->skey[1])/8); else digest_algo = DIGEST_ALGO_SHA1; } - md = md_open( digest_algo, 0 ); + if ( gcry_md_open (&md, digest_algo, 0 ) ) + BUG (); - /* hash the public key certificate */ + /* Hash the public key certificate. */ hash_public_key( md, pk ); if( sigclass == 0x18 || sigclass == 0x19 || sigclass == 0x28 ) @@ -1482,12 +1491,12 @@ make_keysig_packet( PKT_signature **ret_sig, PKT_public_key *pk, if( !rc ) { hash_sigversion_to_magic (md, sig); - md_final(md); + gcry_md_final (md); rc = complete_sig( sig, sk, md ); } - md_close( md ); + gcry_md_close ( md ); if( rc ) free_seckey_enc( sig ); else @@ -1514,16 +1523,17 @@ update_keysig_packet( PKT_signature **ret_sig, { PKT_signature *sig; int rc=0; - MD_HANDLE md; + gcry_md_hd_t 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 ); + if ( gcry_md_open (&md, orig_sig->digest_algo, 0 ) ) + BUG (); - /* hash the public key certificate and the user id */ + /* Hash the public key certificate and the user id. */ hash_public_key( md, pk ); if( orig_sig->sig_class == 0x18 ) @@ -1564,12 +1574,12 @@ update_keysig_packet( PKT_signature **ret_sig, if (!rc) { hash_sigversion_to_magic (md, sig); - md_final(md); + gcry_md_final (md); rc = complete_sig( sig, sk, md ); } - md_close (md); + gcry_md_close (md); if( rc ) free_seckey_enc (sig); else diff --git a/g10/signal.c b/g10/signal.c index 2e40af13a..aaeb89841 100644 --- a/g10/signal.c +++ b/g10/signal.c @@ -33,9 +33,9 @@ #include <readline/history.h> #endif +#include "gpg.h" #include "options.h" #include "errors.h" -#include "memory.h" #include "util.h" #include "main.h" #include "ttyio.h" @@ -84,7 +84,7 @@ got_fatal_signal( int sig ) raise( sig ); caught_fatal_sig = 1; - secmem_term(); + gcry_control (GCRYCTL_TERM_SECMEM ); #ifdef HAVE_LIBREADLINE rl_free_line_state (); @@ -113,7 +113,7 @@ got_fatal_signal( int sig ) /* Reset action to default action and raise signal again. */ init_one_signal (sig, SIG_DFL, 0); - remove_lockfiles (); + dotlock_remove_lockfiles (); #ifdef __riscos__ riscos_close_fds (); #endif /* __riscos__ */ diff --git a/g10/skclist.c b/g10/skclist.c index 21db10c6e..d8f3b2dc1 100644 --- a/g10/skclist.c +++ b/g10/skclist.c @@ -1,5 +1,5 @@ -/* skclist.c - * Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. +/* skclist.c - Build a list of secret keys + * Copyright (C) 1998, 1999, 2000, 2001, 2006 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -26,16 +26,29 @@ #include <errno.h> #include <assert.h> +#include "gpg.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" +/* There is currently no way to get the status of the quick random + generator flag from libgcrypt and it is not clear whether this + faked RNG is really a good idea. Thus for now we use this stub + function but we should consider to entirely remove this fake RNG + stuff. */ +static int +random_is_faked (void) +{ + return 0; +} + + + void release_sk_list( SK_LIST sk_list ) { @@ -118,7 +131,7 @@ build_sk_list( STRLIST locusr, SK_LIST *ret_sk_list, 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)) ) + else if( !(rc=openpgp_pk_test_algo2 (sk->pubkey_algo, use)) ) { SK_LIST r; @@ -176,7 +189,7 @@ build_sk_list( STRLIST locusr, SK_LIST *ret_sk_list, log_error(_("skipped \"%s\": %s\n"), locusr->d, g10_errstr(rc) ); } - else if( !(rc=check_pubkey_algo2(sk->pubkey_algo, use)) ) { + else if( !(rc=openpgp_pk_test_algo2 (sk->pubkey_algo, use)) ) { SK_LIST r; if( sk->version == 4 && (use & PUBKEY_USAGE_SIG) diff --git a/g10/status.c b/g10/status.c index 204482008..2098d6738 100644 --- a/g10/status.c +++ b/g10/status.c @@ -1,6 +1,6 @@ -/* status.c +/* status.c - Status message and command-fd interface * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, - * 2004, 2005 Free Software Foundation, Inc. + * 2004, 2005, 2006 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -27,21 +27,8 @@ #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 "gpg.h" #include "util.h" #include "status.h" #include "ttyio.h" @@ -56,13 +43,6 @@ 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 ) @@ -229,9 +209,10 @@ set_status_fd ( int fd ) 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" ); +#warning Use libgrypt calls for progress indicators +/* register_primegen_progress ( progress_cb, "primegen" ); */ +/* register_pk_dsa_progress ( progress_cb, "pk_dsa" ); */ +/* register_pk_elg_progress ( progress_cb, "pk_elg" ); */ } int @@ -342,178 +323,6 @@ write_status_buffer ( int no, const char *buffer, size_t len, int 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) diff --git a/g10/status.h b/g10/status.h index bc7271dc9..b5dbe7480 100644 --- a/g10/status.h +++ b/g10/status.h @@ -131,10 +131,6 @@ void write_status_buffer ( int no, 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 ); diff --git a/g10/tdbdump.c b/g10/tdbdump.c index 09ce11949..d840c0882 100644 --- a/g10/tdbdump.c +++ b/g10/tdbdump.c @@ -31,10 +31,10 @@ #include <fcntl.h> #include <unistd.h> +#include "gpg.h" #include "errors.h" #include "iobuf.h" #include "keydb.h" -#include "memory.h" #include "util.h" #include "trustdb.h" #include "options.h" diff --git a/g10/tdbio.c b/g10/tdbio.c index fbd569dd2..11e3bb3fd 100644 --- a/g10/tdbio.c +++ b/g10/tdbio.c @@ -1,4 +1,4 @@ -/* tdbio.c +/* tdbio.c - trust databse I/O operations * Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. * * This file is part of GnuPG. @@ -30,9 +30,9 @@ #include <fcntl.h> #include <unistd.h> +#include "gpg.h" #include "errors.h" #include "iobuf.h" -#include "memory.h" #include "util.h" #include "options.h" #include "main.h" @@ -94,7 +94,6 @@ static int db_fd = -1; static int in_transaction; static void open_db(void); -static void migrate_from_v2 (void); @@ -123,18 +122,21 @@ get_record_from_cache( ulong recno ) static int write_cache_item( CACHE_CTRL r ) { + gpg_error_t err; int n; if( lseek( db_fd, r->recno * TRUST_RECORD_LEN, SEEK_SET ) == -1 ) { + err = gpg_error_from_errno (errno); log_error(_("trustdb rec %lu: lseek failed: %s\n"), r->recno, strerror(errno) ); - return G10ERR_WRITE_FILE; + return err; } n = write( db_fd, r->data, TRUST_RECORD_LEN); if( n != TRUST_RECORD_LEN ) { + err = gpg_error_from_errno (errno); log_error(_("trustdb rec %lu: write failed (n=%d): %s\n"), r->recno, n, strerror(errno) ); - return G10ERR_WRITE_FILE; + return err; } r->flags.dirty = 0; return 0; @@ -577,8 +579,6 @@ tdbio_get_dbname() static void open_db() { - byte buf[10]; - int n; TRUSTREC rec; assert( db_fd == -1 ); @@ -605,16 +605,7 @@ open_db() 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 */ + /* Read the version record. */ if (tdbio_read_record (0, &rec, RECTYPE_VER ) ) log_fatal( _("%s: invalid trustdb\n"), db_name ); } @@ -1163,7 +1154,7 @@ tdbio_read_record( ulong recnum, TRUSTREC *rec, int expected ) { byte readbuf[TRUST_RECORD_LEN]; const byte *buf, *p; - int rc = 0; + gpg_error_t err = 0; int n, i; if( db_fd == -1 ) @@ -1171,17 +1162,19 @@ tdbio_read_record( ulong recnum, TRUSTREC *rec, int expected ) buf = get_record_from_cache( recnum ); if( !buf ) { if( lseek( db_fd, recnum * TRUST_RECORD_LEN, SEEK_SET ) == -1 ) { + err = gpg_error_from_errno (errno); log_error(_("trustdb: lseek failed: %s\n"), strerror(errno) ); - return G10ERR_READ_FILE; + return err; } n = read( db_fd, readbuf, TRUST_RECORD_LEN); if( !n ) { return -1; /* eof */ } else if( n != TRUST_RECORD_LEN ) { + err = gpg_error_from_errno (errno); log_error(_("trustdb: read failed (n=%d): %s\n"), n, strerror(errno) ); - return G10ERR_READ_FILE; + return err; } buf = readbuf; } @@ -1192,7 +1185,7 @@ tdbio_read_record( ulong recnum, TRUSTREC *rec, int expected ) if( expected && rec->rectype != expected ) { log_error("%lu: read expected rec type %d, got %d\n", recnum, expected, rec->rectype ); - return G10ERR_TRUSTDB; + return gpg_error (GPG_ERR_TRUSTDB); } p++; /* skip reserved byte */ switch( rec->rectype ) { @@ -1201,7 +1194,7 @@ tdbio_read_record( ulong recnum, TRUSTREC *rec, int expected ) case RECTYPE_VER: /* version record */ if( memcmp(buf+1, "gpg", 3 ) ) { log_error( _("%s: not a trustdb file\n"), db_name ); - rc = G10ERR_TRUSTDB; + err = gpg_error (GPG_ERR_TRUSTDB); } p += 2; /* skip "gpg" */ rec->r.ver.version = *p++; @@ -1220,12 +1213,12 @@ tdbio_read_record( ulong recnum, TRUSTREC *rec, int expected ) if( recnum ) { log_error( _("%s: version record with recnum %lu\n"), db_name, (ulong)recnum ); - rc = G10ERR_TRUSTDB; + err = gpg_error (GPG_ERR_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; + err = gpg_error (GPG_ERR_TRUSTDB); } break; case RECTYPE_FREE: @@ -1260,11 +1253,11 @@ tdbio_read_record( ulong recnum, TRUSTREC *rec, int expected ) default: log_error( "%s: invalid record type %d at recnum %lu\n", db_name, rec->rectype, (ulong)recnum ); - rc = G10ERR_TRUSTDB; + err = gpg_error (GPG_ERR_TRUSTDB); break; } - return rc; + return err; } /**************** @@ -1442,16 +1435,16 @@ tdbio_new_recnum() rec.recnum = recnum; rc = 0; if( lseek( db_fd, recnum * TRUST_RECORD_LEN, SEEK_SET ) == -1 ) { + rc = gpg_error_from_errno (errno); 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 ) { + rc = gpg_error_from_errno (errno); log_error(_("trustdb rec %lu: write failed (n=%d): %s\n"), recnum, n, strerror(errno) ); - rc = G10ERR_WRITE_FILE; } } @@ -1505,129 +1498,3 @@ tdbio_invalid(void) 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/textfilter.c b/g10/textfilter.c index 8665a7200..daa57de0a 100644 --- a/g10/textfilter.c +++ b/g10/textfilter.c @@ -26,9 +26,9 @@ #include <errno.h> #include <assert.h> +#include "gpg.h" #include "errors.h" #include "iobuf.h" -#include "memory.h" #include "util.h" #include "filter.h" #include "i18n.h" @@ -162,13 +162,13 @@ text_filter( void *opaque, int control, * md is updated as required by rfc2440 */ int -copy_clearsig_text( IOBUF out, IOBUF inp, MD_HANDLE md, +copy_clearsig_text( IOBUF out, IOBUF inp, gcry_md_hd_t md, int escape_dash, int escape_from, int pgp2mode ) { - unsigned maxlen; + unsigned int maxlen; byte *buffer = NULL; /* malloced buffer */ - unsigned bufsize; /* and size of this buffer */ - unsigned n; + unsigned int bufsize; /* and size of this buffer */ + unsigned int n; int truncated = 0; int pending_lf = 0; @@ -192,15 +192,16 @@ copy_clearsig_text( IOBUF out, IOBUF inp, MD_HANDLE md, /* update the message digest */ if( escape_dash ) { if( pending_lf ) { - md_putc( md, '\r' ); - md_putc( md, '\n' ); + gcry_md_putc ( md, '\r' ); + gcry_md_putc ( md, '\n' ); } - md_write( md, buffer, - len_without_trailing_chars( buffer, n, - pgp2mode? " \r\n":" \t\r\n")); + gcry_md_write ( md, buffer, + len_without_trailing_chars (buffer, n, + pgp2mode? + " \r\n":" \t\r\n")); } else - md_write( md, buffer, n ); + gcry_md_write ( md, buffer, n ); pending_lf = buffer[n-1] == '\n'; /* write the output */ @@ -241,7 +242,7 @@ copy_clearsig_text( IOBUF out, IOBUF inp, MD_HANDLE md, if( !pending_lf ) { /* make sure that the file ends with a LF */ iobuf_writestr( out, LF ); if( !escape_dash ) - md_putc( md, '\n' ); + gcry_md_putc( md, '\n' ); } if( truncated ) diff --git a/g10/trustdb.c b/g10/trustdb.c index e372bf8fb..573c12903 100644 --- a/g10/trustdb.c +++ b/g10/trustdb.c @@ -35,10 +35,10 @@ #endif #endif /* !DISABLE_REGEX */ +#include "gpg.h" #include "errors.h" #include "iobuf.h" #include "keydb.h" -#include "memory.h" #include "util.h" #include "options.h" #include "packet.h" diff --git a/g10/verify.c b/g10/verify.c index 082db89de..54aa76544 100644 --- a/g10/verify.c +++ b/g10/verify.c @@ -1,4 +1,4 @@ -/* verify.c - verify signed data +/* verify.c - Verify signed data * Copyright (C) 1998, 1999, 2000, 2001, 2004 Free Software Foundation, Inc. * * This file is part of GnuPG. @@ -25,14 +25,13 @@ #include <string.h> #include <errno.h> #include <assert.h> -#include <unistd.h> /* for isatty() */ +#include "gpg.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" @@ -99,8 +98,10 @@ verify_signatures( int nfiles, char **files ) errno = EPERM; } if( !fp ) { - log_error(_("can't open `%s'\n"), print_fname_stdin(sigfile)); - return G10ERR_OPEN_FILE; + rc = gpg_error_from_errno (errno); + log_error(_("can't open `%s': %s\n"), + print_fname_stdin(sigfile), strerror (errno)); + return rc; } handle_progress (&pfx, fp, sigfile); @@ -153,9 +154,11 @@ verify_one_file( const char *name ) errno = EPERM; } if( !fp ) { + rc = gpg_error_from_errno (errno); + log_error(_("can't open `%s': %s\n"), + print_fname_stdin(name), strerror (errno)); print_file_status( STATUS_FILE_ERROR, name, 1 ); - log_error(_("can't open `%s'\n"), print_fname_stdin(name)); - return G10ERR_OPEN_FILE; + return rc; } handle_progress (&pfx, fp, name); @@ -197,15 +200,12 @@ verify_files( int nfiles, char **files ) * 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++ ) { + 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/gl/Makefile.am b/gl/Makefile.am new file mode 100644 index 000000000..be8e6a5b6 --- /dev/null +++ b/gl/Makefile.am @@ -0,0 +1,93 @@ +## Process this file with automake to produce Makefile.in. +# Copyright (C) 2004 Free Software Foundation, Inc. +# +# 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 Automake, under +# the same distribution terms as the rest of that program. +# +# Generated by gnulib-tool. +# Invoked as: gnulib-tool --import +# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=gl --m4-base=gl/m4 --aux-dir=scripts alloca-opt allocsa mkdtemp setenv strpbrk strsep vasnprintf vasprintf xsize + +AUTOMAKE_OPTIONS = 1.5 gnits no-dependencies + +noinst_LIBRARIES = libgnu.a + +libgnu_a_SOURCES = +libgnu_a_LIBADD = @LIBOBJS@ +EXTRA_DIST = +BUILT_SOURCES = +SUFFIXES = +MOSTLYCLEANFILES = +CLEANFILES = +DISTCLEANFILES = +MAINTAINERCLEANFILES = + +## begin gnulib module alloca-opt + +BUILT_SOURCES += $(ALLOCA_H) +EXTRA_DIST += alloca_.h + +# We need the following in order to create an <alloca.h> when the system +# doesn't have one that works with the given compiler. +all-local $(libgnu_a_OBJECTS): $(ALLOCA_H) +alloca.h: alloca_.h + cp $(srcdir)/alloca_.h $@-t + mv $@-t $@ +MOSTLYCLEANFILES += alloca.h alloca.h-t + +## end gnulib module alloca-opt + +## begin gnulib module allocsa + +libgnu_a_SOURCES += allocsa.h allocsa.c +EXTRA_DIST += allocsa.valgrind + +## end gnulib module allocsa + +## begin gnulib module mkdtemp + +libgnu_a_SOURCES += mkdtemp.h + +## end gnulib module mkdtemp + +## begin gnulib module setenv + +libgnu_a_SOURCES += setenv.h + +## end gnulib module setenv + +## begin gnulib module strpbrk + +libgnu_a_SOURCES += strpbrk.h + +## end gnulib module strpbrk + +## begin gnulib module strsep + +libgnu_a_SOURCES += strsep.h + +## end gnulib module strsep + +## begin gnulib module vasnprintf + +libgnu_a_SOURCES += printf-args.h printf-parse.h vasnprintf.h + +## end gnulib module vasnprintf + +## begin gnulib module vasprintf + +libgnu_a_SOURCES += vasprintf.h + +## end gnulib module vasprintf + +## begin gnulib module xsize + +libgnu_a_SOURCES += xsize.h + +## end gnulib module xsize + + +# Makefile.am ends here diff --git a/gl/alloca_.h b/gl/alloca_.h new file mode 100644 index 000000000..3e3fdf43f --- /dev/null +++ b/gl/alloca_.h @@ -0,0 +1,52 @@ +/* Memory allocation on the stack. + + Copyright (C) 1995, 1999, 2001, 2002, 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. */ + +/* Avoid using the symbol _ALLOCA_H here, as Bison assumes _ALLOCA_H + means there is a real alloca function. */ +#ifndef _GNULIB_ALLOCA_H +# define _GNULIB_ALLOCA_H + +/* alloca (N) returns a pointer to N bytes of memory + allocated on the stack, which will last until the function returns. + Use of alloca should be avoided: + - inside arguments of function calls - undefined behaviour, + - in inline functions - the allocation may actually last until the + calling function returns, + - for huge N (say, N >= 65536) - you never know how large (or small) + the stack is, and when the stack cannot fulfill the memory allocation + request, the program just crashes. + */ + +#ifdef __GNUC__ +# define alloca __builtin_alloca +#elif defined _AIX +# define alloca __alloca +#elif defined _MSC_VER +# include <malloc.h> +# define alloca _alloca +#else +# include <stddef.h> +# ifdef __cplusplus +extern "C" +# endif +void *alloca (size_t); +#endif + +#endif /* _GNULIB_ALLOCA_H */ diff --git a/gl/allocsa.c b/gl/allocsa.c new file mode 100644 index 000000000..a54e2d0ca --- /dev/null +++ b/gl/allocsa.c @@ -0,0 +1,139 @@ +/* Safe automatic memory allocation. + 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 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. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +/* Specification. */ +#include "allocsa.h" + +/* The speed critical point in this file is freesa() applied to an alloca() + result: it must be fast, to match the speed of alloca(). The speed of + mallocsa() and freesa() in the other case are not critical, because they + are only invoked for big memory sizes. */ + +#if HAVE_ALLOCA + +/* Store the mallocsa() results in a hash table. This is needed to reliably + distinguish a mallocsa() result and an alloca() result. + + Although it is possible that the same pointer is returned by alloca() and + by mallocsa() at different times in the same application, it does not lead + to a bug in freesa(), because: + - Before a pointer returned by alloca() can point into malloc()ed memory, + the function must return, and once this has happened the programmer must + not call freesa() on it anyway. + - Before a pointer returned by mallocsa() can point into the stack, it + must be freed. The only function that can free it is freesa(), and + when freesa() frees it, it also removes it from the hash table. */ + +#define MAGIC_NUMBER 0x1415fb4a +#define MAGIC_SIZE sizeof (int) +/* This is how the header info would look like without any alignment + considerations. */ +struct preliminary_header { void *next; char room[MAGIC_SIZE]; }; +/* But the header's size must be a multiple of sa_alignment_max. */ +#define HEADER_SIZE \ + (((sizeof (struct preliminary_header) + sa_alignment_max - 1) / sa_alignment_max) * sa_alignment_max) +struct header { void *next; char room[HEADER_SIZE - sizeof (struct preliminary_header) + MAGIC_SIZE]; }; +/* Verify that HEADER_SIZE == sizeof (struct header). */ +typedef int verify1[2 * (HEADER_SIZE == sizeof (struct header)) - 1]; +/* We make the hash table quite big, so that during lookups the probability + of empty hash buckets is quite high. There is no need to make the hash + table resizable, because when the hash table gets filled so much that the + lookup becomes slow, it means that the application has memory leaks. */ +#define HASH_TABLE_SIZE 257 +static void * mallocsa_results[HASH_TABLE_SIZE]; + +#endif + +void * +mallocsa (size_t n) +{ +#if HAVE_ALLOCA + /* Allocate one more word, that serves as an indicator for malloc()ed + memory, so that freesa() of an alloca() result is fast. */ + size_t nplus = n + HEADER_SIZE; + + if (nplus >= n) + { + char *p = (char *) malloc (nplus); + + if (p != NULL) + { + size_t slot; + + p += HEADER_SIZE; + + /* Put a magic number into the indicator word. */ + ((int *) p)[-1] = MAGIC_NUMBER; + + /* Enter p into the hash table. */ + slot = (unsigned long) p % HASH_TABLE_SIZE; + ((struct header *) (p - HEADER_SIZE))->next = mallocsa_results[slot]; + mallocsa_results[slot] = p; + + return p; + } + } + /* Out of memory. */ + return NULL; +#else +# if !MALLOC_0_IS_NONNULL + if (n == 0) + n = 1; +# endif + return malloc (n); +#endif +} + +#if HAVE_ALLOCA +void +freesa (void *p) +{ + /* mallocsa() may have returned NULL. */ + if (p != NULL) + { + /* Attempt to quickly distinguish the mallocsa() result - which has + a magic indicator word - and the alloca() result - which has an + uninitialized indicator word. It is for this test that sa_increment + additional bytes are allocated in the alloca() case. */ + if (((int *) p)[-1] == MAGIC_NUMBER) + { + /* Looks like a mallocsa() result. To see whether it really is one, + perform a lookup in the hash table. */ + size_t slot = (unsigned long) p % HASH_TABLE_SIZE; + void **chain = &mallocsa_results[slot]; + for (; *chain != NULL;) + { + if (*chain == p) + { + /* Found it. Remove it from the hash table and free it. */ + char *p_begin = (char *) p - HEADER_SIZE; + *chain = ((struct header *) p_begin)->next; + free (p_begin); + return; + } + chain = &((struct header *) ((char *) *chain - HEADER_SIZE))->next; + } + } + /* At this point, we know it was not a mallocsa() result. */ + } +} +#endif diff --git a/gl/allocsa.h b/gl/allocsa.h new file mode 100644 index 000000000..cb6893ad1 --- /dev/null +++ b/gl/allocsa.h @@ -0,0 +1,113 @@ +/* Safe automatic memory allocation. + Copyright (C) 2003-2004 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 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. */ + +#ifndef _ALLOCSA_H +#define _ALLOCSA_H + +#include <alloca.h> +#include <stddef.h> +#include <stdlib.h> + +/* safe_alloca(N) is equivalent to alloca(N) when it is safe to call + alloca(N); otherwise it returns NULL. It either returns N bytes of + memory allocated on the stack, that lasts until the function returns, + or NULL. + Use of safe_alloca should be avoided: + - inside arguments of function calls - undefined behaviour, + - in inline functions - the allocation may actually last until the + calling function returns. +*/ +#if HAVE_ALLOCA +/* The OS usually guarantees only one guard page at the bottom of the stack, + and a page size can be as small as 4096 bytes. So we cannot safely + allocate anything larger than 4096 bytes. Also care for the possibility + of a few compiler-allocated temporary stack slots. + This must be a macro, not an inline function. */ +# define safe_alloca(N) ((N) < 4032 ? alloca (N) : NULL) +#else +# define safe_alloca(N) ((N), NULL) +#endif + +/* allocsa(N) is a safe variant of alloca(N). It allocates N bytes of + memory allocated on the stack, that must be freed using freesa() before + the function returns. Upon failure, it returns NULL. */ +#if HAVE_ALLOCA +# define allocsa(N) \ + ((N) < 4032 - sa_increment \ + ? (void *) ((char *) alloca ((N) + sa_increment) + sa_increment) \ + : mallocsa (N)) +#else +# define allocsa(N) \ + mallocsa (N) +#endif +extern void * mallocsa (size_t n); + +/* Free a block of memory allocated through allocsa(). */ +#if HAVE_ALLOCA +extern void freesa (void *p); +#else +# define freesa free +#endif + +/* Maybe we should also define a variant + nallocsa (size_t n, size_t s) - behaves like allocsa (n * s) + If this would be useful in your application. please speak up. */ + + +/* ------------------- Auxiliary, non-public definitions ------------------- */ + +/* Determine the alignment of a type at compile time. */ +#if defined __GNUC__ +# define sa_alignof __alignof__ +#elif defined __cplusplus + template <class type> struct sa_alignof_helper { char __slot1; type __slot2; }; +# define sa_alignof(type) offsetof (sa_alignof_helper<type>, __slot2) +#elif defined __hpux + /* Work around a HP-UX 10.20 cc bug with enums constants defined as offsetof + values. */ +# define sa_alignof(type) (sizeof (type) <= 4 ? 4 : 8) +#else +# define sa_alignof(type) offsetof (struct { char __slot1; type __slot2; }, __slot2) +#endif + +enum +{ +/* The desired alignment of memory allocations is the maximum alignment + among all elementary types. */ + sa_alignment_long = sa_alignof (long), + sa_alignment_double = sa_alignof (double), +#ifdef HAVE_LONG_LONG + sa_alignment_longlong = sa_alignof (long long), +#endif +#ifdef HAVE_LONG_DOUBLE + sa_alignment_longdouble = sa_alignof (long double), +#endif + sa_alignment_max = ((sa_alignment_long - 1) | (sa_alignment_double - 1) +#ifdef HAVE_LONG_LONG + | (sa_alignment_longlong - 1) +#endif +#ifdef HAVE_LONG_DOUBLE + | (sa_alignment_longdouble - 1) +#endif + ) + 1, +/* The increment that guarantees room for a magic word must be >= sizeof (int) + and a multiple of sa_alignment_max. */ + sa_increment = ((sizeof (int) + sa_alignment_max - 1) / sa_alignment_max) * sa_alignment_max +}; + +#endif /* _ALLOCSA_H */ diff --git a/gl/allocsa.valgrind b/gl/allocsa.valgrind new file mode 100644 index 000000000..f4c77d686 --- /dev/null +++ b/gl/allocsa.valgrind @@ -0,0 +1,7 @@ +# Suppress a valgrind message about use of uninitialized memory in freesa(). +# This use is OK because it provides only a speedup. +{ + freesa + Memcheck:Cond + fun:freesa +} diff --git a/gl/asnprintf.c b/gl/asnprintf.c new file mode 100644 index 000000000..1b7f4ba39 --- /dev/null +++ b/gl/asnprintf.c @@ -0,0 +1,37 @@ +/* Formatted output to strings. + Copyright (C) 1999, 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. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +/* Specification. */ +#include "vasnprintf.h" + +#include <stdarg.h> + +char * +asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...) +{ + va_list args; + char *result; + + va_start (args, format); + result = vasnprintf (resultbuf, lengthp, format, args); + va_end (args); + return result; +} diff --git a/gl/asprintf.c b/gl/asprintf.c new file mode 100644 index 000000000..7c4e64a24 --- /dev/null +++ b/gl/asprintf.c @@ -0,0 +1,37 @@ +/* Formatted output to strings. + Copyright (C) 1999, 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. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +/* Specification. */ +#include "vasprintf.h" + +#include <stdarg.h> + +int +asprintf (char **resultp, const char *format, ...) +{ + va_list args; + int result; + + va_start (args, format); + result = vasprintf (resultp, format, args); + va_end (args); + return result; +} diff --git a/gl/m4/alloca.m4 b/gl/m4/alloca.m4 new file mode 100644 index 000000000..a9e3f452c --- /dev/null +++ b/gl/m4/alloca.m4 @@ -0,0 +1,42 @@ +# alloca.m4 serial 5 +dnl Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +AC_DEFUN([gl_FUNC_ALLOCA], +[ + dnl Work around a bug of AC_EGREP_CPP in autoconf-2.57. + AC_REQUIRE([AC_PROG_CPP]) + AC_REQUIRE([AC_PROG_EGREP]) + + AC_REQUIRE([AC_FUNC_ALLOCA]) + if test $ac_cv_func_alloca_works = no; then + gl_PREREQ_ALLOCA + fi + + # Define an additional variable used in the Makefile substitution. + if test $ac_cv_working_alloca_h = yes; then + AC_EGREP_CPP([Need own alloca], [ +#if defined __GNUC__ || defined _AIX || defined _MSC_VER + Need own alloca +#endif + ], + [AC_DEFINE(HAVE_ALLOCA, 1, + [Define to 1 if you have `alloca' after including <alloca.h>, + a header that may be supplied by this distribution.]) + ALLOCA_H=alloca.h], + [ALLOCA_H=]) + else + ALLOCA_H=alloca.h + fi + AC_SUBST([ALLOCA_H]) + + AC_DEFINE(HAVE_ALLOCA_H, 1, + [Define HAVE_ALLOCA_H for backward compatibility with older code + that includes <alloca.h> only if HAVE_ALLOCA_H is defined.]) +]) + +# Prerequisites of lib/alloca.c. +# STACK_DIRECTION is already handled by AC_FUNC_ALLOCA. +AC_DEFUN([gl_PREREQ_ALLOCA], [:]) diff --git a/gl/m4/allocsa.m4 b/gl/m4/allocsa.m4 new file mode 100644 index 000000000..474862fe3 --- /dev/null +++ b/gl/m4/allocsa.m4 @@ -0,0 +1,15 @@ +# allocsa.m4 serial 3 +dnl Copyright (C) 2003-2004 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +AC_DEFUN([gl_ALLOCSA], +[ + dnl Use the autoconf tests for alloca(), but not the AC_SUBSTed variables + dnl @ALLOCA@ and @LTALLOCA@. + AC_REQUIRE([gl_FUNC_ALLOCA]) + AC_REQUIRE([gl_EEMALLOC]) + AC_REQUIRE([gl_AC_TYPE_LONG_LONG]) + AC_REQUIRE([gt_TYPE_LONGDOUBLE]) +]) diff --git a/gl/m4/eealloc.m4 b/gl/m4/eealloc.m4 new file mode 100644 index 000000000..adcfd06c9 --- /dev/null +++ b/gl/m4/eealloc.m4 @@ -0,0 +1,32 @@ +# eealloc.m4 serial 1 +dnl Copyright (C) 2003 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +AC_DEFUN([gl_EEALLOC], +[ + AC_REQUIRE([gl_EEMALLOC]) + AC_REQUIRE([gl_EEREALLOC]) + AC_REQUIRE([AC_C_INLINE]) +]) + +AC_DEFUN([gl_EEMALLOC], +[ + _AC_FUNC_MALLOC_IF( + [gl_cv_func_malloc_0_nonnull=1], + [gl_cv_func_malloc_0_nonnull=0]) + AC_DEFINE_UNQUOTED([MALLOC_0_IS_NONNULL], $gl_cv_func_malloc_0_nonnull, + [If malloc(0) is != NULL, define this to 1. Otherwise define this + to 0.]) +]) + +AC_DEFUN([gl_EEREALLOC], +[ + _AC_FUNC_REALLOC_IF( + [gl_cv_func_realloc_0_nonnull=1], + [gl_cv_func_realloc_0_nonnull=0]) + AC_DEFINE_UNQUOTED([REALLOC_0_IS_NONNULL], $gl_cv_func_realloc_0_nonnull, + [If realloc(NULL,0) is != NULL, define this to 1. Otherwise define this + to 0.]) +]) diff --git a/gl/m4/eoverflow.m4 b/gl/m4/eoverflow.m4 new file mode 100644 index 000000000..8c28ca305 --- /dev/null +++ b/gl/m4/eoverflow.m4 @@ -0,0 +1,64 @@ +# eoverflow.m4 serial 1 +dnl Copyright (C) 2004 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +# The EOVERFLOW errno value ought to be defined in <errno.h>, according to +# POSIX. But some systems (like AIX 3) don't define it, and some systems +# (like OSF/1) define it when _XOPEN_SOURCE_EXTENDED is defined. + +# Define EOVERFLOW as a C macro and as a substituted macro in such a way that +# 1. on all systems, after inclusion of <errno.h>, EOVERFLOW is usable, +# 2. on systems where EOVERFLOW is defined elsewhere, we use the same numeric +# value. + +AC_DEFUN([gl_EOVERFLOW], +[ + AC_REQUIRE([AC_PROG_CC])dnl + + AC_CACHE_CHECK([for EOVERFLOW], ac_cv_decl_EOVERFLOW, [ + AC_EGREP_CPP(yes,[ +#include <errno.h> +#ifdef EOVERFLOW +yes +#endif + ], have_eoverflow=1) + if test -n "$have_eoverflow"; then + dnl EOVERFLOW exists in <errno.h>. Don't need to define EOVERFLOW ourselves. + ac_cv_decl_EOVERFLOW=yes + else + AC_EGREP_CPP(yes,[ +#define _XOPEN_SOURCE_EXTENDED 1 +#include <errno.h> +#ifdef EOVERFLOW +yes +#endif + ], have_eoverflow=1) + if test -n "$have_eoverflow"; then + dnl EOVERFLOW exists but is hidden. + dnl Define it to the same value. + _AC_COMPUTE_INT([EOVERFLOW], ac_cv_decl_EOVERFLOW, [ +#define _XOPEN_SOURCE_EXTENDED 1 +#include <errno.h> +/* The following two lines are a workaround against an autoconf-2.52 bug. */ +#include <stdio.h> +#include <stdlib.h> +]) + else + dnl EOVERFLOW isn't defined by the system. Define EOVERFLOW ourselves, but + dnl don't define it as EINVAL, because snprintf() callers want to + dnl distinguish EINVAL and EOVERFLOW. + ac_cv_decl_EOVERFLOW=E2BIG + fi + fi + ]) + if test "$ac_cv_decl_EOVERFLOW" != yes; then + AC_DEFINE_UNQUOTED([EOVERFLOW], [$ac_cv_decl_EOVERFLOW], + [Define as good substitute value for EOVERFLOW.]) + EOVERFLOW="$ac_cv_decl_EOVERFLOW" + AC_SUBST(EOVERFLOW) + fi +]) diff --git a/gl/m4/gnulib.m4 b/gl/m4/gnulib.m4 new file mode 100644 index 000000000..46d5e338b --- /dev/null +++ b/gl/m4/gnulib.m4 @@ -0,0 +1,46 @@ +# Copyright (C) 2004 Free Software Foundation, Inc. +# 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. +# +# Generated by gnulib-tool. +# +# Invoked as: gnulib-tool --import +# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=gl --m4-base=gl/m4 --aux-dir=scripts alloca-opt allocsa mkdtemp setenv strpbrk strsep vasnprintf vasprintf xsize + +AC_DEFUN([gl_EARLY], +[ + AC_GNU_SOURCE +]) + +AC_DEFUN([gl_INIT], +[ + gl_FUNC_ALLOCA + gl_ALLOCSA + gt_FUNC_MKDTEMP + gt_FUNC_SETENV + gl_FUNC_STRPBRK + gl_FUNC_STRSEP + gl_FUNC_VASNPRINTF + gl_FUNC_VASPRINTF + gl_XSIZE +]) + +dnl Usage: gl_MODULES(module1 module2 ...) +AC_DEFUN([gl_MODULES], []) + +dnl Usage: gl_SOURCE_BASE(DIR) +AC_DEFUN([gl_SOURCE_BASE], []) + +dnl Usage: gl_M4_BASE(DIR) +AC_DEFUN([gl_M4_BASE], []) + +dnl Usage: gl_LIB(LIBNAME) +AC_DEFUN([gl_LIB], []) + +dnl Usage: gl_LGPL +AC_DEFUN([gl_LGPL], []) + +# gnulib.m4 ends here diff --git a/gl/m4/intmax_t.m4 b/gl/m4/intmax_t.m4 new file mode 100644 index 000000000..44b16523c --- /dev/null +++ b/gl/m4/intmax_t.m4 @@ -0,0 +1,61 @@ +# intmax_t.m4 serial 4 +dnl Copyright (C) 1997-2004 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Paul Eggert. + +AC_PREREQ(2.13) + +# Define intmax_t to 'long' or 'long long' +# if it is not already defined in <stdint.h> or <inttypes.h>. + +AC_DEFUN([gl_AC_TYPE_INTMAX_T], +[ + dnl For simplicity, we assume that a header file defines 'intmax_t' if and + dnl only if it defines 'uintmax_t'. + AC_REQUIRE([gl_AC_HEADER_INTTYPES_H]) + AC_REQUIRE([gl_AC_HEADER_STDINT_H]) + if test $gl_cv_header_inttypes_h = no && test $gl_cv_header_stdint_h = no; then + AC_REQUIRE([gl_AC_TYPE_LONG_LONG]) + test $ac_cv_type_long_long = yes \ + && ac_type='long long' \ + || ac_type='long' + AC_DEFINE_UNQUOTED(intmax_t, $ac_type, + [Define to long or long long if <inttypes.h> and <stdint.h> don't define.]) + else + AC_DEFINE(HAVE_INTMAX_T, 1, + [Define if you have the 'intmax_t' type in <stdint.h> or <inttypes.h>.]) + fi +]) + +dnl An alternative would be to explicitly test for 'intmax_t'. + +AC_DEFUN([gt_AC_TYPE_INTMAX_T], +[ + AC_REQUIRE([gl_AC_HEADER_INTTYPES_H]) + AC_REQUIRE([gl_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>.]) + else + AC_REQUIRE([gl_AC_TYPE_LONG_LONG]) + test $ac_cv_type_long_long = yes \ + && ac_type='long long' \ + || ac_type='long' + AC_DEFINE_UNQUOTED(intmax_t, $ac_type, + [Define to long or long long if <stdint.h> and <inttypes.h> don't define.]) + fi +]) diff --git a/gl/m4/inttypes_h.m4 b/gl/m4/inttypes_h.m4 new file mode 100644 index 000000000..a5d075d96 --- /dev/null +++ b/gl/m4/inttypes_h.m4 @@ -0,0 +1,26 @@ +# inttypes_h.m4 serial 6 +dnl Copyright (C) 1997-2004 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +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([gl_AC_HEADER_INTTYPES_H], +[ + AC_CACHE_CHECK([for inttypes.h], gl_cv_header_inttypes_h, + [AC_TRY_COMPILE( + [#include <sys/types.h> +#include <inttypes.h>], + [uintmax_t i = (uintmax_t) -1;], + gl_cv_header_inttypes_h=yes, + gl_cv_header_inttypes_h=no)]) + if test $gl_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/gl/m4/longdouble.m4 b/gl/m4/longdouble.m4 new file mode 100644 index 000000000..40cd7ce02 --- /dev/null +++ b/gl/m4/longdouble.m4 @@ -0,0 +1,28 @@ +# longdouble.m4 serial 1 (gettext-0.12) +dnl Copyright (C) 2002-2003 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +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/gl/m4/longlong.m4 b/gl/m4/longlong.m4 new file mode 100644 index 000000000..7b399e012 --- /dev/null +++ b/gl/m4/longlong.m4 @@ -0,0 +1,23 @@ +# longlong.m4 serial 5 +dnl Copyright (C) 1999-2004 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Paul Eggert. + +# Define HAVE_LONG_LONG if 'long long' works. + +AC_DEFUN([gl_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/gl/m4/mkdtemp.m4 b/gl/m4/mkdtemp.m4 new file mode 100644 index 000000000..e02c8256c --- /dev/null +++ b/gl/m4/mkdtemp.m4 @@ -0,0 +1,23 @@ +# mkdtemp.m4 serial 3 +dnl Copyright (C) 2001-2003 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +AC_DEFUN([gt_FUNC_MKDTEMP], +[ + AC_REPLACE_FUNCS(mkdtemp) + if test $ac_cv_func_mkdtemp = no; then + gl_PREREQ_MKDTEMP + fi +]) + +# Prerequisites of lib/mkdtemp.c +AC_DEFUN([gl_PREREQ_MKDTEMP], +[ + AC_REQUIRE([AC_HEADER_STAT]) + AC_CHECK_HEADERS_ONCE(sys/time.h unistd.h) + AC_CHECK_HEADERS(time.h) + AC_REQUIRE([gl_AC_TYPE_UINTMAX_T]) + AC_CHECK_FUNCS(gettimeofday) +]) diff --git a/gl/m4/onceonly_2_57.m4 b/gl/m4/onceonly_2_57.m4 new file mode 100644 index 000000000..9fc510e06 --- /dev/null +++ b/gl/m4/onceonly_2_57.m4 @@ -0,0 +1,86 @@ +# onceonly_2_57.m4 serial 3 +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 This file defines some "once only" variants of standard autoconf macros. +dnl AC_CHECK_HEADERS_ONCE like AC_CHECK_HEADERS +dnl AC_CHECK_FUNCS_ONCE like AC_CHECK_FUNCS +dnl AC_CHECK_DECLS_ONCE like AC_CHECK_DECLS +dnl AC_REQUIRE([AC_HEADER_STDC]) like AC_HEADER_STDC +dnl The advantage is that the check for each of the headers/functions/decls +dnl will be put only once into the 'configure' file. It keeps the size of +dnl the 'configure' file down, and avoids redundant output when 'configure' +dnl is run. +dnl The drawback is that the checks cannot be conditionalized. If you write +dnl if some_condition; then gl_CHECK_HEADERS(stdlib.h); fi +dnl inside an AC_DEFUNed function, the gl_CHECK_HEADERS macro call expands to +dnl empty, and the check will be inserted before the body of the AC_DEFUNed +dnl function. + +dnl This is like onceonly.m4, except that it uses diversions to named sections +dnl DEFAULTS and INIT_PREPARE in order to check all requested headers at once, +dnl thus reducing the size of 'configure'. Works with autoconf-2.57. The +dnl size reduction is ca. 9%. + +dnl Autoconf version 2.57 or newer is recommended. +AC_PREREQ(2.54) + +# AC_CHECK_HEADERS_ONCE(HEADER1 HEADER2 ...) is a once-only variant of +# AC_CHECK_HEADERS(HEADER1 HEADER2 ...). +AC_DEFUN([AC_CHECK_HEADERS_ONCE], [ + : + AC_FOREACH([gl_HEADER_NAME], [$1], [ + AC_DEFUN([gl_CHECK_HEADER_]m4_quote(translit(gl_HEADER_NAME, + [./-], [___])), [ + m4_divert_text([INIT_PREPARE], + [gl_header_list="$gl_header_list gl_HEADER_NAME"]) + gl_HEADERS_EXPANSION + AH_TEMPLATE(AS_TR_CPP([HAVE_]m4_defn([gl_HEADER_NAME])), + [Define to 1 if you have the <]m4_defn([gl_HEADER_NAME])[> header file.]) + ]) + AC_REQUIRE([gl_CHECK_HEADER_]m4_quote(translit(gl_HEADER_NAME, + [./-], [___]))) + ]) +]) +m4_define([gl_HEADERS_EXPANSION], [ + m4_divert_text([DEFAULTS], [gl_header_list=]) + AC_CHECK_HEADERS([$gl_header_list]) + m4_define([gl_HEADERS_EXPANSION], []) +]) + +# AC_CHECK_FUNCS_ONCE(FUNC1 FUNC2 ...) is a once-only variant of +# AC_CHECK_FUNCS(FUNC1 FUNC2 ...). +AC_DEFUN([AC_CHECK_FUNCS_ONCE], [ + : + AC_FOREACH([gl_FUNC_NAME], [$1], [ + AC_DEFUN([gl_CHECK_FUNC_]m4_defn([gl_FUNC_NAME]), [ + m4_divert_text([INIT_PREPARE], + [gl_func_list="$gl_func_list gl_FUNC_NAME"]) + gl_FUNCS_EXPANSION + AH_TEMPLATE(AS_TR_CPP([HAVE_]m4_defn([gl_FUNC_NAME])), + [Define to 1 if you have the `]m4_defn([gl_FUNC_NAME])[' function.]) + ]) + AC_REQUIRE([gl_CHECK_FUNC_]m4_defn([gl_FUNC_NAME])) + ]) +]) +m4_define([gl_FUNCS_EXPANSION], [ + m4_divert_text([DEFAULTS], [gl_func_list=]) + AC_CHECK_FUNCS([$gl_func_list]) + m4_define([gl_FUNCS_EXPANSION], []) +]) + +# AC_CHECK_DECLS_ONCE(DECL1 DECL2 ...) is a once-only variant of +# AC_CHECK_DECLS(DECL1, DECL2, ...). +AC_DEFUN([AC_CHECK_DECLS_ONCE], [ + : + AC_FOREACH([gl_DECL_NAME], [$1], [ + AC_DEFUN([gl_CHECK_DECL_]m4_defn([gl_DECL_NAME]), [ + AC_CHECK_DECLS(m4_defn([gl_DECL_NAME])) + ]) + AC_REQUIRE([gl_CHECK_DECL_]m4_defn([gl_DECL_NAME])) + ]) +]) diff --git a/gl/m4/setenv.m4 b/gl/m4/setenv.m4 new file mode 100644 index 000000000..4c76be1ff --- /dev/null +++ b/gl/m4/setenv.m4 @@ -0,0 +1,70 @@ +# setenv.m4 serial 5 +dnl Copyright (C) 2001-2004 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +AC_DEFUN([gt_FUNC_SETENV], +[ + AC_REPLACE_FUNCS(setenv unsetenv) + if test $ac_cv_func_setenv = no; then + gl_PREREQ_SETENV + fi + if test $ac_cv_func_unsetenv = no; then + gl_PREREQ_UNSETENV + else + AC_CACHE_CHECK([for unsetenv() return type], gt_cv_func_unsetenv_ret, + [AC_TRY_COMPILE([#include <stdlib.h> +extern +#ifdef __cplusplus +"C" +#endif +#if defined(__STDC__) || defined(__cplusplus) +int unsetenv (const char *name); +#else +int unsetenv(); +#endif +], , gt_cv_func_unsetenv_ret='int', gt_cv_func_unsetenv_ret='void')]) + if test $gt_cv_func_unsetenv_ret = 'void'; then + AC_DEFINE(VOID_UNSETENV, 1, [Define if unsetenv() returns void, not int.]) + fi + fi +]) + +# Check if a variable is properly declared. +# gt_CHECK_VAR_DECL(includes,variable) +AC_DEFUN([gt_CHECK_VAR_DECL], +[ + define([gt_cv_var], [gt_cv_var_]$2[_declaration]) + AC_MSG_CHECKING([if $2 is properly declared]) + AC_CACHE_VAL(gt_cv_var, [ + AC_TRY_COMPILE([$1 + extern struct { int foo; } $2;], + [$2.foo = 1;], + gt_cv_var=no, + gt_cv_var=yes)]) + AC_MSG_RESULT($gt_cv_var) + if test $gt_cv_var = yes; then + AC_DEFINE([HAVE_]translit($2, [a-z], [A-Z])[_DECL], 1, + [Define if you have the declaration of $2.]) + fi +]) + +# Prerequisites of lib/setenv.c. +AC_DEFUN([gl_PREREQ_SETENV], +[ + AC_REQUIRE([AC_FUNC_ALLOCA]) + AC_CHECK_HEADERS_ONCE(unistd.h) + AC_CHECK_HEADERS(search.h) + AC_CHECK_FUNCS(tsearch) + gt_CHECK_VAR_DECL([#include <errno.h>], errno) + gt_CHECK_VAR_DECL([#include <unistd.h>], environ) +]) + +# Prerequisites of lib/unsetenv.c. +AC_DEFUN([gl_PREREQ_UNSETENV], +[ + AC_CHECK_HEADERS_ONCE(unistd.h) + gt_CHECK_VAR_DECL([#include <errno.h>], errno) + gt_CHECK_VAR_DECL([#include <unistd.h>], environ) +]) diff --git a/gl/m4/signed.m4 b/gl/m4/signed.m4 new file mode 100644 index 000000000..048f59369 --- /dev/null +++ b/gl/m4/signed.m4 @@ -0,0 +1,17 @@ +# signed.m4 serial 1 (gettext-0.10.40) +dnl Copyright (C) 2001-2002 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +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/gl/m4/size_max.m4 b/gl/m4/size_max.m4 new file mode 100644 index 000000000..4fe81c7b0 --- /dev/null +++ b/gl/m4/size_max.m4 @@ -0,0 +1,59 @@ +# size_max.m4 serial 2 +dnl Copyright (C) 2003 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +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/gl/m4/stdint_h.m4 b/gl/m4/stdint_h.m4 new file mode 100644 index 000000000..3355f35aa --- /dev/null +++ b/gl/m4/stdint_h.m4 @@ -0,0 +1,26 @@ +# stdint_h.m4 serial 5 +dnl Copyright (C) 1997-2004 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +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([gl_AC_HEADER_STDINT_H], +[ + AC_CACHE_CHECK([for stdint.h], gl_cv_header_stdint_h, + [AC_TRY_COMPILE( + [#include <sys/types.h> +#include <stdint.h>], + [uintmax_t i = (uintmax_t) -1;], + gl_cv_header_stdint_h=yes, + gl_cv_header_stdint_h=no)]) + if test $gl_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/gl/m4/strpbrk.m4 b/gl/m4/strpbrk.m4 new file mode 100644 index 000000000..68360684e --- /dev/null +++ b/gl/m4/strpbrk.m4 @@ -0,0 +1,16 @@ +# strpbrk.m4 serial 2 +dnl Copyright (C) 2002-2003 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +AC_DEFUN([gl_FUNC_STRPBRK], +[ + AC_REPLACE_FUNCS(strpbrk) + if test $ac_cv_func_strpbrk = no; then + gl_PREREQ_STRPBRK + fi +]) + +# Prerequisites of lib/strpbrk.c. +AC_DEFUN([gl_PREREQ_STRPBRK], [:]) diff --git a/gl/m4/strsep.m4 b/gl/m4/strsep.m4 new file mode 100644 index 000000000..40a087b3d --- /dev/null +++ b/gl/m4/strsep.m4 @@ -0,0 +1,17 @@ +# strsep.m4 serial 3 +dnl Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +AC_DEFUN([gl_FUNC_STRSEP], +[ + dnl Persuade glibc <string.h> to declare strsep(). + AC_REQUIRE([AC_GNU_SOURCE]) + + AC_REPLACE_FUNCS(strsep) + gl_PREREQ_STRSEP +]) + +# Prerequisites of lib/strsep.c. +AC_DEFUN([gl_PREREQ_STRSEP], [:]) diff --git a/gl/m4/uintmax_t.m4 b/gl/m4/uintmax_t.m4 new file mode 100644 index 000000000..bf83ed746 --- /dev/null +++ b/gl/m4/uintmax_t.m4 @@ -0,0 +1,30 @@ +# uintmax_t.m4 serial 9 +dnl Copyright (C) 1997-2004 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +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([gl_AC_TYPE_UINTMAX_T], +[ + AC_REQUIRE([gl_AC_HEADER_INTTYPES_H]) + AC_REQUIRE([gl_AC_HEADER_STDINT_H]) + if test $gl_cv_header_inttypes_h = no && test $gl_cv_header_stdint_h = no; then + AC_REQUIRE([gl_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/gl/m4/ulonglong.m4 b/gl/m4/ulonglong.m4 new file mode 100644 index 000000000..dee10ccc3 --- /dev/null +++ b/gl/m4/ulonglong.m4 @@ -0,0 +1,23 @@ +# ulonglong.m4 serial 4 +dnl Copyright (C) 1999-2004 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Paul Eggert. + +# Define HAVE_UNSIGNED_LONG_LONG if 'unsigned long long' works. + +AC_DEFUN([gl_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/gl/m4/vasnprintf.m4 b/gl/m4/vasnprintf.m4 new file mode 100644 index 000000000..7ff343035 --- /dev/null +++ b/gl/m4/vasnprintf.m4 @@ -0,0 +1,58 @@ +# vasnprintf.m4 serial 5 +dnl Copyright (C) 2002-2004 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +AC_DEFUN([gl_FUNC_VASNPRINTF], +[ + AC_REQUIRE([gl_EOVERFLOW]) + AC_REPLACE_FUNCS(vasnprintf) + if test $ac_cv_func_vasnprintf = no; then + AC_LIBOBJ(printf-args) + AC_LIBOBJ(printf-parse) + AC_LIBOBJ(asnprintf) + gl_PREREQ_PRINTF_ARGS + gl_PREREQ_PRINTF_PARSE + gl_PREREQ_VASNPRINTF + gl_PREREQ_ASNPRINTF + fi +]) + +# Prequisites of lib/printf-args.h, lib/printf-args.c. +AC_DEFUN([gl_PREREQ_PRINTF_ARGS], +[ + AC_REQUIRE([bh_C_SIGNED]) + AC_REQUIRE([gl_AC_TYPE_LONG_LONG]) + AC_REQUIRE([gt_TYPE_LONGDOUBLE]) + AC_REQUIRE([gt_TYPE_WCHAR_T]) + AC_REQUIRE([gt_TYPE_WINT_T]) +]) + +# Prequisites of lib/printf-parse.h, lib/printf-parse.c. +AC_DEFUN([gl_PREREQ_PRINTF_PARSE], +[ + AC_REQUIRE([gl_AC_TYPE_LONG_LONG]) + AC_REQUIRE([gt_TYPE_LONGDOUBLE]) + AC_REQUIRE([gt_TYPE_WCHAR_T]) + AC_REQUIRE([gt_TYPE_WINT_T]) + AC_REQUIRE([AC_TYPE_SIZE_T]) + AC_CHECK_TYPES(ptrdiff_t) + AC_REQUIRE([gt_AC_TYPE_INTMAX_T]) +]) + +# Prerequisites of lib/vasnprintf.c. +AC_DEFUN([gl_PREREQ_VASNPRINTF], +[ + AC_REQUIRE([AC_FUNC_ALLOCA]) + AC_REQUIRE([gl_AC_TYPE_LONG_LONG]) + AC_REQUIRE([gt_TYPE_LONGDOUBLE]) + AC_REQUIRE([gt_TYPE_WCHAR_T]) + AC_REQUIRE([gt_TYPE_WINT_T]) + AC_CHECK_FUNCS(snprintf wcslen) +]) + +# Prerequisites of lib/asnprintf.c. +AC_DEFUN([gl_PREREQ_ASNPRINTF], +[ +]) diff --git a/gl/m4/vasprintf.m4 b/gl/m4/vasprintf.m4 new file mode 100644 index 000000000..385e92edd --- /dev/null +++ b/gl/m4/vasprintf.m4 @@ -0,0 +1,25 @@ +# vasprintf.m4 serial 1 +dnl Copyright (C) 2002-2003 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +AC_DEFUN([gl_FUNC_VASPRINTF], +[ + AC_REPLACE_FUNCS(vasprintf) + if test $ac_cv_func_vasprintf = no; then + AC_LIBOBJ(asprintf) + gl_PREREQ_VASPRINTF + gl_PREREQ_ASPRINTF + fi +]) + +# Prerequisites of lib/vasprintf.c. +AC_DEFUN([gl_PREREQ_VASPRINTF], +[ +]) + +# Prerequisites of lib/asprintf.c. +AC_DEFUN([gl_PREREQ_ASPRINTF], +[ +]) diff --git a/gl/m4/wchar_t.m4 b/gl/m4/wchar_t.m4 new file mode 100644 index 000000000..cde2129a9 --- /dev/null +++ b/gl/m4/wchar_t.m4 @@ -0,0 +1,20 @@ +# wchar_t.m4 serial 1 (gettext-0.12) +dnl Copyright (C) 2002-2003 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +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/gl/m4/wint_t.m4 b/gl/m4/wint_t.m4 new file mode 100644 index 000000000..b8fff9c86 --- /dev/null +++ b/gl/m4/wint_t.m4 @@ -0,0 +1,20 @@ +# wint_t.m4 serial 1 (gettext-0.12) +dnl Copyright (C) 2003 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +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/gl/m4/xsize.m4 b/gl/m4/xsize.m4 new file mode 100644 index 000000000..85bb721e4 --- /dev/null +++ b/gl/m4/xsize.m4 @@ -0,0 +1,13 @@ +# xsize.m4 serial 3 +dnl Copyright (C) 2003-2004 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +AC_DEFUN([gl_XSIZE], +[ + dnl Prerequisites of lib/xsize.h. + AC_REQUIRE([gl_SIZE_MAX]) + AC_REQUIRE([AC_C_INLINE]) + AC_CHECK_HEADERS(stdint.h) +]) diff --git a/gl/mkdtemp.c b/gl/mkdtemp.c new file mode 100644 index 000000000..469cf4718 --- /dev/null +++ b/gl/mkdtemp.c @@ -0,0 +1,203 @@ +/* Copyright (C) 1999, 2001-2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + 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. */ + +/* Extracted from misc/mkdtemp.c and sysdeps/posix/tempname.c. */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +/* Specification. */ +#include "mkdtemp.h" + +#include <errno.h> +#ifndef __set_errno +# define __set_errno(Val) errno = (Val) +#endif + +#include <stddef.h> +#include <stdlib.h> +#include <string.h> + +#include <stdio.h> +#ifndef TMP_MAX +# define TMP_MAX 238328 +#endif + +#if HAVE_STDINT_H || _LIBC +# include <stdint.h> +#endif +#if HAVE_INTTYPES_H +# include <inttypes.h> +#endif + +#if HAVE_UNISTD_H || _LIBC +# include <unistd.h> +#endif + +#if HAVE_GETTIMEOFDAY || _LIBC +# if HAVE_SYS_TIME_H || _LIBC +# include <sys/time.h> +# endif +#else +# if HAVE_TIME_H || _LIBC +# include <time.h> +# endif +#endif + +#include <sys/stat.h> +#if STAT_MACROS_BROKEN +# undef S_ISDIR +#endif +#if !defined S_ISDIR && defined S_IFDIR +# define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) +#endif +#if !S_IRUSR && S_IREAD +# define S_IRUSR S_IREAD +#endif +#if !S_IRUSR +# define S_IRUSR 00400 +#endif +#if !S_IWUSR && S_IWRITE +# define S_IWUSR S_IWRITE +#endif +#if !S_IWUSR +# define S_IWUSR 00200 +#endif +#if !S_IXUSR && S_IEXEC +# define S_IXUSR S_IEXEC +#endif +#if !S_IXUSR +# define S_IXUSR 00100 +#endif + +#ifdef __MINGW32__ +/* mingw's mkdir() function has 1 argument, but we pass 2 arguments. + Therefore we have to disable the argument count checking. */ +# define mkdir ((int (*)()) mkdir) +#endif + +#if !_LIBC +# define __getpid getpid +# define __gettimeofday gettimeofday +# define __mkdir mkdir +#endif + +/* Use the widest available unsigned type if uint64_t is not + available. The algorithm below extracts a number less than 62**6 + (approximately 2**35.725) from uint64_t, so ancient hosts where + uintmax_t is only 32 bits lose about 3.725 bits of randomness, + which is better than not having mkstemp at all. */ +#if !defined UINT64_MAX && !defined uint64_t +# define uint64_t uintmax_t +#endif + +/* These are the characters used in temporary filenames. */ +static const char letters[] = +"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + +/* Generate a temporary file name based on TMPL. TMPL must match the + rules for mk[s]temp (i.e. end in "XXXXXX"). The name constructed + does not exist at the time of the call to __gen_tempname. TMPL is + overwritten with the result. + + KIND is: + __GT_DIR: create a directory, which will be mode 0700. + + We use a clever algorithm to get hard-to-predict names. */ +static int +gen_tempname (char *tmpl) +{ + int len; + char *XXXXXX; + static uint64_t value; + uint64_t random_time_bits; + int count, fd = -1; + int save_errno = errno; + + len = strlen (tmpl); + if (len < 6 || strcmp (&tmpl[len - 6], "XXXXXX")) + { + __set_errno (EINVAL); + return -1; + } + + /* This is where the Xs start. */ + XXXXXX = &tmpl[len - 6]; + + /* Get some more or less random data. */ +#ifdef RANDOM_BITS + RANDOM_BITS (random_time_bits); +#else +# if HAVE_GETTIMEOFDAY || _LIBC + { + struct timeval tv; + __gettimeofday (&tv, NULL); + random_time_bits = ((uint64_t) tv.tv_usec << 16) ^ tv.tv_sec; + } +# else + random_time_bits = time (NULL); +# endif +#endif + value += random_time_bits ^ __getpid (); + + for (count = 0; count < TMP_MAX; value += 7777, ++count) + { + uint64_t v = value; + + /* Fill in the random bits. */ + XXXXXX[0] = letters[v % 62]; + v /= 62; + XXXXXX[1] = letters[v % 62]; + v /= 62; + XXXXXX[2] = letters[v % 62]; + v /= 62; + XXXXXX[3] = letters[v % 62]; + v /= 62; + XXXXXX[4] = letters[v % 62]; + v /= 62; + XXXXXX[5] = letters[v % 62]; + + fd = __mkdir (tmpl, S_IRUSR | S_IWUSR | S_IXUSR); + + if (fd >= 0) + { + __set_errno (save_errno); + return fd; + } + else if (errno != EEXIST) + return -1; + } + + /* We got out of the loop because we ran out of combinations to try. */ + __set_errno (EEXIST); + return -1; +} + +/* Generate a unique temporary directory from TEMPLATE. + The last six characters of TEMPLATE must be "XXXXXX"; + they are replaced with a string that makes the filename unique. + The directory is created, mode 700, and its name is returned. + (This function comes from OpenBSD.) */ +char * +mkdtemp (char *template) +{ + if (gen_tempname (template)) + return NULL; + else + return template; +} diff --git a/gl/mkdtemp.h b/gl/mkdtemp.h new file mode 100644 index 000000000..617604801 --- /dev/null +++ b/gl/mkdtemp.h @@ -0,0 +1,32 @@ +/* Creating a private temporary directory. + 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 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. */ + +#if HAVE_MKDTEMP + +/* Get mkdtemp() declaration. */ +#include <stdlib.h> + +#else + +/* Create a unique temporary directory from TEMPLATE. + The last six characters of TEMPLATE must be "XXXXXX"; + they are replaced with a string that makes the directory name unique. + Returns TEMPLATE, or a null pointer if it cannot get a unique name. + The directory is created mode 700. */ +extern char * mkdtemp (char *template); + +#endif diff --git a/gl/printf-args.c b/gl/printf-args.c new file mode 100644 index 000000000..0ed1acbb8 --- /dev/null +++ b/gl/printf-args.c @@ -0,0 +1,118 @@ +/* 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 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. */ + +#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/gl/printf-args.h b/gl/printf-args.h new file mode 100644 index 000000000..cec1cc6c2 --- /dev/null +++ b/gl/printf-args.h @@ -0,0 +1,136 @@ +/* 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 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. */ + +#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/gl/printf-parse.c b/gl/printf-parse.c new file mode 100644 index 000000000..3d2fb175f --- /dev/null +++ b/gl/printf-parse.c @@ -0,0 +1,536 @@ +/* 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 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. */ + +#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/gl/printf-parse.h b/gl/printf-parse.h new file mode 100644 index 000000000..82a0d37cd --- /dev/null +++ b/gl/printf-parse.h @@ -0,0 +1,74 @@ +/* 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 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. */ + +#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/gl/setenv.c b/gl/setenv.c new file mode 100644 index 000000000..33dbeb7a3 --- /dev/null +++ b/gl/setenv.c @@ -0,0 +1,328 @@ +/* Copyright (C) 1992,1995-1999,2000-2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + 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. */ + +#if HAVE_CONFIG_H +# include <config.h> +#endif +#include <alloca.h> + +#include <errno.h> +#ifndef __set_errno +# define __set_errno(ev) ((errno) = (ev)) +#endif + +#include <stdlib.h> +#include <string.h> +#if _LIBC || HAVE_UNISTD_H +# include <unistd.h> +#endif + +#if !_LIBC +# include "allocsa.h" +#endif + +#if !_LIBC +# define __environ environ +# ifndef HAVE_ENVIRON_DECL +extern char **environ; +# endif +#endif + +#if _LIBC +/* This lock protects against simultaneous modifications of `environ'. */ +# include <bits/libc-lock.h> +__libc_lock_define_initialized (static, envlock) +# define LOCK __libc_lock_lock (envlock) +# define UNLOCK __libc_lock_unlock (envlock) +#else +# define LOCK +# define UNLOCK +#endif + +/* In the GNU C library we must keep the namespace clean. */ +#ifdef _LIBC +# define setenv __setenv +# define clearenv __clearenv +# define tfind __tfind +# define tsearch __tsearch +#endif + +/* In the GNU C library implementation we try to be more clever and + allow arbitrarily many changes of the environment given that the used + values are from a small set. Outside glibc this will eat up all + memory after a while. */ +#if defined _LIBC || (defined HAVE_SEARCH_H && defined HAVE_TSEARCH \ + && defined __GNUC__) +# define USE_TSEARCH 1 +# include <search.h> +typedef int (*compar_fn_t) (const void *, const void *); + +/* This is a pointer to the root of the search tree with the known + values. */ +static void *known_values; + +# define KNOWN_VALUE(Str) \ + ({ \ + void *value = tfind (Str, &known_values, (compar_fn_t) strcmp); \ + value != NULL ? *(char **) value : NULL; \ + }) +# define STORE_VALUE(Str) \ + tsearch (Str, &known_values, (compar_fn_t) strcmp) + +#else +# undef USE_TSEARCH + +# define KNOWN_VALUE(Str) NULL +# define STORE_VALUE(Str) do { } while (0) + +#endif + + +/* If this variable is not a null pointer we allocated the current + environment. */ +static char **last_environ; + + +/* This function is used by `setenv' and `putenv'. The difference between + the two functions is that for the former must create a new string which + is then placed in the environment, while the argument of `putenv' + must be used directly. This is all complicated by the fact that we try + to reuse values once generated for a `setenv' call since we can never + free the strings. */ +int +__add_to_environ (const char *name, const char *value, const char *combined, + int replace) +{ + register char **ep; + register size_t size; + const size_t namelen = strlen (name); + const size_t vallen = value != NULL ? strlen (value) + 1 : 0; + + LOCK; + + /* We have to get the pointer now that we have the lock and not earlier + since another thread might have created a new environment. */ + ep = __environ; + + size = 0; + if (ep != NULL) + { + for (; *ep != NULL; ++ep) + if (!strncmp (*ep, name, namelen) && (*ep)[namelen] == '=') + break; + else + ++size; + } + + if (ep == NULL || *ep == NULL) + { + char **new_environ; +#ifdef USE_TSEARCH + char *new_value; +#endif + + /* We allocated this space; we can extend it. */ + new_environ = + (char **) (last_environ == NULL + ? malloc ((size + 2) * sizeof (char *)) + : realloc (last_environ, (size + 2) * sizeof (char *))); + if (new_environ == NULL) + { + UNLOCK; + return -1; + } + + /* If the whole entry is given add it. */ + if (combined != NULL) + /* We must not add the string to the search tree since it belongs + to the user. */ + new_environ[size] = (char *) combined; + else + { + /* See whether the value is already known. */ +#ifdef USE_TSEARCH +# ifdef _LIBC + new_value = (char *) alloca (namelen + 1 + vallen); + __mempcpy (__mempcpy (__mempcpy (new_value, name, namelen), "=", 1), + value, vallen); +# else + new_value = (char *) allocsa (namelen + 1 + vallen); + if (new_value == NULL) + { + __set_errno (ENOMEM); + UNLOCK; + return -1; + } + memcpy (new_value, name, namelen); + new_value[namelen] = '='; + memcpy (&new_value[namelen + 1], value, vallen); +# endif + + new_environ[size] = KNOWN_VALUE (new_value); + if (new_environ[size] == NULL) +#endif + { + new_environ[size] = (char *) malloc (namelen + 1 + vallen); + if (new_environ[size] == NULL) + { +#if defined USE_TSEARCH && !defined _LIBC + freesa (new_value); +#endif + __set_errno (ENOMEM); + UNLOCK; + return -1; + } + +#ifdef USE_TSEARCH + memcpy (new_environ[size], new_value, namelen + 1 + vallen); +#else + memcpy (new_environ[size], name, namelen); + new_environ[size][namelen] = '='; + memcpy (&new_environ[size][namelen + 1], value, vallen); +#endif + /* And save the value now. We cannot do this when we remove + the string since then we cannot decide whether it is a + user string or not. */ + STORE_VALUE (new_environ[size]); + } +#if defined USE_TSEARCH && !defined _LIBC + freesa (new_value); +#endif + } + + if (__environ != last_environ) + memcpy ((char *) new_environ, (char *) __environ, + size * sizeof (char *)); + + new_environ[size + 1] = NULL; + + last_environ = __environ = new_environ; + } + else if (replace) + { + char *np; + + /* Use the user string if given. */ + if (combined != NULL) + np = (char *) combined; + else + { +#ifdef USE_TSEARCH + char *new_value; +# ifdef _LIBC + new_value = alloca (namelen + 1 + vallen); + __mempcpy (__mempcpy (__mempcpy (new_value, name, namelen), "=", 1), + value, vallen); +# else + new_value = allocsa (namelen + 1 + vallen); + if (new_value == NULL) + { + __set_errno (ENOMEM); + UNLOCK; + return -1; + } + memcpy (new_value, name, namelen); + new_value[namelen] = '='; + memcpy (&new_value[namelen + 1], value, vallen); +# endif + + np = KNOWN_VALUE (new_value); + if (np == NULL) +#endif + { + np = malloc (namelen + 1 + vallen); + if (np == NULL) + { +#if defined USE_TSEARCH && !defined _LIBC + freesa (new_value); +#endif + __set_errno (ENOMEM); + UNLOCK; + return -1; + } + +#ifdef USE_TSEARCH + memcpy (np, new_value, namelen + 1 + vallen); +#else + memcpy (np, name, namelen); + np[namelen] = '='; + memcpy (&np[namelen + 1], value, vallen); +#endif + /* And remember the value. */ + STORE_VALUE (np); + } +#if defined USE_TSEARCH && !defined _LIBC + freesa (new_value); +#endif + } + + *ep = np; + } + + UNLOCK; + + return 0; +} + +int +setenv (const char *name, const char *value, int replace) +{ + return __add_to_environ (name, value, NULL, replace); +} + +/* The `clearenv' was planned to be added to POSIX.1 but probably + never made it. Nevertheless the POSIX.9 standard (POSIX bindings + for Fortran 77) requires this function. */ +int +clearenv (void) +{ + LOCK; + + if (__environ == last_environ && __environ != NULL) + { + /* We allocated this environment so we can free it. */ + free (__environ); + last_environ = NULL; + } + + /* Clear the environment pointer removes the whole environment. */ + __environ = NULL; + + UNLOCK; + + return 0; +} + +#ifdef _LIBC +static void +free_mem (void) +{ + /* Remove all traces. */ + clearenv (); + + /* Now remove the search tree. */ + __tdestroy (known_values, free); + known_values = NULL; +} +text_set_element (__libc_subfreeres, free_mem); + + +# undef setenv +# undef clearenv +weak_alias (__setenv, setenv) +weak_alias (__clearenv, clearenv) +#endif diff --git a/gl/setenv.h b/gl/setenv.h new file mode 100644 index 000000000..c89e7da4d --- /dev/null +++ b/gl/setenv.h @@ -0,0 +1,54 @@ +/* Setting environment variables. + Copyright (C) 2001-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. */ + +#if HAVE_SETENV || HAVE_UNSETENV + +/* Get setenv(), unsetenv() declarations. */ +# include <stdlib.h> + +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#if !HAVE_SETENV + +/* Set NAME to VALUE in the environment. + If REPLACE is nonzero, overwrite an existing value. */ +extern int setenv (const char *name, const char *value, int replace); + +#endif + +#if HAVE_UNSETENV + +# if VOID_UNSETENV +/* On some systems, unsetenv() returns void. + This is the case for FreeBSD 4.8, NetBSD 1.6, OpenBSD 3.4. */ +# define unsetenv(name) ((unsetenv)(name), 0) +# endif + +#else + +/* Remove the variable NAME from the environment. */ +extern int unsetenv (const char *name); + +#endif + +#ifdef __cplusplus +} +#endif diff --git a/gl/strpbrk.c b/gl/strpbrk.c new file mode 100644 index 000000000..9152440b1 --- /dev/null +++ b/gl/strpbrk.c @@ -0,0 +1,42 @@ +/* Copyright (C) 1991, 1994, 2000, 2002-2003 Free Software Foundation, Inc. + NOTE: The canonical source of this file is maintained with the GNU C Library. + Bugs can be reported to bug-glibc@prep.ai.mit.edu. + + 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. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <stddef.h> +#include <string.h> + +#undef strpbrk + +/* Find the first occurrence in S of any character in ACCEPT. */ +char * +strpbrk (const char *s, const char *accept) +{ + while (*s != '\0') + { + const char *a = accept; + while (*a != '\0') + if (*a++ == *s) + return (char *) s; + ++s; + } + + return NULL; +} diff --git a/gl/strpbrk.h b/gl/strpbrk.h new file mode 100644 index 000000000..acc8d358b --- /dev/null +++ b/gl/strpbrk.h @@ -0,0 +1,28 @@ +/* Searching in a string. + 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 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. */ + +#if HAVE_STRPBRK + +/* Get strpbrk() declaration. */ +#include <string.h> + +#else + +/* Find the first occurrence in S of any character in ACCEPT. */ +extern char *strpbrk (const char *s, const char *accept); + +#endif diff --git a/gl/strsep.c b/gl/strsep.c new file mode 100644 index 000000000..40c2939c8 --- /dev/null +++ b/gl/strsep.c @@ -0,0 +1,55 @@ +/* Copyright (C) 2004 Free Software Foundation, Inc. + + Written by Yoann Vandoorselaere <yoann@prelude-ids.org>. + + 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. */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +/* Specification. */ +#include "strsep.h" + +#include <string.h> + +#include "strpbrk.h" + +char * +strsep (char **stringp, const char *delim) +{ + char *start = *stringp; + char *ptr; + + if (!start) + return NULL; + + if (!*delim) + ptr = start + strlen (start); + else + { + ptr = strpbrk (start, delim); + if (!ptr) + { + *stringp = NULL; + return start; + } + } + + *ptr = '\0'; + *stringp = ptr + 1; + + return start; +} diff --git a/gl/strsep.h b/gl/strsep.h new file mode 100644 index 000000000..ca28a2ffe --- /dev/null +++ b/gl/strsep.h @@ -0,0 +1,52 @@ +/* Copyright (C) 2004 Free Software Foundation, Inc. + + Written by Yoann Vandoorselaere <yoann@prelude-ids.org>. + + 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. */ + +#ifndef GNULIB_STRSEP_H_ +#define GNULIB_STRSEP_H_ + +#if HAVE_STRSEP + +/* + * Get strsep() declaration. + */ +#include <string.h> + +#else + +/* Searches the next delimiter (char listed in DELIM) starting at *STRINGP. + If one is found, it is overwritten with a NUL, and *STRINGP is advanced + to point to the next char after it. Otherwise, *STRINGP is set to NULL. + If *STRINGP was already NULL, nothing happens. + Returns the old value of *STRINGP. + + This is a variant of strtok() that is multithread-safe and supports + empty fields. + + Caveat: It modifies the original string. + Caveat: These functions cannot be used on constant strings. + Caveat: The identity of the delimiting character is lost. + Caveat: It doesn't work with multibyte strings unless all of the delimiter + characters are ASCII characters < 0x30. + + See also strtok_r(). */ + +extern char *strsep (char **stringp, const char *delim); + +#endif + +#endif /* GNULIB_STRSEP_H_ */ diff --git a/gl/unsetenv.c b/gl/unsetenv.c new file mode 100644 index 000000000..4b53fc9c8 --- /dev/null +++ b/gl/unsetenv.c @@ -0,0 +1,99 @@ +/* Copyright (C) 1992,1995-1999,2000-2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + 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. */ + +#if HAVE_CONFIG_H +# include <config.h> +#endif + +#include <errno.h> +#if !_LIBC +# if !defined errno && !defined HAVE_ERRNO_DECL +extern int errno; +# endif +# define __set_errno(ev) ((errno) = (ev)) +#endif + +#include <stdlib.h> +#include <string.h> +#if _LIBC || HAVE_UNISTD_H +# include <unistd.h> +#endif + +#if !_LIBC +# define __environ environ +# ifndef HAVE_ENVIRON_DECL +extern char **environ; +# endif +#endif + +#if _LIBC +/* This lock protects against simultaneous modifications of `environ'. */ +# include <bits/libc-lock.h> +__libc_lock_define_initialized (static, envlock) +# define LOCK __libc_lock_lock (envlock) +# define UNLOCK __libc_lock_unlock (envlock) +#else +# define LOCK +# define UNLOCK +#endif + +/* In the GNU C library we must keep the namespace clean. */ +#ifdef _LIBC +# define unsetenv __unsetenv +#endif + + +int +unsetenv (const char *name) +{ + size_t len; + char **ep; + + if (name == NULL || *name == '\0' || strchr (name, '=') != NULL) + { + __set_errno (EINVAL); + return -1; + } + + len = strlen (name); + + LOCK; + + ep = __environ; + while (*ep != NULL) + if (!strncmp (*ep, name, len) && (*ep)[len] == '=') + { + /* Found it. Remove this pointer by moving later ones back. */ + char **dp = ep; + + do + dp[0] = dp[1]; + while (*dp++); + /* Continue the loop in case NAME appears again. */ + } + else + ++ep; + + UNLOCK; + + return 0; +} + +#ifdef _LIBC +# undef unsetenv +weak_alias (__unsetenv, unsetenv) +#endif diff --git a/gl/vasnprintf.c b/gl/vasnprintf.c new file mode 100644 index 000000000..324d62ecd --- /dev/null +++ b/gl/vasnprintf.c @@ -0,0 +1,901 @@ +/* vsprintf with automatic memory allocation. + Copyright (C) 1999, 2002-2005 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. */ + +/* 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, INT_MAX */ +#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" + +/* Some systems, like OSF/1 4.0 and Woe32, don't have EOVERFLOW. */ +#ifndef EOVERFLOW +# define EOVERFLOW E2BIG +#endif + +#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; + while (digitp != dp->precision_end) + precision = xsum (xtimes (precision, 10), *digitp++ - '0'); + } + } + + 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; + if (length > INT_MAX) + goto length_overflow; + return result; + + length_overflow: + /* We could produce such a big string, but its length doesn't fit into + an 'int'. POSIX says that snprintf() fails with errno = EOVERFLOW in + this case. */ + if (result != resultbuf) + free (result); + errno = EOVERFLOW; + return NULL; + + 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/gl/vasnprintf.h b/gl/vasnprintf.h new file mode 100644 index 000000000..894008cae --- /dev/null +++ b/gl/vasnprintf.h @@ -0,0 +1,77 @@ +/* vsprintf with automatic memory allocation. + 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, 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. */ + +#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. + + When dynamic memory allocation occurs, the preallocated buffer is left + alone (with possibly modified contents). This makes it possible to use + a statically allocated or stack-allocated buffer, like this: + + char buf[100]; + size_t len = sizeof (buf); + char *output = vasnprintf (buf, &len, format, args); + if (output == NULL) + ... error handling ...; + else + { + ... use the output string ...; + if (output != buf) + free (output); + } + */ +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/gl/vasprintf.c b/gl/vasprintf.c new file mode 100644 index 000000000..149c29242 --- /dev/null +++ b/gl/vasprintf.c @@ -0,0 +1,42 @@ +/* Formatted output to strings. + Copyright (C) 1999, 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. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +/* Specification. */ +#include "vasprintf.h" + +#include <stdlib.h> + +#include "vasnprintf.h" + +int +vasprintf (char **resultp, const char *format, va_list args) +{ + size_t length; + char *result = vasnprintf (NULL, &length, format, args); + if (result == NULL) + return -1; + + *resultp = result; + /* Return the number of resulting bytes, excluding the trailing NUL. + If it wouldn't fit in an 'int', vasnprintf() would have returned NULL + and set errno to EOVERFLOW. */ + return length; +} diff --git a/gl/vasprintf.h b/gl/vasprintf.h new file mode 100644 index 000000000..d02f15451 --- /dev/null +++ b/gl/vasprintf.h @@ -0,0 +1,63 @@ +/* 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 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. */ + +#ifndef _VASPRINTF_H +#define _VASPRINTF_H + +#if HAVE_VASPRINTF + +/* Get asprintf(), vasprintf() declarations. */ +#include <stdio.h> + +#else + +/* Get va_list. */ +#include <stdarg.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(). + If the memory allocation succeeds, store the address of the string in + *RESULT and return the number of resulting bytes, excluding the trailing + NUL. Upon memory allocation error, or some other error, return -1. */ +extern int asprintf (char **result, const char *format, ...) + __attribute__ ((__format__ (__printf__, 2, 3))); +extern int vasprintf (char **result, const char *format, va_list args) + __attribute__ ((__format__ (__printf__, 2, 0))); + +#ifdef __cplusplus +} +#endif + +#endif + +#endif /* _VASPRINTF_H */ diff --git a/gl/xsize.h b/gl/xsize.h new file mode 100644 index 000000000..341fb16ca --- /dev/null +++ b/gl/xsize.h @@ -0,0 +1,108 @@ +/* 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 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. */ + +#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/gnupg.txt b/gnupg.txt deleted file mode 100644 index 4bb5603c1..000000000 --- a/gnupg.txt +++ /dev/null @@ -1,98 +0,0 @@ -%%comments: -Copyright (C) 2000, 2001 Free Software Foundation, Inc. - -Permission is granted to copy, distribute and/or modify this document -under the terms of the GNU Free Documentation License, Version 1.1 or -any later version published by the Free Software Foundation; with no -Invariant Sections, with no Front-Cover Texts, and with no Back-Cover -Texts. A copy of the license is included in the file COPYING. - -%%name: GnuPG - -%%short-description: Complete implementation of the OpenPGP Internet standard. - -%%full-description: A complete and free replacement for PGP. The -program does not use any patented algorithms, and can be used as a -filter program. Can handle all OpenPGP messages and messages generated -by PGP 5.0 and newer unless they use the IDEA algorithm. - -Supports ElGamal (signature and encrytion), DSA, AES, 3DES, Blowfish, -Twofish, CAST5, MD5, SHA-1, RIPE-MD-160 and TIGER, and has language -support for sixteen different languages. - -It is believed to be fully OpenPGP (as defined in RFC2440) conform, -and has integrated support for HKP keyservers. There are a lot of -useful extra features like anonymous message recipients. - -%%category: security, administration, email - -%%license: GPL - -%%maintainer: Werner Koch <wk@gnupg.org> - -%%interface: Command line - -%%updated: 1 Jun 2001 - -%%keywords: PGP, security, decryption, encryption, digital signatures - -%%programs: - -%%GNU: yes - -%%web-page: http://www.gnupg.org/ - -%%support: Paid extension/consulting from http://www.g10code.com - -%%doc: English user manual available from: -http://www.gnupg.org/gph/index.html; Spanish user manual available from: -http://www.gnupg.org/gph/index.html; English HOWTO available from -http://www.dewinter.com/gnupg_howto/english/; French HOWTO available -from http://www.gnupg.org/howtos/fr/; German HOWTO available from -http://www.gnupg.org/howtos/de/; Spanish HOWTO available from -http://www.dewinter.com/gnupg_howto/spanish. - -%%developers: Matthew Skala, Michael Roth, Niklas Hernaeus, Remi -Guyomarch, Werner Koch <wk@gnupg.org>. - -%%contributors: J. Michael Ashley - -%%sponsors: German Federal Ministry of Economics and Technology - -%%source: ftp://ftp.gnupg.org/gcrypt/gnupg - -%%debian: http://www.debian.org/Packages/stable/non-us/gnupg.html - -%%redhat: http://www.megaloman.com/~hany/RPM/gnupg.html - -%%repository: See http://www.gnupg.org/cvs-access.html - -%%related: shred - -%%source-language: C - -%%supported-languages: - -%%use-requirements: - -%%build-prerequisites: - -%%weak-prerequisites: - -%%source-prerequisites: - -%%version: 1.0.6 stable released on 29 May 2001 - -%%announce-list: announce@gnupg.org - -%%announce-news: - -%%help-list: gnupg-users@gnupg.org - -%%help-news: - -%%dev-list: gnupg-devel@gnupg.org - -%%dev-news: - -%%bug-list: bug-gnupg@gnupg.org diff --git a/include/ChangeLog b/include/ChangeLog index eaee0ddd3..3fd3fe48c 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,206 +1,41 @@ -2006-04-20 David Shaw <dshaw@jabberwocky.com> +2006-04-28 Werner Koch <wk@g10code.com> - * cipher.h: Add dsa2_generate(); + * cipher.h (DIGEST_ALGO_SHA224): Define it. -2006-04-19 David Shaw <dshaw@jabberwocky.com> +2006-04-18 Werner Koch <wk@g10code.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. + * keyserver.h, i18n.h, http.h, cipher.h: Updated to gpg 1.4.3. 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-09-04 Werner Koch <wk@gnupg.org> + + * cipher.h (PUBKEY_USAGE_AUTH): Added. + +2003-07-03 Werner Koch <wk@gnupg.org> + + * cipher.h (DBG_CIPHER,g10c_debug_mode): Removed. + +2003-06-11 Werner Koch <wk@gnupg.org> + + * cipher.h: Include gcrypt.h and mapped cipher algo names to + gcrypt ones. Removed twofish_old and skipjack. Removed all + handle definitions and other raerely used stuff. This file will + eventually be entirely removed. + +2003-06-10 Werner Koch <wk@gnupg.org> + + * types.h (struct strlist): Removed. + 2003-05-24 David Shaw <dshaw@jabberwocky.com> * cipher.h, i18n.h, iobuf.h, memory.h, mpi.h, types.h, util.h: @@ -563,8 +398,7 @@ Tue Mar 3 15:11:21 1998 Werner Koch (wk@isil.d.shuttle.de) functions to this header. - Copyright 1998, 1999, 2000, 2001, 2002, 2003, - 2004, 2005 Free Software Foundation, Inc. + 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 @@ -573,3 +407,5 @@ Tue Mar 3 15:11:21 1998 Werner Koch (wk@isil.d.shuttle.de) 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 index 88acc352d..ddd002484 100644 --- a/include/_regex.h +++ b/include/_regex.h @@ -16,8 +16,8 @@ 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. */ + Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + MA 02110-1301, USA. */ #ifndef _REGEX_H #define _REGEX_H 1 diff --git a/include/assuan.h b/include/assuan.h deleted file mode 100644 index 683f55bc1..000000000 --- a/include/assuan.h +++ /dev/null @@ -1,262 +0,0 @@ -/* 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 index 5b531ccd2..d8b15cf9a 100644 --- a/include/cipher.h +++ b/include/cipher.h @@ -1,15 +1,14 @@ -/* cipher.h - * Copyright (C) 1998, 1999, 2000, 2001, 2003, 2004, 2005, - * 2006 Free Software Foundation, Inc. +/* cipher.h - Definitions for OpenPGP + * Copyright (C) 1998, 1999, 2000, 2001, 2006 Free Software Foundation, Inc. * - * This file is part of GNUPG. + * This file is part of GnuPG. * - * GNUPG is free software; you can redistribute it and/or modify + * GnuPG is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * - * GNUPG is distributed in the hope that it will be useful, + * GnuPG is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. @@ -22,49 +21,60 @@ #ifndef G10_CIPHER_H #define G10_CIPHER_H -#define DBG_CIPHER g10c_debug_mode +#include <gcrypt.h> -#include "mpi.h" -#include "../cipher/random.h" +/* Macros for compatibility with older libgcrypt versions. */ +#ifndef GCRY_PK_USAGE_CERT +# define GCRY_PK_USAGE_CERT 4 +# define GCRY_PK_USAGE_AUTH 8 +# define GCRY_PK_USAGE_UNKN 128 +#endif -#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 */ +/* Constants for OpenPGP. */ + +#define CIPHER_ALGO_NONE /* 0 */ GCRY_CIPHER_NONE +#define CIPHER_ALGO_IDEA /* 1 */ GCRY_CIPHER_IDEA +#define CIPHER_ALGO_3DES /* 2 */ GCRY_CIPHER_3DES +#define CIPHER_ALGO_CAST5 /* 3 */ GCRY_CIPHER_CAST5 +#define CIPHER_ALGO_BLOWFISH /* 4 */ GCRY_CIPHER_BLOWFISH /* 128 bit */ /* 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 CIPHER_ALGO_AES /* 7 */ GCRY_CIPHER_AES +#define CIPHER_ALGO_AES192 /* 8 */ GCRY_CIPHER_AES192 +#define CIPHER_ALGO_AES256 /* 9 */ GCRY_CIPHER_AES256 +#define CIPHER_ALGO_RIJNDAEL CIPHER_ALGO_AES +#define CIPHER_ALGO_RIJNDAEL192 CIPHER_ALGO_AES192 +#define CIPHER_ALGO_RIJNDAEL256 CIPHER_ALGO_AES256 +#define CIPHER_ALGO_TWOFISH /* 10 */ GCRY_CIPHER_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_ALGO_RSA /* 1 */ GCRY_PK_RSA +#define PUBKEY_ALGO_RSA_E /* 2 */ GCRY_PK_RSA_E /* RSA encrypt only. */ +#define PUBKEY_ALGO_RSA_S /* 3 */ GCRY_PK_RSA_S /* RSA sign only. */ +#define PUBKEY_ALGO_ELGAMAL_E /* 16 */ GCRY_PK_ELG_E /* Elgamal encr only */ +#define PUBKEY_ALGO_DSA /* 17 */ GCRY_PK_DSA +#define PUBKEY_ALGO_ELGAMAL /* 20 */ GCRY_PK_ELG /* Elgamal encr+sign */ -#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 PUBKEY_USAGE_SIG GCRY_PK_USAGE_SIGN /* Good for signatures. */ +#define PUBKEY_USAGE_ENC GCRY_PK_USAGE_ENCR /* Good for encryption. */ +#define PUBKEY_USAGE_CERT GCRY_PK_USAGE_CERT /* Also good to certify keys. */ +#define PUBKEY_USAGE_AUTH GCRY_PK_USAGE_AUTH /* Good for authentication. */ +#define PUBKEY_USAGE_UNKNOWN GCRY_PK_USAGE_UNKN /* Unknown usage flag. */ -#define DIGEST_ALGO_MD5 1 -#define DIGEST_ALGO_SHA1 2 -#define DIGEST_ALGO_RMD160 3 +#define DIGEST_ALGO_MD5 /* 1 */ GCRY_MD_MD5 +#define DIGEST_ALGO_SHA1 /* 2 */ GCRY_MD_SHA1 +#define DIGEST_ALGO_RMD160 /* 3 */ GCRY_MD_RMD160 /* 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 DIGEST_ALGO_SHA256 /* 8 */ GCRY_MD_SHA256 +#define DIGEST_ALGO_SHA384 /* 9 */ GCRY_MD_SHA384 +#define DIGEST_ALGO_SHA512 /* 10 */ GCRY_MD_SHA512 +/* SHA224 is as of now only defined in the libgcrypt SVN; thus we + can't use that macro. */ +#define DIGEST_ALGO_SHA224 /* 11 */ 11 /* GCRY_MD_SHA224 */ -#define COMPRESS_ALGO_NONE 0 -#define COMPRESS_ALGO_ZIP 1 -#define COMPRESS_ALGO_ZLIB 2 +#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 \ @@ -72,138 +82,23 @@ #define is_ELGAMAL(a) ((a)==PUBKEY_ALGO_ELGAMAL_E) #define is_DSA(a) ((a)==PUBKEY_ALGO_DSA) -typedef struct +/* The data encryption key object. */ +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) */ + 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 --*/ +/* Constants to allocate static MPI arrays. */ #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/distfiles b/include/distfiles index 1295adefe..b11749d78 100644 --- a/include/distfiles +++ b/include/distfiles @@ -1,9 +1,7 @@ cipher.h errors.h -iobuf.h memory.h mpi.h -ttyio.h types.h util.h i18n.h @@ -11,7 +9,5 @@ host2net.h http.h keyserver.h _regex.h -dynload.h -assuan.h ChangeLog diff --git a/include/errors.h b/include/errors.h index 177353b7e..f3269ce5b 100644 --- a/include/errors.h +++ b/include/errors.h @@ -1,4 +1,4 @@ -/* errors.h - erro code +/* errors.h - error code * Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. * * This file is part of GNUPG. @@ -18,9 +18,16 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. */ -#ifndef G10_ERRORS_H -#define G10_ERRORS_H +#ifndef GNUPG_INCLUDE_ERRORS_H +#define GNUPG_INCLUDE_ERRORS_H +#if 0 +#error Remove this file after replacing all error codes with those +#error from libgpg-error. The numerical values are identical, though. +#endif + + +#if 0 /* Not used anymore. */ #define G10ERR_GENERAL 1 #define G10ERR_UNKNOWN_PACKET 2 #define G10ERR_UNKNOWN_VERSION 3 /* Unknown version (in packet) */ @@ -76,16 +83,20 @@ #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 +#endif #ifndef HAVE_STRERROR -char *strerror (int n); +char *strerror( int n ); #endif -#ifdef _WIN32 -const char * w32_strerror (int w32_errno); -#endif +#endif /*GNUPG_INCLUDE_ERRORS_H*/ + + + + + + + + + -#endif /*G10_ERRORS_H*/ diff --git a/include/host2net.h b/include/host2net.h index d72b828d0..e378bfb29 100644 --- a/include/host2net.h +++ b/include/host2net.h @@ -1,14 +1,14 @@ /* host2net.h - Some macros * Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. * - * This file is part of GNUPG. + * This file is part of GnuPG. * - * GNUPG is free software; you can redistribute it and/or modify + * GnuPG is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * - * GNUPG is distributed in the hope that it will be useful, + * GnuPG is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. diff --git a/include/http.h b/include/http.h index 060b5b8fc..b9ce5b130 100644 --- a/include/http.h +++ b/include/http.h @@ -23,7 +23,7 @@ #ifndef G10_HTTP_H #define G10_HTTP_H 1 -#include "iobuf.h" +#include "../common/iobuf.h" struct uri_tuple { struct uri_tuple *next; @@ -65,8 +65,8 @@ struct http_context { unsigned int status_code; int sock; int in_data; - IOBUF fp_read; - IOBUF fp_write; + iobuf_t fp_read; + iobuf_t fp_write; int is_http_0_9; PARSED_URI uri; HTTP_REQ_TYPE req_type; diff --git a/include/iobuf.h b/include/iobuf.h deleted file mode 100644 index 0e3584c18..000000000 --- a/include/iobuf.h +++ /dev/null @@ -1,162 +0,0 @@ -/* 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; - -/* 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 index 8900dbe6e..7bd12625e 100644 --- a/include/keyserver.h +++ b/include/keyserver.h @@ -1,14 +1,14 @@ /* keyserver.h - * Copyright (C) 2001, 2002, 2004 Free Software Foundation, Inc. + * Copyright (C) 2001, 2002 Free Software Foundation, Inc. * - * This file is part of GNUPG. + * This file is part of GnuPG. * - * GNUPG is free software; you can redistribute it and/or modify + * GnuPG is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * - * GNUPG is distributed in the hope that it will be useful, + * GnuPG is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. diff --git a/include/memory.h b/include/memory.h index 895d8a771..2e2f8fdce 100644 --- a/include/memory.h +++ b/include/memory.h @@ -1,5 +1,5 @@ /* memory.h - memory allocation - * Copyright (C) 1998, 1999, 2000, 2001, 2005 Free Software Foundation, Inc. + * Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. * * This file is part of GNUPG. * @@ -22,6 +22,8 @@ #ifndef G10_MEMORY_H #define G10_MEMORY_H +#error this file should not be used anymore + #ifdef M_DEBUG #ifndef STR #define STR(v) #v @@ -31,15 +33,15 @@ #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_alloc(n) m_debug_alloc((n), M_DBGINFO( __LINE__ ) ) +#define m_alloc_clear(n) m_debug_alloc_clear((n), M_DBGINFO(__LINE__) ) +#define m_alloc_secure(n) m_debug_alloc((n), M_DBGINFO(__LINE__) ) +#define m_alloc_secure_clear(n) m_debug_alloc_secure_clear((n), M_DBGINFO(__LINE__) ) +#define m_realloc(n,m) m_debug_realloc((n),(m), M_DBGINFO(__LINE__) ) +#define m_free(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__) ) +#define m_strdup(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 ); @@ -52,30 +54,25 @@ void m_debug_check( 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_alloc( size_t n ); +void *m_alloc_clear( size_t n ); +void *m_alloc_secure( size_t n ); +void *m_alloc_secure_clear( size_t n ); +void *m_realloc( void *a, size_t n ); +void m_free( void *p ); void m_check( const void *a ); /*void *m_copy( const void *a );*/ -char *xstrdup( const char * a); +char *m_strdup( 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_init( size_t npool ); void secmem_term( void ); void *secmem_malloc( size_t size ); -void *secmexrealloc( void *a, size_t newsize ); +void *secmem_realloc( void *a, size_t newsize ); void secmem_free( void *a ); int m_is_secure( const void *p ); void secmem_dump_stats(void); @@ -96,6 +93,4 @@ unsigned secmem_get_flags(void); 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 index bec37ce6c..7402ef6d3 100644 --- a/include/mpi.h +++ b/include/mpi.h @@ -31,6 +31,13 @@ #ifndef G10_MPI_H #define G10_MPI_H +#error this file should not be used anymore + +#include <gcrypt.h> + +#if 0 + + #include <config.h> #include <stdio.h> #include "iobuf.h" @@ -69,11 +76,11 @@ 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 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 */ + /* bit 2: the limb is a pointer to some m_alloced data */ mpi_limb_t *d; /* array with the limbs */ }; @@ -108,8 +115,8 @@ 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 ); +MPI mpi_set_opaque( MPI a, void *p, int len ); +void *mpi_get_opaque( MPI a, int *len ); #define mpi_is_secure(a) ((a) && ((a)->flags&1)) void mpi_set_secure( MPI a ); void mpi_clear( MPI a ); @@ -167,7 +174,7 @@ 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); +void mpi_powm( MPI res, MPI base, MPI exp, MPI mod); /*-- mpi-mpow.c --*/ void mpi_mulpowm( MPI res, MPI *basearray, MPI *exparray, MPI mod); @@ -193,5 +200,5 @@ void mpi_rshift( MPI x, MPI a, unsigned n ); /*-- mpi-inv.c --*/ void mpi_invm( MPI x, MPI u, MPI v ); - +#endif #endif /*G10_MPI_H*/ diff --git a/include/types.h b/include/types.h index 3b85b10e1..6abd500e3 100644 --- a/include/types.h +++ b/include/types.h @@ -1,14 +1,14 @@ /* types.h - some common typedefs * Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. * - * This file is part of GNUPG. + * This file is part of GnuPG. * - * GNUPG is free software; you can redistribute it and/or modify + * GnuPG is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * - * GNUPG is distributed in the hope that it will be useful, + * GnuPG is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. @@ -133,10 +133,4 @@ typedef union { 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 index ee25be12e..1d6d01366 100644 --- a/include/util.h +++ b/include/util.h @@ -1,6 +1,5 @@ /* util.h - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, - * 2006 Free Software Foundation, Inc. + * Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. * * This file is part of GNUPG. * @@ -22,7 +21,10 @@ #ifndef G10_UTIL_H #define G10_UTIL_H -#if defined (_WIN32) || defined (__CYGWIN32__) +#error this file should not be used anymore +#if 0 /* Dont use it anymore */ + +#if defined (__MINGW32__) || defined (__CYGWIN32__) #include <stdarg.h> #endif @@ -86,6 +88,14 @@ void g10_log_hexdump( const char *text, const char *buf, size_t len ); 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))); + void g10_log_fatal_f( const char *fname, const char *fmt, ... ) + __attribute__ ((noreturn, format (printf,2,3))); + void g10_log_error_f( const char *fname, const char *fmt, ... ) + __attribute__ ((format (printf,2,3))); + void g10_log_info_f( const char *fname, const char *fmt, ... ) + __attribute__ ((format (printf,2,3))); + void g10_log_debug_f( const char *fname, const char *fmt, ... ) + __attribute__ ((format (printf,2,3))); #ifndef __riscos__ #define BUG() g10_log_bug0( __FILE__ , __LINE__, __FUNCTION__ ) #else @@ -99,6 +109,10 @@ void g10_log_hexdump( const char *text, const char *buf, size_t len ); void g10_log_info( const char *fmt, ... ); void g10_log_warning( const char *fmt, ... ); void g10_log_debug( const char *fmt, ... ); + void g10_log_fatal_f( const char *fname, const char *fmt, ... ); + void g10_log_error_f( const char *fname, const char *fmt, ... ); + void g10_log_info_f( const char *fname, const char *fmt, ... ); + void g10_log_debug_f( const char *fname, const char *fmt, ... ); #define BUG() g10_log_bug0( __FILE__ , __LINE__ ) #endif @@ -110,11 +124,12 @@ void g10_log_hexdump( const char *text, const char *buf, size_t len ); #define log_info g10_log_info #define log_warning g10_log_warning #define log_debug g10_log_debug +#define log_fatal_f g10_log_fatal_f +#define log_error_f g10_log_error_f +#define log_info_f g10_log_info_f +#define log_debug_f g10_log_debug_f -/*-- 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, @@ -133,7 +148,6 @@ 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); @@ -145,37 +159,28 @@ 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); +int is_file_compressed(const char *s, int *r_status); + /*-- miscutil.c --*/ u32 make_timestamp(void); u32 scan_isodatestr( const char *string ); +u32 add_days_to_timestamp( u32 stamp, u16 days ); 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); -int hextobyte( const char *s ); /*-- 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 ); + +#include "../jnlib/strlist.h" + 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); @@ -223,25 +228,7 @@ int strncasecmp (const char *, const char *b, size_t n); #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) +#if defined (__MINGW32__) /*-- w32reg.c --*/ char *read_w32_registry_string( const char *root, const char *dir, const char *name ); @@ -249,16 +236,8 @@ 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); +int vasprintf ( char **result, const char *format, va_list args); +#endif /**** other missing stuff ****/ #ifndef HAVE_ATEXIT /* For SunOS */ @@ -269,10 +248,6 @@ int get_cert(const char *name,size_t max_size,IOBUF *iobuf, #define raise(a) kill(getpid(), (a)) #endif -/*-- Replacement functions from funcname.c --*/ - - - /******** some macros ************/ #ifndef STR #define STR(v) #v @@ -284,26 +259,16 @@ int get_cert(const char *name,size_t max_size,IOBUF *iobuf, #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)) - -/* 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') - /******* RISC OS stuff ***********/ #ifdef __riscos__ +/* needed for strcasecmp() */ +#include <strings.h> +/* needed for filename munging */ +#include <unixlib/local.h> +/* needed for image file system feature */ +#include <unixlib/features.h> +void riscos_global_defaults(void); +#define RISCOS_GLOBAL_STATICS(a) const char *__dynamic_da_name = (a); 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); @@ -331,4 +296,6 @@ void riscos_list_openfiles(void); #endif /* !__RISCOS__C__ */ #endif /* __riscos__ */ +#endif + #endif /*G10_UTIL_H*/ diff --git a/intl/Makefile.in b/intl/Makefile.in index 1ad087adf..05f15329e 100644 --- a/intl/Makefile.in +++ b/intl/Makefile.in @@ -13,7 +13,7 @@ # # 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, +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, # USA. PACKAGE = @PACKAGE@ diff --git a/intl/bindtextdom.c b/intl/bindtextdom.c index 7a2606264..dcdc40085 100644 --- a/intl/bindtextdom.c +++ b/intl/bindtextdom.c @@ -13,7 +13,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H diff --git a/intl/config.charset b/intl/config.charset index d4964dc4e..43d45fb75 100755 --- a/intl/config.charset +++ b/intl/config.charset @@ -15,7 +15,7 @@ # # 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, +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, # USA. # # The table consists of lines of the form diff --git a/intl/dcgettext.c b/intl/dcgettext.c index c2a63f08e..850acdee9 100644 --- a/intl/dcgettext.c +++ b/intl/dcgettext.c @@ -13,7 +13,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H diff --git a/intl/dcigettext.c b/intl/dcigettext.c index 22b7cd2f6..35238e2cb 100644 --- a/intl/dcigettext.c +++ b/intl/dcigettext.c @@ -13,7 +13,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Tell glibc's <string.h> to provide a prototype for mempcpy(). diff --git a/intl/dcngettext.c b/intl/dcngettext.c index eb368336c..48a3e09e0 100644 --- a/intl/dcngettext.c +++ b/intl/dcngettext.c @@ -13,7 +13,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H diff --git a/intl/dgettext.c b/intl/dgettext.c index 9b0d0de6c..b64b0f5d3 100644 --- a/intl/dgettext.c +++ b/intl/dgettext.c @@ -13,7 +13,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H diff --git a/intl/dngettext.c b/intl/dngettext.c index 3278438fe..7815637f0 100644 --- a/intl/dngettext.c +++ b/intl/dngettext.c @@ -13,7 +13,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H diff --git a/intl/eval-plural.h b/intl/eval-plural.h index dacd003db..01bd5af5f 100644 --- a/intl/eval-plural.h +++ b/intl/eval-plural.h @@ -13,7 +13,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef STATIC diff --git a/intl/explodename.c b/intl/explodename.c index 1361418df..52c25e727 100644 --- a/intl/explodename.c +++ b/intl/explodename.c @@ -13,7 +13,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H diff --git a/intl/finddomain.c b/intl/finddomain.c index 498f858ff..4992a8c9e 100644 --- a/intl/finddomain.c +++ b/intl/finddomain.c @@ -14,7 +14,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H diff --git a/intl/gettext.c b/intl/gettext.c index d82d439c0..92c42faa7 100644 --- a/intl/gettext.c +++ b/intl/gettext.c @@ -13,7 +13,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H diff --git a/intl/gettext.h b/intl/gettext.h deleted file mode 100644 index 605b63dac..000000000 --- a/intl/gettext.h +++ /dev/null @@ -1,102 +0,0 @@ -/* Description of GNU message catalog format: general file layout. - Copyright (C) 1995, 1997, 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 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 - -#if HAVE_LIMITS_H || _LIBC -# include <limits.h> -#endif - -/* @@ 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 - -/* 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 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 translation strings. */ - nls_uint32 trans_tab_offset; - /* Size of hashing table. */ - nls_uint32 hash_tab_size; - /* Offset of first hashing entry. */ - nls_uint32 hash_tab_offset; -}; - -struct string_desc -{ - /* Length of addressed string. */ - nls_uint32 length; - /* Offset of string in file. */ - nls_uint32 offset; -}; - -/* @@ begin of epilog @@ */ - -#endif /* gettext.h */ diff --git a/intl/gettextP.h b/intl/gettextP.h index ccd5e87bb..4d66c3de3 100644 --- a/intl/gettextP.h +++ b/intl/gettextP.h @@ -14,7 +14,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _GETTEXTP_H diff --git a/intl/gmo.h b/intl/gmo.h index 26515feb2..e7c9cc14b 100644 --- a/intl/gmo.h +++ b/intl/gmo.h @@ -13,7 +13,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _GETTEXT_H diff --git a/intl/hash-string.h b/intl/hash-string.h index 2c9a3a57e..093e3b1c1 100644 --- a/intl/hash-string.h +++ b/intl/hash-string.h @@ -13,7 +13,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* @@ end of prolog @@ */ diff --git a/intl/intl-compat.c b/intl/intl-compat.c index 15be09cbc..96f9d955d 100644 --- a/intl/intl-compat.c +++ b/intl/intl-compat.c @@ -14,7 +14,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H diff --git a/intl/l10nflist.c b/intl/l10nflist.c index e62aa5c90..eb995aafa 100644 --- a/intl/l10nflist.c +++ b/intl/l10nflist.c @@ -13,7 +13,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Tell glibc's <string.h> to provide a prototype for stpcpy(). diff --git a/intl/libgettext.h b/intl/libgettext.h deleted file mode 100644 index e939e2ae7..000000000 --- a/intl/libgettext.h +++ /dev/null @@ -1,49 +0,0 @@ -/* Convenience header for conditional use of GNU <libintl.h>. - Copyright (C) 1995-1998, 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 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 _LIBGETTEXT_H -#define _LIBGETTEXT_H 1 - -/* NLS can be disabled through the configure --disable-nls option. */ -#if ENABLE_NLS - -/* Get declarations of GNU message catalog functions. */ -# include <libintl.h> - -#else - -# define gettext(Msgid) (Msgid) -# define dgettext(Domainname, Msgid) (Msgid) -# define dcgettext(Domainname, Msgid, Category) (Msgid) -# define ngettext(Msgid1, Msgid2, N) \ - ((N) == 1 ? (char *) (Msgid1) : (char *) (Msgid2)) -# define dngettext(Domainname, Msgid1, Msgid2, N) \ - ((N) == 1 ? (char *) (Msgid1) : (char *) (Msgid2)) -# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ - ((N) == 1 ? (char *) (Msgid1) : (char *) (Msgid2)) -# define textdomain(Domainname) ((char *) (Domainname)) -# define bindtextdomain(Domainname, Dirname) ((char *) (Dirname)) -# define bind_textdomain_codeset(Domainname, Codeset) ((char *) (Codeset)) - -#endif - -/* For automatical extraction of messages sometimes no real - translation is needed. Instead the string itself is the result. */ -#define gettext_noop(Str) (Str) - -#endif /* _LIBGETTEXT_H */ diff --git a/intl/libgnuintl.h b/intl/libgnuintl.h index f891deb96..ed25fe9f5 100644 --- a/intl/libgnuintl.h +++ b/intl/libgnuintl.h @@ -1,5 +1,5 @@ /* Message catalogs for internationalization. - Copyright (C) 1995-1997, 2000, 2001 Free Software Foundation, Inc. + Copyright (C) 1995-1997, 2000-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 @@ -24,10 +24,11 @@ /* 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 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 + 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 @@ -35,18 +36,24 @@ 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 -# define gettext gettext #endif -#ifndef PARAMS -# if __STDC__ || defined __cplusplus -# define PARAMS(args) args +/* Use _INTL_PARAMS, not PARAMS, in order to avoid clashes with identifiers + used by programs. Similarly, test __PROTOTYPES, not PROTOTYPES. */ +#ifndef _INTL_PARAMS +# if __STDC__ || defined __GNUC__ || defined __SUNPRO_C || defined __cplusplus || __PROTOTYPES +# define _INTL_PARAMS(args) args # else -# define PARAMS(args) () +# define _INTL_PARAMS(args) () # endif #endif @@ -54,71 +61,232 @@ 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 __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). */ -extern char *gettext PARAMS ((const char *__msgid)); +#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 _INTL_PARAMS ((const char *__msgid)) + _INTL_ASM (libintl_gettext); +#endif /* Look up MSGID in the DOMAINNAME message catalog for the current LC_MESSAGES locale. */ -extern char *dgettext PARAMS ((const char *__domainname, const char *__msgid)); +#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 _INTL_PARAMS ((const char *__domainname, + const char *__msgid)) + _INTL_ASM (libintl_dgettext); +#endif /* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY locale. */ -extern char *dcgettext PARAMS ((const char *__domainname, const char *__msgid, - int __category)); +#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 _INTL_PARAMS ((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. */ -extern char *ngettext PARAMS ((const char *__msgid1, const char *__msgid2, - unsigned long int __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 _INTL_PARAMS ((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. */ -extern char *dngettext PARAMS ((const char *__domainname, const char *__msgid1, - const char *__msgid2, unsigned long int __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 _INTL_PARAMS ((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. */ -extern char *dcngettext PARAMS ((const char *__domainname, const char *__msgid1, - const char *__msgid2, unsigned long int __n, - int __category)); +#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 _INTL_PARAMS ((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". */ -extern char *textdomain PARAMS ((const char *__domainname)); +#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 _INTL_PARAMS ((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. */ -extern char *bindtextdomain PARAMS ((const char *__domainname, - const char *__dirname)); +#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 _INTL_PARAMS ((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. */ -extern char *bind_textdomain_codeset PARAMS ((const char *__domainname, - const char *__codeset)); - - -/* Optimized version of the functions above. */ -#if defined __OPTIMIZED -/* These are macros, but could also be inline functions. */ - -# define gettext(msgid) \ - dgettext (NULL, msgid) - -# define dgettext(domainname, msgid) \ - dcgettext (domainname, msgid, LC_MESSAGES) - -# define ngettext(msgid1, msgid2, n) \ - dngettext (NULL, msgid1, msgid2, n) - -# define dngettext(domainname, msgid1, msgid2, n) \ - dcngettext (domainname, msgid1, msgid2, n, LC_MESSAGES) - -#endif /* Optimizing. */ +#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 _INTL_PARAMS ((const char *__domainname, + const char *__codeset)) + _INTL_ASM (libintl_bind_textdomain_codeset); +#endif #ifdef __cplusplus diff --git a/intl/libgnuintl.h.in b/intl/libgnuintl.h.in index c8c5620de..3be7eb990 100644 --- a/intl/libgnuintl.h.in +++ b/intl/libgnuintl.h.in @@ -13,7 +13,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _LIBINTL_H diff --git a/intl/loadinfo.h b/intl/loadinfo.h index d6408f2a3..65e5ebd1f 100644 --- a/intl/loadinfo.h +++ b/intl/loadinfo.h @@ -14,7 +14,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _LOADINFO_H diff --git a/intl/loadmsgcat.c b/intl/loadmsgcat.c index 0d59ad8f7..99c51b4c5 100644 --- a/intl/loadmsgcat.c +++ b/intl/loadmsgcat.c @@ -13,7 +13,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Tell glibc's <string.h> to provide a prototype for mempcpy(). diff --git a/intl/localcharset.c b/intl/localcharset.c index 449ffc7b3..4865f1037 100644 --- a/intl/localcharset.c +++ b/intl/localcharset.c @@ -14,7 +14,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Written by Bruno Haible <bruno@clisp.org>. */ diff --git a/intl/localcharset.h b/intl/localcharset.h index 129e4a4a3..3b137e73c 100644 --- a/intl/localcharset.h +++ b/intl/localcharset.h @@ -14,7 +14,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _LOCALCHARSET_H diff --git a/intl/locale.alias b/intl/locale.alias index faa696918..bd6bb2562 100644 --- a/intl/locale.alias +++ b/intl/locale.alias @@ -13,7 +13,7 @@ # # 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, +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, # USA. # The format of this file is the same as for the corresponding file of diff --git a/intl/localealias.c b/intl/localealias.c index 7a092a0df..2eaf8813e 100644 --- a/intl/localealias.c +++ b/intl/localealias.c @@ -13,7 +13,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Tell glibc's <string.h> to provide a prototype for mempcpy(). diff --git a/intl/localename.c b/intl/localename.c index 9d651461a..5662e54ff 100644 --- a/intl/localename.c +++ b/intl/localename.c @@ -13,7 +13,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Written by Ulrich Drepper <drepper@gnu.org>, 1995. */ diff --git a/intl/log.c b/intl/log.c index 89f82dfd1..cb6076e80 100644 --- a/intl/log.c +++ b/intl/log.c @@ -13,7 +13,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Written by Bruno Haible <bruno@clisp.org>. */ diff --git a/intl/ngettext.c b/intl/ngettext.c index a33529c20..e73e00c48 100644 --- a/intl/ngettext.c +++ b/intl/ngettext.c @@ -13,7 +13,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H diff --git a/intl/os2compat.c b/intl/os2compat.c index d041de2af..c8dc33e7c 100644 --- a/intl/os2compat.c +++ b/intl/os2compat.c @@ -13,7 +13,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #define OS2_AWARE diff --git a/intl/os2compat.h b/intl/os2compat.h index a18d582cd..4f74e8c03 100644 --- a/intl/os2compat.h +++ b/intl/os2compat.h @@ -14,7 +14,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* When included from os2compat.h we need all the original definitions */ diff --git a/intl/osdep.c b/intl/osdep.c index d2d8575ec..b37259838 100644 --- a/intl/osdep.c +++ b/intl/osdep.c @@ -13,7 +13,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #if defined __EMX__ diff --git a/intl/plural-exp.c b/intl/plural-exp.c index 1873be90b..8c04e6426 100644 --- a/intl/plural-exp.c +++ b/intl/plural-exp.c @@ -14,7 +14,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H diff --git a/intl/plural-exp.h b/intl/plural-exp.h index f54018471..49e2c5bfc 100644 --- a/intl/plural-exp.h +++ b/intl/plural-exp.h @@ -14,7 +14,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _PLURAL_EXP_H diff --git a/intl/plural.c b/intl/plural.c index c73008b39..72494f9eb 100644 --- a/intl/plural.c +++ b/intl/plural.c @@ -34,7 +34,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* The bison generated parser uses alloca. AIX 3 forces us to put this @@ -315,8 +315,8 @@ static const short yycheck[] = You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. */ + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, 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. diff --git a/intl/plural.y b/intl/plural.y index fe791120b..4d33bd7c7 100644 --- a/intl/plural.y +++ b/intl/plural.y @@ -15,7 +15,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* The bison generated parser uses alloca. AIX 3 forces us to put this diff --git a/intl/printf-args.c b/intl/printf-args.c index f97590147..f6f3219e7 100644 --- a/intl/printf-args.c +++ b/intl/printf-args.c @@ -13,7 +13,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H diff --git a/intl/printf-args.h b/intl/printf-args.h index 625b8036a..f11e64c04 100644 --- a/intl/printf-args.h +++ b/intl/printf-args.h @@ -13,7 +13,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _PRINTF_ARGS_H diff --git a/intl/printf-parse.c b/intl/printf-parse.c index 20240e379..d19f903d7 100644 --- a/intl/printf-parse.c +++ b/intl/printf-parse.c @@ -13,7 +13,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H diff --git a/intl/printf-parse.h b/intl/printf-parse.h index e78533895..8aec50e2a 100644 --- a/intl/printf-parse.h +++ b/intl/printf-parse.h @@ -13,7 +13,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _PRINTF_PARSE_H diff --git a/intl/printf.c b/intl/printf.c index 5e112b69b..878646c2d 100644 --- a/intl/printf.c +++ b/intl/printf.c @@ -14,7 +14,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H diff --git a/intl/ref-add.sin b/intl/ref-add.sin index 3678c2892..167374e3c 100644 --- a/intl/ref-add.sin +++ b/intl/ref-add.sin @@ -14,7 +14,7 @@ # # 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, +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, # USA. # # Written by Bruno Haible <haible@clisp.cons.org>. diff --git a/intl/ref-del.sin b/intl/ref-del.sin index 0c12d8e95..613cf37f3 100644 --- a/intl/ref-del.sin +++ b/intl/ref-del.sin @@ -14,7 +14,7 @@ # # 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, +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, # USA. # # Written by Bruno Haible <haible@clisp.cons.org>. diff --git a/intl/relocatable.c b/intl/relocatable.c index a2e5aa7ab..bf7c70854 100644 --- a/intl/relocatable.c +++ b/intl/relocatable.c @@ -14,7 +14,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ diff --git a/intl/relocatable.h b/intl/relocatable.h index 614e64e2f..48c5b71e2 100644 --- a/intl/relocatable.h +++ b/intl/relocatable.h @@ -14,7 +14,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _RELOCATABLE_H diff --git a/intl/textdomain.c b/intl/textdomain.c index 2bf62407d..8745a8435 100644 --- a/intl/textdomain.c +++ b/intl/textdomain.c @@ -13,7 +13,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H diff --git a/intl/vasnprintf.c b/intl/vasnprintf.c index f192f2088..8a62282d7 100644 --- a/intl/vasnprintf.c +++ b/intl/vasnprintf.c @@ -13,7 +13,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Tell glibc's <stdio.h> to provide a prototype for snprintf(). diff --git a/intl/vasnprintf.h b/intl/vasnprintf.h index 5c62fb28b..65f1bc13d 100644 --- a/intl/vasnprintf.h +++ b/intl/vasnprintf.h @@ -13,7 +13,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _VASNPRINTF_H diff --git a/intl/vasnwprintf.h b/intl/vasnwprintf.h index 6ff03ce16..d3cef4cbc 100644 --- a/intl/vasnwprintf.h +++ b/intl/vasnwprintf.h @@ -13,7 +13,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _VASNWPRINTF_H diff --git a/intl/wprintf-parse.h b/intl/wprintf-parse.h index 600b89adc..24a2cfc28 100644 --- a/intl/wprintf-parse.h +++ b/intl/wprintf-parse.h @@ -13,7 +13,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _WPRINTF_PARSE_H diff --git a/intl/xsize.h b/intl/xsize.h index b3023a7d4..362e24b72 100644 --- a/intl/xsize.h +++ b/intl/xsize.h @@ -14,7 +14,7 @@ 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, + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _XSIZE_H diff --git a/jnlib/ChangeLog b/jnlib/ChangeLog new file mode 100644 index 000000000..5511dedcd --- /dev/null +++ b/jnlib/ChangeLog @@ -0,0 +1,389 @@ +2006-06-28 Werner Koch <wk@g10code.com> + + * dotlock.c (make_dotlock, release_dotlock, read_lockfile) + (maybe_deadlock, destroy_dotlock, create_dotlock): Re-indented. + (create_dotlock): Repalces some log_fatal by log_error as it was + not intended that they should terminate. Write the nodename to + the locking file. Code cleanups. + (read_lockfile): Reworked to read the node name. + (make_dotlock): Test for identical node name and delete lock stale + file. + (release_dotlock): Likewise. + +2006-05-23 Werner Koch <wk@g10code.com> + + * libjnlib-config.h (JNLIB_NEED_UTF8CONV): Fixed typo in name. + + * dotlock.c (release_dotlock): Don't act if we don't have any + locks at all. + (destroy_dotlock): New. From 1.4.3. + (dotlock_remove_lockfiles): Make use of destroy function. + +2006-05-19 Werner Koch <wk@g10code.com> + + * strlist.c (append_to_strlist2): Enabled. + + * stringhelp.c (print_sanitized_buffer2): New. Changed the rules + to match the behaviour of print_string2 from gnupg 1.4.3. + (print_sanitized_buffer): Use the new function. + (print_sanitized_string2): New. + (hextobyte): New. Taken from gpg 1.4.3. + +2006-04-28 Werner Koch <wk@g10code.com> + + * stringhelp.c (print_sanitized_buffer): Fix bug where the count + got wrong for the \xNN representation. + (sanitize_buffer): Fix bug where some control characters lose part + of their \xNN representation. + +2006-04-20 Werner Koch <wk@g10code.com> + + * stringhelp.c (make_basename): New arg INPUTPATH for future + riscos compatibility. + +2006-04-18 Werner Koch <wk@g10code.com> + + * libjnlib-config.h (JNLIB_NEED_UTF8CONF): Defined. + * strlist.c (add_to_strlist2) [JNLIB_NEED_UTF8CONV]: Enabled. + +2005-06-15 Werner Koch <wk@g10code.com> + + * stringhelp.c (sanitize_buffer): Make P a void*. + (ascii_memistr, memistr): Ditto. + (ascii_memcasecmp): Ditto. + * logging.c (writen): Use void * for arg BUFFER. + * stringhelp.c (memistr): Fixed unsigned/signed pointer conflict. + (ascii_memistr): Ditto. + (ascii_memcasemem): Ditto. + * utf8conv.c (utf8_to_native): Ditto. + (utf8_to_native): Ditto. + * argparse.c (show_version): Removed non-required cast. + +2005-01-19 Werner Koch <wk@g10code.com> + + * logging.c (fun_writer): Don't fallback to stderr. Print to + stderr only if connected to a tty. + +2004-12-20 Werner Koch <wk@g10code.com> + + * w32-pth.c (do_pth_event_free): The events are hold in a ring + buffer. Adjust for that. + (do_pth_event_body): Ditto. + (pth_event_isolate): Ditto. + (do_pth_wait): Ditto. + (_pth_event_count): Renamed to .. + (event_count): .. and adjusted as above. + (pth_init): Define 3 debug levels and change all debug calls to + make use of them. This makes the moule now silent. + +2004-12-19 Werner Koch <wk@g10code.com> + + * w32-pth.c (pth_init): Enable debugging depending on env var. + (pth_self): New. + (pth_mutex_release, pth_mutex_acquire): Implemented directly using + the W32 API. + +2004-12-18 Werner Koch <wk@g10code.com> + + * w32-pth.c (pth_init): Reverse return values. Use TRUE and FALSE + constants. + (pth_kill, pth_mutex_acquire, pth_attr_set, pth_join, pth_cancel): + Ditto. + +2004-12-15 Werner Koch <wk@g10code.com> + + * logging.c [W32]: Don't include unavailable headers. + +2004-12-14 Werner Koch <wk@g10code.com> + + * w32-pth.c (_pth_strerror): Renamed to ... + (w32_strerror): .. this. And let callers provide a buffer. + (spawn_helper_thread): Removed HD arg and hardwire the stack size + to 32k. + (do_pth_wait): Removed use of ATTR; not needed for the helper + threads. + (helper_thread): Renamed to .. + (launch_thread): .. this. Release handle if not joinable. + (struct pth_priv_hd_s): Renamed to ... + (struct thread_info_s): .. this. Add member JOINABLE and TH. + +2004-12-14 Timo Schulz <twoaday@g10code.com> + + * w32-pth.c (pth_kill): Just release the crit section if + pth_init was really called. And set all handles to NULL. + (_pth_strerror): New. + (do_pth_wait): Before we enter the loop we check if there + are too much events in the ring. + +2004-12-14 Werner Koch <wk@g10code.com> + + * w32-pth.h (pth_event_occured): Removed macro. + * w32-pth.c: Fixed license statement; its under the LGPL. + (enter_pth, leave_pth): Use them to bracket almost all public + functions. + +2004-12-13 Timo Schulz <twoaday@g10code.com> + + * w32-pth.c (enter_pth, leave_pth): New. + (pth_init): Initialize global mutex section. + (pth_kill): Release global mutex section. + (helper_thread): New. + (pth_spawn): Make sure only one thread is running. + +2004-12-13 Werner Koch <wk@g10code.com> + + * stringhelp.c (w32_strerror) [W32]: New. + + * w32-pth.c, w32-pth.h: Added real code written by Timo Schulz. + Not finished, though. + +2004-12-07 Werner Koch <wk@g10code.com> + + * w32-pth.c, w32-pth.h: New. + +2004-11-26 Werner Koch <wk@g10code.com> + + * logging.c [_WIN32]: Don't include socket headers. + +2004-11-30 Timo Schulz <ts@g10code.com> + + * w32-afunix.c: New. AF_UNIX emulation for W32. + * w32-afunix.h: Likewise. + +2004-11-22 Werner Koch <wk@g10code.com> + + * logging.c (log_test_fd): Add test on LOGSTREAM. Reported by + Barry Schwartz. + +2004-11-18 Werner Koch <wk@g10code.com> + + * logging.c: Explicitly include sys/stat.h for the S_I* constants. + +2004-10-21 Werner Koch <wk@g10code.com> + + * logging.c (do_logv): Use set_log_stream to setup a default. + (log_set_file): Factored code out to .. + (set_file_fd): .. New function to allow using a file descriptor. + (log_set_fd): Make use of new fucntion. + (fun_writer): Reworked. + +2004-08-18 Werner Koch <wk@g10code.de> + + * stringhelp.c (print_sanitized_utf8_string): Actually implement + it. + +2004-06-21 Werner Koch <wk@g10code.com> + + * logging.c (log_set_file): Do not close an old logstream if it + used to be stderr or stdout. + +2004-05-05 Werner Koch <wk@gnupg.org> + + * logging.c (log_set_file): Oops, don't close if LOGSTREAM is NULL. + +2004-04-30 Werner Koch <wk@gnupg.org> + + * logging.c (log_set_file): Make sure the log stream will be + closed even if the stderr fileno will be assigned to a new socket. + +2004-04-16 Werner Koch <wk@gnupg.org> + + * logging.h (JNLIB_LOG_WITH_PREFIX): Add constants for the flag + values. + * logging.c (log_set_prefix): New flag DETACHED. + (fun_writer): Take care of this flag. + (log_test_fd): New. + +2004-02-18 Werner Koch <wk@gnupg.org> + + * stringhelp.c (print_sanitized_buffer): Don't care about + non-ASCII characaters. + (sanitize_buffer): Ditto. + +2004-02-12 Werner Koch <wk@gnupg.org> + + * Makefile.am: Replaced INCLUDES by AM_CPPFLAGS. + +2004-01-05 Werner Koch <wk@gnupg.org> + + * argparse.c (strusage): Changed default copyright year to 2004. + +2003-12-17 Werner Koch <wk@gnupg.org> + + * argparse.c (initialize): Replaced use of non-literal format + args. Suggested by Florian Weimer. + +2003-12-16 Werner Koch <wk@gnupg.org> + + * logging.c (writen, fun_writer, fun_closer): New. + (log_set_file): Add feature to log to a socket. + (log_set_file, do_logv): Force printing with prefix and pid. + +2003-11-13 Werner Koch <wk@gnupg.org> + + * strlist.c (strlist_copy): New. + + * dotlock.c: Define DIRSEP_C et al. if not defined. + +2003-11-06 Werner Koch <wk@gnupg.org> + + * strlist.h (strlist_t): New. STRLIST is now deprecated. + +2003-06-18 Werner Koch <wk@gnupg.org> + + * strlist.c (strlist_pop): New. + + * dotlock.c (dotlock_remove_lockfiles): Prefixed with dotlock_ and + made global. + +2003-06-17 Werner Koch <wk@gnupg.org> + + * stringhelp.c (length_sans_trailing_chars) + (length_sans_trailing_ws): New. + + * logging.c (log_inc_errorcount): New. + + * stringhelp.c (print_sanitized_utf8_buffer): Implement utf8 + conversion. + (sanitize_buffer): New. Based on gnupg 1.3.2 make_printable_string. + + * dotlock.c: Updated to match the version from 1.3.2 + * utf8conv.c: New. Code taken from strgutil.c of gnupg 1.3.2. + * utf8conv.h: New. + +2003-06-16 Werner Koch <wk@gnupg.org> + + * logging.c (do_logv): Hack to optionally suppress a leading space. + + * stringhelp.c (ascii_strncasecmp): New. Taken from gnupg 1.3. + (ascii_memistr): New. Taken from gnupg 1.3 + +2003-06-13 Werner Koch <wk@gnupg.org> + + * mischelp.h (wipememory2,wipememory): New. Taken from GnuPG 1.3.2. + +2002-06-04 Werner Koch <wk@gnupg.org> + + * stringhelp.c (print_sanitized_utf8_string): New. No real + implementation for now. + (print_sanitized_utf8_buffer): Ditto. + +2002-04-04 Werner Koch <wk@gnupg.org> + + * logging.c (log_get_prefix): New. + +2002-03-15 Werner Koch <wk@gnupg.org> + + * argparse.c (optfile_parse): Fixed missing argument handling. + +2002-02-25 Werner Koch <wk@gnupg.org> + + * stringhelp.c (ascii_memcasemem): New. + +2002-02-14 Werner Koch <wk@gnupg.org> + + * Makefile.am (INCLUDES): Add cflags for libgcrypt. + +2002-02-07 Werner Koch <wk@gnupg.org> + + * logging.c (log_set_fd): New. + + * stringhelp.c (print_sanitized_buffer): New. + (print_sanitized_string): New. + +2002-01-24 Werner Koch <wk@gnupg.org> + + * argparse.c (strusage): Set default copyright notice year to 2002. + + Fixed the copyright notice of this file, as it has always been + part of GnuPG and therefore belongs to the FSF. + +2001-11-01 Marcus Brinkmann <marcus@g10code.de> + + * logging.c (log_printf): Do not initialize ARG_PTR with 0, we + don't know the correct type. Instead, run va_start and va_end + unconditionally. + Reported by Jose Carlos Garcia Sogo <jsogo@debian.org>. + +2002-01-19 Werner Koch <wk@gnupg.org> + + * logging.c (log_get_stream): New. + +2001-12-05 Werner Koch <wk@gnupg.org> + + * logging.c (log_set_prefix): New. + (do_logv): Include prefix and pid only if enabled. Print time only + when explicitly enabled. + (log_logv): New. + * logging.h: Include log_logv() only when requested. + +2001-11-06 Werner Koch <wk@gnupg.org> + + * strlist.c, strlist.h: New. Taken from pgnupg/util/strgutil.c + +2001-08-30 Werner Koch <wk@gnupg.org> + + * logging.c (log_printf): Don't pass NULL instead of arg_ptr. + +2001-07-19 Werner Koch <wk@gnupg.org> + + * stringhelp.c (ascii_memistr,ascii_isupper,ascii_islower, + ascii_toupper,ascii_tolower, ascii_strcasecmp, ascii_memcasecmp): New. + +2000-07-26 10:02:51 Werner Koch (wk@habibti.openit.de) + + * stringhelp.c.: Add stdarg.h + * argparse.h: s/ulong/unsigned long/ although this should be defined + by types.h. + +2000-06-28 19:40:23 Werner Koch (wk@habibti.openit.de) + + * Makefile.am: Replaced second logging.c by .h + +2000-05-24 08:58:15 Werner Koch (wk@habibti.openit.de) + + * logging.c (log_get_errorcount): New. + +2000-05-24 08:44:47 Werner Koch (wk@habibti.openit.de) + + * stringhelp.c: Added a few filename related helper functions. + +2000-05-11 18:04:43 Werner Koch (wk@habibti.openit.de) + + * xmalloc.c (xstrcat2): Replaced stpcpy to quickly address W32 + problems. + +2000-05-02 19:43:38 Werner Koch (wk@habibti.openit.de) + + * xmalloc.c (xstrcat2): New. + +Mon Jan 24 13:04:28 CET 2000 Werner Koch <wk@gnupg.de> + + * README: New. + * Makefile.am: new. + * argparse.c argparse.h logging.c logging.h + mischelp.h stringhelp.c stringhelp.h xmalloc.c + xmalloc.h dotlock.c: Moved from ../util to here. + * dotlock.h: New. + * libjnlib-config.h: New. + + * logging.c (log_set_file): New. + (log_printf): New. + (do_logv): Add kludge to insert LFs. + + + *********************************************************** + * Please note that Jnlib is maintained as part of GnuPG. * + * You may find it source-copied in other packages. * + *********************************************************** + + Copyright 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/jnlib/Makefile.am b/jnlib/Makefile.am new file mode 100644 index 000000000..5fd48495c --- /dev/null +++ b/jnlib/Makefile.am @@ -0,0 +1,46 @@ +# Copyright (C) 1999, 2000, 2001, 2004 Feee Software Soundation, Inc. +# +# This file is part of GnuPG +# +# GnuPG is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# GnuPG is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public 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 = README + +AM_CPPFLAGS = -I$(top_srcdir)/intl + +# We need libgcrypt because libjnlib-config includes gcrypt.h +AM_CFLAGS = $(LIBGCRYPT_CFLAGS) + +noinst_LIBRARIES = libjnlib.a + + +#libjnlib_a_LDFLAGS = +libjnlib_a_SOURCES = \ + libjnlib-config.h \ + stringhelp.c stringhelp.h \ + strlist.c strlist.h \ + utf8conv.c utf8conv.h \ + argparse.c argparse.h \ + logging.c logging.h \ + dotlock.c dotlock.h \ + types.h mischelp.h \ + w32-pth.c w32-pth.h \ + w32-afunix.c w32-afunix.h + +# xmalloc.c xmalloc.h + diff --git a/jnlib/README b/jnlib/README new file mode 100644 index 000000000..e49ef4450 --- /dev/null +++ b/jnlib/README @@ -0,0 +1,7 @@ +jnlib - this is a collection of utility function which are +too small to put into a library. + +libjnlib-config.h should be be modified for each project +to make these functions fit into the software. Mainly these +are memory functions in case you need another allocator. + diff --git a/util/argparse.c b/jnlib/argparse.c similarity index 88% rename from util/argparse.c rename to jnlib/argparse.c index cdc56bf3a..15a7c546e 100644 --- a/util/argparse.c +++ b/jnlib/argparse.c @@ -1,25 +1,22 @@ /* [argparse.c wk 17.06.97] Argument Parser for option handling - * Copyright (C) 1998, 1999, 2000, 2001, 2003, - * 2004 Free Software Foundation, Inc. + * Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. * - * This file is part of GnuPG. + * This file is part of GnuPG. * - * GnuPG is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * GnuPG is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * - * GnuPG is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * GnuPG is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public 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 + * You should have received a copy of the GNU General Public 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> @@ -28,8 +25,11 @@ #include <ctype.h> #include <string.h> -#include "util.h" -#include "i18n.h" +#include "libjnlib-config.h" +#include "mischelp.h" +#include "stringhelp.h" +#include "logging.h" +#include "argparse.h" /********************************* @@ -75,7 +75,7 @@ * 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 + * Bit 6 : ignore --version * 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): @@ -137,10 +137,13 @@ struct alias_def_s { const char *value; /* ptr into name */ }; +static const char *(*strusage_handler)( int ) = NULL; + 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 ) { @@ -154,49 +157,48 @@ initialize( ARGPARSE_ARGS *arg, const char *filename, unsigned *lineno ) arg->err = 0; arg->flags |= 1<<15; /* mark initialized */ if( *arg->argc < 0 ) - log_bug("Invalid argument for ArgParse\n"); + jnlib_log_bug("Invalid argument for ArgParse\n"); } if( arg->err ) { /* last option was erroneous */ + const char *s; if( filename ) { if( arg->r_opt == -6 ) - log_error("%s:%u: argument not expected\n", filename, *lineno ); + s = "argument not expected\n"; else if( arg->r_opt == -5 ) - log_error("%s:%u: read error\n", filename, *lineno ); + s = "read error\n"; else if( arg->r_opt == -4 ) - log_error("%s:%u: keyword too long\n", filename, *lineno ); + s = "keyword too long\n"; else if( arg->r_opt == -3 ) - log_error("%s:%u: missing argument\n", filename, *lineno ); + s = "missing argument\n"; else if( arg->r_opt == -7 ) - log_error("%s:%u: invalid command\n", filename, *lineno ); + s = "invalid command\n"; else if( arg->r_opt == -10 ) - log_error("%s:%u: invalid alias definition\n",filename,*lineno); + s = "invalid alias definition\n"; else - log_error("%s:%u: invalid option\n", filename, *lineno ); + s = "invalid option\n"; + jnlib_log_error("%s:%u: %s\n", filename, *lineno, s); } else { + s = arg->internal.last? arg->internal.last:"[??]"; + if( arg->r_opt == -3 ) - log_error("Missing argument for option \"%.50s\"\n", - arg->internal.last? arg->internal.last:"[??]" ); + jnlib_log_error ("Missing argument for option \"%.50s\"\n", s); else if( arg->r_opt == -6 ) - log_error("Option \"%.50s\" does not expect an argument\n", - arg->internal.last? arg->internal.last:"[??]" ); + jnlib_log_error ("Option \"%.50s\" does not expect an argument\n", + s ); else if( arg->r_opt == -7 ) - log_error("Invalid command \"%.50s\"\n", - arg->internal.last? arg->internal.last:"[??]" ); + jnlib_log_error ("Invalid command \"%.50s\"\n", s); else if( arg->r_opt == -8 ) - log_error("Option \"%.50s\" is ambiguous\n", - arg->internal.last? arg->internal.last:"[??]" ); + jnlib_log_error ("Option \"%.50s\" is ambiguous\n", s); else if( arg->r_opt == -9 ) - log_error("Command \"%.50s\" is ambiguous\n", - arg->internal.last? arg->internal.last:"[??]" ); + jnlib_log_error ("Command \"%.50s\" is ambiguous\n",s ); else - log_error("Invalid option \"%.50s\"\n", - arg->internal.last? arg->internal.last:"[??]" ); + jnlib_log_error ("Invalid option \"%.50s\"\n", s); } - if( arg->err != 1 || arg->r_opt == -5 ) + if( arg->err != 1 ) exit(2); arg->err = 0; } @@ -215,7 +217,7 @@ store_alias( ARGPARSE_ARGS *arg, char *name, char *value ) * used as lvalue */ #if 0 - ALIAS_DEF a = xmalloc( sizeof *a ); + ALIAS_DEF a = jnlib_xmalloc( sizeof *a ); a->name = name; a->value = value; a->next = (ALIAS_DEF)arg->internal.aliases; @@ -310,7 +312,7 @@ optfile_parse( FILE *fp, const char *filename, unsigned *lineno, trim_spaces( p ); } if( !p || !*p ) { - xfree( buffer ); + jnlib_free( buffer ); arg->r_opt = -10; } else { @@ -324,29 +326,20 @@ optfile_parse( FILE *fp, const char *filename, unsigned *lineno, char *p; if( !buffer ) { keyword[i] = 0; - buffer = xstrdup(keyword); + buffer = jnlib_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( *p == '"' ) { /* remove quotes */ + p++; + if( *p && p[strlen(p)-1] == '"' ) + p[strlen(p)-1] = 0; } if( !set_opt_arg(arg, opts[idx].flags, p) ) - xfree(buffer); + jnlib_free(buffer); } break; } @@ -401,7 +394,7 @@ optfile_parse( FILE *fp, const char *filename, unsigned *lineno, buffer[i++] = c; else { buflen += 50; - buffer = xrealloc(buffer, buflen); + buffer = jnlib_xrealloc(buffer, buflen); buffer[i++] = c; } } @@ -409,7 +402,7 @@ optfile_parse( FILE *fp, const char *filename, unsigned *lineno, keyword[i++] = c; else { buflen = DIM(keyword)+50; - buffer = xmalloc(buflen); + buffer = jnlib_xmalloc(buflen); memcpy(buffer, keyword, i); buffer[i++] = c; } @@ -445,7 +438,7 @@ find_long_option( ARGPARSE_ARGS *arg, for(i=0; opts[i].short_opt; i++ ) if( opts[i].long_opt && !strcmp( opts[i].long_opt, keyword) ) return i; -#if 0 + #if 0 { ALIAS_DEF a; /* see whether it is an alias */ @@ -457,7 +450,7 @@ find_long_option( ARGPARSE_ARGS *arg, } } } -#endif + #endif /* not found, see whether it is an abbreviation */ /* aliases may not be abbreviated */ n = strlen( keyword ); @@ -529,11 +522,8 @@ arg_parse( ARGPARSE_ARGS *arg, ARGPARSE_OPTS *opts) if( argpos ) *argpos = '='; - if( i < 0 && !strcmp( "help", s+2) ) { - if( !(arg->flags & (1<<6)) ) { - show_help(opts, arg->flags); - } - } + if( i < 0 && !strcmp( "help", s+2) ) + show_help(opts, arg->flags); else if( i < 0 && !strcmp( "version", s+2) ) { if( !(arg->flags & (1<<6)) ) { show_version(); @@ -619,11 +609,8 @@ arg_parse( ARGPARSE_ARGS *arg, ARGPARSE_OPTS *opts) break; } - if( !opts[i].short_opt && ( *s == 'h' || *s == '?' ) ) { - if( !(arg->flags & (1<<6)) ) { - show_help(opts, arg->flags); - } - } + if( !opts[i].short_opt && ( *s == 'h' || *s == '?' ) ) + show_help(opts, arg->flags); arg->r_opt = opts[i].short_opt; if( !opts[i].short_opt ) { @@ -866,7 +853,7 @@ show_version() /* additional program info */ for(i=30; i < 40; i++ ) if( (s=strusage(i)) ) - fputs( (const byte*)s, stdout); + fputs (s, stdout); fflush(stdout); } @@ -908,9 +895,13 @@ usage( int level ) * 41: long usage note (with LF) */ const char * -default_strusage( int level ) +strusage( int level ) { - const char *p = NULL; + const char *p = strusage_handler? strusage_handler(level) : NULL; + + if( p ) + return p; + switch( level ) { case 11: p = "foo"; break; case 13: p = "0.0"; break; @@ -930,7 +921,8 @@ default_strusage( int level ) "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"; +"Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,\n" +"USA.\n"; break; case 40: /* short and long usage */ case 41: p = ""; break; @@ -939,6 +931,11 @@ default_strusage( int level ) return p; } +void +set_strusage( const char *(*f)( int ) ) +{ + strusage_handler = f; +} #ifdef TEST diff --git a/jnlib/argparse.h b/jnlib/argparse.h new file mode 100644 index 000000000..531622ea5 --- /dev/null +++ b/jnlib/argparse.h @@ -0,0 +1,68 @@ +/* argparse.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 LIBJNLIB_ARGPARSE_H +#define LIBJNLIB_ARGPARSE_H + +#include <stdio.h> +#include "types.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; + unsigned long 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; + + + +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 *strusage( int level ); +void set_strusage( const char *(*f)( int ) ); + +#endif /*LIBJNLIB_ARGPARSE_H*/ diff --git a/jnlib/dotlock.c b/jnlib/dotlock.c new file mode 100644 index 000000000..f5de8fa54 --- /dev/null +++ b/jnlib/dotlock.c @@ -0,0 +1,557 @@ +/* dotlock.c - dotfile locking + * Copyright (C) 1998, 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. + */ + +#include <config.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include <ctype.h> +#include <errno.h> +#include <unistd.h> +#ifndef HAVE_DOSISH_SYSTEM +#include <sys/utsname.h> +#endif +#include <sys/types.h> +#include <sys/time.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <signal.h> + +#include "libjnlib-config.h" +#include "dotlock.h" + +#if !defined(DIRSEP_C) && !defined(EXTSEP_C) \ + && !defined(DIRSEP_S) && !defined(EXTSEP_S) +#ifdef HAVE_DOSISH_SYSTEM +#define DIRSEP_C '\\' +#define EXTSEP_C '.' +#define DIRSEP_S "\\" +#define EXTSEP_S "." +#else +#define DIRSEP_C '/' +#define EXTSEP_C '.' +#define DIRSEP_S "/" +#define EXTSEP_S "." +#endif +#endif + + +struct dotlock_handle +{ + struct dotlock_handle *next; + char *tname; /* Name of lockfile template. */ + size_t nodename_off; /* Offset in TNAME of the nodename part. */ + size_t nodename_len; /* Length of the nodename part. */ + char *lockname; /* Name of the real lockfile. */ + int locked; /* Lock status. */ + int disable; /* When true, locking is disabled. */ +}; + + +static volatile DOTLOCK all_lockfiles; +static int never_lock; + +static int read_lockfile (DOTLOCK h, int *same_node); + +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 lock mechanism. + * Although 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; + int fd = -1; + char pidstr[16]; + const char *nodename; + const char *dirpart; + int dirpartlen; +#ifndef HAVE_DOSISH_SYSTEM + struct utsname utsbuf; +#endif + + if ( !initialized ) + { + atexit( dotlock_remove_lockfiles ); + initialized = 1; + } + if ( !file_to_lock ) + return NULL; /* Only initialization was requested. */ + + h = jnlib_xcalloc ( 1, 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; + } + +#ifndef 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 = jnlib_xmalloc ( dirpartlen + 6+30+ strlen(nodename) + 11 ); + h->nodename_len = strlen (nodename); +#ifndef __riscos__ + sprintf (h->tname, "%.*s/.#lk%p.", dirpartlen, dirpart, h ); + h->nodename_off = strlen (h->tname); + sprintf (h->tname+h->nodename_off, "%s.%d", nodename, (int)getpid ()); +#else /* __riscos__ */ + sprintf (h->tname, "%.*s.lk%p/", dirpartlen, dirpart, h ); + h->nodename_off = strlen (h->tname); + sprintf (h->tname+h->nodename_off, "%s/%d", 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)); + jnlib_free(h->tname); + jnlib_free(h); + return NULL; + } + if ( write (fd, pidstr, 11 ) != 11 ) + goto write_failed; + if ( write (fd, nodename, strlen (nodename) ) != strlen (nodename) ) + goto write_failed; + if ( write (fd, "\n", 1 ) != 1 ) + goto write_failed; + if ( close (fd) ) + goto write_failed; + +# ifdef _REENTRANT + /* release mutex */ +# endif +#endif /* !HAVE_DOSISH_SYSTEM */ + h->lockname = jnlib_xmalloc ( strlen (file_to_lock) + 6 ); + strcpy (stpcpy(h->lockname, file_to_lock), EXTSEP_S "lock"); + return h; + write_failed: + all_lockfiles = h->next; +# ifdef _REENTRANT + /* fixme: release mutex */ +# endif + log_error ( "error writing to `%s': %s\n", h->tname, strerror(errno) ); + close(fd); + unlink(h->tname); + jnlib_free(h->tname); + jnlib_free(h); + return NULL; +} + + +void +destroy_dotlock ( DOTLOCK h ) +{ +#ifndef 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); + jnlib_free (h->tname); + jnlib_free (h->lockname); + } + jnlib_free(h); + } +#endif /*!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; +} + +/**************** + * Do a lock on H. A TIMEOUT of 0 returns immediately, -1 waits + * forever (hopefully not), other values are reserved (should then be + * timeouts in milliseconds). Returns: 0 on success + */ +int +make_dotlock( DOTLOCK h, long timeout ) +{ +#ifdef HAVE_DOSISH_SYSTEM + return 0; +#else + int pid; + const char *maybe_dead=""; + int backoff=0; + int same_node; + + if ( h->disable ) + return 0; /* Locks are completely disabled. Return success. */ + + 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 ( !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, &same_node)) == -1 ) + { + if ( errno != ENOENT ) + { + log_info ("cannot read lockfile\n"); + return -1; + } + log_info( "lockfile disappeared\n"); + continue; + } + else if ( pid == getpid() && same_node ) + { + log_info( "Oops: lock already held by us\n"); + h->locked = 1; + return 0; /* okay */ + } + else if ( same_node && kill (pid, 0) && errno == ESRCH ) + { +#ifndef __riscos__ + log_info ("removing stale lockfile (created by %d)", pid ); + unlink (h->lockname); + continue; +#else /* __riscos__ */ + /* Under RISCOS we are *pretty* sure that the other task + is dead and therefore we remove the stale lock file. */ + maybe_dead = " - probably dead - removing lock"; + unlink(h->lockname); +#endif /* __riscos__ */ + } + + if ( timeout == -1 ) + { + /* Wait until lock has been released. */ + struct timeval tv; + + log_info ("waiting for lock (held by %d%s) %s...\n", + pid, maybe_dead, maybe_deadlock(h)? "(deadlock?) ":""); + + + /* We 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; + } + /*NOTREACHED*/ +#endif /* !HAVE_DOSISH_SYSTEM */ +} + + +/**************** + * release a lock + * Returns: 0 := success + */ +int +release_dotlock( DOTLOCK h ) +{ +#ifdef HAVE_DOSISH_SYSTEM + return 0; +#else + int pid, same_node; + + /* 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, &same_node); + if ( pid == -1 ) + { + log_error( "release_dotlock: lockfile error\n"); + return -1; + } + if ( pid != getpid() || !same_node ) + { + 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 ( 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 /* !HAVE_DOSISH_SYSTEM */ +} + + +/* + Read the lock file and return the pid, returns -1 on error. True + will be stored at SAME_NODE if the lock file has been created on + the same node. + */ +static int +read_lockfile (DOTLOCK h, int *same_node ) +{ +#ifdef HAVE_DOSISH_SYSTEM + return 0; +#else + char buffer_space[10+1+70+1]; /* 70 is just an estimated value; node + name are usually shorter. */ + int fd, pid; + char *buffer, *p; + size_t expected_len; + int res, nread; + + *same_node = 0; + expected_len = 10 + 1 + h->nodename_len + 1; + if ( expected_len >= sizeof buffer_space) + buffer = jnlib_xmalloc (expected_len); + else + buffer = buffer_space; + + if ( (fd = open (h->lockname, O_RDONLY)) == -1 ) + { + int e = errno; + log_info ("error opening lockfile `%s': %s\n", + h->lockname, strerror(errno) ); + if (buffer != buffer_space) + jnlib_free (buffer); + errno = e; /* Need to return ERRNO here. */ + return -1; + } + + p = buffer; + nread = 0; + do + { + res = read (fd, p, expected_len - nread); + if (res == -1 && errno == EINTR) + continue; + if (res < 0) + { + log_info ("error reading lockfile `%s'", h->lockname ); + close (fd); + if (buffer != buffer_space) + jnlib_free (buffer); + errno = 0; /* Do not return an inappropriate ERRNO. */ + return -1; + } + p += res; + nread += res; + } + while (res && nread != expected_len); + close(fd); + + if (nread < 11) + { + log_info ("invalid size of lockfile `%s'", h->lockname ); + if (buffer != buffer_space) + jnlib_free (buffer); + errno = 0; /* Do not return an inappropriate ERRNO. */ + return -1; + } + + if (buffer[10] != '\n' + || (buffer[10] = 0, pid = atoi (buffer)) == -1 +#ifndef __riscos__ + || !pid +#else /* __riscos__ */ + || (!pid && riscos_getpid()) +#endif /* __riscos__ */ + ) + { + log_error ("invalid pid %d in lockfile `%s'", pid, h->lockname ); + if (buffer != buffer_space) + jnlib_free (buffer); + errno = 0; + return -1; + } + + if (nread == expected_len + && !memcmp (h->tname+h->nodename_off, buffer+11, h->nodename_len) + && buffer[11+h->nodename_len] == '\n') + *same_node = 1; + + if (buffer != buffer_space) + jnlib_free (buffer); + return pid; +#endif +} + + +void +dotlock_remove_lockfiles() +{ +#ifndef 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/mpi/mpi-inline.c b/jnlib/dotlock.h similarity index 61% rename from mpi/mpi-inline.c rename to jnlib/dotlock.h index 8e29b0615..1c0f05cb2 100644 --- a/mpi/mpi-inline.c +++ b/jnlib/dotlock.h @@ -1,5 +1,5 @@ -/* mpi-inline.c - * Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. +/* dotlock.h + * Copyright (C) 2000, 2001 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -19,19 +19,20 @@ * USA. */ -#include <config.h> -#include <stdio.h> -#include <stdlib.h> +#ifndef LIBJNLIB_DOTLOCK_H +#define LIBJNLIB_DOTLOCK_H -/* put the inline functions as real functions into the lib */ -#define G10_MPI_INLINE_DECL +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 dotlock_remove_lockfiles (void); + +#endif /*LIBJNLIB_DOTLOCK_H*/ -#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/jnlib/libjnlib-config.h b/jnlib/libjnlib-config.h new file mode 100644 index 000000000..ded6e057b --- /dev/null +++ b/jnlib/libjnlib-config.h @@ -0,0 +1,76 @@ +/* libjnlib-config.h - local configuration of the jnlib functions + * Copyright (C) 2000, 2001, 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 header is to be included only by the files in this directory + * it should not be used by other modules. + */ + +#ifndef LIBJNLIB_CONFIG_H +#define LIBJNLIB_CONFIG_H + +#include <gcrypt.h> /* gcry_malloc & Cie. */ +#include "logging.h" + +/* We require support for utf-8 conversion. */ +#define JNLIB_NEED_UTF8CONV 1 + +#ifdef USE_SIMPLE_GETTEXT + int set_gettext_file( const char *filename ); + const char *gettext( const char *msgid ); + +# define _(a) gettext (a) +# define N_(a) (a) + +#else +#ifdef HAVE_LOCALE_H +# include <locale.h> +#endif + +#ifdef ENABLE_NLS +# include <libintl.h> +# 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 */ + + +#define jnlib_xmalloc(a) gcry_xmalloc( (a) ) +#define jnlib_xcalloc(a,b) gcry_xcalloc( (a), (b) ) +#define jnlib_xrealloc(a,n) gcry_xrealloc( (a), (n) ) +#define jnlib_xstrdup(a) gcry_xstrdup( (a) ) +#define jnlib_free(a) gcry_free( (a) ) + +#define jnlib_log_debug log_debug +#define jnlib_log_info log_info +#define jnlib_log_error log_error +#define jnlib_log_fatal log_fatal +#define jnlib_log_bug log_bug + + +#endif /*LIBJNUTIL_CONFIG_H*/ diff --git a/jnlib/logging.c b/jnlib/logging.c new file mode 100644 index 000000000..20ba02ccd --- /dev/null +++ b/jnlib/logging.c @@ -0,0 +1,615 @@ +/* logging.c - useful logging functions + * 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 <stdarg.h> +#include <stddef.h> +#include <errno.h> +#include <time.h> +#include <sys/types.h> +#include <sys/stat.h> +#ifndef HAVE_W32_SYSTEM +#include <sys/socket.h> +#include <sys/un.h> +#endif /*!HAVE_W32_SYSTEM*/ +#include <unistd.h> +#include <fcntl.h> +#include <assert.h> + + +#define JNLIB_NEED_LOG_LOGV 1 +#include "libjnlib-config.h" +#include "logging.h" + +#if defined (HAVE_FOPENCOOKIE) || defined (HAVE_FUNOPEN) +#define USE_FUNWRITER 1 +#endif + +static FILE *logstream; +static int log_socket = -1; +static char prefix_buffer[80]; +static int with_time; +static int with_prefix; +static int with_pid; +static int running_detached; +static int force_prefixes; + +static int missing_lf; +static int errorcount; + + +int +log_get_errorcount (int clear) +{ + int n = errorcount; + if( clear ) + errorcount = 0; + return n; +} + +void +log_inc_errorcount (void) +{ + errorcount++; +} + + +/* The follwing 3 functions are used by funopen to write logs to a + socket. */ +#ifdef USE_FUNWRITER +struct fun_cookie_s { + int fd; + int quiet; + int want_socket; + int is_socket; + char name[1]; +}; + +/* Write NBYTES of BUFFER to file descriptor FD. */ +static int +writen (int fd, const void *buffer, size_t nbytes) +{ + const char *buf = buffer; + size_t nleft = nbytes; + int nwritten; + + while (nleft > 0) + { + nwritten = write (fd, buf, nleft); + if (nwritten < 0 && errno == EINTR) + continue; + if (nwritten < 0) + return -1; + nleft -= nwritten; + buf = buf + nwritten; + } + + return 0; +} + + +static int +fun_writer (void *cookie_arg, const char *buffer, size_t size) +{ + struct fun_cookie_s *cookie = cookie_arg; + + /* Note that we always try to reconnect to the socket but print + error messages only the first time an error occured. If + RUNNING_DETACHED is set we don't fall back to stderr and even do + not print any error messages. This is needed because detached + processes often close stderr and by writing to file descriptor 2 + we might send the log message to a file not intended for logging + (e.g. a pipe or network connection). */ + if (cookie->want_socket && cookie->fd == -1) + { + /* Not yet open or meanwhile closed due to an error. */ + cookie->is_socket = 0; + cookie->fd = socket (PF_LOCAL, SOCK_STREAM, 0); + if (cookie->fd == -1) + { + if (!cookie->quiet && !running_detached + && isatty (fileno (stderr))) + fprintf (stderr, "failed to create socket for logging: %s\n", + strerror(errno)); + } + else + { + struct sockaddr_un addr; + size_t addrlen; + + memset (&addr, 0, sizeof addr); + addr.sun_family = PF_LOCAL; + strncpy (addr.sun_path, cookie->name, sizeof (addr.sun_path)-1); + addr.sun_path[sizeof (addr.sun_path)-1] = 0; + addrlen = (offsetof (struct sockaddr_un, sun_path) + + strlen (addr.sun_path) + 1); + + if (connect (cookie->fd, (struct sockaddr *) &addr, addrlen) == -1) + { + if (!cookie->quiet && !running_detached + && isatty (fileno (stderr))) + fprintf (stderr, "can't connect to `%s': %s\n", + cookie->name, strerror(errno)); + close (cookie->fd); + cookie->fd = -1; + } + } + + if (cookie->fd == -1) + { + if (!running_detached) + { + /* Due to all the problems with apps not running + detahced but beeing caled with stderr closed or + used for a different purposes, it does not make + sense to switch to stderr. We tehrefore disable it. */ + if (!cookie->quiet) + { + /* fputs ("switching logging to stderr\n", stderr);*/ + cookie->quiet = 1; + } + cookie->fd = -1; /*fileno (stderr);*/ + } + } + else /* Connection has been established. */ + { + cookie->quiet = 0; + cookie->is_socket = 1; + } + } + + log_socket = cookie->fd; + if (cookie->fd != -1 && !writen (cookie->fd, buffer, size)) + return size; /* Okay. */ + + if (!running_detached && cookie->fd != -1 + && isatty (fileno (stderr))) + { + if (*cookie->name) + fprintf (stderr, "error writing to `%s': %s\n", + cookie->name, strerror(errno)); + else + fprintf (stderr, "error writing to file descriptor %d: %s\n", + cookie->fd, strerror(errno)); + } + if (cookie->is_socket && cookie->fd != -1) + { + close (cookie->fd); + cookie->fd = -1; + log_socket = -1; + } + + return size; +} + +static int +fun_closer (void *cookie_arg) +{ + struct fun_cookie_s *cookie = cookie_arg; + + if (cookie->fd != -1) + close (cookie->fd); + jnlib_free (cookie); + log_socket = -1; + return 0; +} +#endif /*USE_FUNWRITER*/ + + + +/* Common function to either set the logging to a file or a file + descriptor. */ +static void +set_file_fd (const char *name, int fd) +{ + FILE *fp; + int want_socket; +#ifdef USE_FUNWRITER + struct fun_cookie_s *cookie; +#endif + + if (name && !strcmp (name, "-")) + { + name = NULL; + fd = fileno (stderr); + } + + if (name) + { + want_socket = (!strncmp (name, "socket://", 9) && name[9]); + if (want_socket) + name += 9; + } + else + { + want_socket = 0; + } + +#ifdef USE_FUNWRITER + cookie = jnlib_xmalloc (sizeof *cookie + (name? strlen (name):0)); + strcpy (cookie->name, name? name:""); + cookie->quiet = 0; + cookie->is_socket = 0; + cookie->want_socket = want_socket; + if (!name) + cookie->fd = fd; + else if (want_socket) + cookie->fd = -1; + else + { + do + cookie->fd = open (name, O_WRONLY|O_APPEND|O_CREAT, + (S_IRUSR|S_IRGRP|S_IROTH|S_IWUSR|S_IWGRP|S_IWOTH)); + while (cookie->fd == -1 && errno == EINTR); + } + log_socket = cookie->fd; + +#ifdef HAVE_FOPENCOOKIE + { + cookie_io_functions_t io = { NULL }; + io.write = fun_writer; + io.close = fun_closer; + + fp = fopencookie (cookie, "w", io); + } +#else /*!HAVE_FOPENCOOKIE*/ + fp = funopen (cookie, NULL, fun_writer, NULL, fun_closer); +#endif /*!HAVE_FOPENCOOKIE*/ + +#else /*!USE_FUNWRITER*/ + + /* The system does not feature custom streams. Thus fallback to + plain stdio. */ + if (want_socket) + { + fprintf (stderr, "system does not support logging to a socket - " + "using stderr\n"); + fp = stderr; + } + else if (name) + fp = fopen (name, "a"); + else if (fd == 1) + fp = stdout; + else if (fd == 2) + fp = stderr; + else + fp = fdopen (fd, "a"); + + log_socket = -1; + +#endif /*!USE_FUNWRITER*/ + + /* On success close the old logstream right now, so that we are + really sure it has been closed. */ + if (fp && logstream) + { + if (logstream != stderr && logstream != stdout) + fclose (logstream); + logstream = NULL; + } + + if (!fp) + { + if (name) + fprintf (stderr, "failed to open log file `%s': %s\n", + name, strerror(errno)); + else + fprintf (stderr, "failed to fdopen file descriptor %d: %s\n", + fd, strerror(errno)); + /* We need to make sure that there is a log stream. We use stderr. */ + fp = stderr; + } + else + setvbuf (fp, NULL, _IOLBF, 0); + + if (logstream && logstream != stderr && logstream != stdout) + fclose (logstream); + logstream = fp; + + /* We always need to print the prefix and the pid for socket mode, + so that the server reading the socket can do something + meaningful. */ + force_prefixes = want_socket; + + missing_lf = 0; +} + + +/* Set the file to write log to. The special names NULL and "-" may + be used to select stderr and names formatted like + "socket:///home/foo/mylogs" may be used to write the logging to the + socket "/home/foo/mylogs". If the connection to the socket fails + or a write error is detected, the function writes to stderr and + tries the next time again to connect the socket. + */ +void +log_set_file (const char *name) +{ + set_file_fd (name? name: "-", -1); +} + +void +log_set_fd (int fd) +{ + set_file_fd (NULL, fd); +} + + +void +log_set_prefix (const char *text, unsigned int flags) +{ + if (text) + { + strncpy (prefix_buffer, text, sizeof (prefix_buffer)-1); + prefix_buffer[sizeof (prefix_buffer)-1] = 0; + } + + with_prefix = (flags & JNLIB_LOG_WITH_PREFIX); + with_time = (flags & JNLIB_LOG_WITH_TIME); + with_pid = (flags & JNLIB_LOG_WITH_PID); + running_detached = (flags & JNLIB_LOG_RUN_DETACHED); +} + + +const char * +log_get_prefix (unsigned int *flags) +{ + if (flags) + { + *flags = 0; + if (with_prefix) + *flags |= JNLIB_LOG_WITH_PREFIX; + if (with_time) + *flags |= JNLIB_LOG_WITH_TIME; + if (with_pid) + *flags |= JNLIB_LOG_WITH_PID; + if (running_detached) + *flags |= JNLIB_LOG_RUN_DETACHED; + } + return prefix_buffer; +} + +/* This function returns true if the file descriptor FD is in use for + logging. This is preferable over a test using log_get_fd in that + it allows the logging code to use more then one file descriptor. */ +int +log_test_fd (int fd) +{ + if (logstream) + { + int tmp = fileno (logstream); + if ( tmp != -1 && tmp == fd) + return 1; + } + if (log_socket != -1 && log_socket == fd) + return 1; + return 0; +} + +int +log_get_fd () +{ + return fileno(logstream?logstream:stderr); +} + +FILE * +log_get_stream () +{ + /* FIXME: We should not return stderr here but initialize the log + stream properly. This might break more things than using stderr, + though */ + return logstream?logstream:stderr; +} + +static void +do_logv (int level, const char *fmt, va_list arg_ptr) +{ + if (!logstream) + { + log_set_file (NULL); /* Make sure a log stream has been set. */ + assert (logstream); + } + + if (missing_lf && level != JNLIB_LOG_CONT) + putc('\n', logstream ); + missing_lf = 0; + + if (level != JNLIB_LOG_CONT) + { /* Note this does not work for multiple line logging as we would + * need to print to a buffer first */ + if (with_time && !force_prefixes) + { + struct tm *tp; + time_t atime = time (NULL); + + tp = localtime (&atime); + fprintf (logstream, "%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 ); + } + if (with_prefix || force_prefixes) + fputs (prefix_buffer, logstream); + if (with_pid || force_prefixes) + fprintf (logstream, "[%u]", (unsigned int)getpid ()); + if (!with_time || force_prefixes) + putc (':', logstream); + /* A leading backspace suppresses the extra space so that we can + correctly output, programname, filename and linenumber. */ + if (fmt && *fmt == '\b') + fmt++; + else + putc (' ', logstream); + } + + switch (level) + { + case JNLIB_LOG_BEGIN: break; + case JNLIB_LOG_CONT: break; + case JNLIB_LOG_INFO: break; + case JNLIB_LOG_WARN: break; + case JNLIB_LOG_ERROR: break; + case JNLIB_LOG_FATAL: fputs("Fatal: ",logstream ); break; + case JNLIB_LOG_BUG: fputs("Ohhhh jeeee: ", logstream); break; + case JNLIB_LOG_DEBUG: fputs("DBG: ", logstream ); break; + default: fprintf(logstream,"[Unknown log level %d]: ", level ); break; + } + + + if (fmt) + { + vfprintf(logstream,fmt,arg_ptr) ; + if (*fmt && fmt[strlen(fmt)-1] != '\n') + missing_lf = 1; + } + + if (level == JNLIB_LOG_FATAL) + exit(2); + if (level == JNLIB_LOG_BUG) + abort(); +} + +static void +do_log( int level, const char *fmt, ... ) +{ + va_list arg_ptr ; + + va_start( arg_ptr, fmt ) ; + do_logv( level, fmt, arg_ptr ); + va_end(arg_ptr); +} + + +void +log_logv (int level, const char *fmt, va_list arg_ptr) +{ + do_logv (level, fmt, arg_ptr); +} + +void +log_info( const char *fmt, ... ) +{ + va_list arg_ptr ; + + va_start( arg_ptr, fmt ) ; + do_logv( JNLIB_LOG_INFO, fmt, arg_ptr ); + va_end(arg_ptr); +} + +void +log_error( const char *fmt, ... ) +{ + va_list arg_ptr ; + + va_start( arg_ptr, fmt ) ; + do_logv( JNLIB_LOG_ERROR, fmt, arg_ptr ); + va_end(arg_ptr); + /* protect against counter overflow */ + if( errorcount < 30000 ) + errorcount++; +} + + +void +log_fatal( const char *fmt, ... ) +{ + va_list arg_ptr ; + + va_start( arg_ptr, fmt ) ; + do_logv( JNLIB_LOG_FATAL, fmt, arg_ptr ); + va_end(arg_ptr); + abort(); /* never called, but it makes the compiler happy */ +} + +void +log_bug( const char *fmt, ... ) +{ + va_list arg_ptr ; + + va_start( arg_ptr, fmt ) ; + do_logv( JNLIB_LOG_BUG, fmt, arg_ptr ); + va_end(arg_ptr); + abort(); /* never called, but it makes the compiler happy */ +} + +void +log_debug( const char *fmt, ... ) +{ + va_list arg_ptr ; + + va_start( arg_ptr, fmt ) ; + do_logv( JNLIB_LOG_DEBUG, fmt, arg_ptr ); + va_end(arg_ptr); +} + + +void +log_printf (const char *fmt, ...) +{ + va_list arg_ptr; + + va_start (arg_ptr, fmt); + do_logv (fmt ? JNLIB_LOG_CONT : JNLIB_LOG_BEGIN, 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"); +} + + +#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 5 ) +void +bug_at( const char *file, int line, const char *func ) +{ + do_log( JNLIB_LOG_BUG, + ("... this is a bug (%s:%d:%s)\n"), file, line, func ); + abort(); /* never called, but it makes the compiler happy */ +} +#else +void +bug_at( const char *file, int line ) +{ + do_log( JNLIB_LOG_BUG, + _("you found a bug ... (%s:%d)\n"), file, line); + abort(); /* never called, but it makes the compiler happy */ +} +#endif + diff --git a/jnlib/logging.h b/jnlib/logging.h new file mode 100644 index 000000000..3ad43b4ec --- /dev/null +++ b/jnlib/logging.h @@ -0,0 +1,84 @@ +/* logging.h + * Copyright (C) 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 LIBJNLIB_LOGGING_H +#define LIBJNLIB_LOGGING_H + +#include <stdio.h> +#include "mischelp.h" + +/* Flag values for log_set_prefix. */ +#define JNLIB_LOG_WITH_PREFIX 1 +#define JNLIB_LOG_WITH_TIME 2 +#define JNLIB_LOG_WITH_PID 4 +#define JNLIB_LOG_RUN_DETACHED 256 + +int log_get_errorcount (int clear); +void log_inc_errorcount (void); +void log_set_file( const char *name ); +void log_set_fd (int fd); +void log_set_prefix (const char *text, unsigned int flags); +const char *log_get_prefix (unsigned int *flags); +int log_test_fd (int fd); +int log_get_fd(void); +FILE *log_get_stream (void); + +#ifdef JNLIB_GCC_M_FUNCTION + void bug_at( const char *file, int line, const char *func ) JNLIB_GCC_A_NR; +# define BUG() bug_at( __FILE__ , __LINE__, __FUNCTION__ ) +#else + void bug_at( const char *file, int line ); +# define BUG() bug_at( __FILE__ , __LINE__ ) +#endif + +/* To avoid mandatory inclusion of stdarg and other stuff, do it only + if explicitly requested to do so. */ +#ifdef JNLIB_NEED_LOG_LOGV +#include <stdarg.h> +enum jnlib_log_levels { + JNLIB_LOG_BEGIN, + JNLIB_LOG_CONT, + JNLIB_LOG_INFO, + JNLIB_LOG_WARN, + JNLIB_LOG_ERROR, + JNLIB_LOG_FATAL, + JNLIB_LOG_BUG, + JNLIB_LOG_DEBUG +}; +void log_logv (int level, const char *fmt, va_list arg_ptr); +#endif /*JNLIB_NEED_LOG_LOGV*/ + + +void log_bug( const char *fmt, ... ) JNLIB_GCC_A_NR_PRINTF(1,2); +void log_fatal( const char *fmt, ... ) JNLIB_GCC_A_NR_PRINTF(1,2); +void log_error( const char *fmt, ... ) JNLIB_GCC_A_PRINTF(1,2); +void log_info( const char *fmt, ... ) JNLIB_GCC_A_PRINTF(1,2); +void log_debug( const char *fmt, ... ) JNLIB_GCC_A_PRINTF(1,2); +void log_printf( const char *fmt, ... ) JNLIB_GCC_A_PRINTF(1,2); +void log_printhex (const char *text, const void *buffer, size_t length); + + +#endif /*LIBJNLIB_LOGGING_H*/ + + + + + diff --git a/jnlib/mischelp.h b/jnlib/mischelp.h new file mode 100644 index 000000000..8e7f9c346 --- /dev/null +++ b/jnlib/mischelp.h @@ -0,0 +1,55 @@ +/* mischelp.h + * Copyright (C) 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. + */ + +#ifndef LIBJNLIB_MISCHELP_H +#define LIBJNLIB_MISCHHELP_H + + +#define DIM(v) (sizeof(v)/sizeof((v)[0])) +#define DIMof(type,member) DIM(((type *)0)->member) + + +#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 5 ) +# define JNLIB_GCC_M_FUNCTION 1 +# define JNLIB_GCC_A_NR __attribute__ ((noreturn)) +# define JNLIB_GCC_A_PRINTF( f, a ) __attribute__ ((format (printf,f,a))) +# define JNLIB_GCC_A_NR_PRINTF( f, a ) \ + __attribute__ ((noreturn, format (printf,f,a))) +#else +# define JNLIB_GCC_A_NR +# define JNLIB_GCC_A_PRINTF( f, a ) +# define JNLIB_GCC_A_NR_PRINTF( f, a ) +#endif + + +/* To avoid that a compiler optimizes certain memset calls away, these + macros may be used instead. */ +#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) + + + + +#endif /*LIBJNLIB_MISCHELP_H*/ diff --git a/jnlib/stringhelp.c b/jnlib/stringhelp.c new file mode 100644 index 000000000..9df852754 --- /dev/null +++ b/jnlib/stringhelp.c @@ -0,0 +1,749 @@ +/* stringhelp.c - standard string helper functions + * 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. + */ + +#include <config.h> +#include <stdlib.h> +#include <string.h> +#include <stdarg.h> +#include <ctype.h> +#ifdef HAVE_W32_SYSTEM +#include <windows.h> +#endif + +#include "libjnlib-config.h" +#include "utf8conv.h" +#include "stringhelp.h" + + +/* + * Look for the substring SUB in buffer and return a pointer to that + * substring in BUFFER or NULL if not found. + * Comparison is case-insensitive. + */ +const char * +memistr (const void *buffer, size_t buflen, const char *sub) +{ + const unsigned char *buf = buffer; + const unsigned char *t = (const unsigned char *)buffer; + const unsigned char *s = (const unsigned char *)sub; + size_t n = buflen; + + for ( ; 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 (const char*)buf; + t = buf; + s = (const unsigned char *)sub ; + n = buflen; + } + } + return NULL; +} + +const char * +ascii_memistr ( const void *buffer, size_t buflen, const char *sub ) +{ + const unsigned char *buf = buffer; + const unsigned char *t = (const unsigned char *)buf; + const unsigned char *s = (const unsigned char *)sub; + size_t n = buflen; + + for ( ; 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 (const char*)buf; + t = (const unsigned char *)buf; + s = (const unsigned char *)sub ; + n = buflen; + } + } + return NULL; +} + +/* This function is similar to strncpy(). However it won't copy more + than N - 1 characters and makes sure that a '\0' is appended. With + N given as 0, nothing will happen. With DEST given as NULL, memory + will be allocated using jnlib_xmalloc (i.e. if it runs out of core + the function terminates). Returns DES or a pointer to the + allocated memory. + */ +char * +mem2str( char *dest , const void *src , size_t n ) +{ + char *d; + const char *s; + + if( n ) { + if( !dest ) + dest = jnlib_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 ; +} + +/**************** + * remove trailing white spaces + */ +char * +trim_trailing_spaces( char *string ) +{ + char *p, *mark; + + for( mark = NULL, p = string; *p; p++ ) { + if( isspace( *(byte*)p ) ) { + if( !mark ) + mark = p; + } + else + mark = NULL; + } + if( mark ) + *mark = '\0' ; + + return string ; +} + + +unsigned +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" ); +} + +size_t +length_sans_trailing_chars (const unsigned char *line, size_t len, + const char *trimchars ) +{ + const unsigned char *p, *mark; + size_t 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; +} + +/* + * Return the length of line ignoring trailing white-space. + */ +size_t +length_sans_trailing_ws (const unsigned char *line, size_t len) +{ + return length_sans_trailing_chars (line, len, " \t\r\n"); +} + + + +/*************** + * Extract from a given path the filename component. + * + */ +char * +make_basename(const char *filepath, const char *inputpath) +{ + char *p; + +#ifdef __riscos__ + return riscos_make_basename(filepath, inputpath); +#endif + + if ( !(p=strrchr(filepath, '/')) ) +#ifdef HAVE_DRIVE_LETTERS + if ( !(p=strrchr(filepath, '\\')) ) + if ( !(p=strrchr(filepath, ':')) ) +#endif + { + return jnlib_xstrdup(filepath); + } + + return jnlib_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, '/')) ) + #ifdef HAVE_DRIVE_LETTERS + if ( !(p=strrchr(filepath, '\\')) ) + if ( !(p=strrchr(filepath, ':')) ) + #endif + { + return jnlib_xstrdup("."); + } + + dirname_length = p-filepath; + dirname = jnlib_xmalloc(dirname_length+1); + strncpy(dirname, filepath, dirname_length); + dirname[dirname_length] = 0; + + return dirname; +} + + + +/**************** + * Construct a filename from the NULL terminated list of parts. + * Tilde expansion is done here. + */ +char * +make_filename( const char *first_part, ... ) +{ + va_list arg_ptr ; + size_t n; + const char *s; + char *name, *home, *p; + + 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); + + home = NULL; + if( *first_part == '~' && first_part[1] == '/' + && (home = getenv("HOME")) && *home ) + n += strlen(home); + + name = jnlib_xmalloc(n); + p = home ? stpcpy(stpcpy(name,home), first_part+1) + : stpcpy(name, first_part); + va_start( arg_ptr, first_part ) ; + while( (s=va_arg(arg_ptr, const char *)) ) + p = stpcpy(stpcpy(p,"/"), s); + va_end(arg_ptr); + + return name; +} + + +int +compare_filenames( const char *a, const char *b ) +{ + /* ? check whether this is an absolute filename and + * resolve symlinks? + */ +#ifdef HAVE_DRIVE_LETTERS + return stricmp(a,b); +#else + return strcmp(a,b); +#endif +} + + +/* Convert 2 hex characters at S to a byte value. Return this value + or -1 if there is an error. */ +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; +} + + +/* Print a BUFFER to stream FP while replacing all control characters + and the characters DELIM and DELIM2 with standard C escape + sequences. Returns the number of characters printed. */ +size_t +print_sanitized_buffer2 (FILE *fp, const void *buffer, size_t length, + int delim, int delim2) +{ + const unsigned char *p = buffer; + size_t count = 0; + + for (; length; length--, p++, count++) + { + /* Fixme: Check whether *p < 0xa0 is correct for utf8 encoding. */ + if (*p < 0x20 + || (*p >= 0x7f && *p < 0xa0) + || *p == delim + || *p == delim2 + || ((delim || delim2) && *p=='\\')) + { + putc ('\\', fp); + count++; + if (*p == '\n') + { + putc ('n', fp); + count++; + } + else if (*p == '\r') + { + putc ('r', fp); + count++; + } + else if (*p == '\f') + { + putc ('f', fp); + count++; + } + else if (*p == '\v') + { + putc ('v', fp); + count++; + } + else if (*p == '\b') + { + putc ('b', fp); + count++; + } + else if (!*p) + { + putc('0', fp); + count++; + } + else + { + fprintf (fp, "x%02x", *p); + count += 3; + } + } + else + { + putc (*p, fp); + count++; + } + } + + return count; +} + +/* Same as print_sanitized_buffer2 but with just one delimiter. */ +size_t +print_sanitized_buffer (FILE *fp, const void *buffer, size_t length, + int delim) +{ + return print_sanitized_buffer2 (fp, buffer, length, delim, 0); +} + + +size_t +print_sanitized_utf8_buffer (FILE *fp, const void *buffer, + size_t length, int delim) +{ + const char *p = buffer; + size_t i; + + /* We can handle plain ascii simpler, so check for it first. */ + for (i=0; i < length; i++ ) + { + if ( (p[i] & 0x80) ) + break; + } + if (i < length) + { + char *buf = utf8_to_native (p, length, delim); + /*(utf8 conversion already does the control character quoting)*/ + i = strlen (buf); + fputs (buf, fp); + jnlib_free (buf); + return i; + } + else + return print_sanitized_buffer (fp, p, length, delim); +} + + +size_t +print_sanitized_string2 (FILE *fp, const char *string, int delim, int delim2) +{ + return string? print_sanitized_buffer2 (fp, string, strlen (string), + delim, delim2):0; +} + +size_t +print_sanitized_string (FILE *fp, const char *string, int delim) +{ + return string? print_sanitized_buffer (fp, string, strlen (string), delim):0; +} + +size_t +print_sanitized_utf8_string (FILE *fp, const char *string, int delim) +{ + return string? print_sanitized_utf8_buffer (fp, + string, strlen (string), + delim) : 0; +} + +/* Create a string from the buffer P_ARG of length N which is suitable for + printing. Caller must release the created string using xfree. */ +char * +sanitize_buffer (const void *p_arg, size_t n, int delim) +{ + const unsigned char *p = p_arg; + size_t save_n, buflen; + const unsigned char *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 == delim || (delim && *p=='\\')) + { + if ( *p=='\n' || *p=='\r' || *p=='\f' + || *p=='\v' || *p=='\b' || !*p ) + buflen += 2; + else + buflen += 5; + } + else + buflen++; + } + p = save_p; + n = save_n; + /* And now make the string */ + d = buffer = jnlib_xmalloc( buflen ); + for ( ; n; n--, p++ ) + { + if (*p < 0x20 || *p == 0x7f || *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; +} + + +/**************************************************** + ********** W32 specific functions **************** + ****************************************************/ + +#ifdef HAVE_W32_SYSTEM +const char * +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, DIM (strerr)-1, NULL); + return strerr; +} +#endif /*HAVE_W32_SYSTEM*/ + + +/**************************************************** + ******** 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 ) +{ + if (a == b) + return 0; + + for (; *a && *b; a++, b++) { + if (*a != *b && ascii_toupper(*a) != ascii_toupper(*b)) + break; + } + return *a == *b? 0 : (ascii_toupper (*a) - ascii_toupper (*b)); +} + +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 void *a_arg, const void *b_arg, size_t n ) +{ + const char *a = a_arg; + const char *b = b_arg; + + 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; +} + +int +ascii_strcmp( const char *a, const char *b ) +{ + if (a == b) + return 0; + + for (; *a && *b; a++, b++) { + if (*a != *b ) + break; + } + return *a == *b? 0 : (*(signed char *)a - *(signed char *)b); +} + + +void * +ascii_memcasemem (const void *haystack, size_t nhaystack, + const void *needle, size_t nneedle) +{ + + if (!nneedle) + return (void*)haystack; /* finding an empty needle is really easy */ + if (nneedle <= nhaystack) + { + const char *a = haystack; + const char *b = a + nhaystack - nneedle; + + for (; a <= b; a++) + { + if ( !ascii_memcasecmp (a, needle, nneedle) ) + return (void *)a; + } + } + return NULL; +} + +/********************************************* + ********** 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(*p); + return s; +} +#endif + + +#ifndef HAVE_STRCASECMP +int +strcasecmp( const char *a, const char *b ) +{ + for( ; *a && *b; a++, b++ ) { + if( *a != *b && toupper(*a) != toupper(*b) ) + break; + } + return *(const byte*)a - *(const byte*)b; +} +#endif + + +/**************** + * mingw32/cpd has a memicmp() + */ +#ifndef HAVE_MEMICMP +int +memicmp( const char *a, const char *b, size_t n ) +{ + for( ; n; n--, a++, b++ ) + if( *a != *b && toupper(*(const byte*)a) != toupper(*(const byte*)b) ) + return *(const byte *)a - *(const byte*)b; + return 0; +} +#endif + + diff --git a/jnlib/stringhelp.h b/jnlib/stringhelp.h new file mode 100644 index 000000000..b8f4dbec0 --- /dev/null +++ b/jnlib/stringhelp.h @@ -0,0 +1,101 @@ +/* stringhelp.h + * 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. + */ + +#ifndef LIBJNLIB_STRINGHELP_H +#define LIBJNLIB_STRINGHELP_H + +#include "types.h" + +const char *memistr (const void *buf, size_t buflen, const char *sub); +char *mem2str( char *, const void *, size_t); +char *trim_spaces( char *string ); +char *trim_trailing_spaces( char *string ); +unsigned int trim_trailing_chars( unsigned char *line, unsigned len, + const char *trimchars); +unsigned int trim_trailing_ws( unsigned char *line, unsigned len ); +size_t length_sans_trailing_chars (const unsigned char *line, size_t len, + const char *trimchars ); +size_t length_sans_trailing_ws (const unsigned char *line, size_t len); + + +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 ); + +int hextobyte (const char *s); + +size_t print_sanitized_buffer (FILE *fp, const void *buffer, size_t length, + int delim); +size_t print_sanitized_buffer2 (FILE *fp, const void *buffer, size_t length, + int delim, int delim2); +size_t print_sanitized_utf8_buffer (FILE *fp, const void *buffer, + size_t length, int delim); +size_t print_sanitized_string (FILE *fp, const char *string, int delim); +size_t print_sanitized_string2 (FILE *fp, const char *string, + int delim, int delim2); +size_t print_sanitized_utf8_string (FILE *fp, const char *string, int delim); +char *sanitize_buffer (const void *p, size_t n, int delim); + + +#ifdef HAVE_W32_SYSTEM +const char *w32_strerror (int ec); +#endif + + +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 void *a, const void *b, size_t n ); +const char *ascii_memistr ( const void *buf, size_t buflen, const char *sub); +void *ascii_memcasemem (const void *haystack, size_t nhaystack, + const void *needle, size_t nneedle); + + +#ifndef HAVE_MEMICMP +int memicmp( const char *a, const char *b, size_t n ); +#endif +#ifndef HAVE_STPCPY +char *stpcpy(char *a,const char *b); +#endif +#ifndef HAVE_STRLWR +char *strlwr(char *a); +#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 +#ifndef HAVE_STRICMP + #define stricmp(a,b) strcasecmp( (a), (b) ) +#endif + +#ifndef STR + #define STR(v) #v +#endif +#define STR2(v) STR(v) + + +#endif /*LIBJNLIB_STRINGHELP_H*/ diff --git a/jnlib/strlist.c b/jnlib/strlist.c new file mode 100644 index 000000000..87e121705 --- /dev/null +++ b/jnlib/strlist.c @@ -0,0 +1,177 @@ +/* strlist.c - string helpers + * Copyright (C) 1998, 2000, 2001, 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 <stdlib.h> +#include <string.h> +#include <stdarg.h> +#include <ctype.h> + +#include "libjnlib-config.h" +#include "strlist.h" +#ifdef JNLIB_NEED_UTF8CONV +#include "utf8conv.h" +#endif + +void +free_strlist( strlist_t sl ) +{ + strlist_t sl2; + + for(; sl; sl = sl2 ) { + sl2 = sl->next; + jnlib_free(sl); + } +} + + +strlist_t +add_to_strlist( strlist_t *list, const char *string ) +{ + strlist_t sl; + + sl = jnlib_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 UTF-8 is done. */ +#ifdef JNLIB_NEED_UTF8CONV +strlist_t +add_to_strlist2( strlist_t *list, const char *string, int is_utf8 ) +{ + strlist_t sl; + + if (is_utf8) + sl = add_to_strlist( list, string ); + else + { + char *p = native_to_utf8( string ); + sl = add_to_strlist( list, p ); + jnlib_free ( p ); + } + return sl; +} +#endif /* JNLIB_NEED_UTF8CONV*/ + +strlist_t +append_to_strlist( strlist_t *list, const char *string ) +{ + strlist_t r, sl; + + sl = jnlib_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; +} + + +#ifdef JNLIB_NEED_UTF8CONV +strlist_t +append_to_strlist2( strlist_t *list, const char *string, int is_utf8 ) +{ + strlist_t sl; + + if( is_utf8 ) + sl = append_to_strlist( list, string ); + else + { + char *p = native_to_utf8 (string); + sl = append_to_strlist( list, p ); + jnlib_free( p ); + } + return sl; +} +#endif /* JNLIB_NEED_UTF8CONV */ + + +/* Return a copy of LIST. */ +strlist_t +strlist_copy (strlist_t list) +{ + strlist_t newlist = NULL, sl, *last; + + last = &newlist; + for (; list; list = list->next) + { + sl = jnlib_xmalloc (sizeof *sl + strlen (list->d)); + sl->flags = list->flags; + strcpy(sl->d, list->d); + sl->next = NULL; + *last = sl; + last = &sl; + } + return newlist; +} + + + +strlist_t +strlist_prev( strlist_t head, strlist_t node ) +{ + strlist_t n; + + for(n=NULL; head && head != node; head = head->next ) + n = head; + return n; +} + +strlist_t +strlist_last( strlist_t node ) +{ + if( node ) + for( ; node->next ; node = node->next ) + ; + return node; +} + + +char * +strlist_pop (strlist_t *list) +{ + char *str=NULL; + strlist_t sl=*list; + + if(sl) + { + str=jnlib_xmalloc(strlen(sl->d)+1); + strcpy(str,sl->d); + + *list=sl->next; + jnlib_free(sl); + } + + return str; +} + diff --git a/jnlib/strlist.h b/jnlib/strlist.h new file mode 100644 index 000000000..ee9f1fa60 --- /dev/null +++ b/jnlib/strlist.h @@ -0,0 +1,51 @@ +/* strlist.h + * Copyright (C) 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. + */ + +#ifndef LIBJNLIB_STRLIST_H +#define LIBJNLIB_STRLIST_H + +struct string_list { + struct string_list *next; + unsigned int flags; + char d[1]; +}; +typedef struct string_list *STRLIST; /* Deprecated. */ +typedef struct string_list *strlist_t; + +void free_strlist (strlist_t sl); +strlist_t add_to_strlist (strlist_t *list, const char *string); + +strlist_t add_to_strlist2( strlist_t *list, const char *string, int is_utf8); + +strlist_t append_to_strlist (strlist_t *list, const char *string); +strlist_t append_to_strlist2 (strlist_t *list, const char *string, + int is_utf8); + +strlist_t strlist_copy (strlist_t list); + +strlist_t strlist_prev (strlist_t head, strlist_t node); +strlist_t strlist_last (strlist_t node); +char * strlist_pop (strlist_t *list); + +#define FREE_STRLIST(a) do { free_strlist((a)); (a) = NULL ; } while(0) + + +#endif /*LIBJNLIB_STRLIST_H*/ diff --git a/jnlib/types.h b/jnlib/types.h new file mode 100644 index 000000000..89d245943 --- /dev/null +++ b/jnlib/types.h @@ -0,0 +1,106 @@ +/* types.h + * 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. + */ + +#ifndef LIBJNLIB_TYPES_H +#define LIBJNLIB_TYPES_H + +/* 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 */ +/* Windows typedefs byte in the rpc headers. Avoid warning about + double definition. */ +#if !(defined(_WIN32) && defined(cbNDRContext)) + typedef unsigned 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 + +#ifndef HAVE_U64_TYPEDEF + #undef u64 /* maybe there is a macro with this name */ + #if SIZEOF_UNSIGNED_INT == 8 + typedef unsigned int u64; + #define HAVE_U64_TYPEDEF + #elif SIZEOF_UNSIGNED_LONG == 8 + typedef unsigned long u64; + #define HAVE_U64_TYPEDEF + #elif __GNUC__ >= 2 || defined(__SUNPRO_C) + typedef unsigned long long u64; + #define HAVE_U64_TYPEDEF + #endif +#endif + + + +#endif /*LIBJNLIB_TYPES_H*/ diff --git a/jnlib/utf8conv.c b/jnlib/utf8conv.c new file mode 100644 index 000000000..9fba1ed4f --- /dev/null +++ b/jnlib/utf8conv.c @@ -0,0 +1,452 @@ +/* utf8conf.c - UTF8 character set conversion + * Copyright (C) 1994, 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. + */ + +#include <config.h> +#include <stdlib.h> +#include <string.h> +#include <stdarg.h> +#include <ctype.h> +#ifdef HAVE_LANGINFO_CODESET +#include <langinfo.h> +#endif + +#include "libjnlib-config.h" +#include "stringhelp.h" +#include "utf8conv.h" + + +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 +}; + + +static const char *active_charset_name = "iso-8859-1"; +static ushort *active_charset = NULL; +static int no_translation = 0; + +int +set_native_charset (const char *newset) +{ + if (!newset) +#ifdef HAVE_LANGINFO_CODESET + newset = nl_langinfo (CODESET); +#else + newset = "8859-1"; +#endif + + if (strlen (newset) > 3 && !ascii_memcasecmp (newset, "iso", 3)) + { + newset += 3; + if (*newset == '-' || *newset == '_') + newset++; + } + + if (!*newset + || !ascii_strcasecmp (newset, "8859-1") + || !ascii_strcasecmp (newset, "8859-15")) + { + active_charset_name = "iso-8859-1"; + no_translation = 0; + active_charset = NULL; + } + else if (!ascii_strcasecmp (newset, "8859-2")) + { + active_charset_name = "iso-8859-2"; + no_translation = 0; + active_charset = latin2_unicode; + } + else if (!ascii_strcasecmp (newset, "koi8-r")) + { + active_charset_name = "koi8-r"; + no_translation = 0; + active_charset = koi8_unicode; + } + else if (!ascii_strcasecmp (newset, "utf8") + || !ascii_strcasecmp (newset, "utf-8")) + { + active_charset_name = "utf-8"; + no_translation = 1; + active_charset = NULL; + } + else + return -1; + 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 *orig_string) +{ + const unsigned char *string = (const unsigned char *)orig_string; + const unsigned char *s; + char *buffer; + unsigned char *p; + size_t length = 0; + + if (no_translation) + { + buffer = jnlib_xstrdup (orig_string); + } + else if (active_charset) + { + for (s = string; *s; s++) + { + length++; + if (*s & 0x80) + length += 2; /* we may need 3 bytes */ + } + buffer = jnlib_xmalloc (length + 1); + for (p = (unsigned char *)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; + } + else + { + for (s = string; *s; s++) + { + length++; + if (*s & 0x80) + length++; + } + buffer = jnlib_xmalloc (length + 1); + for (p = (unsigned char *)buffer, s = string; *s; s++) + { + if (*s & 0x80) + { + *p++ = 0xc0 | ((*s >> 6) & 3); + *p++ = 0x80 | (*s & 0x3f); + } + else + *p++ = *s; + } + *p = 0; + } + return buffer; +} + + +/* Convert string, which is in UTF8 to native encoding. Replace + * 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. */ +char * +utf8_to_native (const char *string, size_t length, int delim) +{ + int nleft; + int i; + unsigned char encbuf[8]; + int encidx; + const byte *s; + size_t n; + char *buffer = NULL; + char *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 = (const unsigned char *)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 (*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; + } + 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 = jnlib_xmalloc (n + 1); + } + else + { + *p = 0; /* make a string */ + return buffer; + } + } +} diff --git a/cipher/rmd.h b/jnlib/utf8conv.h similarity index 63% rename from cipher/rmd.h rename to jnlib/utf8conv.h index 1313bb78b..344c47f92 100644 --- a/cipher/rmd.h +++ b/jnlib/utf8conv.h @@ -1,5 +1,5 @@ -/* rmd.h - RIPE-MD hash functions - * Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. +/* utf8conf.h + * Copyright (C) 2003 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -18,19 +18,15 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. */ -#ifndef G10_RMD_H -#define G10_RMD_H + +#ifndef LIBJNLIB_UTF8CONF_H +#define LIBJNLIB_UTF8CONF_H + +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); -/* 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*/ +#endif /*LIBJNLIB_UTF8CONF_H*/ diff --git a/util/assuan-socket.c b/jnlib/w32-afunix.c similarity index 56% rename from util/assuan-socket.c rename to jnlib/w32-afunix.c index 4d79792ce..84d799f1f 100644 --- a/util/assuan-socket.c +++ b/jnlib/w32-afunix.c @@ -1,5 +1,5 @@ -/* assuan-socket.c - * Copyright (C) 2004 Free Software Foundation, Inc. +/* w32-afunix.c + * Copyright (C) 2004 g10 Code GmbH * * This file is part of GnuPG. * @@ -18,68 +18,50 @@ * 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> +#ifdef _WIN32 #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" + +#include "w32-afunix.h" int -_assuan_close (int fd) +_w32_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) +_w32_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) +_w32_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; + int port; unaddr = (struct sockaddr_un *)addr; fp = fopen (unaddr->sun_path, "rb"); if (!fp) - return -1; + return -1; fscanf (fp, "%d", &port); fclose (fp); + /* XXX: set errno in this case */ if (port < 0 || port > 65535) - return -1; + return -1; myaddr.sin_family = AF_INET; myaddr.sin_port = port; @@ -91,7 +73,45 @@ _assuan_sock_connect (int sockfd, struct sockaddr * addr, int addrlen) unaddr->sun_addr.s_addr = myaddr.sin_addr.s_addr; return connect (sockfd, (struct sockaddr *)&myaddr, sizeof myaddr); -#endif } +int +_w32_sock_bind (int sockfd, struct sockaddr * addr, int addrlen) +{ + if (addr->sa_family == AF_LOCAL || addr->sa_family == AF_UNIX) + { + struct sockaddr_in myaddr; + struct sockaddr_un * unaddr; + FILE * fp; + int len = sizeof myaddr; + int rc; + + myaddr.sin_port = 0; + myaddr.sin_family = AF_INET; + myaddr.sin_addr.s_addr = htonl (INADDR_LOOPBACK); + + rc = bind (sockfd, (struct sockaddr *)&myaddr, len); + if (rc) + return rc; + rc = getsockname (sockfd, (struct sockaddr *)&myaddr, &len); + if (rc) + return rc; + unaddr = (struct sockaddr_un *)addr; + fp = fopen (unaddr->sun_path, "wb"); + if (!fp) + return -1; + fprintf (fp, "%d", myaddr.sin_port); + fclose (fp); + + /* 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 0; + } + return bind (sockfd, addr, addrlen); +} + +#endif /*_WIN32*/ diff --git a/jnlib/w32-afunix.h b/jnlib/w32-afunix.h new file mode 100644 index 000000000..d0eb8cf7e --- /dev/null +++ b/jnlib/w32-afunix.h @@ -0,0 +1,49 @@ +/* w32-afunix.h + * Copyright (C) 2004 g10 Code GmbH + * + * This file is part of GnuPG. + * + * GnuPG 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. + * + * GnuPG is distributed in the hope that 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. + */ +#ifdef _WIN32 +#ifndef W32AFUNIX_DEFS_H +#define W32AFUNIX_DEFS_H + +#include <sys/types.h> +#include <windows.h> +#include <ws2tcpip.h> +#include <unistd.h> + +#define DIRSEP_C '\\' + +#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. */ +}; + +int _w32_close (int fd); +int _w32_sock_new (int domain, int type, int proto); +int _w32_sock_bind (int sockfd, struct sockaddr *addr, int addrlen); +int _w32_sock_connect (int sockfd, struct sockaddr *addr, int addrlen); + +#endif /*W32AFUNIX_DEFS_H*/ +#endif /*_WIN32*/ diff --git a/jnlib/w32-pth.c b/jnlib/w32-pth.c new file mode 100644 index 000000000..4107c7cb3 --- /dev/null +++ b/jnlib/w32-pth.c @@ -0,0 +1,1500 @@ +/* w32-pth.c - GNU Pth emulation for W32 (MS Windows). + * Copyright (c) 1999-2003 Ralf S. Engelschall <rse@engelschall.com> + * Copyright (C) 2004 g10 Code GmbH + * + * This file is part of GnuPG. + * + * GnuPG 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. + * + * GnuPG is distributed in the hope that 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. + * + * ------------------------------------------------------------------ + * This code is based on Ralf Engelschall's GNU Pth, a non-preemptive + * thread scheduling library which can be found at + * http://www.gnu.org/software/pth/. MS Windows (W32) specific code + * written by Timo Schulz, g10 Code. + */ + +#include <config.h> +#ifdef HAVE_W32_SYSTEM +#include <windows.h> +#include <stdio.h> +#include <stdlib.h> +#include <io.h> +#include <signal.h> + +#include "logging.h" /* For log_get_prefix () */ + +/* We don't want to have any Windows specific code in the header, thus + we use a macro which defaults to a compatible type in w32-pth.h. */ +#define W32_PTH_HANDLE_INTERNAL HANDLE +#include "w32-pth.h" + + +#ifndef FALSE +#define FALSE 0 +#endif +#ifndef TRUE +#define TRUE 1 +#endif +#if FALSE != 0 || TRUE != 1 +#error TRUE or FALSE defined to wrong values +#endif + + +/* States whether this module has been initialized. */ +static int pth_initialized; + +/* Keeps the current debug level. Define marcos to test them. */ +static int debug_level; +#define DBG_ERROR (debug_level >= 1) +#define DBG_INFO (debug_level >= 2) +#define DBG_CALLS (debug_level >= 3) + +/* Variables to support event handling. */ +static int pth_signo; +static HANDLE pth_signo_ev; + +/* Mutex to make sure only one thread is running. */ +static CRITICAL_SECTION pth_shd; + +/* Events are store in a double linked event ring. */ +struct pth_event_s +{ + struct pth_event_s * next; + struct pth_event_s * prev; + HANDLE hd; + union + { + struct sigset_s * sig; + int fd; + struct timeval tv; + pth_mutex_t * mx; + } u; + int * val; + int u_type; + int flags; +}; + + +struct pth_attr_s +{ + unsigned int flags; + unsigned int stack_size; + char * name; +}; + + +/* Object to keep information about a thread. This may eventually be + used to implement a scheduler queue. */ +struct thread_info_s +{ + void *(*thread)(void *); /* The actual thread fucntion. */ + void * arg; /* The argument passed to that fucntion. */ + int joinable; /* True if this Thread is joinable. */ + HANDLE th; /* Handle of this thread. Used by non-joinable + threads to close the handle. */ +}; + + +/* Convenience macro to startup the system. */ +#define implicit_init() do { if (!pth_initialized) pth_init(); } while (0) + +/* Prototypes. */ +static pth_event_t do_pth_event (unsigned long spec, ...); +static unsigned int do_pth_waitpid (unsigned pid, int * status, int options); +static int do_pth_wait (pth_event_t ev); +static int do_pth_event_status (pth_event_t ev); +static void *launch_thread (void * ctx); + + + + +int +pth_init (void) +{ + SECURITY_ATTRIBUTES sa; + WSADATA wsadat; + const char *s; + + if (pth_initialized) + return TRUE; + + debug_level = (s=getenv ("DEBUG_PTH"))? atoi (s):0; + if (debug_level) + fprintf (stderr, "%s: pth_init: called.\n", log_get_prefix (NULL)); + + if (WSAStartup (0x202, &wsadat)) + return FALSE; + pth_signo = 0; + InitializeCriticalSection (&pth_shd); + if (pth_signo_ev) + CloseHandle (pth_signo_ev); + memset (&sa, 0, sizeof sa); + sa.bInheritHandle = TRUE; + sa.lpSecurityDescriptor = NULL; + sa.nLength = sizeof sa; + pth_signo_ev = CreateEvent (&sa, TRUE, FALSE, NULL); + if (!pth_signo_ev) + return FALSE; + + pth_initialized = 1; + EnterCriticalSection (&pth_shd); + return TRUE; +} + + +int +pth_kill (void) +{ + pth_signo = 0; + if (pth_signo_ev) + { + CloseHandle (pth_signo_ev); + pth_signo_ev = NULL; + } + if (pth_initialized) + DeleteCriticalSection (&pth_shd); + WSACleanup (); + pth_initialized = 0; + return TRUE; +} + + +static char * +w32_strerror (char *strerr, size_t strerrsize) +{ + if (strerrsize > 1) + FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, NULL, (int)GetLastError (), + MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), + strerr, strerrsize, NULL); + return strerr; +} + + +static void +enter_pth (const char *function) +{ + /* Fixme: I am not sure whether the same thread my enter a critical + section twice. */ + if (DBG_CALLS) + fprintf (stderr, "%s: enter_pth (%s)\n", + log_get_prefix (NULL), function? function:""); + LeaveCriticalSection (&pth_shd); +} + + +static void +leave_pth (const char *function) +{ + EnterCriticalSection (&pth_shd); + if (DBG_CALLS) + fprintf (stderr, "%s: leave_pth (%s)\n", + log_get_prefix (NULL), function? function:""); +} + + +long +pth_ctrl (unsigned long query, ...) +{ + implicit_init (); + + switch (query) + { + case PTH_CTRL_GETAVLOAD: + case PTH_CTRL_GETPRIO: + case PTH_CTRL_GETNAME: + case PTH_CTRL_GETTHREADS_NEW: + case PTH_CTRL_GETTHREADS_READY: + case PTH_CTRL_GETTHREADS_RUNNING: + case PTH_CTRL_GETTHREADS_WAITING: + case PTH_CTRL_GETTHREADS_SUSPENDED: + case PTH_CTRL_GETTHREADS_DEAD: + case PTH_CTRL_GETTHREADS: + default: + return -1; + } + return 0; +} + + + +pth_time_t +pth_timeout (long sec, long usec) +{ + pth_time_t tvd; + + tvd.tv_sec = sec; + tvd.tv_usec = usec; + return tvd; +} + + +int +pth_read_ev (int fd, void *buffer, size_t size, pth_event_t ev) +{ + implicit_init (); + return 0; +} + + +int +pth_read (int fd, void * buffer, size_t size) +{ + int n; + + implicit_init (); + enter_pth (__FUNCTION__); + + n = recv (fd, buffer, size, 0); + if (n == -1 && WSAGetLastError () == WSAENOTSOCK) + { + DWORD nread = 0; + n = ReadFile ((HANDLE)fd, buffer, size, &nread, NULL); + if (!n) + { + char strerr[256]; + + if (DBG_ERROR) + fprintf (stderr, "%s: pth_read(%d) failed read from file: %s\n", + log_get_prefix (NULL), fd, + w32_strerror (strerr, sizeof strerr)); + n = -1; + } + else + n = (int)nread; + } + leave_pth (__FUNCTION__); + return n; +} + + +int +pth_write_ev (int fd, const void *buffer, size_t size, pth_event_t ev) +{ + implicit_init (); + return 0; +} + + +int +pth_write (int fd, const void * buffer, size_t size) +{ + int n; + + implicit_init (); + enter_pth (__FUNCTION__); + n = send (fd, buffer, size, 0); + if (n == -1 && WSAGetLastError () == WSAENOTSOCK) + { + DWORD nwrite; + char strerr[256]; + + /* This is no real error because we first need to figure out if + we have a handle or a socket. */ + + n = WriteFile ((HANDLE)fd, buffer, size, &nwrite, NULL); + if (!n) + { + if (DBG_ERROR) + fprintf (stderr, "%s: pth_write(%d) failed in write: %s\n", + log_get_prefix (NULL), fd, + w32_strerror (strerr, sizeof strerr)); + n = -1; + } + else + n = (int)nwrite; + } + leave_pth (__FUNCTION__); + return n; +} + + +int +pth_select (int nfds, fd_set * rfds, fd_set * wfds, fd_set * efds, + const struct timeval * timeout) +{ + int n; + + implicit_init (); + enter_pth (__FUNCTION__); + n = select (nfds, rfds, wfds, efds, timeout); + leave_pth (__FUNCTION__); + return n; +} + + +int +pth_fdmode (int fd, int mode) +{ + unsigned long val; + int ret = PTH_FDMODE_BLOCK; + + implicit_init (); + /* Note: we don't do the eter/leave pth here because this is for one + a fast fucntion and secondly already called from inside such a + block. */ + /* XXX: figure out original fd mode */ + switch (mode) + { + case PTH_FDMODE_NONBLOCK: + val = 1; + if (ioctlsocket (fd, FIONBIO, &val) == SOCKET_ERROR) + ret = PTH_FDMODE_ERROR; + break; + + case PTH_FDMODE_BLOCK: + val = 0; + if (ioctlsocket (fd, FIONBIO, &val) == SOCKET_ERROR) + ret = PTH_FDMODE_ERROR; + break; + } + return ret; +} + + +int +pth_accept (int fd, struct sockaddr *addr, int *addrlen) +{ + int rc; + + implicit_init (); + enter_pth (__FUNCTION__); + rc = accept (fd, addr, addrlen); + leave_pth (__FUNCTION__); + return rc; +} + + +int +pth_accept_ev (int fd, struct sockaddr *addr, int *addrlen, + pth_event_t ev_extra) +{ + pth_key_t ev_key; + pth_event_t ev; + int rv; + int fdmode; + + implicit_init (); + enter_pth (__FUNCTION__); + + fdmode = pth_fdmode (fd, PTH_FDMODE_NONBLOCK); + if (fdmode == PTH_FDMODE_ERROR) + { + leave_pth (__FUNCTION__); + return -1; + } + + ev = NULL; + while ((rv = accept (fd, addr, addrlen)) == -1 && + (WSAGetLastError () == WSAEINPROGRESS || + WSAGetLastError () == WSAEWOULDBLOCK)) + { + if (!ev) + { + ev = do_pth_event (PTH_EVENT_FD|PTH_UNTIL_FD_READABLE| + PTH_MODE_STATIC, &ev_key, fd); + if (!ev) + { + leave_pth (__FUNCTION__); + return -1; + } + if (ev_extra) + pth_event_concat (ev, ev_extra, NULL); + } + /* Wait until accept has a chance. */ + do_pth_wait (ev); + if (ev_extra) + { + pth_event_isolate (ev); + if (do_pth_event_status (ev) != PTH_STATUS_OCCURRED) + { + pth_fdmode (fd, fdmode); + leave_pth (__FUNCTION__); + return -1; + } + } + } + + pth_fdmode (fd, fdmode); + leave_pth (__FUNCTION__); + return rv; +} + + +int +pth_connect (int fd, struct sockaddr *name, int namelen) +{ + int rc; + + implicit_init (); + enter_pth (__FUNCTION__); + rc = connect (fd, name, namelen); + leave_pth (__FUNCTION__); + return rc; +} + + +int +pth_mutex_release (pth_mutex_t *mutex) +{ + int rc; + + implicit_init (); + enter_pth (__FUNCTION__); + + if (!ReleaseMutex (*mutex)) + { + char strerr[256]; + + if (DBG_ERROR) + fprintf (stderr, "%s: pth_release_mutex %p failed: %s\n", + log_get_prefix (NULL), *mutex, + w32_strerror (strerr, sizeof strerr)); + rc = FALSE; + } + else + rc = TRUE; + + leave_pth (__FUNCTION__); + return rc; +} + + +int +pth_mutex_acquire (pth_mutex_t *mutex, int tryonly, pth_event_t ev_extra) +{ + int code; + int rc; + + implicit_init (); + enter_pth (__FUNCTION__); + + /* FIXME: ev_extra is not yet supported. */ + + code = WaitForSingleObject (*mutex, INFINITE); + switch (code) + { + case WAIT_FAILED: + { + char strerr[256]; + + if (DBG_ERROR) + fprintf (stderr, "%s: pth_mutex_acquire for %p failed: %s\n", + log_get_prefix (NULL), *mutex, + w32_strerror (strerr, sizeof strerr)); + } + rc = FALSE; + break; + + case WAIT_OBJECT_0: + rc = TRUE; + break; + + default: + if (DBG_ERROR) + fprintf (stderr, "%s: WaitForSingleObject returned unexpected " + "code %d for mutex %p\n", + log_get_prefix (NULL), code, *mutex); + rc = FALSE; + break; + } + + leave_pth (__FUNCTION__); + return rc; +} + + + +int +pth_mutex_init (pth_mutex_t *mutex) +{ + SECURITY_ATTRIBUTES sa; + + implicit_init (); + enter_pth (__FUNCTION__); + + memset (&sa, 0, sizeof sa); + sa.bInheritHandle = TRUE; + sa.lpSecurityDescriptor = NULL; + sa.nLength = sizeof sa; + *mutex = CreateMutex (&sa, FALSE, NULL); + if (!*mutex) + { + free (*mutex); + *mutex = NULL; + leave_pth (__FUNCTION__); + return FALSE; + } + + leave_pth (__FUNCTION__); + return TRUE; +} + + +pth_attr_t +pth_attr_new (void) +{ + pth_attr_t hd; + + implicit_init (); + hd = calloc (1, sizeof *hd); + return hd; +} + + +int +pth_attr_destroy (pth_attr_t hd) +{ + if (!hd) + return -1; + implicit_init (); + if (hd->name) + free (hd->name); + free (hd); + return TRUE; +} + + +int +pth_attr_set (pth_attr_t hd, int field, ...) +{ + va_list args; + char * str; + int val; + int rc = TRUE; + + implicit_init (); + + va_start (args, field); + switch (field) + { + case PTH_ATTR_JOINABLE: + val = va_arg (args, int); + if (val) + { + hd->flags |= PTH_ATTR_JOINABLE; + if (DBG_INFO) + fprintf (stderr, "%s: pth_attr_set: PTH_ATTR_JOINABLE\n", + log_get_prefix (NULL)); + } + break; + + case PTH_ATTR_STACK_SIZE: + val = va_arg (args, int); + if (val) + { + hd->flags |= PTH_ATTR_STACK_SIZE; + hd->stack_size = val; + if (DBG_INFO) + fprintf (stderr, "%s: pth_attr_set: PTH_ATTR_STACK_SIZE %d\n", + log_get_prefix (NULL), val); + } + break; + + case PTH_ATTR_NAME: + str = va_arg (args, char*); + if (hd->name) + free (hd->name); + if (str) + { + hd->name = strdup (str); + if (!hd->name) + return FALSE; + hd->flags |= PTH_ATTR_NAME; + if (DBG_INFO) + fprintf (stderr, "%s: pth_attr_set: PTH_ATTR_NAME %s\n", + log_get_prefix (NULL), hd->name); + } + break; + + default: + rc = FALSE; + break; + } + va_end (args); + return rc; +} + + +static pth_t +do_pth_spawn (pth_attr_t hd, void *(*func)(void *), void *arg) +{ + SECURITY_ATTRIBUTES sa; + DWORD tid; + HANDLE th; + struct thread_info_s *ctx; + + if (!hd) + return NULL; + + memset (&sa, 0, sizeof sa); + sa.bInheritHandle = TRUE; + sa.lpSecurityDescriptor = NULL; + sa.nLength = sizeof sa; + + ctx = calloc (1, sizeof *ctx); + if (!ctx) + return NULL; + ctx->thread = func; + ctx->arg = arg; + ctx->joinable = (hd->flags & PTH_ATTR_JOINABLE); + + /* XXX: we don't use all thread attributes. */ + + /* Note that we create the thread suspended so that we are able to + store the thread's handle in the context structure. We need to + do this to be able to close the handle from the launch helper. + + FIXME: We should no use th W32's Thread handle directly but keep + our own thread control structure. CTX may be used for that. */ + if (DBG_INFO) + fprintf (stderr, "%s: do_pth_spawn creating thread ...\n", + log_get_prefix (NULL)); + th = CreateThread (&sa, hd->stack_size, + (LPTHREAD_START_ROUTINE)launch_thread, + ctx, CREATE_SUSPENDED, &tid); + ctx->th = th; + if (DBG_INFO) + fprintf (stderr, "%s: do_pth_spawn created thread %p\n", + log_get_prefix (NULL),th); + if (!th) + free (ctx); + else + ResumeThread (th); + + return th; +} + +pth_t +pth_spawn (pth_attr_t hd, void *(*func)(void *), void *arg) +{ + HANDLE th; + + if (!hd) + return NULL; + + implicit_init (); + enter_pth (__FUNCTION__); + th = do_pth_spawn (hd, func, arg); + leave_pth (__FUNCTION__); + return th; +} + + +pth_t +pth_self (void) +{ + return GetCurrentThread (); +} + +int +pth_join (pth_t hd, void **value) +{ + return TRUE; +} + + +/* friendly */ +int +pth_cancel (pth_t hd) +{ + if (!hd) + return -1; + implicit_init (); + enter_pth (__FUNCTION__); + WaitForSingleObject (hd, 1000); + TerminateThread (hd, 0); + leave_pth (__FUNCTION__); + return TRUE; +} + + +/* cruel */ +int +pth_abort (pth_t hd) +{ + if (!hd) + return -1; + implicit_init (); + enter_pth (__FUNCTION__); + TerminateThread (hd, 0); + leave_pth (__FUNCTION__); + return TRUE; +} + + +void +pth_exit (void *value) +{ + implicit_init (); + enter_pth (__FUNCTION__); + pth_kill (); + leave_pth (__FUNCTION__); + exit ((int)(long)value); +} + + +static unsigned int +do_pth_waitpid (unsigned pid, int * status, int options) +{ +#if 0 + pth_event_t ev; + static pth_key_t ev_key = PTH_KEY_INIT; + pid_t pid; + + pth_debug2("pth_waitpid: called from thread \"%s\"", pth_current->name); + + for (;;) + { + /* do a non-blocking poll for the pid */ + while ( (pid = pth_sc(waitpid)(wpid, status, options|WNOHANG)) < 0 + && errno == EINTR) + ; + + /* if pid was found or caller requested a polling return immediately */ + if (pid == -1 || pid > 0 || (pid == 0 && (options & WNOHANG))) + break; + + /* else wait a little bit */ + ev = pth_event(PTH_EVENT_TIME|PTH_MODE_STATIC, &ev_key, + pth_timeout (0,250000)); + pth_wait(ev); + } + + pth_debug2("pth_waitpid: leave to thread \"%s\"", pth_current->name); +#endif + return 0; +} + + +unsigned int +pth_waitpid (unsigned pid, int * status, int options) +{ + unsigned int n; + + implicit_init (); + enter_pth (__FUNCTION__); + n = do_pth_waitpid (pid, status, options); + leave_pth (__FUNCTION__); + return n; +} + + +static BOOL WINAPI +sig_handler (DWORD signo) +{ + switch (signo) + { + case CTRL_C_EVENT: pth_signo = SIGINT; break; + case CTRL_BREAK_EVENT: pth_signo = SIGTERM; break; + } + SetEvent (pth_signo_ev); + if (DBG_INFO) + fprintf (stderr, "%s: sig_handler=%d\n", log_get_prefix (NULL), pth_signo); + return TRUE; +} + + +static pth_event_t +do_pth_event_body (unsigned long spec, va_list arg) +{ + SECURITY_ATTRIBUTES sa; + pth_event_t ev; + int rc; + + if (DBG_INFO) + fprintf (stderr, "%s: pth_event spec=%lu\n", log_get_prefix (NULL), spec); + ev = calloc (1, sizeof *ev); + if (!ev) + return NULL; + if (spec == 0) + ; + else if (spec & PTH_EVENT_SIGS) + { + ev->u.sig = va_arg (arg, struct sigset_s *); + ev->u_type = PTH_EVENT_SIGS; + ev->val = va_arg (arg, int *); + rc = SetConsoleCtrlHandler (sig_handler, TRUE); + if (DBG_INFO) + fprintf (stderr, "%s: pth_event: sigs rc=%d\n", + log_get_prefix (NULL), rc); + } + else if (spec & PTH_EVENT_FD) + { + if (spec & PTH_UNTIL_FD_READABLE) + ev->flags |= PTH_UNTIL_FD_READABLE; + if (spec & PTH_MODE_STATIC) + ev->flags |= PTH_MODE_STATIC; + ev->u_type = PTH_EVENT_FD; + va_arg (arg, pth_key_t); + ev->u.fd = va_arg (arg, int); + if (DBG_INFO) + fprintf (stderr, "%s: pth_event: fd=%d\n", + log_get_prefix (NULL), ev->u.fd); + } + else if (spec & PTH_EVENT_TIME) + { + pth_time_t t; + if (spec & PTH_MODE_STATIC) + ev->flags |= PTH_MODE_STATIC; + va_arg (arg, pth_key_t); + t = va_arg (arg, pth_time_t); + ev->u_type = PTH_EVENT_TIME; + ev->u.tv.tv_sec = t.tv_sec; + ev->u.tv.tv_usec = t.tv_usec; + } + else if (spec & PTH_EVENT_MUTEX) + { + va_arg (arg, pth_key_t); + ev->u_type = PTH_EVENT_MUTEX; + ev->u.mx = va_arg (arg, pth_mutex_t*); + } + + memset (&sa, 0, sizeof sa); + sa.bInheritHandle = TRUE; + sa.lpSecurityDescriptor = NULL; + sa.nLength = sizeof sa; + ev->hd = CreateEvent (&sa, FALSE, FALSE, NULL); + if (!ev->hd) + { + free (ev); + return NULL; + } + ev->next = ev; + ev->prev = ev; + + return ev; +} + +static pth_event_t +do_pth_event (unsigned long spec, ...) +{ + va_list arg; + pth_event_t ev; + + va_start (arg, spec); + ev = do_pth_event_body (spec, arg); + va_end (arg); + + return ev; +} + +pth_event_t +pth_event (unsigned long spec, ...) +{ + va_list arg; + pth_event_t ev; + + implicit_init (); + enter_pth (__FUNCTION__); + + va_start (arg, spec); + ev = do_pth_event_body (spec, arg); + va_end (arg); + + leave_pth (__FUNCTION__); + return ev; +} + + +static void +pth_event_add (pth_event_t root, pth_event_t node) +{ + pth_event_t n; + + for (n=root; n->next; n = n->next) + ; + n->next = node; +} + + +pth_event_t +pth_event_concat (pth_event_t evf, ...) +{ + pth_event_t evn; + va_list ap; + + if (!evf) + return NULL; + + implicit_init (); + + va_start (ap, evf); + while ((evn = va_arg(ap, pth_event_t)) != NULL) + pth_event_add (evf, evn); + va_end (ap); + + return evf; +} + + +static int +wait_for_fd (int fd, int is_read, int nwait) +{ + struct timeval tv; + fd_set r; + fd_set w; + int n; + + FD_ZERO (&r); + FD_ZERO (&w); + FD_SET (fd, is_read ? &r : &w); + + tv.tv_sec = nwait; + tv.tv_usec = 0; + + while (1) + { + n = select (fd+1, &r, &w, NULL, &tv); + if (DBG_INFO) + fprintf (stderr, "%s: wait_for_fd=%d fd %d (ec=%d)\n", + log_get_prefix (NULL), n, fd,(int)WSAGetLastError ()); + if (n == -1) + break; + if (!n) + continue; + if (n == 1) + { + if (is_read && FD_ISSET (fd, &r)) + break; + else if (FD_ISSET (fd, &w)) + break; + } + } + return 0; +} + + +static void * +launch_thread (void *arg) +{ + struct thread_info_s *c = arg; + + if (c) + { + leave_pth (__FUNCTION__); + c->thread (c->arg); + if (!c->joinable && c->th) + { + CloseHandle (c->th); + c->th = NULL; + } + /* FIXME: We would badly fail if someone accesses the now + deallocated handle. Don't use it directly but setup proper + scheduling queues. */ + enter_pth (__FUNCTION__); + free (c); + } + ExitThread (0); + return NULL; +} + +/* void */ +/* sigemptyset (struct sigset_s * ss) */ +/* { */ +/* if (ss) { */ +/* memset (ss->sigs, 0, sizeof ss->sigs); */ +/* ss->idx = 0; */ +/* } */ +/* } */ + + +/* int */ +/* sigaddset (struct sigset_s * ss, int signo) */ +/* { */ +/* if (!ss) */ +/* return -1; */ +/* if (ss->idx + 1 > 64) */ +/* return -1; */ +/* ss->sigs[ss->idx] = signo; */ +/* ss->idx++; */ +/* return 0; */ +/* } */ + + +static int +sigpresent (struct sigset_s * ss, int signo) +{ +/* int i; */ +/* for (i=0; i < ss->idx; i++) { */ +/* if (ss->sigs[i] == signo) */ +/* return 1; */ +/* } */ +/* FIXME: See how to implement it. */ + return 0; +} + + +static int +do_pth_event_occurred (pth_event_t ev) +{ + int ret; + + if (!ev) + return 0; + + ret = 0; + switch (ev->u_type) + { + case 0: + if (WaitForSingleObject (ev->hd, 0) == WAIT_OBJECT_0) + ret = 1; + break; + + case PTH_EVENT_SIGS: + if (sigpresent (ev->u.sig, pth_signo) && + WaitForSingleObject (pth_signo_ev, 0) == WAIT_OBJECT_0) + { + if (DBG_INFO) + fprintf (stderr, "%s: pth_event_occurred: sig signaled.\n", + log_get_prefix (NULL)); + (*ev->val) = pth_signo; + ret = 1; + } + break; + + case PTH_EVENT_FD: + if (WaitForSingleObject (ev->hd, 0) == WAIT_OBJECT_0) + ret = 1; + break; + } + + return ret; +} + + +int +pth_event_occurred (pth_event_t ev) +{ + int ret; + + implicit_init (); + enter_pth (__FUNCTION__); + ret = do_pth_event_occurred (ev); + leave_pth (__FUNCTION__); + return ret; +} + + +static int +do_pth_event_status (pth_event_t ev) +{ + if (!ev) + return 0; + if (do_pth_event_occurred (ev)) + return PTH_STATUS_OCCURRED; + return 0; +} + +int +pth_event_status (pth_event_t ev) +{ + if (!ev) + return 0; + if (pth_event_occurred (ev)) + return PTH_STATUS_OCCURRED; + return 0; +} + + +static int +do_pth_event_free (pth_event_t ev, int mode) +{ + if (!ev) + return FALSE; + + if (mode == PTH_FREE_ALL) + { + pth_event_t cur = ev; + do + { + pth_event_t next = cur->next; + CloseHandle (cur->hd); + cur->hd = NULL; + free (cur); + cur = next; + } + while (cur != ev); + } + else if (mode == PTH_FREE_THIS) + { + ev->prev->next = ev->next; + ev->next->prev = ev->prev; + CloseHandle (ev->hd); + ev->hd = NULL; + free (ev); + } + else + return FALSE; + + return TRUE; +} + +int +pth_event_free (pth_event_t ev, int mode) +{ + int rc; + + implicit_init (); + enter_pth (__FUNCTION__); + rc = do_pth_event_free (ev, mode); + leave_pth (__FUNCTION__); + return rc; +} + + +pth_event_t +pth_event_isolate (pth_event_t ev) +{ + pth_event_t ring; + + if (!ev) + return NULL; + if (ev->next == ev && ev->prev == ev) + return NULL; /* Only one event. */ + + ring = ev->next; + ev->prev->next = ev->next; + ev->next->prev = ev->prev; + ev->prev = ev; + ev->next = ev; + return ring; +} + + +static int +event_count (pth_event_t ev) +{ + pth_event_t r; + int cnt = 0; + + if (ev) + { + r = ev; + do + { + cnt++; + r = r->next; + } + while (r != ev); + } + + return cnt; +} + + + +static pth_t +spawn_helper_thread (void *(*func)(void *), void *arg) +{ + SECURITY_ATTRIBUTES sa; + DWORD tid; + HANDLE th; + + memset (&sa, 0, sizeof sa); + sa.bInheritHandle = TRUE; + sa.lpSecurityDescriptor = NULL; + sa.nLength = sizeof sa; + + if (DBG_INFO) + fprintf (stderr, "%s: spawn_helper_thread creating thread ...\n", + log_get_prefix (NULL)); + th = CreateThread (&sa, 32*1024, + (LPTHREAD_START_ROUTINE)func, + arg, 0, &tid); + if (DBG_INFO) + fprintf (stderr, "%s: spawn_helper_thread created thread %p\n", + log_get_prefix (NULL), th); + + return th; +} + + +static void +free_helper_threads (HANDLE *waitbuf, int *hdidx, int n) +{ + int i; + + for (i=0; i < n; i++) + { + CloseHandle (waitbuf[hdidx[i]]); + waitbuf[hdidx[i]] = NULL; + } +} + + +static void * +wait_fd_thread (void * ctx) +{ + pth_event_t ev = ctx; + + wait_for_fd (ev->u.fd, ev->flags & PTH_UNTIL_FD_READABLE, 3600); + if (DBG_INFO) + fprintf (stderr, "%s: wait_fd_thread: exit.\n", log_get_prefix (NULL)); + SetEvent (ev->hd); + ExitThread (0); + return NULL; +} + + +static void * +wait_timer_thread (void * ctx) +{ + pth_event_t ev = ctx; + int n = ev->u.tv.tv_sec*1000; + Sleep (n); + SetEvent (ev->hd); + if (DBG_INFO) + fprintf (stderr, "%s: wait_timer_thread: exit.\n", log_get_prefix (NULL)); + ExitThread (0); + return NULL; +} + + +static int +do_pth_wait (pth_event_t ev) +{ + HANDLE waitbuf[MAXIMUM_WAIT_OBJECTS/2]; + int hdidx[MAXIMUM_WAIT_OBJECTS/2]; + DWORD n = 0; + int pos=0, i=0; + + if (!ev) + return 0; + + n = event_count (ev); + if (n > MAXIMUM_WAIT_OBJECTS/2) + return -1; + + if (DBG_INFO) + fprintf (stderr, "%s: pth_wait: cnt %lu\n", log_get_prefix (NULL), n); + if (ev) + { + pth_event_t r = ev; + do + { + switch (r->u_type) + { + case 0: + waitbuf[pos++] = r->hd; + break; + + case PTH_EVENT_SIGS: + waitbuf[pos++] = pth_signo_ev; + if (DBG_INFO) + fprintf (stderr, "pth_wait: add signal event.\n"); + break; + + case PTH_EVENT_FD: + if (DBG_INFO) + fprintf (stderr, "pth_wait: spawn event wait thread.\n"); + hdidx[i++] = pos; + waitbuf[pos++] = spawn_helper_thread (wait_fd_thread, r); + break; + + case PTH_EVENT_TIME: + if (DBG_INFO) + fprintf (stderr, "pth_wait: spawn event timer thread.\n"); + hdidx[i++] = pos; + waitbuf[pos++] = spawn_helper_thread (wait_timer_thread, r); + break; + + case PTH_EVENT_MUTEX: + if (DBG_INFO) + fprintf (stderr, "pth_wait: ignoring mutex event.\n"); + break; + } + } + while ( r != ev ); + } + if (DBG_INFO) + fprintf (stderr, "%s: pth_wait: set %d\n", log_get_prefix (NULL), pos); + n = WaitForMultipleObjects (pos, waitbuf, FALSE, INFINITE); + free_helper_threads (waitbuf, hdidx, i); + if (DBG_INFO) + fprintf (stderr, "%s: pth_wait: n %ld\n", log_get_prefix (NULL), n); + + if (n != WAIT_TIMEOUT) + return 1; + + return 0; +} + +int +pth_wait (pth_event_t ev) +{ + int rc; + + implicit_init (); + enter_pth (__FUNCTION__); + rc = do_pth_wait (ev); + leave_pth (__FUNCTION__); + return rc; +} + + +int +pth_sleep (int sec) +{ + static pth_key_t ev_key = PTH_KEY_INIT; + pth_event_t ev; + + implicit_init (); + enter_pth (__FUNCTION__); + + if (sec == 0) + { + leave_pth (__FUNCTION__); + return 0; + } + + ev = do_pth_event (PTH_EVENT_TIME|PTH_MODE_STATIC, &ev_key, + pth_timeout (sec, 0)); + if (ev == NULL) + { + leave_pth (__FUNCTION__); + return -1; + } + do_pth_wait (ev); + do_pth_event_free (ev, PTH_FREE_ALL); + + leave_pth (__FUNCTION__); + return 0; +} + + + + + +/* + Some simple tests. + */ +#ifdef TEST +#include <stdio.h> + +void * thread (void * c) +{ + + Sleep (2000); + SetEvent (((pth_event_t)c)->hd); + fprintf (stderr, "\n\nhallo!.\n"); + pth_exit (NULL); + return NULL; +} + + +int main_1 (int argc, char ** argv) +{ + pth_attr_t t; + pth_t hd; + pth_event_t ev; + + pth_init (); + ev = pth_event (0, NULL); + t = pth_attr_new (); + pth_attr_set (t, PTH_ATTR_JOINABLE, 1); + pth_attr_set (t, PTH_ATTR_STACK_SIZE, 4096); + pth_attr_set (t, PTH_ATTR_NAME, "hello"); + hd = pth_spawn (t, thread, ev); + + pth_wait (ev); + pth_attr_destroy (t); + pth_event_free (ev, 0); + pth_kill (); + + return 0; +} + + +static pth_event_t +setup_signals (struct sigset_s *sigs, int *signo) +{ + pth_event_t ev; + + sigemptyset (sigs); + sigaddset (sigs, SIGINT); + sigaddset (sigs, SIGTERM); + + ev = pth_event (PTH_EVENT_SIGS, sigs, signo); + return ev; +} + +int +main_2 (int argc, char ** argv) +{ + pth_event_t ev; + struct sigset_s sigs; + int signo = 0; + + pth_init (); + ev = setup_signals (&sigs, &signo); + pth_wait (ev); + if (pth_event_occured (ev) && signo) + fprintf (stderr, "signal caught! signo %d\n", signo); + + pth_event_free (ev, PTH_FREE_ALL); + pth_kill (); + return 0; +} + +int +main_3 (int argc, char ** argv) +{ + struct sockaddr_in addr, rem; + int fd, n = 0, infd; + int signo = 0; + struct sigset_s sigs; + pth_event_t ev; + + pth_init (); + fd = socket (AF_INET, SOCK_STREAM, 0); + + memset (&addr, 0, sizeof addr); + addr.sin_addr.s_addr = INADDR_ANY; + addr.sin_port = htons (5050); + addr.sin_family = AF_INET; + bind (fd, (struct sockaddr*)&addr, sizeof addr); + listen (fd, 5); + + ev = setup_signals (&sigs, &signo); + n = sizeof addr; + infd = pth_accept_ev (fd, (struct sockaddr *)&rem, &n, ev); + fprintf (stderr, "infd %d: %s:%d\n", infd, inet_ntoa (rem.sin_addr), + htons (rem.sin_port)); + + closesocket (infd); + pth_event_free (ev, PTH_FREE_ALL); + pth_kill (); + return 0; +} + +int +main (int argc, char ** argv) +{ + pth_event_t ev; + pth_key_t ev_key; + + pth_init (); + /*ev = pth_event (PTH_EVENT_TIME, &ev_key, pth_timeout (5, 0)); + pth_wait (ev); + pth_event_free (ev, PTH_FREE_ALL);*/ + pth_sleep (5); + pth_kill (); + return 0; +} +#endif + +#endif /*HAVE_W32_SYSTEM*/ + diff --git a/jnlib/w32-pth.h b/jnlib/w32-pth.h new file mode 100644 index 000000000..524010d92 --- /dev/null +++ b/jnlib/w32-pth.h @@ -0,0 +1,245 @@ +/* w32-pth.h - GNU Pth emulation for W32 (MS Windows). + * Copyright (c) 1999-2003 Ralf S. Engelschall <rse@engelschall.com> + * Copyright (C) 2004 g10 Code GmbH + * + * This file is part of GnuPG. + * + * GnuPG 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. + * + * GnuPG is distributed in the hope that 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. + * + * ------------------------------------------------------------------ + * This code is based on Ralf Engelschall's GNU Pth, a non-preemptive + * thread scheduling library which can be found at + * http://www.gnu.org/software/pth/. + */ + +/* Note that this header is usually used through a symlinked pth.h + file. This is needed so that we don't have a pth.h file here which + would conflict if a system really has pth available. */ +#ifndef W32_PTH_H +#define W32_PTH_H + +#include <windows.h> /* We need this for sockaddr et al. FIXME: too + heavyweight - may be we should factor such + code out to a second header and adjust all + user files to include it only if required. */ + +#ifndef W32_PTH_HANDLE_INTERNAL +#define W32_PTH_HANDLE_INTERNAL int +#endif + + +/* Filedescriptor blocking modes. */ +enum + { + PTH_FDMODE_ERROR = -1, + PTH_FDMODE_POLL = 0, + PTH_FDMODE_BLOCK, + PTH_FDMODE_NONBLOCK + }; + + +/* Mutex values. */ +#define PTH_MUTEX_INITIALIZED (1<<0) +#define PTH_MUTEX_LOCKED (1<<1) + +/* Note: We can't do static initialization, thus we don't define the + initializer PTH_MUTEX_INIT. */ + + +#define PTH_KEY_INIT (1<<0) + + +/* Event subject classes. */ +#define PTH_EVENT_FD (1<<1) +#define PTH_EVENT_SELECT (1<<2) +#define PTH_EVENT_SIGS (1<<3) +#define PTH_EVENT_TIME (1<<4) +#define PTH_EVENT_MSG (1<<5) +#define PTH_EVENT_MUTEX (1<<6) +#define PTH_EVENT_COND (1<<7) +#define PTH_EVENT_TID (1<<8) +#define PTH_EVENT_FUNC (1<<9) + + + +/* Event occurrence restrictions. */ +#define PTH_UNTIL_OCCURRED (1<<11) +#define PTH_UNTIL_FD_READABLE (1<<12) +#define PTH_UNTIL_FD_WRITEABLE (1<<13) +#define PTH_UNTIL_FD_EXCEPTION (1<<14) +#define PTH_UNTIL_TID_NEW (1<<15) +#define PTH_UNTIL_TID_READY (1<<16) +#define PTH_UNTIL_TID_WAITING (1<<17) +#define PTH_UNTIL_TID_DEAD (1<<18) + + +/* Event structure handling modes. */ +#define PTH_MODE_REUSE (1<<20) +#define PTH_MODE_CHAIN (1<<21) +#define PTH_MODE_STATIC (1<<22) + + +/* Attribute commands for pth_attr_get and pth_attr_set(). */ +enum + { + PTH_ATTR_PRIO, /* RW [int] Priority of thread. */ + PTH_ATTR_NAME, /* RW [char *] Name of thread. */ + PTH_ATTR_JOINABLE, /* RW [int] Thread detachment type. */ + PTH_ATTR_CANCEL_STATE, /* RW [unsigned int] Thread cancellation state.*/ + PTH_ATTR_STACK_SIZE, /* RW [unsigned int] Stack size. */ + PTH_ATTR_STACK_ADDR, /* RW [char *] Stack lower address. */ + PTH_ATTR_DISPATCHES, /* RO [int] Total number of + thread dispatches. */ + PTH_ATTR_TIME_SPAWN, /* RO [pth_time_t] Time thread was spawned. */ + PTH_ATTR_TIME_LAST, /* RO [pth_time_t] Time thread was + last dispatched. */ + PTH_ATTR_TIME_RAN, /* RO [pth_time_t] Time thread was running. */ + PTH_ATTR_START_FUNC, /* RO [void *(*)(void *)] Thread start function.*/ + PTH_ATTR_START_ARG, /* RO [void *] Thread start argument. */ + PTH_ATTR_STATE, /* RO [pth_state_t] Scheduling state. */ + PTH_ATTR_EVENTS, /* RO [pth_event_t] Events the thread + is waiting for. */ + PTH_ATTR_BOUND /* RO [int] Whether object is + bound to thread. */ + }; + + + +/* Queries for pth_ctrl(). */ +#define PTH_CTRL_GETAVLOAD (1<<1) +#define PTH_CTRL_GETPRIO (1<<2) +#define PTH_CTRL_GETNAME (1<<3) +#define PTH_CTRL_GETTHREADS_NEW (1<<4) +#define PTH_CTRL_GETTHREADS_READY (1<<5) +#define PTH_CTRL_GETTHREADS_RUNNING (1<<6) +#define PTH_CTRL_GETTHREADS_WAITING (1<<7) +#define PTH_CTRL_GETTHREADS_SUSPENDED (1<<8) +#define PTH_CTRL_GETTHREADS_DEAD (1<<9) +#define PTH_CTRL_DUMPSTATE (1<<10) + +#define PTH_CTRL_GETTHREADS ( PTH_CTRL_GETTHREADS_NEW \ + | PTH_CTRL_GETTHREADS_READY \ + | PTH_CTRL_GETTHREADS_RUNNING \ + | PTH_CTRL_GETTHREADS_WAITING \ + | PTH_CTRL_GETTHREADS_SUSPENDED \ + | PTH_CTRL_GETTHREADS_DEAD ) + + +/* Event status codes. */ +typedef enum + { + PTH_STATUS_PENDING, + PTH_STATUS_OCCURRED, + PTH_STATUS_FAILED + } +pth_status_t; + + +/* Event deallocation types. */ +enum + { + PTH_FREE_THIS, + PTH_FREE_ALL + }; + + +/* The Pth thread handle object. */ +typedef void *pth_t; + + +/* The Mutex object. */ +typedef W32_PTH_HANDLE_INTERNAL pth_mutex_t; + + +/* The Event object. */ +struct pth_event_s; +typedef struct pth_event_s *pth_event_t; + + +/* The Attribute object. */ +struct pth_attr_s; +typedef struct pth_attr_s *pth_attr_t; + + +/* The Key object. */ +typedef int pth_key_t; + + +/* The Pth time object. */ +typedef struct timeval pth_time_t; + + +/* Function prototypes. */ +int pth_init (void); +int pth_kill (void); +long pth_ctrl (unsigned long query, ...); + +int pth_read_ev (int fd, void *buffer, size_t size, pth_event_t ev); +int pth_read (int fd, void *buffer, size_t size); +int pth_write_ev (int fd, const void *buffer, size_t size, pth_event_t ev); +int pth_write (int fd, const void *buffer, size_t size); + +int pth_select (int nfds, fd_set *rfds, fd_set *wfds, fd_set *efds, + const struct timeval *timeout); + +int pth_accept (int fd, struct sockaddr *addr, int *addrlen); +int pth_accept_ev (int fd, struct sockaddr *addr, int *addrlen, + pth_event_t hd); + +int pth_connect (int fd, struct sockaddr *name, int namelen); + + +int pth_mutex_release (pth_mutex_t *hd); +int pth_mutex_acquire(pth_mutex_t *hd, int try_only, pth_event_t ev_extra); +int pth_mutex_init (pth_mutex_t *hd); + + +pth_attr_t pth_attr_new (void); +int pth_attr_destroy (pth_attr_t hd); +int pth_attr_set (pth_attr_t hd, int field, ...); + +pth_t pth_spawn (pth_attr_t hd, void *(*func)(void *), void *arg); +pth_t pth_self (void); +int pth_join (pth_t hd, void **value); +int pth_abort (pth_t hd); +void pth_exit (void *value); + +unsigned int pth_waitpid (unsigned int, int *status, int options); +int pth_wait (pth_event_t hd); + +int pth_sleep (int n); +pth_time_t pth_timeout (long sec, long usec); + + + +pth_event_t pth_event_isolate (pth_event_t hd); +int pth_event_free (pth_event_t hd, int mode); +int pth_event_status (pth_event_t hd); +int pth_event_occurred (pth_event_t hd); +pth_event_t pth_event_concat (pth_event_t ev, ...); +pth_event_t pth_event (unsigned long spec, ...); + + + +/*-- pth_util.c --*/ + +/* void sigemptyset (struct sigset_s * ss); */ + +/* int sigaddset (struct sigset_s * ss, int signo); */ + + + +#endif /*W32_PTH_H*/ diff --git a/jnlib/xmalloc.c b/jnlib/xmalloc.c new file mode 100644 index 000000000..f5b92ba41 --- /dev/null +++ b/jnlib/xmalloc.c @@ -0,0 +1,89 @@ +/* xmalloc.c - standard malloc wrappers + * 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 <stdlib.h> +#include <string.h> +#include <stdio.h> + +#include "libjnlib-config.h" +#include "xmalloc.h" + +static void +out_of_core(void) +{ + fputs("\nfatal: out of memory\n", stderr ); + exit(2); +} + + +void * +xmalloc( size_t n ) +{ + void *p = malloc( n ); + if( !p ) + out_of_core(); + return p; +} + +void * +xrealloc( void *a, size_t n ) +{ + void *p = realloc( a, n ); + if( !p ) + out_of_core(); + return p; +} + +void * +xcalloc( size_t n, size_t m ) +{ + void *p = calloc( n, m ); + if( !p ) + out_of_core(); + return p; +} + +char * +xstrdup( const char *string ) +{ + void *p = xmalloc( strlen(string)+1 ); + strcpy( p, string ); + return p; +} + + +char * +xstrcat2( const char *a, const char *b ) +{ + size_t n1; + char *p; + + if( !b ) + return xstrdup( a ); + + n1 = strlen(a); + p = xmalloc( n1 + strlen(b) + 1 ); + memcpy(p, a, n1 ); + strcpy(p+n1, b ); + return p; +} + diff --git a/cipher/bithelp.h b/jnlib/xmalloc.h similarity index 62% rename from cipher/bithelp.h rename to jnlib/xmalloc.h index 64209bacd..8bfa7df79 100644 --- a/cipher/bithelp.h +++ b/jnlib/xmalloc.h @@ -1,5 +1,5 @@ -/* bithelp.h - Some bit manipulation helpers - * Copyright (C) 1999 Free Software Foundation, Inc. +/* xmalloc.h + * Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -18,25 +18,15 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. */ -#ifndef G10_BITHELP_H -#define G10_BITHELP_H + +#ifndef LIBJNLIB_XMALLOC_H +#define LIBJNLIB_XMALLOC_H + +void *xmalloc( size_t n ); +void *xrealloc( void *a, size_t n ); +void *xcalloc( size_t n, size_t m ); +char *xstrdup( const char *string ); +char *xstrcat2( const char *a, const char *b ); -/**************** - * 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*/ +#endif /*LIBJNLIB_XMALLOC_H*/ diff --git a/kbx/ChangeLog b/kbx/ChangeLog index af6e6b016..14b702318 100644 --- a/kbx/ChangeLog +++ b/kbx/ChangeLog @@ -1,3 +1,104 @@ +2005-10-08 Marcus Brinkmann <marcus@g10code.de> + + * Makefile.am (kbxutil_LDADD): Add ../gl/libgnu.a after + ../jnlib/libjnlib.a. + +2005-06-15 Werner Koch <wk@g10code.com> + + * keybox-file.c (_keybox_read_blob2): Make IMAGE unsigned. + (_keybox_write_blob): + + * keybox-blob.c (create_blob_finish, _keybox_create_x509_blob): + Fixed warnings about signed/unsigned pointer mismatches. + (x509_email_kludge): Ditto. + (_keybox_new_blob): Changed arg IMAGE to unsigned char *. + (_keybox_get_blob_image): Changed return type to unsigned char*. + +2005-06-01 Werner Koch <wk@g10code.com> + + * keybox-file.c (ftello) [!HAVE_FSEEKO]: New replacement + function. Copied from ../common/ftello.c. + * keybox-update.c (fseeko) [!HAVE_FSEEKO]: New replacement + function. Copied from ../common/iobuf.c. + +2004-12-18 Werner Koch <wk@g10code.com> + + * keybox-defs.h (map_assuan_err): Define in terms of + map_assuan_err_with_source. + +2004-12-07 Werner Koch <wk@g10code.com> + + * keybox-init.c (keybox_release): Close the file pointer. + +2004-11-26 Werner Koch <wk@g10code.com> + + * Makefile.am (kbxutil_LDADD): Add ../common/libcommon.a + + * keybox-defs.h: Include stringhelp.h. + +2004-09-30 Werner Koch <wk@g10code.com> + + * kbxutil.c (i18n_init): Always use LC_ALL. + + * Makefile.am: Adjusted for gettext 0.14. + +2004-08-24 Werner Koch <wk@g10code.de> + + * kbxutil.c: New command --import-openpgp. + (main): Updated libgcrypt initialization stuff. + (my_gcry_logger): New. + (read_file): New. Taken from ../agent/protect-tool. + (dump_fpr, dump_openpgp_key, import_openpgp): New. + + * keybox-openpgp.c: New. + +2004-06-18 Werner Koch <wk@gnupg.org> + + * keybox-dump.c (_keybox_dump_file): New arg STATS_ONLY. + (update_stats): New. + * kbxutil.c (main): New command --stats. + +2004-04-23 Werner Koch <wk@gnupg.org> + + * keybox-blob.c (_keybox_update_header_blob): New. + * keybox-update.c (blob_filecopy): Handle header blob. + * keybox-file.c (_keybox_read_blob2): New. Moved code from + _keybox_read_blob to there. + * keybox-dump.c (dump_header_blob): Print header info. + +2004-04-21 Werner Koch <wk@gnupg.org> + + * keybox-search.c (_keybox_get_flag_location): Add flag + KEYBOX_FLAG_CREATED_AT. + * keybox-update.c (keybox_compress): New. + + * keybox-search.c (get32, get16, blob_get_type) + (blob_get_blob_flags, has_short_kid, has_long_kid) + (has_fingerprint, has_issuer, has_issuer_sn, has_sn, has_subject) + (has_subject_or_alt, has_mail): inline them. + + * keybox-update.c (blob_filecopy): Fixed an error/eof check + (s/if(fread)/if(nread)/). + + * keybox-dump.c (_keybox_dump_blob): Really print the timestamps. + +2004-04-20 Werner Koch <wk@gnupg.org> + + * keybox-defs.h: Include jnlib/types.h and remove our own + definitions for byte.u16 and u32. + +2004-02-02 Werner Koch <wk@gnupg.org> + + * keybox.h (keybox_flag_t): New. + * keybox-search.c (get_flag_from_image, keybox_get_flags): New. + (_keybox_get_flag_location): New. + +2003-11-12 Werner Koch <wk@gnupg.org> + + Adjusted for API changes in Libksba. + + * keybox-blob.c: Include time.h + 2003-06-03 Werner Koch <wk@gnupg.org> Changed all error codes in all files to the new libgpg-error scheme. diff --git a/kbx/Makefile.am b/kbx/Makefile.am index 4f0c40043..063dbb4c0 100644 --- a/kbx/Makefile.am +++ b/kbx/Makefile.am @@ -15,7 +15,8 @@ # # You 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 +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, +# USA. ## Process this file with automake to produce Makefile.in @@ -23,7 +24,7 @@ localedir = $(datadir)/locale INCLUDES = -I../intl -DLOCALEDIR=\"$(localedir)\" EXTRA_DIST = mkerrors -AM_CPPFLAGS = -I$(top_srcdir)/common -I$(top_srcdir)/intl \ +AM_CPPFLAGS = -I$(top_srcdir)/gl -I$(top_srcdir)/common -I$(top_srcdir)/intl \ $(LIBGCRYPT_CFLAGS) $(KSBA_CFLAGS) noinst_LIBRARIES = libkeybox.a @@ -37,16 +38,15 @@ common_sources = \ keybox-file.c \ keybox-search.c \ keybox-update.c \ + keybox-openpgp.c \ keybox-dump.c libkeybox_a_SOURCES = $(common_sources) +# Note that libcommon is only required to resolve the LIBOBJS. kbxutil_SOURCES = kbxutil.c $(common_sources) -kbxutil_LDADD = ../jnlib/libjnlib.a $(KSBA_LIBS) $(LIBGCRYPT_LIBS) \ - -lgpg-error @INTLLIBS@ - - - - +kbxutil_LDADD = ../jnlib/libjnlib.a ../gl/libgnu.a \ + $(KSBA_LIBS) $(LIBGCRYPT_LIBS) \ + -lgpg-error $(LIBINTL) ../common/libcommon.a diff --git a/kbx/Manifest b/kbx/Manifest new file mode 100644 index 000000000..95f48d73f --- /dev/null +++ b/kbx/Manifest @@ -0,0 +1,8 @@ + +keybox-update.c +keybox-file.c + + + + +$names$ diff --git a/kbx/kbxutil.c b/kbx/kbxutil.c index abca4faa9..19d356007 100644 --- a/kbx/kbxutil.c +++ b/kbx/kbxutil.c @@ -1,5 +1,5 @@ /* kbxutil.c - The Keybox utility - * Copyright (C) 2000, 2001 Free Software Foundation, Inc. + * Copyright (C) 2000, 2001, 2004 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -15,7 +15,8 @@ * * You 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 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. */ #include <config.h> @@ -24,11 +25,15 @@ #include <stdlib.h> #include <string.h> #include <ctype.h> +#include <sys/stat.h> #include <unistd.h> +#include <assert.h> +#define JNLIB_NEED_LOG_LOGV #include "../jnlib/logging.h" #include "../jnlib/argparse.h" #include "../jnlib/stringhelp.h" +#include "../jnlib/utf8conv.h" #include "../common/i18n.h" #include "keybox-defs.h" @@ -47,6 +52,8 @@ enum cmd_and_opt_values { aFindByFpr, aFindByKid, aFindByUid, + aStats, + aImportOpenPGP, oDebug, oDebugAll, @@ -61,15 +68,17 @@ enum cmd_and_opt_values { static ARGPARSE_OPTS opts[] = { { 300, NULL, 0, N_("@Commands:\n ") }, - { aFindByFpr, "find-by-fpr", 0, "|FPR| find key using it's fingerprnt" }, - { aFindByKid, "find-by-kid", 0, "|KID| find key using it's keyid" }, - { aFindByUid, "find-by-uid", 0, "|NAME| find key by user name" }, +/* { aFindByFpr, "find-by-fpr", 0, "|FPR| find key using it's fingerprnt" }, */ +/* { aFindByKid, "find-by-kid", 0, "|KID| find key using it's keyid" }, */ +/* { aFindByUid, "find-by-uid", 0, "|NAME| find key by user name" }, */ + { aStats, "stats", 0, "show key statistics" }, + { aImportOpenPGP, "import-openpgp", 0, "import OpenPGP keyblocks"}, { 301, NULL, 0, N_("@\nOptions:\n ") }, - { oArmor, "armor", 0, N_("create ascii armored output")}, - { oArmor, "armour", 0, "@" }, - { oOutput, "output", 2, N_("use as output file")}, +/* { oArmor, "armor", 0, N_("create ascii armored output")}, */ +/* { oArmor, "armour", 0, "@" }, */ +/* { oOutput, "output", 2, N_("use as output file")}, */ { oVerbose, "verbose", 0, N_("verbose") }, { oQuiet, "quiet", 0, N_("be somewhat more quiet") }, { oDryRun, "dry-run", 0, N_("do not make any changes") }, @@ -117,22 +126,37 @@ my_strusage( int level ) static void i18n_init(void) { - #ifdef USE_SIMPLE_GETTEXT - set_gettext_file( PACKAGE ); - #else - #ifdef ENABLE_NLS - #ifdef HAVE_LC_MESSAGES - setlocale( LC_TIME, "" ); - setlocale( LC_MESSAGES, "" ); - #else - setlocale( LC_ALL, "" ); - #endif - bindtextdomain( PACKAGE, LOCALEDIR ); - textdomain( PACKAGE ); - #endif - #endif +#ifdef USE_SIMPLE_GETTEXT + set_gettext_file( PACKAGE_GT ); +#else +#ifdef ENABLE_NLS + setlocale( LC_ALL, "" ); + bindtextdomain( PACKAGE_GT, LOCALEDIR ); + textdomain( PACKAGE_GT ); +#endif +#endif } +/* Used by gcry for logging */ +static void +my_gcry_logger (void *dummy, int level, const char *fmt, va_list arg_ptr) +{ + /* Map the log levels. */ + switch (level) + { + case GCRY_LOG_CONT: level = JNLIB_LOG_CONT; break; + case GCRY_LOG_INFO: level = JNLIB_LOG_INFO; break; + case GCRY_LOG_WARN: level = JNLIB_LOG_WARN; break; + case GCRY_LOG_ERROR:level = JNLIB_LOG_ERROR; break; + case GCRY_LOG_FATAL:level = JNLIB_LOG_FATAL; break; + case GCRY_LOG_BUG: level = JNLIB_LOG_BUG; break; + case GCRY_LOG_DEBUG:level = JNLIB_LOG_DEBUG; break; + default: level = JNLIB_LOG_ERROR; break; + } + log_logv (level, fmt, arg_ptr); +} + + /* static void */ /* wrong_args( const char *text ) */ @@ -213,6 +237,181 @@ format_keyid ( const char *s, u32 *kid ) } #endif +static char * +read_file (const char *fname, size_t *r_length) +{ + FILE *fp; + char *buf; + size_t buflen; + + if (!strcmp (fname, "-")) + { + size_t nread, bufsize = 0; + + fp = stdin; + buf = NULL; + buflen = 0; +#define NCHUNK 8192 + do + { + bufsize += NCHUNK; + if (!buf) + buf = xtrymalloc (bufsize); + else + buf = xtryrealloc (buf, bufsize); + if (!buf) + log_fatal ("can't allocate buffer: %s\n", strerror (errno)); + + nread = fread (buf+buflen, 1, NCHUNK, fp); + if (nread < NCHUNK && ferror (fp)) + { + log_error ("error reading `[stdin]': %s\n", strerror (errno)); + xfree (buf); + return NULL; + } + buflen += nread; + } + while (nread == NCHUNK); +#undef NCHUNK + + } + else + { + struct stat st; + + fp = fopen (fname, "rb"); + if (!fp) + { + log_error ("can't open `%s': %s\n", fname, strerror (errno)); + return NULL; + } + + if (fstat (fileno(fp), &st)) + { + log_error ("can't stat `%s': %s\n", fname, strerror (errno)); + fclose (fp); + return NULL; + } + + buflen = st.st_size; + buf = xtrymalloc (buflen+1); + if (!buf) + log_fatal ("can't allocate buffer: %s\n", strerror (errno)); + if (fread (buf, buflen, 1, fp) != 1) + { + log_error ("error reading `%s': %s\n", fname, strerror (errno)); + fclose (fp); + xfree (buf); + return NULL; + } + fclose (fp); + } + + *r_length = buflen; + return buf; +} + + +static void +dump_fpr (const unsigned char *buffer, size_t len) +{ + int i; + + for (i=0; i < len; i++, buffer++) + { + if (len == 20) + { + if (i == 10) + putchar (' '); + printf (" %02X%02X", buffer[0], buffer[1]); + i++; buffer++; + } + else + { + if (i && !(i % 8)) + putchar (' '); + printf (" %02X", buffer[0]); + } + } +} + + +static void +dump_openpgp_key (keybox_openpgp_info_t info, const unsigned char *image) +{ + printf ("pub %02X%02X%02X%02X", + info->primary.keyid[4], info->primary.keyid[5], + info->primary.keyid[6], info->primary.keyid[7] ); + dump_fpr (info->primary.fpr, info->primary.fprlen); + putchar ('\n'); + if (info->nsubkeys) + { + struct _keybox_openpgp_key_info *k; + + k = &info->subkeys; + do + { + printf ("sub %02X%02X%02X%02X", + k->keyid[4], k->keyid[5], + k->keyid[6], k->keyid[7] ); + dump_fpr (k->fpr, k->fprlen); + putchar ('\n'); + k = k->next; + } + while (k); + } + if (info->nuids) + { + struct _keybox_openpgp_uid_info *u; + + u = &info->uids; + do + { + printf ("uid\t\t%.*s\n", u->len, image + u->off); + u = u->next; + } + while (u); + } +} + + +static void +import_openpgp (const char *filename) +{ + gpg_error_t err; + char *buffer; + size_t buflen, nparsed; + unsigned char *p; + struct _keybox_openpgp_info info; + + buffer = read_file (filename, &buflen); + if (!buffer) + return; + p = (unsigned char *)buffer; + for (;;) + { + err = _keybox_parse_openpgp (p, buflen, &nparsed, &info); + assert (nparsed <= buflen); + if (err) + { + if (gpg_err_code (err) == GPG_ERR_NO_DATA) + break; + log_info ("%s: failed to parse OpenPGP keyblock: %s\n", + filename, gpg_strerror (err)); + } + else + { + dump_openpgp_key (&info, p); + _keybox_destroy_openpgp_info (&info); + } + p += nparsed; + buflen -= nparsed; + } + xfree (buffer); +} + + + int main( int argc, char **argv ) @@ -221,19 +420,22 @@ main( int argc, char **argv ) enum cmd_and_opt_values cmd = 0; set_strusage( my_strusage ); - /*log_set_name("kbxutil"); fixme */ -#if 0 - /* check that the libraries are suitable. Do it here because - * the option parse may need services of the library */ - if ( !gcry_check_version ( "1.1.4" ) ) + gcry_control (GCRYCTL_DISABLE_SECMEM); + log_set_prefix ("kbxutil", 1); + set_native_charset (NULL); + i18n_init (); + + /* Check that the libraries are suitable. Do it here because + the option parsing may need services of the library. */ + if (!gcry_check_version (NEED_LIBGCRYPT_VERSION) ) { - log_fatal(_("libgcrypt is too old (need %s, have %s)\n"), - "1.1.4", gcry_check_version(NULL) ); + log_fatal( _("libgcrypt is too old (need %s, have %s)\n"), + NEED_LIBGCRYPT_VERSION, gcry_check_version (NULL) ); } -#endif + + gcry_set_log_handler (my_gcry_logger, NULL); /*create_dotlock(NULL); register locking cleanup */ - i18n_init(); /* We need to use the gcry malloc function because jnlib does use them */ keybox_set_malloc_hooks (gcry_malloc, gcry_realloc, gcry_free); @@ -261,9 +463,11 @@ main( int argc, char **argv ) case aFindByFpr: case aFindByKid: case aFindByUid: + case aStats: + case aImportOpenPGP: cmd = pargs.r_opt; break; - + default: pargs.err = 2; break; @@ -273,52 +477,77 @@ main( int argc, char **argv ) myexit(2); if (!cmd) - { /* default is to list a KBX file */ - if (!argc) - _keybox_dump_file (NULL, stdout); - else - { - for (; argc; argc--, argv++) - _keybox_dump_file (*argv, stdout); - } + { /* Default is to list a KBX file */ + if (!argc) + _keybox_dump_file (NULL, 0, stdout); + else + { + for (; argc; argc--, argv++) + _keybox_dump_file (*argv, 0, stdout); + } + } + else if (cmd == aStats ) + { + if (!argc) + _keybox_dump_file (NULL, 1, stdout); + else + { + for (; argc; argc--, argv++) + _keybox_dump_file (*argv, 1, stdout); + } + } + else if (cmd == aImportOpenPGP) + { + if (!argc) + import_openpgp ("-"); + else + { + for (; argc; argc--, argv++) + import_openpgp (*argv); + } } #if 0 - else if ( cmd == aFindByFpr ) { - char *fpr; - if ( argc != 2 ) - wrong_args ("kbxfile foingerprint"); - fpr = format_fingerprint ( argv[1] ); - if ( !fpr ) - log_error ("invalid formatted fingerprint\n"); - else { - kbxfile_search_by_fpr ( argv[0], fpr ); - gcry_free ( fpr ); + else if ( cmd == aFindByFpr ) + { + char *fpr; + if ( argc != 2 ) + wrong_args ("kbxfile foingerprint"); + fpr = format_fingerprint ( argv[1] ); + if ( !fpr ) + log_error ("invalid formatted fingerprint\n"); + else + { + kbxfile_search_by_fpr ( argv[0], fpr ); + gcry_free ( fpr ); + } + } + else if ( cmd == aFindByKid ) + { + u32 kid[2]; + int mode; + + if ( argc != 2 ) + wrong_args ("kbxfile short-or-long-keyid"); + mode = format_keyid ( argv[1], kid ); + if ( !mode ) + log_error ("invalid formatted keyID\n"); + else + { + kbxfile_search_by_kid ( argv[0], kid, mode ); } } - else if ( cmd == aFindByKid ) { - u32 kid[2]; - int mode; - - if ( argc != 2 ) - wrong_args ("kbxfile short-or-long-keyid"); - mode = format_keyid ( argv[1], kid ); - if ( !mode ) - log_error ("invalid formatted keyID\n"); - else { - kbxfile_search_by_kid ( argv[0], kid, mode ); - } - } - else if ( cmd == aFindByUid ) { - if ( argc != 2 ) - wrong_args ("kbxfile userID"); - kbxfile_search_by_uid ( argv[0], argv[1] ); + else if ( cmd == aFindByUid ) + { + if ( argc != 2 ) + wrong_args ("kbxfile userID"); + kbxfile_search_by_uid ( argv[0], argv[1] ); } #endif - else - log_error ("unsupported action\n"); - - myexit(0); - return 8; /*NEVER REACHED*/ + else + log_error ("unsupported action\n"); + + myexit(0); + return 8; /*NEVER REACHED*/ } diff --git a/kbx/keybox-blob.c b/kbx/keybox-blob.c index 8a85e0270..f3fe31617 100644 --- a/kbx/keybox-blob.c +++ b/kbx/keybox-blob.c @@ -15,7 +15,8 @@ * * You 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 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. */ @@ -35,11 +36,13 @@ The first record of a plain KBX file has a special format: byte reserved byte reserved u32 magic 'KBXf' - byte pgp_marginals used for validity calculation of this file - byte pgp_completes ditto. - byte pgp_cert_depth ditto. + u32 reserved + u32 file_created_at + u32 last_maintenance_run + u32 reserved + u32 reserved -The OpenPGP and X.509 blob are verry similiar, things which are +The OpenPGP and X.509 blob are very similiar, things which are X.509 specific are noted like [X.509: xxx] u32 length of this blob (including these 4 bytes) @@ -59,7 +62,7 @@ X.509 specific are noted like [X.509: xxx] u32 offset to the n-th key's keyID (a keyID is always 8 byte) or 0 if not known which is the case only for X509. u16 special key flags - bit 0 = + bit 0 = qualified signature (not yet implemented} u16 reserved u16 size of serialnumber(may be zero) n u16 (see above) bytes of serial number @@ -72,7 +75,7 @@ X.509 specific are noted like [X.509: xxx] bit 0 = byte validity byte reserved - [For X509, the first user ID is the issuer, the second the subject + [For X509, the first user ID is the Issuer, the second the Subject and the others are subjectAltNames] u16 number of signatures u16 size of signature information (4) @@ -82,8 +85,11 @@ X.509 specific are noted like [X.509: xxx] 0x00000002 = bad signature 0x10000000 = valid and expires at some date in 1978. 0xffffffff = valid and does not expire - u8 assigned ownertrust [X509: no used] - u8 all_validity [X509: no used] + u8 assigned ownertrust [X509: not used] + u8 all_validity + OpenPGP: see ../g10/trustdb/TRUST_* [not yet used] + X509: Bit 4 set := key has been revoked. Note that this value + matches TRUST_FLAG_REVOKED u16 reserved u32 recheck_after u32 Newest timestamp in the keyblock (useful for KS syncronsiation?) @@ -99,7 +105,7 @@ X.509 specific are noted like [X.509: xxx] b16 MD5 checksum (useful for KS syncronisation), we might also want to use a mac here. - b4 reserved + b4 resevered */ @@ -110,6 +116,7 @@ X.509 specific are noted like [X.509: xxx] #include <string.h> #include <errno.h> #include <assert.h> +#include <time.h> #include "keybox-defs.h" #include <gcrypt.h> @@ -194,7 +201,7 @@ struct keyboxblob { -/* A simple implemnation of a dynamic buffer. Use init_membuf() to +/* A simple implemention 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 @@ -478,7 +485,7 @@ pgp_create_blob_keyblock (KEYBOXBLOB blob, KBNODE keyblock) /* Write the raw certificate out */ static int -x509_create_blob_cert (KEYBOXBLOB blob, KsbaCert cert) +x509_create_blob_cert (KEYBOXBLOB blob, ksba_cert_t cert) { struct membuf *a = blob->buf; const unsigned char *image; @@ -640,8 +647,8 @@ static int create_blob_finish (KEYBOXBLOB blob) { struct membuf *a = blob->buf; - byte *p; - char *pp; + unsigned char *p; + unsigned char *pp; int i; size_t n; @@ -650,6 +657,7 @@ create_blob_finish (KEYBOXBLOB blob) put32 (a, 0); /* Hmmm: why put32() ?? */ /* get the memory area */ + n = 0; /* (Just to avoid compiler warning.) */ p = get_membuf (a, &n); if (!p) return gpg_error (GPG_ERR_ENOMEM); @@ -777,7 +785,7 @@ _keybox_create_pgp_blob (KEYBOXBLOB *r_blob, KBNODE keyblock, int as_ephemeral) static char * x509_email_kludge (const char *name) { - const unsigned char *p; + const char *p; unsigned char *buf; int n; @@ -799,7 +807,7 @@ x509_email_kludge (const char *name) buf[n] = xtoi_2 (p); buf[n++] = '>'; buf[n] = 0; - return buf; + return (char *)buf; } @@ -807,13 +815,14 @@ x509_email_kludge (const char *name) /* Note: We should move calculation of the digest into libksba and remove that parameter */ int -_keybox_create_x509_blob (KEYBOXBLOB *r_blob, KsbaCert cert, +_keybox_create_x509_blob (KEYBOXBLOB *r_blob, ksba_cert_t cert, unsigned char *sha1_digest, int as_ephemeral) { int i, rc = 0; KEYBOXBLOB blob; - unsigned char *p; - unsigned char **names = NULL; + unsigned char *sn; + char *p; + char **names = NULL; size_t max_names; *r_blob = NULL; @@ -821,28 +830,28 @@ _keybox_create_x509_blob (KEYBOXBLOB *r_blob, KsbaCert cert, if( !blob ) return gpg_error (gpg_err_code_from_errno (errno)); - p = ksba_cert_get_serial (cert); - if (p) + sn = ksba_cert_get_serial (cert); + if (sn) { size_t n, len; - n = gcry_sexp_canon_len (p, 0, NULL, NULL); + n = gcry_sexp_canon_len (sn, 0, NULL, NULL); if (n < 2) { - xfree (p); + xfree (sn); return gpg_error (GPG_ERR_GENERAL); } - blob->serialbuf = p; - p++; n--; /* skip '(' */ - for (len=0; n && *p && *p != ':' && digitp (p); n--, p++) - len = len*10 + atoi_1 (p); - if (*p != ':') + blob->serialbuf = sn; + sn++; n--; /* skip '(' */ + for (len=0; n && *sn && *sn != ':' && digitp (sn); n--, sn++) + len = len*10 + atoi_1 (sn); + if (*sn != ':') { xfree (blob->serialbuf); blob->serialbuf = NULL; return gpg_error (GPG_ERR_GENERAL); } - p++; - blob->serial = p; + sn++; + blob->serial = sn; blob->seriallen = len; } @@ -857,6 +866,7 @@ _keybox_create_x509_blob (KEYBOXBLOB *r_blob, KsbaCert cert, rc = gpg_error (gpg_err_code_from_errno (errno)); goto leave; } + p = ksba_cert_get_issuer (cert, 0); if (!p) { @@ -866,10 +876,9 @@ _keybox_create_x509_blob (KEYBOXBLOB *r_blob, KsbaCert cert, names[blob->nuids++] = p; for (i=0; (p = ksba_cert_get_subject (cert, i)); i++) { - if (blob->nuids >= max_names) { - unsigned char **tmp; + char **tmp; max_names += 100; tmp = xtryrealloc (names, max_names * sizeof *names); @@ -958,7 +967,8 @@ _keybox_create_x509_blob (KEYBOXBLOB *r_blob, KsbaCert cert, int -_keybox_new_blob (KEYBOXBLOB *r_blob, char *image, size_t imagelen, off_t off) +_keybox_new_blob (KEYBOXBLOB *r_blob, + unsigned char *image, size_t imagelen, off_t off) { KEYBOXBLOB blob; @@ -974,6 +984,7 @@ _keybox_new_blob (KEYBOXBLOB *r_blob, char *image, size_t imagelen, off_t off) return 0; } + void _keybox_release_blob (KEYBOXBLOB blob) { @@ -993,7 +1004,7 @@ _keybox_release_blob (KEYBOXBLOB blob) -const char * +const unsigned char * _keybox_get_blob_image ( KEYBOXBLOB blob, size_t *n ) { *n = blob->bloblen; @@ -1006,3 +1017,19 @@ _keybox_get_blob_fileoffset (KEYBOXBLOB blob) return blob->fileoffset; } + + +void +_keybox_update_header_blob (KEYBOXBLOB blob) +{ + if (blob->bloblen >= 32 && blob->blob[4] == BLOBTYPE_HEADER) + { + u32 val = make_timestamp (); + + /* Update the last maintenance run times tamp. */ + blob->blob[20] = (val >> 24); + blob->blob[20+1] = (val >> 16); + blob->blob[20+2] = (val >> 8); + blob->blob[20+3] = (val ); + } +} diff --git a/kbx/keybox-defs.h b/kbx/keybox-defs.h index e4578d76b..ad53c71a7 100644 --- a/kbx/keybox-defs.h +++ b/kbx/keybox-defs.h @@ -1,5 +1,5 @@ /* keybox-defs.h - interal Keybox defintions - * Copyright (C) 2001 Free Software Foundation, Inc. + * Copyright (C) 2001, 2004 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -15,31 +15,33 @@ * * You 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 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. */ #ifndef KEYBOX_DEFS_H #define KEYBOX_DEFS_H 1 -#include <sys/types.h> /* off_t */ -#include "keybox.h" - #ifdef GPG_ERR_SOURCE_DEFAULT #error GPG_ERR_SOURCE_DEFAULT already defined #endif #define GPG_ERR_SOURCE_DEFAULT GPG_ERR_SOURCE_KEYBOX #include <gpg-error.h> +#define map_assuan_err(a) \ + map_assuan_err_with_source (GPG_ERR_SOURCE_DEFAULT, (a)) +#include <sys/types.h> /* off_t */ + +/* We include the type defintions from jnlib instead of defining our + owns here. This will not allow us build KBX in a standalone way + but there is currently no need for it anyway. Same goes for + stringhelp.h which for example provides a replacement for stpcpy - + fixme: Better the LIBOBJ mechnism. */ +#include "../jnlib/types.h" +#include "../jnlib/stringhelp.h" + +#include "keybox.h" -#ifndef HAVE_BYTE_TYPEDEF -typedef unsigned char byte; /* fixme */ -#endif -#ifndef HAVE_U16_TYPEDEF -typedef unsigned short u16; /* fixme */ -#endif -#ifndef HAVE_U32_TYPEDEF -typedef unsigned int u32; /* fixme */ -#endif enum { BLOBTYPE_EMPTY = 0, @@ -86,6 +88,40 @@ struct keybox_handle { }; +/* Openpgp helper structures. */ +struct _keybox_openpgp_key_info +{ + struct _keybox_openpgp_key_info *next; + unsigned char keyid[8]; + int fprlen; /* Either 16 or 20 */ + unsigned char fpr[20]; +}; + +struct _keybox_openpgp_uid_info +{ + struct _keybox_openpgp_uid_info *next; + size_t off; + size_t len; +}; + +struct _keybox_openpgp_info +{ + int is_secret; /* True if this is a secret key. */ + unsigned int nsubkeys;/* Total number of subkeys. */ + unsigned int nuids; /* Total number of user IDs in the keyblock. */ + unsigned int nsigs; /* Total number of signatures in the keyblock. */ + + /* Note, we use 2 structs here to better cope with the most common + use of having one primary and one subkey - this allows us to + statically allocate this structure and only malloc stuff for more + than one subkey. */ + struct _keybox_openpgp_key_info primary; + struct _keybox_openpgp_key_info subkeys; + struct _keybox_openpgp_uid_info uids; +}; +typedef struct _keybox_openpgp_info *keybox_openpgp_info_t; + + /* Don't know whether this is needed: */ /* static struct { */ /* const char *homedir; */ @@ -101,23 +137,40 @@ struct keybox_handle { /* fixme */ #endif /*KEYBOX_WITH_OPENPGP*/ #ifdef KEYBOX_WITH_X509 -int _keybox_create_x509_blob (KEYBOXBLOB *r_blob, KsbaCert cert, +int _keybox_create_x509_blob (KEYBOXBLOB *r_blob, ksba_cert_t cert, unsigned char *sha1_digest, int as_ephemeral); #endif /*KEYBOX_WITH_X509*/ -int _keybox_new_blob (KEYBOXBLOB *r_blob, char *image, size_t imagelen, +int _keybox_new_blob (KEYBOXBLOB *r_blob, + unsigned char *image, size_t imagelen, off_t off); void _keybox_release_blob (KEYBOXBLOB blob); -const char *_keybox_get_blob_image (KEYBOXBLOB blob, size_t *n); +const unsigned char *_keybox_get_blob_image (KEYBOXBLOB blob, size_t *n); off_t _keybox_get_blob_fileoffset (KEYBOXBLOB blob); +void _keybox_update_header_blob (KEYBOXBLOB blob); + +/*-- keybox-openpgp.c --*/ +gpg_error_t _keybox_parse_openpgp (const unsigned char *image, size_t imagelen, + size_t *nparsed, + keybox_openpgp_info_t info); +void _keybox_destroy_openpgp_info (keybox_openpgp_info_t info); + /*-- keybox-file.c --*/ int _keybox_read_blob (KEYBOXBLOB *r_blob, FILE *fp); +int _keybox_read_blob2 (KEYBOXBLOB *r_blob, FILE *fp, int *skipped_deleted); int _keybox_write_blob (KEYBOXBLOB blob, FILE *fp); +int _keybox_write_header_blob (FILE *fp); + +/*-- keybox-search.c --*/ +gpg_err_code_t _keybox_get_flag_location (const unsigned char *buffer, + size_t length, + int what, + size_t *flag_off, size_t *flag_size); /*-- keybox-dump.c --*/ int _keybox_dump_blob (KEYBOXBLOB blob, FILE *fp); -int _keybox_dump_file (const char *filename, FILE *outfp); +int _keybox_dump_file (const char *filename, int stats_only, FILE *outfp); /*-- keybox-util.c --*/ diff --git a/kbx/keybox-dump.c b/kbx/keybox-dump.c index 2177bedae..d28611377 100644 --- a/kbx/keybox-dump.c +++ b/kbx/keybox-dump.c @@ -15,7 +15,8 @@ * * You 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 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. */ #include <config.h> @@ -78,9 +79,22 @@ print_string (FILE *fp, const byte *p, size_t n, int delim) static int dump_header_blob (const byte *buffer, size_t length, FILE *fp) { + unsigned long n; + + if (length < 32) + { + fprintf (fp, "[blob too short]\n"); + return -1; + } fprintf (fp, "Version: %d\n", buffer[5]); if ( memcmp (buffer+8, "KBXf", 4)) fprintf (fp, "[Error: invalid magic number]\n"); + + n = get32 (buffer+16); + fprintf( fp, "created-at: %lu\n", n ); + n = get32 (buffer+20); + fprintf( fp, "last-maint: %lu\n", n ); + return 0; } @@ -101,7 +115,7 @@ _keybox_dump_blob (KEYBOXBLOB blob, FILE *fp) buffer = _keybox_get_blob_image (blob, &length); - if (length < 40) + if (length < 32) { fprintf (fp, "[blob too short]\n"); return -1; @@ -136,6 +150,12 @@ _keybox_dump_blob (KEYBOXBLOB blob, FILE *fp) return 0; } fprintf (fp, "Version: %d\n", buffer[5]); + + if (length < 40) + { + fprintf (fp, "[blob too short]\n"); + return -1; + } n = get16 (buffer + 6); fprintf( fp, "Blob-Flags: %04lX", n); @@ -290,11 +310,11 @@ _keybox_dump_blob (KEYBOXBLOB blob, FILE *fp) fprintf (fp, "All-Validity: %d\n", p[1] ); p += 4; n = get32 (p); p += 4; - fprintf (fp, "Recheck-After: %s\n", /*n? strtimestamp(n) :*/ "0" ); + fprintf (fp, "Recheck-After: %lu\n", n ); n = get32 (p ); p += 4; - fprintf( fp, "Latest-Timestamp: %s\n", "0"/*strtimestamp(n)*/ ); + fprintf( fp, "Latest-Timestamp: %lu\n", n ); n = get32 (p ); p += 4; - fprintf (fp, "Created-At: %s\n", "0"/*strtimestamp(n)*/ ); + fprintf (fp, "Created-At: %lu\n", n ); n = get32 (p ); p += 4; fprintf (fp, "Reserved-Space: %lu\n", n ); @@ -304,14 +324,95 @@ _keybox_dump_blob (KEYBOXBLOB blob, FILE *fp) } +struct file_stats_s +{ + unsigned long too_short_blobs; + unsigned long too_large_blobs; + unsigned long total_blob_count; + unsigned long empty_blob_count; + unsigned long header_blob_count; + unsigned long pgp_blob_count; + unsigned long x509_blob_count; + unsigned long unknown_blob_count; + unsigned long non_flagged; + unsigned long secret_flagged; + unsigned long ephemeral_flagged; +}; + +static int +update_stats (KEYBOXBLOB blob, struct file_stats_s *s) +{ + const unsigned char *buffer; + size_t length; + int type; + unsigned long n; + + buffer = _keybox_get_blob_image (blob, &length); + if (length < 32) + { + s->too_short_blobs++; + return -1; + } + + n = get32( buffer ); + if (n > length) + s->too_large_blobs++; + else + length = n; /* ignore the rest */ + + s->total_blob_count++; + type = buffer[4]; + switch (type) + { + case BLOBTYPE_EMPTY: + s->empty_blob_count++; + return 0; + case BLOBTYPE_HEADER: + s->header_blob_count++; + return 0; + case BLOBTYPE_PGP: + s->pgp_blob_count++; + break; + case BLOBTYPE_X509: + s->x509_blob_count++; + break; + default: + s->unknown_blob_count++; + return 0; + } + + if (length < 40) + { + s->too_short_blobs++; + return -1; + } + + n = get16 (buffer + 6); + if (n) + { + if ((n & 1)) + s->secret_flagged++; + if ((n & 2)) + s->ephemeral_flagged++; + } + else + s->non_flagged++; + + return 0; +} + + int -_keybox_dump_file (const char *filename, FILE *outfp) +_keybox_dump_file (const char *filename, int stats_only, FILE *outfp) { FILE *fp; KEYBOXBLOB blob; int rc; unsigned long count = 0; + struct file_stats_s stats; + + memset (&stats, 0, sizeof stats); if (!filename) { @@ -329,10 +430,17 @@ _keybox_dump_file (const char *filename, FILE *outfp) while ( !(rc = _keybox_read_blob (&blob, fp)) ) { - fprintf (outfp, "BEGIN-RECORD: %lu\n", count ); - _keybox_dump_blob (blob, outfp); + if (stats_only) + { + update_stats (blob, &stats); + } + else + { + fprintf (outfp, "BEGIN-RECORD: %lu\n", count ); + _keybox_dump_blob (blob, outfp); + fprintf (outfp, "END-RECORD\n"); + } _keybox_release_blob (blob); - fprintf (outfp, "END-RECORD\n"); count++; } if (rc == -1) @@ -342,5 +450,36 @@ _keybox_dump_file (const char *filename, FILE *outfp) if (fp != stdin) fclose (fp); + + if (stats_only) + { + fprintf (outfp, + "Total number of blobs: %8lu\n" + " header: %8lu\n" + " empty: %8lu\n" + " openpgp: %8lu\n" + " x509: %8lu\n" + " non flagged: %8lu\n" + " secret flagged: %8lu\n" + " ephemeral flagged: %8lu\n", + stats.total_blob_count, + stats.header_blob_count, + stats.empty_blob_count, + stats.pgp_blob_count, + stats.x509_blob_count, + stats.non_flagged, + stats.secret_flagged, + stats.ephemeral_flagged); + if (stats.unknown_blob_count) + fprintf (outfp, " unknown blob types: %8lu\n", + stats.unknown_blob_count); + if (stats.too_short_blobs) + fprintf (outfp, " too short blobs: %8lu\n", + stats.too_short_blobs); + if (stats.too_large_blobs) + fprintf (outfp, " too large blobs: %8lu\n", + stats.too_large_blobs); + } + return rc; } diff --git a/kbx/keybox-file.c b/kbx/keybox-file.c index fc9321478..e68e96cf9 100644 --- a/kbx/keybox-file.c +++ b/kbx/keybox-file.c @@ -15,7 +15,8 @@ * * You 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 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. */ #include <config.h> @@ -23,20 +24,38 @@ #include <stdio.h> #include <string.h> #include <errno.h> +#include <time.h> #include "keybox-defs.h" + +#if !defined(HAVE_FTELLO) && !defined(ftello) +static off_t +ftello (FILE *stream) +{ + long int off; + + off = ftell (stream); + if (off == -1) + return (off_t)-1; + return off; +} +#endif /* !defined(HAVE_FTELLO) && !defined(ftello) */ + + + /* Read a block at the current postion and return it in r_blob. r_blob may be NULL to simply skip the current block */ int -_keybox_read_blob (KEYBOXBLOB *r_blob, FILE *fp) +_keybox_read_blob2 (KEYBOXBLOB *r_blob, FILE *fp, int *skipped_deleted) { - char *image; + unsigned char *image; size_t imagelen = 0; int c1, c2, c3, c4, type; int rc; off_t off; + *skipped_deleted = 0; again: *r_blob = NULL; off = ftello (fp); @@ -55,7 +74,7 @@ _keybox_read_blob (KEYBOXBLOB *r_blob, FILE *fp) } imagelen = (c1 << 24) | (c2 << 16) | (c3 << 8 ) | c4; - if (imagelen > 500000) /* sanity check */ + if (imagelen > 500000) /* Sanity check. */ return gpg_error (GPG_ERR_TOO_LARGE); if (imagelen < 5) @@ -63,9 +82,10 @@ _keybox_read_blob (KEYBOXBLOB *r_blob, FILE *fp) if (!type) { - /* special treatment for empty blobs. */ + /* Special treatment for empty blobs. */ if (fseek (fp, imagelen-5, SEEK_CUR)) return gpg_error (gpg_err_code_from_errno (errno)); + *skipped_deleted = 1; goto again; } @@ -87,12 +107,19 @@ _keybox_read_blob (KEYBOXBLOB *r_blob, FILE *fp) return rc; } +int +_keybox_read_blob (KEYBOXBLOB *r_blob, FILE *fp) +{ + int dummy; + return _keybox_read_blob2 (r_blob, fp, &dummy); +} + /* Write the block to the current file position */ int _keybox_write_blob (KEYBOXBLOB blob, FILE *fp) { - const char *image; + const unsigned char *image; size_t length; image = _keybox_get_blob_image (blob, &length); @@ -100,3 +127,37 @@ _keybox_write_blob (KEYBOXBLOB blob, FILE *fp) return gpg_error (gpg_err_code_from_errno (errno)); return 0; } + + +/* Write a fresh header type blob. */ +int +_keybox_write_header_blob (FILE *fp) +{ + unsigned char image[32]; + u32 val; + + memset (image, 0, sizeof image); + /* Length of this blob. */ + image[3] = 32; + + image[4] = BLOBTYPE_HEADER; + image[5] = 1; /* Version */ + + memcpy (image+8, "KBXf", 4); + val = time (NULL); + /* created_at and last maintenance run. */ + image[16] = (val >> 24); + image[16+1] = (val >> 16); + image[16+2] = (val >> 8); + image[16+3] = (val ); + image[20] = (val >> 24); + image[20+1] = (val >> 16); + image[20+2] = (val >> 8); + image[20+3] = (val ); + + if (fwrite (image, 32, 1, fp) != 1) + return gpg_error (gpg_err_code_from_errno (errno)); + return 0; +} + + diff --git a/kbx/keybox-init.c b/kbx/keybox-init.c index e11c4f09c..6c01b4f3a 100644 --- a/kbx/keybox-init.c +++ b/kbx/keybox-init.c @@ -15,7 +15,8 @@ * * You 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 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. */ #include <config.h> @@ -102,6 +103,11 @@ keybox_release (KEYBOX_HANDLE hd) if (!hd) return; _keybox_release_blob (hd->found.blob); + if (hd->fp) + { + fclose (hd->fp); + hd->fp = NULL; + } xfree (hd->word_match.name); xfree (hd->word_match.pattern); xfree (hd); diff --git a/kbx/keybox-openpgp.c b/kbx/keybox-openpgp.c new file mode 100644 index 000000000..8ac713979 --- /dev/null +++ b/kbx/keybox-openpgp.c @@ -0,0 +1,517 @@ +/* keybox-openpgp.c - OpenPGP key parsing + * 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. + */ + +/* This is a simple OpenPGP parser suitable for all OpenPGP key + material. It just provides the functionality required to build and + parse an KBX OpenPGP key blob. Thus it is not a complete parser. + However it is self-contained and optimized for fast in-memory + parsing. Note that we don't support old ElGamal v3 keys + anymore. */ + +#include <config.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <errno.h> +#include <assert.h> + +#include "keybox-defs.h" + +#include <gcrypt.h> + + +enum packet_types + { + 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 */ + }; + + + +/* Assume a valid OpenPGP packet at the address pointed to by BUFBTR + which is of amaximum length as stored at BUFLEN. Return the header + information of that packet and advance the pointer stored at BUFPTR + to the next packet; also adjust the length stored at BUFLEN to + match the remaining bytes. If there are no more packets, store NULL + at BUFPTR. Return an non-zero error code on failure or the + follwing data on success: + + R_DATAPKT = Pointer to the begin of the packet data. + R_DATALEN = Length of this data. This has already been checked to fit + into the buffer. + R_PKTTYPE = The packet type. + R_NTOTAL = The total number of bytes of this packet + + Note that these values are only updated on success. +*/ +static gpg_error_t +next_packet (unsigned char const **bufptr, size_t *buflen, + unsigned char const **r_data, size_t *r_datalen, int *r_pkttype, + size_t *r_ntotal) +{ + const unsigned char *buf = *bufptr; + size_t len = *buflen; + int c, ctb, pkttype; + unsigned long pktlen; + + if (!len) + return gpg_error (GPG_ERR_NO_DATA); + + ctb = *buf++; len--; + if ( !(ctb & 0x80) ) + return gpg_error (GPG_ERR_INV_PACKET); /* Invalid CTB. */ + + pktlen = 0; + if ((ctb & 0x40)) /* New style (OpenPGP) CTB. */ + { + pkttype = (ctb & 0x3f); + if (!len) + return gpg_error (GPG_ERR_INV_PACKET); /* No 1st length byte. */ + c = *buf++; len--; + if (pkttype == PKT_COMPRESSED) + return gpg_error (GPG_ERR_UNEXPECTED); /* ... packet in a keyblock. */ + if ( c < 192 ) + pktlen = c; + else if ( c < 224 ) + { + pktlen = (c - 192) * 256; + if (!len) + return gpg_error (GPG_ERR_INV_PACKET); /* No 2nd length byte. */ + c = *buf++; len--; + pktlen += c + 192; + } + else if (c == 255) + { + if (len <4 ) + return gpg_error (GPG_ERR_INV_PACKET); /* No length bytes. */ + pktlen = (*buf++) << 24; + pktlen |= (*buf++) << 16; + pktlen |= (*buf++) << 8; + pktlen |= (*buf++); + len -= 4; + } + else /* Partial length encoding is not allowed for key packets. */ + return gpg_error (GPG_ERR_UNEXPECTED); + } + else /* Old style CTB. */ + { + int lenbytes; + + pktlen = 0; + pkttype = (ctb>>2)&0xf; + lenbytes = ((ctb&3)==3)? 0 : (1<<(ctb & 3)); + if (!lenbytes) /* Not allowed in key packets. */ + return gpg_error (GPG_ERR_UNEXPECTED); + if (len < lenbytes) + return gpg_error (GPG_ERR_INV_PACKET); /* Not enough length bytes. */ + for (; lenbytes; lenbytes--) + { + pktlen <<= 8; + pktlen |= *buf++; len--; + } + } + + /* Do some basic sanity check. */ + switch (pkttype) + { + case PKT_SIGNATURE: + case PKT_SECRET_KEY: + case PKT_PUBLIC_KEY: + case PKT_SECRET_SUBKEY: + case PKT_MARKER: + case PKT_RING_TRUST: + case PKT_USER_ID: + case PKT_PUBLIC_SUBKEY: + case PKT_OLD_COMMENT: + case PKT_ATTRIBUTE: + case PKT_COMMENT: + case PKT_GPG_CONTROL: + break; /* Okay these are allowed packets. */ + default: + return gpg_error (GPG_ERR_UNEXPECTED); + } + + if (pktlen == 0xffffffff) + return gpg_error (GPG_ERR_INV_PACKET); + + if (pktlen > len) + return gpg_error (GPG_ERR_INV_PACKET); /* Packet length header too long. */ + + *r_data = buf; + *r_datalen = pktlen; + *r_pkttype = pkttype; + *r_ntotal = (buf - *bufptr) + pktlen; + + *bufptr = buf + pktlen; + *buflen = len - pktlen; + if (!*buflen) + *bufptr = NULL; + + return 0; +} + + +/* Parse a key packet and store the ionformation in KI. */ +static gpg_error_t +parse_key (const unsigned char *data, size_t datalen, + struct _keybox_openpgp_key_info *ki) +{ + gpg_error_t err; + const unsigned char *data_start = data; + int i, version, algorithm; + size_t n; + unsigned long timestamp, expiredate; + int npkey; + unsigned char hashbuffer[768]; + const unsigned char *mpi_n = NULL; + size_t mpi_n_len = 0, mpi_e_len = 0; + gcry_md_hd_t md; + + if (datalen < 5) + return gpg_error (GPG_ERR_INV_PACKET); + version = *data++; datalen--; + if (version < 2 || version > 4 ) + return gpg_error (GPG_ERR_INV_PACKET); /* Invalid version. */ + + timestamp = ((data[0]<<24)|(data[1]<<16)|(data[2]<<8)|(data[3])); + data +=4; datalen -=4; + + if (version < 4) + { + unsigned short ndays; + + if (datalen < 2) + return gpg_error (GPG_ERR_INV_PACKET); + ndays = ((data[0]<<8)|(data[1])); + data +=2; datalen -= 2; + if (ndays) + expiredate = ndays? (timestamp + ndays * 86400L) : 0; + } + else + expiredate = 0; /* This is stored in the self-signature. */ + + if (!datalen) + return gpg_error (GPG_ERR_INV_PACKET); + algorithm = *data++; datalen--; + + switch (algorithm) + { + case 1: + case 2: + case 3: /* RSA */ + npkey = 2; + break; + case 16: + case 20: /* Elgamal */ + npkey = 3; + break; + case 17: /* DSA */ + npkey = 4; + break; + default: /* Unknown algorithm. */ + return gpg_error (GPG_ERR_UNKNOWN_ALGORITHM); + } + + for (i=0; i < npkey; i++ ) + { + unsigned int nbits, nbytes; + + if (datalen < 2) + return gpg_error (GPG_ERR_INV_PACKET); + nbits = ((data[0]<<8)|(data[1])); + data += 2; datalen -=2; + nbytes = (nbits+7) / 8; + if (datalen < nbytes) + return gpg_error (GPG_ERR_INV_PACKET); + /* For use by v3 fingerprint calculation we need to know the RSA + modulus and exponent. */ + if (i==0) + { + mpi_n = data; + mpi_n_len = nbytes; + } + else if (i==1) + mpi_e_len = nbytes; + + data += nbytes; datalen -= nbytes; + } + n = data - data_start; + + if (version < 4) + { + /* We do not support any other algorithm than RSA in v3 + packets. */ + if (algorithm < 1 || algorithm > 3) + return gpg_error (GPG_ERR_UNSUPPORTED_ALGORITHM); + + err = gcry_md_open (&md, GCRY_MD_MD5, 0); + if (err) + return err; /* Oops */ + gcry_md_write (md, mpi_n, mpi_n_len); + gcry_md_write (md, mpi_n+mpi_n_len+2, mpi_e_len); + memcpy (ki->fpr, gcry_md_read (md, 0), 16); + gcry_md_close (md); + ki->fprlen = 16; + + if (mpi_n_len < 8) + { + /* Moduli less than 64 bit are out of the specs scope. Zero + them out becuase this is what gpg does too. */ + memset (ki->keyid, 0, 8); + } + else + memcpy (ki->keyid, mpi_n + mpi_n_len - 8, 8); + } + else + { + /* Its a pitty that we need to prefix the buffer with the tag + and a length header: We can't simply pass it to the fast + hashing fucntion for that reason. It might be a good idea to + have a scatter-gather enabled hash function. What we do here + is to use a static buffer if this one is large enough and + only use the regular hash fucntions if this buffer is not + large enough. */ + if ( 3 + n < sizeof hashbuffer ) + { + hashbuffer[0] = 0x99; /* CTB */ + hashbuffer[1] = (n >> 8); /* 2 byte length header. */ + hashbuffer[2] = n; + memcpy (hashbuffer + 3, data_start, n); + gcry_md_hash_buffer (GCRY_MD_SHA1, ki->fpr, hashbuffer, 3 + n); + } + else + { + err = gcry_md_open (&md, GCRY_MD_SHA1, 0); + if (err) + return err; /* Oops */ + gcry_md_putc (md, 0x99 ); /* CTB */ + gcry_md_putc (md, (n >> 8) ); /* 2 byte length header. */ + gcry_md_putc (md, n ); + gcry_md_write (md, data_start, n); + memcpy (ki->fpr, gcry_md_read (md, 0), 20); + gcry_md_close (md); + } + ki->fprlen = 20; + memcpy (ki->keyid, ki->fpr+12, 8); + } + + return 0; +} + + + +/* The caller must pass the address of an INFO structure which will + get filled on success with information pertaining to the OpenPGP + keyblock IMAGE of length IMAGELEN. Note that a caller does only + need to release this INFO structure when the function returns + success. If NPARSED is not NULL the actual number of bytes parsed + will be stored at this address. */ +gpg_error_t +_keybox_parse_openpgp (const unsigned char *image, size_t imagelen, + size_t *nparsed, + keybox_openpgp_info_t info) +{ + gpg_error_t err = 0; + const unsigned char *image_start, *data; + size_t n, datalen; + int pkttype; + int first = 1; + struct _keybox_openpgp_key_info *k, **ktail = NULL; + struct _keybox_openpgp_uid_info *u, **utail = NULL; + + memset (info, 0, sizeof *info); + if (nparsed) + *nparsed = 0; + + image_start = image; + while (image) + { + err = next_packet (&image, &imagelen, &data, &datalen, &pkttype, &n); + if (err) + break; + + if (first) + { + if (pkttype == PKT_PUBLIC_KEY) + ; + else if (pkttype == PKT_SECRET_KEY) + info->is_secret = 1; + else + { + err = gpg_error (GPG_ERR_UNEXPECTED); + break; + } + first = 0; + } + else if (pkttype == PKT_PUBLIC_KEY || pkttype == PKT_SECRET_KEY) + break; /* Next keyblock encountered - ready. */ + + if (nparsed) + *nparsed += n; + + if (pkttype == PKT_SIGNATURE) + { + /* For now we only count the total number of signatures. */ + info->nsigs++; + } + else if (pkttype == PKT_USER_ID) + { + info->nuids++; + if (info->nuids == 1) + { + info->uids.off = data - image_start; + info->uids.len = datalen; + utail = &info->uids.next; + } + else + { + u = xtrycalloc (1, sizeof *u); + if (!u) + { + err = gpg_error_from_errno (errno); + break; + } + u->off = data - image_start; + u->len = datalen; + *utail = u; + utail = &u->next; + } + } + else if (pkttype == PKT_PUBLIC_KEY || pkttype == PKT_SECRET_KEY) + { + err = parse_key (data, datalen, &info->primary); + if (err) + break; + } + else if( pkttype == PKT_PUBLIC_SUBKEY && datalen && *data == '#' ) + { + /* Early versions of GnuPG used old PGP comment packets; + * luckily all those comments are prefixed by a hash + * sign - ignore these packets. */ + } + else if (pkttype == PKT_PUBLIC_SUBKEY || pkttype == PKT_SECRET_SUBKEY) + { + info->nsubkeys++; + if (info->nsubkeys == 1) + { + err = parse_key (data, datalen, &info->subkeys); + if (err) + { + info->nsubkeys--; + if (gpg_err_code (err) != GPG_ERR_UNKNOWN_ALGORITHM) + break; + /* We ignore subkeys with unknown algorithms. */ + } + else + ktail = &info->subkeys.next; + } + else + { + k = xtrycalloc (1, sizeof *k); + if (!k) + { + err = gpg_error_from_errno (errno); + break; + } + err = parse_key (data, datalen, k); + if (err) + { + xfree (k); + info->nsubkeys--; + if (gpg_err_code (err) != GPG_ERR_UNKNOWN_ALGORITHM) + break; + /* We ignore subkeys with unknown algorithms. */ + } + else + { + *ktail = k; + ktail = &k->next; + } + } + } + } + + if (err) + { + _keybox_destroy_openpgp_info (info); + if (!first + && (gpg_err_code (err) == GPG_ERR_UNSUPPORTED_ALGORITHM + || gpg_err_code (err) == GPG_ERR_UNKNOWN_ALGORITHM)) + { + /* We are able to skip to the end of this keyblock. */ + while (image) + { + if (next_packet (&image, &imagelen, + &data, &datalen, &pkttype, &n) ) + break; /* Another error - stop here. */ + + if (pkttype == PKT_PUBLIC_KEY || pkttype == PKT_SECRET_KEY) + break; /* Next keyblock encountered - ready. */ + + if (nparsed) + *nparsed += n; + } + } + } + + return err; +} + + +/* Release any malloced data in INFO but not INFO itself! */ +void +_keybox_destroy_openpgp_info (keybox_openpgp_info_t info) +{ + struct _keybox_openpgp_key_info *k, *k2; + struct _keybox_openpgp_uid_info *u, *u2; + + assert (!info->primary.next); + for (k=info->subkeys.next; k; k = k2) + { + k2 = k->next; + xfree (k); + } + + for (u=info->uids.next; u; u = u2) + { + u2 = u->next; + xfree (u); + } +} diff --git a/kbx/keybox-search-desc.h b/kbx/keybox-search-desc.h index 4be59c27d..f3a69d0f1 100644 --- a/kbx/keybox-search-desc.h +++ b/kbx/keybox-search-desc.h @@ -15,7 +15,8 @@ * * You 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 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. */ /* diff --git a/kbx/keybox-search.c b/kbx/keybox-search.c index 231a32d42..f95e6eb06 100644 --- a/kbx/keybox-search.c +++ b/kbx/keybox-search.c @@ -1,5 +1,5 @@ /* keybox-search.c - Search operations - * Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. + * Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -15,7 +15,8 @@ * * You 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 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. */ #include <config.h> @@ -26,12 +27,15 @@ #include <errno.h> #include "../jnlib/stringhelp.h" /* ascii_xxxx() */ + #include "keybox-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)) + struct sn_array_s { int snlen; unsigned char *sn; @@ -39,7 +43,7 @@ struct sn_array_s { -static ulong +static inline ulong get32 (const byte *buffer) { ulong a; @@ -50,7 +54,7 @@ get32 (const byte *buffer) return a; } -static ulong +static inline ulong get16 (const byte *buffer) { ulong a; @@ -61,20 +65,20 @@ get16 (const byte *buffer) -static int +static inline int blob_get_type (KEYBOXBLOB blob) { const unsigned char *buffer; size_t length; buffer = _keybox_get_blob_image (blob, &length); - if (length < 40) + if (length < 32) return -1; /* blob too short */ return buffer[4]; } -static unsigned int +static inline unsigned int blob_get_blob_flags (KEYBOXBLOB blob) { const unsigned char *buffer; @@ -88,6 +92,110 @@ blob_get_blob_flags (KEYBOXBLOB blob) } +/* Return information on the flag WHAT within the blob BUFFER,LENGTH. + Return the offset and the length (in bytes) of the flag in + FLAGOFF,FLAG_SIZE. */ +gpg_err_code_t +_keybox_get_flag_location (const unsigned char *buffer, size_t length, + int what, size_t *flag_off, size_t *flag_size) +{ + size_t pos; + size_t nkeys, keyinfolen; + size_t nuids, uidinfolen; + size_t nserial; + size_t nsigs, siginfolen; + + switch (what) + { + case KEYBOX_FLAG_BLOB: + if (length < 8) + return GPG_ERR_INV_OBJ; + *flag_off = 6; + *flag_size = 2; + break; + + case KEYBOX_FLAG_OWNERTRUST: + case KEYBOX_FLAG_VALIDITY: + case KEYBOX_FLAG_CREATED_AT: + if (length < 20) + return GPG_ERR_INV_OBJ; + /* Key info. */ + nkeys = get16 (buffer + 16); + keyinfolen = get16 (buffer + 18 ); + if (keyinfolen < 28) + return GPG_ERR_INV_OBJ; + pos = 20 + keyinfolen*nkeys; + if (pos+2 > length) + return GPG_ERR_INV_OBJ; /* Out of bounds. */ + /* Serial number. */ + nserial = get16 (buffer+pos); + pos += 2 + nserial; + if (pos+4 > length) + return GPG_ERR_INV_OBJ; /* Out of bounds. */ + /* User IDs. */ + nuids = get16 (buffer + pos); pos += 2; + uidinfolen = get16 (buffer + pos); pos += 2; + if (uidinfolen < 12 ) + return GPG_ERR_INV_OBJ; + pos += uidinfolen*nuids; + if (pos+4 > length) + return GPG_ERR_INV_OBJ ; /* Out of bounds. */ + /* Signature info. */ + nsigs = get16 (buffer + pos); pos += 2; + siginfolen = get16 (buffer + pos); pos += 2; + if (siginfolen < 4 ) + return GPG_ERR_INV_OBJ; + pos += siginfolen*nsigs; + if (pos+1+1+2+4+4+4+4 > length) + return GPG_ERR_INV_OBJ ; /* Out of bounds. */ + *flag_size = 1; + *flag_off = pos; + switch (what) + { + case KEYBOX_FLAG_VALIDITY: + *flag_off += 1; + break; + case KEYBOX_FLAG_CREATED_AT: + *flag_size = 4; + *flag_off += 1+2+4+4+4; + break; + default: + break; + } + break; + + default: + return GPG_ERR_INV_FLAG; + } + return 0; +} + + + +/* Return one of the flags WHAT in VALUE from teh blob BUFFER of + LENGTH bytes. Return 0 on success or an raw error code. */ +static gpg_err_code_t +get_flag_from_image (const unsigned char *buffer, size_t length, + int what, unsigned int *value) +{ + gpg_err_code_t ec; + size_t pos, size; + + *value = 0; + ec = _keybox_get_flag_location (buffer, length, what, &pos, &size); + if (!ec) + switch (size) + { + case 1: *value = buffer[pos]; break; + case 2: *value = get16 (buffer + pos); break; + case 4: *value = get32 (buffer + pos); break; + default: ec = GPG_ERR_BUG; break; + } + + return ec; +} + + static int blob_cmp_sn (KEYBOXBLOB blob, const unsigned char *sn, int snlen) { @@ -353,26 +461,26 @@ blob_cmp_mail (KEYBOXBLOB blob, const char *name, size_t namelen, int substr) /* The has_foo functions are used as helpers for search */ -static int +static inline int has_short_kid (KEYBOXBLOB blob, const unsigned char *kid) { return blob_cmp_fpr_part (blob, kid+4, 16, 4); } -static int +static inline int has_long_kid (KEYBOXBLOB blob, const unsigned char *kid) { return blob_cmp_fpr_part (blob, kid, 12, 8); } -static int +static inline int has_fingerprint (KEYBOXBLOB blob, const unsigned char *fpr) { return blob_cmp_fpr (blob, fpr); } -static int +static inline int has_issuer (KEYBOXBLOB blob, const char *name) { size_t namelen; @@ -386,7 +494,7 @@ has_issuer (KEYBOXBLOB blob, const char *name) return blob_cmp_name (blob, 0 /* issuer */, name, namelen, 0); } -static int +static inline int has_issuer_sn (KEYBOXBLOB blob, const char *name, const unsigned char *sn, int snlen) { @@ -404,7 +512,7 @@ has_issuer_sn (KEYBOXBLOB blob, const char *name, && blob_cmp_name (blob, 0 /* issuer */, name, namelen, 0)); } -static int +static inline int has_sn (KEYBOXBLOB blob, const unsigned char *sn, int snlen) { return_val_if_fail (sn, 0); @@ -414,7 +522,7 @@ has_sn (KEYBOXBLOB blob, const unsigned char *sn, int snlen) return blob_cmp_sn (blob, sn, snlen); } -static int +static inline int has_subject (KEYBOXBLOB blob, const char *name) { size_t namelen; @@ -428,7 +536,7 @@ has_subject (KEYBOXBLOB blob, const char *name) return blob_cmp_name (blob, 1 /* subject */, name, namelen, 0); } -static int +static inline int has_subject_or_alt (KEYBOXBLOB blob, const char *name, int substr) { size_t namelen; @@ -444,7 +552,7 @@ has_subject_or_alt (KEYBOXBLOB blob, const char *name, int substr) } -static int +static inline int has_mail (KEYBOXBLOB blob, const char *name, int substr) { size_t namelen; @@ -566,7 +674,7 @@ keybox_search (KEYBOX_HANDLE hd, KEYBOX_SEARCH_DESC *desc, size_t ndesc) /* kludge: we need to convert an SN given as hexstring to it's binary representation - in some cases we are not able to store it - in the search descriptor, because due to its usgae it is not + in the search descriptor, because due to its usage it is not possible to free allocated memory */ if (sn_array) { @@ -634,6 +742,10 @@ keybox_search (KEYBOX_HANDLE hd, KEYBOX_SEARCH_DESC *desc, size_t ndesc) if (rc) break; + if (blob_get_type (blob) == BLOBTYPE_HEADER) + continue; + + blobflags = blob_get_blob_flags (blob); if (!hd->ephemeral && (blobflags & 2)) continue; /* not in ephemeral mode but blob is flagged ephemeral */ @@ -753,13 +865,13 @@ keybox_search (KEYBOX_HANDLE hd, KEYBOX_SEARCH_DESC *desc, size_t ndesc) Return the last found cert. Caller must free it. */ int -keybox_get_cert (KEYBOX_HANDLE hd, KsbaCert *r_cert) +keybox_get_cert (KEYBOX_HANDLE hd, ksba_cert_t *r_cert) { const unsigned char *buffer; size_t length; size_t cert_off, cert_len; - KsbaReader reader = NULL; - KsbaCert cert = NULL; + ksba_reader_t reader = NULL; + ksba_cert_t cert = NULL; int rc; if (!hd) @@ -778,9 +890,9 @@ keybox_get_cert (KEYBOX_HANDLE hd, KsbaCert *r_cert) if (cert_off+cert_len > length) return gpg_error (GPG_ERR_TOO_SHORT); - reader = ksba_reader_new (); - if (!reader) - return gpg_error (GPG_ERR_ENOMEM); + rc = ksba_reader_new (&reader); + if (rc) + return rc; rc = ksba_reader_set_mem (reader, buffer+cert_off, cert_len); if (rc) { @@ -789,11 +901,11 @@ keybox_get_cert (KEYBOX_HANDLE hd, KsbaCert *r_cert) return gpg_error (GPG_ERR_GENERAL); } - cert = ksba_cert_new (); - if (!cert) + rc = ksba_cert_new (&cert); + if (rc) { ksba_reader_release (reader); - return gpg_error (GPG_ERR_ENOMEM); + return rc; } rc = ksba_cert_read_der (cert, reader); @@ -811,3 +923,23 @@ keybox_get_cert (KEYBOX_HANDLE hd, KsbaCert *r_cert) } #endif /*KEYBOX_WITH_X509*/ + +/* Return the flags named WHAT at the address of VALUE. IDX is used + only for certain flags and should be 0 if not required. */ +int +keybox_get_flags (KEYBOX_HANDLE hd, int what, int idx, unsigned int *value) +{ + const unsigned char *buffer; + size_t length; + gpg_err_code_t ec; + + if (!hd) + return gpg_error (GPG_ERR_INV_VALUE); + if (!hd->found.blob) + return gpg_error (GPG_ERR_NOTHING_FOUND); + + buffer = _keybox_get_blob_image (hd->found.blob, &length); + ec = get_flag_from_image (buffer, length, what, value); + return ec? gpg_error (ec):0; +} + diff --git a/kbx/keybox-update.c b/kbx/keybox-update.c index 52ad258b0..bb43d287b 100644 --- a/kbx/keybox-update.c +++ b/kbx/keybox-update.c @@ -1,5 +1,5 @@ /* keybox-update.c - keybox update operations - * Copyright (C) 2001, 2003 Free Software Foundation, Inc. + * Copyright (C) 2001, 2003, 2004 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -15,7 +15,8 @@ * * You 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 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. */ #include <config.h> @@ -23,6 +24,7 @@ #include <stdio.h> #include <string.h> #include <errno.h> +#include <time.h> #include <unistd.h> #include "keybox-defs.h" @@ -30,6 +32,38 @@ #define EXTSEP_S "." +#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 /* !defined(HAVE_FSEEKO) && !defined(fseeko) */ + + + static int create_tmp_file (const char *template, char **r_bakfname, char **r_tmpfname, FILE **r_fp) @@ -65,7 +99,7 @@ create_tmp_file (const char *template, strcpy (tmpfname + strlen (template)-4, EXTSEP_S "tmp"); } else - { /* file does not end with kbx; hmmm */ + { /* File does not end with kbx; hmmm. */ bakfname = xtrymalloc ( strlen (template) + 5); if (!bakfname) return gpg_error (gpg_err_code_from_errno (errno)); @@ -193,29 +227,30 @@ blob_filecopy (int mode, const char *fname, KEYBOXBLOB blob, fp = fopen (fname, "rb"); if (mode == 1 && !fp && errno == ENOENT) - { /* insert mode but file does not exist: create a new keybox file */ + { + /* Insert mode but file does not exist: + Create a new keybox file. */ newfp = fopen (fname, "wb"); if (!newfp ) - { - return gpg_error (gpg_err_code_from_errno (errno)); - } + return gpg_error (gpg_err_code_from_errno (errno)); + + rc = _keybox_write_header_blob (newfp); + if (rc) + return rc; rc = _keybox_write_blob (blob, newfp); if (rc) - { - return rc; - } + return rc; + if ( fclose (newfp) ) - { - return gpg_error (gpg_err_code_from_errno (errno)); - } + return gpg_error (gpg_err_code_from_errno (errno)); /* if (chmod( fname, S_IRUSR | S_IWUSR )) */ /* { */ /* log_debug ("%s: chmod failed: %s\n", fname, strerror(errno) ); */ /* return KEYBOX_File_Error; */ /* } */ - return 0; /* ready */ + return 0; /* Ready. */ } if (!fp) @@ -224,7 +259,7 @@ blob_filecopy (int mode, const char *fname, KEYBOXBLOB blob, goto leave; } - /* create the new file */ + /* Create the new file. */ rc = create_tmp_file (fname, &bakfname, &tmpfname, &newfp); if (rc) { @@ -235,7 +270,7 @@ blob_filecopy (int mode, const char *fname, KEYBOXBLOB blob, /* prepare for insert */ if (mode == 1) { - /* copy everything to the new file */ + /* Copy everything to the new file. */ while ( (nread = fread (buffer, 1, DIM(buffer), fp)) > 0 ) { if (fwrite (buffer, nread, 1, newfp) != 1) @@ -251,19 +286,19 @@ blob_filecopy (int mode, const char *fname, KEYBOXBLOB blob, } } - /* prepare for delete or update */ + /* Prepare for delete or update. */ if ( mode == 2 || mode == 3 ) { off_t current = 0; - /* copy first part to the new file */ + /* Copy first part to the new file. */ while ( current < start_offset ) { nbytes = DIM(buffer); if (current + nbytes > start_offset) nbytes = start_offset - current; nread = fread (buffer, 1, nbytes, fp); - if (!fread) + if (!nread) break; current += nread; @@ -279,13 +314,13 @@ blob_filecopy (int mode, const char *fname, KEYBOXBLOB blob, goto leave; } - /* skip this blob */ + /* Skip this blob. */ rc = _keybox_read_blob (NULL, fp); if (rc) return rc; } - /* Do an insert or update */ + /* Do an insert or update. */ if ( mode == 1 || mode == 3 ) { rc = _keybox_write_blob (blob, newfp); @@ -293,7 +328,7 @@ blob_filecopy (int mode, const char *fname, KEYBOXBLOB blob, return rc; } - /* copy the rest of the packet for an delete or update */ + /* Copy the rest of the packet for an delete or update. */ if (mode == 2 || mode == 3) { while ( (nread = fread (buffer, 1, DIM(buffer), fp)) > 0 ) @@ -311,7 +346,7 @@ blob_filecopy (int mode, const char *fname, KEYBOXBLOB blob, } } - /* close both files */ + /* Close both files. */ if (fclose(fp)) { rc = gpg_error (gpg_err_code_from_errno (errno)); @@ -334,10 +369,9 @@ blob_filecopy (int mode, const char *fname, KEYBOXBLOB blob, - #ifdef KEYBOX_WITH_X509 int -keybox_insert_cert (KEYBOX_HANDLE hd, KsbaCert cert, +keybox_insert_cert (KEYBOX_HANDLE hd, ksba_cert_t cert, unsigned char *sha1_digest) { int rc; @@ -352,7 +386,7 @@ keybox_insert_cert (KEYBOX_HANDLE hd, KsbaCert cert, if (!fname) return gpg_error (GPG_ERR_INV_HANDLE); - /* close this one otherwise we will mess up the position for a next + /* Close this one otherwise we will mess up the position for a next search. Fixme: it would be better to adjust the position after the write opertions. */ if (hd->fp) @@ -375,7 +409,7 @@ keybox_insert_cert (KEYBOX_HANDLE hd, KsbaCert cert, } int -keybox_update_cert (KEYBOX_HANDLE hd, KsbaCert cert, +keybox_update_cert (KEYBOX_HANDLE hd, ksba_cert_t cert, unsigned char *sha1_digest) { return -1; @@ -384,6 +418,88 @@ keybox_update_cert (KEYBOX_HANDLE hd, KsbaCert cert, #endif /*KEYBOX_WITH_X509*/ +/* Note: We assume that the keybox has been locked before the current + search was executed. This is needed so that we can depend on the + offset information of the flags. */ +int +keybox_set_flags (KEYBOX_HANDLE hd, int what, int idx, unsigned int value) +{ + off_t off; + const char *fname; + FILE *fp; + gpg_err_code_t ec; + size_t flag_pos, flag_size; + const unsigned char *buffer; + size_t length; + + if (!hd) + return gpg_error (GPG_ERR_INV_VALUE); + if (!hd->found.blob) + return gpg_error (GPG_ERR_NOTHING_FOUND); + if (!hd->kb) + return gpg_error (GPG_ERR_INV_HANDLE); + if (!hd->found.blob) + return gpg_error (GPG_ERR_NOTHING_FOUND); + fname = hd->kb->fname; + if (!fname) + return gpg_error (GPG_ERR_INV_HANDLE); + + off = _keybox_get_blob_fileoffset (hd->found.blob); + if (off == (off_t)-1) + return gpg_error (GPG_ERR_GENERAL); + + buffer = _keybox_get_blob_image (hd->found.blob, &length); + ec = _keybox_get_flag_location (buffer, length, what, &flag_pos, &flag_size); + if (ec) + return gpg_error (ec); + + off += flag_pos; + + if (hd->fp) + { + fclose (hd->fp); + hd->fp = NULL; + } + fp = fopen (hd->kb->fname, "r+b"); + if (!fp) + return gpg_error (gpg_err_code_from_errno (errno)); + + ec = 0; + if (fseeko (fp, off, SEEK_SET)) + ec = gpg_error (gpg_err_code_from_errno (errno)); + else + { + unsigned char tmp[4]; + + tmp[0] = value >> 24; + tmp[1] = value >> 16; + tmp[2] = value >> 8; + tmp[3] = value; + + switch (flag_size) + { + case 1: + case 2: + case 4: + if (fwrite (tmp+4-flag_size, flag_size, 1, fp) != 1) + ec = gpg_err_code_from_errno (errno); + break; + default: + ec = GPG_ERR_BUG; + break; + } + } + + if (fclose (fp)) + { + if (!ec) + ec = gpg_err_code_from_errno (errno); + } + + return gpg_error (ec); +} + + int keybox_delete (KEYBOX_HANDLE hd) @@ -435,3 +551,181 @@ keybox_delete (KEYBOX_HANDLE hd) } +/* Compress the keybox file. This should be run with the file + locked. */ +int +keybox_compress (KEYBOX_HANDLE hd) +{ + int read_rc, rc; + const char *fname; + FILE *fp, *newfp; + char *bakfname = NULL; + char *tmpfname = NULL; + int first_blob; + KEYBOXBLOB blob = NULL; + u32 cut_time; + int any_changes = 0; + int skipped_deleted; + + if (!hd) + return gpg_error (GPG_ERR_INV_HANDLE); + if (!hd->kb) + return gpg_error (GPG_ERR_INV_HANDLE); + if (hd->secret) + return gpg_error (GPG_ERR_NOT_IMPLEMENTED); + fname = hd->kb->fname; + if (!fname) + return gpg_error (GPG_ERR_INV_HANDLE); + + if (hd->fp) + { + fclose (hd->fp); + hd->fp = 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 gpg_error (gpg_err_code_from_errno (errno)); + + fp = fopen (fname, "rb"); + if (!fp && errno == ENOENT) + return 0; /* Ready. File has been deleted right after the access above. */ + if (!fp) + { + rc = gpg_error (gpg_err_code_from_errno (errno)); + return rc; + } + + /* A quick test to see if we need to compress the file at all. We + schedule a compress run after 3 hours. */ + if ( !_keybox_read_blob (&blob, fp) ) + { + const unsigned char *buffer; + size_t length; + + buffer = _keybox_get_blob_image (blob, &length); + if (length > 4 && buffer[4] == BLOBTYPE_HEADER) + { + u32 last_maint = ((buffer[20] << 24) | (buffer[20+1] << 16) + | (buffer[20+2] << 8) | (buffer[20+3])); + + if ( (last_maint + 3*3600) > time (NULL) ) + { + fclose (fp); + _keybox_release_blob (blob); + return 0; /* Compress run not yet needed. */ + } + } + _keybox_release_blob (blob); + rewind (fp); + } + + /* Create the new file. */ + rc = create_tmp_file (fname, &bakfname, &tmpfname, &newfp); + if (rc) + { + fclose(fp); + return rc;; + } + + + /* Processing loop. By reading using _keybox_read_blob we + automagically skip and blobs flagged as deleted. Thus what we + only have to do is to check all ephemeral flagged blocks whether + their time has come and write out all other blobs. */ + cut_time = time(NULL) - 86400; + first_blob = 1; + skipped_deleted = 0; + for (rc=0; !(read_rc = _keybox_read_blob2 (&blob, fp, &skipped_deleted)); + _keybox_release_blob (blob), blob = NULL ) + { + unsigned int blobflags; + const unsigned char *buffer; + size_t length, pos, size; + u32 created_at; + + if (skipped_deleted) + any_changes = 1; + buffer = _keybox_get_blob_image (blob, &length); + if (first_blob) + { + first_blob = 0; + if (length > 4 && buffer[4] == BLOBTYPE_HEADER) + { + /* Write out the blob with an updated maintenance time stamp. */ + _keybox_update_header_blob (blob); + rc = _keybox_write_blob (blob, newfp); + if (rc) + break; + continue; + } + + /* The header blob is missing. Insert it. */ + rc = _keybox_write_header_blob (newfp); + if (rc) + break; + any_changes = 1; + } + else if (length > 4 && buffer[4] == BLOBTYPE_HEADER) + { + /* Oops: There is another header record - remove it. */ + any_changes = 1; + continue; + } + + if (_keybox_get_flag_location (buffer, length, + KEYBOX_FLAG_BLOB, &pos, &size) + || size != 2) + { + rc = gpg_error (GPG_ERR_BUG); + break; + } + blobflags = ((buffer[pos] << 8) | (buffer[pos+1])); + if ((blobflags & 2)) + { + /* This is an ephemeral blob. */ + if (_keybox_get_flag_location (buffer, length, + KEYBOX_FLAG_CREATED_AT, &pos, &size) + || size != 4) + created_at = 0; /* oops. */ + else + created_at = ((buffer[pos] << 24) | (buffer[pos+1] << 16) + | (buffer[pos+2] << 8) | (buffer[pos+3])); + + if (created_at && created_at < cut_time) + { + any_changes = 1; + continue; /* Skip this blob. */ + } + } + + rc = _keybox_write_blob (blob, newfp); + if (rc) + break; + } + if (skipped_deleted) + any_changes = 1; + _keybox_release_blob (blob); blob = NULL; + if (!rc && read_rc == -1) + rc = 0; + else if (!rc) + rc = read_rc; + + /* Close both files. */ + if (fclose(fp) && !rc) + rc = gpg_error (gpg_err_code_from_errno (errno)); + if (fclose(newfp) && !rc) + rc = gpg_error (gpg_err_code_from_errno (errno)); + + /* Rename or remove the temporary file. */ + if (rc || !any_changes) + remove (tmpfname); + else + rc = rename_tmp_file (bakfname, tmpfname, fname, hd->secret); + + xfree(bakfname); + xfree(tmpfname); + return rc; +} + diff --git a/kbx/keybox-util.c b/kbx/keybox-util.c index ed5d93de0..6eb85ba3f 100644 --- a/kbx/keybox-util.c +++ b/kbx/keybox-util.c @@ -15,7 +15,8 @@ * * You 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 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. */ #include <config.h> diff --git a/kbx/keybox.h b/kbx/keybox.h index 5fe5516d4..0f97fb7fc 100644 --- a/kbx/keybox.h +++ b/kbx/keybox.h @@ -15,7 +15,8 @@ * * You 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 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. */ #ifndef KEYBOX_H @@ -42,11 +43,22 @@ extern "C" { # include <ksba.h> #endif - - typedef struct keybox_handle *KEYBOX_HANDLE; +typedef enum + { + KEYBOX_FLAG_BLOB, /* The blob flags. */ + KEYBOX_FLAG_VALIDITY, /* The validity of the entire key. */ + KEYBOX_FLAG_OWNERTRUST, /* The assigned ownertrust. */ + KEYBOX_FLAG_KEY, /* The key flags; requires a key index. */ + KEYBOX_FLAG_UID, /* The user ID flags; requires an uid index. */ + KEYBOX_FLAG_UID_VALIDITY,/* The validity of a specific uid, requires + an uid index. */ + KEYBOX_FLAG_CREATED_AT /* The date the block was created. */ + } keybox_flag_t; + + /*-- keybox-init.c --*/ void *keybox_register_file (const char *fname, int secret); int keybox_is_writable (void *token); @@ -59,8 +71,9 @@ int keybox_set_ephemeral (KEYBOX_HANDLE hd, int yes); /*-- keybox-search.c --*/ #ifdef KEYBOX_WITH_X509 -int keybox_get_cert (KEYBOX_HANDLE hd, KsbaCert *ret_cert); +int keybox_get_cert (KEYBOX_HANDLE hd, ksba_cert_t *ret_cert); #endif /*KEYBOX_WITH_X509*/ +int keybox_get_flags (KEYBOX_HANDLE hd, int what, int idx, unsigned int *value); int keybox_search_reset (KEYBOX_HANDLE hd); int keybox_search (KEYBOX_HANDLE hd, KEYBOX_SEARCH_DESC *desc, size_t ndesc); @@ -68,13 +81,15 @@ int keybox_search (KEYBOX_HANDLE hd, KEYBOX_SEARCH_DESC *desc, size_t ndesc); /*-- keybox-update.c --*/ #ifdef KEYBOX_WITH_X509 -int keybox_insert_cert (KEYBOX_HANDLE hd, KsbaCert cert, +int keybox_insert_cert (KEYBOX_HANDLE hd, ksba_cert_t cert, unsigned char *sha1_digest); -int keybox_update_cert (KEYBOX_HANDLE hd, KsbaCert cert, +int keybox_update_cert (KEYBOX_HANDLE hd, ksba_cert_t cert, unsigned char *sha1_digest); #endif /*KEYBOX_WITH_X509*/ +int keybox_set_flags (KEYBOX_HANDLE hd, int what, int idx, unsigned int value); int keybox_delete (KEYBOX_HANDLE hd); +int keybox_compress (KEYBOX_HANDLE hd); /*-- --*/ diff --git a/kbx/mkerrors b/kbx/mkerrors index 5adb7bfdf..d3d096c5d 100755 --- a/kbx/mkerrors +++ b/kbx/mkerrors @@ -17,7 +17,8 @@ # # You 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 +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, +# USA. cat <<EOF /* Generated automatically by mkerrors */ diff --git a/keyserver/ChangeLog b/keyserver/ChangeLog index a676d470e..c427c4778 100644 --- a/keyserver/ChangeLog +++ b/keyserver/ChangeLog @@ -1,30 +1,11 @@ -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> +2006-07-24 David Shaw <dshaw@jabberwocky.com> (wk) * 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. + * 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-04-26 David Shaw <dshaw@jabberwocky.com> diff --git a/keyserver/Makefile.am b/keyserver/Makefile.am index dafc853f3..72572de2c 100644 --- a/keyserver/Makefile.am +++ b/keyserver/Makefile.am @@ -42,13 +42,12 @@ gpgkeys_finger_LDADD = ../util/libutil.a @NETLIBS@ $(other_libs) @GETOPT@ @W32LI 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_curl_LDADD = ../util/libutil.a @NETLIBS@ @SRVLIBS@ $(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@ +gpgkeys_hkp_LDADD = ../util/libutil.a @NETLIBS@ @SRVLIBS@ $(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/curl-shim.c b/keyserver/curl-shim.c index f4fdc0c60..c71c655b5 100644 --- a/keyserver/curl-shim.c +++ b/keyserver/curl-shim.c @@ -304,7 +304,7 @@ curl_escape(char *str,int length) else { char numbuf[5]; - sprintf(numbuf,"%%%02X",(unsigned char)str[idx]); + sprintf(numbuf,"%%%02X",str[idx]); strcpy(&enc[enc_idx],numbuf); enc_idx+=3; } diff --git a/keyserver/gpgkeys_ldap.c b/keyserver/gpgkeys_ldap.c index 357c874ea..b56cca1cf 100644 --- a/keyserver/gpgkeys_ldap.c +++ b/keyserver/gpgkeys_ldap.c @@ -1264,7 +1264,7 @@ printquoted(FILE *stream,char *string,char delim) while(*string) { if(*string==delim || *string=='%') - fprintf(stream,"%%%02x",(unsigned char)*string); + fprintf(stream,"%%%02x",*string); else fputc(*string,stream); diff --git a/m4/ChangeLog b/m4/ChangeLog index 67c110636..f666fa38d 100644 --- a/m4/ChangeLog +++ b/m4/ChangeLog @@ -1,151 +1,17 @@ -2006-07-12 David Shaw <dshaw@jabberwocky.com> +2006-07-27 Werner Koch <wk@g10code.com> - * tar-ustar.m4: Use dd instead of strings as it's more likely to - be around. Suggested by Nelson H. F. Beebe. + * autobuild.m4: New. -2006-07-11 David Shaw <dshaw@jabberwocky.com> +2006-06-30 Werner Koch <wk@g10code.com> - * tar-ustar.m4: Not all greps know the -q (quiet) flag, so - redirect to /dev/null instead. + * ldap.m4: New. Taken from gnupg 1.4.4 + * Makefile.am (EXTRA_DIST): Add ldap.me - * 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. +2004-09-30 Werner Koch <wk@g10code.com> -2006-06-25 Werner Koch <wk@g10code.com> + * gpg-error.m4, libassuan.m4, libgcrypt.m4: Updated. - * 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> +2004-09-30 gettextize <bug-gnu-gettext@gnu.org> * gettext.m4: Upgrade to gettext-0.14.1. * intmax.m4: New file, from gettext-0.14.1. @@ -163,26 +29,33 @@ * 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> +2004-03-06 Werner Koch <wk@gnupg.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. + * libgcrypt.m4: Updated. + +2004-02-18 Werner Koch <wk@gnupg.org> + + * gpg-error.m4, libgcrypt.m4, libassuan.m4, ksba.m4: New. + * Makefile.am: Distribute them + +2003-04-29 gettextize <bug-gnu-gettext@gnu.org> + + * codeset.m4: New file, from gettext-0.11.5. + * gettext.m4: New file, from gettext-0.11.5. + * glibc21.m4: New file, from gettext-0.11.5. + * iconv.m4: New file, from gettext-0.11.5. + * intdiv0.m4: New file, from gettext-0.11.5. + * inttypes.m4: New file, from gettext-0.11.5. + * inttypes_h.m4: New file, from gettext-0.11.5. + * inttypes-pri.m4: New file, from gettext-0.11.5. + * isc-posix.m4: New file, from gettext-0.11.5. + * lcmessage.m4: New file, from gettext-0.11.5. + * lib-ld.m4: New file, from gettext-0.11.5. + * lib-link.m4: New file, from gettext-0.11.5. + * lib-prefix.m4: New file, from gettext-0.11.5. + * progtest.m4: New file, from gettext-0.11.5. + * stdint_h.m4: New file, from gettext-0.11.5. + * uintmax_t.m4: New file, from gettext-0.11.5. + * ulonglong.m4: New file, from gettext-0.11.5. * Makefile.am: New file. diff --git a/m4/Makefile.am b/m4/Makefile.am index 91b623f6d..7eb76cb4d 100644 --- a/m4/Makefile.am +++ b/m4/Makefile.am @@ -1,10 +1,8 @@ -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 +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 progtest.m4 stdint_h.m4 uintmax_t.m4 ulonglong.m4 + +EXTRA_DIST += ldap.m4 + +EXTRA_DIST += gpg-error.m4 libgcrypt.m4 libassuan.m4 ksba.m4 + +EXTRA_DIST += autobuild.m4 diff --git a/m4/autobuild.m4 b/m4/autobuild.m4 new file mode 100644 index 000000000..bd1f4dc1b --- /dev/null +++ b/m4/autobuild.m4 @@ -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/gpg-error.m4 b/m4/gpg-error.m4 new file mode 100644 index 000000000..a5875f004 --- /dev/null +++ b/m4/gpg-error.m4 @@ -0,0 +1,56 @@ +dnl Autoconf macros for libgpg-error + +dnl AM_PATH_GPG_ERROR([MINIMUM-VERSION, +dnl [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]]) +dnl Test for libgpg-error and define GPG_ERROR_CFLAGS and GPG_ERROR_LIBS +dnl +AC_DEFUN([AM_PATH_GPG_ERROR], +[ AC_ARG_WITH(gpg-error-prefix, + AC_HELP_STRING([--with-gpg-error-prefix=PFX], + [prefix where GPG Error is installed (optional)]), + gpg_error_config_prefix="$withval", gpg_error_config_prefix="") + if test x$gpg_error_config_prefix != x ; then + if test x${GPG_ERROR_CONFIG+set} != xset ; then + GPG_ERROR_CONFIG=$gpg_error_config_prefix/bin/gpg-error-config + fi + fi + + AC_PATH_PROG(GPG_ERROR_CONFIG, gpg-error-config, no) + min_gpg_error_version=ifelse([$1], ,0.0,$1) + AC_MSG_CHECKING(for GPG Error - version >= $min_gpg_error_version) + ok=no + if test "$GPG_ERROR_CONFIG" != "no" ; then + req_major=`echo $min_gpg_error_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)/\1/'` + req_minor=`echo $min_gpg_error_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)/\2/'` + gpg_error_config_version=`$GPG_ERROR_CONFIG $gpg_error_config_args --version` + major=`echo $gpg_error_config_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\).*/\1/'` + minor=`echo $gpg_error_config_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\).*/\2/'` + if test "$major" -gt "$req_major"; then + ok=yes + else + if test "$major" -eq "$req_major"; then + if test "$minor" -ge "$req_minor"; then + ok=yes + fi + fi + fi + fi + if test $ok = yes; then + GPG_ERROR_CFLAGS=`$GPG_ERROR_CONFIG $gpg_error_config_args --cflags` + GPG_ERROR_LIBS=`$GPG_ERROR_CONFIG $gpg_error_config_args --libs` + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) + else + GPG_ERROR_CFLAGS="" + GPG_ERROR_LIBS="" + AC_MSG_RESULT(no) + ifelse([$3], , :, [$3]) + fi + AC_SUBST(GPG_ERROR_CFLAGS) + AC_SUBST(GPG_ERROR_LIBS) +]) + diff --git a/m4/ksba.m4 b/m4/ksba.m4 new file mode 100644 index 000000000..99017c39e --- /dev/null +++ b/m4/ksba.m4 @@ -0,0 +1,76 @@ +# ksba.m4 - autoconf macro to detect ksba +# Copyright (C) 2002 g10 Code GmbH +# +# This file is free software; as a special exception the author gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. +# +# This 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. + + +dnl AM_PATH_KSBA([MINIMUM-VERSION, +dnl [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]]) +dnl Test for libksba and define KSBA_CFLAGS and KSBA_LIBS +dnl +AC_DEFUN([AM_PATH_KSBA], +[ AC_ARG_WITH(ksba-prefix, + AC_HELP_STRING([--with-ksba-prefix=PFX], + [prefix where KSBA is installed (optional)]), + ksba_config_prefix="$withval", ksba_config_prefix="") + if test x$ksba_config_prefix != x ; then + ksba_config_args="$ksba_config_args --prefix=$ksba_config_prefix" + if test x${KSBA_CONFIG+set} != xset ; then + KSBA_CONFIG=$ksba_config_prefix/bin/ksba-config + fi + fi + + AC_PATH_PROG(KSBA_CONFIG, ksba-config, no) + min_ksba_version=ifelse([$1], ,0.4.4,$1) + AC_MSG_CHECKING(for KSBA - version >= $min_ksba_version) + ok=no + if test "$KSBA_CONFIG" != "no" ; then + req_major=`echo $min_ksba_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\1/'` + req_minor=`echo $min_ksba_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\2/'` + req_micro=`echo $min_ksba_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\3/'` + ksba_config_version=`$KSBA_CONFIG $ksba_config_args --version` + major=`echo $ksba_config_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\1/'` + minor=`echo $ksba_config_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\2/'` + micro=`echo $ksba_config_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\3/'` + if test "$major" -gt "$req_major"; then + ok=yes + else + if test "$major" -eq "$req_major"; then + if test "$minor" -gt "$req_minor"; then + ok=yes + else + if test "$minor" -eq "$req_minor"; then + if test "$micro" -ge "$req_micro"; then + ok=yes + fi + fi + fi + fi + fi + fi + if test $ok = yes; then + KSBA_CFLAGS=`$KSBA_CONFIG $ksba_config_args --cflags` + KSBA_LIBS=`$KSBA_CONFIG $ksba_config_args --libs` + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) + else + KSBA_CFLAGS="" + KSBA_LIBS="" + AC_MSG_RESULT(no) + ifelse([$3], , :, [$3]) + fi + AC_SUBST(KSBA_CFLAGS) + AC_SUBST(KSBA_LIBS) +]) diff --git a/m4/libassuan.m4 b/m4/libassuan.m4 new file mode 100644 index 000000000..16b664ce4 --- /dev/null +++ b/m4/libassuan.m4 @@ -0,0 +1,76 @@ +dnl Autoconf macros for libassuan +dnl Copyright (C) 2002, 2003 Free Software Foundation, Inc. +dnl +dnl This file is free software; as a special exception the author gives +dnl unlimited permission to copy and/or distribute it, with or without +dnl modifications, as long as this notice is preserved. +dnl +dnl This file is distributed in the hope that it will be useful, but +dnl WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +dnl implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + +dnl AM_PATH_LIBASSUAN([MINIMUM-VERSION, +dnl [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]]) +dnl Test for libassuan and define LIBASSUAN_CFLAGS and LIBASSUAN_LIBS +dnl +AC_DEFUN([AM_PATH_LIBASSUAN], +[ AC_ARG_WITH(libassuan-prefix, + AC_HELP_STRING([--with-libassuan-prefix=PFX], + [prefix where LIBASSUAN is installed (optional)]), + libassuan_config_prefix="$withval", libassuan_config_prefix="") + if test x$libassuan_config_prefix != x ; then + libassuan_config_args="$libassuan_config_args --prefix=$libassuan_config_prefix" + if test x${LIBASSUAN_CONFIG+set} != xset ; then + LIBASSUAN_CONFIG=$libassuan_config_prefix/bin/libassuan-config + fi + fi + + AC_PATH_PROG(LIBASSUAN_CONFIG, libassuan-config, no) + min_libassuan_version=ifelse([$1], ,0.0.1,$1) + AC_MSG_CHECKING(for LIBASSUAN - version >= $min_libassuan_version) + ok=no + if test "$LIBASSUAN_CONFIG" != "no" ; then + req_major=`echo $min_libassuan_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\1/'` + req_minor=`echo $min_libassuan_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\2/'` + req_micro=`echo $min_libassuan_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\3/'` + libassuan_config_version=`$LIBASSUAN_CONFIG $libassuan_config_args --version` + major=`echo $libassuan_config_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\1/'` + minor=`echo $libassuan_config_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\2/'` + micro=`echo $libassuan_config_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\3/'` + if test "$major" -gt "$req_major"; then + ok=yes + else + if test "$major" -eq "$req_major"; then + if test "$minor" -gt "$req_minor"; then + ok=yes + else + if test "$minor" -eq "$req_minor"; then + if test "$micro" -ge "$req_micro"; then + ok=yes + fi + fi + fi + fi + fi + fi + if test $ok = yes; then + LIBASSUAN_CFLAGS=`$LIBASSUAN_CONFIG $libassuan_config_args --cflags` + LIBASSUAN_LIBS=`$LIBASSUAN_CONFIG $libassuan_config_args --libs` + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) + else + LIBASSUAN_CFLAGS="" + LIBASSUAN_LIBS="" + AC_MSG_RESULT(no) + ifelse([$3], , :, [$3]) + fi + AC_SUBST(LIBASSUAN_CFLAGS) + AC_SUBST(LIBASSUAN_LIBS) +]) diff --git a/m4/libcurl.m4 b/m4/libcurl.m4 deleted file mode 100644 index a9bfa2e23..000000000 --- a/m4/libcurl.m4 +++ /dev/null @@ -1,239 +0,0 @@ -# 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/libgcrypt.m4 b/m4/libgcrypt.m4 new file mode 100644 index 000000000..20bd10556 --- /dev/null +++ b/m4/libgcrypt.m4 @@ -0,0 +1,108 @@ +dnl Autoconf macros for libgcrypt +dnl Copyright (C) 2002, 2004 Free Software Foundation, Inc. +dnl +dnl This file is free software; as a special exception the author gives +dnl unlimited permission to copy and/or distribute it, with or without +dnl modifications, as long as this notice is preserved. +dnl +dnl This file is distributed in the hope that it will be useful, but +dnl WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +dnl implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + +dnl AM_PATH_LIBGCRYPT([MINIMUM-VERSION, +dnl [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]]) +dnl Test for libgcrypt and define LIBGCRYPT_CFLAGS and LIBGCRYPT_LIBS. +dnl MINIMUN-VERSION is a string with the version number optionalliy prefixed +dnl with the API version to also check the API compatibility. Example: +dnl a MINIMUN-VERSION of 1:1.2.5 won't pass the test unless the installed +dnl version of libgcrypt is at least 1.2.5 *and* the API number is 1. Using +dnl this features allows to prevent build against newer versions of libgcrypt +dnl with a changed API. +dnl +AC_DEFUN([AM_PATH_LIBGCRYPT], +[ AC_ARG_WITH(libgcrypt-prefix, + AC_HELP_STRING([--with-libgcrypt-prefix=PFX], + [prefix where LIBGCRYPT is installed (optional)]), + libgcrypt_config_prefix="$withval", libgcrypt_config_prefix="") + if test x$libgcrypt_config_prefix != x ; then + if test x${LIBGCRYPT_CONFIG+set} != xset ; then + LIBGCRYPT_CONFIG=$libgcrypt_config_prefix/bin/libgcrypt-config + fi + fi + + AC_PATH_PROG(LIBGCRYPT_CONFIG, libgcrypt-config, no) + tmp=ifelse([$1], ,1:1.2.0,$1) + if echo "$tmp" | grep ':' >/dev/null 2>/dev/null ; then + req_libgcrypt_api=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\1/'` + min_libgcrypt_version=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\2/'` + else + req_libgcrypt_api=0 + min_libgcrypt_version="$tmp" + fi + + AC_MSG_CHECKING(for LIBGCRYPT - version >= $min_libgcrypt_version) + ok=no + if test "$LIBGCRYPT_CONFIG" != "no" ; then + req_major=`echo $min_libgcrypt_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\1/'` + req_minor=`echo $min_libgcrypt_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\2/'` + req_micro=`echo $min_libgcrypt_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\3/'` + libgcrypt_config_version=`$LIBGCRYPT_CONFIG --version` + major=`echo $libgcrypt_config_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\1/'` + minor=`echo $libgcrypt_config_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\2/'` + micro=`echo $libgcrypt_config_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\3/'` + if test "$major" -gt "$req_major"; then + ok=yes + else + if test "$major" -eq "$req_major"; then + if test "$minor" -gt "$req_minor"; then + ok=yes + else + if test "$minor" -eq "$req_minor"; then + if test "$micro" -ge "$req_micro"; then + ok=yes + fi + fi + fi + fi + fi + fi + if test $ok = yes; then + AC_MSG_RESULT(yes) + else + AC_MSG_RESULT(no) + fi + if test $ok = yes; then + # If we have a recent libgcrypt, we should also check that the + # API is compatible + if test "$req_libgcrypt_api" -gt 0 ; then + tmp=`$LIBGCRYPT_CONFIG --api-version 2>/dev/null || echo 0` + if test "$tmp" -gt 0 ; then + AC_MSG_CHECKING([LIBGCRYPT API version]) + if test "$req_libgcrypt_api" -eq "$tmp" ; then + AC_MSG_RESULT(okay) + else + ok=no + AC_MSG_RESULT([does not match (want=$req_libgcrypt_api got=$tmp)]) + fi + fi + fi + fi + if test $ok = yes; then + LIBGCRYPT_CFLAGS=`$LIBGCRYPT_CONFIG --cflags` + LIBGCRYPT_LIBS=`$LIBGCRYPT_CONFIG --libs` + ifelse([$2], , :, [$2]) + else + LIBGCRYPT_CFLAGS="" + LIBGCRYPT_LIBS="" + ifelse([$3], , :, [$3]) + fi + AC_SUBST(LIBGCRYPT_CFLAGS) + AC_SUBST(LIBGCRYPT_LIBS) +]) diff --git a/m4/libusb.m4 b/m4/libusb.m4 deleted file mode 100644 index 809dc1dd9..000000000 --- a/m4/libusb.m4 +++ /dev/null @@ -1,69 +0,0 @@ -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/noexecstack.m4 b/m4/noexecstack.m4 deleted file mode 100644 index 629e35134..000000000 --- a/m4/noexecstack.m4 +++ /dev/null @@ -1,55 +0,0 @@ -# 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/readline.m4 b/m4/readline.m4 deleted file mode 100644 index d25234605..000000000 --- a/m4/readline.m4 +++ /dev/null @@ -1,63 +0,0 @@ -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/tar-ustar.m4 b/m4/tar-ustar.m4 deleted file mode 100644 index 4ae9e63aa..000000000 --- a/m4/tar-ustar.m4 +++ /dev/null @@ -1,43 +0,0 @@ -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/mpi/ChangeLog b/mpi/ChangeLog deleted file mode 100644 index a2af9f303..000000000 --- a/mpi/ChangeLog +++ /dev/null @@ -1,505 +0,0 @@ -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 Mller. - -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 deleted file mode 100644 index 84d77571b..000000000 --- a/mpi/Makefile.am +++ /dev/null @@ -1,79 +0,0 @@ -# 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/alpha/README b/mpi/alpha/README deleted file mode 100644 index 55c0a2917..000000000 --- a/mpi/alpha/README +++ /dev/null @@ -1,53 +0,0 @@ -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 deleted file mode 100644 index f2ab9fc3c..000000000 --- a/mpi/alpha/distfiles +++ /dev/null @@ -1,11 +0,0 @@ -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 deleted file mode 100644 index 6ea8e38f1..000000000 --- a/mpi/alpha/mpih-add1.S +++ /dev/null @@ -1,125 +0,0 @@ -/* 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 deleted file mode 100644 index 45919f51f..000000000 --- a/mpi/alpha/mpih-lshift.S +++ /dev/null @@ -1,124 +0,0 @@ -/* 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 deleted file mode 100644 index 65b2d5c7e..000000000 --- a/mpi/alpha/mpih-mul1.S +++ /dev/null @@ -1,91 +0,0 @@ -/* 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 deleted file mode 100644 index e62ceb982..000000000 --- a/mpi/alpha/mpih-mul2.S +++ /dev/null @@ -1,98 +0,0 @@ -/* 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 deleted file mode 100644 index de8b0839b..000000000 --- a/mpi/alpha/mpih-mul3.S +++ /dev/null @@ -1,96 +0,0 @@ -/* 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 deleted file mode 100644 index 242d2b631..000000000 --- a/mpi/alpha/mpih-rshift.S +++ /dev/null @@ -1,121 +0,0 @@ -/* 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 deleted file mode 100644 index 2dea14f30..000000000 --- a/mpi/alpha/mpih-sub1.S +++ /dev/null @@ -1,125 +0,0 @@ -/* 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 deleted file mode 100644 index d715908eb..000000000 --- a/mpi/alpha/udiv-qrnnd.S +++ /dev/null @@ -1,162 +0,0 @@ -/* 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 deleted file mode 100644 index 451a5bf69..000000000 --- a/mpi/config.links +++ /dev/null @@ -1,328 +0,0 @@ -# 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 deleted file mode 100644 index 649e829b7..000000000 --- a/mpi/generic/distfiles +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100644 index 13424e280..000000000 --- a/mpi/generic/mpi-asm-defs.h +++ /dev/null @@ -1,10 +0,0 @@ -/* 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 deleted file mode 100644 index ebcd13208..000000000 --- a/mpi/generic/mpih-add1.c +++ /dev/null @@ -1,66 +0,0 @@ -/* 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 deleted file mode 100644 index e55cb49c1..000000000 --- a/mpi/generic/mpih-lshift.c +++ /dev/null @@ -1,70 +0,0 @@ -/* 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 deleted file mode 100644 index 2c5c4aeb1..000000000 --- a/mpi/generic/mpih-mul1.c +++ /dev/null @@ -1,62 +0,0 @@ -/* 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 deleted file mode 100644 index 89ef6b938..000000000 --- a/mpi/generic/mpih-mul2.c +++ /dev/null @@ -1,67 +0,0 @@ -/* 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 deleted file mode 100644 index ac473a0d7..000000000 --- a/mpi/generic/mpih-mul3.c +++ /dev/null @@ -1,68 +0,0 @@ -/* 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 deleted file mode 100644 index 7aefc59ec..000000000 --- a/mpi/generic/mpih-rshift.c +++ /dev/null @@ -1,69 +0,0 @@ -/* 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 deleted file mode 100644 index 2230457c2..000000000 --- a/mpi/generic/mpih-sub1.c +++ /dev/null @@ -1,66 +0,0 @@ -/* 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 deleted file mode 100644 index de71011d7..000000000 --- a/mpi/generic/udiv-w-sdiv.c +++ /dev/null @@ -1,134 +0,0 @@ -/* 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 deleted file mode 100644 index 5a2d5fd97..000000000 --- a/mpi/hppa/README +++ /dev/null @@ -1,84 +0,0 @@ -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 deleted file mode 100644 index 7f24205d3..000000000 --- a/mpi/hppa/distfiles +++ /dev/null @@ -1,7 +0,0 @@ -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 deleted file mode 100644 index fbe93ed7f..000000000 --- a/mpi/hppa/mpih-add1.S +++ /dev/null @@ -1,73 +0,0 @@ -/* 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 deleted file mode 100644 index 0c4de141b..000000000 --- a/mpi/hppa/mpih-lshift.S +++ /dev/null @@ -1,78 +0,0 @@ -/* 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 deleted file mode 100644 index d7e691b49..000000000 --- a/mpi/hppa/mpih-rshift.S +++ /dev/null @@ -1,74 +0,0 @@ -/* 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 deleted file mode 100644 index c1e20d55b..000000000 --- a/mpi/hppa/mpih-sub1.S +++ /dev/null @@ -1,81 +0,0 @@ -/* 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 deleted file mode 100644 index a2024ba17..000000000 --- a/mpi/hppa/udiv-qrnnd.S +++ /dev/null @@ -1,299 +0,0 @@ -/* 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 deleted file mode 100644 index d68227ac7..000000000 --- a/mpi/hppa1.1/distfiles +++ /dev/null @@ -1,5 +0,0 @@ -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 deleted file mode 100644 index d1272a76b..000000000 --- a/mpi/hppa1.1/mpih-mul1.S +++ /dev/null @@ -1,116 +0,0 @@ -/* 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 deleted file mode 100644 index 18c4dfe03..000000000 --- a/mpi/hppa1.1/mpih-mul2.S +++ /dev/null @@ -1,118 +0,0 @@ -/* 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 deleted file mode 100644 index c5b3925ee..000000000 --- a/mpi/hppa1.1/mpih-mul3.S +++ /dev/null @@ -1,128 +0,0 @@ -/* 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 deleted file mode 100644 index a086822a8..000000000 --- a/mpi/hppa1.1/udiv-qrnnd.S +++ /dev/null @@ -1,92 +0,0 @@ -/* 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 deleted file mode 100644 index 88d2a30c7..000000000 --- a/mpi/i386/distfiles +++ /dev/null @@ -1,9 +0,0 @@ -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 deleted file mode 100644 index cc96014c5..000000000 --- a/mpi/i386/mpih-add1.S +++ /dev/null @@ -1,119 +0,0 @@ -/* 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 deleted file mode 100644 index 9233824fb..000000000 --- a/mpi/i386/mpih-lshift.S +++ /dev/null @@ -1,97 +0,0 @@ -/* 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 deleted file mode 100644 index a5f83a50a..000000000 --- a/mpi/i386/mpih-mul1.S +++ /dev/null @@ -1,87 +0,0 @@ -/* 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 deleted file mode 100644 index 6b6c80605..000000000 --- a/mpi/i386/mpih-mul2.S +++ /dev/null @@ -1,89 +0,0 @@ -/* 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 deleted file mode 100644 index 81e1e432c..000000000 --- a/mpi/i386/mpih-mul3.S +++ /dev/null @@ -1,89 +0,0 @@ -/* 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 deleted file mode 100644 index 43afecec4..000000000 --- a/mpi/i386/mpih-rshift.S +++ /dev/null @@ -1,100 +0,0 @@ -/* 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 deleted file mode 100644 index 9f0dbd8ba..000000000 --- a/mpi/i386/mpih-sub1.S +++ /dev/null @@ -1,120 +0,0 @@ -/* 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 deleted file mode 100644 index b656166cb..000000000 --- a/mpi/i386/syntax.h +++ /dev/null @@ -1,69 +0,0 @@ -/* 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 deleted file mode 100644 index d73b08268..000000000 --- a/mpi/i586/README +++ /dev/null @@ -1,26 +0,0 @@ -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 deleted file mode 100644 index 8f821fbfb..000000000 --- a/mpi/i586/distfiles +++ /dev/null @@ -1,9 +0,0 @@ -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 deleted file mode 100644 index bf9ba2757..000000000 --- a/mpi/i586/mpih-add1.S +++ /dev/null @@ -1,136 +0,0 @@ -/* 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 deleted file mode 100644 index 366f92944..000000000 --- a/mpi/i586/mpih-lshift.S +++ /dev/null @@ -1,232 +0,0 @@ -/* 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 deleted file mode 100644 index 198782564..000000000 --- a/mpi/i586/mpih-mul1.S +++ /dev/null @@ -1,92 +0,0 @@ -/* 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 deleted file mode 100644 index 39c0bbdae..000000000 --- a/mpi/i586/mpih-mul2.S +++ /dev/null @@ -1,96 +0,0 @@ -/* 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 deleted file mode 100644 index 6c1414f66..000000000 --- a/mpi/i586/mpih-mul3.S +++ /dev/null @@ -1,96 +0,0 @@ -/* 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 deleted file mode 100644 index aeacb689c..000000000 --- a/mpi/i586/mpih-rshift.S +++ /dev/null @@ -1,231 +0,0 @@ -/* 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 deleted file mode 100644 index 7d3045d65..000000000 --- a/mpi/i586/mpih-sub1.S +++ /dev/null @@ -1,145 +0,0 @@ -/* 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 deleted file mode 100644 index c0f845c5f..000000000 --- a/mpi/longlong.h +++ /dev/null @@ -1,1557 +0,0 @@ -/* 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 deleted file mode 100644 index 4c0967b84..000000000 --- a/mpi/m68k/distfiles +++ /dev/null @@ -1,8 +0,0 @@ -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 deleted file mode 100644 index fc7df9fa3..000000000 --- a/mpi/m68k/mc68020/distfiles +++ /dev/null @@ -1,3 +0,0 @@ -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 deleted file mode 100644 index c24305d12..000000000 --- a/mpi/m68k/mc68020/mpih-mul1.S +++ /dev/null @@ -1,107 +0,0 @@ -/* 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 deleted file mode 100644 index 2684d7d17..000000000 --- a/mpi/m68k/mc68020/mpih-mul2.S +++ /dev/null @@ -1,97 +0,0 @@ -/* 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 deleted file mode 100644 index c03115238..000000000 --- a/mpi/m68k/mc68020/mpih-mul3.S +++ /dev/null @@ -1,100 +0,0 @@ -/* 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 deleted file mode 100644 index c294f9d34..000000000 --- a/mpi/m68k/mpih-add1.S +++ /dev/null @@ -1,95 +0,0 @@ -/* 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 deleted file mode 100644 index 2256828f8..000000000 --- a/mpi/m68k/mpih-lshift.S +++ /dev/null @@ -1,167 +0,0 @@ -/* 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 deleted file mode 100644 index e9c20d22f..000000000 --- a/mpi/m68k/mpih-rshift.S +++ /dev/null @@ -1,165 +0,0 @@ -/* 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 deleted file mode 100644 index b5de0b96a..000000000 --- a/mpi/m68k/mpih-sub1.S +++ /dev/null @@ -1,94 +0,0 @@ -/* 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 deleted file mode 100644 index ad27a32ba..000000000 --- a/mpi/m68k/syntax.h +++ /dev/null @@ -1,188 +0,0 @@ -/* 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 deleted file mode 100644 index e94b2c746..000000000 --- a/mpi/mips3/README +++ /dev/null @@ -1,23 +0,0 @@ -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 deleted file mode 100644 index 85260fc8e..000000000 --- a/mpi/mips3/distfiles +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100644 index 2d9a9c1f2..000000000 --- a/mpi/mips3/mpi-asm-defs.h +++ /dev/null @@ -1,10 +0,0 @@ -/* 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 deleted file mode 100644 index d3ea91d10..000000000 --- a/mpi/mips3/mpih-add1.S +++ /dev/null @@ -1,125 +0,0 @@ -/* 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 deleted file mode 100644 index 7eca648d1..000000000 --- a/mpi/mips3/mpih-lshift.S +++ /dev/null @@ -1,98 +0,0 @@ -/* 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 deleted file mode 100644 index 0562f4f59..000000000 --- a/mpi/mips3/mpih-mul1.S +++ /dev/null @@ -1,90 +0,0 @@ -/* 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 deleted file mode 100644 index de5635538..000000000 --- a/mpi/mips3/mpih-mul2.S +++ /dev/null @@ -1,102 +0,0 @@ -/* 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 deleted file mode 100644 index 960c5c274..000000000 --- a/mpi/mips3/mpih-mul3.S +++ /dev/null @@ -1,102 +0,0 @@ -/* 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 deleted file mode 100644 index 2229c504e..000000000 --- a/mpi/mips3/mpih-rshift.S +++ /dev/null @@ -1,96 +0,0 @@ -/* 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 deleted file mode 100644 index d23ff9bd2..000000000 --- a/mpi/mips3/mpih-sub1.S +++ /dev/null @@ -1,126 +0,0 @@ -/* 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 deleted file mode 100644 index d8bd46b85..000000000 --- a/mpi/mpi-add.c +++ /dev/null @@ -1,248 +0,0 @@ -/* 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 deleted file mode 100644 index da9d0091d..000000000 --- a/mpi/mpi-bit.c +++ /dev/null @@ -1,256 +0,0 @@ -/* 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 deleted file mode 100644 index 083edbf8a..000000000 --- a/mpi/mpi-cmp.c +++ /dev/null @@ -1,75 +0,0 @@ -/* 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 deleted file mode 100644 index f29493e68..000000000 --- a/mpi/mpi-div.c +++ /dev/null @@ -1,323 +0,0 @@ -/* 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 deleted file mode 100644 index 6f384cea7..000000000 --- a/mpi/mpi-gcd.c +++ /dev/null @@ -1,55 +0,0 @@ -/* 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.h b/mpi/mpi-inline.h deleted file mode 100644 index db2c6a970..000000000 --- a/mpi/mpi-inline.h +++ /dev/null @@ -1,128 +0,0 @@ -/* 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 deleted file mode 100644 index 4676fcd59..000000000 --- a/mpi/mpi-internal.h +++ /dev/null @@ -1,260 +0,0 @@ -/* 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 deleted file mode 100644 index bc4d589ff..000000000 --- a/mpi/mpi-inv.c +++ /dev/null @@ -1,268 +0,0 @@ -/* 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 deleted file mode 100644 index 9a186103a..000000000 --- a/mpi/mpi-mpow.c +++ /dev/null @@ -1,100 +0,0 @@ -/* 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 deleted file mode 100644 index 97e08ec83..000000000 --- a/mpi/mpi-mul.c +++ /dev/null @@ -1,216 +0,0 @@ -/* 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 deleted file mode 100644 index 8fcce5c47..000000000 --- a/mpi/mpi-pow.c +++ /dev/null @@ -1,296 +0,0 @@ -/* 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 deleted file mode 100644 index c76f4bb0a..000000000 --- a/mpi/mpi-scan.c +++ /dev/null @@ -1,140 +0,0 @@ -/* 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 deleted file mode 100644 index d5ce99971..000000000 --- a/mpi/mpicoder.c +++ /dev/null @@ -1,474 +0,0 @@ -/* 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 deleted file mode 100644 index 4c12c715a..000000000 --- a/mpi/mpih-cmp.c +++ /dev/null @@ -1,63 +0,0 @@ -/* 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 deleted file mode 100644 index 1e962a158..000000000 --- a/mpi/mpih-div.c +++ /dev/null @@ -1,536 +0,0 @@ -/* 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 deleted file mode 100644 index 397ec6066..000000000 --- a/mpi/mpih-mul.c +++ /dev/null @@ -1,529 +0,0 @@ -/* 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 deleted file mode 100644 index fdbd354f2..000000000 --- a/mpi/mpiutil.c +++ /dev/null @@ -1,470 +0,0 @@ -/* 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 deleted file mode 100644 index fece94310..000000000 --- a/mpi/pa7100/distfiles +++ /dev/null @@ -1,3 +0,0 @@ -mpih-lshift.S -mpih-rshift.S - diff --git a/mpi/pa7100/mpih-lshift.S b/mpi/pa7100/mpih-lshift.S deleted file mode 100644 index 55b48faef..000000000 --- a/mpi/pa7100/mpih-lshift.S +++ /dev/null @@ -1,97 +0,0 @@ -/* 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 deleted file mode 100644 index 81906f9f8..000000000 --- a/mpi/pa7100/mpih-rshift.S +++ /dev/null @@ -1,93 +0,0 @@ -/* 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 deleted file mode 100644 index e664c8db6..000000000 --- a/mpi/power/distfiles +++ /dev/null @@ -1,7 +0,0 @@ -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 deleted file mode 100644 index ae8b1a60e..000000000 --- a/mpi/power/mpih-add1.S +++ /dev/null @@ -1,87 +0,0 @@ -/* 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 deleted file mode 100644 index 07eb929d1..000000000 --- a/mpi/power/mpih-lshift.S +++ /dev/null @@ -1,65 +0,0 @@ -/* 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 deleted file mode 100644 index 214dbce9c..000000000 --- a/mpi/power/mpih-mul1.S +++ /dev/null @@ -1,116 +0,0 @@ -/* 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 deleted file mode 100644 index 571d54e9e..000000000 --- a/mpi/power/mpih-mul2.S +++ /dev/null @@ -1,131 +0,0 @@ -/* 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 deleted file mode 100644 index 192c6f4c4..000000000 --- a/mpi/power/mpih-mul3.S +++ /dev/null @@ -1,136 +0,0 @@ -/* 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 deleted file mode 100644 index 3214f869e..000000000 --- a/mpi/power/mpih-rshift.S +++ /dev/null @@ -1,65 +0,0 @@ -/* 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 deleted file mode 100644 index d7703ee9d..000000000 --- a/mpi/power/mpih-sub1.S +++ /dev/null @@ -1,89 +0,0 @@ -/* 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 deleted file mode 100644 index af10d795b..000000000 --- a/mpi/powerpc32/distfiles +++ /dev/null @@ -1,9 +0,0 @@ -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 deleted file mode 100644 index d8f78da02..000000000 --- a/mpi/powerpc32/mpih-add1.S +++ /dev/null @@ -1,137 +0,0 @@ -/* 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 deleted file mode 100644 index 4e5da5b7f..000000000 --- a/mpi/powerpc32/mpih-lshift.S +++ /dev/null @@ -1,199 +0,0 @@ -/* 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 deleted file mode 100644 index 9f251f10c..000000000 --- a/mpi/powerpc32/mpih-mul1.S +++ /dev/null @@ -1,121 +0,0 @@ -/* 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 deleted file mode 100644 index b562ea699..000000000 --- a/mpi/powerpc32/mpih-mul2.S +++ /dev/null @@ -1,128 +0,0 @@ -/* 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 deleted file mode 100644 index 3b813f9f2..000000000 --- a/mpi/powerpc32/mpih-mul3.S +++ /dev/null @@ -1,131 +0,0 @@ -/* 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 deleted file mode 100644 index 4a826b41a..000000000 --- a/mpi/powerpc32/mpih-rshift.S +++ /dev/null @@ -1,132 +0,0 @@ -/* 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 deleted file mode 100644 index 89028649a..000000000 --- a/mpi/powerpc32/mpih-sub1.S +++ /dev/null @@ -1,133 +0,0 @@ -/* 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 deleted file mode 100644 index 64d9c8611..000000000 --- a/mpi/powerpc32/syntax.h +++ /dev/null @@ -1,75 +0,0 @@ -/* 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 deleted file mode 100644 index e69de29bb..000000000 diff --git a/mpi/sparc32/distfiles b/mpi/sparc32/distfiles deleted file mode 100644 index 95ff42882..000000000 --- a/mpi/sparc32/distfiles +++ /dev/null @@ -1,6 +0,0 @@ - -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 deleted file mode 100644 index 8cd6db628..000000000 --- a/mpi/sparc32/mpih-add1.S +++ /dev/null @@ -1,240 +0,0 @@ -/* 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 deleted file mode 100644 index 2099574ff..000000000 --- a/mpi/sparc32/mpih-lshift.S +++ /dev/null @@ -1,98 +0,0 @@ -/* 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 deleted file mode 100644 index b20dba92a..000000000 --- a/mpi/sparc32/mpih-rshift.S +++ /dev/null @@ -1,94 +0,0 @@ -/* 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 deleted file mode 100644 index e4028a61d..000000000 --- a/mpi/sparc32/udiv.S +++ /dev/null @@ -1,198 +0,0 @@ -/* 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 deleted file mode 100644 index 5789f35b3..000000000 --- a/mpi/sparc32v8/distfiles +++ /dev/null @@ -1,5 +0,0 @@ - -mpih-mul1.S -mpih-mul2.S -mpih-mul3.S - diff --git a/mpi/sparc32v8/mpih-mul1.S b/mpi/sparc32v8/mpih-mul1.S deleted file mode 100644 index 52c911aa8..000000000 --- a/mpi/sparc32v8/mpih-mul1.S +++ /dev/null @@ -1,112 +0,0 @@ -/* 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 deleted file mode 100644 index 641b76ade..000000000 --- a/mpi/sparc32v8/mpih-mul2.S +++ /dev/null @@ -1,135 +0,0 @@ -/* 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 deleted file mode 100644 index b11e05a14..000000000 --- a/mpi/sparc32v8/mpih-mul3.S +++ /dev/null @@ -1,70 +0,0 @@ -/* 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 deleted file mode 100644 index 5506c419b..000000000 --- a/mpi/supersparc/distfiles +++ /dev/null @@ -1,3 +0,0 @@ - -udiv.S - diff --git a/mpi/supersparc/udiv.S b/mpi/supersparc/udiv.S deleted file mode 100644 index 9a1234806..000000000 --- a/mpi/supersparc/udiv.S +++ /dev/null @@ -1,121 +0,0 @@ -/* 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 index f5c44f19d..127a5b075 100644 --- a/po/ChangeLog +++ b/po/ChangeLog @@ -1,620 +1,76 @@ -2006-07-27 Werner Koch <wk@g10code.com> +2005-11-23 Werner Koch <wk@g10code.com> - * nb.po: New. + * de.po: Updated. -2006-07-03 Werner Koch <wk@g10code.com> +2005-08-01 Werner Koch <wk@g10code.com> - * zh_TW.po: Updated, albeit a copy from last year. + * de.po: Converted to utf-8; fixed a few umlaut problems. - * zh_CN.po: Updated. +2005-04-21 Werner Koch <wk@g10code.com> -2006-06-27 Werner Koch <wk@g10code.com> + * de.po: Fixed all fuzzies and untranslated strings. - * de.po: Fixed misleading translation. Thanks to Olav Seyfarth. +2005-01-04 Werner Koch <wk@g10code.com> -2005-10-06 Werner Koch <wk@g10code.com> + * de.po: Updated. - * POTFILES.in: s/g10.c/gpg.c/. +2004-10-22 Werner Koch <wk@g10code.com> -2005-07-26 Werner Koch <wk@g10code.com> + * POTFILES.in: Removed sc-investigate.c - * zh_TW.po, fr.po, cs.po: Updated. +2004-10-04 Werner Koch <wk@g10code.com> -2005-07-19 Werner Koch <wk@g10code.com> + * de.po: Typo fixes. - * 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> +2004-09-30 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> +2004-09-30 Werner Koch <wk@g10code.com> - * de.po: Updated some fuzzys. + * de.po: Updated. -2003-10-25 Werner Koch <wk@gnupg.org> + * POTFILES.in: Add more files. - * Makevars: New. +2004-07-22 Werner Koch <wk@g10code.de> -2003-10-25 gettextize <bug-gnu-gettext@gnu.org> + * de.po: Updated. - * 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. +2004-04-06 Werner Koch <wk@gnupg.org> -2003-10-10 Werner Koch <wk@gnupg.org> + * Makevars (DOMAIN): Init from PACKAGE_GT - * POTFILES.in (cipher/primegen.c): Added. +2003-12-09 Werner Koch <wk@gnupg.org> -2003-05-26 David Shaw <dshaw@jabberwocky.com> + * Makevars (MSGID_BUGS_ADDRESS): New. - * POTFILES.in: Added a couple of missing source files. Noted by - Pascal Hartig and Walter Koch. (From wk on stable branch) +2003-04-29 Werner Koch <wk@gnupg.org> -2002-10-18 Werner Koch <wk@gnupg.org> + * LINUGAS: NEW. - * POTFILES.in (hkp.c): Removed. +2003-04-29 gettextize <bug-gnu-gettext@gnu.org> -2002-09-12 Werner Koch <wk@gnupg.org> + * Rules-quot: New file, from gettext-0.11.5. + * boldquot.sed: New file, from gettext-0.11.5. + * en@boldquot.header: New file, from gettext-0.11.5. + * en@quot.header: New file, from gettext-0.11.5. + * insert-header.sin: New file, from gettext-0.11.5. + * quot.sed: New file, from gettext-0.11.5. + * remove-potcdate.sin: New file, from gettext-0.11.5. - * tr.po, el.po: Updated. +2002-08-21 Werner Koch <wk@gnupg.org> -2002-08-23 gettextize <bug-gnu-utils@gnu.org> + * de.po: Updated the translation. - * Makefile.in.in: Upgrade to gettext-0.10.40. +2002-08-10 Werner Koch <wk@gnupg.org> -2002-08-04 Werner Koch <wk@gnupg.org> + * Makefile.in.in: Installed from gettext-0.10.40. + * POTFILES.in: New. + * de.po: New. - * 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. + Copyright 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 @@ -623,5 +79,5 @@ Fri Mar 13 09:43:19 1998 Werner Koch (wk@isil.d.shuttle.de) 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 index bd8b5b70e..2d1cafec8 100644 --- a/po/LINGUAS +++ b/po/LINGUAS @@ -1,16 +1,5 @@ -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 +# Set of available languages. +de + + + diff --git a/po/LINGUAS.contrib b/po/LINGUAS.contrib deleted file mode 100644 index 15f2b6f4a..000000000 --- a/po/LINGUAS.contrib +++ /dev/null @@ -1,4 +0,0 @@ -# these are languages files for which we don't have a proper disclaimer - -nl.po - diff --git a/po/Makevars b/po/Makevars index 814803feb..b99cd466c 100644 --- a/po/Makevars +++ b/po/Makevars @@ -1,7 +1,7 @@ # Makefile variables for PO directory in any package using GNU gettext. # Usually the message domain is the same as the package name. -DOMAIN = $(PACKAGE) +DOMAIN = gnupg2 # These two variables depend on the location of this directory. subdir = po @@ -34,9 +34,8 @@ COPYRIGHT_HOLDER = Free Software Foundation, Inc. # 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 +MSGID_BUGS_ADDRESS = translations@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 index a190ab780..eb5711ddb 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -1,60 +1,40 @@ -# List of source files containing translatable strings for GnuPG -# Copyright (c) 1998, 2003, 2004 Free Software Foundation, Inc. +# List of files with translatable strings. -cipher/cast5.c -cipher/md.c -cipher/primegen.c -cipher/random.c -cipher/rndegd.c -cipher/rndlinux.c +agent/gpg-agent.c +agent/protect-tool.c +agent/divert-scd.c +agent/genkey.c +agent/query.c +agent/trustlist.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 +common/sysutils.c +common/simple-pwquery.c -util/argparse.c -util/errors.c -util/logger.c -util/miscutil.c -util/secmem.c +jnlib/argparse.c +jnlib/logging.c +kbx/kbxutil.c + +scd/scdaemon.c +scd/app-openpgp.c +scd/app-nks.c + +sm/base64.c +sm/call-agent.c +sm/call-dirmngr.c +sm/certdump.c +sm/certlist.c +sm/certchain.c +sm/decrypt.c +sm/delete.c +sm/encrypt.c +sm/gpgsm.c +sm/import.c +sm/keydb.c +sm/keylist.c +sm/sign.c +sm/verify.c +sm/qualified.c + +tools/gpgconf.c +tools/gpgconf-comp.c diff --git a/po/be.po b/po/be.po deleted file mode 100644 index 380940c6d..000000000 --- a/po/be.po +++ /dev/null @@ -1,6105 +0,0 @@ -# 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-07-28 11:12+0200\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:1003 g10/gpg.c:3461 g10/import.c:195 g10/keygen.c:2385 -#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:342 -#: 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:1002 g10/keygen.c:2864 -#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:263 -#: g10/openfile.c:357 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:320 -#, c-format -msgid "armor: %s\n" -msgstr "" - -#: g10/armor.c:359 -msgid "invalid armor header: " -msgstr "" - -#: g10/armor.c:370 -msgid "armor header: " -msgstr "" - -#: g10/armor.c:381 -msgid "invalid clearsig header\n" -msgstr "" - -#: g10/armor.c:433 -msgid "nested clear text signatures\n" -msgstr "" - -#: g10/armor.c:568 -#, fuzzy -msgid "unexpected armor: " -msgstr "нечаканыя даньні" - -#: g10/armor.c:580 -msgid "invalid dash escaped line: " -msgstr "" - -#: g10/armor.c:734 g10/armor.c:1343 -#, c-format -msgid "invalid radix64 character %02X skipped\n" -msgstr "" - -#: g10/armor.c:777 -msgid "premature eof (no CRC)\n" -msgstr "" - -#: g10/armor.c:811 -msgid "premature eof (in CRC)\n" -msgstr "" - -#: g10/armor.c:819 -msgid "malformed CRC\n" -msgstr "" - -#: g10/armor.c:823 g10/armor.c:1380 -#, fuzzy, c-format -msgid "CRC error; %06lX - %06lX\n" -msgstr "памылка CRC; %06lx - %06lx\n" - -#: g10/armor.c:843 -msgid "premature eof (in trailer)\n" -msgstr "" - -#: g10/armor.c:847 -msgid "error in trailer line\n" -msgstr "" - -#: g10/armor.c:1158 -msgid "no valid OpenPGP data found.\n" -msgstr "" - -#: g10/armor.c:1163 -#, c-format -msgid "invalid armor: line longer than %d characters\n" -msgstr "" - -#: g10/armor.c:1167 -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:280 -#, 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:3826 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:3387 g10/keyserver.c:1700 -#: 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:2349 g10/keyserver.c:1714 -#: 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:67 g10/mainproc.c:293 -#, c-format -msgid "%s encrypted data\n" -msgstr "" - -#: g10/encr-data.c:69 g10/mainproc.c:297 -#, c-format -msgid "encrypted with unknown algorithm %d\n" -msgstr "" - -#: g10/encr-data.c:93 -msgid "" -"WARNING: message was encrypted with a weak key in the symmetric cipher.\n" -msgstr "" - -#: g10/encr-data.c:104 -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:415 -#, 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:375 -msgid "" -"@Commands:\n" -" " -msgstr "" -"@Загады:\n" -" " - -#: g10/gpg.c:377 -msgid "|[file]|make a signature" -msgstr "|[файл]|зрабіць подпіс" - -#: g10/gpg.c:378 -msgid "|[file]|make a clear text signature" -msgstr "|[файл]|зрабіць чысты тэкставы подпіс" - -#: g10/gpg.c:379 -msgid "make a detached signature" -msgstr "зрабіць адчэплены подпіс" - -#: g10/gpg.c:380 -msgid "encrypt data" -msgstr "зашыфраваць даньні" - -#: g10/gpg.c:382 -msgid "encryption only with symmetric cipher" -msgstr "шыфраваньне толькі сымэтрычнымі шыфрамі" - -#: g10/gpg.c:384 -msgid "decrypt data (default)" -msgstr "разшыфраваць даньні (дапомна)" - -#: g10/gpg.c:386 -msgid "verify a signature" -msgstr "праверыць подпіс" - -#: g10/gpg.c:388 -msgid "list keys" -msgstr "паказаць сьпіс ключоў" - -#: g10/gpg.c:390 -msgid "list keys and signatures" -msgstr "паказаць сьпіс ключоў і подпісаў" - -#: g10/gpg.c:391 -#, fuzzy -msgid "list and check key signatures" -msgstr "праверыць подпісы ключа" - -#: g10/gpg.c:392 -msgid "list keys and fingerprints" -msgstr "паказаць ключы й адбіткі пальцаў" - -#: g10/gpg.c:393 -msgid "list secret keys" -msgstr "паказаць сакрэтныя ключы" - -#: g10/gpg.c:394 -msgid "generate a new key pair" -msgstr "стварыць новую пару ключоў" - -#: g10/gpg.c:395 -msgid "remove keys from the public keyring" -msgstr "выдаліць ключы са зьвязку грамадскіх ключоў" - -#: g10/gpg.c:397 -msgid "remove keys from the secret keyring" -msgstr "выдаліць ключы са зьвязку сакрэтных ключоў" - -#: g10/gpg.c:398 -msgid "sign a key" -msgstr "падпісаць ключ" - -#: g10/gpg.c:399 -msgid "sign a key locally" -msgstr "падпісаць ключ толькі мясцова" - -#: g10/gpg.c:400 -msgid "sign or edit a key" -msgstr "падпісаць ці рэдагаваць ключ" - -#: g10/gpg.c:401 -msgid "generate a revocation certificate" -msgstr "" - -#: g10/gpg.c:403 -msgid "export keys" -msgstr "экспарт ключоў" - -#: g10/gpg.c:404 -msgid "export keys to a key server" -msgstr "экспартаваць ключы на паслужнік ключоў" - -#: g10/gpg.c:405 -msgid "import keys from a key server" -msgstr "імпартаваць ключы з паслужніка ключоў" - -#: g10/gpg.c:407 -msgid "search for keys on a key server" -msgstr "" - -#: g10/gpg.c:409 -msgid "update all keys from a keyserver" -msgstr "абнавіць усе ключы з паслужніка ключоў" - -#: g10/gpg.c:413 -msgid "import/merge keys" -msgstr "імпартаваць/аб'яднаць ключы" - -#: g10/gpg.c:416 -msgid "print the card status" -msgstr "" - -#: g10/gpg.c:417 -msgid "change data on a card" -msgstr "" - -#: g10/gpg.c:418 -msgid "change a card's PIN" -msgstr "" - -#: g10/gpg.c:426 -msgid "update the trust database" -msgstr "" - -#: g10/gpg.c:433 -msgid "|algo [files]|print message digests" -msgstr "" - -#: g10/gpg.c:437 g10/gpgv.c:71 -msgid "" -"@\n" -"Options:\n" -" " -msgstr "" -"@\n" -"Выбары:\n" -" " - -#: g10/gpg.c:439 -msgid "create ascii armored output" -msgstr "" - -#: g10/gpg.c:441 -msgid "|NAME|encrypt for NAME" -msgstr "|ІМЯ| зашыфраваць для вылучанай асобы" - -#: g10/gpg.c:452 -msgid "use this user-id to sign or decrypt" -msgstr "" - -#: g10/gpg.c:453 -msgid "|N|set compress level N (0 disables)" -msgstr "" - -#: g10/gpg.c:458 -msgid "use canonical text mode" -msgstr "" - -#: g10/gpg.c:472 -msgid "use as output file" -msgstr "выкарыстоўваць у якасьці файла вываду" - -#: g10/gpg.c:474 g10/gpgv.c:73 -msgid "verbose" -msgstr "шматслоўнасьць" - -#: g10/gpg.c:485 -msgid "do not make any changes" -msgstr "не рабіць ніякіх зьменаў" - -#: g10/gpg.c:486 -msgid "prompt before overwriting" -msgstr "пытацца перад перазапісам" - -#: g10/gpg.c:527 -msgid "use strict OpenPGP behavior" -msgstr "" - -#: g10/gpg.c:528 -msgid "generate PGP 2.x compatible messages" -msgstr "" - -#: g10/gpg.c:556 -msgid "" -"@\n" -"(See the man page for a complete listing of all commands and options)\n" -msgstr "" -"@\n" -"(Глядзіце man старонку, для больш поўнага апісаньня ўсіх загадаў і выбараў)\n" - -#: g10/gpg.c:559 -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:757 g10/gpgv.c:98 -msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n" -msgstr "Калі ласка, паведамляйце пра памылкі на <gnupg-bugs@gnu.org>.\n" - -#: g10/gpg.c:774 -msgid "Usage: gpg [options] [files] (-h for help)" -msgstr "Выкарыстаньне: gpg [выбары] [файлы] (-h для даведкі)" - -#: g10/gpg.c:777 -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:788 -msgid "" -"\n" -"Supported algorithms:\n" -msgstr "" -"\n" -"Альгарытмы, якія падтрымліваюцца:\n" - -#: g10/gpg.c:791 -msgid "Pubkey: " -msgstr "" - -#: g10/gpg.c:797 g10/keyedit.c:2310 -msgid "Cipher: " -msgstr "" - -#: g10/gpg.c:803 -msgid "Hash: " -msgstr "" - -#: g10/gpg.c:809 g10/keyedit.c:2356 -msgid "Compression: " -msgstr "" - -#: g10/gpg.c:892 -msgid "usage: gpg [options] " -msgstr "Выкарыстаньне: gpg [выбары] " - -#: g10/gpg.c:1040 -msgid "conflicting commands\n" -msgstr "несумяшчальныя загады\n" - -#: g10/gpg.c:1058 -#, c-format -msgid "no = sign found in group definition `%s'\n" -msgstr "" - -#: g10/gpg.c:1255 -#, c-format -msgid "WARNING: unsafe ownership on homedir `%s'\n" -msgstr "" - -#: g10/gpg.c:1258 -#, c-format -msgid "WARNING: unsafe ownership on configuration file `%s'\n" -msgstr "" - -#: g10/gpg.c:1261 -#, c-format -msgid "WARNING: unsafe ownership on extension `%s'\n" -msgstr "" - -#: g10/gpg.c:1267 -#, c-format -msgid "WARNING: unsafe permissions on homedir `%s'\n" -msgstr "" - -#: g10/gpg.c:1270 -#, c-format -msgid "WARNING: unsafe permissions on configuration file `%s'\n" -msgstr "" - -#: g10/gpg.c:1273 -#, c-format -msgid "WARNING: unsafe permissions on extension `%s'\n" -msgstr "" - -#: g10/gpg.c:1279 -#, c-format -msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n" -msgstr "" - -#: g10/gpg.c:1282 -#, c-format -msgid "" -"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n" -msgstr "" - -#: g10/gpg.c:1285 -#, c-format -msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n" -msgstr "" - -#: g10/gpg.c:1291 -#, c-format -msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n" -msgstr "" - -#: g10/gpg.c:1294 -#, c-format -msgid "" -"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n" -msgstr "" - -#: g10/gpg.c:1297 -#, c-format -msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n" -msgstr "" - -#: g10/gpg.c:1438 -#, fuzzy, c-format -msgid "unknown configuration item `%s'\n" -msgstr "невядомая вэрсыя" - -#: g10/gpg.c:1531 -msgid "display photo IDs during key listings" -msgstr "" - -#: g10/gpg.c:1533 -msgid "show policy URLs during signature listings" -msgstr "" - -#: g10/gpg.c:1535 -msgid "show all notations during signature listings" -msgstr "" - -#: g10/gpg.c:1537 -msgid "show IETF standard notations during signature listings" -msgstr "" - -#: g10/gpg.c:1541 -msgid "show user-supplied notations during signature listings" -msgstr "" - -#: g10/gpg.c:1543 -msgid "show preferred keyserver URLs during signature listings" -msgstr "" - -#: g10/gpg.c:1545 -msgid "show user ID validity during key listings" -msgstr "" - -#: g10/gpg.c:1547 -msgid "show revoked and expired user IDs in key listings" -msgstr "" - -#: g10/gpg.c:1549 -msgid "show revoked and expired subkeys in key listings" -msgstr "" - -#: g10/gpg.c:1551 -msgid "show the keyring name in key listings" -msgstr "" - -#: g10/gpg.c:1553 -msgid "show expiration dates during signature listings" -msgstr "" - -#: g10/gpg.c:1920 -#, c-format -msgid "NOTE: old default options file `%s' ignored\n" -msgstr "" - -#: g10/gpg.c:1962 -#, c-format -msgid "NOTE: no default option file `%s'\n" -msgstr "" - -#: g10/gpg.c:1966 -#, c-format -msgid "option file `%s': %s\n" -msgstr "" - -#: g10/gpg.c:1973 -#, c-format -msgid "reading options from `%s'\n" -msgstr "" - -#: g10/gpg.c:2188 g10/gpg.c:2814 g10/gpg.c:2833 -#, c-format -msgid "NOTE: %s is not for normal use!\n" -msgstr "" - -#: g10/gpg.c:2201 -#, c-format -msgid "cipher extension `%s' not loaded due to unsafe permissions\n" -msgstr "" - -#: g10/gpg.c:2364 g10/gpg.c:2376 -#, fuzzy, c-format -msgid "`%s' is not a valid signature expiration\n" -msgstr "%s - гэта недапушчальнае мноства знакаў\n" - -#: g10/gpg.c:2452 -#, fuzzy, c-format -msgid "`%s' is not a valid character set\n" -msgstr "%s - гэта недапушчальнае мноства знакаў\n" - -#: g10/gpg.c:2476 g10/gpg.c:2663 g10/keyedit.c:4064 -msgid "could not parse keyserver URL\n" -msgstr "" - -#: g10/gpg.c:2488 -#, fuzzy, c-format -msgid "%s:%d: invalid keyserver options\n" -msgstr "%s:%d: недапушчальныя выбары экспартаваньня\n" - -#: g10/gpg.c:2491 -#, fuzzy -msgid "invalid keyserver options\n" -msgstr "недапушчальныя выбары экспартаваньня\n" - -#: g10/gpg.c:2498 -#, c-format -msgid "%s:%d: invalid import options\n" -msgstr "%s:%d: недапушчальныя выбары імпартаваньня\n" - -#: g10/gpg.c:2501 -msgid "invalid import options\n" -msgstr "недапушчальныя выбары імпартаваньня\n" - -#: g10/gpg.c:2508 -#, c-format -msgid "%s:%d: invalid export options\n" -msgstr "%s:%d: недапушчальныя выбары экспартаваньня\n" - -#: g10/gpg.c:2511 -msgid "invalid export options\n" -msgstr "недапушчальныя выбары экспартаваньня\n" - -#: g10/gpg.c:2518 -#, fuzzy, c-format -msgid "%s:%d: invalid list options\n" -msgstr "%s:%d: недапушчальныя выбары імпартаваньня\n" - -#: g10/gpg.c:2521 -#, fuzzy -msgid "invalid list options\n" -msgstr "недапушчальныя выбары імпартаваньня\n" - -#: g10/gpg.c:2529 -msgid "display photo IDs during signature verification" -msgstr "" - -#: g10/gpg.c:2531 -msgid "show policy URLs during signature verification" -msgstr "" - -#: g10/gpg.c:2533 -#, fuzzy -msgid "show all notations during signature verification" -msgstr "%s - гэта недапушчальнае мноства знакаў\n" - -#: g10/gpg.c:2535 -msgid "show IETF standard notations during signature verification" -msgstr "" - -#: g10/gpg.c:2539 -msgid "show user-supplied notations during signature verification" -msgstr "" - -#: g10/gpg.c:2541 -msgid "show preferred keyserver URLs during signature verification" -msgstr "" - -#: g10/gpg.c:2543 -#, fuzzy -msgid "show user ID validity during signature verification" -msgstr "%s - гэта недапушчальнае мноства знакаў\n" - -#: g10/gpg.c:2545 -msgid "show revoked and expired user IDs in signature verification" -msgstr "" - -#: g10/gpg.c:2547 -msgid "validate signatures with PKA data" -msgstr "" - -#: g10/gpg.c:2549 -msgid "elevate the trust of signatures with valid PKA data" -msgstr "" - -#: g10/gpg.c:2556 -#, fuzzy, c-format -msgid "%s:%d: invalid verify options\n" -msgstr "%s:%d: недапушчальныя выбары экспартаваньня\n" - -#: g10/gpg.c:2559 -#, fuzzy -msgid "invalid verify options\n" -msgstr "недапушчальныя выбары экспартаваньня\n" - -#: g10/gpg.c:2566 -#, c-format -msgid "unable to set exec-path to %s\n" -msgstr "" - -#: g10/gpg.c:2729 -#, fuzzy, c-format -msgid "%s:%d: invalid auto-key-locate list\n" -msgstr "%s:%d: недапушчальныя выбары экспартаваньня\n" - -#: g10/gpg.c:2732 -msgid "invalid auto-key-locate list\n" -msgstr "" - -#: g10/gpg.c:2803 -msgid "WARNING: program may create a core file!\n" -msgstr "" - -#: g10/gpg.c:2807 -#, c-format -msgid "WARNING: %s overrides %s\n" -msgstr "" - -#: g10/gpg.c:2816 -#, c-format -msgid "%s not allowed with %s!\n" -msgstr "%s не дазваляецца разам з %s!\n" - -#: g10/gpg.c:2819 -#, c-format -msgid "%s makes no sense with %s!\n" -msgstr "%s ня мае сэнсу разам з %s!\n" - -#: g10/gpg.c:2826 -#, c-format -msgid "NOTE: %s is not available in this version\n" -msgstr "" - -#: g10/gpg.c:2841 -#, fuzzy, c-format -msgid "will not run with insecure memory due to %s\n" -msgstr "запіс у stdout\n" - -#: g10/gpg.c:2855 -msgid "you can only make detached or clear signatures while in --pgp2 mode\n" -msgstr "" - -#: g10/gpg.c:2861 -msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n" -msgstr "" - -#: g10/gpg.c:2867 -msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n" -msgstr "" - -#: g10/gpg.c:2880 -msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n" -msgstr "" - -#: g10/gpg.c:2947 g10/gpg.c:2971 -msgid "selected cipher algorithm is invalid\n" -msgstr "" - -#: g10/gpg.c:2953 g10/gpg.c:2977 -msgid "selected digest algorithm is invalid\n" -msgstr "" - -#: g10/gpg.c:2959 -msgid "selected compression algorithm is invalid\n" -msgstr "" - -#: g10/gpg.c:2965 -msgid "selected certification digest algorithm is invalid\n" -msgstr "" - -#: g10/gpg.c:2980 -msgid "completes-needed must be greater than 0\n" -msgstr "" - -#: g10/gpg.c:2982 -msgid "marginals-needed must be greater than 1\n" -msgstr "" - -#: g10/gpg.c:2984 -msgid "max-cert-depth must be in the range from 1 to 255\n" -msgstr "" - -#: g10/gpg.c:2986 -msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n" -msgstr "" - -#: g10/gpg.c:2988 -msgid "invalid min-cert-level; must be 1, 2, or 3\n" -msgstr "" - -#: g10/gpg.c:2991 -msgid "NOTE: simple S2K mode (0) is strongly discouraged\n" -msgstr "" - -#: g10/gpg.c:2995 -msgid "invalid S2K mode; must be 0, 1 or 3\n" -msgstr "" - -#: g10/gpg.c:3002 -msgid "invalid default preferences\n" -msgstr "недапушчальныя дапомныя перавагі\n" - -#: g10/gpg.c:3011 -msgid "invalid personal cipher preferences\n" -msgstr "" - -#: g10/gpg.c:3015 -msgid "invalid personal digest preferences\n" -msgstr "" - -#: g10/gpg.c:3019 -msgid "invalid personal compress preferences\n" -msgstr "" - -#: g10/gpg.c:3052 -#, fuzzy, c-format -msgid "%s does not yet work with %s\n" -msgstr "%s ня мае сэнсу разам з %s!\n" - -#: g10/gpg.c:3099 -#, c-format -msgid "you may not use cipher algorithm `%s' while in %s mode\n" -msgstr "" - -#: g10/gpg.c:3104 -#, c-format -msgid "you may not use digest algorithm `%s' while in %s mode\n" -msgstr "" - -#: g10/gpg.c:3109 -#, c-format -msgid "you may not use compression algorithm `%s' while in %s mode\n" -msgstr "" - -#: g10/gpg.c:3208 -#, c-format -msgid "failed to initialize the TrustDB: %s\n" -msgstr "" - -#: g10/gpg.c:3219 -msgid "WARNING: recipients (-r) given without using public key encryption\n" -msgstr "" - -#: g10/gpg.c:3230 -msgid "--store [filename]" -msgstr "--store [назва_файла]" - -#: g10/gpg.c:3237 -msgid "--symmetric [filename]" -msgstr "--symmetric [назва_файла]" - -#: g10/gpg.c:3239 -#, fuzzy, c-format -msgid "symmetric encryption of `%s' failed: %s\n" -msgstr "збой падпісаньня: %s\n" - -#: g10/gpg.c:3249 -msgid "--encrypt [filename]" -msgstr "--encrypt [назва_файла]" - -#: g10/gpg.c:3262 -#, fuzzy -msgid "--symmetric --encrypt [filename]" -msgstr "--sign --encrypt [назва_файла]" - -#: g10/gpg.c:3264 -msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n" -msgstr "" - -#: g10/gpg.c:3267 -#, c-format -msgid "you cannot use --symmetric --encrypt while in %s mode\n" -msgstr "" - -#: g10/gpg.c:3285 -msgid "--sign [filename]" -msgstr "--sign [назва_файла]" - -#: g10/gpg.c:3298 -msgid "--sign --encrypt [filename]" -msgstr "--sign --encrypt [назва_файла]" - -#: g10/gpg.c:3313 -#, fuzzy -msgid "--symmetric --sign --encrypt [filename]" -msgstr "--sign --encrypt [назва_файла]" - -#: g10/gpg.c:3315 -msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n" -msgstr "" - -#: g10/gpg.c:3318 -#, c-format -msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n" -msgstr "" - -#: g10/gpg.c:3338 -msgid "--sign --symmetric [filename]" -msgstr "--sign --symmetric [назва_файла]" - -#: g10/gpg.c:3347 -msgid "--clearsign [filename]" -msgstr "--clearsign [назва_файла]" - -#: g10/gpg.c:3372 -msgid "--decrypt [filename]" -msgstr "--decrypt [назва_файла]" - -#: g10/gpg.c:3380 -msgid "--sign-key user-id" -msgstr "--sign-key user-id" - -#: g10/gpg.c:3384 -msgid "--lsign-key user-id" -msgstr "--lsign-key user-id" - -#: g10/gpg.c:3405 -msgid "--edit-key user-id [commands]" -msgstr "--edit-key user-id [загады]" - -#: g10/gpg.c:3476 -msgid "-k[v][v][v][c] [user-id] [keyring]" -msgstr "" - -#: g10/gpg.c:3518 -#, fuzzy, c-format -msgid "keyserver send failed: %s\n" -msgstr "збой падпісаньня: %s\n" - -#: g10/gpg.c:3520 -#, fuzzy, c-format -msgid "keyserver receive failed: %s\n" -msgstr "збой падпісаньня: %s\n" - -#: g10/gpg.c:3522 -#, fuzzy, c-format -msgid "key export failed: %s\n" -msgstr "збой падпісаньня: %s\n" - -#: g10/gpg.c:3533 -#, fuzzy, c-format -msgid "keyserver search failed: %s\n" -msgstr "збой падпісаньня: %s\n" - -#: g10/gpg.c:3543 -#, c-format -msgid "keyserver refresh failed: %s\n" -msgstr "" - -#: g10/gpg.c:3594 -#, c-format -msgid "dearmoring failed: %s\n" -msgstr "" - -#: g10/gpg.c:3602 -#, c-format -msgid "enarmoring failed: %s\n" -msgstr "" - -#: g10/gpg.c:3689 -#, c-format -msgid "invalid hash algorithm `%s'\n" -msgstr "нерэчаісны хэш-альгарытм \"%s\"\n" - -#: g10/gpg.c:3812 -msgid "[filename]" -msgstr "[назва_файла]" - -#: g10/gpg.c:3816 -msgid "Go ahead and type your message ...\n" -msgstr "" - -#: g10/gpg.c:4120 -msgid "the given certification policy URL is invalid\n" -msgstr "" - -#: g10/gpg.c:4122 -msgid "the given signature policy URL is invalid\n" -msgstr "" - -#: g10/gpg.c:4155 -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:3707 -#, 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:266 -#, c-format -msgid "skipping block of type %d\n" -msgstr "" - -#: g10/import.c:275 -#, c-format -msgid "%lu keys processed so far\n" -msgstr "" - -#: g10/import.c:292 -#, c-format -msgid "Total number processed: %lu\n" -msgstr "" - -#: g10/import.c:294 -#, c-format -msgid " skipped new keys: %lu\n" -msgstr "" - -#: g10/import.c:297 -#, c-format -msgid " w/o user IDs: %lu\n" -msgstr "" - -#: g10/import.c:299 -#, c-format -msgid " imported: %lu" -msgstr "" - -#: g10/import.c:305 -#, c-format -msgid " unchanged: %lu\n" -msgstr "" - -#: g10/import.c:307 -#, c-format -msgid " new user IDs: %lu\n" -msgstr "" - -#: g10/import.c:309 -#, c-format -msgid " new subkeys: %lu\n" -msgstr "" - -#: g10/import.c:311 -#, c-format -msgid " new signatures: %lu\n" -msgstr "" - -#: g10/import.c:313 -#, c-format -msgid " new key revocations: %lu\n" -msgstr "" - -#: g10/import.c:315 -#, c-format -msgid " secret keys read: %lu\n" -msgstr "" - -#: g10/import.c:317 -#, c-format -msgid " secret keys imported: %lu\n" -msgstr "" - -#: g10/import.c:319 -#, c-format -msgid " secret keys unchanged: %lu\n" -msgstr "" - -#: g10/import.c:321 -#, c-format -msgid " not imported: %lu\n" -msgstr "" - -#: g10/import.c:323 -#, fuzzy, c-format -msgid " signatures cleaned: %lu\n" -msgstr "Подпіс створаны ў %.*s з выкарыстаньнем %s ID ключа %08lX\n" - -#: g10/import.c:325 -#, c-format -msgid " user IDs cleaned: %lu\n" -msgstr "" - -#: g10/import.c:566 -#, 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:570 -msgid " algorithms on these user IDs:\n" -msgstr "" - -#: g10/import.c:607 -#, c-format -msgid " \"%s\": preference for cipher algorithm %s\n" -msgstr "" - -#: g10/import.c:619 -#, fuzzy, c-format -msgid " \"%s\": preference for digest algorithm %s\n" -msgstr "нерэчаісны хэш-альгарытм \"%s\"\n" - -#: g10/import.c:631 -#, c-format -msgid " \"%s\": preference for compression algorithm %s\n" -msgstr "" - -#: g10/import.c:644 -msgid "it is strongly suggested that you update your preferences and\n" -msgstr "" - -#: g10/import.c:646 -msgid "re-distribute this key to avoid potential algorithm mismatch problems\n" -msgstr "" - -#: g10/import.c:670 -#, c-format -msgid "you can update your preferences with: gpg --edit-key %s updpref save\n" -msgstr "" - -#: g10/import.c:720 g10/import.c:1118 -#, fuzzy, c-format -msgid "key %s: no user ID\n" -msgstr "паказаць сьпіс ключоў і ID карыстальнікаў" - -#: g10/import.c:749 -#, c-format -msgid "key %s: PKS subkey corruption repaired\n" -msgstr "" - -#: g10/import.c:764 -#, fuzzy, c-format -msgid "key %s: accepted non self-signed user ID \"%s\"\n" -msgstr "паказаць сьпіс ключоў і ID карыстальнікаў" - -#: g10/import.c:770 -#, fuzzy, c-format -msgid "key %s: no valid user IDs\n" -msgstr "паказаць сьпіс ключоў і ID карыстальнікаў" - -#: g10/import.c:772 -msgid "this may be caused by a missing self-signature\n" -msgstr "" - -#: g10/import.c:782 g10/import.c:1240 -#, fuzzy, c-format -msgid "key %s: public key not found: %s\n" -msgstr "грамадскі ключ ня знойдзены" - -#: g10/import.c:788 -#, c-format -msgid "key %s: new key - skipped\n" -msgstr "" - -#: g10/import.c:797 -#, c-format -msgid "no writable keyring found: %s\n" -msgstr "" - -#: g10/import.c:802 g10/openfile.c:267 g10/sign.c:831 g10/sign.c:1135 -#, c-format -msgid "writing to `%s'\n" -msgstr "" - -#: g10/import.c:806 g10/import.c:901 g10/import.c:1158 g10/import.c:1301 -#: g10/import.c:2363 g10/import.c:2385 -#, c-format -msgid "error writing keyring `%s': %s\n" -msgstr "" - -#: g10/import.c:825 -#, c-format -msgid "key %s: public key \"%s\" imported\n" -msgstr "" - -#: g10/import.c:849 -#, c-format -msgid "key %s: doesn't match our copy\n" -msgstr "" - -#: g10/import.c:866 g10/import.c:1258 -#, fuzzy, c-format -msgid "key %s: can't locate original keyblock: %s\n" -msgstr "%s: немагчыма стварыць тэчку: %s\n" - -#: g10/import.c:874 g10/import.c:1265 -#, fuzzy, c-format -msgid "key %s: can't read original keyblock: %s\n" -msgstr "%s: немагчыма стварыць тэчку: %s\n" - -#: g10/import.c:911 -#, c-format -msgid "key %s: \"%s\" 1 new user ID\n" -msgstr "" - -#: g10/import.c:914 -#, c-format -msgid "key %s: \"%s\" %d new user IDs\n" -msgstr "" - -#: g10/import.c:917 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new signature\n" -msgstr "паказаць сьпіс ключоў і подпісаў" - -#: g10/import.c:920 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new signatures\n" -msgstr "паказаць сьпіс ключоў і подпісаў" - -#: g10/import.c:923 -#, c-format -msgid "key %s: \"%s\" 1 new subkey\n" -msgstr "" - -#: g10/import.c:926 -#, c-format -msgid "key %s: \"%s\" %d new subkeys\n" -msgstr "" - -#: g10/import.c:929 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signature cleaned\n" -msgstr "паказаць сьпіс ключоў і подпісаў" - -#: g10/import.c:932 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signatures cleaned\n" -msgstr "паказаць сьпіс ключоў і подпісаў" - -#: g10/import.c:935 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d user ID cleaned\n" -msgstr "паказаць сьпіс ключоў і подпісаў" - -#: g10/import.c:938 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d user IDs cleaned\n" -msgstr "паказаць сьпіс ключоў і подпісаў" - -#: g10/import.c:961 -#, c-format -msgid "key %s: \"%s\" not changed\n" -msgstr "" - -#: g10/import.c:1124 -#, c-format -msgid "key %s: secret key with invalid cipher %d - skipped\n" -msgstr "" - -#: g10/import.c:1135 -#, fuzzy -msgid "importing secret keys not allowed\n" -msgstr "сакрэтны ключ недаступны" - -#: g10/import.c:1152 g10/import.c:2378 -#, c-format -msgid "no default secret keyring: %s\n" -msgstr "" - -#: g10/import.c:1163 -#, c-format -msgid "key %s: secret key imported\n" -msgstr "" - -#: g10/import.c:1193 -#, fuzzy, c-format -msgid "key %s: already in secret keyring\n" -msgstr "выдаліць ключы са зьвязку сакрэтных ключоў" - -#: g10/import.c:1203 -#, fuzzy, c-format -msgid "key %s: secret key not found: %s\n" -msgstr "збой падпісаньня: %s\n" - -#: g10/import.c:1233 -#, c-format -msgid "key %s: no public key - can't apply revocation certificate\n" -msgstr "" - -#: g10/import.c:1276 -#, c-format -msgid "key %s: invalid revocation certificate: %s - rejected\n" -msgstr "" - -#: g10/import.c:1308 -#, c-format -msgid "key %s: \"%s\" revocation certificate imported\n" -msgstr "" - -#: g10/import.c:1374 -#, c-format -msgid "key %s: no user ID for signature\n" -msgstr "" - -#: g10/import.c:1389 -#, fuzzy, c-format -msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n" -msgstr "грамадскі ключ ня знойдзены" - -#: g10/import.c:1391 -#, fuzzy, c-format -msgid "key %s: invalid self-signature on user ID \"%s\"\n" -msgstr "паказаць сьпіс ключоў і ID карыстальнікаў" - -#: g10/import.c:1409 -#, c-format -msgid "key %s: no subkey for key binding\n" -msgstr "" - -#: g10/import.c:1420 g10/import.c:1470 -#, c-format -msgid "key %s: unsupported public key algorithm\n" -msgstr "" - -#: g10/import.c:1422 -#, c-format -msgid "key %s: invalid subkey binding\n" -msgstr "" - -#: g10/import.c:1437 -#, c-format -msgid "key %s: removed multiple subkey binding\n" -msgstr "" - -#: g10/import.c:1459 -#, c-format -msgid "key %s: no subkey for key revocation\n" -msgstr "" - -#: g10/import.c:1472 -#, fuzzy, c-format -msgid "key %s: invalid subkey revocation\n" -msgstr "%s:%d: недапушчальныя выбары экспартаваньня\n" - -#: g10/import.c:1487 -#, c-format -msgid "key %s: removed multiple subkey revocation\n" -msgstr "" - -#: g10/import.c:1529 -#, fuzzy, c-format -msgid "key %s: skipped user ID \"%s\"\n" -msgstr "паказаць сьпіс ключоў і ID карыстальнікаў" - -#: g10/import.c:1550 -#, c-format -msgid "key %s: skipped subkey\n" -msgstr "" - -#: g10/import.c:1577 -#, fuzzy, c-format -msgid "key %s: non exportable signature (class 0x%02X) - skipped\n" -msgstr "Ключ абаронены.\n" - -#: g10/import.c:1587 -#, c-format -msgid "key %s: revocation certificate at wrong place - skipped\n" -msgstr "" - -#: g10/import.c:1604 -#, c-format -msgid "key %s: invalid revocation certificate: %s - skipped\n" -msgstr "" - -#: g10/import.c:1618 -#, c-format -msgid "key %s: subkey signature in wrong place - skipped\n" -msgstr "" - -#: g10/import.c:1626 -#, c-format -msgid "key %s: unexpected signature class (0x%02X) - skipped\n" -msgstr "" - -#: g10/import.c:1726 -#, c-format -msgid "key %s: duplicated user ID detected - merged\n" -msgstr "" - -#: g10/import.c:1788 -#, c-format -msgid "WARNING: key %s may be revoked: fetching revocation key %s\n" -msgstr "" - -#: g10/import.c:1802 -#, c-format -msgid "WARNING: key %s may be revoked: revocation key %s not present.\n" -msgstr "" - -#: g10/import.c:1861 -#, c-format -msgid "key %s: \"%s\" revocation certificate added\n" -msgstr "" - -#: g10/import.c:1895 -#, fuzzy, c-format -msgid "key %s: direct key signature added\n" -msgstr "%s: тэчка створана\n" - -#: g10/import.c:2284 -msgid "NOTE: a key's S/N does not match the card's one\n" -msgstr "" - -#: g10/import.c:2292 -msgid "NOTE: primary key is online and stored on card\n" -msgstr "" - -#: g10/import.c:2294 -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:4783 g10/keyedit.c:4874 g10/keyedit.c:4938 -#: g10/keyedit.c:4999 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:3346 -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:3249 -#, fuzzy, c-format -msgid "User ID \"%s\": already clean\n" -msgstr "грамадскі ключ ня знойдзены" - -#: g10/keyedit.c:3341 -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:3352 -msgid "You may not add a designated revoker to a PGP 2.x-style key.\n" -msgstr "" - -#: g10/keyedit.c:3372 -msgid "Enter the user ID of the designated revoker: " -msgstr "" - -#: g10/keyedit.c:3397 -msgid "cannot appoint a PGP 2.x style key as a designated revoker\n" -msgstr "" - -#: g10/keyedit.c:3412 -msgid "you cannot appoint a key as its own designated revoker\n" -msgstr "" - -#: g10/keyedit.c:3434 -msgid "this key has already been designated as a revoker\n" -msgstr "" - -#: g10/keyedit.c:3453 -msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n" -msgstr "" - -#: g10/keyedit.c:3459 -msgid "" -"Are you sure you want to appoint this key as a designated revoker? (y/N) " -msgstr "" - -#: g10/keyedit.c:3520 -msgid "Please remove selections from the secret keys.\n" -msgstr "" - -#: g10/keyedit.c:3526 -#, fuzzy -msgid "Please select at most one subkey.\n" -msgstr "Калі ласка, абярыце від ключа, які Вам патрэбны:\n" - -#: g10/keyedit.c:3530 -msgid "Changing expiration time for a subkey.\n" -msgstr "" - -#: g10/keyedit.c:3533 -msgid "Changing expiration time for the primary key.\n" -msgstr "" - -#: g10/keyedit.c:3579 -msgid "You can't change the expiration date of a v3 key\n" -msgstr "" - -#: g10/keyedit.c:3595 -msgid "No corresponding signature in secret ring\n" -msgstr "" - -#: g10/keyedit.c:3668 -#, fuzzy, c-format -msgid "signing subkey %s is already cross-certified\n" -msgstr "выдаліць ключы са зьвязку сакрэтных ключоў" - -#: g10/keyedit.c:3674 -#, c-format -msgid "subkey %s does not sign and so does not need to be cross-certified\n" -msgstr "" - -#: g10/keyedit.c:3836 -msgid "Please select exactly one user ID.\n" -msgstr "" - -#: g10/keyedit.c:3875 g10/keyedit.c:3985 g10/keyedit.c:4105 g10/keyedit.c:4246 -#, c-format -msgid "skipping v3 self-signature on user ID \"%s\"\n" -msgstr "" - -#: g10/keyedit.c:4046 -msgid "Enter your preferred keyserver URL: " -msgstr "" - -#: g10/keyedit.c:4126 -msgid "Are you sure you want to replace it? (y/N) " -msgstr "" - -#: g10/keyedit.c:4127 -msgid "Are you sure you want to delete it? (y/N) " -msgstr "" - -#: g10/keyedit.c:4189 -msgid "Enter the notation: " -msgstr "" - -#: g10/keyedit.c:4338 -#, fuzzy -msgid "Proceed? (y/N) " -msgstr "Перазапісаць (y/N)?" - -#: g10/keyedit.c:4402 -#, c-format -msgid "No user ID with index %d\n" -msgstr "" - -#: g10/keyedit.c:4460 -#, c-format -msgid "No user ID with hash %s\n" -msgstr "" - -#: g10/keyedit.c:4487 -#, c-format -msgid "No subkey with index %d\n" -msgstr "" - -#: g10/keyedit.c:4622 -#, fuzzy, c-format -msgid "user ID: \"%s\"\n" -msgstr "памылка чытаньня файла" - -#: g10/keyedit.c:4625 g10/keyedit.c:4689 g10/keyedit.c:4732 -#, c-format -msgid "signed by your key %s on %s%s%s\n" -msgstr "" - -#: g10/keyedit.c:4627 g10/keyedit.c:4691 g10/keyedit.c:4734 -msgid " (non-exportable)" -msgstr "" - -#: g10/keyedit.c:4631 -#, c-format -msgid "This signature expired on %s.\n" -msgstr "" - -#: g10/keyedit.c:4635 -msgid "Are you sure you still want to revoke it? (y/N) " -msgstr "" - -#: g10/keyedit.c:4639 -msgid "Create a revocation certificate for this signature? (y/N) " -msgstr "" - -#: g10/keyedit.c:4666 -#, c-format -msgid "You have signed these user IDs on key %s:\n" -msgstr "" - -#: g10/keyedit.c:4692 -msgid " (non-revocable)" -msgstr "" - -#: g10/keyedit.c:4699 -#, c-format -msgid "revoked by your key %s on %s\n" -msgstr "" - -#: g10/keyedit.c:4721 -msgid "You are about to revoke these signatures:\n" -msgstr "" - -#: g10/keyedit.c:4741 -msgid "Really create the revocation certificates? (y/N) " -msgstr "" - -#: g10/keyedit.c:4771 -msgid "no secret key\n" -msgstr "" - -#: g10/keyedit.c:4841 -#, c-format -msgid "user ID \"%s\" is already revoked\n" -msgstr "" - -#: g10/keyedit.c:4858 -#, c-format -msgid "WARNING: a user ID signature is dated %d seconds in the future\n" -msgstr "" - -#: g10/keyedit.c:4922 -#, fuzzy, c-format -msgid "Key %s is already revoked.\n" -msgstr "выдаліць ключы са зьвязку сакрэтных ключоў" - -#: g10/keyedit.c:4984 -#, fuzzy, c-format -msgid "Subkey %s is already revoked.\n" -msgstr "выдаліць ключы са зьвязку сакрэтных ключоў" - -#: g10/keyedit.c:5079 -#, 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:1421 -#, 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:1324 -#, c-format -msgid "sending key %s to %s server %s\n" -msgstr "" - -#: g10/keyserver.c:1328 -#, fuzzy, c-format -msgid "sending key %s to %s\n" -msgstr "грамадскі ключ ня знойдзены" - -#: g10/keyserver.c:1371 -#, c-format -msgid "searching for \"%s\" from %s server %s\n" -msgstr "" - -#: g10/keyserver.c:1374 -#, c-format -msgid "searching for \"%s\" from %s\n" -msgstr "" - -#: g10/keyserver.c:1381 g10/keyserver.c:1477 -#, fuzzy -msgid "no keyserver action!\n" -msgstr "недапушчальныя выбары экспартаваньня\n" - -#: g10/keyserver.c:1429 -#, c-format -msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n" -msgstr "" - -#: g10/keyserver.c:1438 -msgid "keyserver did not send VERSION\n" -msgstr "" - -#: g10/keyserver.c:1500 g10/keyserver.c:2028 -msgid "no keyserver known (use option --keyserver)\n" -msgstr "" - -#: g10/keyserver.c:1506 -msgid "external keyserver calls are not supported in this build\n" -msgstr "" - -#: g10/keyserver.c:1518 -#, c-format -msgid "no handler for keyserver scheme `%s'\n" -msgstr "" - -#: g10/keyserver.c:1523 -#, c-format -msgid "action `%s' not supported with keyserver scheme `%s'\n" -msgstr "" - -#: g10/keyserver.c:1531 -#, c-format -msgid "%s does not support handler version %d\n" -msgstr "" - -#: g10/keyserver.c:1538 -#, fuzzy -msgid "keyserver timed out\n" -msgstr "збой падпісаньня: %s\n" - -#: g10/keyserver.c:1543 -#, fuzzy -msgid "keyserver internal error\n" -msgstr "агульная памылка" - -#: g10/keyserver.c:1552 -#, fuzzy, c-format -msgid "keyserver communications error: %s\n" -msgstr "збой падпісаньня: %s\n" - -#: g10/keyserver.c:1577 g10/keyserver.c:1611 -#, c-format -msgid "\"%s\" not a key ID: skipping\n" -msgstr "" - -#: g10/keyserver.c:1870 -#, c-format -msgid "WARNING: unable to refresh key %s via %s: %s\n" -msgstr "" - -#: g10/keyserver.c:1892 -#, c-format -msgid "refreshing 1 key from %s\n" -msgstr "" - -#: g10/keyserver.c:1894 -#, c-format -msgid "refreshing %d keys from %s\n" -msgstr "" - -#: g10/keyserver.c:1950 -#, fuzzy, c-format -msgid "WARNING: unable to fetch URI %s: %s\n" -msgstr "немагчыма адкрыць %s: %s\n" - -#: g10/keyserver.c:1956 -#, 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:305 -#, c-format -msgid "assuming signed data in `%s'\n" -msgstr "" - -#: g10/openfile.c:384 -#, c-format -msgid "new configuration file `%s' created\n" -msgstr "" - -#: g10/openfile.c:386 -#, c-format -msgid "WARNING: options in `%s' are not yet active during this run\n" -msgstr "" - -#: g10/openfile.c:418 -#, 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:1157 -#, 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:968 -msgid "can't query passphrase in batch mode\n" -msgstr "" - -#: g10/passphrase.c:812 g10/passphrase.c:973 -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:977 -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:127 g10/skclist.c:191 -msgid "key is not flagged as insecure - can't use it with the faked RNG!\n" -msgstr "" - -#: g10/skclist.c:158 -#, c-format -msgid "skipped \"%s\": duplicated\n" -msgstr "" - -#: g10/skclist.c:166 g10/skclist.c:176 g10/skclist.c:185 -#, fuzzy, c-format -msgid "skipped \"%s\": %s\n" -msgstr "грамадскі ключ ня знойдзены" - -#: g10/skclist.c:171 -msgid "skipped: secret key already present\n" -msgstr "" - -#: g10/skclist.c:186 -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:350 -msgid "operation is not possible without initialized secure memory\n" -msgstr "дзеяньне немагчымае без распачатае бясьпечнае памяці\n" - -#: util/secmem.c:351 -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 "User ID \"%s\": %d signature removed.\n" -#~ msgstr "паказаць сьпіс ключоў і подпісаў" - -#, fuzzy -#~ msgid "User ID \"%s\": %d signatures removed.\n" -#~ msgstr "паказаць сьпіс ключоў і подпісаў" - -#, 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/ca.po b/po/ca.po deleted file mode 100644 index f156143ad..000000000 --- a/po/ca.po +++ /dev/null @@ -1,7570 +0,0 @@ -# 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-07-28 11:12+0200\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:1003 g10/gpg.c:3461 g10/import.c:195 g10/keygen.c:2385 -#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:342 -#: 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:1002 g10/keygen.c:2864 -#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:263 -#: g10/openfile.c:357 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:320 -#, c-format -msgid "armor: %s\n" -msgstr "armadura: %s\n" - -#: g10/armor.c:359 -msgid "invalid armor header: " -msgstr "la capçalera d'armadura és invàlida: " - -#: g10/armor.c:370 -msgid "armor header: " -msgstr "capçalera d'armadura: " - -#: g10/armor.c:381 -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:433 -msgid "nested clear text signatures\n" -msgstr "signatures en text pla imbricades\n" - -# FIXME: un-indiar. jm -#: g10/armor.c:568 -#, fuzzy -msgid "unexpected armor: " -msgstr "armadura inesperada:" - -#: g10/armor.c:580 -msgid "invalid dash escaped line: " -msgstr "la línia escapada amb guió és invàlida: " - -#: g10/armor.c:734 g10/armor.c:1343 -#, 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:777 -msgid "premature eof (no CRC)\n" -msgstr "fi de fitxer prematur (no CRC)\n" - -#: g10/armor.c:811 -msgid "premature eof (in CRC)\n" -msgstr "fi de fitxer prematur (en CRC)\n" - -#: g10/armor.c:819 -msgid "malformed CRC\n" -msgstr "CRC malformat\n" - -#: g10/armor.c:823 g10/armor.c:1380 -#, fuzzy, c-format -msgid "CRC error; %06lX - %06lX\n" -msgstr "error de CRC; %06lx - %06lx\n" - -#: g10/armor.c:843 -#, fuzzy -msgid "premature eof (in trailer)\n" -msgstr "fí de fitxer prematur (al final)\n" - -#: g10/armor.c:847 -msgid "error in trailer line\n" -msgstr "error en l'última línia\n" - -#: g10/armor.c:1158 -msgid "no valid OpenPGP data found.\n" -msgstr "no s'han trobat dades OpenPGP vàlides.\n" - -#: g10/armor.c:1163 -#, 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:1167 -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:280 -#, 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:3826 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:3387 g10/keyserver.c:1700 -#: 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:2349 g10/keyserver.c:1714 -#: 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:67 g10/mainproc.c:293 -#, c-format -msgid "%s encrypted data\n" -msgstr "dades xifrades amb %s\n" - -#: g10/encr-data.c:69 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:93 -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:104 -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:415 -#, 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:375 -msgid "" -"@Commands:\n" -" " -msgstr "" -"@Ordres:\n" -" " - -#: g10/gpg.c:377 -msgid "|[file]|make a signature" -msgstr "|[fitxer]|crea una signatura" - -#: g10/gpg.c:378 -msgid "|[file]|make a clear text signature" -msgstr "|[fitxer]|crea una signatura en text clar" - -#: g10/gpg.c:379 -msgid "make a detached signature" -msgstr "crea una signatura separada" - -#: g10/gpg.c:380 -msgid "encrypt data" -msgstr "xifra dades" - -#: g10/gpg.c:382 -msgid "encryption only with symmetric cipher" -msgstr "xifra només amb xifratge simètric" - -#: g10/gpg.c:384 -msgid "decrypt data (default)" -msgstr "desxifra dades (predeterminat)" - -#: g10/gpg.c:386 -msgid "verify a signature" -msgstr "verifica una signatura" - -#: g10/gpg.c:388 -msgid "list keys" -msgstr "llista claus" - -#: g10/gpg.c:390 -msgid "list keys and signatures" -msgstr "llista claus i signatures" - -# «de les claus» o «de la clau»? ivb -#: g10/gpg.c:391 -#, fuzzy -msgid "list and check key signatures" -msgstr "comprova les signatures de la claus" - -# «dactilars» o «digitals»? ivb -#: g10/gpg.c:392 -msgid "list keys and fingerprints" -msgstr "llista claus i empremtes digitals" - -#: g10/gpg.c:393 -msgid "list secret keys" -msgstr "llista claus secretes" - -#: g10/gpg.c:394 -msgid "generate a new key pair" -msgstr "genera un nou parell de claus" - -#: g10/gpg.c:395 -msgid "remove keys from the public keyring" -msgstr "elimina claus de l'anell públic" - -#: g10/gpg.c:397 -msgid "remove keys from the secret keyring" -msgstr "elimina claus de l'anell secret" - -#: g10/gpg.c:398 -msgid "sign a key" -msgstr "signa una clau" - -#: g10/gpg.c:399 -msgid "sign a key locally" -msgstr "signa una clau localment" - -#: g10/gpg.c:400 -msgid "sign or edit a key" -msgstr "signa o edita una clau" - -#: g10/gpg.c:401 -msgid "generate a revocation certificate" -msgstr "genera un certificat de revocació" - -#: g10/gpg.c:403 -msgid "export keys" -msgstr "exporta claus" - -#: g10/gpg.c:404 -msgid "export keys to a key server" -msgstr "exporta claus a un servidor de claus" - -#: g10/gpg.c:405 -msgid "import keys from a key server" -msgstr "importa claus d'un servidor de claus" - -#: g10/gpg.c:407 -msgid "search for keys on a key server" -msgstr "cerca claus en un servidor de claus" - -#: g10/gpg.c:409 -msgid "update all keys from a keyserver" -msgstr "actualitza totes les claus des d'un servidor de claus" - -#: g10/gpg.c:413 -msgid "import/merge keys" -msgstr "importa/fon claus" - -#: g10/gpg.c:416 -msgid "print the card status" -msgstr "" - -#: g10/gpg.c:417 -msgid "change data on a card" -msgstr "" - -#: g10/gpg.c:418 -msgid "change a card's PIN" -msgstr "" - -#: g10/gpg.c:426 -msgid "update the trust database" -msgstr "actualitza la base de dades de confiança" - -#: g10/gpg.c:433 -msgid "|algo [files]|print message digests" -msgstr "|algo [fitxers]|imprimeix resums de missatges" - -#: g10/gpg.c:437 g10/gpgv.c:71 -msgid "" -"@\n" -"Options:\n" -" " -msgstr "" -"@\n" -"Opcions:\n" -" " - -#: g10/gpg.c:439 -msgid "create ascii armored output" -msgstr "crea eixida amb armadura ascii" - -#: g10/gpg.c:441 -msgid "|NAME|encrypt for NAME" -msgstr "|NOM|xifra per a NOM" - -#: g10/gpg.c:452 -msgid "use this user-id to sign or decrypt" -msgstr "usa aquest id per a signar o desxifrar" - -#: g10/gpg.c:453 -msgid "|N|set compress level N (0 disables)" -msgstr "|N|nivell de compressió N (0 no comprimeix)" - -#: g10/gpg.c:458 -msgid "use canonical text mode" -msgstr "usa el mode de text canònic" - -#: g10/gpg.c:472 -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:474 g10/gpgv.c:73 -msgid "verbose" -msgstr "detall" - -#: g10/gpg.c:485 -msgid "do not make any changes" -msgstr "no fa cap canvi" - -#: g10/gpg.c:486 -msgid "prompt before overwriting" -msgstr "pregunta abans de sobreescriure" - -#: g10/gpg.c:527 -msgid "use strict OpenPGP behavior" -msgstr "" - -#: g10/gpg.c:528 -msgid "generate PGP 2.x compatible messages" -msgstr "" - -#: g10/gpg.c:556 -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:559 -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:757 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:774 -msgid "Usage: gpg [options] [files] (-h for help)" -msgstr "Forma d'ús: gpg [opcions] [fitxers] (-h per a veure l'ajuda)" - -#: g10/gpg.c:777 -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:788 -msgid "" -"\n" -"Supported algorithms:\n" -msgstr "" -"\n" -"Algoritmes suportats:\n" - -#: g10/gpg.c:791 -msgid "Pubkey: " -msgstr "Clau pública: " - -#: g10/gpg.c:797 g10/keyedit.c:2310 -msgid "Cipher: " -msgstr "Xifratge: " - -#: g10/gpg.c:803 -msgid "Hash: " -msgstr "Dispersió: " - -#: g10/gpg.c:809 g10/keyedit.c:2356 -msgid "Compression: " -msgstr "Compressió: " - -#: g10/gpg.c:892 -msgid "usage: gpg [options] " -msgstr "forma d'ús: gpg [opcions] " - -#: g10/gpg.c:1040 -msgid "conflicting commands\n" -msgstr "les ordres entren en conflicte\n" - -#: g10/gpg.c:1058 -#, 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:1255 -#, 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:1258 -#, 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:1261 -#, 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:1267 -#, 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:1270 -#, 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:1273 -#, 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:1279 -#, 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:1282 -#, 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:1285 -#, 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:1291 -#, 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:1294 -#, 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:1297 -#, 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:1438 -#, fuzzy, c-format -msgid "unknown configuration item `%s'\n" -msgstr "s'ha creat el nou fitxer d'opcions «%s»\n" - -#: g10/gpg.c:1531 -msgid "display photo IDs during key listings" -msgstr "" - -#: g10/gpg.c:1533 -msgid "show policy URLs during signature listings" -msgstr "" - -#: g10/gpg.c:1535 -#, fuzzy -msgid "show all notations during signature listings" -msgstr "No hi ha cap signatura corresponent en l'anell secret\n" - -#: g10/gpg.c:1537 -msgid "show IETF standard notations during signature listings" -msgstr "" - -#: g10/gpg.c:1541 -msgid "show user-supplied notations during signature listings" -msgstr "" - -#: g10/gpg.c:1543 -#, 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:1545 -msgid "show user ID validity during key listings" -msgstr "" - -#: g10/gpg.c:1547 -msgid "show revoked and expired user IDs in key listings" -msgstr "" - -#: g10/gpg.c:1549 -msgid "show revoked and expired subkeys in key listings" -msgstr "" - -#: g10/gpg.c:1551 -#, fuzzy -msgid "show the keyring name in key listings" -msgstr "mostra en quin anell de claus està una clau llistada" - -#: g10/gpg.c:1553 -#, fuzzy -msgid "show expiration dates during signature listings" -msgstr "No hi ha cap signatura corresponent en l'anell secret\n" - -#: g10/gpg.c:1920 -#, 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:1962 -#, c-format -msgid "NOTE: no default option file `%s'\n" -msgstr "NOTA: no existeix el fitxer d'opcions predeterminades «%s»\n" - -#: g10/gpg.c:1966 -#, c-format -msgid "option file `%s': %s\n" -msgstr "fitxer d'opcions «%s»: %s\n" - -#: g10/gpg.c:1973 -#, c-format -msgid "reading options from `%s'\n" -msgstr "s'estan llegint opcions de «%s»\n" - -#: g10/gpg.c:2188 g10/gpg.c:2814 g10/gpg.c:2833 -#, c-format -msgid "NOTE: %s is not for normal use!\n" -msgstr "NOTA: %s no és per a ús normal!\n" - -#: g10/gpg.c:2201 -#, 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:2364 g10/gpg.c:2376 -#, 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:2452 -#, 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:2476 g10/gpg.c:2663 g10/keyedit.c:4064 -#, 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:2488 -#, fuzzy, c-format -msgid "%s:%d: invalid keyserver options\n" -msgstr "%s:%d opcions d'exportació no vàlides\n" - -#: g10/gpg.c:2491 -#, fuzzy -msgid "invalid keyserver options\n" -msgstr "opcions d'exportació no vàlides\n" - -#: g10/gpg.c:2498 -#, c-format -msgid "%s:%d: invalid import options\n" -msgstr "%s:%d: opcions d'importanció no vàlides\n" - -#: g10/gpg.c:2501 -msgid "invalid import options\n" -msgstr "opcions d'importació no vàlides\n" - -#: g10/gpg.c:2508 -#, c-format -msgid "%s:%d: invalid export options\n" -msgstr "%s:%d opcions d'exportació no vàlides\n" - -#: g10/gpg.c:2511 -msgid "invalid export options\n" -msgstr "opcions d'exportació no vàlides\n" - -#: g10/gpg.c:2518 -#, fuzzy, c-format -msgid "%s:%d: invalid list options\n" -msgstr "%s:%d: opcions d'importanció no vàlides\n" - -#: g10/gpg.c:2521 -#, fuzzy -msgid "invalid list options\n" -msgstr "opcions d'importació no vàlides\n" - -#: g10/gpg.c:2529 -msgid "display photo IDs during signature verification" -msgstr "" - -#: g10/gpg.c:2531 -msgid "show policy URLs during signature verification" -msgstr "" - -#: g10/gpg.c:2533 -#, fuzzy -msgid "show all notations during signature verification" -msgstr "%s no és un joc de caràcters vàlid\n" - -#: g10/gpg.c:2535 -msgid "show IETF standard notations during signature verification" -msgstr "" - -#: g10/gpg.c:2539 -msgid "show user-supplied notations during signature verification" -msgstr "" - -#: g10/gpg.c:2541 -#, 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:2543 -#, fuzzy -msgid "show user ID validity during signature verification" -msgstr "%s no és un joc de caràcters vàlid\n" - -#: g10/gpg.c:2545 -msgid "show revoked and expired user IDs in signature verification" -msgstr "" - -#: g10/gpg.c:2547 -msgid "validate signatures with PKA data" -msgstr "" - -#: g10/gpg.c:2549 -msgid "elevate the trust of signatures with valid PKA data" -msgstr "" - -#: g10/gpg.c:2556 -#, fuzzy, c-format -msgid "%s:%d: invalid verify options\n" -msgstr "%s:%d opcions d'exportació no vàlides\n" - -#: g10/gpg.c:2559 -#, fuzzy -msgid "invalid verify options\n" -msgstr "opcions d'exportació no vàlides\n" - -#: g10/gpg.c:2566 -#, 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:2729 -#, 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:2732 -msgid "invalid auto-key-locate list\n" -msgstr "" - -#: g10/gpg.c:2803 -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:2807 -#, c-format -msgid "WARNING: %s overrides %s\n" -msgstr "AVÍS: %s té preferència sobre %s\n" - -#: g10/gpg.c:2816 -#, c-format -msgid "%s not allowed with %s!\n" -msgstr "%s no és permés amb %s!\n" - -#: g10/gpg.c:2819 -#, c-format -msgid "%s makes no sense with %s!\n" -msgstr "%s no té sentit amb %s!\n" - -#: g10/gpg.c:2826 -#, 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:2841 -#, 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:2855 -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:2861 -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:2867 -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:2880 -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:2947 g10/gpg.c:2971 -msgid "selected cipher algorithm is invalid\n" -msgstr "l'algorisme de xifratge triat no és vàlid\n" - -#: g10/gpg.c:2953 g10/gpg.c:2977 -msgid "selected digest algorithm is invalid\n" -msgstr "l'algorisme de resum seleccionat no és vàlid\n" - -#: g10/gpg.c:2959 -#, fuzzy -msgid "selected compression algorithm is invalid\n" -msgstr "l'algorisme de xifratge triat no és vàlid\n" - -#: g10/gpg.c:2965 -msgid "selected certification digest algorithm is invalid\n" -msgstr "l'algorisme de resum de certificació seleccionat no és vàlid\n" - -#: g10/gpg.c:2980 -msgid "completes-needed must be greater than 0\n" -msgstr "completes-needed ha de ser major que 0\n" - -#: g10/gpg.c:2982 -msgid "marginals-needed must be greater than 1\n" -msgstr "marginals-needed ha de ser major que 1\n" - -#: g10/gpg.c:2984 -#, 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:2986 -#, 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:2988 -#, 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:2991 -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:2995 -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:3002 -msgid "invalid default preferences\n" -msgstr "les preferències per defecte són invàlides\n" - -#: g10/gpg.c:3011 -msgid "invalid personal cipher preferences\n" -msgstr "les preferències personals de xifrat són invàlides\n" - -#: g10/gpg.c:3015 -msgid "invalid personal digest preferences\n" -msgstr "les preferències personals de digest són invàlides\n" - -#: g10/gpg.c:3019 -msgid "invalid personal compress preferences\n" -msgstr "les preferències personals de compressió són invàlides\n" - -#: g10/gpg.c:3052 -#, c-format -msgid "%s does not yet work with %s\n" -msgstr "%s encara no funciona amb %s\n" - -#: g10/gpg.c:3099 -#, 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:3104 -#, 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:3109 -#, 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:3208 -#, 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:3219 -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:3230 -msgid "--store [filename]" -msgstr "--store [nom_del_fitxer]" - -#: g10/gpg.c:3237 -msgid "--symmetric [filename]" -msgstr "--symmetric [nom_del_fitxer]" - -#: g10/gpg.c:3239 -#, fuzzy, c-format -msgid "symmetric encryption of `%s' failed: %s\n" -msgstr "ha fallat el desxifratge: %s\n" - -#: g10/gpg.c:3249 -msgid "--encrypt [filename]" -msgstr "--encrypt [nom_del_fitxer]" - -#: g10/gpg.c:3262 -#, fuzzy -msgid "--symmetric --encrypt [filename]" -msgstr "--sign --encrypt [nom_del_fitxer]" - -#: g10/gpg.c:3264 -msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n" -msgstr "" - -#: g10/gpg.c:3267 -#, 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:3285 -msgid "--sign [filename]" -msgstr "--sign [nom_del_fitxer]" - -#: g10/gpg.c:3298 -msgid "--sign --encrypt [filename]" -msgstr "--sign --encrypt [nom_del_fitxer]" - -#: g10/gpg.c:3313 -#, fuzzy -msgid "--symmetric --sign --encrypt [filename]" -msgstr "--sign --encrypt [nom_del_fitxer]" - -#: g10/gpg.c:3315 -msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n" -msgstr "" - -#: g10/gpg.c:3318 -#, 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:3338 -msgid "--sign --symmetric [filename]" -msgstr "--sign --symmetric [nom_del_fitxer]" - -#: g10/gpg.c:3347 -msgid "--clearsign [filename]" -msgstr "--clearsign [nom_del_fitxer]" - -#: g10/gpg.c:3372 -msgid "--decrypt [filename]" -msgstr "--decrypt [nom_del_fitxer]" - -#: g10/gpg.c:3380 -msgid "--sign-key user-id" -msgstr "--sign-key user-id" - -#: g10/gpg.c:3384 -msgid "--lsign-key user-id" -msgstr "--lsign-key user-id" - -#: g10/gpg.c:3405 -msgid "--edit-key user-id [commands]" -msgstr "--edit-key user-id [ordres]" - -#: g10/gpg.c:3476 -msgid "-k[v][v][v][c] [user-id] [keyring]" -msgstr "-k[v][v][v][c] [user-id] [anell]" - -#: g10/gpg.c:3518 -#, c-format -msgid "keyserver send failed: %s\n" -msgstr "l'enviament al servidor de claus ha fallat: %s\n" - -#: g10/gpg.c:3520 -#, c-format -msgid "keyserver receive failed: %s\n" -msgstr "la recepció des del servidor de claus ha fallat: %s\n" - -#: g10/gpg.c:3522 -#, c-format -msgid "key export failed: %s\n" -msgstr "l'exportació de la clau ha fallat: %s\n" - -#: g10/gpg.c:3533 -#, c-format -msgid "keyserver search failed: %s\n" -msgstr "ha fallat la cerca al servidor de claus: %s\n" - -#: g10/gpg.c:3543 -#, c-format -msgid "keyserver refresh failed: %s\n" -msgstr "ha fallat el refresc des del servidor de claus: %s\n" - -#: g10/gpg.c:3594 -#, c-format -msgid "dearmoring failed: %s\n" -msgstr "no s'ha pogut llevar l'armadura: %s\n" - -#: g10/gpg.c:3602 -#, c-format -msgid "enarmoring failed: %s\n" -msgstr "no s'ha pogut crear l'armadura: %s\n" - -#: g10/gpg.c:3689 -#, c-format -msgid "invalid hash algorithm `%s'\n" -msgstr "l'algoritme de dispersió és invàlid «%s»\n" - -#: g10/gpg.c:3812 -msgid "[filename]" -msgstr "[nom_del_fitxer]" - -#: g10/gpg.c:3816 -msgid "Go ahead and type your message ...\n" -msgstr "Endavant, escriviu el missatge...\n" - -#: g10/gpg.c:4120 -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:4122 -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:4155 -#, 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:3707 -#, 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:266 -#, c-format -msgid "skipping block of type %d\n" -msgstr "es descarta un bloc de tipus %d\n" - -#: g10/import.c:275 -#, fuzzy, c-format -msgid "%lu keys processed so far\n" -msgstr "fins ara s'han processat %lu claus\n" - -#: g10/import.c:292 -#, c-format -msgid "Total number processed: %lu\n" -msgstr "Nombre total processat: %lu\n" - -#: g10/import.c:294 -#, c-format -msgid " skipped new keys: %lu\n" -msgstr " claus noves descartades: %lu\n" - -#: g10/import.c:297 -#, c-format -msgid " w/o user IDs: %lu\n" -msgstr " sense ID: %lu\n" - -#: g10/import.c:299 -#, c-format -msgid " imported: %lu" -msgstr " importades: %lu" - -#: g10/import.c:305 -#, c-format -msgid " unchanged: %lu\n" -msgstr " no modificades: %lu\n" - -#: g10/import.c:307 -#, c-format -msgid " new user IDs: %lu\n" -msgstr " ID d'usuaris nous: %lu\n" - -#: g10/import.c:309 -#, c-format -msgid " new subkeys: %lu\n" -msgstr " subclaus noves: %lu\n" - -#: g10/import.c:311 -#, c-format -msgid " new signatures: %lu\n" -msgstr " signatures noves: %lu\n" - -#: g10/import.c:313 -#, c-format -msgid " new key revocations: %lu\n" -msgstr " noves revocacions: %lu\n" - -#: g10/import.c:315 -#, c-format -msgid " secret keys read: %lu\n" -msgstr " claus privades llegides: %lu\n" - -#: g10/import.c:317 -#, c-format -msgid " secret keys imported: %lu\n" -msgstr "claus privades importades: %lu\n" - -#: g10/import.c:319 -#, c-format -msgid " secret keys unchanged: %lu\n" -msgstr "claus privades no canviades: %lu\n" - -#: g10/import.c:321 -#, c-format -msgid " not imported: %lu\n" -msgstr " importades: %lu\n" - -#: g10/import.c:323 -#, fuzzy, c-format -msgid " signatures cleaned: %lu\n" -msgstr " signatures noves: %lu\n" - -#: g10/import.c:325 -#, fuzzy, c-format -msgid " user IDs cleaned: %lu\n" -msgstr " claus privades llegides: %lu\n" - -#: g10/import.c:566 -#, 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:570 -#, fuzzy -msgid " algorithms on these user IDs:\n" -msgstr "Heu signat els següents ID d'usuari:\n" - -#: g10/import.c:607 -#, c-format -msgid " \"%s\": preference for cipher algorithm %s\n" -msgstr "" - -#: g10/import.c:619 -#, fuzzy, c-format -msgid " \"%s\": preference for digest algorithm %s\n" -msgstr "signatura %s, algorisme de resum %s\n" - -#: g10/import.c:631 -#, c-format -msgid " \"%s\": preference for compression algorithm %s\n" -msgstr "" - -#: g10/import.c:644 -msgid "it is strongly suggested that you update your preferences and\n" -msgstr "" - -#: g10/import.c:646 -msgid "re-distribute this key to avoid potential algorithm mismatch problems\n" -msgstr "" - -#: g10/import.c:670 -#, c-format -msgid "you can update your preferences with: gpg --edit-key %s updpref save\n" -msgstr "" - -#: g10/import.c:720 g10/import.c:1118 -#, fuzzy, c-format -msgid "key %s: no user ID\n" -msgstr "clau %08lX: sense ID\n" - -#: g10/import.c:749 -#, fuzzy, c-format -msgid "key %s: PKS subkey corruption repaired\n" -msgstr "clau %08lX: corrupció de la subclau HKP reparada\n" - -#: g10/import.c:764 -#, 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:770 -#, fuzzy, c-format -msgid "key %s: no valid user IDs\n" -msgstr "clau %08lX: l'ID no és vàlid\n" - -#: g10/import.c:772 -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:782 g10/import.c:1240 -#, 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:788 -#, fuzzy, c-format -msgid "key %s: new key - skipped\n" -msgstr "clau %08lX: clau nova - es descarta \n" - -#: g10/import.c:797 -#, c-format -msgid "no writable keyring found: %s\n" -msgstr "no s'ha trobat cap anell escrivible: %s\n" - -#: g10/import.c:802 g10/openfile.c:267 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:806 g10/import.c:901 g10/import.c:1158 g10/import.c:1301 -#: g10/import.c:2363 g10/import.c:2385 -#, c-format -msgid "error writing keyring `%s': %s\n" -msgstr "error mentre s'escrivia l'anell «%s»: %s\n" - -#: g10/import.c:825 -#, 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:849 -#, 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:866 g10/import.c:1258 -#, 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:874 g10/import.c:1265 -#, 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:911 -#, 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:914 -#, 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:917 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new signature\n" -msgstr "clau %08lX: «%s» 1 signatura nova\n" - -#: g10/import.c:920 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new signatures\n" -msgstr "clau %08lX: «%s» %d signatures noves\n" - -#: g10/import.c:923 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new subkey\n" -msgstr "clau %08lX: «%s» 1 subclau nova\n" - -#: g10/import.c:926 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new subkeys\n" -msgstr "clau %08lX: «%s» %d subclaus noves\n" - -#: g10/import.c:929 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signature cleaned\n" -msgstr "clau %08lX: «%s» %d signatures noves\n" - -#: g10/import.c:932 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signatures cleaned\n" -msgstr "clau %08lX: «%s» %d signatures noves\n" - -#: g10/import.c:935 -#, 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:938 -#, 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:961 -#, fuzzy, c-format -msgid "key %s: \"%s\" not changed\n" -msgstr "clau %08lX: «%s» no ha estat modificada\n" - -#: g10/import.c:1124 -#, 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:1135 -#, fuzzy -msgid "importing secret keys not allowed\n" -msgstr "s'està escrivint la clau secreta a «%s»\n" - -#: g10/import.c:1152 g10/import.c:2378 -#, c-format -msgid "no default secret keyring: %s\n" -msgstr "no hi ha anell secret predeterminat: %s\n" - -#: g10/import.c:1163 -#, fuzzy, c-format -msgid "key %s: secret key imported\n" -msgstr "clau %08lX: s'ha importat la clau secreta\n" - -#: g10/import.c:1193 -#, 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:1203 -#, 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:1233 -#, 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:1276 -#, 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:1308 -#, 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:1374 -#, 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:1389 -#, 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:1391 -#, 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:1409 -#, 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:1420 g10/import.c:1470 -#, 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:1422 -#, fuzzy, c-format -msgid "key %s: invalid subkey binding\n" -msgstr "clau %08lX: l'enllaç de subclau és invàlid\n" - -#: g10/import.c:1437 -#, 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:1459 -#, 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:1472 -#, fuzzy, c-format -msgid "key %s: invalid subkey revocation\n" -msgstr "clau %08lX: Subclau de revocació no vàlida\n" - -#: g10/import.c:1487 -#, 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:1529 -#, fuzzy, c-format -msgid "key %s: skipped user ID \"%s\"\n" -msgstr "clau %08lX: es descarta l'ID d'usuari '" - -#: g10/import.c:1550 -#, fuzzy, c-format -msgid "key %s: skipped subkey\n" -msgstr "clau %08lX: es descarta la subclau\n" - -#: g10/import.c:1577 -#, 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:1587 -#, 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:1604 -#, 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:1618 -#, 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:1626 -#, 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:1726 -#, 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:1788 -#, 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:1802 -#, 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:1861 -#, 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:1895 -#, 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:2284 -#, 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:2292 -#, 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:2294 -#, 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:4783 g10/keyedit.c:4874 g10/keyedit.c:4938 -#: g10/keyedit.c:4999 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:3346 -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:3249 -#, fuzzy, c-format -msgid "User ID \"%s\": already clean\n" -msgstr "l'ID d'usuari «%s» ja està revocat\n" - -#: g10/keyedit.c:3341 -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:3352 -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:3372 -msgid "Enter the user ID of the designated revoker: " -msgstr "Introduïu l'ID d'usuari del revocador designat: " - -#: g10/keyedit.c:3397 -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:3412 -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:3434 -#, 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:3453 -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:3459 -#, 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:3520 -msgid "Please remove selections from the secret keys.\n" -msgstr "Per favor, elimineu les seleccions de les claus secretes.\n" - -#: g10/keyedit.c:3526 -#, fuzzy -msgid "Please select at most one subkey.\n" -msgstr "Per favor, seleccioneu com a molt una clau secundària.\n" - -#: g10/keyedit.c:3530 -#, 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:3533 -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:3579 -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:3595 -msgid "No corresponding signature in secret ring\n" -msgstr "No hi ha cap signatura corresponent en l'anell secret\n" - -#: g10/keyedit.c:3668 -#, 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:3674 -#, c-format -msgid "subkey %s does not sign and so does not need to be cross-certified\n" -msgstr "" - -#: g10/keyedit.c:3836 -msgid "Please select exactly one user ID.\n" -msgstr "Heu de seleccionar exactament un ID.\n" - -#: g10/keyedit.c:3875 g10/keyedit.c:3985 g10/keyedit.c:4105 g10/keyedit.c:4246 -#, 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:4046 -msgid "Enter your preferred keyserver URL: " -msgstr "" - -#: g10/keyedit.c:4126 -#, fuzzy -msgid "Are you sure you want to replace it? (y/N) " -msgstr "Esteu segur que encara voleu utilitzarla (s/N)? " - -#: g10/keyedit.c:4127 -#, fuzzy -msgid "Are you sure you want to delete it? (y/N) " -msgstr "Esteu segur que encara voleu utilitzarla (s/N)? " - -#: g10/keyedit.c:4189 -#, fuzzy -msgid "Enter the notation: " -msgstr "Notació de signatura: " - -#: g10/keyedit.c:4338 -#, fuzzy -msgid "Proceed? (y/N) " -msgstr "Voleu sobreescriure? (s/N) " - -#: g10/keyedit.c:4402 -#, c-format -msgid "No user ID with index %d\n" -msgstr "No hi ha cap ID amb l'índex %d\n" - -#: g10/keyedit.c:4460 -#, 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:4487 -#, fuzzy, c-format -msgid "No subkey with index %d\n" -msgstr "No hi ha cap ID amb l'índex %d\n" - -#: g10/keyedit.c:4622 -#, fuzzy, c-format -msgid "user ID: \"%s\"\n" -msgstr "ID d'usuari: «" - -#: g10/keyedit.c:4625 g10/keyedit.c:4689 g10/keyedit.c:4732 -#, 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:4627 g10/keyedit.c:4691 g10/keyedit.c:4734 -msgid " (non-exportable)" -msgstr " (no-exportable)" - -#: g10/keyedit.c:4631 -#, c-format -msgid "This signature expired on %s.\n" -msgstr "Aquesta signatura va caducar el %s.\n" - -#: g10/keyedit.c:4635 -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:4639 -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:4666 -#, 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:4692 -#, fuzzy -msgid " (non-revocable)" -msgstr " (no-exportable)" - -#: g10/keyedit.c:4699 -#, fuzzy, c-format -msgid "revoked by your key %s on %s\n" -msgstr " revocat per %08lX el %s\n" - -#: g10/keyedit.c:4721 -msgid "You are about to revoke these signatures:\n" -msgstr "Esteu a punt de revocar aquestes signatures:\n" - -# (s/N)? ivb -#: g10/keyedit.c:4741 -msgid "Really create the revocation certificates? (y/N) " -msgstr "Realment voleu crear els certificats de revocació? (s/N) " - -#: g10/keyedit.c:4771 -msgid "no secret key\n" -msgstr "ho hi ha clau secreta\n" - -#: g10/keyedit.c:4841 -#, c-format -msgid "user ID \"%s\" is already revoked\n" -msgstr "l'ID d'usuari «%s» ja està revocat\n" - -#: g10/keyedit.c:4858 -#, 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:4922 -#, fuzzy, c-format -msgid "Key %s is already revoked.\n" -msgstr "l'ID d'usuari «%s» ja està revocat\n" - -#: g10/keyedit.c:4984 -#, fuzzy, c-format -msgid "Subkey %s is already revoked.\n" -msgstr "l'ID d'usuari «%s» ja està revocat\n" - -#: g10/keyedit.c:5079 -#, 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:1421 -#, 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:1324 -#, 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:1328 -#, fuzzy, c-format -msgid "sending key %s to %s\n" -msgstr "s'està sol·licitant la clau %08lX de %s\n" - -#: g10/keyserver.c:1371 -#, 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:1374 -#, 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:1381 g10/keyserver.c:1477 -#, fuzzy -msgid "no keyserver action!\n" -msgstr "error de servidor de claus" - -#: g10/keyserver.c:1429 -#, c-format -msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n" -msgstr "" - -#: g10/keyserver.c:1438 -msgid "keyserver did not send VERSION\n" -msgstr "" - -#: g10/keyserver.c:1500 g10/keyserver.c:2028 -msgid "no keyserver known (use option --keyserver)\n" -msgstr "no es coneix cap servidor de claus (useu l'opció \"--keyserver\")\n" - -#: g10/keyserver.c:1506 -msgid "external keyserver calls are not supported in this build\n" -msgstr "" - -#: g10/keyserver.c:1518 -#, c-format -msgid "no handler for keyserver scheme `%s'\n" -msgstr "" - -#: g10/keyserver.c:1523 -#, c-format -msgid "action `%s' not supported with keyserver scheme `%s'\n" -msgstr "" - -#: g10/keyserver.c:1531 -#, c-format -msgid "%s does not support handler version %d\n" -msgstr "" - -# «del servidor», «en el servidor»? ivb -#: g10/keyserver.c:1538 -#, fuzzy -msgid "keyserver timed out\n" -msgstr "error de servidor de claus" - -# «del servidor», «en el servidor»? ivb -#: g10/keyserver.c:1543 -#, fuzzy -msgid "keyserver internal error\n" -msgstr "error de servidor de claus" - -#: g10/keyserver.c:1552 -#, fuzzy, c-format -msgid "keyserver communications error: %s\n" -msgstr "la recepció des del servidor de claus ha fallat: %s\n" - -#: g10/keyserver.c:1577 g10/keyserver.c:1611 -#, fuzzy, c-format -msgid "\"%s\" not a key ID: skipping\n" -msgstr "%s: no és un ID vàlid\n" - -#: g10/keyserver.c:1870 -#, 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:1892 -#, fuzzy, c-format -msgid "refreshing 1 key from %s\n" -msgstr "s'està sol·licitant la clau %08lX de %s\n" - -#: g10/keyserver.c:1894 -#, fuzzy, c-format -msgid "refreshing %d keys from %s\n" -msgstr "s'està sol·licitant la clau %08lX de %s\n" - -#: g10/keyserver.c:1950 -#, 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:1956 -#, 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:305 -#, c-format -msgid "assuming signed data in `%s'\n" -msgstr "s'asumeix que hi ha dades signades en «%s»\n" - -#: g10/openfile.c:384 -#, c-format -msgid "new configuration file `%s' created\n" -msgstr "s'ha creat el nou fitxer d'opcions «%s»\n" - -#: g10/openfile.c:386 -#, 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:418 -#, 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:1157 -#, 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:968 -#, 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:973 -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:977 -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:127 g10/skclist.c:191 -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:158 -#, fuzzy, c-format -msgid "skipped \"%s\": duplicated\n" -msgstr "es descarta «%s»: duplicat\n" - -#: g10/skclist.c:166 g10/skclist.c:176 g10/skclist.c:185 -#, fuzzy, c-format -msgid "skipped \"%s\": %s\n" -msgstr "es descarta «%s»: %s\n" - -#: g10/skclist.c:171 -msgid "skipped: secret key already present\n" -msgstr "es descarta: la clau secreta ja és present\n" - -#: g10/skclist.c:186 -#, 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:350 -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:351 -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 "User ID \"%s\": %d signature removed.\n" -#~ msgstr "L'ID d'usuari «%s» està revocat." - -#, fuzzy -#~ msgid "User ID \"%s\": %d signatures removed.\n" -#~ msgstr "L'ID d'usuari «%s» està revocat." - -#, fuzzy -#~ msgid "User ID \"%s\" removed: %s\n" -#~ msgstr "L'ID d'usuari «%s» està revocat." - -#, 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.po b/po/cs.po deleted file mode 100644 index 7965b0f97..000000000 --- a/po/cs.po +++ /dev/null @@ -1,6304 +0,0 @@ -# GnuPG Czech translation -# Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005 Free Software Foundation, Inc. -# Magda Prochzkov <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-07-28 11:12+0200\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 prvoslo 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 prvoslo s mn ne %d bity\n" - -#: cipher/random.c:173 -msgid "no entropy gathering module detected\n" -msgstr "nebyl detekovn dn modul pro zskn entropie\n" - -#: cipher/random.c:403 -#, fuzzy, c-format -msgid "can't lock `%s': %s\n" -msgstr "nelze zamt `%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:1003 g10/gpg.c:3461 g10/import.c:195 g10/keygen.c:2385 -#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:342 -#: 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 otevt `%s': %s\n" - -#: cipher/random.c:458 -#, c-format -msgid "can't stat `%s': %s\n" -msgstr "nemohu pout pkaz stat na `%s': %s\n" - -#: cipher/random.c:463 -#, c-format -msgid "`%s' is not a regular file - ignored\n" -msgstr "`%s' nen normln soubor - ignoruji\n" - -#: cipher/random.c:468 -msgid "note: random_seed file is empty\n" -msgstr "poznmka: soubor random_seed je przdn\n" - -#: cipher/random.c:474 -msgid "WARNING: invalid size of random_seed file - not used\n" -msgstr "VAROVN: neplatn velikost random_seed - soubor nepouit\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 "poznmka: soubor random_seed nen aktualizovn\n" - -#: cipher/random.c:544 g10/exec.c:481 g10/gpg.c:1002 g10/keygen.c:2864 -#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:263 -#: g10/openfile.c:357 g10/sign.c:826 g10/sign.c:1130 g10/tdbio.c:536 -#, c-format -msgid "can't create `%s': %s\n" -msgstr "nemohu vytvoit `%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 zavt `%s': %s\n" - -#: cipher/random.c:814 -msgid "WARNING: using insecure random number generator!!\n" -msgstr "VAROVN: pouit genertor nhodnch sel nen bezpen!!\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 "" -"Genertor nhodnch sel je pouze atrapa, aby program mohl bet,\n" -"v dnm ppad nen kryptograficky bezpen!\n" -"\n" -"NEPOUVEJTE JAKKOLIV DATA VYTVOEN TMTO 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 "" -"Prosm ekejte, je nutn zskat dostatek entropie. Aby jste se nenudili,\n" -"mete na potai dlat nco jinho, zvte 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 nhodnch bajt. Prosm, pracujte s operanm systmem, abyste\n" -"mu umonili zskat vce entropie (je poteba %d bajt).\n" - -#: g10/app-openpgp.c:596 -#, c-format -msgid "failed to store the fingerprint: %s\n" -msgstr "uloen fingerprintu se nezdailo: %s\n" - -#: g10/app-openpgp.c:609 -#, c-format -msgid "failed to store the creation date: %s\n" -msgstr "uloen datumu vytvoen se nezdailo: %s\n" - -#: g10/app-openpgp.c:977 -#, c-format -msgid "reading public key failed: %s\n" -msgstr "ten veejnho kle se nezdailo: %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 veejn 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 veejn 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 zkonila 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 pli krtk; minimln dlka 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 nezdaila: %s\n" - -#: g10/app-openpgp.c:1310 -msgid "access to admin commands is not configured\n" -msgstr "pstup k administrtorskm pkazm nen nakonfigurovn\n" - -#: g10/app-openpgp.c:1325 g10/app-openpgp.c:2389 -msgid "error retrieving CHV status from card\n" -msgstr "chyba pi zskn CHV z karty\n" - -#: g10/app-openpgp.c:1331 g10/app-openpgp.c:2398 -msgid "card is permanently locked!\n" -msgstr "karta je trvale uzamena!\n" - -#: g10/app-openpgp.c:1336 -#, c-format -msgid "%d Admin PIN attempts remaining before card is permanently locked\n" -msgstr "" -"Do trvalho uzamen karty zstv %d pokus o zadn PINu administrtora\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 administrtora" - -#. 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 administrtora" - -#: 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 pi zskn novho PINu: %s\n" - -#: g10/app-openpgp.c:1546 g10/app-openpgp.c:1996 -msgid "error reading application data\n" -msgstr "chyba pi ten aplikanch dat\n" - -#: g10/app-openpgp.c:1552 g10/app-openpgp.c:2003 -msgid "error reading fingerprint DO\n" -msgstr "chyba pi 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 "existujc kl bude pepsn\n" - -#: g10/app-openpgp.c:1568 -msgid "generating new key\n" -msgstr "generovn novho kle\n" - -#: g10/app-openpgp.c:1735 -msgid "creation timestamp missing\n" -msgstr "chyb asov raztko vytvoen\n" - -#: g10/app-openpgp.c:1742 -#, c-format -msgid "RSA modulus missing or not of size %d bits\n" -msgstr "schz 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 "schz veejn 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 "schz 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 uloit kl: %s\n" - -#: g10/app-openpgp.c:1886 -msgid "please wait while key is being generated ...\n" -msgstr "prosm pokejte ne bude kl vygenerovn ...\n" - -#: g10/app-openpgp.c:1901 -msgid "generating key failed\n" -msgstr "henerovn kle se nezdailo\n" - -#: g10/app-openpgp.c:1904 -#, c-format -msgid "key generation completed (%d seconds)\n" -msgstr "generovn kle dokoneno (%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 vytvoen podpisy: %lu\n" - -#: g10/app-openpgp.c:2142 -#, c-format -msgid "||Please enter the PIN%%0A[sigs done: %lu]" -msgstr "||Prosm vlote PIN%%0A[podpis hotov: %lu]" - -#: g10/app-openpgp.c:2403 -msgid "" -"verification of Admin PIN is currently prohibited through this command\n" -msgstr "" -"oven administrtorskho PIN je nyn prostednictvm tohoto pkazu " -"zakzno\n" - -#: g10/app-openpgp.c:2474 g10/app-openpgp.c:2484 -#, c-format -msgid "can't access %s - invalid OpenPGP card?\n" -msgstr "pstup na %s se nezdail - vadn OpenPGP karta?\n" - -#: g10/armor.c:320 -#, c-format -msgid "armor: %s\n" -msgstr "ASCII kdovn: %s\n" - -#: g10/armor.c:359 -msgid "invalid armor header: " -msgstr "neplatn hlavika ASCII kdovn: " - -#: g10/armor.c:370 -msgid "armor header: " -msgstr "ASCII hlavika: " - -#: g10/armor.c:381 -msgid "invalid clearsig header\n" -msgstr "neplatn hlavika podpisu v itelnm formtu\n" - -#: g10/armor.c:433 -msgid "nested clear text signatures\n" -msgstr "vnoen podpisy v itelnm formtu\n" - -#: g10/armor.c:568 -msgid "unexpected armor: " -msgstr "neoekvan ASCII armor: " - -#: g10/armor.c:580 -msgid "invalid dash escaped line: " -msgstr "nesprvn oznaen dku mnusy: " - -#: g10/armor.c:734 g10/armor.c:1343 -#, c-format -msgid "invalid radix64 character %02X skipped\n" -msgstr "neplatn radix64 znak %02X byl peskoen\n" - -#: g10/armor.c:777 -msgid "premature eof (no CRC)\n" -msgstr "pedasn konec souboru (dn CRC)\n" - -#: g10/armor.c:811 -msgid "premature eof (in CRC)\n" -msgstr "pedasn konec souboru (dn CRC)\n" - -#: g10/armor.c:819 -msgid "malformed CRC\n" -msgstr "patn formt CRC\n" - -#: g10/armor.c:823 g10/armor.c:1380 -#, c-format -msgid "CRC error; %06lX - %06lX\n" -msgstr "Chyba CRC; %06lX - %06lX\n" - -#: g10/armor.c:843 -msgid "premature eof (in trailer)\n" -msgstr "pedasn konec souboru (v patice)\n" - -#: g10/armor.c:847 -msgid "error in trailer line\n" -msgstr "chyba v patice\n" - -#: g10/armor.c:1158 -msgid "no valid OpenPGP data found.\n" -msgstr "nenalezena dn platn data ve formtu OpenPGP.\n" - -#: g10/armor.c:1163 -#, c-format -msgid "invalid armor: line longer than %d characters\n" -msgstr "neplatn kdovn ASCII: dek je del ne %d znak\n" - -#: g10/armor.c:1167 -msgid "" -"quoted printable character in armor - probably a buggy MTA has been used\n" -msgstr "" -"neplatn znak (quoted-printable) v ASCII kdovn - pravdpodobn byl pouit " -"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 provst v dvkovm mdu\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 vbr? " - -#: 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 vyadovno" - -#: g10/card-util.c:441 -msgid "forced" -msgstr "vyadovno" - -#: g10/card-util.c:519 -msgid "Error: Only plain ASCII is currently allowed.\n" -msgstr "Chyba: V souasn 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 pout.\n" - -#: g10/card-util.c:523 -msgid "Error: Double spaces are not allowed.\n" -msgstr "Chyba: Vce mezer nen povoleno.\n" - -#: g10/card-util.c:540 -msgid "Cardholder's surname: " -msgstr "Pjmen dritele karty: " - -#: g10/card-util.c:542 -msgid "Cardholder's given name: " -msgstr "Jmno (kestn) dritele karty: " - -#: g10/card-util.c:560 -#, c-format -msgid "Error: Combined name too long (limit is %d characters).\n" -msgstr "Chyba: jmno a pjmen je pli dlouh (limit je %d znak).\n" - -#: g10/card-util.c:581 -msgid "URL to retrieve public key: " -msgstr "URL pro zskn veejnho kle: " - -#: g10/card-util.c:589 -#, c-format -msgid "Error: URL too long (limit is %d characters).\n" -msgstr "Chyba: URL je pli dlouh (limit je %d znak).\n" - -#: g10/card-util.c:687 g10/card-util.c:756 g10/import.c:280 -#, c-format -msgid "error reading `%s': %s\n" -msgstr "chyba pi ten `%s': %s\n" - -#: g10/card-util.c:695 -msgid "Login data (account name): " -msgstr "Login (jmnu tu): " - -#: g10/card-util.c:705 -#, c-format -msgid "Error: Login data too long (limit is %d characters).\n" -msgstr "Chyba: Login je pli dlouh (limit je %d znak).\n" - -#: g10/card-util.c:764 -msgid "Private DO data: " -msgstr "Privtn DO data: " - -#: g10/card-util.c:774 -#, c-format -msgid "Error: Private DO too long (limit is %d characters).\n" -msgstr "Chyba: Privtn DO je pli dlouh (limit je %d znak).\n" - -#: g10/card-util.c:794 -msgid "Language preferences: " -msgstr "Jazykov pedvolby: " - -#: g10/card-util.c:802 -msgid "Error: invalid length of preference string.\n" -msgstr "Chyba: neplatn dlka etezce s pedvolbami.\n" - -#: g10/card-util.c:811 -msgid "Error: invalid characters in preference string.\n" -msgstr "Chyba: neplatn znak v etzci s pedvolbami\n" - -#: g10/card-util.c:832 -msgid "Sex ((M)ale, (F)emale or space): " -msgstr "Zadejte pohlav: M - musk, F - ensk nebo stisnte mezernk: " - -#: 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: nesprvn naformtovan fingerprint.\n" - -#: g10/card-util.c:938 -#, c-format -msgid "key operation not possible: %s\n" -msgstr "operace s klem nen mon: %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 pi zskn informac o aktulnm kli: %s\n" - -#: g10/card-util.c:1033 -msgid "Replace existing key? (y/N) " -msgstr "Pepsat existujc kl? (a/N) " - -#: g10/card-util.c:1054 g10/card-util.c:1063 -msgid "Make off-card backup of encryption key? (Y/n) " -msgstr "Vytvoit zlohu ifrovacho kle mimo kartu? (A/n) " - -#: g10/card-util.c:1075 -msgid "Replace existing keys? (y/N) " -msgstr "Pepsat existujc kle? (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 "" -"Prosm nezapomete, e tovrn nastaven PINu je\n" -" PIN = `%s' PIN administrtora = `%s'\n" -"Toto nastaven mete zmnit pkazem --change-pin\n" - -#: g10/card-util.c:1123 -msgid "Please select the type of key to generate:\n" -msgstr "Prosm, vyberte druh kle, 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) Autentizan 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 vbr.\n" - -#: g10/card-util.c:1203 -msgid "Please select where to store the key:\n" -msgstr "Prosm vyberte msto pro uchovn kle:\n" - -#: g10/card-util.c:1238 -msgid "unknown key protection algorithm\n" -msgstr "neznm algoritmus pro ochranu kle\n" - -#: g10/card-util.c:1243 -msgid "secret parts of key are not available\n" -msgstr "tajn sti kle nejsou dostupn\n" - -#: g10/card-util.c:1248 -msgid "secret key already stored on a card\n" -msgstr "tajn kl je na kart uloen\n" - -#: g10/card-util.c:1319 g10/keyedit.c:1357 -msgid "quit this menu" -msgstr "ukonit toto menu" - -#: g10/card-util.c:1321 -msgid "show admin commands" -msgstr "zobraz administrtorsk pkazy" - -#: g10/card-util.c:1322 g10/keyedit.c:1360 -msgid "show this help" -msgstr "ukzat tuto pomoc" - -#: g10/card-util.c:1324 -msgid "list all available data" -msgstr "vypi vechna dostupn data" - -#: g10/card-util.c:1327 -msgid "change card holder's name" -msgstr "zmn jmno majitele karty" - -#: g10/card-util.c:1328 -msgid "change URL to retrieve key" -msgstr "zmn URL pro zskn kle" - -#: g10/card-util.c:1329 -msgid "fetch the key specified in the card URL" -msgstr "zsk kl specifikovan v URL karty" - -#: g10/card-util.c:1330 -msgid "change the login name" -msgstr "zmnit login name" - -#: g10/card-util.c:1331 -msgid "change the language preferences" -msgstr "zmnit jazykov pedvolby" - -#: g10/card-util.c:1332 -msgid "change card holder's sex" -msgstr "zmn pohlav dritele karty" - -#: g10/card-util.c:1333 -msgid "change a CA fingerprint" -msgstr "vypsat fingerprint certifikan autority" - -#: g10/card-util.c:1334 -msgid "toggle the signature force PIN flag" -msgstr "zapnout/vypnout poadovn PINu pi kad self-sign operaci" - -#: g10/card-util.c:1335 -msgid "generate new keys" -msgstr "vytvoit nov pr kl" - -#: g10/card-util.c:1336 -msgid "menu to change or unblock the PIN" -msgstr "nabdka pro zmnu anebo odblokovn PINu" - -#: g10/card-util.c:1337 -msgid "verify the PIN and list all data" -msgstr "ov PIN a vypi vechna data" - -#: g10/card-util.c:1457 g10/keyedit.c:1623 -msgid "Command> " -msgstr "Pkaz> " - -#: g10/card-util.c:1495 -msgid "Admin-only command\n" -msgstr "pouze administrtorsk pkazy\n" - -#: g10/card-util.c:1526 -msgid "Admin commands are allowed\n" -msgstr "administrtorsk pkazy jsou povoleny\n" - -#: g10/card-util.c:1528 -msgid "Admin commands are not allowed\n" -msgstr "administrtorsk pkazy nejsou povoleny\n" - -#: g10/card-util.c:1602 g10/keyedit.c:2244 -msgid "Invalid command (try \"help\")\n" -msgstr "Neplatn pkaz (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 "Prosm vote kartu a stisknte enter. Operaci zrute stisknutm 'z': " - -#: g10/cardglue.c:446 -#, fuzzy, c-format -msgid "selecting openpgp failed: %s\n" -msgstr "smazn bloku kle se nezdailo: %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 "" -"Prosm vyjmte kartu a vlote jinou se seriovm slem:\n" -" %.*s\n" - -#: g10/cardglue.c:582 -msgid "Hit return when ready or enter 'c' to cancel: " -msgstr "" -"Je-li nov karta pipravena, stisknte enter. Operaci zrute stisknutm " -"'z': " - -#: g10/cardglue.c:917 -msgid "Enter New Admin PIN: " -msgstr "Vlote nov PIN administrtora: " - -#: g10/cardglue.c:918 -msgid "Enter New PIN: " -msgstr "Vlote nov PIN: " - -#: g10/cardglue.c:919 -msgid "Enter Admin PIN: " -msgstr "Vlote PIN administrtora: " - -#: g10/cardglue.c:920 -msgid "Enter PIN: " -msgstr "Vlote 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 zopakovn sprvn; zkuste to znovu" - -#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3826 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 otevt `%s'\n" - -#: g10/decrypt.c:105 g10/encode.c:839 -msgid "--output doesn't work for this command\n" -msgstr "--output pro tento pkaz nen platn\n" - -#: g10/delkey.c:75 g10/export.c:311 g10/keyedit.c:3387 g10/keyserver.c:1700 -#: 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:2349 g10/keyserver.c:1714 -#: g10/revoke.c:234 g10/revoke.c:478 -#, c-format -msgid "error reading keyblock: %s\n" -msgstr "chyba pi ten bloku kle: %s\n" - -#: g10/delkey.c:129 g10/delkey.c:136 -msgid "(unless you specify the key by fingerprint)\n" -msgstr "(dokud neurte 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 dvkovm mdu provst\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 "smazn bloku kle se nezdailo: %s\n" - -#: g10/delkey.c:175 -msgid "ownertrust information cleared\n" -msgstr "informace o dvryhodnosti vlastnka kle vymazny\n" - -#: g10/delkey.c:206 -#, c-format -msgid "there is a secret key for public key \"%s\"!\n" -msgstr "existuje tajn kl pro tento veejn kl \"%s\"!\n" - -#: g10/delkey.c:208 -msgid "use option \"--delete-secret-keys\" to delete it first.\n" -msgstr "" -"abyste ho smazal(a), pouijte nejprve parametr \"--delete-secret-key\".\n" - -#: g10/encode.c:213 g10/sign.c:1284 -#, c-format -msgid "error creating passphrase: %s\n" -msgstr "chyba pi vytven hesla: %s\n" - -#: g10/encode.c:218 -msgid "can't use a symmetric ESK packet due to the S2K mode\n" -msgstr "v mdu S2K nelze pout symetrick ESK paket\n" - -#: g10/encode.c:231 -#, c-format -msgid "using cipher %s\n" -msgstr "pouit ifry: %s\n" - -#: g10/encode.c:241 g10/encode.c:536 -#, c-format -msgid "`%s' already compressed\n" -msgstr "`%s' je ji zkomprimovn\n" - -#: g10/encode.c:292 g10/encode.c:584 g10/sign.c:593 -#, c-format -msgid "WARNING: `%s' is an empty file\n" -msgstr "VAROVN: soubor `%s' je przdn\n" - -#: g10/encode.c:456 -msgid "you can only encrypt to RSA keys of 2048 bits or less in --pgp2 mode\n" -msgstr "" -"v mdu --pgp2 mete ifrovat pouze RSA klem o dlce 2048 bit a mn\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 pout pro vechny kle, pro kter ifrujete.\n" - -#: g10/encode.c:518 -#, c-format -msgid "" -"WARNING: forcing symmetric cipher %s (%d) violates recipient preferences\n" -msgstr "" -"VAROVN: vydan symetrick ifra %s (%d) nevyhovuje pedvolbm pjemce\n" - -#: g10/encode.c:628 g10/sign.c:963 -#, c-format -msgid "" -"WARNING: forcing compression algorithm %s (%d) violates recipient " -"preferences\n" -msgstr "" -"VAROVN: vydan kompriman algoritmus %s (%d) nevyhovuje pedvolbm " -"pjemce\n" - -#: g10/encode.c:715 -#, c-format -msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n" -msgstr "vydan symetrick ifra %s (%d) nevyhovuje pedvolbm pjemce\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 "pouit %s nen v mdu %s dovoleno\n" - -#: g10/encode.c:812 -#, c-format -msgid "%s/%s encrypted for: \"%s\"\n" -msgstr "%s/%s zaifrovan pro: %s\n" - -#: g10/encr-data.c:67 g10/mainproc.c:293 -#, c-format -msgid "%s encrypted data\n" -msgstr "%s zaifrovan data\n" - -#: g10/encr-data.c:69 g10/mainproc.c:297 -#, c-format -msgid "encrypted with unknown algorithm %d\n" -msgstr "zaifrovno neznmm algoritmem %d\n" - -#: g10/encr-data.c:93 -msgid "" -"WARNING: message was encrypted with a weak key in the symmetric cipher.\n" -msgstr "VAROVN: zprva byla zaifrovna slabm klem v symetrick ife.\n" - -#: g10/encr-data.c:104 -msgid "problem handling encrypted packet\n" -msgstr "problm se zaifrovanm paketem\n" - -#: g10/exec.c:49 -msgid "no remote program execution supported\n" -msgstr "sputn externho programu nen podporovno\n" - -#: g10/exec.c:176 g10/openfile.c:415 -#, c-format -msgid "can't create directory `%s': %s\n" -msgstr "nemohu vytvoit adres `%s': %s\n" - -#: g10/exec.c:317 -msgid "" -"external program calls are disabled due to unsafe options file permissions\n" -msgstr "" -"voln externch program je zakzno, protoe file permissions nejsou\n" -"nastaveny nebezpen\n" - -#: g10/exec.c:347 -msgid "this platform requires temporary files when calling external programs\n" -msgstr "" -"na tto platform jsou pi voln externch program vyadovny\n" -"doasn 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 "systmov chyba pi voln externho programu: %s\n" - -#: g10/exec.c:524 g10/exec.c:590 -msgid "unnatural exit of external program\n" -msgstr "neoekvan konec externho 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 pest odpov externho programu: %s\n" - -#: g10/exec.c:601 g10/exec.c:608 -#, c-format -msgid "WARNING: unable to remove tempfile (%s) `%s': %s\n" -msgstr "VAROVN: nelze smazat doasn soubor (%s) `%s': %s\n" - -#: g10/exec.c:613 -#, c-format -msgid "WARNING: unable to remove temp directory `%s': %s\n" -msgstr "VAROVN: nelze smazat doasn adres `%s': %s\n" - -#: g10/export.c:61 -#, fuzzy -msgid "export signatures that are marked as local-only" -msgstr "Podpis bude oznaen 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 revokan kl\n" - -#: g10/export.c:67 -#, fuzzy -msgid "remove the passphrase from exported subkeys" -msgstr "revokovat kl nebo vybran podkle" - -#: g10/export.c:69 -#, fuzzy -msgid "remove unusable parts from key during export" -msgstr "odstranit nepouiteln sti z kle" - -#: 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 "exportovn tajnho kle nen povoleno\n" - -#: g10/export.c:354 -#, c-format -msgid "key %s: not protected - skipped\n" -msgstr "kl %s: nen chrnn - peskoeno\n" - -#: g10/export.c:362 -#, c-format -msgid "key %s: PGP 2.x style key - skipped\n" -msgstr "kl %s: PGP 2.x kl - peskoeno\n" - -#: g10/export.c:373 -#, fuzzy, c-format -msgid "key %s: key material on-card - skipped\n" -msgstr "kl %s: podpis podkle na patnm mst - peskoeno \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 uloit kl: %s\n" - -#: g10/export.c:565 -#, c-format -msgid "WARNING: secret key %s does not have a simple SK checksum\n" -msgstr "VAROVN: tajn kl %s nen chrnn pomoc simple SK checksum\n" - -#: g10/export.c:598 -msgid "WARNING: nothing exported\n" -msgstr "VAROVN: nebylo nic vyexportovno\n" - -#: g10/gpg.c:375 -msgid "" -"@Commands:\n" -" " -msgstr "" -"@Pkazy:\n" -" " - -#: g10/gpg.c:377 -msgid "|[file]|make a signature" -msgstr "|[soubor]|vytvoit podpis" - -#: g10/gpg.c:378 -msgid "|[file]|make a clear text signature" -msgstr "|[soubor]|vytvoit podpis v itelnm dokumentu" - -#: g10/gpg.c:379 -msgid "make a detached signature" -msgstr "vytvoit podpis oddlen od dokumentu" - -#: g10/gpg.c:380 -msgid "encrypt data" -msgstr "ifrovat data" - -#: g10/gpg.c:382 -msgid "encryption only with symmetric cipher" -msgstr "ifrovn pouze se symetrickou ifrou" - -#: g10/gpg.c:384 -msgid "decrypt data (default)" -msgstr "deifrovat data (implicitn)" - -#: g10/gpg.c:386 -msgid "verify a signature" -msgstr "verifikovat podpis" - -#: g10/gpg.c:388 -msgid "list keys" -msgstr "vypsat seznam kl" - -#: g10/gpg.c:390 -msgid "list keys and signatures" -msgstr "vypsat seznam kl a podpis" - -#: g10/gpg.c:391 -msgid "list and check key signatures" -msgstr "vypsat a zkontrolovat podpisy kl" - -#: g10/gpg.c:392 -msgid "list keys and fingerprints" -msgstr "vypsat seznam kl a fingerprint" - -#: g10/gpg.c:393 -msgid "list secret keys" -msgstr "vypsat seznam tajnch kl" - -#: g10/gpg.c:394 -msgid "generate a new key pair" -msgstr "vytvoit nov pr kl" - -#: g10/gpg.c:395 -msgid "remove keys from the public keyring" -msgstr "odstranit kl ze souboru veejnch kl" - -#: g10/gpg.c:397 -msgid "remove keys from the secret keyring" -msgstr "odstranit kl ze souboru tajnch kl" - -#: g10/gpg.c:398 -msgid "sign a key" -msgstr "podepsat kl" - -#: g10/gpg.c:399 -msgid "sign a key locally" -msgstr "podepsat kl lokln" - -#: g10/gpg.c:400 -msgid "sign or edit a key" -msgstr "podepsat nebo modifikovat kl" - -#: g10/gpg.c:401 -msgid "generate a revocation certificate" -msgstr "vytvoit revokan certifikt" - -#: g10/gpg.c:403 -msgid "export keys" -msgstr "exportovat kle" - -#: g10/gpg.c:404 -msgid "export keys to a key server" -msgstr "exportovat kle na server kl" - -#: g10/gpg.c:405 -msgid "import keys from a key server" -msgstr "importovat kle ze serveru kl" - -#: g10/gpg.c:407 -msgid "search for keys on a key server" -msgstr "vyhledat kle na serveru kl" - -#: g10/gpg.c:409 -msgid "update all keys from a keyserver" -msgstr "aktualizovat vechny kle ze serveru kl" - -#: g10/gpg.c:413 -msgid "import/merge keys" -msgstr "importovat/slouit kle" - -#: g10/gpg.c:416 -msgid "print the card status" -msgstr "vytisknout stav karty" - -#: g10/gpg.c:417 -msgid "change data on a card" -msgstr "zmnit data na kart" - -#: g10/gpg.c:418 -msgid "change a card's PIN" -msgstr "zmnit PIN karty" - -#: g10/gpg.c:426 -msgid "update the trust database" -msgstr "aktualizovat databzi dvry" - -#: g10/gpg.c:433 -msgid "|algo [files]|print message digests" -msgstr "|algo [soubory] vypi hash" - -#: g10/gpg.c:437 g10/gpgv.c:71 -msgid "" -"@\n" -"Options:\n" -" " -msgstr "" -"@\n" -"Monosti:\n" -" " - -#: g10/gpg.c:439 -msgid "create ascii armored output" -msgstr "vytvo vstup zakdovan pomoc ASCII" - -#: g10/gpg.c:441 -msgid "|NAME|encrypt for NAME" -msgstr "|JMNO|ifrovat pro JMNO" - -#: g10/gpg.c:452 -msgid "use this user-id to sign or decrypt" -msgstr "" -"pout tento id uivatele pro podepsn\n" -" nebo deifrovn" - -#: g10/gpg.c:453 -msgid "|N|set compress level N (0 disables)" -msgstr "" -"|N|nastavit rov komprimace N (0 - dn\n" -" komprimace)" - -#: g10/gpg.c:458 -msgid "use canonical text mode" -msgstr "pout kanonick textov md" - -#: g10/gpg.c:472 -msgid "use as output file" -msgstr "pout jako vstupn soubor" - -#: g10/gpg.c:474 g10/gpgv.c:73 -msgid "verbose" -msgstr "s dodatenmi informacemi" - -#: g10/gpg.c:485 -msgid "do not make any changes" -msgstr "neprovdt dn zmny" - -#: g10/gpg.c:486 -msgid "prompt before overwriting" -msgstr "vydat potvrzen ped pepsnm" - -#: g10/gpg.c:527 -msgid "use strict OpenPGP behavior" -msgstr "pout chovn striktn podle OpenPGP" - -#: g10/gpg.c:528 -msgid "generate PGP 2.x compatible messages" -msgstr "generovat zprvu komplatibiln s PGP 2.x" - -#: g10/gpg.c:556 -msgid "" -"@\n" -"(See the man page for a complete listing of all commands and options)\n" -msgstr "" -"@\n" -"(Pouijte manulov strnky pro kompletn seznam vech pkaz a monost)\n" - -#: g10/gpg.c:559 -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 zaifrovat pro uivatele Bob\n" -" --clearsign [soubor] vytvoit podpis itelnho dokumentu\n" -" --detach-sign [soubor] vytvoit podpis oddlen od dokumentu\n" -" --list-keys [jmna] vypsat kle\n" -" --fingerprint [jmna] vypsat fingerprinty \n" - -#: g10/gpg.c:757 g10/gpgv.c:98 -msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n" -msgstr "" -"Chyby oznamte, prosm, na adresu <gnupg-bugs@gnu.org>.\n" -"Pipomnky k pekladu <rp@tns.cz>.\n" - -#: g10/gpg.c:774 -msgid "Usage: gpg [options] [files] (-h for help)" -msgstr "Pouit: gpg [monosti] [soubory] (-h pro pomoc)" - -#: g10/gpg.c:777 -msgid "" -"Syntax: gpg [options] [files]\n" -"sign, check, encrypt or decrypt\n" -"default operation depends on the input data\n" -msgstr "" -"Syntaxe: gpg [monosti] [soubory]\n" -"podepsat, ovit, ifrovat nebo deifrovat\n" -"implicitn operace zvis na vstupnch datech\n" - -#: g10/gpg.c:788 -msgid "" -"\n" -"Supported algorithms:\n" -msgstr "" -"\n" -"Podporovan algoritmy:\n" - -#: g10/gpg.c:791 -msgid "Pubkey: " -msgstr "Veejn kl: " - -#: g10/gpg.c:797 g10/keyedit.c:2310 -msgid "Cipher: " -msgstr "ifra: " - -#: g10/gpg.c:803 -msgid "Hash: " -msgstr "Hash: " - -#: g10/gpg.c:809 g10/keyedit.c:2356 -msgid "Compression: " -msgstr "Komprese: " - -#: g10/gpg.c:892 -msgid "usage: gpg [options] " -msgstr "uit: gpg [monosti]" - -#: g10/gpg.c:1040 -msgid "conflicting commands\n" -msgstr "konfliktn pkazy\n" - -#: g10/gpg.c:1058 -#, 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:1255 -#, c-format -msgid "WARNING: unsafe ownership on homedir `%s'\n" -msgstr "" -"VAROVN: vlastnictv domovskho adrese nen nastaveno bezpen `%s'\n" - -#: g10/gpg.c:1258 -#, c-format -msgid "WARNING: unsafe ownership on configuration file `%s'\n" -msgstr "" -"VAROVN: vlastnictv konfiguranho souboru nen nastaveno bezpen `%s'\n" - -#: g10/gpg.c:1261 -#, c-format -msgid "WARNING: unsafe ownership on extension `%s'\n" -msgstr "" -"VAROVN: vlastnictv roziujcho modulu nen nastaveno bezpen `%s'\n" - -#: g10/gpg.c:1267 -#, c-format -msgid "WARNING: unsafe permissions on homedir `%s'\n" -msgstr "" -"VAROVN: pstupov prva pro domovsk adrese nejsou bezpen `%s'\n" - -#: g10/gpg.c:1270 -#, c-format -msgid "WARNING: unsafe permissions on configuration file `%s'\n" -msgstr "" -"VAROVN: pstupov prva pro konfiguran soubor nejsou bezpen `%s'\n" - -#: g10/gpg.c:1273 -#, c-format -msgid "WARNING: unsafe permissions on extension `%s'\n" -msgstr "VAROVN: pstupov prva roziujcmu modulu nejsou bezpen `%s'\n" - -#: g10/gpg.c:1279 -#, c-format -msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n" -msgstr "" -"VAROVN: vlastnictv adrese s domovkm adresem nen nastaveno " -"nebezpen `%s'\n" - -#: g10/gpg.c:1282 -#, c-format -msgid "" -"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n" -msgstr "" -"VAROVN: vlastnictv adrese s konfiguranm souborem nen nastaveno " -"nebezpen `%s'\n" - -#: g10/gpg.c:1285 -#, c-format -msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n" -msgstr "" -"VAROVN: vlastnictv adrese s roziujcm modulem nen nastaveno " -"nebezpen `%s'\n" - -#: g10/gpg.c:1291 -#, c-format -msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n" -msgstr "" -"VAROVN: pstupov prva k adresi s domovskm adresem nejsou nastavena " -"bezpen `%s'\n" - -#: g10/gpg.c:1294 -#, c-format -msgid "" -"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n" -msgstr "" -"VAROVN: pstupov prva k adersi s konfiguranm souborem nejsou " -"nastavena bezpen `%s'\n" - -#: g10/gpg.c:1297 -#, c-format -msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n" -msgstr "" -"VAROVN: pstupov prva k adresi s roziujcm modulem nejsou " -"nastavena bezpen `%s'\n" - -# c-format -#: g10/gpg.c:1438 -#, c-format -msgid "unknown configuration item `%s'\n" -msgstr "neznm konfiguran poloka \"%s\"\n" - -#: g10/gpg.c:1531 -msgid "display photo IDs during key listings" -msgstr "" - -#: g10/gpg.c:1533 -msgid "show policy URLs during signature listings" -msgstr "" - -#: g10/gpg.c:1535 -#, fuzzy -msgid "show all notations during signature listings" -msgstr "V souboru tajnch kl chyb odpovdajc podpis\n" - -#: g10/gpg.c:1537 -msgid "show IETF standard notations during signature listings" -msgstr "" - -#: g10/gpg.c:1541 -msgid "show user-supplied notations during signature listings" -msgstr "" - -#: g10/gpg.c:1543 -#, fuzzy -msgid "show preferred keyserver URLs during signature listings" -msgstr "zadan URL preferovanho serveru kl je neplat\n" - -#: g10/gpg.c:1545 -msgid "show user ID validity during key listings" -msgstr "" - -#: g10/gpg.c:1547 -msgid "show revoked and expired user IDs in key listings" -msgstr "" - -#: g10/gpg.c:1549 -msgid "show revoked and expired subkeys in key listings" -msgstr "" - -#: g10/gpg.c:1551 -#, fuzzy -msgid "show the keyring name in key listings" -msgstr "pepnout mezi vypisem seznamu tajnch a veejnch kl" - -#: g10/gpg.c:1553 -#, fuzzy -msgid "show expiration dates during signature listings" -msgstr "V souboru tajnch kl chyb odpovdajc podpis\n" - -#: g10/gpg.c:1920 -#, c-format -msgid "NOTE: old default options file `%s' ignored\n" -msgstr "POZNMKA: star implicitn soubor s monostmi `%s ignorovn'\n" - -#: g10/gpg.c:1962 -#, c-format -msgid "NOTE: no default option file `%s'\n" -msgstr "POZNMKA: neexistuje implicitn soubor s monostmi `%s'\n" - -#: g10/gpg.c:1966 -#, c-format -msgid "option file `%s': %s\n" -msgstr "soubor s monostmi `%s': %s\n" - -#: g10/gpg.c:1973 -#, c-format -msgid "reading options from `%s'\n" -msgstr "tu monosti z `%s'\n" - -#: g10/gpg.c:2188 g10/gpg.c:2814 g10/gpg.c:2833 -#, c-format -msgid "NOTE: %s is not for normal use!\n" -msgstr "POZNMKA: %s nen pro normln pouit!\n" - -#: g10/gpg.c:2201 -#, c-format -msgid "cipher extension `%s' not loaded due to unsafe permissions\n" -msgstr "" -"ifra `%s' nebyla nahrna, protoe pstupov prva nejsou nastavena " -"bezpen\n" - -#: g10/gpg.c:2364 g10/gpg.c:2376 -#, c-format -msgid "`%s' is not a valid signature expiration\n" -msgstr "`%s' nen platn doba expirace podpisu\n" - -#: g10/gpg.c:2452 -#, c-format -msgid "`%s' is not a valid character set\n" -msgstr "`%s' nen platn znakov sada\n" - -#: g10/gpg.c:2476 g10/gpg.c:2663 g10/keyedit.c:4064 -msgid "could not parse keyserver URL\n" -msgstr "nelze zpracovat URL serveru kl\n" - -#: g10/gpg.c:2488 -#, c-format -msgid "%s:%d: invalid keyserver options\n" -msgstr "%s:%d: neplatn parametr pro server kl\n" - -#: g10/gpg.c:2491 -msgid "invalid keyserver options\n" -msgstr "neplatn parametr pro server kl\n" - -#: g10/gpg.c:2498 -#, c-format -msgid "%s:%d: invalid import options\n" -msgstr "%s:%d: neplatn parametr pro import\n" - -#: g10/gpg.c:2501 -msgid "invalid import options\n" -msgstr "neplatn parametr pro import\n" - -#: g10/gpg.c:2508 -#, c-format -msgid "%s:%d: invalid export options\n" -msgstr "%s:%d: neplatn parametr pro export\n" - -#: g10/gpg.c:2511 -msgid "invalid export options\n" -msgstr "neplatn parametr pro export\n" - -#: g10/gpg.c:2518 -#, c-format -msgid "%s:%d: invalid list options\n" -msgstr "%s:%d: neplatn parametr pro vpis\n" - -#: g10/gpg.c:2521 -msgid "invalid list options\n" -msgstr "neplatn parametr pro vpis\n" - -#: g10/gpg.c:2529 -msgid "display photo IDs during signature verification" -msgstr "" - -#: g10/gpg.c:2531 -msgid "show policy URLs during signature verification" -msgstr "" - -#: g10/gpg.c:2533 -#, fuzzy -msgid "show all notations during signature verification" -msgstr "`%s' nen platn doba expirace podpisu\n" - -#: g10/gpg.c:2535 -msgid "show IETF standard notations during signature verification" -msgstr "" - -#: g10/gpg.c:2539 -msgid "show user-supplied notations during signature verification" -msgstr "" - -#: g10/gpg.c:2541 -#, fuzzy -msgid "show preferred keyserver URLs during signature verification" -msgstr "zadan URL preferovanho serveru kl je neplat\n" - -#: g10/gpg.c:2543 -#, fuzzy -msgid "show user ID validity during signature verification" -msgstr "`%s' nen platn doba expirace podpisu\n" - -#: g10/gpg.c:2545 -msgid "show revoked and expired user IDs in signature verification" -msgstr "" - -#: g10/gpg.c:2547 -msgid "validate signatures with PKA data" -msgstr "" - -#: g10/gpg.c:2549 -msgid "elevate the trust of signatures with valid PKA data" -msgstr "" - -#: g10/gpg.c:2556 -#, c-format -msgid "%s:%d: invalid verify options\n" -msgstr "%s:%d: neplatn parametr pro oven\n" - -#: g10/gpg.c:2559 -msgid "invalid verify options\n" -msgstr "neplatn parametr pro oven\n" - -#: g10/gpg.c:2566 -#, c-format -msgid "unable to set exec-path to %s\n" -msgstr "nelze nastavit exec-path na %s\n" - -#: g10/gpg.c:2729 -#, fuzzy, c-format -msgid "%s:%d: invalid auto-key-locate list\n" -msgstr "%s:%d: neplatn parametr pro oven\n" - -#: g10/gpg.c:2732 -msgid "invalid auto-key-locate list\n" -msgstr "" - -#: g10/gpg.c:2803 -msgid "WARNING: program may create a core file!\n" -msgstr "VAROVN: program me vytvoit soubor core!\n" - -#: g10/gpg.c:2807 -#, c-format -msgid "WARNING: %s overrides %s\n" -msgstr "VAROVN: %s pepe %s\n" - -#: g10/gpg.c:2816 -#, c-format -msgid "%s not allowed with %s!\n" -msgstr "Nen dovoleno pouvat %s s %s!\n" - -#: g10/gpg.c:2819 -#, c-format -msgid "%s makes no sense with %s!\n" -msgstr "%s nedv s %s smysl!\n" - -#: g10/gpg.c:2826 -#, c-format -msgid "NOTE: %s is not available in this version\n" -msgstr "POZNMKA: %s nen v tto verzi dostupn\n" - -#: g10/gpg.c:2841 -#, c-format -msgid "will not run with insecure memory due to %s\n" -msgstr "nelze spustit s nebezpenou pamt vzhledem k %s\n" - -#: g10/gpg.c:2855 -msgid "you can only make detached or clear signatures while in --pgp2 mode\n" -msgstr "" -"v mdu --pgp2 mete vytvet pouze oddlen podpisy nebo podpisy iteln " -"jako text\n" - -#: g10/gpg.c:2861 -msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n" -msgstr "v mdu --pgp2 nelze souasn ifrovat a podepisovat\n" - -#: g10/gpg.c:2867 -msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n" -msgstr "v mdu --pgp2 muste pout soubor (ne rouru).\n" - -#: g10/gpg.c:2880 -msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n" -msgstr "ifrovn zprv v mdu --pgp2 vyaduje algoritmus IDEA\n" - -#: g10/gpg.c:2947 g10/gpg.c:2971 -msgid "selected cipher algorithm is invalid\n" -msgstr "vybran ifrovac algoritmus je neplatn\n" - -#: g10/gpg.c:2953 g10/gpg.c:2977 -msgid "selected digest algorithm is invalid\n" -msgstr "vybran hashovac algoritmus je neplatn\n" - -#: g10/gpg.c:2959 -msgid "selected compression algorithm is invalid\n" -msgstr "vybran komprimovac algoritmus je neplatn\n" - -#: g10/gpg.c:2965 -msgid "selected certification digest algorithm is invalid\n" -msgstr "vybran hashovac algoritmus je neplatn\n" - -#: g10/gpg.c:2980 -msgid "completes-needed must be greater than 0\n" -msgstr "poloka completes-needed mus bt vt ne 0\n" - -#: g10/gpg.c:2982 -msgid "marginals-needed must be greater than 1\n" -msgstr "poloka marginals-needed mus bt vt ne 1\n" - -#: g10/gpg.c:2984 -msgid "max-cert-depth must be in the range from 1 to 255\n" -msgstr "poloka max-cert-depth mus bt v rozmez od 1 do 255\n" - -#: g10/gpg.c:2986 -msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n" -msgstr "" -"neplatn implicitn rove certifikace (default-cert-level); mus bt 0, 1, " -"2 nebo 3\n" - -#: g10/gpg.c:2988 -msgid "invalid min-cert-level; must be 1, 2, or 3\n" -msgstr "" -"neplatn minimln rove certifikace (min-cert-level); mus bt 0, 1, 2 " -"nebo 3\n" - -#: g10/gpg.c:2991 -msgid "NOTE: simple S2K mode (0) is strongly discouraged\n" -msgstr "POZNMKA: jednoduch md S2K (0) je drazn nedoporuovn\n" - -#: g10/gpg.c:2995 -msgid "invalid S2K mode; must be 0, 1 or 3\n" -msgstr "neplatn md S2K; mus bt 0, 1 nebo 3\n" - -#: g10/gpg.c:3002 -msgid "invalid default preferences\n" -msgstr "neplatn defaultn pedvolby\n" - -#: g10/gpg.c:3011 -msgid "invalid personal cipher preferences\n" -msgstr "neplatn uivatelsk pedvolby pro ifrovn\n" - -#: g10/gpg.c:3015 -msgid "invalid personal digest preferences\n" -msgstr "neplatn uivatelsk pedvolby pro hashovn\n" - -#: g10/gpg.c:3019 -msgid "invalid personal compress preferences\n" -msgstr "neplatn uivatelsk pedvolby pro komprimaci\n" - -#: g10/gpg.c:3052 -#, c-format -msgid "%s does not yet work with %s\n" -msgstr "%s dosud nen funkn s %s\n" - -#: g10/gpg.c:3099 -#, c-format -msgid "you may not use cipher algorithm `%s' while in %s mode\n" -msgstr "pouit ifrovacho algoritmu `%s' v mdu %s dovoleno\n" - -#: g10/gpg.c:3104 -#, c-format -msgid "you may not use digest algorithm `%s' while in %s mode\n" -msgstr "pouit hashovacho algoritmu `%s' v mdu %s dovoleno\n" - -#: g10/gpg.c:3109 -#, c-format -msgid "you may not use compression algorithm `%s' while in %s mode\n" -msgstr "pouit komprimanho algoritmu `%s' v mdu %s dovoleno\n" - -#: g10/gpg.c:3208 -#, c-format -msgid "failed to initialize the TrustDB: %s\n" -msgstr "nemohu inicializovat databzi dvry: %s\n" - -#: g10/gpg.c:3219 -msgid "WARNING: recipients (-r) given without using public key encryption\n" -msgstr "" -"VAROVN: specifikovn adrest (-r) bez pouit ifrovn s veejnm klem\n" - -#: g10/gpg.c:3230 -msgid "--store [filename]" -msgstr "--store [jmno souboru]" - -#: g10/gpg.c:3237 -msgid "--symmetric [filename]" -msgstr "--symmetric [jmno souboru]" - -#: g10/gpg.c:3239 -#, c-format -msgid "symmetric encryption of `%s' failed: %s\n" -msgstr "symetrick ifrovn `%s' se nepovedlo: %s\n" - -#: g10/gpg.c:3249 -msgid "--encrypt [filename]" -msgstr "--encrypt [jmno souboru]" - -#: g10/gpg.c:3262 -msgid "--symmetric --encrypt [filename]" -msgstr "--symmetric --encrypt [jmno souboru]" - -#: g10/gpg.c:3264 -msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n" -msgstr "nelze pout --symmetric --encrypt s pkazem --s2k-mode 0\n" - -#: g10/gpg.c:3267 -#, c-format -msgid "you cannot use --symmetric --encrypt while in %s mode\n" -msgstr "nelze pout --symmetric --encrypt v mdu %s\n" - -#: g10/gpg.c:3285 -msgid "--sign [filename]" -msgstr "--sign [jmno souboru]" - -#: g10/gpg.c:3298 -msgid "--sign --encrypt [filename]" -msgstr "--sign --encrypt [jmno souboru]" - -#: g10/gpg.c:3313 -msgid "--symmetric --sign --encrypt [filename]" -msgstr "--symmetric --sign --encrypt [jmno souboru]" - -#: g10/gpg.c:3315 -msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n" -msgstr "nelze pout --symmetric --sign --encrypt s pkazem --s2k-mode 0\n" - -#: g10/gpg.c:3318 -#, c-format -msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n" -msgstr "nelze pout --symmetric --sign --encrypt v mdu %s\n" - -#: g10/gpg.c:3338 -msgid "--sign --symmetric [filename]" -msgstr "--sign --symmetric [jmno souboru]" - -#: g10/gpg.c:3347 -msgid "--clearsign [filename]" -msgstr "--clearsign [jmno souboru]" - -#: g10/gpg.c:3372 -msgid "--decrypt [filename]" -msgstr "--decrypt [jmno souboru]" - -#: g10/gpg.c:3380 -msgid "--sign-key user-id" -msgstr "--sign-key id uivatele" - -#: g10/gpg.c:3384 -msgid "--lsign-key user-id" -msgstr "--lsign-key id uivatele" - -#: g10/gpg.c:3405 -msgid "--edit-key user-id [commands]" -msgstr "--edit-key id uivatele [pkazy]" - -#: g10/gpg.c:3476 -msgid "-k[v][v][v][c] [user-id] [keyring]" -msgstr "-k[v][v][v][c] [id uivatele] [soubor s kli (keyring)]" - -#: g10/gpg.c:3518 -#, c-format -msgid "keyserver send failed: %s\n" -msgstr "odesln na keyserver se nezdailo: %s\n" - -#: g10/gpg.c:3520 -#, c-format -msgid "keyserver receive failed: %s\n" -msgstr "zskn dat z keyserveru se nezdailo: %s\n" - -#: g10/gpg.c:3522 -#, c-format -msgid "key export failed: %s\n" -msgstr "export kle se nepodail: %s\n" - -#: g10/gpg.c:3533 -#, c-format -msgid "keyserver search failed: %s\n" -msgstr "hledn na keyserveru se nezdailo: %s\n" - -#: g10/gpg.c:3543 -#, c-format -msgid "keyserver refresh failed: %s\n" -msgstr "refresh dat na keyserveru se nezdail: %s\n" - -#: g10/gpg.c:3594 -#, c-format -msgid "dearmoring failed: %s\n" -msgstr "dekdovn z ASCII formtu selhalo: %s\n" - -#: g10/gpg.c:3602 -#, c-format -msgid "enarmoring failed: %s\n" -msgstr "kdovn do ASCII formtu selhalo: %s\n" - -#: g10/gpg.c:3689 -#, c-format -msgid "invalid hash algorithm `%s'\n" -msgstr "neplatn hashovac algoritmus `%s'\n" - -#: g10/gpg.c:3812 -msgid "[filename]" -msgstr "[jmno souboru]" - -#: g10/gpg.c:3816 -msgid "Go ahead and type your message ...\n" -msgstr "Zante pst svou zprvu ...\n" - -#: g10/gpg.c:4120 -msgid "the given certification policy URL is invalid\n" -msgstr "zadan URL pro certifikan politiku je neplatn\n" - -#: g10/gpg.c:4122 -msgid "the given signature policy URL is invalid\n" -msgstr "zadan URL pro podepisovac politiku je neplatn\n" - -#: g10/gpg.c:4155 -msgid "the given preferred keyserver URL is invalid\n" -msgstr "zadan URL preferovanho serveru kl je neplat\n" - -#: g10/getkey.c:152 -msgid "too many entries in pk cache - disabled\n" -msgstr "pli mnoho poloek v bufferu veejnch kl - vypnuto\n" - -#: g10/getkey.c:175 -msgid "[User ID not found]" -msgstr "[ID uivatele 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 zmnn na platn pomoc --always-non-selfsigned-uid\n" - -#: g10/getkey.c:2380 g10/keyedit.c:3707 -#, c-format -msgid "no secret subkey for public subkey %s - ignoring\n" -msgstr "neexistuje tajn podkl pro veejn kl %s - ignorovno\n" - -#: g10/getkey.c:2611 -#, c-format -msgid "using subkey %s instead of primary key %s\n" -msgstr "pouvm podkl %s msto primrnho kle %s\n" - -#: g10/getkey.c:2658 -#, c-format -msgid "key %s: secret key without public key - skipped\n" -msgstr "kl %s: tajn kl bez kle veejnho - peskoeno\n" - -#: g10/gpgv.c:74 -msgid "be somewhat more quiet" -msgstr "bt o trochu vc tich" - -#: g10/gpgv.c:75 -msgid "take the keys from this keyring" -msgstr "ber kle z tto klenky (keyringu)" - -#: g10/gpgv.c:77 -msgid "make timestamp conflicts only a warning" -msgstr "pouze varovn pi konfliktu asovho raztka" - -#: 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 "Pouit: gpg [monosti] [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 znmm, dvryhodnm klm\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 Vs, abyste zde piadil(a) hodnotu; tato hodnota nebude nikdy\n" -"exportovna tet stran. Potebujeme ji k implementaci \"pavuiny\n" -"dvry\"; nem to nic spolenho s (implicitn vytvoenou) \"pavuinou\n" -"certifikt\"." - -#: 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 mon vybudovat pavuinu dvry, mus GnuPG vdt, kterm klm\n" -"dvujete absolutn - obvykle to jsou ty kle, pro n mte pstup\n" -"k tajnm klm. Odpovzte \"ano\", abyste nastavili tyto kle\n" -"jako absolutn dvryhodn\n" - -#: g10/helptext.c:62 -msgid "If you want to use this untrusted key anyway, answer \"yes\"." -msgstr "" -"Pokud pesto chcete pout tento nedvryhodn kl, odpovzte \"ano\"." - -#: g10/helptext.c:66 -msgid "" -"Enter the user ID of the addressee to whom you want to send the message." -msgstr "Vlote identifiktor adresta, ktermu chcete poslat zprvu." - -#: 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 pout.\n" -"\n" -"DSA (alias DSS) je Digital Signature Algorithm a me bt pouit pouze pro\n" -"podepisovn.\n" -"\n" -"Elgamal je pouze ifrovac algoritmus.\n" -"\n" -"RSA me bt pouit pro ifrovn anebo podepisovn.\n" -"\n" -"Prvn (primrn) kl mus bt vdy kl, pomoc kterho 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 doporuit pouvat stejn kl pro ifrovn a podepisovn\n" -"Tento algoritmus je vhodn pout jen za jistch podmnek.\n" -"Kontaktujte prosm nejprve bezpenostnho specialistu." - -#: g10/helptext.c:91 -msgid "Enter the size of the key" -msgstr "Vlote dlku kle" - -#: 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 "Odpovzte \"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 "" -"Vlote poadovanou hodnotu tak, jak je uvedeno v pkazovm dku.\n" -"Je mon vloit datum ve formtu ISO (RRRR-MM-DD), ale nedostanete\n" -"sprvnou chybovou hlku - msto toho systm zkus interpretovat\n" -"zadanou hodnotu jako interval." - -#: g10/helptext.c:117 -msgid "Enter the name of the key holder" -msgstr "Vlote jmno dritele kle" - -#: g10/helptext.c:122 -msgid "please enter an optional but highly suggested email address" -msgstr "prosm, vlote e-mailovou adresu (nepovinn, ale velmi doporuovan)" - -#: g10/helptext.c:126 -msgid "Please enter an optional comment" -msgstr "Prosm, vlote 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 zmnu nzvu.\n" -"C pro zmnu komente.\n" -"E pro zmnu e-mailov adresy.\n" -"O pro pokraovn generovn kle.\n" -"Q pro ukonen generovn kle." - -#: g10/helptext.c:140 -msgid "Answer \"yes\" (or just \"y\") if it is okay to generate the sub key." -msgstr "Jestlie chcete generovat podkl, odpovzte \"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 podepete id uivatele, mli byste nejprve ovit, zda kl\n" -"pat osob, jej jmno je uvedeno v identifiktoru uivatele.\n" -"Je velmi uiten, kdy ostatn vd, jak dsledn jste provedl(a)\n" -"takov oven.\n" -"\n" -"\"0\" znamen, e neuvdte, jak dsledn jste pravost kle ovil(a) \n" -"\n" -"\"1\" znamen, e vte tomu, e kl pat osob, kter je uvedena,\n" -" v uivatelskm ID, ale nemohl jste nebo jste neprovil tuto " -"skutenost.\n" -" To je uiten pro \"osobn\" verifikaci, kdy podepisujete kle, " -"kter\n" -" pouvaj pseudonym uivatele.\n" -"\n" -"\"2\" znamen, e jste sten ovil pravost kle. Nap. jste ovil\n" -" fingerprint kle a zkontroloval identifiktor uivatele\n" -" uveden na kli s fotografickm id.\n" -"\n" -"\"3\" Znamen, e jste provedl velmi peliv oven pravosti kle.\n" -" To me napklad znamenat, e jste ovil fingerprint kle \n" -" jeho vlastnka osobn a dle jste pomoc obtn padlatelnho \n" -" dokumentu s fotografi (napklad pasu) ovil, e jmno majitele\n" -" kle se shoduje se jmnem uvedenm v uivatelskm ID a dle jste \n" -" ovil (vmnou elektronickch dopis), e elektronick adresa uveden \n" -" v ID uivatele pat majiteli kle.\n" -"\n" -"Prosm nezapomete, e pklady uveden pro rove 2 a 3 jsou *pouze*\n" -"pklady.\n" -"Je jen na Vaem rozhodnut co \"sten\" a \"peliv\" oven znamen\n" -"kdy budete podepisovat kle jinm uivatelm.\n" -"\n" -"Pokud nevte, jak je sprvn odpov, odpovzte \"0\"." - -#: g10/helptext.c:186 -msgid "Answer \"yes\" if you want to sign ALL the user IDs" -msgstr "" -"Pokud chcete podepsat VECHNY identifiktory uivatel, odpovzte \"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 identifiktor uivatele, odpovzte \"ano" -"\".\n" -"Vechny certifikty budou tak ztraceny!" - -#: g10/helptext.c:195 -msgid "Answer \"yes\" if it is okay to delete the subkey" -msgstr "Odpovzte \"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 kle; normln nechcete tento podpis smazat,\n" -"protoe me bt dleit pi vytven dvry kle nebo jinho kle\n" -"ceritifikovanho tmto klem." - -#: 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 neme bt oven, protoe nemte odpovdajc veejn kl.\n" -"Jeho smazn byste ml(a) odloit do doby, ne budete znt, kter kl\n" -"byl pouit, protoe tento podpisovac kl me vytvoit dvru\n" -"prostednictvm jinho ji certifikovanho kle." - -#: 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 Vaeho 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 ve identifiktor uivatele ke kli. Obvykle\n" -"nen dobr takov podpis odstranit. GnuPG neme tento kl nadle\n" -"pouvat. Udlejte to jenom v ppad, kdy je tento podpis kle\n" -"jm samm z njakho dvodu 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 "" -"Zmnit pedvolby pro vechny uivatelsk ID (nebo pouze pro oznaen)\n" -"na aktuln seznam pedvoleb. asov raztka vech dotench podpis\n" -"kl jimi samotnmi budou posunuty o jednu vteinu dopedu.\n" - -#: g10/helptext.c:230 -msgid "Please enter the passhrase; this is a secret sentence \n" -msgstr "Prosm, vlote heslo; toto je tajn vta \n" - -#: g10/helptext.c:236 -msgid "Please repeat the last passphrase, so you are sure what you typed in." -msgstr "" -"Prosm, 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 nzev souboru, ke ktermu se podpis vztahuje" - -#: g10/helptext.c:245 -msgid "Answer \"yes\" if it is okay to overwrite the file" -msgstr "Pokud si pejete pepsn souboru, odpovzte \"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 "" -"Prosm, vlote nov nzev souboru. Pokud pouze stisknete RETURN, bude\n" -"pouit implicitn soubor (kter je ukzn v zvorkch)." - -#: 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 "" -"Ml(a) byste specifikovat dvod certifikace. V zvislosti na kontextu\n" -"mte monost si vybrat ze seznamu:\n" -" \"Kl byl kompromitovn\"\n" -" Toto pouijte, pokud si myslte, e k Vaemu tajnmu kli zskaly\n" -" pstup neoprvnn osoby.\n" -" \"Kl je nahrazen\"\n" -" Toto pouijte, pokud jste tento kl nahradil(a) novjm klem.\n" -" \"Kl se ji nepouv\"\n" -" Toto pouijte, pokud tento kl ji nepouvte.\n" -" \"Identifiktor uivatele u nen platn\"\n" -" Toto pouijte, pokud by se identifiktor uivatele u neml pouvat;\n" -" normln se pouv k oznaen 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, mete vloit text popisujc pvod vzniku tohoto revokanho\n" -"ceritifiktu. Prosm, strun. \n" -"Text kon przdnm 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 databzi dvry" - -#: g10/import.c:102 -#, fuzzy -msgid "create a public key when importing a secret key" -msgstr "veejn kl neodpovd tajnmu kli!\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 nepouiteln sti z kle" - -#: g10/import.c:108 -msgid "remove as much as possible from key after import" -msgstr "" - -#: g10/import.c:266 -#, c-format -msgid "skipping block of type %d\n" -msgstr "blok typu %d byl peskoen\n" - -#: g10/import.c:275 -#, c-format -msgid "%lu keys processed so far\n" -msgstr "%lu kle byly doposud zpracovny\n" - -#: g10/import.c:292 -#, c-format -msgid "Total number processed: %lu\n" -msgstr "Celkov poet zpracovanch kl: %lu\n" - -#: g10/import.c:294 -#, c-format -msgid " skipped new keys: %lu\n" -msgstr " peskoeny nov kle: %lu\n" - -#: g10/import.c:297 -#, c-format -msgid " w/o user IDs: %lu\n" -msgstr " bez ID uivatele: %lu\n" - -#: g10/import.c:299 -#, c-format -msgid " imported: %lu" -msgstr " importovno: %lu" - -#: g10/import.c:305 -#, c-format -msgid " unchanged: %lu\n" -msgstr " beze zmn: %lu\n" - -#: g10/import.c:307 -#, c-format -msgid " new user IDs: %lu\n" -msgstr " nov ID uivatel: %lu\n" - -#: g10/import.c:309 -#, c-format -msgid " new subkeys: %lu\n" -msgstr " nov podkle: %lu\n" - -#: g10/import.c:311 -#, c-format -msgid " new signatures: %lu\n" -msgstr " nov podpisy: %lu\n" - -#: g10/import.c:313 -#, c-format -msgid " new key revocations: %lu\n" -msgstr " nov revokace kl: %lu\n" - -#: g10/import.c:315 -#, c-format -msgid " secret keys read: %lu\n" -msgstr " peten tajn kle: %lu\n" - -#: g10/import.c:317 -#, c-format -msgid " secret keys imported: %lu\n" -msgstr " importovan tajn kle: %lu\n" - -#: g10/import.c:319 -#, c-format -msgid " secret keys unchanged: %lu\n" -msgstr " tajn kle nezmnny: %lu\n" - -#: g10/import.c:321 -#, c-format -msgid " not imported: %lu\n" -msgstr " neimportovno: %lu\n" - -#: g10/import.c:323 -#, c-format -msgid " signatures cleaned: %lu\n" -msgstr " odstrann podpisy: %lu\n" - -#: g10/import.c:325 -#, c-format -msgid " user IDs cleaned: %lu\n" -msgstr " odstrann uivatelsk ID: %lu\n" - -#: g10/import.c:566 -#, fuzzy, c-format -msgid "WARNING: key %s contains preferences for unavailable\n" -msgstr "VAROVN: 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:570 -#, fuzzy -msgid " algorithms on these user IDs:\n" -msgstr "kter nesjou k dispozici. Tk se to tchto user ID:\n" - -#: g10/import.c:607 -#, c-format -msgid " \"%s\": preference for cipher algorithm %s\n" -msgstr " \"%s\": preference pro ifrovac algortimus %s\n" - -#: g10/import.c:619 -#, c-format -msgid " \"%s\": preference for digest algorithm %s\n" -msgstr " \"%s\": preference pro podepisovac algoritmus %s\n" - -#: g10/import.c:631 -#, c-format -msgid " \"%s\": preference for compression algorithm %s\n" -msgstr " \"%s\": preference pro kompriman algoritmus %s\n" - -#: g10/import.c:644 -msgid "it is strongly suggested that you update your preferences and\n" -msgstr "velmi doporuujeme aktualiaci nastaven vaich preferenc a\n" - -#: g10/import.c:646 -msgid "re-distribute this key to avoid potential algorithm mismatch problems\n" -msgstr "" -"distribuci tohoto kle aby jste pedeel problmm s neshodou algoritm\n" - -#: g10/import.c:670 -#, 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:720 g10/import.c:1118 -#, c-format -msgid "key %s: no user ID\n" -msgstr "kl %s: chyb identifiktor uivatele\n" - -#: g10/import.c:749 -#, c-format -msgid "key %s: PKS subkey corruption repaired\n" -msgstr "kl %s: PKS pokozen podkle opraveno\n" - -# c-format -#: g10/import.c:764 -#, c-format -msgid "key %s: accepted non self-signed user ID \"%s\"\n" -msgstr "kl %s: pijat id uivatele \"%s\",kter nen podepsn jm samm\n" - -#: g10/import.c:770 -#, c-format -msgid "key %s: no valid user IDs\n" -msgstr "kl %s: chyb platn identifiktor uivatele\n" - -#: g10/import.c:772 -msgid "this may be caused by a missing self-signature\n" -msgstr "me to bt zpsobeno chybjcm podpisem kle jm samm\n" - -#: g10/import.c:782 g10/import.c:1240 -#, c-format -msgid "key %s: public key not found: %s\n" -msgstr "kl %s: veejn kl nenalezen: %s\n" - -#: g10/import.c:788 -#, c-format -msgid "key %s: new key - skipped\n" -msgstr "kl %s: nov kl - peskoen\n" - -#: g10/import.c:797 -#, 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:802 g10/openfile.c:267 g10/sign.c:831 g10/sign.c:1135 -#, c-format -msgid "writing to `%s'\n" -msgstr "zapisuji do '%s'\n" - -#: g10/import.c:806 g10/import.c:901 g10/import.c:1158 g10/import.c:1301 -#: g10/import.c:2363 g10/import.c:2385 -#, c-format -msgid "error writing keyring `%s': %s\n" -msgstr "chyba pi zpisu souboru kl (keyring) `%s': %s\n" - -#: g10/import.c:825 -#, c-format -msgid "key %s: public key \"%s\" imported\n" -msgstr "kl %s: veejn kl \"%s\" importovn\n" - -#: g10/import.c:849 -#, c-format -msgid "key %s: doesn't match our copy\n" -msgstr "kl %s: neodpovd na kopii\n" - -#: g10/import.c:866 g10/import.c:1258 -#, c-format -msgid "key %s: can't locate original keyblock: %s\n" -msgstr "kl %s: nemohu najt originln blok kle: %s\n" - -#: g10/import.c:874 g10/import.c:1265 -#, c-format -msgid "key %s: can't read original keyblock: %s\n" -msgstr "kl %s: nemohu st originln blok kle: %s\n" - -#: g10/import.c:911 -#, c-format -msgid "key %s: \"%s\" 1 new user ID\n" -msgstr "kl %s: \"%s\" 1 nov identifiktor uivatele\n" - -#: g10/import.c:914 -#, c-format -msgid "key %s: \"%s\" %d new user IDs\n" -msgstr "kl %s: \"%s\" %d novch identifiktor uivatele\n" - -#: g10/import.c:917 -#, c-format -msgid "key %s: \"%s\" 1 new signature\n" -msgstr "kl %s: \"%s\" 1 nov podpis\n" - -#: g10/import.c:920 -#, c-format -msgid "key %s: \"%s\" %d new signatures\n" -msgstr "kl %s: \"%s\" %d novch podpis\n" - -#: g10/import.c:923 -#, c-format -msgid "key %s: \"%s\" 1 new subkey\n" -msgstr "kl %s: \"%s\" 1 nov podkl\n" - -#: g10/import.c:926 -#, c-format -msgid "key %s: \"%s\" %d new subkeys\n" -msgstr "kl %s: \"%s\" %d novch podkl\n" - -#: g10/import.c:929 -#, c-format -msgid "key %s: \"%s\" %d signature cleaned\n" -msgstr "kl %s: \"%s\" %d podpis odstranno\n" - -#: g10/import.c:932 -#, c-format -msgid "key %s: \"%s\" %d signatures cleaned\n" -msgstr "kl %s: \"%s\" %d podpis odstranno\n" - -#: g10/import.c:935 -#, c-format -msgid "key %s: \"%s\" %d user ID cleaned\n" -msgstr "kl %s: \"%s\" %d ID uivatele odstranno\n" - -#: g10/import.c:938 -#, c-format -msgid "key %s: \"%s\" %d user IDs cleaned\n" -msgstr "kl %s: \"%s\" %d ID uivatele odstranno\n" - -#: g10/import.c:961 -#, c-format -msgid "key %s: \"%s\" not changed\n" -msgstr "kl %s: \"%s\" beze zmn\n" - -#: g10/import.c:1124 -#, c-format -msgid "key %s: secret key with invalid cipher %d - skipped\n" -msgstr "kl %s: tajn kl s neplatnou ifrou %d - peskoeno\n" - -#: g10/import.c:1135 -msgid "importing secret keys not allowed\n" -msgstr "import tajnch kl nen povolen\n" - -#: g10/import.c:1152 g10/import.c:2378 -#, c-format -msgid "no default secret keyring: %s\n" -msgstr "nen nastaven implicitn soubor tajnch kl %s\n" - -#: g10/import.c:1163 -#, c-format -msgid "key %s: secret key imported\n" -msgstr "kl %s: tajn kl importovn\n" - -#: g10/import.c:1193 -#, c-format -msgid "key %s: already in secret keyring\n" -msgstr "kl %s: je ji v souboru tajnch kl\n" - -#: g10/import.c:1203 -#, c-format -msgid "key %s: secret key not found: %s\n" -msgstr "kl %s: nenalezen tajn kl: %s\n" - -#: g10/import.c:1233 -#, c-format -msgid "key %s: no public key - can't apply revocation certificate\n" -msgstr "kl %s: chyb veejn kl - nemohu aplikovat revokan certifikt\n" - -#: g10/import.c:1276 -#, c-format -msgid "key %s: invalid revocation certificate: %s - rejected\n" -msgstr "kl %s: neplatn revokan certifikt: %s - zamtnuto\n" - -#: g10/import.c:1308 -#, c-format -msgid "key %s: \"%s\" revocation certificate imported\n" -msgstr "kl %s: \"%s\" revokan certifikt importovn\n" - -#: g10/import.c:1374 -#, c-format -msgid "key %s: no user ID for signature\n" -msgstr "kl %s: neexistuje id uivatele pro podpis\n" - -#: g10/import.c:1389 -#, c-format -msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n" -msgstr "" -"kl %s: nepodporovan algoritmus veejnho kle u uivatelskho id \"%s" -"\"\n" - -#: g10/import.c:1391 -#, c-format -msgid "key %s: invalid self-signature on user ID \"%s\"\n" -msgstr "kl %s neplatn podpis kle jm samm u uivatelskho id \"%s\"\n" - -#: g10/import.c:1409 -#, c-format -msgid "key %s: no subkey for key binding\n" -msgstr "kl %s: neexistuje podkl pro vzn kl\n" - -#: g10/import.c:1420 g10/import.c:1470 -#, c-format -msgid "key %s: unsupported public key algorithm\n" -msgstr "kl %s: nepodporovan algoritmus veejnho kle\n" - -#: g10/import.c:1422 -#, c-format -msgid "key %s: invalid subkey binding\n" -msgstr "kl %s: neplatn vazba podkle\n" - -#: g10/import.c:1437 -#, c-format -msgid "key %s: removed multiple subkey binding\n" -msgstr "kl %s: smazna vcensobn vazba podkle\n" - -#: g10/import.c:1459 -#, c-format -msgid "key %s: no subkey for key revocation\n" -msgstr "kl %s: neexistuje podkl pro revokaci kle\n" - -#: g10/import.c:1472 -#, c-format -msgid "key %s: invalid subkey revocation\n" -msgstr "kl %s: neplatn revokan podkl\n" - -#: g10/import.c:1487 -#, c-format -msgid "key %s: removed multiple subkey revocation\n" -msgstr "kl %s: smazna vcensobn revokace podkle\n" - -#: g10/import.c:1529 -#, c-format -msgid "key %s: skipped user ID \"%s\"\n" -msgstr "kl %s: peskoen identifiktor uivatele \"%s\"\n" - -#: g10/import.c:1550 -#, c-format -msgid "key %s: skipped subkey\n" -msgstr "kl %s: podkl peskoen\n" - -#: g10/import.c:1577 -#, c-format -msgid "key %s: non exportable signature (class 0x%02X) - skipped\n" -msgstr "kl %s: podpis nen exportovateln (tda %02X) - peskoeno\n" - -#: g10/import.c:1587 -#, c-format -msgid "key %s: revocation certificate at wrong place - skipped\n" -msgstr "kl %s: revokan certifikt na patnm mst - peskoeno \n" - -#: g10/import.c:1604 -#, c-format -msgid "key %s: invalid revocation certificate: %s - skipped\n" -msgstr "kl %s: neplatn revokan certifikt: %s - peskoen\n" - -#: g10/import.c:1618 -#, c-format -msgid "key %s: subkey signature in wrong place - skipped\n" -msgstr "kl %s: podpis podkle na patnm mst - peskoeno \n" - -#: g10/import.c:1626 -#, c-format -msgid "key %s: unexpected signature class (0x%02X) - skipped\n" -msgstr "kl %s: neoekvan podpisov tda (0x%02X) - peskoeno\n" - -#: g10/import.c:1726 -#, c-format -msgid "key %s: duplicated user ID detected - merged\n" -msgstr "kl %s: objeven duplikovan identifiktor uivatele - slouen\n" - -#: g10/import.c:1788 -#, c-format -msgid "WARNING: key %s may be revoked: fetching revocation key %s\n" -msgstr "" -"VAROVN: kl %s me bt revokovn: zkoum zskat revokan kl %s\n" - -#: g10/import.c:1802 -#, c-format -msgid "WARNING: key %s may be revoked: revocation key %s not present.\n" -msgstr "VAROVN: kl %s me bt revokovn: revokan kl %s nenalezen.\n" - -#: g10/import.c:1861 -#, c-format -msgid "key %s: \"%s\" revocation certificate added\n" -msgstr "kl %s: \"%s\" pidn revokan certifikt\n" - -#: g10/import.c:1895 -#, c-format -msgid "key %s: direct key signature added\n" -msgstr "kl %s: podpis kle jm samm (direct key signature) pidn\n" - -#: g10/import.c:2284 -msgid "NOTE: a key's S/N does not match the card's one\n" -msgstr "POZNMKA: S/N kle neodpovd S/N karty\n" - -#: g10/import.c:2292 -msgid "NOTE: primary key is online and stored on card\n" -msgstr "POZNMKA: primrn kl je online a je uloen na kart\n" - -#: g10/import.c:2294 -msgid "NOTE: secondary key is online and stored on card\n" -msgstr "POZNMKA: sekundrn kl je online a je uloen na kart\n" - -#: g10/keydb.c:168 -#, c-format -msgid "error creating keyring `%s': %s\n" -msgstr "chyba pi vytven souboru kl (keyring)`%s': %s\n" - -#: g10/keydb.c:175 -#, c-format -msgid "keyring `%s' created\n" -msgstr "soubor kl (keyring) `%s' vytvoen\n" - -#: g10/keydb.c:316 g10/keydb.c:319 -#, c-format -msgid "keyblock resource `%s': %s\n" -msgstr "zdroj bloku kle `%s': %s\n" - -#: g10/keydb.c:698 -#, c-format -msgid "failed to rebuild keyring cache: %s\n" -msgstr "selhalo obnoven vyrovnvac pamti kl: %s\n" - -#: g10/keyedit.c:266 -msgid "[revocation]" -msgstr "[revokace]" - -#: g10/keyedit.c:267 -msgid "[self-signature]" -msgstr "[podpis kle jm samm]" - -#: 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 patnch podpis\n" - -#: g10/keyedit.c:349 g10/keylist.c:394 -msgid "1 signature not checked due to a missing key\n" -msgstr "1 podpis neoven, protoe 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 neovench, protoe chyb kl\n" - -#: g10/keyedit.c:353 g10/keylist.c:398 -msgid "1 signature not checked due to an error\n" -msgstr "1 podpis neoven, protoe 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 neovench, protoe vznikly chyby\n" - -#: g10/keyedit.c:357 -msgid "1 user ID without valid self-signature detected\n" -msgstr "objeven 1 identifiktor uivatele bez platnho podpisu jm samm\n" - -#: g10/keyedit.c:359 -#, c-format -msgid "%d user IDs without valid self-signatures detected\n" -msgstr "objeveno %d identifiktor uivatele bez platnho podpisu jm samm\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 "" -"Prosm rozhodnte, nakolik dvete tomuto uivateli, e sprvn\n" -"verifikuje kle jinch uivatel (prohldnutm cestovnch pas,\n" -"kontrolou fingerprint z rznch zdroj...)?\n" -"\n" - -#: g10/keyedit.c:419 g10/pkclist.c:275 -#, c-format -msgid " %d = I trust marginally\n" -msgstr " %d = Dvuji sten\n" - -#: g10/keyedit.c:420 g10/pkclist.c:277 -#, c-format -msgid " %d = I trust fully\n" -msgstr " %d = Dvuji 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 "" -"Prosm vlote hloubku dvry (depth trust) k tomuto podpisu.\n" -"Hloubka vt ne 1 umouje klm, kter jste podepsal\n" -"podepsat jin kl, kter bude pro Vs dvryhodn.\n" - -#: g10/keyedit.c:455 -msgid "Please enter a domain to restrict this signature, or enter for none.\n" -msgstr "" -"Prosm vlote domnu, pro kterou je podpis omezen nebo stisknte enter pro " -"podpis bez omezen na domnu.\n" - -#: g10/keyedit.c:599 -#, c-format -msgid "User ID \"%s\" is revoked." -msgstr "Uivatelsk ID \"%s\" je revokovno." - -#: 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 stle 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 "Vyprela platnost uivatelskho ID \"%s\"." - -#: g10/keyedit.c:655 -#, c-format -msgid "User ID \"%s\" is not self-signed." -msgstr "ID uivatele \"%s\" nen podepsno jm samm." - -#: g10/keyedit.c:683 -#, c-format -msgid "User ID \"%s\" is signable. " -msgstr "ID uivatele \"%s\" je pipraveno 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 kle \"%s\" jm samm je\n" -"podpis formtu PGP 2.x.\n" - -#: g10/keyedit.c:716 -msgid "Do you want to promote it to an OpenPGP self-signature? (y/N) " -msgstr "Pejete si jej zmnit na formt OpenPGP? (a/N) " - -#: g10/keyedit.c:730 -#, c-format -msgid "" -"Your current signature on \"%s\"\n" -"has expired.\n" -msgstr "" -"Platnost Vaeho podpisu na \"%s\"\n" -"vyprela.\n" -"\n" - -#: g10/keyedit.c:734 -msgid "Do you want to issue a new signature to replace the expired one? (y/N) " -msgstr "" -"Chcete vytvoit nov podpis a nahradit jm ten, jeho platnost vyprela? (a/" -"N) " - -#: g10/keyedit.c:755 -#, c-format -msgid "" -"Your current signature on \"%s\"\n" -"is a local signature.\n" -msgstr "" -"Va souasn podpis na \"%s\"\n" -"je pouze lokln.\n" -"\n" - -#: g10/keyedit.c:759 -msgid "Do you want to promote it to a full exportable signature? (y/N) " -msgstr "Pejete si jej zmnit 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 lokln podepsn klem %s\n" - -#: g10/keyedit.c:783 -#, c-format -msgid "\"%s\" was already signed by key %s\n" -msgstr "\"%s\" je ji podepsn klem %s\n" - -#: g10/keyedit.c:788 -msgid "Do you want to sign it again anyway? (y/N) " -msgstr "Chcete kl pesto znova podepsat? (a/N) " - -#: g10/keyedit.c:810 -#, c-format -msgid "Nothing to sign with key %s\n" -msgstr "Nic k podepsn klem %s\n" - -#: g10/keyedit.c:825 -msgid "This key has expired!" -msgstr "Platnost kle vyprela!" - -#: g10/keyedit.c:843 -#, c-format -msgid "This key is due to expire on %s.\n" -msgstr "Platnost kle 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 Vaeho podpisu vyprela 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 "" -"Nemete udlat OpenPGP podpis kle typu PGP 2.x, kdy jste v --pgp2 mdu.\n" - -#: g10/keyedit.c:891 -msgid "This would make the key unusable in PGP 2.x.\n" -msgstr "To by zpsobilo nepouitelnost kle 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 provili, e kl, kter chcete podepsat\n" -"pat ve uveden osob.\n" -"Pokud neznte odpov, zadejte \"0\".\n" - -#: g10/keyedit.c:921 -#, c-format -msgid " (0) I will not answer.%s\n" -msgstr " (0) Neodpovm.%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) sten jsem to ovil(a).%s\n" - -#: g10/keyedit.c:927 -#, c-format -msgid " (3) I have done very careful checking.%s\n" -msgstr " (3) Velmi peliv jsem to ovil(a).%s\n" - -#: g10/keyedit.c:933 -msgid "Your selection? (enter `?' for more information): " -msgstr "Va vbr? (pro vce informac vlote '?'): " - -#: 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" -"svm klem \"%s\" (%s)\n" - -#: g10/keyedit.c:964 -msgid "This will be a self-signature.\n" -msgstr "Jedn se o podpis kle jm samm.\n" - -#: g10/keyedit.c:970 -msgid "WARNING: the signature will not be marked as non-exportable.\n" -msgstr "VAROVN: podpis nebude oznaen jako neexportovateln.\n" - -#: g10/keyedit.c:978 -msgid "WARNING: the signature will not be marked as non-revocable.\n" -msgstr "VAROVN: podpis nebude oznaen jako neodvolateln (non-revocable).\n" - -#: g10/keyedit.c:988 -msgid "The signature will be marked as non-exportable.\n" -msgstr "Podpis bude oznaen jako neexportovateln.\n" - -#: g10/keyedit.c:995 -msgid "The signature will be marked as non-revocable.\n" -msgstr "Podpis bude oznaen jako neodvolateln (non-revocable).\n" - -#: g10/keyedit.c:1002 -msgid "I have not checked this key at all.\n" -msgstr "Nijak jsem tento kl neovil.\n" - -#: g10/keyedit.c:1007 -msgid "I have checked this key casually.\n" -msgstr "sten jsem ovil tento kl.\n" - -#: g10/keyedit.c:1012 -msgid "I have checked this key very carefully.\n" -msgstr "Velmi peliv jsem ovil tento kl.\n" - -#: g10/keyedit.c:1022 -msgid "Really sign? (y/N) " -msgstr "Skuten podepsat? (a/N) " - -#: g10/keyedit.c:1067 g10/keyedit.c:4783 g10/keyedit.c:4874 g10/keyedit.c:4938 -#: g10/keyedit.c:4999 g10/sign.c:352 -#, c-format -msgid "signing failed: %s\n" -msgstr "podepsn 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 souet kle nebo je kl na kart - passphrase " -"nelze zmnit.\n" - -#: g10/keyedit.c:1143 g10/keygen.c:3199 -msgid "This key is not protected.\n" -msgstr "Tento kl nen chrnn.\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 primrnho kle 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 primrnho kle jsou uloeny na kart.\n" - -#: g10/keyedit.c:1155 g10/keygen.c:3206 -msgid "Key is protected.\n" -msgstr "Kl je chrnn.\n" - -#: g10/keyedit.c:1179 -#, c-format -msgid "Can't edit this key: %s\n" -msgstr "Nen mon editovat tento kl: %s\n" - -#: g10/keyedit.c:1185 -msgid "" -"Enter the new passphrase for this secret key.\n" -"\n" -msgstr "" -"Vlote 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 zopakovno sprvn; 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 npad!\n" -"\n" - -#: g10/keyedit.c:1202 -msgid "Do you really want to do this? (y/N) " -msgstr "Opravdu to chcete udlat? (a/N) " - -#: g10/keyedit.c:1273 -msgid "moving a key signature to the correct place\n" -msgstr "pesunuji podpis kle na sprvn msto\n" - -#: g10/keyedit.c:1359 -msgid "save and quit" -msgstr "uloit a ukonit" - -#: g10/keyedit.c:1362 -msgid "show key fingerprint" -msgstr "vypsat fingerprint kle" - -#: g10/keyedit.c:1363 -msgid "list key and user IDs" -msgstr "vypsat seznam kl a id uivatel" - -#: g10/keyedit.c:1365 -msgid "select user ID N" -msgstr "vyberte identifiktor uivatele 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 uivatele [* ne jsou uvedeny relevantn pkazy]" - -#: g10/keyedit.c:1377 -msgid "sign selected user IDs locally" -msgstr "podepsat vybran uivatelsk ID lokln" - -#: g10/keyedit.c:1379 -msgid "sign selected user IDs with a trust signature" -msgstr "podepsat vybran uivatelsk ID dvryhodnm podpisem" - -#: g10/keyedit.c:1381 -msgid "sign selected user IDs with a non-revocable signature" -msgstr "podepsat vybran uivatelsk ID nerevokovatelnm podpisem" - -#: g10/keyedit.c:1385 -msgid "add a user ID" -msgstr "pidat identifiktor uivatele" - -#: g10/keyedit.c:1387 -msgid "add a photo ID" -msgstr "pidat fotografick ID" - -#: g10/keyedit.c:1389 -msgid "delete selected user IDs" -msgstr "smazat vybran ID uivatele" - -#: g10/keyedit.c:1394 -msgid "add a subkey" -msgstr "pidat podkly" - -#: g10/keyedit.c:1398 -msgid "add a key to a smartcard" -msgstr "pidat kl na kartu" - -#: g10/keyedit.c:1400 -msgid "move a key to a smartcard" -msgstr "pesunout kl na kartu" - -#: g10/keyedit.c:1402 -msgid "move a backup key to a smartcard" -msgstr "pesunout zlon kl na kartu" - -#: g10/keyedit.c:1406 -msgid "delete selected subkeys" -msgstr "smazat vybran podkle" - -#: g10/keyedit.c:1408 -msgid "add a revocation key" -msgstr "pidat revokan kl" - -#: g10/keyedit.c:1410 -msgid "delete signatures from the selected user IDs" -msgstr "smazat podpisy z vybranch uivatelskch ID" - -#: g10/keyedit.c:1412 -msgid "change the expiration date for the key or selected subkeys" -msgstr "zmnit datum expirace pro kl nebo vybran podkle" - -#: g10/keyedit.c:1414 -msgid "flag the selected user ID as primary" -msgstr "oznait vybran uivatelsk ID jako primrn" - -#: g10/keyedit.c:1416 -msgid "toggle between the secret and public key listings" -msgstr "pepnout mezi vypisem seznamu tajnch a veejnch kl" - -#: g10/keyedit.c:1419 -msgid "list preferences (expert)" -msgstr "vypsat seznam pedvoleb (pro experty)" - -#: g10/keyedit.c:1421 -msgid "list preferences (verbose)" -msgstr "vypsat seznam pedvoleb (podrobn)" - -#: g10/keyedit.c:1423 -msgid "set preference list for the selected user IDs" -msgstr "nastavit sadu preferenc pro vybran uivatelsk ID" - -#: g10/keyedit.c:1428 -#, fuzzy -msgid "set the preferred keyserver URL for the selected user IDs" -msgstr "nastavit URL preferovanho server kl pro vybran uivatelsk ID" - -#: g10/keyedit.c:1430 -#, fuzzy -msgid "set a notation for the selected user IDs" -msgstr "nastavit sadu preferenc pro vybran uivatelsk ID" - -#: g10/keyedit.c:1432 -msgid "change the passphrase" -msgstr "zmnit heslo" - -#: g10/keyedit.c:1436 -msgid "change the ownertrust" -msgstr "zmnit dvryhodnost vlastnka kle" - -#: g10/keyedit.c:1438 -msgid "revoke signatures on the selected user IDs" -msgstr "revokovat podpisu na vybranch uivatelskch ID" - -#: g10/keyedit.c:1440 -msgid "revoke selected user IDs" -msgstr "revokovat vybran uivatelsk ID" - -#: g10/keyedit.c:1445 -msgid "revoke key or selected subkeys" -msgstr "revokovat kl nebo vybran podkle" - -#: 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 "ukzat 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 pi ten bloku tajnho kle \"%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 tto operace je poteba tajn kl.\n" - -#: g10/keyedit.c:1677 -msgid "Please use the command \"toggle\" first.\n" -msgstr "Prosm, nejdve pouijte pkaz \"toggle\" (pepnout).\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 "" -"* Pkaz `sign' me bt pouit s prefixem `l' pro lokln podpis (lsign),\n" -" s prefixem `t' pro dvryhodn 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 revokovn." - -#: g10/keyedit.c:1755 -msgid "Really sign all user IDs? (y/N) " -msgstr "Opravdu podepsat vechny id uivatele? (a/N) " - -#: g10/keyedit.c:1762 -msgid "Hint: Select the user IDs to sign\n" -msgstr "Npovda: Vyberte id uivatele k podepsn\n" - -#: g10/keyedit.c:1771 -#, c-format -msgid "Unknown signature type `%s'\n" -msgstr "Neznm typ podpisu `%s'\n" - -#: g10/keyedit.c:1794 -#, c-format -msgid "This command is not allowed while in %s mode.\n" -msgstr "Tento pkaz nen v md %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 "Muste vybrat alespo jeden id uivatele.\n" - -#: g10/keyedit.c:1818 -msgid "You can't delete the last user ID!\n" -msgstr "Nemete smazat posledn id uivatele!\n" - -#: g10/keyedit.c:1820 -msgid "Really remove all selected user IDs? (y/N) " -msgstr "Opravdu odstranit vechny vybran id uivatele? (a/N) " - -#: g10/keyedit.c:1821 -msgid "Really remove this user ID? (y/N) " -msgstr "Opravdu odstranit tento id uivatele? (a/N) " - -#: g10/keyedit.c:1871 -msgid "Really move the primary key? (y/N) " -msgstr "Opravdu pesunout primrn kl? (a/N) " - -#: g10/keyedit.c:1883 -msgid "You must select exactly one key.\n" -msgstr "Muste vybrat prv jeden kl.\n" - -#: g10/keyedit.c:1911 -msgid "Command expects a filename argument\n" -msgstr "Pkaz oekv jmno souboru jako argument\n" - -#: g10/keyedit.c:1925 -#, c-format -msgid "Can't open `%s': %s\n" -msgstr "Nemohu otevt `%s': %s\n" - -#: g10/keyedit.c:1942 -#, c-format -msgid "Error reading backup key from `%s': %s\n" -msgstr "Chyba pi ten zlonho kle z `%s': %s\n" - -#: g10/keyedit.c:1966 -msgid "You must select at least one key.\n" -msgstr "Muste 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 kle? (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 vechny vybran id uivatele? (a/N) " - -#: g10/keyedit.c:2006 -msgid "Really revoke this user ID? (y/N) " -msgstr "Opravdu revokovat tento id uivatele? (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 podkle? (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 "" -"Dvryhodnost vlastnka nelze mnit je-li pouvna databze dvry " -"poskytnut uivatelem\n" - -#: g10/keyedit.c:2129 -msgid "Set preference list to:\n" -msgstr "Nastavit seznam pedvoleb:\n" - -#: g10/keyedit.c:2135 -msgid "Really update the preferences for the selected user IDs? (y/N) " -msgstr "Opravdu aktualizovat pedvolby pro vybran id uivatele? (a/N) " - -#: g10/keyedit.c:2137 -msgid "Really update the preferences? (y/N) " -msgstr "Opravdu aktualizovat pedvolby? (a/N) " - -#: g10/keyedit.c:2205 -msgid "Save changes? (y/N) " -msgstr "Uloit zmny? (a/N) " - -#: g10/keyedit.c:2208 -msgid "Quit without saving? (y/N) " -msgstr "Ukonit bez uloen? (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 tajnho kle selhala: %s\n" - -#: g10/keyedit.c:2232 -msgid "Key not changed so no update needed.\n" -msgstr "Kl nebyl zmnn, take nen poteba 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" -"Monosti:\n" -" " - -#: g10/keyedit.c:2630 -msgid "There are no preferences on a PGP 2.x-style user ID.\n" -msgstr "Uivatelsk ID formtu PGP 2.x nem dn pedvolby\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 klem %s\n" - -#: g10/keyedit.c:2710 -#, c-format -msgid "This key may be revoked by %s key %s" -msgstr "Tento kl me bt revokovn %s klem %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 "vytvoen: %s" - -#: g10/keyedit.c:2735 g10/keylist.c:771 g10/keylist.c:865 g10/mainproc.c:964 -#, c-format -msgid "revoked: %s" -msgstr "revokovn: %s" - -#: g10/keyedit.c:2737 g10/keylist.c:742 g10/keylist.c:777 g10/keylist.c:871 -#, c-format -msgid "expired: %s" -msgstr "platnost skonila: %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 "pouit: %s" - -#: g10/keyedit.c:2756 -#, c-format -msgid "trust: %s" -msgstr "dvra: %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 oznaen 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 "" -"Prosm nezapomete, e zobrazovan daje o platnosti kl nemus\n" -"bt nutn sprvn, dokud znova nespustte 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 "revokovn" - -#: 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 skonila" - -#: 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 "" -"VAROVN: dn uivatelsk ID nebylo oznaeno jako primrn. Tento pkaz\n" -" me zpsobit, e za primrn bude povaovno 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 "" -"VAROVN: Toto je PGP2 kl. Pidn fotografickho ID me v nkterch\n" -" verzch PGP vst k odmtnut tohoto kle.\n" - -#: g10/keyedit.c:3016 g10/keyedit.c:3346 -msgid "Are you sure you still want to add it? (y/N) " -msgstr "Jste si jist, e jej chcete stle pidat? (a/N) " - -#: g10/keyedit.c:3022 -msgid "You may not add a photo ID to a PGP2-style key.\n" -msgstr "Nemli by jste pidvat fotografick ID k PGP2 kli.\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 neznm podpis? (a/N/u)" - -#: g10/keyedit.c:3182 -msgid "Really delete this self-signature? (y/N)" -msgstr "Opravdu smazat tento podpis podepsan sebou samm? (a/N)" - -#: g10/keyedit.c:3196 -#, c-format -msgid "Deleted %d signature.\n" -msgstr "Smazn %d podpis.\n" - -#: g10/keyedit.c:3197 -#, c-format -msgid "Deleted %d signatures.\n" -msgstr "Smazno %d podpis.\n" - -#: g10/keyedit.c:3200 -msgid "Nothing deleted.\n" -msgstr "Nic nebylo smazno.\n" - -#: g10/keyedit.c:3233 g10/trustdb.c:1703 -msgid "invalid" -msgstr "neplatn" - -#: g10/keyedit.c:3249 -#, fuzzy, c-format -msgid "User ID \"%s\": already clean\n" -msgstr "Uivatelsk ID \"%s\": je ji odstranno.\n" - -#: g10/keyedit.c:3341 -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 "" -"VAROVN: Toto je PGP2 kl. Pidn 'poven revokace' me v nkterch\n" -" verzch PGP vst k odmtnut tohoto kle.\n" - -#: g10/keyedit.c:3352 -msgid "You may not add a designated revoker to a PGP 2.x-style key.\n" -msgstr "Nemli by jste pidvat 'poven revokace' k PGP2 kli.\n" - -#: g10/keyedit.c:3372 -msgid "Enter the user ID of the designated revoker: " -msgstr "Vlote identifiktor uivatele povenho revokac: " - -#: g10/keyedit.c:3397 -msgid "cannot appoint a PGP 2.x style key as a designated revoker\n" -msgstr "kl formtu PGP 2.x nelze povit revokac\n" - -#: g10/keyedit.c:3412 -msgid "you cannot appoint a key as its own designated revoker\n" -msgstr "kl nelze povit revokac jm samm\n" - -#: g10/keyedit.c:3434 -msgid "this key has already been designated as a revoker\n" -msgstr "tento kl ji bykl poven revokac\n" - -#: g10/keyedit.c:3453 -msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n" -msgstr "" -"VAROVN: ustanoven kle 'povenm revoktorem' je nevratn operace!\n" - -#: g10/keyedit.c:3459 -msgid "" -"Are you sure you want to appoint this key as a designated revoker? (y/N) " -msgstr "Jste si jist, e tento kl chcete povit revokac? (a/N) " - -#: g10/keyedit.c:3520 -msgid "Please remove selections from the secret keys.\n" -msgstr "Prosm, odstrate vbr z tajnch kl.\n" - -#: g10/keyedit.c:3526 -msgid "Please select at most one subkey.\n" -msgstr "Prosm, vyberte nejve jeden podkl.\n" - -#: g10/keyedit.c:3530 -msgid "Changing expiration time for a subkey.\n" -msgstr "Mnm dobu expirace podkle.\n" - -#: g10/keyedit.c:3533 -msgid "Changing expiration time for the primary key.\n" -msgstr "Mnm dobu expirace primrnho kle.\n" - -#: g10/keyedit.c:3579 -msgid "You can't change the expiration date of a v3 key\n" -msgstr "Nemete zmnit dobu platnosti kle verze 3\n" - -#: g10/keyedit.c:3595 -msgid "No corresponding signature in secret ring\n" -msgstr "V souboru tajnch kl chyb odpovdajc podpis\n" - -#: g10/keyedit.c:3668 -#, fuzzy, c-format -msgid "signing subkey %s is already cross-certified\n" -msgstr "VAROVN: podepisovac podkl %s nen kov certifikovn\n" - -#: g10/keyedit.c:3674 -#, c-format -msgid "subkey %s does not sign and so does not need to be cross-certified\n" -msgstr "" - -#: g10/keyedit.c:3836 -msgid "Please select exactly one user ID.\n" -msgstr "Prosm, vyberte prv jeden id uivatele .\n" - -#: g10/keyedit.c:3875 g10/keyedit.c:3985 g10/keyedit.c:4105 g10/keyedit.c:4246 -#, c-format -msgid "skipping v3 self-signature on user ID \"%s\"\n" -msgstr "peskoen v3 podpis kle jm samm u uivatelskho id \"%s\"\n" - -#: g10/keyedit.c:4046 -msgid "Enter your preferred keyserver URL: " -msgstr "Vlote URL preferovanho keyserveru: " - -#: g10/keyedit.c:4126 -msgid "Are you sure you want to replace it? (y/N) " -msgstr "Jste si jist(), e jej chcete pepsat? (a/N) " - -#: g10/keyedit.c:4127 -msgid "Are you sure you want to delete it? (y/N) " -msgstr "Jste si jist(), e jej chcete smazat? (a/N) " - -#: g10/keyedit.c:4189 -#, fuzzy -msgid "Enter the notation: " -msgstr "Podepisovac notace: " - -#: g10/keyedit.c:4338 -#, fuzzy -msgid "Proceed? (y/N) " -msgstr "Pepsat (a/N)? " - -#: g10/keyedit.c:4402 -#, c-format -msgid "No user ID with index %d\n" -msgstr "Neexistuje identifiktor uivatele s indexem %d\n" - -#: g10/keyedit.c:4460 -#, c-format -msgid "No user ID with hash %s\n" -msgstr "Neexistuje uivatelsk ID s hashem %s\n" - -#: g10/keyedit.c:4487 -#, c-format -msgid "No subkey with index %d\n" -msgstr "Neexistuje podkl s indexem %d\n" - -#: g10/keyedit.c:4622 -#, c-format -msgid "user ID: \"%s\"\n" -msgstr "id uivatele:\"%s\"\n" - -#: g10/keyedit.c:4625 g10/keyedit.c:4689 g10/keyedit.c:4732 -#, c-format -msgid "signed by your key %s on %s%s%s\n" -msgstr "podepsno vam klem %s v %s%s%s\n" - -#: g10/keyedit.c:4627 g10/keyedit.c:4691 g10/keyedit.c:4734 -msgid " (non-exportable)" -msgstr " (neexportovateln)" - -#: g10/keyedit.c:4631 -#, c-format -msgid "This signature expired on %s.\n" -msgstr "Platnost podpisu vypr %s.\n" - -#: g10/keyedit.c:4635 -msgid "Are you sure you still want to revoke it? (y/N) " -msgstr "Jste si jist, e jej chcete stle revokovat? (a/N) " - -#: g10/keyedit.c:4639 -msgid "Create a revocation certificate for this signature? (y/N) " -msgstr "Vytvoit pro tento podpis revokan certifikt? (a/N)" - -#: g10/keyedit.c:4666 -#, c-format -msgid "You have signed these user IDs on key %s:\n" -msgstr "Podepsal(a) jste nsledujc identifiktory uivatele: %s:\n" - -#: g10/keyedit.c:4692 -msgid " (non-revocable)" -msgstr " (nerevokovateln)" - -#: g10/keyedit.c:4699 -#, c-format -msgid "revoked by your key %s on %s\n" -msgstr "revokovno vam klem %s v %s\n" - -#: g10/keyedit.c:4721 -msgid "You are about to revoke these signatures:\n" -msgstr "Chystte se revokovat tyto podpisy:\n" - -#: g10/keyedit.c:4741 -msgid "Really create the revocation certificates? (y/N) " -msgstr "Opravdu vytvoit revokan certifikty? (a/N) " - -#: g10/keyedit.c:4771 -msgid "no secret key\n" -msgstr "neexistuje tajn kl\n" - -#: g10/keyedit.c:4841 -#, c-format -msgid "user ID \"%s\" is already revoked\n" -msgstr "Uivatelsk ID \"%s\" je ji revokovno.\n" - -#: g10/keyedit.c:4858 -#, c-format -msgid "WARNING: a user ID signature is dated %d seconds in the future\n" -msgstr "VAROVN: podpis ID uivatele je datovn %d sekund v budoucnosti\n" - -#: g10/keyedit.c:4922 -#, c-format -msgid "Key %s is already revoked.\n" -msgstr "Kl %s je ji revokovn.\n" - -#: g10/keyedit.c:4984 -#, c-format -msgid "Subkey %s is already revoked.\n" -msgstr "Podkl %s je ji revokovn.\n" - -#: g10/keyedit.c:5079 -#, 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 pedvolby `%s'\n" - -#: g10/keygen.c:269 -msgid "too many cipher preferences\n" -msgstr "pli mnoho pedvoleb pro ifrovn\n" - -#: g10/keygen.c:271 -msgid "too many digest preferences\n" -msgstr "pli mnoho pedvoleb pro vzorkovn\n" - -#: g10/keygen.c:273 -msgid "too many compression preferences\n" -msgstr "pli mnoho pedvoleb pro komprimaci\n" - -#: g10/keygen.c:398 -#, c-format -msgid "invalid item `%s' in preference string\n" -msgstr "neplatn poloka `%s' v etzci s pedvolbami\n" - -#: g10/keygen.c:872 -msgid "writing direct signature\n" -msgstr "zapisuji podpis kle jm samm (direct signature)\n" - -#: g10/keygen.c:911 -msgid "writing self signature\n" -msgstr "zapisuji podpis kle sebou samm\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 dlka kle; pouiji %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 "dlka kle zaokrouhlena na %u bit\n" - -#: g10/keygen.c:1323 -msgid "Sign" -msgstr "Podepisovn" - -#: g10/keygen.c:1326 -msgid "Certify" -msgstr "" - -#: g10/keygen.c:1329 -msgid "Encrypt" -msgstr "ifrovn" - -#: 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 provst: " - -#: g10/keygen.c:1363 -msgid "Current allowed actions: " -msgstr "Aktuln 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 "Prosm, vyberte druh kle, 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 pouit)\n" - -#: g10/keygen.c:1440 -#, c-format -msgid " (%d) Elgamal (encrypt only)\n" -msgstr " (%d) ElGamal (pouze pro ifrovn)\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 ifrovn)\n" - -#: g10/keygen.c:1445 -#, c-format -msgid " (%d) RSA (set your own capabilities)\n" -msgstr " (%d) RSA (nastavit si vlastn pouit)\n" - -#: g10/keygen.c:1514 -#, c-format -msgid "DSA keypair will have %u bits.\n" -msgstr "Pr 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 me mt dlku v intervalu %u a %u bit.\n" - -#: g10/keygen.c:1531 -#, c-format -msgid "What keysize do you want? (%u) " -msgstr "Jakou dlku kle si pejete? (%u) " - -#: g10/keygen.c:1545 -#, c-format -msgid "%s keysizes must be in the range %u-%u\n" -msgstr "velikost kle %s mus bt v intervalu %u-%u\n" - -#: g10/keygen.c:1551 -#, c-format -msgid "Requested keysize is %u bits\n" -msgstr "Poadovan dlka kle 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 "" -"Prosm urete, jak dlouho by kl ml platit.\n" -" 0 = doba platnosti kle nen omezena\n" -" <n> = doba platnosti kle skon za n dn\n" -" <n>w = doba platnosti kle skon za n tdn\n" -" <n>m = doba platnosti kle skon za n msc\n" -" <n>y = doba platnosti kle 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 "" -"Prosm urete, jak dlouho by ml 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 tdn\n" -" <n>m = doba platnosti podpisu skon za n msc\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 kle 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 kle 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 systm neum zobrazit data po roce 2038.\n" -"V kadm ppad budou data korektn zpracovvna do roku 2106.\n" - -#: g10/keygen.c:1692 -msgid "Is this correct? (y/N) " -msgstr "Je to sprvn (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 mon rozpoznat V kl, muste znt identifiktor uivatele;\n" -"program jej slo z Vaeho jmna a pjmen, komente a e-mailu\n" -"v tomto tvaru:\n" -" \"Magda Prochazkova (student) <magda@domena.cz>\"\n" -"\n" - -#: g10/keygen.c:1728 -msgid "Real name: " -msgstr "Jmno a pjmen: " - -#: g10/keygen.c:1736 -msgid "Invalid character in name\n" -msgstr "Neplatn znak ve jmn\n" - -#: g10/keygen.c:1738 -msgid "Name may not start with a digit\n" -msgstr "Jmno neme zanat slic\n" - -#: g10/keygen.c:1740 -msgid "Name must be at least 5 characters long\n" -msgstr "Jmno mus bt 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 komenti\n" - -#: g10/keygen.c:1791 -#, c-format -msgid "You are using the `%s' character set.\n" -msgstr "Pouvte 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 identifiktor uivatele:\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 jmno nebo koment nepite, prosm, 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 "Zmnit (J)mno, (K)oment, (E)-mail nebo (U)konit? " - -#: g10/keygen.c:1829 -msgid "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? " -msgstr "" -"Zmnit (J)mno, (K)oment, (E)-mail, (P)okraovat dl nebo (U)konit " -"program? " - -#: g10/keygen.c:1848 -msgid "Please correct the error first\n" -msgstr "Nejdv, prosm, opravte chybu\n" - -#: g10/keygen.c:1888 -msgid "" -"You need a Passphrase to protect your secret key.\n" -"\n" -msgstr "" -"Pro ochranu Vaeho tajnho kle muste 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 npad!\n" -"Dobe, budu pokraovat bez hesla. Kdykoliv mete heslo zmnit pouitm\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 "" -"Musme vytvoit mnoho nhodnch bajt. Bhem vytven mete\n" -"provdt njakou jinou prci na potai (pst na klvesnici, pohybovat " -"my,\n" -"pouvat disky); dky tomu m genertor lep anci zskat dostatek " -"entropie.\n" - -#: g10/keygen.c:2708 -msgid "Key generation canceled.\n" -msgstr "Vytven kle bylo zrueno.\n" - -#: g10/keygen.c:2907 g10/keygen.c:3052 -#, c-format -msgid "writing public key to `%s'\n" -msgstr "zapisuji veejn 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 veejnch kl (pubring): %s\n" - -#: g10/keygen.c:3047 -#, c-format -msgid "no writable secret keyring found: %s\n" -msgstr "nenalezen zapisovateln soubor tajnch kl (secring): %s\n" - -#: g10/keygen.c:3065 -#, c-format -msgid "error writing public keyring `%s': %s\n" -msgstr "chyba pi zpisu do souboru veejnch kl `%s': %s\n" - -#: g10/keygen.c:3072 -#, c-format -msgid "error writing secret keyring `%s': %s\n" -msgstr "chyba pi zpisu do souboru tajnch kl `%s': %s\n" - -#: g10/keygen.c:3095 -msgid "public and secret key created and signed.\n" -msgstr "veejn a tajn kl byly vytvoeny a podepsny.\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 neme bt pouit pro ifrovn. K vytvoen\n" -"sekundrnho kle pro tento el mete pout pkaz \"--edit-key\".\n" - -#: g10/keygen.c:3118 g10/keygen.c:3247 g10/keygen.c:3363 -#, c-format -msgid "Key generation failed: %s\n" -msgstr "Vytvoen kle se nepodailo: %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 vytvoen %lu sekund v budoucnosti (dolo ke zmn asu nebo\n" -"je problm se systmovm 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 vytvoen %lu sekund v budoucnosti (dolo ke zmn asu nebo\n" -"je problm se systmovm asem)\n" - -#: g10/keygen.c:3181 g10/keygen.c:3311 -msgid "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n" -msgstr "POZNMKA: vytvoen podkle pro kle v3 nen v souladu s OpenPGP\n" - -#: g10/keygen.c:3220 g10/keygen.c:3344 -msgid "Really create? (y/N) " -msgstr "Opravdu vytvoit? (a/N) " - -#: g10/keygen.c:3509 -#, c-format -msgid "storing key onto card failed: %s\n" -msgstr "uloen kle na kartu se nezdailo: %s\n" - -#: g10/keygen.c:3556 -#, c-format -msgid "can't create backup file `%s': %s\n" -msgstr "nemohu vytvoit zlohu souboru `%s': %s\n" - -#: g10/keygen.c:3582 -#, c-format -msgid "NOTE: backup of card key saved to `%s'\n" -msgstr "POZNMKA: zloha kle z karty uloena 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 "Primrn fingerprint kle:" - -#: g10/keylist.c:1507 -msgid " Subkey fingerprint:" -msgstr " Fingerprint podkle:" - -#. 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 " Primrn fingerprint kle:" - -#: g10/keylist.c:1516 -msgid " Subkey fingerprint:" -msgstr " Fingerprint podkle:" - -#: g10/keylist.c:1520 g10/keylist.c:1524 -msgid " Key fingerprint =" -msgstr " Fingerprint kle =" - -#: 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 "pejmenovn `%s' na `%s' se nezdailo: %s\n" - -#: g10/keyring.c:1252 -msgid "WARNING: 2 files with confidential information exists.\n" -msgstr "VAROVN: Existuj dva soubory s tajnmi informacemi.\n" - -#: g10/keyring.c:1254 -#, c-format -msgid "%s is the unchanged one\n" -msgstr "%s je beze zmny\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 "Prosm, opravte tento mon bezpenostn problm\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 uloeno v cache (%lu podpis)\n" - -#: g10/keyring.c:1434 -#, c-format -msgid "%lu keys cached (%lu signatures)\n" -msgstr "%lu kl uloeno v cache (%lu podpis)\n" - -#: g10/keyring.c:1505 -#, c-format -msgid "%s: keyring created\n" -msgstr "%s: soubor kl (keyring) vytvoen\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 "Vlote URL preferovanho 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 "VAROVN: volba `%s' pro server kl nen na tto 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 "Vlote slo (sla), 'N' pro dal nebo 'Q' pro konec> " - -#: g10/keyserver.c:808 g10/keyserver.c:1421 -#, 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 "poaduji kl %s ze %s server %s\n" - -#: g10/keyserver.c:1149 -#, c-format -msgid "requesting key %s from %s\n" -msgstr "poaduji kl %s z %s\n" - -#: g10/keyserver.c:1173 -#, fuzzy, c-format -msgid "searching for names from %s server %s\n" -msgstr "vyhledvm \"%s\" na %s serveru %s\n" - -#: g10/keyserver.c:1176 -#, fuzzy, c-format -msgid "searching for names from %s\n" -msgstr "vyhledvm \"%s\" na serveru %s\n" - -#: g10/keyserver.c:1324 -#, c-format -msgid "sending key %s to %s server %s\n" -msgstr "poslm kl %s na %s server %s\n" - -#: g10/keyserver.c:1328 -#, c-format -msgid "sending key %s to %s\n" -msgstr "poslm kl %s na %s\n" - -#: g10/keyserver.c:1371 -#, c-format -msgid "searching for \"%s\" from %s server %s\n" -msgstr "vyhledvm \"%s\" na %s serveru %s\n" - -#: g10/keyserver.c:1374 -#, c-format -msgid "searching for \"%s\" from %s\n" -msgstr "vyhledvm \"%s\" na serveru %s\n" - -#: g10/keyserver.c:1381 g10/keyserver.c:1477 -msgid "no keyserver action!\n" -msgstr "dn operace se serverem kl!\n" - -#: g10/keyserver.c:1429 -#, c-format -msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n" -msgstr "VAROVN: keyserver handler z jin verze GnuPG (%s)\n" - -#: g10/keyserver.c:1438 -msgid "keyserver did not send VERSION\n" -msgstr "server kl neposlal VERSION\n" - -#: g10/keyserver.c:1500 g10/keyserver.c:2028 -msgid "no keyserver known (use option --keyserver)\n" -msgstr "adn server kl nen znm (poujte volbu --keyserver)\n" - -#: g10/keyserver.c:1506 -msgid "external keyserver calls are not supported in this build\n" -msgstr "voln externho keyserver nen v tto verzi podporovno\n" - -#: g10/keyserver.c:1518 -#, c-format -msgid "no handler for keyserver scheme `%s'\n" -msgstr "protokol serveru kl `%s' nen podporovn\n" - -#: g10/keyserver.c:1523 -#, c-format -msgid "action `%s' not supported with keyserver scheme `%s'\n" -msgstr "akce `%s' nen podporovna v protokolu `%s' serveru kl\n" - -#: g10/keyserver.c:1531 -#, c-format -msgid "%s does not support handler version %d\n" -msgstr "%s nepodporuje protokol verze %d\n" - -#: g10/keyserver.c:1538 -msgid "keyserver timed out\n" -msgstr "asov limit pro server kl vyprel\n" - -#: g10/keyserver.c:1543 -msgid "keyserver internal error\n" -msgstr "intern chyba serveru kl\n" - -#: g10/keyserver.c:1552 -#, c-format -msgid "keyserver communications error: %s\n" -msgstr "chyba komunikace se serverem kl: %s\n" - -#: g10/keyserver.c:1577 g10/keyserver.c:1611 -#, c-format -msgid "\"%s\" not a key ID: skipping\n" -msgstr "\"%s\" nen ID kle: peskoeno\n" - -#: g10/keyserver.c:1870 -#, c-format -msgid "WARNING: unable to refresh key %s via %s: %s\n" -msgstr "VAROVN: nelze aktualizovat kl %s prostednictvm %s: %s\n" - -#: g10/keyserver.c:1892 -#, c-format -msgid "refreshing 1 key from %s\n" -msgstr "aktualizuji 1 kl z %s\n" - -#: g10/keyserver.c:1894 -#, c-format -msgid "refreshing %d keys from %s\n" -msgstr "aktualizuji %d kl z %s\n" - -#: g10/keyserver.c:1950 -#, fuzzy, c-format -msgid "WARNING: unable to fetch URI %s: %s\n" -msgstr "VAROVN: nelze aktualizovat kl %s prostednictvm %s: %s\n" - -#: g10/keyserver.c:1956 -#, fuzzy, c-format -msgid "WARNING: unable to parse URI %s\n" -msgstr "VAROVN: nelze aktualizovat kl %s prostednictvm %s: %s\n" - -#: g10/mainproc.c:240 -#, c-format -msgid "weird size for an encrypted session key (%d)\n" -msgstr "podivn velikost ifrovacho kle pro sezen (%d)\n" - -#: g10/mainproc.c:291 -#, c-format -msgid "%s encrypted session key\n" -msgstr "%s zaifrovan kl sezen\n" - -#: g10/mainproc.c:301 -#, c-format -msgid "passphrase generated with unknown digest algorithm %d\n" -msgstr "heslo (passphraze) generovno s pouitm neznmho algoritmu %d\n" - -#: g10/mainproc.c:382 -#, c-format -msgid "public key is %s\n" -msgstr "veejn kl je %s\n" - -#: g10/mainproc.c:439 -msgid "public key encrypted data: good DEK\n" -msgstr "data zaifrovna veejnm klem: sprvn DEK\n" - -#: g10/mainproc.c:472 -#, c-format -msgid "encrypted with %u-bit %s key, ID %s, created %s\n" -msgstr "zaifrovna %u-bitovm %s klem, ID %s, vytvoenm %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 "zaifrovno %s klem, ID %s\n" - -#: g10/mainproc.c:494 -#, c-format -msgid "public key decryption failed: %s\n" -msgstr "deifrovn veejnm klem selhalo: %s\n" - -#: g10/mainproc.c:508 -#, c-format -msgid "encrypted with %lu passphrases\n" -msgstr "zaifrovno s heslem %lu\n" - -#: g10/mainproc.c:510 -msgid "encrypted with 1 passphrase\n" -msgstr "zaifrovno jednm heslem\n" - -#: g10/mainproc.c:541 g10/mainproc.c:563 -#, c-format -msgid "assuming %s encrypted data\n" -msgstr "pedpokldm %s ifrovanch 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 pokusme nahradit " -"algoritmem %s\n" - -#: g10/mainproc.c:581 -msgid "decryption okay\n" -msgstr "deifrovn o.k.\n" - -#: g10/mainproc.c:585 -msgid "WARNING: message was not integrity protected\n" -msgstr "VAROVN: zprva nebyla chrnna proti poruen jej integrity\n" - -#: g10/mainproc.c:598 -msgid "WARNING: encrypted message has been manipulated!\n" -msgstr "VAROVN: se zaifrovanou zprvou bylo manipulovno!\n" - -#: g10/mainproc.c:604 -#, c-format -msgid "decryption failed: %s\n" -msgstr "deifrovn selhalo: %s\n" - -#: g10/mainproc.c:623 -msgid "NOTE: sender requested \"for-your-eyes-only\"\n" -msgstr "POZNMKA: odeslatel poadoval (\"for-your-eyes-only\")\n" - -#: g10/mainproc.c:625 -#, c-format -msgid "original file name='%.*s'\n" -msgstr "pvodn jmno souboru='%.*s'\n" - -#: g10/mainproc.c:817 -msgid "standalone revocation - use \"gpg --import\" to apply\n" -msgstr "" -"samostatn revokan certifikt - pouijte \"gpg --import\", chcete-li jej " -"ut\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 potlaena\n" - -#: g10/mainproc.c:1508 -#, fuzzy -msgid "can't handle this ambiguous signature data\n" -msgstr "neumm pracovat s tmito nsobnmi podpisy\n" - -#: g10/mainproc.c:1519 -#, c-format -msgid "Signature made %s\n" -msgstr "Podpis vytvoen %s\n" - -#: g10/mainproc.c:1520 -#, c-format -msgid " using %s key %s\n" -msgstr " pouit %s kle %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 vytvoen %s pomoc kle %s s ID uivatele %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 vyprenou 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 skonila %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 "binrn formt" - -#: g10/mainproc.c:1873 -msgid "textmode" -msgstr "textov formt" - -#: g10/mainproc.c:1873 g10/trustdb.c:531 -msgid "unknown" -msgstr "neznm formt" - -#: g10/mainproc.c:1893 -#, c-format -msgid "Can't check signature: %s\n" -msgstr "Nemohu ovit 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 oddlen od dokumentu\n" - -#: g10/mainproc.c:2005 -msgid "" -"WARNING: multiple signatures detected. Only the first will be checked.\n" -msgstr "VAROVN: detekovno vce podpis. Kontrolovn bude pouze prvn.\n" - -#: g10/mainproc.c:2013 -#, c-format -msgid "standalone signature of class 0x%02x\n" -msgstr "samostatn podpis tdy 0x%02x\n" - -#: g10/mainproc.c:2070 -msgid "old style (PGP 2.x) signature\n" -msgstr "podpis starho typu (PGP 2.x)\n" - -#: g10/mainproc.c:2080 -msgid "invalid root packet detected in proc_tree()\n" -msgstr "nalezen neplatn koenov paket v proc_tree()\n" - -#: g10/misc.c:122 -#, c-format -msgid "can't disable core dumps: %s\n" -msgstr "nemohu vypnout vytven 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 "VAROVN: pouvm experimentln algoritmus veejnho kle %s\n" - -#: g10/misc.c:331 -#, c-format -msgid "WARNING: using experimental cipher algorithm %s\n" -msgstr "VAROVN: pouvm experimentln ifrovac algoritmus %s\n" - -#: g10/misc.c:346 -#, c-format -msgid "WARNING: using experimental digest algorithm %s\n" -msgstr "VAROVN: pouvm experimentln hashovac algoritmus %s\n" - -#: g10/misc.c:351 -#, c-format -msgid "WARNING: digest algorithm %s is deprecated\n" -msgstr "VAROVN: vydan algoritmus %s nen doporuen\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 "Vce 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: pouit parametru \"%s\" se nedoporuuje\n" - -#: g10/misc.c:685 -#, c-format -msgid "WARNING: \"%s\" is a deprecated option\n" -msgstr "VAROVN: pouvn parametru \"%s\" se nedoporuuje\n" - -#: g10/misc.c:687 -#, c-format -msgid "please use \"%s%s\" instead\n" -msgstr "pouijte msto nj \"%s%s\" \n" - -#: g10/misc.c:694 -#, c-format -msgid "WARNING: \"%s\" is a deprecated command - do not use it\n" -msgstr "VAROVN: pouvn pkaz \"%s\" se nedoporuuje - nepouvejte jej\n" - -#: g10/misc.c:707 -msgid "Uncompressed" -msgstr "Nezakomprimovno" - -#: g10/misc.c:732 -msgid "uncompressed|none" -msgstr "nezakomprimovno|nic" - -#: g10/misc.c:842 -#, c-format -msgid "this message may not be usable by %s\n" -msgstr "tato zprva nemus bt s %s pouiteln\n" - -#: g10/misc.c:1017 -#, c-format -msgid "ambiguous option `%s'\n" -msgstr "nejednoznan volby `%s'\n" - -#: g10/misc.c:1042 -#, c-format -msgid "unknown option `%s'\n" -msgstr "neznm 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 "Pepsat (a/N)? " - -#: g10/openfile.c:123 -#, c-format -msgid "%s: unknown suffix\n" -msgstr "%s: neznm ppona\n" - -#: g10/openfile.c:145 -msgid "Enter new filename" -msgstr "Vlote nov nzev souboru" - -#: g10/openfile.c:190 -msgid "writing to stdout\n" -msgstr "zapisuji do standardnho vstupu\n" - -#: g10/openfile.c:305 -#, c-format -msgid "assuming signed data in `%s'\n" -msgstr "pedpokldm podepsan data v `%s'\n" - -#: g10/openfile.c:384 -#, c-format -msgid "new configuration file `%s' created\n" -msgstr "vytvoen nov konfiguran soubor `%s'\n" - -#: g10/openfile.c:386 -#, c-format -msgid "WARNING: options in `%s' are not yet active during this run\n" -msgstr "VAROVN: nastaven z `%s' nejsou pi tomto sputn zatm aktivn\n" - -#: g10/openfile.c:418 -#, c-format -msgid "directory `%s' created\n" -msgstr "adres `%s' vytvoen\n" - -#: g10/parse-packet.c:138 -#, c-format -msgid "can't handle public key algorithm %d\n" -msgstr "nemohu pracovat s algoritmem veejnho kle %d\n" - -#: g10/parse-packet.c:708 -msgid "WARNING: potentially insecure symmetrically encrypted session key\n" -msgstr "VAROVN: potencionln nebezpen symetricky zaifrovn kl sezen\n" - -#: g10/parse-packet.c:1157 -#, 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 formt promnn prosted 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 podporovn\n" - -#: g10/passphrase.c:362 -#, c-format -msgid "can't connect to `%s': %s\n" -msgstr "nemohu se pipojit 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 "problm s agentem - pouvn agenta vypnuto\n" - -#: g10/passphrase.c:532 g10/passphrase.c:914 -#, c-format -msgid " (main key ID %s)" -msgstr "(hlavn ID kle %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 "" -"Potebujete heslo, abyste odemknul(a) tajn kl pro uivatele:\n" -"\"%.*s\"\n" -"Kl o dlce %u bit, typ %s, ID %s, vytvoen %s%s\n" - -#: g10/passphrase.c:571 -msgid "Repeat passphrase\n" -msgstr "Opakovat heslo\n" - -#: g10/passphrase.c:573 -msgid "Enter passphrase\n" -msgstr "Vloit heslo\n" - -#: g10/passphrase.c:649 -msgid "cancelled by user\n" -msgstr "zrueno uivatelem\n" - -#: g10/passphrase.c:805 g10/passphrase.c:968 -msgid "can't query passphrase in batch mode\n" -msgstr "v dvkovm reimu se nelze ptt na heslo\n" - -#: g10/passphrase.c:812 g10/passphrase.c:973 -msgid "Enter passphrase: " -msgstr "Vlote heslo: " - -#: g10/passphrase.c:895 -#, c-format -msgid "" -"You need a passphrase to unlock the secret key for\n" -"user: \"%s\"\n" -msgstr "" -"Muste znt heslo, abyste odemknul(a) tajn kl pro\n" -"uivatele: \"%s\"\n" - -#: g10/passphrase.c:901 -#, c-format -msgid "%u-bit %s key, ID %s, created %s" -msgstr "dlka %u bit, typ %s, kl %s, vytvoen %s" - -#: g10/passphrase.c:910 -#, c-format -msgid " (subkey on main key ID %s)" -msgstr " (podkl na hlavnm kli ID %s)" - -#: g10/passphrase.c:977 -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 obrzek, kter bude pouit jako Vae fotografick ID. Obrzek mus\n" -"bt ve formtu JPEG. Nezapomet, e obrzek bude uloen ve Vaem veejnm\n" -"kli - velk obrzek bude mt za nsledek velmi velk veejn kl !\n" -"Vhodn velikost obrzku je asi 240x288.\n" - -#: g10/photoid.c:95 -msgid "Enter JPEG filename for photo ID: " -msgstr "Vlote jmno JPEG souboru s fotografickm ID: " - -#: g10/photoid.c:116 -#, c-format -msgid "unable to open JPEG file `%s': %s\n" -msgstr "nelze otevt 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 pout? (a/N) " - -#: g10/photoid.c:146 -#, c-format -msgid "`%s' is not a JPEG file\n" -msgstr "`%s' nen soubor ve formtu JPEG\n" - -#: g10/photoid.c:165 -msgid "Is this photo correct (y/N/q)? " -msgstr "Je tato fotografie sprvn (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 "Dvod nebyl specifikovn" - -#: 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 zkompromitovn" - -#: g10/pkclist.c:68 g10/revoke.c:626 -msgid "Key is no longer used" -msgstr "Kl se ji nepouv" - -#: g10/pkclist.c:70 g10/revoke.c:627 -msgid "User ID is no longer valid" -msgstr "Identifiktor uivatele ji neplat" - -#: g10/pkclist.c:74 -msgid "reason for revocation: " -msgstr "dvod pro revokaci: " - -#: g10/pkclist.c:91 -msgid "revocation comment: " -msgstr "revokan poznmka: " - -#: g10/pkclist.c:206 -msgid "iImMqQsS" -msgstr "iImMuUsS" - -#: g10/pkclist.c:214 -msgid "No trust value assigned to:\n" -msgstr "Nen piazena dn hodnota dvry:\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 dvujete tvrzen, e tento kl pat uvedenmu uivateli?\n" - -#: g10/pkclist.c:271 -#, c-format -msgid " %d = I don't know or won't say\n" -msgstr " %d = Nevm nebo neeknu\n" - -#: g10/pkclist.c:273 -#, c-format -msgid " %d = I do NOT trust\n" -msgstr " %d = Nedvuji\n" - -#: g10/pkclist.c:279 -#, c-format -msgid " %d = I trust ultimately\n" -msgstr " %d = Dvuji absolutn\n" - -#: g10/pkclist.c:285 -msgid " m = back to the main menu\n" -msgstr " m = zpt do hlavnho menu\n" - -#: g10/pkclist.c:288 -msgid " s = skip this key\n" -msgstr " s = peskoit tento kl\n" - -#: g10/pkclist.c:289 -msgid " q = quit\n" -msgstr " u = ukonit\n" - -#: g10/pkclist.c:293 -#, c-format -msgid "" -"The minimum trust level for this key is: %s\n" -"\n" -msgstr "" -"Minimln rove dvry tohoto kle je: %s\n" -"\n" - -#: g10/pkclist.c:299 g10/revoke.c:652 -msgid "Your decision? " -msgstr "Vae 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 dvru? (a/N) " - -#: g10/pkclist.c:334 -msgid "Certificates leading to an ultimately trusted key:\n" -msgstr "Certifikty vedouc k finlnmu dvryhodnmu kli:\n" - -#: g10/pkclist.c:419 -#, c-format -msgid "%s: There is no assurance this key belongs to the named user\n" -msgstr "%s: Nic nenaznauje tomu, e tento kl pat uvedenmu uivateli\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 sten dvra, e tento kl pat uvedenmu uvivateli\n" - -#: g10/pkclist.c:430 -msgid "This key probably belongs to the named user\n" -msgstr "Tento kl pravdpodobn nle uvedenmu uivateli\n" - -#: g10/pkclist.c:435 -msgid "This key belongs to us\n" -msgstr "Tento kl nle nm (mme odpovdajc 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 jmno je uvedeno\n" -"v uivatelskm ID. Pokud *skuten* vte, co dlte, mete na\n" -"nsledujc otzku odpovdt ano\n" -"\n" - -#: g10/pkclist.c:468 -msgid "Use this key anyway? (y/N) " -msgstr "Pout pesto tento kl? (a/N) " - -#: g10/pkclist.c:502 -msgid "WARNING: Using untrusted key!\n" -msgstr "VAROVN: Je pouit nedvryhodn kl!\n" - -#: g10/pkclist.c:509 -msgid "WARNING: this key might be revoked (revocation key not present)\n" -msgstr "VAROVN: tento kl me bt revokovn (revokan kl nenalezen)\n" - -#: g10/pkclist.c:518 -msgid "WARNING: This key has been revoked by its designated revoker!\n" -msgstr "VAROVN: Tento kl byl revokovn klem s povenm k revokaci!\n" - -#: g10/pkclist.c:521 -msgid "WARNING: This key has been revoked by its owner!\n" -msgstr "VAROVN: Tento kl byl revokovn svm vlastnkem!\n" - -#: g10/pkclist.c:522 -msgid " This could mean that the signature is forged.\n" -msgstr " To me znamenat, e podpis je padlan.\n" - -#: g10/pkclist.c:528 -msgid "WARNING: This subkey has been revoked by its owner!\n" -msgstr "VAROVN: Tento podkl byl revokovn svm vlastnkem!\n" - -#: g10/pkclist.c:533 -msgid "Note: This key has been disabled.\n" -msgstr "Poznmka: Tento kl byl oznaen 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 "Poznmka: Skonila platnost tohoto kle!\n" - -#: g10/pkclist.c:602 -msgid "WARNING: This key is not certified with a trusted signature!\n" -msgstr "VAROVN: Tento kl nen certifikovn dvryhodnm podpisem!\n" - -#: g10/pkclist.c:604 -msgid "" -" There is no indication that the signature belongs to the owner.\n" -msgstr "" -" Nic nenaznauje tomu, e tento podpis pat vlastnkovi kle.\n" - -#: g10/pkclist.c:612 -msgid "WARNING: We do NOT trust this key!\n" -msgstr "VAROVN: NEdvujeme tomuto kli!\n" - -#: g10/pkclist.c:613 -msgid " The signature is probably a FORGERY.\n" -msgstr " Tento podpis je pravdpodobn PADLAN.\n" - -#: g10/pkclist.c:621 -msgid "" -"WARNING: This key is not certified with sufficiently trusted signatures!\n" -msgstr "" -"VAROVN: Tento kl nen certifikovn dostaten dvryhodnmi 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 vlastnkovi.\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: peskoeno: %s\n" - -#: g10/pkclist.c:834 g10/pkclist.c:1114 -#, c-format -msgid "%s: skipped: public key already present\n" -msgstr "%s: peskoeno: veejn kl je ji obsaen v databzi\n" - -#: g10/pkclist.c:885 -msgid "You did not specify a user ID. (you may use \"-r\")\n" -msgstr "" -"Nespecifikoval jste identifiktor uivatele (user ID). Mete pout \"-r\"\n" - -#: g10/pkclist.c:909 -msgid "Current recipients:\n" -msgstr "Aktuln pjemci:\n" - -#: g10/pkclist.c:935 -msgid "" -"\n" -"Enter the user ID. End with an empty line: " -msgstr "" -"\n" -"Napite identifiktor uivatele (user ID). Ukonete przdnm dkem: " - -#: g10/pkclist.c:960 -msgid "No such user ID.\n" -msgstr "Takov identifiktor uivatele neexistuje.\n" - -#: g10/pkclist.c:969 g10/pkclist.c:1043 -msgid "skipped: public key already set as default recipient\n" -msgstr "peskoeno: veejn kl je u nastaven podle implicitnho adresta\n" - -#: g10/pkclist.c:990 -msgid "Public key is disabled.\n" -msgstr "Veejn kl je neplatn (disabled).\n" - -#: g10/pkclist.c:999 -msgid "skipped: public key already set\n" -msgstr "peskoeno: veejn kl je ji nastaven\n" - -#: g10/pkclist.c:1034 -#, c-format -msgid "unknown default recipient \"%s\"\n" -msgstr "neznm implicitn adrest \"%s\"\n" - -#: g10/pkclist.c:1092 -#, c-format -msgid "%s: skipped: public key is disabled\n" -msgstr "%s: peskoeno: veejn 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 uloena; k jejich uloen pouijte parametr pkazu \"--output" -"\"\n" - -#: g10/plaintext.c:135 g10/plaintext.c:140 g10/plaintext.c:158 -#, c-format -msgid "error creating `%s': %s\n" -msgstr "chyba pi vytven `%s': %s\n" - -#: g10/plaintext.c:452 -msgid "Detached signature.\n" -msgstr "Podpis oddlen od dokumentu.\n" - -#: g10/plaintext.c:458 -msgid "Please enter name of data file: " -msgstr "Prosm, vlote nzev datovho 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 otevt podepsan data '%s'\n" - -#: g10/pubkey-enc.c:104 -#, c-format -msgid "anonymous recipient; trying secret key %s ...\n" -msgstr "anonymn adrest; zkoum tajn kl %s ...\n" - -#: g10/pubkey-enc.c:135 -msgid "okay, we are the anonymous recipient.\n" -msgstr "o.k., my jsme anonymn adrest.\n" - -#: g10/pubkey-enc.c:223 -msgid "old encoding of the DEK is not supported\n" -msgstr "star kdovn DEK nen podporovno\n" - -#: g10/pubkey-enc.c:244 -#, c-format -msgid "cipher algorithm %d%s is unknown or disabled\n" -msgstr "ifrovac algoritmus %d%s je neznm nebo je zneplatnn\n" - -#: g10/pubkey-enc.c:282 -#, c-format -msgid "WARNING: cipher algorithm %s not found in recipient preferences\n" -msgstr "VAROVN: v pedvolbch pjemce nenalezen ifrovac algoritmus %s\n" - -#: g10/pubkey-enc.c:302 -#, c-format -msgid "NOTE: secret key %s expired at %s\n" -msgstr "POZNMKA: platnost tajnho kle %s skonila %s\n" - -#: g10/pubkey-enc.c:308 -msgid "NOTE: key has been revoked" -msgstr "POZNMKA: kl byl revokovn" - -#: 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 vytvoen paketu (build_packet): %s\n" - -#: g10/revoke.c:147 -#, c-format -msgid "key %s has no user IDs\n" -msgstr "kl %s: chyb identifiktor uivatele\n" - -#: g10/revoke.c:308 -msgid "To be revoked by:\n" -msgstr "Revokovn:\n" - -#: g10/revoke.c:312 -msgid "(This is a sensitive revocation key)\n" -msgstr "(Toto je citliv revokan kl)\n" - -#: g10/revoke.c:316 -msgid "Create a designated revocation certificate for this key? (y/N) " -msgstr "Vytvoit pro tento kl poven revokan certifikt? (a/N)" - -#: g10/revoke.c:329 g10/revoke.c:554 -msgid "ASCII armored output forced.\n" -msgstr "nazen vstup do formtu ASCII.\n" - -#: g10/revoke.c:344 g10/revoke.c:568 -#, c-format -msgid "make_keysig_packet failed: %s\n" -msgstr "vytvoen podepisovacho paketu (make_keysig_packet) selhalo: %s\n" - -#: g10/revoke.c:407 -msgid "Revocation certificate created.\n" -msgstr "Revokan certifikt vytvoen.\n" - -#: g10/revoke.c:413 -#, c-format -msgid "no revocation keys found for \"%s\"\n" -msgstr "pro \"%s\" nebyl nalezen dn revokan 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 odpovdajc veejn kl: %s\n" - -#: g10/revoke.c:511 -msgid "public key does not match secret key!\n" -msgstr "veejn kl neodpovd tajnmu kli!\n" - -#: g10/revoke.c:518 -msgid "Create a revocation certificate for this key? (y/N) " -msgstr "Vytvoit pro tento kl revokan certifikt? (a/N) " - -#: g10/revoke.c:535 -msgid "unknown protection algorithm\n" -msgstr "neznm kompresn algoritmus\n" - -#: g10/revoke.c:543 -msgid "NOTE: This key is not protected!\n" -msgstr "POZNMKA: Tento kl nen chrnn!\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 "" -"Revokan certifikt byl vytvoen.\n" -"\n" -"Prosm peneste jej na mdium, kter mete dobe schovat. Pokud se\n" -"k tomuto certifiktu dostane nepovolan osoba, me zneplatnit V kl.\n" -"Je rozumn tento certifikt vytisknout a schovat jej pro ppad, e\n" -"medium s certifiktem pestane bt iteln. Ale pozor: Tiskov subsystm\n" -"na Vaem potai me ukldat data uren k tisku a zpstupnist je\n" -"jinm uivatelm!\n" - -#: g10/revoke.c:635 -msgid "Please select the reason for the revocation:\n" -msgstr "Prosm vyberte dvod revokace:\n" - -#: g10/revoke.c:645 -msgid "Cancel" -msgstr "Zruit" - -#: g10/revoke.c:647 -#, c-format -msgid "(Probably you want to select %d here)\n" -msgstr "(Pravdpodobn zda chcete vybrat %d)\n" - -#: g10/revoke.c:688 -msgid "Enter an optional description; end it with an empty line:\n" -msgstr "Mete vloit dal popis. Ukonete przdnm dkem:\n" - -#: g10/revoke.c:716 -#, c-format -msgid "Reason for revocation: %s\n" -msgstr "Dvod revokace: %s\n" - -#: g10/revoke.c:718 -msgid "(No description given)\n" -msgstr "(Nebyl zadn dn popis)\n" - -#: g10/revoke.c:723 -msgid "Is this okay? (y/N) " -msgstr "Je dvod revokace vybrn sprvn? (a/N) " - -#: g10/seckey-cert.c:55 -msgid "secret key parts are not available\n" -msgstr "tajn sti kle 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 podporovn\n" - -#: g10/seckey-cert.c:72 -#, c-format -msgid "protection digest %d is not supported\n" -msgstr "ochrann algoritmus %d nen podporovn\n" - -#: g10/seckey-cert.c:266 -msgid "Invalid passphrase; please try again" -msgstr "Neplatn heslo; prosm, 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 "VAROVN: Objeven slab kl - zmte, prosm, 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 souet pro ochranu soukromho " -"kle\n" - -#: g10/seskey.c:54 -msgid "weak key created - retrying\n" -msgstr "vytvoen slab kl - zkoum znovu\n" - -#: g10/seskey.c:59 -#, c-format -msgid "cannot avoid weak key for symmetric cipher; tried %d times!\n" -msgstr "" -"nemohu se vyvarovat slabho kle pro symetrickou ifru; operaci jsem zkusil " -"%d krt!\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 "VAROVN: konflikt hashe podpisu ve zprv\n" - -#: g10/sig-check.c:101 -#, c-format -msgid "WARNING: signing subkey %s is not cross-certified\n" -msgstr "VAROVN: podepisovac podkl %s nen kov certifikovn\n" - -#: g10/sig-check.c:113 -#, c-format -msgid "WARNING: signing subkey %s has an invalid cross-certification\n" -msgstr "VAROVN: podepisovac podkl %s m neplatnou kovou certifikaci\n" - -#: g10/sig-check.c:181 -#, c-format -msgid "public key %s is %lu second newer than the signature\n" -msgstr "veejn kl %s je o %lu sekund novj ne podpis\n" - -#: g10/sig-check.c:182 -#, c-format -msgid "public key %s is %lu seconds newer than the signature\n" -msgstr "veejn kl %s je o %lu sekund novj 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 vytvoen %lu sekund v budoucnosti (dolo ke zmn asu nebo\n" -"je problm se systmovm 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 vytvoen %lu sekund v budoucnosti (dolo ke zmn asu nebo\n" -"je problm se systmovm asem)\n" - -#: g10/sig-check.c:205 -#, c-format -msgid "NOTE: signature key %s expired %s\n" -msgstr "POZNMKA: podpisovmu kli %s skonila 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 "" -"pedpokldm patn podpis klem %s, protoe je nastaven neznm 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 podkle\n" - -#: g10/sig-check.c:570 -#, c-format -msgid "key %s: no subkey for subkey binding signature\n" -msgstr "kl %s: podkl kter je svzn 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 uloit ve formtu v3 podpisu (formt 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 uloit jako v3 podpis kle (formt PGP 2.x)\n" - -#: g10/sign.c:107 -#, c-format -msgid "WARNING: unable to %%-expand notation (too large). Using unexpanded.\n" -msgstr "" -"VAROVN: nelze %%-expandovat notaci (pli dlouh). Pouity " -"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 uloit ve formtu v3 podpisu (formt 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 uloit URL politiky do podpisu v3 klem (formt PGP 2.x)\n" - -#: g10/sign.c:145 -#, c-format -msgid "" -"WARNING: unable to %%-expand policy URL (too large). Using unexpanded.\n" -msgstr "" -"VAROVN: nemohu %%-expandovat URL politiky (pli dlouh). Pouity " -"neexpandovan.\n" - -#: g10/sign.c:173 -#, c-format -msgid "" -"WARNING: unable to %%-expand preferred keyserver URL (too large). Using " -"unexpanded.\n" -msgstr "" -"VAROVN: nemohu %%-expandovat URL preferovanho keyservery (pli dlouh). " -"Pouity neexpandovan.\n" - -#: g10/sign.c:347 -#, c-format -msgid "checking created signature failed: %s\n" -msgstr "kontrola vytvoenho podpisu se nepodaila: %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 mdu --pgp2 mete vytvoit pouze oddlen podpis (detach-sign)s kli " -"formtu PGP-2.x\n" - -#: g10/sign.c:862 -#, c-format -msgid "" -"WARNING: forcing digest algorithm %s (%d) violates recipient preferences\n" -msgstr "" -"VAROVN: vydan hashovac algoritmus %s (%d) nevyhovuje pedvolbm " -"pjemce\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 mdu --pgp2 mete vytvet jen iteln podpisy s kli formtu PGP-2.x\n" - -#: g10/sign.c:1278 -#, c-format -msgid "%s encryption will be used\n" -msgstr "bude pouito ifrovn %s\n" - -#: g10/skclist.c:127 g10/skclist.c:191 -msgid "key is not flagged as insecure - can't use it with the faked RNG!\n" -msgstr "" -"kl nen oznaen jako nedostaten bezpen - nemohu jej pout s padlanm " -"RNG!\n" - -#: g10/skclist.c:158 -#, c-format -msgid "skipped \"%s\": duplicated\n" -msgstr "peskoen \"%s\": duplikovn\n" - -#: g10/skclist.c:166 g10/skclist.c:176 g10/skclist.c:185 -#, c-format -msgid "skipped \"%s\": %s\n" -msgstr "peskoen \"%s\": %s\n" - -#: g10/skclist.c:171 -msgid "skipped: secret key already present\n" -msgstr "peskoeno: tajn kl je u v databzi\n" - -#: g10/skclist.c:186 -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 vytvoen tmto klem nejsou bezpen!" - -#: g10/tdbdump.c:60 g10/trustdb.c:366 -#, c-format -msgid "trust record %lu, type %d: write failed: %s\n" -msgstr "zznam dvry %lu, typ %d: zpis 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 pidlench hodnot dvry, vytvoen %s\n" -"# (Pouijte \"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 pli dlouh" - -#: g10/tdbdump.c:168 -msgid "colon missing" -msgstr "sloupec schz" - -#: g10/tdbdump.c:174 -msgid "invalid fingerprint" -msgstr "neplatn fingerprint" - -#: g10/tdbdump.c:179 -msgid "ownertrust value missing" -msgstr "schz hodnota dvryhosdnosti vlastnka" - -#: g10/tdbdump.c:215 -#, c-format -msgid "error finding trust record in `%s': %s\n" -msgstr "chyba pi hledn zznamu dvryhodnosti v `%s': %s\n" - -#: g10/tdbdump.c:219 -#, c-format -msgid "read error in `%s': %s\n" -msgstr "chyba pi ten v `%s': %s\n" - -#: g10/tdbdump.c:228 g10/trustdb.c:381 -#, c-format -msgid "trustdb: sync failed: %s\n" -msgstr "databze dvry: synchronizace selhala %s\n" - -#: g10/tdbio.c:129 g10/tdbio.c:1445 -#, c-format -msgid "trustdb rec %lu: lseek failed: %s\n" -msgstr "zznam v databzi dvry %lu: lseek() se nepodail: %s\n" - -#: g10/tdbio.c:135 g10/tdbio.c:1452 -#, c-format -msgid "trustdb rec %lu: write failed (n=%d): %s\n" -msgstr "zznam v databzi dvry %lu: zpis se nepodail (n=%d): %s\n" - -#: g10/tdbio.c:245 -msgid "trustdb transaction too large\n" -msgstr "transakce s databz dvry je pli dlouh\n" - -#: g10/tdbio.c:498 -#, c-format -msgid "can't access `%s': %s\n" -msgstr "nemohu otevt `%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 vytvoit zmek pro `%s'\n" - -#: g10/tdbio.c:525 g10/tdbio.c:592 -#, c-format -msgid "can't lock `%s'\n" -msgstr "nelze zamt `%s'\n" - -#: g10/tdbio.c:551 -#, c-format -msgid "%s: failed to create version record: %s" -msgstr "%s: nepodailo se vytvoit zznam verze: %s" - -#: g10/tdbio.c:555 -#, c-format -msgid "%s: invalid trustdb created\n" -msgstr "%s: vytvoena neplatn databze dvry\n" - -#: g10/tdbio.c:558 -#, c-format -msgid "%s: trustdb created\n" -msgstr "%s: databze dvry vytvoena\n" - -#: g10/tdbio.c:602 -msgid "NOTE: trustdb not writable\n" -msgstr "POZNMKA: do trustedb nezle zapisovat\n" - -#: g10/tdbio.c:619 -#, c-format -msgid "%s: invalid trustdb\n" -msgstr "%s: neplatn databze dvry\n" - -#: g10/tdbio.c:651 -#, c-format -msgid "%s: failed to create hashtable: %s\n" -msgstr "%s: nepodailo se vytvoit hashovac tabulku: %s\n" - -#: g10/tdbio.c:659 -#, c-format -msgid "%s: error updating version record: %s\n" -msgstr "%s: chyba pi aktualizaci zznamu 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 pi ten zznamu verze: %s\n" - -#: g10/tdbio.c:735 -#, c-format -msgid "%s: error writing version record: %s\n" -msgstr "%s: chyba pi zpisu zznamu verze: %s\n" - -#: g10/tdbio.c:1174 -#, c-format -msgid "trustdb: lseek failed: %s\n" -msgstr "databze dvry: procedura lseek() selhala: %s\n" - -#: g10/tdbio.c:1182 -#, c-format -msgid "trustdb: read failed (n=%d): %s\n" -msgstr "databze dvry: procedura read() (n=%d) selhala: %s\n" - -#: g10/tdbio.c:1203 -#, c-format -msgid "%s: not a trustdb file\n" -msgstr "%s: nen soubor databze dvry\n" - -#: g10/tdbio.c:1221 -#, c-format -msgid "%s: version record with recnum %lu\n" -msgstr "%s: zznam 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 pi ten volnho zznamu: %s\n" - -#: g10/tdbio.c:1419 -#, c-format -msgid "%s: error writing dir record: %s\n" -msgstr "%s: chyba pi zpisu adresovho zznamu: %s\n" - -#: g10/tdbio.c:1429 -#, c-format -msgid "%s: failed to zero a record: %s\n" -msgstr "%s: vynulovn zznamu selhalo: %s\n" - -#: g10/tdbio.c:1459 -#, c-format -msgid "%s: failed to append a record: %s\n" -msgstr "%s: pidn zznamu selhalo: %s\n" - -#: g10/tdbio.c:1504 -msgid "the trustdb is corrupted; please run \"gpg --fix-trustdb\".\n" -msgstr "databze dvry je pokozena; prosm spuste \"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 delmi 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: akceptovn jako dvryhodn kl\n" - -#: g10/trustdb.c:296 -#, c-format -msgid "key %s occurs more than once in the trustdb\n" -msgstr "kl %s se v databzi dvry vyskytuje vce ne jednou\n" - -#: g10/trustdb.c:311 -#, c-format -msgid "key %s: no public key for trusted key - skipped\n" -msgstr "kl %s: nenalezen veejn kl k dvryhodnmu kli - peskoeno\n" - -#: g10/trustdb.c:321 -#, c-format -msgid "key %s marked as ultimately trusted\n" -msgstr "kl %s oznaen jako absolutn dvryhodn.\n" - -#: g10/trustdb.c:345 -#, c-format -msgid "trust record %lu, req type %d: read failed: %s\n" -msgstr "zznam dvry %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 "zznam dvry %lu nen poadovanho typu %d\n" - -#: g10/trustdb.c:447 -#, c-format -msgid "unable to use unknown trust model (%d) - assuming %s trust model\n" -msgstr "" -"nelze pout neznm model dvry (%d) - pedpokldme pouit modelu %s\n" - -#: g10/trustdb.c:453 -#, c-format -msgid "using %s trust model\n" -msgstr "pouiit modelu dvry %s\n" - -#: g10/trustdb.c:505 -msgid "10 translator see trustdb.c:uid_trust_string_fixed" -msgstr "" -"14 fixn dlka na kterou se pekld see trustdb.c:uid_trust_string_fixed" - -#: g10/trustdb.c:507 -msgid "[ revoked]" -msgstr "[ revokovn ]" - -#: g10/trustdb.c:509 g10/trustdb.c:514 -msgid "[ expired]" -msgstr "[ expirovn ]" - -#: g10/trustdb.c:513 -msgid "[ unknown]" -msgstr "[ neznm ]" - -#: g10/trustdb.c:515 -msgid "[ undef ]" -msgstr "[nedefinovan]" - -#: g10/trustdb.c:516 -msgid "[marginal]" -msgstr "[ sten ]" - -#: g10/trustdb.c:517 -msgid "[ full ]" -msgstr "[ pln ]" - -#: g10/trustdb.c:518 -msgid "[ultimate]" -msgstr "[ absolutn ]" - -#: g10/trustdb.c:533 -msgid "undefined" -msgstr "nedefinovna" - -#: g10/trustdb.c:534 -msgid "never" -msgstr "dn" - -#: g10/trustdb.c:535 -msgid "marginal" -msgstr "sten" - -#: 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 databzi dvry\n" - -#: g10/trustdb.c:583 g10/trustdb.c:2352 -#, c-format -msgid "next trustdb check due at %s\n" -msgstr "dal kontrola databze dvry 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 databzi dvry 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 databzi dvry s modelem `%s'\n" - -#: g10/trustdb.c:839 g10/trustdb.c:1277 -#, c-format -msgid "public key %s not found: %s\n" -msgstr "veejn kl %s nebyl nalezen: %s\n" - -#: g10/trustdb.c:1034 -msgid "please do a --check-trustdb\n" -msgstr "prosm provete --check-trustdb\n" - -#: g10/trustdb.c:1038 -msgid "checking the trustdb\n" -msgstr "kontroluji databzi dvry\n" - -#: g10/trustdb.c:2095 -#, c-format -msgid "%d keys processed (%d validity counts cleared)\n" -msgstr "zpracovno %d kl (%d validit vymazno)\n" - -#: g10/trustdb.c:2160 -msgid "no ultimately trusted keys found\n" -msgstr "dn absolutn dvryhodn kl nebyl nalezen\n" - -#: g10/trustdb.c:2174 -#, c-format -msgid "public key of ultimately trusted key %s not found\n" -msgstr "veejn kl k absolutn dvryhodnmu kli %s nebyl nalezen\n" - -#: g10/trustdb.c:2197 -#, c-format -msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n" -msgstr "poadovno %d sten dvry a %d pln dvry, 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 platnch: %3d podepsanch: %3d dvra: %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 zznam v databzi dvry: chyba pi zpisu: %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 mon ovit.\n" -"Prosm, nezapomete, e soubor s podpisem (.sig nebo .asc)\n" -"by ml bt prvnm souborem zadanm na pkazov dce.\n" - -#: g10/verify.c:192 -#, c-format -msgid "input line %u too long or missing LF\n" -msgstr "vstupn dek %u je pli 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 "neznm typ paketu" - -#: util/errors.c:57 -msgid "unknown version" -msgstr "neznm verze" - -#: util/errors.c:58 -msgid "unknown pubkey algorithm" -msgstr "neznm algoritmus veejnho kle" - -#: util/errors.c:59 -msgid "unknown digest algorithm" -msgstr "neznm hashovac algoritmus" - -#: util/errors.c:60 -msgid "bad public key" -msgstr "patn veejn 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 kontrolnho soutu" - -#: util/errors.c:64 -msgid "bad passphrase" -msgstr "patn heslo" - -#: util/errors.c:65 -msgid "public key not found" -msgstr "veejn kl nenalezen" - -#: util/errors.c:66 -msgid "unknown cipher algorithm" -msgstr "neznm ifrovac algoritmus" - -#: util/errors.c:67 -msgid "can't open the keyring" -msgstr "nemohu otevt soubor kl" - -#: util/errors.c:68 -msgid "invalid packet" -msgstr "neplatn paket" - -#: util/errors.c:69 -msgid "invalid armor" -msgstr "neplatn zpsob reprezentace v ASCII" - -#: util/errors.c:70 -msgid "no such user id" -msgstr "neexistuje uivatel s tmto 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 pouit patn tajn kl" - -#: util/errors.c:73 -msgid "not supported" -msgstr "nepodporovno" - -#: util/errors.c:74 -msgid "bad key" -msgstr "patn kl" - -#: util/errors.c:75 -msgid "file read error" -msgstr "chyba pi ten souboru" - -#: util/errors.c:76 -msgid "file write error" -msgstr "chyba pi zpisu souboru" - -#: util/errors.c:77 -msgid "unknown compress algorithm" -msgstr "neznm kompriman algoritmus" - -#: util/errors.c:78 -msgid "file open error" -msgstr "chyba pi otvrn souboru" - -#: util/errors.c:79 -msgid "file create error" -msgstr "chyba pi vytven souboru" - -#: util/errors.c:80 -msgid "invalid passphrase" -msgstr "nesprvn heslo" - -#: util/errors.c:81 -msgid "unimplemented pubkey algorithm" -msgstr "algoritmus veejnho kle nen implementovn" - -#: util/errors.c:82 -msgid "unimplemented cipher algorithm" -msgstr "ifrovac algoritmus nen implementovn" - -#: util/errors.c:83 -msgid "unknown signature class" -msgstr "neznm tda podpisu" - -#: util/errors.c:84 -msgid "trust database error" -msgstr "chyba v databzi dvry" - -#: 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 certifikt" - -#: util/errors.c:89 -msgid "malformed user id" -msgstr "patn formt id uivatele" - -#: util/errors.c:90 -msgid "file close error" -msgstr "chyba pi zavrn souboru" - -#: util/errors.c:91 -msgid "file rename error" -msgstr "chyba pi pejmenovn souboru" - -#: util/errors.c:92 -msgid "file delete error" -msgstr "chyba pi mazn souboru" - -#: util/errors.c:93 -msgid "unexpected data" -msgstr "neoekvan data" - -#: util/errors.c:94 -msgid "timestamp conflict" -msgstr "konflikt asovho raztka" - -#: util/errors.c:95 -msgid "unusable pubkey algorithm" -msgstr "nepouiteln algoritmus s veejnm klem" - -#: 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 podporovno" - -#: util/errors.c:101 -msgid "network error" -msgstr "chyba st" - -#: util/errors.c:103 -msgid "not encrypted" -msgstr "nezaifrovno" - -#: util/errors.c:104 -msgid "not processed" -msgstr "nezpracovno" - -#: util/errors.c:106 -msgid "unusable public key" -msgstr "nepouiteln veejn kl" - -#: util/errors.c:107 -msgid "unusable secret key" -msgstr "nepouiteln tajn kl" - -#: util/errors.c:108 -msgid "keyserver error" -msgstr "chyba serveru kl" - -#: util/errors.c:109 -msgid "canceled" -msgstr "zrueno" - -#: 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 "VAROVN: " - -#: 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 "ukonit" - -#: 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 "zruit|zruit" - -#: 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 "VAROVN: Pouvan pam nen bezpen!\n" - -#: util/secmem.c:98 -msgid "please see http://www.gnupg.org/faq.html for more information\n" -msgstr "Vce informac naleznete na adrese http://www.gnupg.cz/faq.html\n" - -#: util/secmem.c:350 -msgid "operation is not possible without initialized secure memory\n" -msgstr "provst operaci nen mon bez inicializovan bezpen pamti\n" - -#: util/secmem.c:351 -msgid "(you may have used the wrong program for this task)\n" -msgstr "(pravdpodobn jste pro tento kol pouili nesprvn program)\n" - -#~ msgid "DSA requires the use of a 160 bit hash algorithm\n" -#~ msgstr "DSA poaduje pouit 160-ti bitovho hashovacho algoritmu\n" - -#~ msgid "" -#~ "please see http://www.gnupg.org/why-not-idea.html for more information\n" -#~ msgstr "" -#~ "vce 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 jmno sm obsahovat pouze psmena, slice, teky nebo " -#~ "podtrtka a mus konit znakem '='\n" - -#~ msgid "a user notation name must contain the '@' character\n" -#~ msgstr "jmno uivatele mus obsahovat znakt '@' \n" - -#~ msgid "a notation name must not contain more than one '@' character\n" -#~ msgstr "jmno uivatele nesm obsahovat vce ne jeden znak '@' \n" - -#~ msgid "a notation value must not use any control characters\n" -#~ msgstr "hodnota neme obsahovat dn kontroln znaky\n" - -#~ msgid "WARNING: invalid notation data found\n" -#~ msgstr "VAROVN: nalezen neplatn formt zpisu data\n" - -#~ msgid "not human readable" -#~ msgstr "nen v pmo itelnm formtu" - -#~ msgid "expired: %s)" -#~ msgstr "platnost skonila: %s)" diff --git a/po/da.po b/po/da.po deleted file mode 100644 index 7bcfb20e6..000000000 --- a/po/da.po +++ /dev/null @@ -1,6770 +0,0 @@ -# Dansk oversttelse 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 gr 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-07-28 11:12+0200\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:1003 g10/gpg.c:3461 g10/import.c:195 g10/keygen.c:2385 -#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:342 -#: 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:1002 g10/keygen.c:2864 -#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:263 -#: g10/openfile.c:357 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 tilfldig-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 tilfldige nummer generator er kun en \"kludge\" for at\n" -"lade den kre - det er ikke en strk 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 tilfldige byte tilgngelig. Please do some other work to give\n" -"the OS a chance to collect more entropy! (Krver %d byte mere)\n" - -# er det klogt at overstte 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 nglering\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 "pkldning 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 kodestning: %s\n" - -#: g10/app-openpgp.c:1546 g10/app-openpgp.c:1996 -#, fuzzy -msgid "error reading application data\n" -msgstr "fejl ved lsning 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 ngle fra den hemmelige nglering" - -#: 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 "generr et nyt nglepar" - -#: 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 overstte 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 "Ngleoprettelse 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:320 -#, c-format -msgid "armor: %s\n" -msgstr "panser: %s\n" - -#: g10/armor.c:359 -msgid "invalid armor header: " -msgstr "ugyldigt panserhoved: " - -#: g10/armor.c:370 -msgid "armor header: " -msgstr "panserhoved: " - -#: g10/armor.c:381 -msgid "invalid clearsig header\n" -msgstr "" - -#: g10/armor.c:433 -msgid "nested clear text signatures\n" -msgstr "" - -#: g10/armor.c:568 -#, fuzzy -msgid "unexpected armor: " -msgstr "uforventet beskyttelse:" - -#: g10/armor.c:580 -msgid "invalid dash escaped line: " -msgstr "" - -#: g10/armor.c:734 g10/armor.c:1343 -#, fuzzy, c-format -msgid "invalid radix64 character %02X skipped\n" -msgstr "ugyldigt radix64 tegn %02x udeladt\n" - -#: g10/armor.c:777 -msgid "premature eof (no CRC)\n" -msgstr "for tidlig eof (ingen CRC)\n" - -#: g10/armor.c:811 -msgid "premature eof (in CRC)\n" -msgstr "for tidlig eof (i CRC)\n" - -#: g10/armor.c:819 -msgid "malformed CRC\n" -msgstr "drlig CRC\n" - -#: g10/armor.c:823 g10/armor.c:1380 -#, fuzzy, c-format -msgid "CRC error; %06lX - %06lX\n" -msgstr "CRC fejl; %06lx - %06lx\n" - -#: g10/armor.c:843 -#, fuzzy -msgid "premature eof (in trailer)\n" -msgstr "for tidlig eof (i trailer)\n" - -#: g10/armor.c:847 -msgid "error in trailer line\n" -msgstr "fejl i trailerlinie\n" - -#: g10/armor.c:1158 -msgid "no valid OpenPGP data found.\n" -msgstr "ingen gyldig OpenPGP data fundet.\n" - -#: g10/armor.c:1163 -#, c-format -msgid "invalid armor: line longer than %d characters\n" -msgstr "ugyldigt panser: linie lngere end %d tegn\n" - -#: g10/armor.c:1167 -msgid "" -"quoted printable character in armor - probably a buggy MTA has been used\n" -msgstr "quoted printable-tegn i panser - mske pga. en fejlbehftet MTA\n" - -#: g10/card-util.c:63 g10/card-util.c:306 -#, fuzzy, c-format -msgid "OpenPGP card not available: %s\n" -msgstr "hemmelig ngle ikke tilgngelig" - -#: 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 "sltil" - -#: g10/card-util.c:414 -#, fuzzy -msgid "female" -msgstr "sltil" - -#: 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:280 -#, c-format -msgid "error reading `%s': %s\n" -msgstr "fejl ved lsning 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 prferencer" - -#: 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 "pkldning 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 nglering `%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 "Vlg venligst hvilken slags ngle du vil have:\n" - -#: g10/card-util.c:1125 g10/card-util.c:1206 -#, fuzzy -msgid " (1) Signature key\n" -msgstr "Denne ngle er ikke beskyttet.\n" - -#: g10/card-util.c:1126 g10/card-util.c:1208 -#, fuzzy -msgid " (2) Encryption key\n" -msgstr " (%d) ElGamal (kryptr 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 ngletilbagekald\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 ngle ikke tilgngelig" - -#: g10/card-util.c:1248 -#, fuzzy -msgid "secret key already stored on a card\n" -msgstr "udelod: hemmelig ngle 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 hjlp" - -#: g10/card-util.c:1324 -#, fuzzy -msgid "list all available data" -msgstr "Ingen hjlp tilgngelig" - -#: 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 udlbsdatoen" - -#: g10/card-util.c:1331 -#, fuzzy -msgid "change the language preferences" -msgstr "vis prferencer" - -#: 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 "generr et nyt nglepar" - -#: 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 ngle ikke tilgngelig" - -#: 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 kodestning: " - -#: g10/cardglue.c:952 -#, fuzzy -msgid "PIN not correctly repeated; try again" -msgstr "kodestningen blev ikke ordentlig gentaget; prv igen.\n" - -#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3826 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:3387 g10/keyserver.c:1700 -#: 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:2349 g10/keyserver.c:1714 -#: g10/revoke.c:234 g10/revoke.c:478 -#, fuzzy, c-format -msgid "error reading keyblock: %s\n" -msgstr "fejl ved lsning 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 ngle fra ngleringen? " - -#: 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 kodestning: %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 "lser 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:67 g10/mainproc.c:293 -#, c-format -msgid "%s encrypted data\n" -msgstr "" - -#: g10/encr-data.c:69 g10/mainproc.c:297 -#, c-format -msgid "encrypted with unknown algorithm %d\n" -msgstr "" - -#: g10/encr-data.c:93 -msgid "" -"WARNING: message was encrypted with a weak key in the symmetric cipher.\n" -msgstr "" - -#: g10/encr-data.c:104 -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:415 -#, 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 "signr nglen 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 "drlig hemmelig ngle" - -#: 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 "ngle %08lX: ikke en rfc2440 ngle - udeladt\n" - -#: g10/export.c:362 -#, fuzzy, c-format -msgid "key %s: PGP 2.x style key - skipped\n" -msgstr "ngle %08lX: ikke en rfc2440 ngle - udeladt\n" - -#: g10/export.c:373 -#, fuzzy, c-format -msgid "key %s: key material on-card - skipped\n" -msgstr "ngle %08lX: ikke en rfc2440 ngle - udeladt\n" - -#: g10/export.c:521 -msgid "about to export an unprotected subkey\n" -msgstr "" - -# er det klogt at overstte 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:375 -msgid "" -"@Commands:\n" -" " -msgstr "" -"@Kommandoer:\n" -" " - -#: g10/gpg.c:377 -msgid "|[file]|make a signature" -msgstr "|[filer]|opret en signatur" - -#: g10/gpg.c:378 -msgid "|[file]|make a clear text signature" -msgstr "|[filer]|opret rentekst signatur" - -#: g10/gpg.c:379 -msgid "make a detached signature" -msgstr "opret en separat signatur" - -#: g10/gpg.c:380 -msgid "encrypt data" -msgstr "kryptr data" - -#: g10/gpg.c:382 -msgid "encryption only with symmetric cipher" -msgstr "kryptr kun med symmetriske cifre" - -#: g10/gpg.c:384 -msgid "decrypt data (default)" -msgstr "afkryptr data (standard)" - -#: g10/gpg.c:386 -msgid "verify a signature" -msgstr "godkend en signatur" - -#: g10/gpg.c:388 -msgid "list keys" -msgstr "vis ngler" - -#: g10/gpg.c:390 -msgid "list keys and signatures" -msgstr "vis ngler og signaturer" - -#: g10/gpg.c:391 -#, fuzzy -msgid "list and check key signatures" -msgstr "tjek nglesignaturer" - -#: g10/gpg.c:392 -msgid "list keys and fingerprints" -msgstr "vis ngle og fingeraftryk" - -#: g10/gpg.c:393 -msgid "list secret keys" -msgstr "vis hemmelige ngler" - -#: g10/gpg.c:394 -msgid "generate a new key pair" -msgstr "generr et nyt nglepar" - -#: g10/gpg.c:395 -#, fuzzy -msgid "remove keys from the public keyring" -msgstr "fjern ngle fra den offentlige nglering" - -#: g10/gpg.c:397 -#, fuzzy -msgid "remove keys from the secret keyring" -msgstr "fjern ngle fra den hemmelige nglering" - -#: g10/gpg.c:398 -msgid "sign a key" -msgstr "signr en ngle" - -#: g10/gpg.c:399 -msgid "sign a key locally" -msgstr "signr en ngle lokalt" - -#: g10/gpg.c:400 -msgid "sign or edit a key" -msgstr "signr eller redigr en ngle" - -#: g10/gpg.c:401 -msgid "generate a revocation certificate" -msgstr "Generr en annullrbar certifikat" - -#: g10/gpg.c:403 -msgid "export keys" -msgstr "eksportr ngler" - -#: g10/gpg.c:404 -msgid "export keys to a key server" -msgstr "eksportr ngler til en ngletjener" - -#: g10/gpg.c:405 -msgid "import keys from a key server" -msgstr "importr ngler fra en ngleserver" - -#: g10/gpg.c:407 -#, fuzzy -msgid "search for keys on a key server" -msgstr "eksportr ngler til en ngletjener" - -#: g10/gpg.c:409 -#, fuzzy -msgid "update all keys from a keyserver" -msgstr "importr ngler fra en ngleserver" - -#: g10/gpg.c:413 -msgid "import/merge keys" -msgstr "importr/fusionr ngler" - -#: g10/gpg.c:416 -msgid "print the card status" -msgstr "" - -#: g10/gpg.c:417 -msgid "change data on a card" -msgstr "" - -#: g10/gpg.c:418 -msgid "change a card's PIN" -msgstr "" - -#: g10/gpg.c:426 -msgid "update the trust database" -msgstr "opdatr tillidsdatabasen" - -#: g10/gpg.c:433 -msgid "|algo [files]|print message digests" -msgstr "|algo [filer]|print meddelelsesresum" - -#: g10/gpg.c:437 g10/gpgv.c:71 -msgid "" -"@\n" -"Options:\n" -" " -msgstr "" -"@\n" -"Indstillinger:\n" -" " - -#: g10/gpg.c:439 -msgid "create ascii armored output" -msgstr "opret ascii beskyttet uddata" - -#: g10/gpg.c:441 -msgid "|NAME|encrypt for NAME" -msgstr "|NAME|kryptr for NAME" - -#: g10/gpg.c:452 -msgid "use this user-id to sign or decrypt" -msgstr "brug denne bruger-id til at signere eller dekryptere" - -#: g10/gpg.c:453 -msgid "|N|set compress level N (0 disables)" -msgstr "|N|st kompresningsniveau N (0 = slet fra)" - -#: g10/gpg.c:458 -msgid "use canonical text mode" -msgstr "brug kanonisk tekstmodus" - -#: g10/gpg.c:472 -msgid "use as output file" -msgstr "brug som uddatafil" - -#: g10/gpg.c:474 g10/gpgv.c:73 -msgid "verbose" -msgstr "meddelsom" - -#: g10/gpg.c:485 -msgid "do not make any changes" -msgstr "lav ingen ndringer" - -#: g10/gpg.c:486 -msgid "prompt before overwriting" -msgstr "" - -#: g10/gpg.c:527 -msgid "use strict OpenPGP behavior" -msgstr "" - -#: g10/gpg.c:528 -msgid "generate PGP 2.x compatible messages" -msgstr "" - -#: g10/gpg.c:556 -msgid "" -"@\n" -"(See the man page for a complete listing of all commands and options)\n" -msgstr "" - -#: g10/gpg.c:559 -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] signr og kryptr for bruger Mikael\n" -" --clearsign [fil] lav en ren tekstsignatur\n" -" --detach-sign [fil] lav en separat signatur\n" -" --list-keys [navne] vis ngler\n" -" --fingerprint [navne] vis fingeraftryk\n" - -#: g10/gpg.c:757 g10/gpgv.c:98 -msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n" -msgstr "Rapportr venligst fejl til <gnupg-bugs@gnu.org>.\n" - -#: g10/gpg.c:774 -msgid "Usage: gpg [options] [files] (-h for help)" -msgstr "Brug: gpg [flag] [filer] (-h for hjlp)" - -# Skal alt dette oversttes eller er det flagene? -#: g10/gpg.c:777 -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 afhnger af inddata\n" - -#: g10/gpg.c:788 -msgid "" -"\n" -"Supported algorithms:\n" -msgstr "" -"\n" -"Understttede algoritmer:\n" - -#: g10/gpg.c:791 -msgid "Pubkey: " -msgstr "" - -#: g10/gpg.c:797 g10/keyedit.c:2310 -msgid "Cipher: " -msgstr "" - -#: g10/gpg.c:803 -msgid "Hash: " -msgstr "" - -#: g10/gpg.c:809 g10/keyedit.c:2356 -#, fuzzy -msgid "Compression: " -msgstr "Kommentar: " - -#: g10/gpg.c:892 -msgid "usage: gpg [options] " -msgstr "brug: gpg [flag] " - -#: g10/gpg.c:1040 -msgid "conflicting commands\n" -msgstr "konfliktende kommandoer\n" - -#: g10/gpg.c:1058 -#, c-format -msgid "no = sign found in group definition `%s'\n" -msgstr "" - -#: g10/gpg.c:1255 -#, c-format -msgid "WARNING: unsafe ownership on homedir `%s'\n" -msgstr "" - -#: g10/gpg.c:1258 -#, c-format -msgid "WARNING: unsafe ownership on configuration file `%s'\n" -msgstr "" - -#: g10/gpg.c:1261 -#, c-format -msgid "WARNING: unsafe ownership on extension `%s'\n" -msgstr "" - -#: g10/gpg.c:1267 -#, c-format -msgid "WARNING: unsafe permissions on homedir `%s'\n" -msgstr "" - -#: g10/gpg.c:1270 -#, c-format -msgid "WARNING: unsafe permissions on configuration file `%s'\n" -msgstr "" - -#: g10/gpg.c:1273 -#, c-format -msgid "WARNING: unsafe permissions on extension `%s'\n" -msgstr "" - -#: g10/gpg.c:1279 -#, c-format -msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n" -msgstr "" - -#: g10/gpg.c:1282 -#, c-format -msgid "" -"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n" -msgstr "" - -#: g10/gpg.c:1285 -#, c-format -msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n" -msgstr "" - -#: g10/gpg.c:1291 -#, c-format -msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n" -msgstr "" - -#: g10/gpg.c:1294 -#, c-format -msgid "" -"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n" -msgstr "" - -#: g10/gpg.c:1297 -#, c-format -msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n" -msgstr "" - -#: g10/gpg.c:1438 -#, fuzzy, c-format -msgid "unknown configuration item `%s'\n" -msgstr "ukendt standard modtager '%s'\n" - -#: g10/gpg.c:1531 -msgid "display photo IDs during key listings" -msgstr "" - -#: g10/gpg.c:1533 -msgid "show policy URLs during signature listings" -msgstr "" - -#: g10/gpg.c:1535 -msgid "show all notations during signature listings" -msgstr "" - -#: g10/gpg.c:1537 -msgid "show IETF standard notations during signature listings" -msgstr "" - -#: g10/gpg.c:1541 -msgid "show user-supplied notations during signature listings" -msgstr "" - -#: g10/gpg.c:1543 -#, fuzzy -msgid "show preferred keyserver URLs during signature listings" -msgstr "den givne politik-URL er ugyldig\n" - -#: g10/gpg.c:1545 -msgid "show user ID validity during key listings" -msgstr "" - -#: g10/gpg.c:1547 -msgid "show revoked and expired user IDs in key listings" -msgstr "" - -#: g10/gpg.c:1549 -msgid "show revoked and expired subkeys in key listings" -msgstr "" - -#: g10/gpg.c:1551 -#, fuzzy -msgid "show the keyring name in key listings" -msgstr "skift imellem hemmelig og offentlig ngle visning" - -#: g10/gpg.c:1553 -msgid "show expiration dates during signature listings" -msgstr "" - -#: g10/gpg.c:1920 -#, fuzzy, c-format -msgid "NOTE: old default options file `%s' ignored\n" -msgstr "NOTITS: ingen standard alternativfil '%s'\n" - -#: g10/gpg.c:1962 -#, c-format -msgid "NOTE: no default option file `%s'\n" -msgstr "NOTITS: ingen standard alternativfil '%s'\n" - -#: g10/gpg.c:1966 -#, c-format -msgid "option file `%s': %s\n" -msgstr "alternativfil`%s': %s\n" - -#: g10/gpg.c:1973 -#, c-format -msgid "reading options from `%s'\n" -msgstr "lser indstillinger fra `%s'\n" - -#: g10/gpg.c:2188 g10/gpg.c:2814 g10/gpg.c:2833 -#, c-format -msgid "NOTE: %s is not for normal use!\n" -msgstr "NOTITS: %s er ikke til normal brug!\n" - -#: g10/gpg.c:2201 -#, c-format -msgid "cipher extension `%s' not loaded due to unsafe permissions\n" -msgstr "" - -#: g10/gpg.c:2364 g10/gpg.c:2376 -#, fuzzy, c-format -msgid "`%s' is not a valid signature expiration\n" -msgstr "%s er ikke et gyldigt tegnst\n" - -#: g10/gpg.c:2452 -#, fuzzy, c-format -msgid "`%s' is not a valid character set\n" -msgstr "%s er ikke et gyldigt tegnst\n" - -#: g10/gpg.c:2476 g10/gpg.c:2663 g10/keyedit.c:4064 -#, fuzzy -msgid "could not parse keyserver URL\n" -msgstr "importr ngler fra en ngleserver: %s\n" - -#: g10/gpg.c:2488 -#, fuzzy, c-format -msgid "%s:%d: invalid keyserver options\n" -msgstr "ADVARSEL: '%s' er en tom fil\n" - -#: g10/gpg.c:2491 -#, fuzzy -msgid "invalid keyserver options\n" -msgstr "ugyldig nglering" - -#: g10/gpg.c:2498 -#, fuzzy, c-format -msgid "%s:%d: invalid import options\n" -msgstr "ADVARSEL: '%s' er en tom fil\n" - -#: g10/gpg.c:2501 -#, fuzzy -msgid "invalid import options\n" -msgstr "ugyldig rustning" - -#: g10/gpg.c:2508 -#, fuzzy, c-format -msgid "%s:%d: invalid export options\n" -msgstr "ADVARSEL: '%s' er en tom fil\n" - -#: g10/gpg.c:2511 -#, fuzzy -msgid "invalid export options\n" -msgstr "ugyldig nglering" - -#: g10/gpg.c:2518 -#, fuzzy, c-format -msgid "%s:%d: invalid list options\n" -msgstr "ADVARSEL: '%s' er en tom fil\n" - -#: g10/gpg.c:2521 -#, fuzzy -msgid "invalid list options\n" -msgstr "ugyldig rustning" - -#: g10/gpg.c:2529 -msgid "display photo IDs during signature verification" -msgstr "" - -#: g10/gpg.c:2531 -msgid "show policy URLs during signature verification" -msgstr "" - -#: g10/gpg.c:2533 -#, fuzzy -msgid "show all notations during signature verification" -msgstr "%s er ikke et gyldigt tegnst\n" - -#: g10/gpg.c:2535 -msgid "show IETF standard notations during signature verification" -msgstr "" - -#: g10/gpg.c:2539 -msgid "show user-supplied notations during signature verification" -msgstr "" - -#: g10/gpg.c:2541 -#, fuzzy -msgid "show preferred keyserver URLs during signature verification" -msgstr "den givne politik-URL er ugyldig\n" - -#: g10/gpg.c:2543 -#, fuzzy -msgid "show user ID validity during signature verification" -msgstr "%s er ikke et gyldigt tegnst\n" - -#: g10/gpg.c:2545 -msgid "show revoked and expired user IDs in signature verification" -msgstr "" - -#: g10/gpg.c:2547 -msgid "validate signatures with PKA data" -msgstr "" - -#: g10/gpg.c:2549 -msgid "elevate the trust of signatures with valid PKA data" -msgstr "" - -#: g10/gpg.c:2556 -#, fuzzy, c-format -msgid "%s:%d: invalid verify options\n" -msgstr "ADVARSEL: '%s' er en tom fil\n" - -#: g10/gpg.c:2559 -#, fuzzy -msgid "invalid verify options\n" -msgstr "ugyldig nglering" - -#: g10/gpg.c:2566 -#, c-format -msgid "unable to set exec-path to %s\n" -msgstr "" - -#: g10/gpg.c:2729 -#, fuzzy, c-format -msgid "%s:%d: invalid auto-key-locate list\n" -msgstr "ADVARSEL: '%s' er en tom fil\n" - -#: g10/gpg.c:2732 -msgid "invalid auto-key-locate list\n" -msgstr "" - -#: g10/gpg.c:2803 -msgid "WARNING: program may create a core file!\n" -msgstr "" - -#: g10/gpg.c:2807 -#, c-format -msgid "WARNING: %s overrides %s\n" -msgstr "" - -#: g10/gpg.c:2816 -#, c-format -msgid "%s not allowed with %s!\n" -msgstr "%s ikke tilladt med %s!\n" - -#: g10/gpg.c:2819 -#, c-format -msgid "%s makes no sense with %s!\n" -msgstr "%s er meningsls sammen med %s!\n" - -#: g10/gpg.c:2826 -#, fuzzy, c-format -msgid "NOTE: %s is not available in this version\n" -msgstr "RSA ngle kan ikke bruges i denne version\n" - -#: g10/gpg.c:2841 -#, fuzzy, c-format -msgid "will not run with insecure memory due to %s\n" -msgstr "skriver hemmeligt certifikat til '%s'\n" - -#: g10/gpg.c:2855 -msgid "you can only make detached or clear signatures while in --pgp2 mode\n" -msgstr "" - -#: g10/gpg.c:2861 -msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n" -msgstr "" - -#: g10/gpg.c:2867 -msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n" -msgstr "" - -#: g10/gpg.c:2880 -msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n" -msgstr "" - -#: g10/gpg.c:2947 g10/gpg.c:2971 -msgid "selected cipher algorithm is invalid\n" -msgstr "valgte cifferalgoritme er ugyldig\n" - -#: g10/gpg.c:2953 g10/gpg.c:2977 -msgid "selected digest algorithm is invalid\n" -msgstr "valgte resumalgoritme er ugyldig\n" - -#: g10/gpg.c:2959 -#, fuzzy -msgid "selected compression algorithm is invalid\n" -msgstr "valgte cifferalgoritme er ugyldig\n" - -#: g10/gpg.c:2965 -#, fuzzy -msgid "selected certification digest algorithm is invalid\n" -msgstr "valgte resumalgoritme er ugyldig\n" - -#: g10/gpg.c:2980 -msgid "completes-needed must be greater than 0\n" -msgstr "" - -#: g10/gpg.c:2982 -msgid "marginals-needed must be greater than 1\n" -msgstr "" - -#: g10/gpg.c:2984 -msgid "max-cert-depth must be in the range from 1 to 255\n" -msgstr "" - -#: g10/gpg.c:2986 -#, fuzzy -msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n" -msgstr "ugyldig S2K modus; skal vre 0, 1 el. 3\n" - -#: g10/gpg.c:2988 -#, fuzzy -msgid "invalid min-cert-level; must be 1, 2, or 3\n" -msgstr "ugyldig S2K modus; skal vre 0, 1 el. 3\n" - -#: g10/gpg.c:2991 -msgid "NOTE: simple S2K mode (0) is strongly discouraged\n" -msgstr "NOTE: simpel S2K modus (0) frardes p det skarpeste\n" - -#: g10/gpg.c:2995 -msgid "invalid S2K mode; must be 0, 1 or 3\n" -msgstr "ugyldig S2K modus; skal vre 0, 1 el. 3\n" - -#: g10/gpg.c:3002 -#, fuzzy -msgid "invalid default preferences\n" -msgstr "vis prferencer" - -#: g10/gpg.c:3011 -#, fuzzy -msgid "invalid personal cipher preferences\n" -msgstr "vis prferencer" - -#: g10/gpg.c:3015 -#, fuzzy -msgid "invalid personal digest preferences\n" -msgstr "vis prferencer" - -#: g10/gpg.c:3019 -#, fuzzy -msgid "invalid personal compress preferences\n" -msgstr "vis prferencer" - -#: g10/gpg.c:3052 -#, fuzzy, c-format -msgid "%s does not yet work with %s\n" -msgstr "%s er meningsls sammen med %s!\n" - -#: g10/gpg.c:3099 -#, c-format -msgid "you may not use cipher algorithm `%s' while in %s mode\n" -msgstr "" - -#: g10/gpg.c:3104 -#, c-format -msgid "you may not use digest algorithm `%s' while in %s mode\n" -msgstr "" - -#: g10/gpg.c:3109 -#, 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 overstte TrustDB? -#: g10/gpg.c:3208 -#, c-format -msgid "failed to initialize the TrustDB: %s\n" -msgstr "kunne ikke initialisere TillidsDB: %s\n" - -#: g10/gpg.c:3219 -msgid "WARNING: recipients (-r) given without using public key encryption\n" -msgstr "" - -#: g10/gpg.c:3230 -msgid "--store [filename]" -msgstr "--store [filnavn (som gemmes)]" - -#: g10/gpg.c:3237 -msgid "--symmetric [filename]" -msgstr "--symmetric [filnavn]" - -#: g10/gpg.c:3239 -#, fuzzy, c-format -msgid "symmetric encryption of `%s' failed: %s\n" -msgstr "fjernelse af beskyttelse fejlede: %s\n" - -#: g10/gpg.c:3249 -msgid "--encrypt [filename]" -msgstr "--encrypt [filnavn (som krypteres)]" - -#: g10/gpg.c:3262 -#, fuzzy -msgid "--symmetric --encrypt [filename]" -msgstr "--sign --encrypt [filnavn]" - -#: g10/gpg.c:3264 -msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n" -msgstr "" - -#: g10/gpg.c:3267 -#, c-format -msgid "you cannot use --symmetric --encrypt while in %s mode\n" -msgstr "" - -#: g10/gpg.c:3285 -msgid "--sign [filename]" -msgstr "--sign [filnavn (som signeres)]" - -#: g10/gpg.c:3298 -msgid "--sign --encrypt [filename]" -msgstr "--sign --encrypt [filnavn]" - -#: g10/gpg.c:3313 -#, fuzzy -msgid "--symmetric --sign --encrypt [filename]" -msgstr "--sign --encrypt [filnavn]" - -#: g10/gpg.c:3315 -msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n" -msgstr "" - -#: g10/gpg.c:3318 -#, c-format -msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n" -msgstr "" - -#: g10/gpg.c:3338 -#, fuzzy -msgid "--sign --symmetric [filename]" -msgstr "--symmetric [filnavn]" - -#: g10/gpg.c:3347 -msgid "--clearsign [filename]" -msgstr "--clearsign [filnavn]" - -#: g10/gpg.c:3372 -msgid "--decrypt [filename]" -msgstr "--decrypt [filnavn (som dekrypteres)]" - -#: g10/gpg.c:3380 -msgid "--sign-key user-id" -msgstr "--sign-key bruger-id" - -#: g10/gpg.c:3384 -msgid "--lsign-key user-id" -msgstr "--lsign-key bruger-id" - -#: g10/gpg.c:3405 -msgid "--edit-key user-id [commands]" -msgstr "--edit-key bruger-id [kommandoer]" - -#: g10/gpg.c:3476 -msgid "-k[v][v][v][c] [user-id] [keyring]" -msgstr "-k[v][v][v][c] [bruger-id] [nglering]" - -#: g10/gpg.c:3518 -#, fuzzy, c-format -msgid "keyserver send failed: %s\n" -msgstr "pkldning af beskyttelse fejlede: %s\n" - -#: g10/gpg.c:3520 -#, fuzzy, c-format -msgid "keyserver receive failed: %s\n" -msgstr "pkldning af beskyttelse fejlede: %s\n" - -#: g10/gpg.c:3522 -#, fuzzy, c-format -msgid "key export failed: %s\n" -msgstr "pkldning af beskyttelse fejlede: %s\n" - -#: g10/gpg.c:3533 -#, fuzzy, c-format -msgid "keyserver search failed: %s\n" -msgstr "signering fejlede: %s\n" - -#: g10/gpg.c:3543 -#, c-format -msgid "keyserver refresh failed: %s\n" -msgstr "" - -#: g10/gpg.c:3594 -#, c-format -msgid "dearmoring failed: %s\n" -msgstr "fjernelse af beskyttelse fejlede: %s\n" - -#: g10/gpg.c:3602 -#, c-format -msgid "enarmoring failed: %s\n" -msgstr "pkldning af beskyttelse fejlede: %s\n" - -#: g10/gpg.c:3689 -#, c-format -msgid "invalid hash algorithm `%s'\n" -msgstr "ugyldig hash-algoritme `%s'\n" - -#: g10/gpg.c:3812 -msgid "[filename]" -msgstr "[filnavn]" - -#: g10/gpg.c:3816 -msgid "Go ahead and type your message ...\n" -msgstr "G til sagen og skriv meddelelsen ...\n" - -#: g10/gpg.c:4120 -#, fuzzy -msgid "the given certification policy URL is invalid\n" -msgstr "den givne politik-URL er ugyldig\n" - -#: g10/gpg.c:4122 -#, fuzzy -msgid "the given signature policy URL is invalid\n" -msgstr "den givne politik-URL er ugyldig\n" - -#: g10/gpg.c:4155 -#, 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:3707 -#, 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 sekundr ngle %08lX istedetfor primr ngle %08lX\n" - -#: g10/getkey.c:2658 -#, fuzzy, c-format -msgid "key %s: secret key without public key - skipped\n" -msgstr "ngle %08lX: ikke en rfc2440 ngle - udeladt\n" - -#: g10/gpgv.c:74 -msgid "be somewhat more quiet" -msgstr "vr mere stille" - -#: g10/gpgv.c:75 -#, fuzzy -msgid "take the keys from this keyring" -msgstr "Slet denne ngle fra ngleringen? " - -#: 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 hjlp)" - -#: 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 nglens strrelse" - -#: 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 hjlp tilgngelig" - -#: g10/helptext.c:295 -#, c-format -msgid "No help available for `%s'" -msgstr "Ingen hjlp tilgngelig 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 "opdatr 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 "drlig hemmelig ngle" - -#: g10/import.c:108 -msgid "remove as much as possible from key after import" -msgstr "" - -#: g10/import.c:266 -#, c-format -msgid "skipping block of type %d\n" -msgstr "sprang over blok af typen %d\n" - -#: g10/import.c:275 -#, fuzzy, c-format -msgid "%lu keys processed so far\n" -msgstr "%lu ngler behandlet indtil nu\n" - -#: g10/import.c:292 -#, c-format -msgid "Total number processed: %lu\n" -msgstr "Totalt antal behandlede: %lu\n" - -#: g10/import.c:294 -#, fuzzy, c-format -msgid " skipped new keys: %lu\n" -msgstr " nye underngler: %lu\n" - -#: g10/import.c:297 -#, c-format -msgid " w/o user IDs: %lu\n" -msgstr "" - -#: g10/import.c:299 -#, c-format -msgid " imported: %lu" -msgstr " importerede: %lu" - -#: g10/import.c:305 -#, c-format -msgid " unchanged: %lu\n" -msgstr " undrede: %lu\n" - -#: g10/import.c:307 -#, c-format -msgid " new user IDs: %lu\n" -msgstr " nye bruger-id'er: %lu\n" - -#: g10/import.c:309 -#, c-format -msgid " new subkeys: %lu\n" -msgstr " nye underngler: %lu\n" - -#: g10/import.c:311 -#, c-format -msgid " new signatures: %lu\n" -msgstr " nye signaturer: %lu\n" - -#: g10/import.c:313 -#, c-format -msgid " new key revocations: %lu\n" -msgstr " nye ngletilbagekald: %lu\n" - -#: g10/import.c:315 -#, c-format -msgid " secret keys read: %lu\n" -msgstr " hemmelige ngler lst: %lu\n" - -#: g10/import.c:317 -#, c-format -msgid " secret keys imported: %lu\n" -msgstr "hemmelige ngler import: %lu\n" - -#: g10/import.c:319 -#, c-format -msgid " secret keys unchanged: %lu\n" -msgstr "hemmelige ngler undre: %lu\n" - -#: g10/import.c:321 -#, fuzzy, c-format -msgid " not imported: %lu\n" -msgstr " importerede: %lu" - -#: g10/import.c:323 -#, fuzzy, c-format -msgid " signatures cleaned: %lu\n" -msgstr " nye signaturer: %lu\n" - -#: g10/import.c:325 -#, fuzzy, c-format -msgid " user IDs cleaned: %lu\n" -msgstr " hemmelige ngler lst: %lu\n" - -#: g10/import.c:566 -#, 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:570 -#, fuzzy -msgid " algorithms on these user IDs:\n" -msgstr " nye bruger-id'er: %lu\n" - -#: g10/import.c:607 -#, c-format -msgid " \"%s\": preference for cipher algorithm %s\n" -msgstr "" - -#: g10/import.c:619 -#, fuzzy, c-format -msgid " \"%s\": preference for digest algorithm %s\n" -msgstr "%s signatur fra: %s\n" - -#: g10/import.c:631 -#, c-format -msgid " \"%s\": preference for compression algorithm %s\n" -msgstr "" - -#: g10/import.c:644 -msgid "it is strongly suggested that you update your preferences and\n" -msgstr "" - -#: g10/import.c:646 -msgid "re-distribute this key to avoid potential algorithm mismatch problems\n" -msgstr "" - -#: g10/import.c:670 -#, c-format -msgid "you can update your preferences with: gpg --edit-key %s updpref save\n" -msgstr "" - -#: g10/import.c:720 g10/import.c:1118 -#, fuzzy, c-format -msgid "key %s: no user ID\n" -msgstr "ngle %08lX: ingen bruger-id\n" - -#: g10/import.c:749 -#, fuzzy, c-format -msgid "key %s: PKS subkey corruption repaired\n" -msgstr "ngle %08lX: underngle er blevet annulleret!\n" - -#: g10/import.c:764 -#, fuzzy, c-format -msgid "key %s: accepted non self-signed user ID \"%s\"\n" -msgstr "ngle %08lX: ingen gyldige bruger-id'er\n" - -#: g10/import.c:770 -#, fuzzy, c-format -msgid "key %s: no valid user IDs\n" -msgstr "ngle %08lX: ingen gyldige bruger-id'er\n" - -#: g10/import.c:772 -msgid "this may be caused by a missing self-signature\n" -msgstr "" - -#: g10/import.c:782 g10/import.c:1240 -#, fuzzy, c-format -msgid "key %s: public key not found: %s\n" -msgstr "ngle %08lX: offentlig ngle ikke fundet: %s\n" - -#: g10/import.c:788 -#, fuzzy, c-format -msgid "key %s: new key - skipped\n" -msgstr "ngle %08lX: ikke en rfc2440 ngle - udeladt\n" - -#: g10/import.c:797 -#, fuzzy, c-format -msgid "no writable keyring found: %s\n" -msgstr "fejl ved skrivning af nglering `%s': %s\n" - -#: g10/import.c:802 g10/openfile.c:267 g10/sign.c:831 g10/sign.c:1135 -#, c-format -msgid "writing to `%s'\n" -msgstr "skriver til `%s'\n" - -#: g10/import.c:806 g10/import.c:901 g10/import.c:1158 g10/import.c:1301 -#: g10/import.c:2363 g10/import.c:2385 -#, c-format -msgid "error writing keyring `%s': %s\n" -msgstr "fejl ved skrivning af nglering `%s': %s\n" - -#: g10/import.c:825 -#, fuzzy, c-format -msgid "key %s: public key \"%s\" imported\n" -msgstr "ngle %08lX: offentlig ngle importeret\n" - -#: g10/import.c:849 -#, fuzzy, c-format -msgid "key %s: doesn't match our copy\n" -msgstr "ngle %08lX: stemmer ikke med vores kopi\n" - -#: g10/import.c:866 g10/import.c:1258 -#, fuzzy, c-format -msgid "key %s: can't locate original keyblock: %s\n" -msgstr "ngle %08lX: kan ikke lokalisere original ngleblok: %s\n" - -#: g10/import.c:874 g10/import.c:1265 -#, fuzzy, c-format -msgid "key %s: can't read original keyblock: %s\n" -msgstr "ngle %08lX: kan ikke lse original ngleblok: %s\n" - -#: g10/import.c:911 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new user ID\n" -msgstr "ngle %08lX: ingen bruger-id\n" - -#: g10/import.c:914 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new user IDs\n" -msgstr "ngle %08lX: ingen bruger-id\n" - -#: g10/import.c:917 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new signature\n" -msgstr "ngle %08lX: offentlig ngle importeret\n" - -#: g10/import.c:920 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new signatures\n" -msgstr "ngle %08lX: offentlig ngle importeret\n" - -#: g10/import.c:923 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new subkey\n" -msgstr "ngle %08lX: ikke en rfc2440 ngle - udeladt\n" - -#: g10/import.c:926 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new subkeys\n" -msgstr "ngle %08lX: ikke en rfc2440 ngle - udeladt\n" - -#: g10/import.c:929 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signature cleaned\n" -msgstr "ngle %08lX: offentlig ngle importeret\n" - -#: g10/import.c:932 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signatures cleaned\n" -msgstr "ngle %08lX: offentlig ngle importeret\n" - -#: g10/import.c:935 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d user ID cleaned\n" -msgstr "ngle %08lX: ingen bruger-id\n" - -#: g10/import.c:938 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d user IDs cleaned\n" -msgstr "ngle %08lX: ingen bruger-id\n" - -#: g10/import.c:961 -#, fuzzy, c-format -msgid "key %s: \"%s\" not changed\n" -msgstr "ngle %08lX: ingen bruger-id\n" - -#: g10/import.c:1124 -#, fuzzy, c-format -msgid "key %s: secret key with invalid cipher %d - skipped\n" -msgstr "ngle %08lX: ikke en rfc2440 ngle - udeladt\n" - -#: g10/import.c:1135 -#, fuzzy -msgid "importing secret keys not allowed\n" -msgstr "skriver hemmeligt certifikat til '%s'\n" - -#: g10/import.c:1152 g10/import.c:2378 -#, fuzzy, c-format -msgid "no default secret keyring: %s\n" -msgstr "ingen standard offentlig nglering\n" - -#: g10/import.c:1163 -#, fuzzy, c-format -msgid "key %s: secret key imported\n" -msgstr "hemmelige ngler import: %lu\n" - -#: g10/import.c:1193 -#, fuzzy, c-format -msgid "key %s: already in secret keyring\n" -msgstr "fjern ngle fra den hemmelige nglering" - -#: g10/import.c:1203 -#, fuzzy, c-format -msgid "key %s: secret key not found: %s\n" -msgstr "%s: bruger ikke fundet: %s\n" - -#: g10/import.c:1233 -#, fuzzy, c-format -msgid "key %s: no public key - can't apply revocation certificate\n" -msgstr "Generr en annullrbar certifikat" - -#: g10/import.c:1276 -#, fuzzy, c-format -msgid "key %s: invalid revocation certificate: %s - rejected\n" -msgstr "Generr en annullrbar certifikat" - -#: g10/import.c:1308 -#, fuzzy, c-format -msgid "key %s: \"%s\" revocation certificate imported\n" -msgstr "Generr en annullrbar certifikat" - -#: g10/import.c:1374 -#, fuzzy, c-format -msgid "key %s: no user ID for signature\n" -msgstr "ngle %08lX: ingen bruger-id\n" - -#: g10/import.c:1389 -#, fuzzy, c-format -msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n" -msgstr "ngle %08lX: offentlig ngle ikke fundet: %s\n" - -#: g10/import.c:1391 -#, fuzzy, c-format -msgid "key %s: invalid self-signature on user ID \"%s\"\n" -msgstr "ngle %08lX: ingen gyldige bruger-id'er\n" - -#: g10/import.c:1409 -#, fuzzy, c-format -msgid "key %s: no subkey for key binding\n" -msgstr "ngle %08lX: underngle er blevet annulleret!\n" - -#: g10/import.c:1420 g10/import.c:1470 -#, fuzzy, c-format -msgid "key %s: unsupported public key algorithm\n" -msgstr "ngle %08lX: offentlig ngle ikke fundet: %s\n" - -#: g10/import.c:1422 -#, fuzzy, c-format -msgid "key %s: invalid subkey binding\n" -msgstr "ngle %08lX: ingen gyldige bruger-id'er\n" - -#: g10/import.c:1437 -#, fuzzy, c-format -msgid "key %s: removed multiple subkey binding\n" -msgstr "ngle %08lX: underngle er blevet annulleret!\n" - -#: g10/import.c:1459 -#, fuzzy, c-format -msgid "key %s: no subkey for key revocation\n" -msgstr "ngle %08lX: underngle er blevet annulleret!\n" - -#: g10/import.c:1472 -#, fuzzy, c-format -msgid "key %s: invalid subkey revocation\n" -msgstr "ngle %08lX: ingen gyldige bruger-id'er\n" - -#: g10/import.c:1487 -#, fuzzy, c-format -msgid "key %s: removed multiple subkey revocation\n" -msgstr "ngle %08lX: ingen gyldige bruger-id'er\n" - -#: g10/import.c:1529 -#, fuzzy, c-format -msgid "key %s: skipped user ID \"%s\"\n" -msgstr "%s: udelod: %s\n" - -#: g10/import.c:1550 -#, fuzzy, c-format -msgid "key %s: skipped subkey\n" -msgstr "%s: udelod: %s\n" - -#: g10/import.c:1577 -#, fuzzy, c-format -msgid "key %s: non exportable signature (class 0x%02X) - skipped\n" -msgstr "ngle %08lX: ikke en rfc2440 ngle - udeladt\n" - -#: g10/import.c:1587 -#, fuzzy, c-format -msgid "key %s: revocation certificate at wrong place - skipped\n" -msgstr "ngle %08lX: ikke en rfc2440 ngle - udeladt\n" - -#: g10/import.c:1604 -#, fuzzy, c-format -msgid "key %s: invalid revocation certificate: %s - skipped\n" -msgstr "Generr en annullrbar certifikat" - -#: g10/import.c:1618 -#, fuzzy, c-format -msgid "key %s: subkey signature in wrong place - skipped\n" -msgstr "ngle %08lX: ikke en rfc2440 ngle - udeladt\n" - -#: g10/import.c:1626 -#, fuzzy, c-format -msgid "key %s: unexpected signature class (0x%02X) - skipped\n" -msgstr "ngle %08lX: ikke en rfc2440 ngle - udeladt\n" - -#: g10/import.c:1726 -#, c-format -msgid "key %s: duplicated user ID detected - merged\n" -msgstr "" - -#: g10/import.c:1788 -#, fuzzy, c-format -msgid "WARNING: key %s may be revoked: fetching revocation key %s\n" -msgstr "ADVARSEL: Denne ngle er blevet annulleret af dets ejer!\n" - -#: g10/import.c:1802 -#, fuzzy, c-format -msgid "WARNING: key %s may be revoked: revocation key %s not present.\n" -msgstr "ADVARSEL: Denne ngle er blevet annulleret af dets ejer!\n" - -#: g10/import.c:1861 -#, fuzzy, c-format -msgid "key %s: \"%s\" revocation certificate added\n" -msgstr "ngle %08lX: offentlig ngle importeret\n" - -#: g10/import.c:1895 -#, fuzzy, c-format -msgid "key %s: direct key signature added\n" -msgstr "ngle %08lX: offentlig ngle importeret\n" - -#: g10/import.c:2284 -msgid "NOTE: a key's S/N does not match the card's one\n" -msgstr "" - -#: g10/import.c:2292 -#, fuzzy -msgid "NOTE: primary key is online and stored on card\n" -msgstr "udelod: hemmelig ngle er allerede tilstede\n" - -#: g10/import.c:2294 -#, fuzzy -msgid "NOTE: secondary key is online and stored on card\n" -msgstr "udelod: hemmelig ngle er allerede tilstede\n" - -#: g10/keydb.c:168 -#, fuzzy, c-format -msgid "error creating keyring `%s': %s\n" -msgstr "fejl ved skrivning af nglering `%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 lsning af '%s': %s\n" - -#: g10/keydb.c:698 -#, fuzzy, c-format -msgid "failed to rebuild keyring cache: %s\n" -msgstr "ingen standard offentlig nglering\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 drlig signature\n" - -#: g10/keyedit.c:347 g10/keylist.c:392 -#, c-format -msgid "%d bad signatures\n" -msgstr "%d drlige 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 (kryptr kun)\n" - -#: g10/keyedit.c:420 g10/pkclist.c:277 -#, fuzzy, c-format -msgid " %d = I trust fully\n" -msgstr " (%d) ElGamal (kryptr 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 "Nglen 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 nglestrrelse? " - -#: 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 "Nglen 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 nglestrrelse? " - -#: 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 "Bemrk: Denne ngle er forldet!\n" - -#: g10/keyedit.c:843 -#, fuzzy, c-format -msgid "This key is due to expire on %s.\n" -msgstr "Denne ngle 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 nglestrrelse? " - -#: 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 "signr nglen 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:4783 g10/keyedit.c:4874 g10/keyedit.c:4938 -#: g10/keyedit.c:4999 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 ngle 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 ngle ikke tilgngelig" - -#: g10/keyedit.c:1151 g10/keygen.c:3202 -#, fuzzy -msgid "Secret parts of primary key are stored on-card.\n" -msgstr "hemmelig ngle ikke tilgngelig" - -#: g10/keyedit.c:1155 g10/keygen.c:3206 -msgid "Key is protected.\n" -msgstr "Nglen er beskyttet.\n" - -#: g10/keyedit.c:1179 -#, c-format -msgid "Can't edit this key: %s\n" -msgstr "Kan ikke redigere denne ngle: %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 "kodestningen blev ikke ordentlig gentaget; prv 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 gre 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 ngler og bruger-id'er" - -#: g10/keyedit.c:1365 -msgid "select user ID N" -msgstr "" - -#: g10/keyedit.c:1366 -#, fuzzy -msgid "select subkey N" -msgstr "vlg sekundr ngle 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 "signr nglen 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 "tilfj bruger-id" - -#: g10/keyedit.c:1387 -#, fuzzy -msgid "add a photo ID" -msgstr "tilfj 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 "tilfj ngle" - -#: 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 sekundr ngle" - -#: g10/keyedit.c:1408 -#, fuzzy -msgid "add a revocation key" -msgstr "tilfj sekundr ngle" - -#: g10/keyedit.c:1410 -#, fuzzy -msgid "delete signatures from the selected user IDs" -msgstr "Generr en annullrbar 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 ngle visning" - -#: g10/keyedit.c:1419 -#, fuzzy -msgid "list preferences (expert)" -msgstr "vis prferencer" - -#: g10/keyedit.c:1421 -#, fuzzy -msgid "list preferences (verbose)" -msgstr "vis prferencer" - -#: g10/keyedit.c:1423 -#, fuzzy -msgid "set preference list for the selected user IDs" -msgstr "Generr en annullrbar certifikat" - -#: g10/keyedit.c:1428 -#, fuzzy -msgid "set the preferred keyserver URL for the selected user IDs" -msgstr "Generr en annullrbar certifikat" - -#: g10/keyedit.c:1430 -#, fuzzy -msgid "set a notation for the selected user IDs" -msgstr "Generr en annullrbar certifikat" - -#: g10/keyedit.c:1432 -msgid "change the passphrase" -msgstr "ndr kodestningen" - -#: 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 "tilfj bruger-id" - -#: g10/keyedit.c:1445 -msgid "revoke key or selected subkeys" -msgstr "" - -#: g10/keyedit.c:1446 -#, fuzzy -msgid "enable key" -msgstr "sl ngle til" - -#: g10/keyedit.c:1447 -#, fuzzy -msgid "disable key" -msgstr "sl ngle 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 lsning 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 "Nglen 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 "signr nglen 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 "Vlg venligst hvilken slags ngle 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 nglering `%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 krypteringsngle? " - -#: g10/keyedit.c:1970 -#, fuzzy -msgid "Do you really want to delete this key? (y/N) " -msgstr "Vil du virkelig gerne gre 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 gre 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 krypteringsngle? " - -#: g10/keyedit.c:2037 -#, fuzzy -msgid "Do you really want to revoke this subkey? (y/N) " -msgstr "Vil du virkelig gerne gre 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 prferencer" - -#: g10/keyedit.c:2135 -#, fuzzy -msgid "Really update the preferences for the selected user IDs? (y/N) " -msgstr "Generr en annullrbar certifikat" - -#: g10/keyedit.c:2137 -#, fuzzy -msgid "Really update the preferences? (y/N) " -msgstr "Generr en annullrbar 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 ngle 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 ngle 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 "tilfj ngle" - -#: g10/keyedit.c:2737 g10/keylist.c:742 g10/keylist.c:777 g10/keylist.c:871 -#, fuzzy, c-format -msgid "expired: %s" -msgstr "Ngle udlber 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 "Ngle udlber 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 "tilfj ngle" - -#: 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 "udlb" - -#: 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:3346 -#, fuzzy -msgid "Are you sure you still want to add it? (y/N) " -msgstr "Er du sikker p at de vil benytte denne nglestrrelse? " - -#: 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:3249 -#, fuzzy, c-format -msgid "User ID \"%s\": already clean\n" -msgstr "Nglen er beskyttet.\n" - -#: g10/keyedit.c:3341 -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:3352 -msgid "You may not add a designated revoker to a PGP 2.x-style key.\n" -msgstr "" - -#: g10/keyedit.c:3372 -#, fuzzy -msgid "Enter the user ID of the designated revoker: " -msgstr "Indtast nglens strrelse" - -#: g10/keyedit.c:3397 -msgid "cannot appoint a PGP 2.x style key as a designated revoker\n" -msgstr "" - -#: g10/keyedit.c:3412 -msgid "you cannot appoint a key as its own designated revoker\n" -msgstr "" - -#: g10/keyedit.c:3434 -#, fuzzy -msgid "this key has already been designated as a revoker\n" -msgstr "ADVARSEL: Denne ngle er blevet annulleret af dets ejer!\n" - -#: g10/keyedit.c:3453 -msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n" -msgstr "" - -#: g10/keyedit.c:3459 -#, 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 nglestrrelse? " - -#: g10/keyedit.c:3520 -msgid "Please remove selections from the secret keys.\n" -msgstr "" - -#: g10/keyedit.c:3526 -#, fuzzy -msgid "Please select at most one subkey.\n" -msgstr "Vlg venligst hvilken slags ngle du vil have:\n" - -#: g10/keyedit.c:3530 -msgid "Changing expiration time for a subkey.\n" -msgstr "" - -#: g10/keyedit.c:3533 -msgid "Changing expiration time for the primary key.\n" -msgstr "" - -#: g10/keyedit.c:3579 -msgid "You can't change the expiration date of a v3 key\n" -msgstr "" - -#: g10/keyedit.c:3595 -msgid "No corresponding signature in secret ring\n" -msgstr "" - -#: g10/keyedit.c:3668 -#, fuzzy, c-format -msgid "signing subkey %s is already cross-certified\n" -msgstr "Nglen er beskyttet.\n" - -#: g10/keyedit.c:3674 -#, c-format -msgid "subkey %s does not sign and so does not need to be cross-certified\n" -msgstr "" - -#: g10/keyedit.c:3836 -#, fuzzy -msgid "Please select exactly one user ID.\n" -msgstr "Vlg venligst hvilken slags ngle du vil have:\n" - -#: g10/keyedit.c:3875 g10/keyedit.c:3985 g10/keyedit.c:4105 g10/keyedit.c:4246 -#, fuzzy, c-format -msgid "skipping v3 self-signature on user ID \"%s\"\n" -msgstr "ngle %08lX: ingen gyldige bruger-id'er\n" - -#: g10/keyedit.c:4046 -msgid "Enter your preferred keyserver URL: " -msgstr "" - -#: g10/keyedit.c:4126 -#, fuzzy -msgid "Are you sure you want to replace it? (y/N) " -msgstr "Er du sikker p at de vil benytte denne nglestrrelse? " - -#: g10/keyedit.c:4127 -#, fuzzy -msgid "Are you sure you want to delete it? (y/N) " -msgstr "Er du sikker p at de vil benytte denne nglestrrelse? " - -#: g10/keyedit.c:4189 -msgid "Enter the notation: " -msgstr "" - -#: g10/keyedit.c:4338 -#, fuzzy -msgid "Proceed? (y/N) " -msgstr "Overskriv (j/N)? " - -#: g10/keyedit.c:4402 -#, c-format -msgid "No user ID with index %d\n" -msgstr "Ingen bruger-id med indeks %d\n" - -#: g10/keyedit.c:4460 -#, fuzzy, c-format -msgid "No user ID with hash %s\n" -msgstr "Ingen bruger-id med indeks %d\n" - -#: g10/keyedit.c:4487 -#, fuzzy, c-format -msgid "No subkey with index %d\n" -msgstr "Ingen bruger-id med indeks %d\n" - -#: g10/keyedit.c:4622 -#, fuzzy, c-format -msgid "user ID: \"%s\"\n" -msgstr "bruger-id: \"" - -#: g10/keyedit.c:4625 g10/keyedit.c:4689 g10/keyedit.c:4732 -#, c-format -msgid "signed by your key %s on %s%s%s\n" -msgstr "" - -#: g10/keyedit.c:4627 g10/keyedit.c:4691 g10/keyedit.c:4734 -msgid " (non-exportable)" -msgstr "" - -#: g10/keyedit.c:4631 -#, fuzzy, c-format -msgid "This signature expired on %s.\n" -msgstr "Denne ngle er ikke beskyttet.\n" - -#: g10/keyedit.c:4635 -#, fuzzy -msgid "Are you sure you still want to revoke it? (y/N) " -msgstr "Er du sikker p at de vil benytte denne nglestrrelse? " - -#: g10/keyedit.c:4639 -#, fuzzy -msgid "Create a revocation certificate for this signature? (y/N) " -msgstr "Generr en annullrbar certifikat" - -#: g10/keyedit.c:4666 -#, c-format -msgid "You have signed these user IDs on key %s:\n" -msgstr "" - -#: g10/keyedit.c:4692 -#, fuzzy -msgid " (non-revocable)" -msgstr "signr en ngle lokalt" - -#: g10/keyedit.c:4699 -#, fuzzy, c-format -msgid "revoked by your key %s on %s\n" -msgstr "ADVARSEL: Denne ngle er blevet annulleret af dets ejer!\n" - -#: g10/keyedit.c:4721 -msgid "You are about to revoke these signatures:\n" -msgstr "" - -#: g10/keyedit.c:4741 -#, fuzzy -msgid "Really create the revocation certificates? (y/N) " -msgstr "Generr en annullrbar certifikat" - -#: g10/keyedit.c:4771 -msgid "no secret key\n" -msgstr "" - -#: g10/keyedit.c:4841 -#, fuzzy, c-format -msgid "user ID \"%s\" is already revoked\n" -msgstr "Nglen er beskyttet.\n" - -#: g10/keyedit.c:4858 -#, c-format -msgid "WARNING: a user ID signature is dated %d seconds in the future\n" -msgstr "" - -#: g10/keyedit.c:4922 -#, fuzzy, c-format -msgid "Key %s is already revoked.\n" -msgstr "Nglen er beskyttet.\n" - -#: g10/keyedit.c:4984 -#, fuzzy, c-format -msgid "Subkey %s is already revoked.\n" -msgstr "Nglen er beskyttet.\n" - -#: g10/keyedit.c:5079 -#, 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 prferencer" - -#: g10/keygen.c:269 -#, fuzzy -msgid "too many cipher preferences\n" -msgstr "vis prferencer" - -#: g10/keygen.c:271 -#, fuzzy -msgid "too many digest preferences\n" -msgstr "vis prferencer" - -#: g10/keygen.c:273 -#, fuzzy -msgid "too many compression preferences\n" -msgstr "vis prferencer" - -#: 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 nglestrrelse 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 "signr" - -#: g10/keygen.c:1326 -msgid "Certify" -msgstr "" - -#: g10/keygen.c:1329 -#, fuzzy -msgid "Encrypt" -msgstr "kryptr 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 (kryptr 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 "Vlg venligst hvilken slags ngle 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 (signr kun)\n" - -#: g10/keygen.c:1438 -#, fuzzy, c-format -msgid " (%d) DSA (set your own capabilities)\n" -msgstr " (%d) ElGamal (kryptr kun)\n" - -#: g10/keygen.c:1440 -#, fuzzy, c-format -msgid " (%d) Elgamal (encrypt only)\n" -msgstr " (%d) ElGamal (kryptr kun)\n" - -#: g10/keygen.c:1441 -#, fuzzy, c-format -msgid " (%d) RSA (sign only)\n" -msgstr " (%d) DSA (signr kun)\n" - -#: g10/keygen.c:1443 -#, fuzzy, c-format -msgid " (%d) RSA (encrypt only)\n" -msgstr " (%d) ElGamal (kryptr kun)\n" - -#: g10/keygen.c:1445 -#, fuzzy, c-format -msgid " (%d) RSA (set your own capabilities)\n" -msgstr " (%d) ElGamal (kryptr kun)\n" - -#: g10/keygen.c:1514 -#, fuzzy, c-format -msgid "DSA keypair will have %u bits.\n" -msgstr "DSA nglepar 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 nglestrrelse 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 nglestrrelse 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 "Ngle er gyldig for? (0) " - -#: g10/keygen.c:1649 -#, fuzzy, c-format -msgid "Signature is valid for? (%s) " -msgstr "Ngle er gyldig for? (0) " - -#: g10/keygen.c:1667 -msgid "invalid value\n" -msgstr "ugyldig vrdi\n" - -#: g10/keygen.c:1674 -#, fuzzy -msgid "Key does not expire at all\n" -msgstr "Nglen udlber aldrig\n" - -#: g10/keygen.c:1675 -#, fuzzy -msgid "Signature does not expire at all\n" -msgstr "Nglen udlber aldrig\n" - -#: g10/keygen.c:1680 -#, fuzzy, c-format -msgid "Key expires at %s\n" -msgstr "Ngle udlber d. %s\n" - -#: g10/keygen.c:1681 -#, fuzzy, c-format -msgid "Signature expires at %s\n" -msgstr "Denne ngle 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 vre 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' tegnsttet.\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 kodestning til at beskytte din hemmelige ngle.\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 "Ngleoprettelse 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 "ngle %08lX: offentlig ngle 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 nglering `%s': %s\n" - -#: g10/keygen.c:3072 -#, fuzzy, c-format -msgid "error writing secret keyring `%s': %s\n" -msgstr "fejl ved skrivning af nglering `%s': %s\n" - -#: g10/keygen.c:3095 -msgid "public and secret key created and signed.\n" -msgstr "offentlig og hemmelig ngle 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 ngler 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 ngle 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 "pkldning 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 nglering `%s': %s\n" - -#: g10/keyring.c:1422 -#, fuzzy, c-format -msgid "%lu keys cached so far (%lu signatures)\n" -msgstr "vis ngler og signaturer" - -#: g10/keyring.c:1434 -#, fuzzy, c-format -msgid "%lu keys cached (%lu signatures)\n" -msgstr "vis ngler 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 "slfra" - -#: g10/keyserver.c:724 -msgid "Enter number(s), N)ext, or Q)uit > " -msgstr "" - -#: g10/keyserver.c:808 g10/keyserver.c:1421 -#, fuzzy, c-format -msgid "invalid keyserver protocol (us %d!=handler %d)\n" -msgstr "ugyldig nglering" - -#: 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 "importr ngler fra en ngleserver: %s\n" - -#: g10/keyserver.c:1149 -#, fuzzy, c-format -msgid "requesting key %s from %s\n" -msgstr "importr ngler fra en ngleserver: %s\n" - -#: g10/keyserver.c:1173 -#, fuzzy, c-format -msgid "searching for names from %s server %s\n" -msgstr "eksportr ngler til en ngletjener" - -#: g10/keyserver.c:1176 -#, fuzzy, c-format -msgid "searching for names from %s\n" -msgstr "lser indstillinger fra `%s'\n" - -#: g10/keyserver.c:1324 -#, c-format -msgid "sending key %s to %s server %s\n" -msgstr "" - -#: g10/keyserver.c:1328 -#, fuzzy, c-format -msgid "sending key %s to %s\n" -msgstr "importr ngler fra en ngleserver: %s\n" - -#: g10/keyserver.c:1371 -#, fuzzy, c-format -msgid "searching for \"%s\" from %s server %s\n" -msgstr "eksportr ngler til en ngletjener" - -#: g10/keyserver.c:1374 -#, fuzzy, c-format -msgid "searching for \"%s\" from %s\n" -msgstr "lser indstillinger fra `%s'\n" - -#: g10/keyserver.c:1381 g10/keyserver.c:1477 -#, fuzzy -msgid "no keyserver action!\n" -msgstr "ugyldig nglering" - -#: g10/keyserver.c:1429 -#, c-format -msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n" -msgstr "" - -#: g10/keyserver.c:1438 -msgid "keyserver did not send VERSION\n" -msgstr "" - -#: g10/keyserver.c:1500 g10/keyserver.c:2028 -msgid "no keyserver known (use option --keyserver)\n" -msgstr "" - -#: g10/keyserver.c:1506 -msgid "external keyserver calls are not supported in this build\n" -msgstr "" - -#: g10/keyserver.c:1518 -#, c-format -msgid "no handler for keyserver scheme `%s'\n" -msgstr "" - -#: g10/keyserver.c:1523 -#, c-format -msgid "action `%s' not supported with keyserver scheme `%s'\n" -msgstr "" - -#: g10/keyserver.c:1531 -#, c-format -msgid "%s does not support handler version %d\n" -msgstr "" - -#: g10/keyserver.c:1538 -#, fuzzy -msgid "keyserver timed out\n" -msgstr "generel fejl" - -#: g10/keyserver.c:1543 -#, fuzzy -msgid "keyserver internal error\n" -msgstr "generel fejl" - -#: g10/keyserver.c:1552 -#, fuzzy, c-format -msgid "keyserver communications error: %s\n" -msgstr "pkldning af beskyttelse fejlede: %s\n" - -#: g10/keyserver.c:1577 g10/keyserver.c:1611 -#, fuzzy, c-format -msgid "\"%s\" not a key ID: skipping\n" -msgstr "%s er ikke et gyldigt tegnst\n" - -#: g10/keyserver.c:1870 -#, c-format -msgid "WARNING: unable to refresh key %s via %s: %s\n" -msgstr "" - -#: g10/keyserver.c:1892 -#, fuzzy, c-format -msgid "refreshing 1 key from %s\n" -msgstr "importr ngler fra en ngleserver: %s\n" - -#: g10/keyserver.c:1894 -#, fuzzy, c-format -msgid "refreshing %d keys from %s\n" -msgstr "importr ngler fra en ngleserver: %s\n" - -#: g10/keyserver.c:1950 -#, fuzzy, c-format -msgid "WARNING: unable to fetch URI %s: %s\n" -msgstr "kan ikke bne %s: %s\n" - -#: g10/keyserver.c:1956 -#, 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 ngle er slet 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 kodestning: " - -#: 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 kodestning: " - -#: 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 kodestning: " - -#: g10/mainproc.c:510 -#, fuzzy -msgid "encrypted with 1 passphrase\n" -msgstr "Gentag kodestning: " - -#: g10/mainproc.c:541 g10/mainproc.c:563 -#, fuzzy, c-format -msgid "assuming %s encrypted data\n" -msgstr "kryptr 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 ngle 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 hjlp tilgngelig" - -#: g10/mainproc.c:1677 g10/mainproc.c:1725 -#, fuzzy, c-format -msgid "BAD signature from \"%s\"" -msgstr "DRLIG 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 ngle er ikke beskyttet.\n" - -#: g10/mainproc.c:1868 -#, fuzzy, c-format -msgid "Signature expires %s\n" -msgstr "Denne ngle 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 "ngle %08lX: offentlig ngle 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 ngletilbagekald\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 "lser 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:305 -#, c-format -msgid "assuming signed data in `%s'\n" -msgstr "" - -#: g10/openfile.c:384 -#, c-format -msgid "new configuration file `%s' created\n" -msgstr "" - -#: g10/openfile.c:386 -#, c-format -msgid "WARNING: options in `%s' are not yet active during this run\n" -msgstr "" - -#: g10/openfile.c:418 -#, 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:1157 -#, 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 " (hovedngle-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 kodestning: " - -#: g10/passphrase.c:573 -#, fuzzy -msgid "Enter passphrase\n" -msgstr "Indtast kodestning: " - -#: g10/passphrase.c:649 -msgid "cancelled by user\n" -msgstr "" - -#: g10/passphrase.c:805 g10/passphrase.c:968 -msgid "can't query passphrase in batch mode\n" -msgstr "" - -#: g10/passphrase.c:812 g10/passphrase.c:973 -msgid "Enter passphrase: " -msgstr "Indtast kodestning: " - -#: 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 kodestning til at beskytte din hemmelige ngle.\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:977 -msgid "Repeat passphrase: " -msgstr "Gentag kodestning: " - -#: 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 nglestrrelse? " - -#: g10/photoid.c:146 -#, fuzzy, c-format -msgid "`%s' is not a JPEG file\n" -msgstr "%s er ikke et gyldigt tegnst\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 "Nglen 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 ngletilbagekald\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 tillidsvrdi 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 ngle tilhrer 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 ngle\n" - -#: g10/pkclist.c:279 -#, fuzzy, c-format -msgid " %d = I trust ultimately\n" -msgstr " (%d) ElGamal (kryptr 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 gre 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 tilhrer 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 tilhrer ejeren.\n" - -#: g10/pkclist.c:430 -#, fuzzy -msgid "This key probably belongs to the named user\n" -msgstr "Denne ngle tilhrer sikkert ejeren\n" - -#: g10/pkclist.c:435 -msgid "This key belongs to us\n" -msgstr "Denne ngle tilhrer 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 ngle alligevel? " - -#: g10/pkclist.c:502 -msgid "WARNING: Using untrusted key!\n" -msgstr "ADVARSEL: Bruger ngle uden tillid!\n" - -#: g10/pkclist.c:509 -#, fuzzy -msgid "WARNING: this key might be revoked (revocation key not present)\n" -msgstr "ADVARSEL: Denne ngle 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 ngle 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 ngle 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 underngle er blevet tilbagekaldt af dens ejer!\n" - -#: g10/pkclist.c:533 -#, fuzzy -msgid "Note: This key has been disabled.\n" -msgstr "Bemrk: Denne ngle er forldet!\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 "Bemrk: Denne ngle er forldet!\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 tilhrer ejeren.\n" - -#: g10/pkclist.c:612 -msgid "WARNING: We do NOT trust this key!\n" -msgstr "ADVARSEL: Vi tror IKKE p denne ngle!\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 tilhrer 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 ngle 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 sdan bruger-id.\n" - -#: g10/pkclist.c:969 g10/pkclist.c:1043 -msgid "skipped: public key already set as default recipient\n" -msgstr "udeladt: offentlig ngle er allerede valgt som standard modtager\n" - -#: g10/pkclist.c:990 -msgid "Public key is disabled.\n" -msgstr "Offentlig ngle er slet fra.\n" - -#: g10/pkclist.c:999 -#, fuzzy -msgid "skipped: public key already set\n" -msgstr "%s: udelod: offentlig ngle 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: offentligngle er slet 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 lsning 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 "lser 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 ngler import: %lu\n" - -#: g10/pubkey-enc.c:308 -#, fuzzy -msgid "NOTE: key has been revoked" -msgstr "ngle %08lX: ngle 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 "ngle %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 "Generr en annullrbar 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 "ngle %08lX: offentlig ngle 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 "Generr en annullrbar 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 ngle 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 ngletilbagekald\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 ngletilbagekald\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 ngle alligevel? " - -#: g10/seckey-cert.c:55 -#, fuzzy -msgid "secret key parts are not available\n" -msgstr "hemmelig ngle ikke tilgngelig" - -#: 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 kodestning" - -#: 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 "ngle %08lX: offentlig ngle importeret\n" - -#: g10/sig-check.c:182 -#, fuzzy, c-format -msgid "public key %s is %lu seconds newer than the signature\n" -msgstr "ngle %08lX: offentlig ngle 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 ngle 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 "ngle %08lX: underngle er blevet annulleret!\n" - -#: g10/sig-check.c:570 -#, fuzzy, c-format -msgid "key %s: no subkey for subkey binding signature\n" -msgstr "ngle %08lX: underngle 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:127 g10/skclist.c:191 -msgid "key is not flagged as insecure - can't use it with the faked RNG!\n" -msgstr "" - -#: g10/skclist.c:158 -#, fuzzy, c-format -msgid "skipped \"%s\": duplicated\n" -msgstr "vis prferencer" - -#: g10/skclist.c:166 g10/skclist.c:176 g10/skclist.c:185 -#, fuzzy, c-format -msgid "skipped \"%s\": %s\n" -msgstr "%s: udelod: %s\n" - -#: g10/skclist.c:171 -#, fuzzy -msgid "skipped: secret key already present\n" -msgstr "udelod: hemmelig ngle er allerede tilstede\n" - -#: g10/skclist.c:186 -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 lsning 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 "importr ejertillidsvrdierne" - -#: g10/tdbdump.c:215 -#, fuzzy, c-format -msgid "error finding trust record in `%s': %s\n" -msgstr "fejl ved lsning 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 tegnst\n" - -#: g10/trustdb.c:258 -#, fuzzy, c-format -msgid "key %s: accepted as trusted key\n" -msgstr "ngle %08lX: ikke en rfc2440 ngle - 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 "ngle %08lX: ikke en rfc2440 ngle - udeladt\n" - -#: g10/trustdb.c:321 -#, fuzzy, c-format -msgid "key %s marked as ultimately trusted\n" -msgstr "ngle %08lX: ikke en rfc2440 ngle - 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 "tilfj ngle" - -#: g10/trustdb.c:509 g10/trustdb.c:514 -#, fuzzy -msgid "[ expired]" -msgstr "udlb" - -#: 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 ngle 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 nglealgoritme" - -#: util/errors.c:59 -msgid "unknown digest algorithm" -msgstr "ukendt sammenfatningsalgoritme" - -#: util/errors.c:60 -msgid "bad public key" -msgstr "drlig offentlig ngle" - -#: util/errors.c:61 -msgid "bad secret key" -msgstr "drlig hemmelig ngle" - -#: util/errors.c:62 -msgid "bad signature" -msgstr "drlig signatur" - -#: util/errors.c:63 -msgid "checksum error" -msgstr "tjeksumsfejl" - -#: util/errors.c:64 -msgid "bad passphrase" -msgstr "drlig kodestning" - -#: util/errors.c:65 -msgid "public key not found" -msgstr "offentlig ngle 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 ngleringen" - -#: 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 ngle ikke tilgngelig" - -#: util/errors.c:72 -msgid "wrong secret key used" -msgstr "forkert hemmelig ngle brugt" - -#: util/errors.c:73 -msgid "not supported" -msgstr "ikke understttet" - -#: util/errors.c:74 -msgid "bad key" -msgstr "drlig ngle" - -#: util/errors.c:75 -msgid "file read error" -msgstr "fillsningsfejl" - -#: 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 "filbningsfejl" - -#: util/errors.c:79 -msgid "file create error" -msgstr "filoprettelsesfejl" - -#: util/errors.c:80 -msgid "invalid passphrase" -msgstr "ugyldig kodestning" - -#: util/errors.c:81 -msgid "unimplemented pubkey algorithm" -msgstr "uimplementeret offentlig nglealgoritme" - -#: 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 "drlig mpi" - -#: util/errors.c:86 -msgid "resource limit" -msgstr "resursegrnse" - -#: util/errors.c:87 -msgid "invalid keyring" -msgstr "ugyldig nglering" - -#: util/errors.c:88 -msgid "bad certificate" -msgstr "ugyldigt certifikat" - -#: util/errors.c:89 -msgid "malformed user id" -msgstr "drlig bruger-id" - -#: util/errors.c:90 -msgid "file close error" -msgstr "fillukningsfejl" - -#: util/errors.c:91 -msgid "file rename error" -msgstr "filomdbningsfejl" - -#: 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 nglealgoritme" - -#: util/errors.c:96 -msgid "file exists" -msgstr "fil eksisterer" - -#: util/errors.c:97 -msgid "weak key" -msgstr "svag ngle" - -#: 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-understttet URI" - -#: util/errors.c:101 -msgid "network error" -msgstr "netvrksfejl" - -#: 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 "drlig offentlig ngle" - -#: util/errors.c:107 -#, fuzzy -msgid "unusable secret key" -msgstr "drlig hemmelig ngle" - -#: 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 "kryptr 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:350 -msgid "operation is not possible without initialized secure memory\n" -msgstr "operation er ikke mulig uden beskyttet hukommelse indlst\n" - -#: util/secmem.c:351 -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 notationsvrdi m ikke bruge nogen kontroltegn\n" - -#, fuzzy -#~ msgid "a notation name must not contain more than one '@' character\n" -#~ msgstr "en notationsvrdi m ikke bruge nogen kontroltegn\n" - -#~ msgid "a notation value must not use any control characters\n" -#~ msgstr "en notationsvrdi m ikke bruge nogen kontroltegn\n" - -#, fuzzy -#~ msgid "all export-clean-* options from above" -#~ msgstr "ls indstillinger fra fil" - -#, fuzzy -#~ msgid "all import-clean-* options from above" -#~ msgstr "ls indstillinger fra fil" - -#, fuzzy -#~ msgid "expired: %s)" -#~ msgstr "Ngle udlber d. %s\n" - -#, fuzzy -#~ msgid "key %s: expired signature from key %s - skipped\n" -#~ msgstr "ngle %08lX: ikke en rfc2440 ngle - udeladt\n" - -#, fuzzy -#~ msgid "Unable to clean `%s'\n" -#~ msgstr "kan ikke bne %s: %s\n" - -#, fuzzy -#~ msgid "User ID \"%s\": %d signature removed.\n" -#~ msgstr "Nglen er beskyttet.\n" - -#, fuzzy -#~ msgid "User ID \"%s\": %d signatures removed.\n" -#~ msgstr "Nglen er beskyttet.\n" - -#, fuzzy -#~ msgid "User ID \"%s\" removed: %s\n" -#~ msgstr "Nglen er beskyttet.\n" - -#, fuzzy -#~ msgid "No user IDs are removable.\n" -#~ msgstr "Ingen bruger-ID for ngle\n" - -#, fuzzy -#~ msgid "error getting serial number: %s\n" -#~ msgstr "fejl ved oprettelse af kodestning: %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 "signr nglen" - -#~ msgid "add a secondary key" -#~ msgstr "tilfj sekundr ngle" - -#~ msgid "delete signatures" -#~ msgstr "slet signaturer" - -#~ msgid "change the expire date" -#~ msgstr "ndr udlbsdatoen" - -#, fuzzy -#~ msgid "set preference list" -#~ msgstr "vis prferencer" - -#, fuzzy -#~ msgid "updated preferences" -#~ msgstr "vis prferencer" - -#~ msgid "No secondary key with index %d\n" -#~ msgstr "Ingen sekundr ngle 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 "signr nglen lokalt" - -#, fuzzy -#~ msgid "sign the key locally and non-revocably" -#~ msgstr "signr nglen lokalt" - -#~ msgid "q" -#~ msgstr "a" - -#~ msgid "help" -#~ msgstr "hjlp" - -#~ msgid "list" -#~ msgstr "vis" - -#~ msgid "l" -#~ msgstr "l" - -#~ msgid "debug" -#~ msgstr "aflus" - -#, fuzzy -#~ msgid "name" -#~ msgstr "sltil" - -#, fuzzy -#~ msgid "login" -#~ msgstr "lsignr" - -#, 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 "ngle" - -#~ msgid "check" -#~ msgstr "tjek" - -#~ msgid "c" -#~ msgstr "c" - -#~ msgid "sign" -#~ msgstr "signr" - -#~ msgid "s" -#~ msgstr "s" - -#, fuzzy -#~ msgid "tsign" -#~ msgstr "signr" - -#~ msgid "lsign" -#~ msgstr "lsignr" - -#, fuzzy -#~ msgid "nrsign" -#~ msgstr "signr" - -#, fuzzy -#~ msgid "nrlsign" -#~ msgstr "signr" - -#~ msgid "adduid" -#~ msgstr "tilfj-bid" - -#~ msgid "deluid" -#~ msgstr "sletbid" - -#, fuzzy -#~ msgid "addcardkey" -#~ msgstr "tilfj ngle" - -#~ msgid "delkey" -#~ msgstr "sletngle" - -#, fuzzy -#~ msgid "addrevoker" -#~ msgstr "tilfj ngle" - -#~ msgid "delsig" -#~ msgstr "sletsig" - -#~ msgid "expire" -#~ msgstr "udlb" - -#~ msgid "toggle" -#~ msgstr "skift" - -#~ msgid "t" -#~ msgstr "s" - -#~ msgid "pref" -#~ msgstr "prf" - -#, fuzzy -#~ msgid "showpref" -#~ msgstr "visprf" - -#, fuzzy -#~ msgid "setpref" -#~ msgstr "prf" - -#, fuzzy -#~ msgid "updpref" -#~ msgstr "prf" - -#, fuzzy -#~ msgid "keyserver" -#~ msgstr "generel fejl" - -#~ msgid "trust" -#~ msgstr "betro" - -#, fuzzy -#~ msgid "revuid" -#~ msgstr "sletbid" - -#~ msgid "disable" -#~ msgstr "slfra" - -#~ msgid "enable" -#~ msgstr "sltil" - -#~ msgid "DSA only allows keysizes from 512 to 1024\n" -#~ msgstr "DSA tillader kun nglestrrelser 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 nglestrrelse? " - -#, 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 "ngle %08lX: ngle er blevet annulleret!\n" - -#~ msgid "key %08lX: subkey has been revoked!\n" -#~ msgstr "ngle %08lX: underngle er blevet annulleret!\n" - -#~ msgid "%08lX: key has expired\n" -#~ msgstr "%08lX: ngle er udlbet\n" - -#~ msgid "%08lX: We do NOT trust this key\n" -#~ msgstr "%08lX: Vi stoler IKKE p denne ngle\n" - -#, fuzzy -#~ msgid " (%d) RSA (sign and encrypt)\n" -#~ msgstr " (%d) ElGamal (signr og kryptr)\n" - -#, fuzzy -#~ msgid " (%d) RSA (auth only)\n" -#~ msgstr " (%d) DSA (signr kun)\n" - -#, fuzzy -#~ msgid " (%d) RSA (sign and auth)\n" -#~ msgstr " (%d) ElGamal (signr og kryptr)\n" - -#, fuzzy -#~ msgid " (%d) RSA (encrypt and auth)\n" -#~ msgstr " (%d) ElGamal (kryptr kun)\n" - -#, fuzzy -#~ msgid " (%d) RSA (sign, encrypt and auth)\n" -#~ msgstr " (%d) ElGamal (signr og kryptr)\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 "udlb" - -#, 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 "eksportr ejertillidsvrdierne" - -#~ msgid " (main key ID %08lX)" -#~ msgstr " (hovedngle-ID %08lX)" - -#, fuzzy -#~ msgid "rev! subkey has been revoked: %s\n" -#~ msgstr "rev! underngle er blevet annulleret! %s\n" - -#, fuzzy -#~ msgid "rev- faked revocation found\n" -#~ msgstr "rev- forkert ngletilbagekald\n" - -#, fuzzy -#~ msgid " [expired: %s]" -#~ msgstr "Ngle udlber d. %s\n" - -#, fuzzy -#~ msgid " [expires: %s]" -#~ msgstr "Ngle udlber d. %s\n" - -#, fuzzy -#~ msgid " [revoked: %s]" -#~ msgstr "tilfj ngle" - -#~ 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 "signr en ngle lokalt" - -#~ msgid "list only the sequence of packets" -#~ msgstr "vis kun pakkesekvensen" - -#~ msgid "export the ownertrust values" -#~ msgstr "eksportr ejertillidsvrdierne" - -#, fuzzy -#~ msgid "unattended trust database update" -#~ msgstr "opdatr tillidsdatabasen" - -#~ msgid "fix a corrupted trust database" -#~ msgstr "reparr 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 nglen 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 "krselsmodus: sprg aldrig" - -#~ msgid "assume yes on most questions" -#~ msgstr "forvent ja til de fleste sprgsml" - -#~ msgid "assume no on most questions" -#~ msgstr "forvent nej til de fleste sprgsml" - -#~ msgid "add this keyring to the list of keyrings" -#~ msgstr "tilfj denne nglering til ngleringslisten" - -#~ msgid "add this secret keyring to the list" -#~ msgstr "tilfj denne hemmeligenglering til listen" - -#~ msgid "|NAME|use NAME as default secret key" -#~ msgstr "|NAME|brug NAME som standard hemmeligngle" - -#~ msgid "|HOST|use this keyserver to lookup keys" -#~ msgstr "|HOST|brug denne ngletjener til at sl ngler op" - -#~ msgid "|NAME|set terminal charset to NAME" -#~ msgstr "|NAME|st terminal karakterst 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|indls udvidelsesmodul FILE" - -#~ msgid "emulate the mode described in RFC1991" -#~ msgstr "emulr modusen beskrevet i RFC1991" - -#~ msgid "set all packet, cipher and digest options to OpenPGP behavior" -#~ msgstr "st alle pakker, cifre og resum flag til OpenPGP standard" - -#, fuzzy -#~ msgid "set all packet, cipher and digest options to PGP 2.x behavior" -#~ msgstr "st 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 resumalgoritme 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 "ngle %08lX: ikke en rfc2440 ngle - udeladt\n" - -#, fuzzy -#~ msgid " (default)" -#~ msgstr "(standard er 1)" - -#~ msgid "Policy: " -#~ msgstr "Politik: " - -#, fuzzy -#~ msgid "can't get key from keyserver: %s\n" -#~ msgstr "importr ngler fra en ngleserver: %s\n" - -#, fuzzy -#~ msgid "error sending to `%s': %s\n" -#~ msgstr "fejl ved lsning af '%s': %s\n" - -#, fuzzy -#~ msgid "%lu keys so far checked (%lu signatures)\n" -#~ msgstr "%lu ngler behandlet indtil nu\n" - -#, fuzzy -#~ msgid "key %08lX incomplete\n" -#~ msgstr "ngle %08lX: ingen bruger-id\n" - -#, fuzzy -#~ msgid "quit|quit" -#~ msgstr "afslut" - -#~ msgid " (%d) ElGamal (sign and encrypt)\n" -#~ msgstr " (%d) ElGamal (signr og kryptr)\n" - -#, fuzzy -#~ msgid "Create anyway? " -#~ msgstr "Brug denne ngle 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 "" -#~ "frste bogstav af en notationsnavn skal vre 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 nglestrrelse? " - -#, fuzzy -#~ msgid " Are you sure you still want to sign it?\n" -#~ msgstr "Er du sikker p at de vil benytte denne nglestrrelse? " - -#~ 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 ngle 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 ngler behandlet indtil nu\n" - -#~ msgid "" -#~ "No trust values changed.\n" -#~ "\n" -#~ msgstr "Ingen tillidsvrdier 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 undersgelse af ngle: %s\n" - -#~ msgid "Good certificate" -#~ msgstr "Godt certifikat" - -#~ msgid "certificate read problem: %s\n" -#~ msgstr "certifikatlseproblem: %s\n" - -#~ msgid "can't lock keyring `%s': %s\n" -#~ msgstr "kan ikke lse nglering `%s': %s\n" - -#~ msgid "%s: user not found\n" -#~ msgstr "%s: bruger ikke fundet\n" - -#~ msgid "No key for user ID\n" -#~ msgstr "Ingen ngle for bruger-ID\n" - -#~ msgid "set debugging flags" -#~ msgstr "st 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.glo b/po/de.glo deleted file mode 100644 index 7e32f93ab..000000000 --- a/po/de.glo +++ /dev/null @@ -1,238 +0,0 @@ -# Glossary for GnuPG german translation -# Zusammenstellung der Liste: -# Copyright (C) 1998 Free Software Foundation, Inc. -# Walter Koch <koch@hsp.de>, 1998. -# -# This is just a textfile for your information. -# It will _not_ be read or processed automatically by any program -# -# 1. Die Begriffe ohne ein "<" oder ">" vor dem deutschen Wort -# stammen aus der Wortliste von Walter Koch (Programmbersetzung). -# 2. Die nderungsvorschlge dazu mit einem "*" vor dem deutschen Wort -# stammen von Peter Gerwinski. -# 3. Die Begriffe mit einem "<" vor dem deutschen Wort sind so in der -# Bearbeitung von Herrn Goretzki verwendet worden -# 4. Die Begriffe mit einem ">" vor dem deutschen Wort sind -# alternative bersetzungsmglichkeiten, die von H.Martin angegeben -# wurden. -# 5. (*) Uneinheitlich verwendet -# 6. - Gefllt mir (Walter Koch) nicht so toll -# 7. Die erste genannte bersetzung ist die in de.po verwendete -# 8. # - Wurde in frherere de.po-Version verwendet - - -agent Agent -aka alias -algorithm Verfahren -anonymous ungenannter -argument > Argument -armor ASCII-Hlle -assigned zugewiesen -associate with a person <einer Person zuordnen -authentication Authentisierung -available vorhanden [besser?: verfgbar, greifbar?] -bad [MPI] fehlerhafte MPI -bad [signature] falsch[e] Unterschrift -break (the encryption) <(Die Verschlsselung) aufbrechen -bug "Bug (Programmfehler)" -cache Cache, -#Lager *Zwischenspeicher -can't read nicht lesbar -cancelled Abbruch, abgebrochen -casual >zufllig, >gelegentlich >unregelmig -certificate Zertifikat -, (Urkunde) -character set Zeichensatz -check (verb) prfen, geprft -checking [sth.] [sth-]-berprfung -checksum Prfsumme -cipher algorithm Verschlsselungsverfahren -clearsign -clearsig header Klartextsignatur-Einleitung -created erzeugt -command Befehl -comment Bemerkung -compress algorithm Komprimierverfahren,*Komprimierungsverfahren ? -compressed komprimiert -compromised nicht mehr sicher -core dump core-dump-Datei -, (Speicherauszug?) -core function <wesentliche Funktion -correct beseitigen (please correct the error first) -corrupted beschdigter -cover >behandeln, <erlutern -created erstellt -creation <Erzeugung -critical bit ??? -dash escaped mit Bindestrich \"escapte\", *m.Bindestrichen maskiert? -decryption Entschlsselung -default option <Standardoption -default option file --voreingestellte Optionendatei -DEK ??? -delete entfernen, *>lschen -depend on >sich verlassen auf,>angewiesen sein auf,>abhngen von -deprecated mibilligte -detached [sign] abgetrennte [Unterschrift] -determined attacker >zielbewusster,>entschlossener Angreifer -digest algorithm Hashmethode -direct [key sig] -"direct key" -disabled abgeschaltet -duplicated (adj.) doppelt -encrypted verschlsselte -enviorement variable Umgebungsvariable -eventually >schlielich, endlich Nicht: eventuell -expand -expiration date <Verfalldatum -expire <verfallen -expires verfllt -expire date Verfallsdatum -failed fehlgeschlagen -faked [RNG] - *manipulierter Zufallszahlengenerator -faked [certificate] geflscht -fingerprint Fingerabdruck -flag [verb] -kennzeichnen -found [xyz found] entdeckt [xyz entdeckt] -for-your-eyes-only Vertraulichkeit (\"for-your-eyes-only\") -, Verschlusache -generated erzeugter -good certificate Korrektes Zertifikat -handle [verb] benutzen, behandeln, mit ... umgehen -hint Tip -human readable -nicht als Klartext darstellbar -ignored unbeachtet -include <enthalten -init *initialisieren -invalid ... falsche ... -is adequate >ist angemessen, manchmal: <reicht vllig aus -issue -key-ID Schlssel-ID, *Schlsselkennung ? - -key binding Schlsselanbindung -keyblock Schlsselblock -keyserver Schlsselserver, Schl.server, -*Schlssel-Server -keysize -keyring Schlsselbund -lifetime >Gltigkeitsdauer, >Geltungsdauer -listed -locally (nur) fr diesen Rechner, #(nur) auf diesem Rechner -lookup - Suche -machine hufig: Computer, Rechner -main key Hauptschlssel -maintenance utility -Wartungs-Hilfsprogramm -making signatures >Unterschreiben <Unterzeichnen, <Leisten von -malformed ungnstig aufgebaute, *fehlerhaft aufgebaute -master key >Universalschlssel -, Generalschlssel -match Treffer -MDC Manipulation detection code (Siegel ?) -merge (to) >zusammenfhren, >vermischen ?? -message Botschaft -mode Modus, Methode * -move schieben, *verschieben -multiple signature Mehrfachunterschriften -NAI -network error Netzwerkfehler -non-revocably nicht-widerrufbar, unwiderruflich?? -note Hinweis -okay in Ordnung -Ooops Huch -OpenPGP -option Option -original ursprnglicher -overrides -ersetzt -ownertrust \"Owner trust\" *Vertrauenswrdigkeit des Besitzers -packet Paket -packet type Pakettyp -parse -zerlegen -passphrase Mantra -permission [file] Zugriffsrechte -Photo-ID Foto-ID -policy Richtlinie -policy URL Richtlinien-URL -preference items ???? -preferences Einstellungen *(die gesamten) Einstellungen -preferred bevorzugt -primary keys Hauptschlssel -problem [to do sth.] -Schwierigkeit -prompt (to) auch: >abfragen, >anfordern, >verlangen -protected -protection algorithm Schutzverfahren -pubkey algorithm Public-Key-Verfahren -public key ffentlicher Schssel -public key algorithm Public-Key-Verfahren -quit *(Programm) verlassen, beenden -radix64 radix64 -random Zufall -random bytes Zufallswerte -reason Grund (fr revocation) -[xyz] rebuild [xyz]-Neuaufbau, neu erzeugt -regular file normale Datei -response Antwort (Reaktion?) -retry ???? (Wiederholung?, Wiederaufnahme?) -returns gibt zurck / antwortet -reveal auch: <jemandem zeigen, >anderen zeigen -revocation Widerruf <*>Rckruf -revocation certificate *<Rckrufurkunde *Rckruf-Zertifikat -revoke widerrufen -revocably widerrufbar -RNG Zufallsgenerator -secondary key Zweitschlssel -secret key geheimer Schlssel -secret keyring geheimer Schlsselbund, geh. Schlsselbund -secret parts geheime Teile -security need(s) >Sicherheitsbedfnis(se), >Sicherheitsbedarf -self-signature Eigenbeglaubigung -sender Absender -sensitive - empfindlich -set [sth.] einstellen, festlegen -session Sitzung -show [an]zeigen, zeigen -sign user id User-ID beglaubigen * -signed unterschriebene -signature (files) Unterschrift * -signature (keys) Beglaubigung * -simple S2K mode ???? -skipped bergangen, bersprungen, ignoriert -so far bislang -specify >spezifizieren, <angeben, ?festlegen -stdin - stdin, *die Standardeingabe -string Zeichenkette -[PGP2-]style[ key] [PGP2-] artiger [Schlssel] -subkey Unterschlssel -superseeded berholt, veraltet -terminal charset - Terminalzeichensatz *Terminal-Zeichensatz(s.o.) -throw verwerfe -Timestamp conflict Zeitangaben differieren -trust Vertrauen -Trust-DB 'Trust'-Datenbank, *Vertrauensdatenbank ? -trusted - vertrauenswrdig -trustvalues - trustvalues >Vertrauensniveaus?? *Vertrauensma? >Vertrauenswerte? -trying Versuch -type [message] [Botschaft] eintippen -ulimately [trust] uneingeschrnkt [vertrauen] -ultimate trust uneingeschrnktes Vertrauen -unable -unattended unbeaufsichtigt -unavailble -untrusted - nichtvertrauenswrdig, *nicht vertrauenswrdig -unusable unbrauchbar -update ndern, nderung >Aktualisieren, >Aktualisierung *auf den -URL (die) URL -[the] use [of] -User - User, *<Benutzer, *Teilnehmer -user ID User-ID -user IDs User-IDs -user interface >Benutzer-Schnittstelle -username Username, *<Benutzername, -used benutzt (no loger used) -using xyz verwende xyz -valid gltig -validate -- authentifizieren (>besser authentisieren ?? So im -Wrterbuch der neuen Rechtschreibung) -validation -- >Authentisierung -verbose ausfhrlich -verify < berprfen -warning Warnung -weak key unsicherer Schlssel -writeable schreibbarer -wisely >klug, vernnftig(erweise), >gescheit; mglichst sinnvoll - diff --git a/po/de.po b/po/de.po index bf0dabe99..3861a486f 100644 --- a/po/de.po +++ b/po/de.po @@ -1,1134 +1,503 @@ -# 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 +# German translation for GnuPG 1.9.x +# Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc. +# Werner Koch <wk@gnupg.org>, 2002. +# +# +# Note that we use "gnupg2" as the domain to avoid conflicts with +# already installed domains "gnupg" from GnuPG < 1.9. # msgid "" msgstr "" -"Project-Id-Version: gnupg-1.4.1\n" -"Report-Msgid-Bugs-To: gnupg-i18n@gnupg.org\n" -"POT-Creation-Date: 2006-07-28 11:12+0200\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" +"Project-Id-Version: gnupg2 1.9.18\n" +"Report-Msgid-Bugs-To: translations@gnupg.org\n" +"POT-Creation-Date: 2006-07-24 16:19+0200\n" +"PO-Revision-Date: 2006-06-20 20:04+0200\n" +"Last-Translator: Werner Koch <wk@gnupg.org>\n" +"Language-Team: de\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=iso-8859-1\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 "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:1003 g10/gpg.c:3461 g10/import.c:195 g10/keygen.c:2385 -#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:342 -#: 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 geffnet 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 Gre 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 unverndert\n" - -#: cipher/random.c:544 g10/exec.c:481 g10/gpg.c:1002 g10/keygen.c:2864 -#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:263 -#: g10/openfile.c:357 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 schlieen: %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 +#: agent/gpg-agent.c:109 agent/protect-tool.c:109 scd/scdaemon.c:101 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" +"@Options:\n" +" " msgstr "" -"Der Zufallsgenerator (RNG) ist lediglich ein \"kludge\", damit das\n" -"Programms berhaupt luft - es ist KEINESFALLS ein starker RNG!\n" -"\n" -"BENUTZEN SIE DIE DURCH DIESES PROGRAMM ERZEUGTEN DATEN NICHT!\n" -"\n" +"@Optionen:\n" +" " -# translated by wk -#: cipher/rndegd.c:202 +#: agent/gpg-agent.c:111 scd/scdaemon.c:103 +msgid "run in server mode (foreground)" +msgstr "Im Server Modus ausführen" + +#: agent/gpg-agent.c:112 scd/scdaemon.c:106 +msgid "run in daemon mode (background)" +msgstr "Im Daemon Modus ausführen" + +#: agent/gpg-agent.c:113 kbx/kbxutil.c:82 scd/scdaemon.c:107 sm/gpgsm.c:333 +#: tools/gpgconf.c:63 +msgid "verbose" +msgstr "ausführlich" + +#: agent/gpg-agent.c:114 kbx/kbxutil.c:83 scd/scdaemon.c:108 sm/gpgsm.c:334 +msgid "be somewhat more quiet" +msgstr "Etwas weniger Ausgaben erzeugen" + +#: agent/gpg-agent.c:115 scd/scdaemon.c:109 +msgid "sh-style command output" +msgstr "Ausgabe für /bin/sh" + +#: agent/gpg-agent.c:116 scd/scdaemon.c:110 +msgid "csh-style command output" +msgstr "Ausgabe für /bin/csh" + +#: agent/gpg-agent.c:117 +msgid "|FILE|read options from FILE" +msgstr "|DATEI|Konfigurationsoptionen aus DATEI lesen" + +#: agent/gpg-agent.c:122 scd/scdaemon.c:119 +msgid "do not detach from the console" +msgstr "Im Vordergrund laufen lassen" + +#: agent/gpg-agent.c:123 +msgid "do not grab keyboard and mouse" +msgstr "Tastatur und Maus nicht \"grabben\"" + +#: agent/gpg-agent.c:124 scd/scdaemon.c:120 sm/gpgsm.c:336 +msgid "use a log file for the server" +msgstr "Logausgaben in eine Datei umlenken" + +#: agent/gpg-agent.c:126 +msgid "use a standard location for the socket" +msgstr "Benutze einen Standardnamen für den Socket" + +#: agent/gpg-agent.c:130 +msgid "|PGM|use PGM as the PIN-Entry program" +msgstr "|PGM|benutze PGM as PIN-Entry" + +#: agent/gpg-agent.c:132 +msgid "|PGM|use PGM as the SCdaemon program" +msgstr "|PGM|benutze PGM as SCdaemon" + +#: agent/gpg-agent.c:133 +msgid "do not use the SCdaemon" +msgstr "Den Scdaemon basierten Kartenzugriff nicht nutzen" + +#: agent/gpg-agent.c:140 +msgid "ignore requests to change the TTY" +msgstr "Ignoriere Anfragen, das TTY zu wechseln" + +#: agent/gpg-agent.c:142 +msgid "ignore requests to change the X display" +msgstr "Ignoriere Anfragen, das X-Display zu wechseln" + +#: agent/gpg-agent.c:145 +msgid "|N|expire cached PINs after N seconds" +msgstr "|N|lasse PINs im Cache nach N Sekunden verfallen" + +#: agent/gpg-agent.c:150 +msgid "do not use the PIN cache when signing" +msgstr "benutze PINs im Cache nicht bem Signieren" + +#: agent/gpg-agent.c:152 +msgid "allow clients to mark keys as \"trusted\"" +msgstr "erlaube Aufrufern Schlüssel als \"vertrauenswürdig\" zu markieren" + +#: agent/gpg-agent.c:154 +msgid "allow presetting passphrase" +msgstr "erlaube ein \"preset\" von Passphrases" + +#: agent/gpg-agent.c:155 +msgid "enable ssh-agent emulation" +msgstr "Die ssh-agent Emulation anschalten" + +#: agent/gpg-agent.c:157 +msgid "|FILE|write environment settings also to FILE" +msgstr "|DATEI|Schreibe die Umgebungsvariabeln auf DATEI" + +#: agent/gpg-agent.c:236 agent/protect-tool.c:143 scd/scdaemon.c:188 +#: sm/gpgsm.c:513 tools/gpgconf.c:86 +msgid "Please report bugs to <" +msgstr "Fehlerberichte bitte an <" + +#: agent/gpg-agent.c:236 agent/protect-tool.c:143 scd/scdaemon.c:188 +#: sm/gpgsm.c:513 tools/gpgconf.c:86 +msgid ">.\n" +msgstr ">.\n" + +#: agent/gpg-agent.c:239 +msgid "Usage: gpg-agent [options] (-h for help)" +msgstr "Gebrauch: gpg-agent [Optionen] (-h für Hilfe)" + +#: agent/gpg-agent.c:241 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" +"Syntax: gpg-agent [options] [command [args]]\n" +"Secret key management for GnuPG\n" msgstr "" -"Zufall wird gesammelt. Bitte arbeiten Sie an etwas anderem, da\n" -"so die Qualitt der Zufallszahlen erhht werden kann.\n" +"Syntax: gpg-agent [Optionen] [Kommando [Argumente]]\n" +"Verwaltung von geheimen Schlüssel für GnuPG\n" -#: cipher/rndlinux.c:132 +#: agent/gpg-agent.c:312 scd/scdaemon.c:262 sm/gpgsm.c:642 #, 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" +msgid "invalid debug-level `%s' given\n" +msgstr "ungültige Debugebene `%s' angegeben\n" + +#: agent/gpg-agent.c:483 agent/protect-tool.c:1073 kbx/kbxutil.c:432 +#: scd/scdaemon.c:354 sm/gpgsm.c:763 +#, c-format +msgid "libgcrypt is too old (need %s, have %s)\n" msgstr "" -"\n" -"Es sind nicht gengend Zufallswerte vorhanden. Bitte fhren Sie andere\n" -"Arbeiten durch, damit das Betriebssystem weitere Entropie sammeln kann!\n" -"(Es werden noch %d Byte bentigt.)\n" +"Die Bibliothek \"libgcrypt\" is zu alt (benötigt wird %s, vorhanden ist %s)\n" -#: g10/app-openpgp.c:596 +#: agent/gpg-agent.c:575 scd/scdaemon.c:429 sm/gpgsm.c:864 #, c-format -msgid "failed to store the fingerprint: %s\n" -msgstr "Der Fingerabdruck kann nicht gespeichert werden: %s\n" +msgid "NOTE: no default option file `%s'\n" +msgstr "Notiz: Voreingestellte Konfigurationsdatei `%s' fehlt\n" -#: g10/app-openpgp.c:609 +#: agent/gpg-agent.c:580 agent/gpg-agent.c:1091 scd/scdaemon.c:434 +#: sm/gpgsm.c:868 #, c-format -msgid "failed to store the creation date: %s\n" -msgstr "Das Erzeugungsdatum konnte nicht gespeichert werden: %s\n" +msgid "option file `%s': %s\n" +msgstr "Konfigurationsdatei `%s': %s\n" -#: g10/app-openpgp.c:977 +#: agent/gpg-agent.c:588 scd/scdaemon.c:442 sm/gpgsm.c:875 #, c-format -msgid "reading public key failed: %s\n" -msgstr "Lesen des ffentlichen Schlssels fehlgeschlagen: %s\n" +msgid "reading options from `%s'\n" +msgstr "Optionen werden aus `%s' gelesen\n" -#: g10/app-openpgp.c:985 g10/app-openpgp.c:1910 -msgid "response does not contain the public key data\n" -msgstr "Die Antwort enthlt keine ffentliche Schlssel-Daten\n" - -#: g10/app-openpgp.c:993 g10/app-openpgp.c:1918 -msgid "response does not contain the RSA modulus\n" -msgstr "Die Antwort enthlt 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 enthlt den ffentlichen RSA-Exponenten nicht\n" - -#: g10/app-openpgp.c:1258 g10/app-openpgp.c:1346 g10/app-openpgp.c:2154 +#: agent/gpg-agent.c:885 #, c-format -msgid "PIN callback returned error: %s\n" -msgstr "PIN-Callback meldete Fehler: %s\n" +msgid "error creating `%s': %s\n" +msgstr "Fehler beim Erstellen von `%s': %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 fr CHV%d ist zu kurz; die Mindestlnge betrgt %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 "Prfung 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 "Schlssel existiert bereits\n" - -#: g10/app-openpgp.c:1566 -msgid "existing key will be replaced\n" -msgstr "Existierender Schlssel wird ersetzt werden\n" - -#: g10/app-openpgp.c:1568 -msgid "generating new key\n" -msgstr "neue Schlssel 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 Schlssels fehlgeschlagen: %s\n" - -#: g10/app-openpgp.c:1886 -msgid "please wait while key is being generated ...\n" -msgstr "Bitte warten, der Schlssel wird erzeugt ...\n" - -#: g10/app-openpgp.c:1901 -msgid "generating key failed\n" -msgstr "Schlsselerzeugung fehlgeschlagen\n" - -#: g10/app-openpgp.c:1904 -#, c-format -msgid "key generation completed (%d seconds)\n" -msgstr "Schlsselerzeugung abgeschlossen (%d Sekunden)\n" - -#: g10/app-openpgp.c:1961 -msgid "invalid structure of OpenPGP card (DO 0x93)\n" -msgstr "Ungltige 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 untersttzt\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 - ungltige OpenPGP-Karte?\n" - -#: g10/armor.c:320 -#, c-format -msgid "armor: %s\n" -msgstr "ASCII-Hlle: %s\n" - -#: g10/armor.c:359 -msgid "invalid armor header: " -msgstr "Ungltige ASCII-Hlle" - -#: g10/armor.c:370 -msgid "armor header: " -msgstr "ASCII-Hlle: " - -#: g10/armor.c:381 -msgid "invalid clearsig header\n" -msgstr "Ungltige Klartextsignatur-Einleitung\n" - -#: g10/armor.c:433 -msgid "nested clear text signatures\n" -msgstr "verschachtelte Klartextunterschriften\n" - -#: g10/armor.c:568 -msgid "unexpected armor: " -msgstr "Unerwartete ASCII-Hlle: " - -#: g10/armor.c:580 -msgid "invalid dash escaped line: " -msgstr "Ungltige mit Bindestrich \"escapte\" Zeile: " - -#: g10/armor.c:734 g10/armor.c:1343 -#, c-format -msgid "invalid radix64 character %02X skipped\n" -msgstr "Ungltiges \"radix64\" Zeichen %02x ignoriert\n" - -#: g10/armor.c:777 -msgid "premature eof (no CRC)\n" -msgstr "vorzeitiges Dateiende (keine Prfsumme)\n" - -#: g10/armor.c:811 -msgid "premature eof (in CRC)\n" -msgstr "vorzeitiges Dateiende (innerhalb der Prfsumme)\n" - -#: g10/armor.c:819 -msgid "malformed CRC\n" -msgstr "Falsch aufgebaute Prfsumme\n" - -#: g10/armor.c:823 g10/armor.c:1380 -#, c-format -msgid "CRC error; %06lX - %06lX\n" -msgstr "Prfsummenfehler; %06lx - %06lx\n" - -#: g10/armor.c:843 -msgid "premature eof (in trailer)\n" -msgstr "vorzeitiges Dateiende (im Nachsatz)\n" - -#: g10/armor.c:847 -msgid "error in trailer line\n" -msgstr "Fehler in der Nachsatzzeile\n" - -#: g10/armor.c:1158 -msgid "no valid OpenPGP data found.\n" -msgstr "Keine gltigen OpenPGP-Daten gefunden.\n" - -#: g10/armor.c:1163 -#, c-format -msgid "invalid armor: line longer than %d characters\n" -msgstr "ungltige ASCII-Hlle: Zeile ist lnger als %d Zeichen\n" - -#: g10/armor.c:1167 -msgid "" -"quoted printable character in armor - probably a buggy MTA has been used\n" -msgstr "" -"\"quoted printable\" Zeichen in der ASCII-Hlle gefunden - mglicherweise\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 durchgefhrt 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 "mnnlich" - -#: 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 betrgt %d Zeichen).\n" - -#: g10/card-util.c:581 -msgid "URL to retrieve public key: " -msgstr "URL um den ffentlichen Schlssel 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 betrgt %d Zeichen).\n" - -#: g10/card-util.c:687 g10/card-util.c:756 g10/import.c:280 -#, 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 betrgt %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 betrgt %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: Ungltige Lnge der Einstellungs-Zeichenfolge.\n" - -#: g10/card-util.c:811 -msgid "Error: invalid characters in preference string.\n" -msgstr "Fehler: Ungltige Zeichen in der Einstellungs-Zeichenfolge\n" - -#: g10/card-util.c:832 -msgid "Sex ((M)ale, (F)emale or space): " -msgstr "Geschlecht: (Mnnlich (M), Weiblich (F) oder Leerzeichen): " - -#: g10/card-util.c:846 -msgid "Error: invalid response.\n" -msgstr "Fehler: ungltige 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: ungltig geformter Fingerabdruck.\n" - -#: g10/card-util.c:938 -#, c-format -msgid "key operation not possible: %s\n" -msgstr "Schlsseloperation nicht mglich: %s\n" - -#: g10/card-util.c:939 -msgid "not an OpenPGP card" -msgstr "Keine gltige OpenPGP-Karte" - -#: g10/card-util.c:948 -#, c-format -msgid "error getting current key info: %s\n" -msgstr "Fehler beim Holen der aktuellen Schlsselinfo: %s\n" - -#: g10/card-util.c:1033 -msgid "Replace existing key? (y/N) " -msgstr "Vorhandenen Schlssel 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 Verschlsselungsschlssel auerhalb der Karte erstellen? (J/n) " - -#: g10/card-util.c:1075 -msgid "Replace existing keys? (y/N) " -msgstr "Vorhandene Schlssel 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 whlen Sie die Art des Schlssel, der erzeugt werden soll:\n" - -#: g10/card-util.c:1125 g10/card-util.c:1206 -msgid " (1) Signature key\n" -msgstr " (1) Unterschriften-Schlssel\n" - -#: g10/card-util.c:1126 g10/card-util.c:1208 -msgid " (2) Encryption key\n" -msgstr " (2) Verschlsselungs-Schlssel\n" - -#: g10/card-util.c:1127 g10/card-util.c:1210 -msgid " (3) Authentication key\n" -msgstr " (3) Authentisierungs-Schlssel\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 "Ungltige Auswahl.\n" - -#: g10/card-util.c:1203 -msgid "Please select where to store the key:\n" -msgstr "Whlen Sie den Speicherort fr den Schlssel:\n" - -#: g10/card-util.c:1238 -msgid "unknown key protection algorithm\n" -msgstr "Unbekanntes Schlssel-Schutzverfahren\n" - -#: g10/card-util.c:1243 -msgid "secret parts of key are not available\n" -msgstr "Geheime Teile des Schlssels sind nicht vorhanden\n" - -#: g10/card-util.c:1248 -msgid "secret key already stored on a card\n" -msgstr "geheimer Schlssel 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 "Schlssel-holen-URL ndern" - -#: g10/card-util.c:1329 -msgid "fetch the key specified in the card URL" -msgstr "Holen des Schlssels 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 Schlssel erzeugen" - -#: g10/card-util.c:1336 -msgid "menu to change or unblock the PIN" -msgstr "Men fr 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 "Ungltiger Befehl (versuchen Sie's mal mit \"help\")\n" - -#: g10/cardglue.c:416 -#, fuzzy -msgid "card reader not available\n" -msgstr "Geheimer Schlssel 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 drcken Sie 'Eingabe'; drcken Sie 'c' um " -"abzubrechen: " - -#: g10/cardglue.c:446 -#, fuzzy, c-format -msgid "selecting openpgp failed: %s\n" -msgstr "lschen des Schlsselblocks 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 "" -"Drcken Sie 'Eingabe' wenn fertig; oder drcken 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:3826 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 geffnet 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:3387 g10/keyserver.c:1700 -#: g10/revoke.c:228 -#, c-format -msgid "key \"%s\" not found: %s\n" -msgstr "Schlssel \"%s\" nicht gefunden: %s\n" - -#: g10/delkey.c:83 g10/export.c:341 g10/import.c:2349 g10/keyserver.c:1714 -#: g10/revoke.c:234 g10/revoke.c:478 -#, c-format -msgid "error reading keyblock: %s\n" -msgstr "Fehler beim Lesen des Schlsselblocks: %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 Schlssel 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 durchgefhrt werden\n" - -#: g10/delkey.c:147 -msgid "Delete this key from the keyring? (y/N) " -msgstr "Diesen Schlssel aus dem Schlsselbund lschen? (j/N) " - -#: g10/delkey.c:155 -msgid "This is a secret key! - really delete? (y/N) " -msgstr "Dies ist ein privater Schlssel! - Wirklich lschen? (j/N) " - -#: g10/delkey.c:165 -#, c-format -msgid "deleting keyblock failed: %s\n" -msgstr "lschen des Schlsselblocks fehlgeschlagen: %s\n" - -#: g10/delkey.c:175 -msgid "ownertrust information cleared\n" -msgstr "Der \"Ownertrust\" wurde gelscht\n" - -#: g10/delkey.c:206 -#, c-format -msgid "there is a secret key for public key \"%s\"!\n" -msgstr "" -"Es gibt einen privaten Schlssel zu diesem ffentlichen Schlssel \"%s\"!\n" - -#: g10/delkey.c:208 -msgid "use option \"--delete-secret-keys\" to delete it first.\n" -msgstr "" -"Verwenden Sie zunchst 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 fr RSA-Schlssel mit maximal 2048 Bit " -"verschlsselt 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-Verschlsselung kann nicht mit allen Zielschlsseln 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 Verschlsselungsverfahren %" -"s (%d) verletzt die Empfngervoreinstellungen\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 " -"Empfngervoreinstellungen.\n" - -#: g10/encode.c:715 -#, c-format -msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n" -msgstr "" -"Erzwungene Verwendung des symmetrischen Verschlsselungsverfahren %s (%d) " -"verletzt die Empfngervoreinstellungen\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 verschlsselt fr: %s\n" - -#: g10/encr-data.c:67 g10/mainproc.c:293 -#, c-format -msgid "%s encrypted data\n" -msgstr "%s verschlsselte Daten\n" - -#: g10/encr-data.c:69 g10/mainproc.c:297 -#, c-format -msgid "encrypted with unknown algorithm %d\n" -msgstr "Mit unbekanntem Verfahren verschlsselt %d\n" - -#: g10/encr-data.c:93 -msgid "" -"WARNING: message was encrypted with a weak key in the symmetric cipher.\n" -msgstr "" -"Warnung: Botschaft wurde mit einem unsicheren Schlssel verschlsselt.\n" - -#: g10/encr-data.c:104 -msgid "problem handling encrypted packet\n" -msgstr "Problem beim Bearbeiten des verschlsselten Packets\n" - -#: g10/exec.c:49 -msgid "no remote program execution supported\n" -msgstr "Ausfhren von externen Programmen wird nicht untersttzt\n" - -#: g10/exec.c:176 g10/openfile.c:415 +#: agent/gpg-agent.c:1141 agent/gpg-agent.c:1244 agent/gpg-agent.c:1248 +#: agent/gpg-agent.c:1284 agent/gpg-agent.c:1288 scd/scdaemon.c:909 #, c-format msgid "can't create directory `%s': %s\n" -msgstr "Verzeichnis `%s' kann nicht erzeugt werden: %s\n" +msgstr "Das Verzeichniss `%s' kann nicht erstellt werden: %s\n" -#: g10/exec.c:317 +#: agent/gpg-agent.c:1155 scd/scdaemon.c:923 +msgid "name of socket too long\n" +msgstr "Der Name des Sockets ist zu lang\n" + +#: agent/gpg-agent.c:1181 scd/scdaemon.c:949 +#, c-format +msgid "can't create socket: %s\n" +msgstr "Socket kann nicht erzeugt werden: %s\n" + +#: agent/gpg-agent.c:1210 scd/scdaemon.c:978 +#, c-format +msgid "error binding socket to `%s': %s\n" +msgstr "Der Socket kann nicht an `%s' gebunden werden: %s\n" + +#: agent/gpg-agent.c:1218 scd/scdaemon.c:986 +#, c-format +msgid "listen() failed: %s\n" +msgstr "Der listen() Aufruf ist fehlgeschlagen: %s\n" + +#: agent/gpg-agent.c:1224 scd/scdaemon.c:992 +#, c-format +msgid "listening on socket `%s'\n" +msgstr "Es wird auf Socket `%s' gehört\n" + +#: agent/gpg-agent.c:1252 agent/gpg-agent.c:1294 +#, c-format +msgid "directory `%s' created\n" +msgstr "Verzeichniss `%s' wurde erstellt\n" + +#: agent/gpg-agent.c:1300 +#, c-format +msgid "stat() failed for `%s': %s\n" +msgstr "stat() Aufruf für `%s' fehlgeschlagen: %s\n" + +#: agent/gpg-agent.c:1304 +#, c-format +msgid "can't use `%s' as home directory\n" +msgstr "Die Datei `%s' kann nicht als Home-Verzeichniss benutzt werden\n" + +#: agent/gpg-agent.c:1403 +#, c-format +msgid "handler 0x%lx for fd %d started\n" +msgstr "Handhabungsroutine 0x%lx für fd %d gestartet\n" + +#: agent/gpg-agent.c:1413 +#, c-format +msgid "handler 0x%lx for fd %d terminated\n" +msgstr "Handhabungsroutine 0x%lx für den fd %d beendet\n" + +#: agent/gpg-agent.c:1427 +#, c-format +msgid "ssh handler 0x%lx for fd %d started\n" +msgstr "SSH Handhabungsroutine 0x%lx für fd %d gestartet\n" + +#: agent/gpg-agent.c:1434 +#, c-format +msgid "ssh handler 0x%lx for fd %d terminated\n" +msgstr "SSH Handhabungsroutine 0x%lx für fd %d beendet\n" + +#: agent/gpg-agent.c:1528 scd/scdaemon.c:1108 +#, c-format +msgid "pth_select failed: %s - waiting 1s\n" +msgstr "pth_select() Aufruf fehlgeschlagen: %s - warte 1s\n" + +#: agent/gpg-agent.c:1612 scd/scdaemon.c:1165 +#, c-format +msgid "%s %s stopped\n" +msgstr "%s %s angehalten\n" + +#: agent/gpg-agent.c:1633 +msgid "no gpg-agent running in this session\n" +msgstr "Der gpg-agent läuft nicht für diese Session\n" + +#: agent/gpg-agent.c:1643 common/simple-pwquery.c:324 sm/call-agent.c:144 +msgid "malformed GPG_AGENT_INFO environment variable\n" +msgstr "Die Variable GPG_AGENT_INFO ist fehlerhaft\n" + +#: agent/gpg-agent.c:1655 common/simple-pwquery.c:336 sm/call-agent.c:156 +#, c-format +msgid "gpg-agent protocol version %d is not supported\n" +msgstr "Das gpg-agent Protocol %d wird nicht unterstützt\n" + +#: agent/protect-tool.c:146 +msgid "Usage: gpg-protect-tool [options] (-h for help)\n" +msgstr "Gebrauch: gpg-protect-tool [Optionen] (-h für Hilfe)\n" + +#: agent/protect-tool.c:148 msgid "" -"external program calls are disabled due to unsafe options file permissions\n" +"Syntax: gpg-protect-tool [options] [args]]\n" +"Secret key maintenance tool\n" msgstr "" -"Ausfhren von externen Programmen ist ausgeschaltet, da die Dateirechte " -"nicht sicher sind\n" +"Syntax: gpg-protect-tool [Optionen] [Argumente]\n" +"Werkzeug zum Bearbeiten von geheimen Schlüsseln\n" -#: g10/exec.c:347 -msgid "this platform requires temporary files when calling external programs\n" +#: agent/protect-tool.c:1206 +msgid "Please enter the passphrase to unprotect the PKCS#12 object." +msgstr "Bitte geben Sie die Passphrase zum Entsperren des PKCS#12 Objekts ein" + +#: agent/protect-tool.c:1209 +msgid "Please enter the passphrase to protect the new PKCS#12 object." msgstr "" -"Diese Plattform bentigt temporre Dateien zur Ausfhrung von externen\n" -"Programmen\n" +"Bitte geben Sie die Passphrase zum Schützen des neuen PKCS#12 Objekts ein" -#: g10/exec.c:425 -#, c-format -msgid "unable to execute program `%s': %s\n" -msgstr "Ausfhren des Programms `%s' nicht mglich: %s\n" - -#: g10/exec.c:428 -#, c-format -msgid "unable to execute shell `%s': %s\n" -msgstr "Ausfhren der Shell `%s' nicht mglich: %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 "ungewhnliches 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" +#: agent/protect-tool.c:1212 +msgid "" +"Please enter the passphrase to protect the imported object within the GnuPG " +"system." msgstr "" -"WARNUNG: die temporre Datei (%s) `%s' konnte nicht entfernt werden: %s\n" +"Bitte geben Sie die Passphrase ein, um das importierte Objekt im GnuPG " +"System zu schützen." -#: g10/exec.c:613 -#, c-format -msgid "WARNING: unable to remove temp directory `%s': %s\n" -msgstr "WARNUNG: Temporres Verzeichnis `%s' kann nicht entfernt werden: %s\n" +#: agent/protect-tool.c:1215 agent/genkey.c:111 agent/genkey.c:219 +msgid "Please re-enter this passphrase" +msgstr "Bitte geben Sie das Mantra (Passphrase) noch einmal ein:" -#: g10/export.c:61 -msgid "export signatures that are marked as local-only" -msgstr "Exportiere auch Unterschriften die als nicht exportfhig markiert sind" - -#: g10/export.c:63 -msgid "export attribute user IDs (generally photo IDs)" +#: agent/protect-tool.c:1217 +msgid "" +"Please enter the passphrase or the PIN\n" +"needed to complete this operation." msgstr "" +"Die Eingabe des Mantras (Passphrase) bzw. der PIN\n" +"wird benötigt um diese Aktion auszuführen." -#: g10/export.c:65 -msgid "export revocation keys marked as \"sensitive\"" -msgstr "Exportiere Widerrufsschlssel die als \"sensitiv\" markiert sind" +#: agent/protect-tool.c:1221 agent/genkey.c:132 agent/genkey.c:239 +msgid "does not match - try again" +msgstr "Keine Übereinstimmung - bitte nochmal versuchen" -#: g10/export.c:67 -msgid "remove the passphrase from exported subkeys" -msgstr "Die Passphrase von exportierten Unterschlssel entfernen" +#: agent/protect-tool.c:1222 +msgid "Passphrase:" +msgstr "Passphrase:" -#: g10/export.c:69 -msgid "remove unusable parts from key during export" -msgstr "Unbrauchbare Teile des Schlssel whrend des Exports entfernen" - -#: g10/export.c:71 -msgid "remove as much as possible from key during export" -msgstr "Whrend des Exports soviel wie mglich vom Schlssel entfernen" - -#: g10/export.c:325 -msgid "exporting secret keys not allowed\n" -msgstr "Exportieren geheimer Schlssel ist nicht erlaubt\n" - -#: g10/export.c:354 +#: agent/protect-tool.c:1235 #, c-format -msgid "key %s: not protected - skipped\n" -msgstr "Schlssel %s: ungeschtzt - bersprungen\n" +msgid "error while asking for the passphrase: %s\n" +msgstr "Fehler bei der Abfrage der Passphrase: %s\n" -#: g10/export.c:362 +#: agent/protect-tool.c:1238 +msgid "cancelled\n" +msgstr "Vom Benutzer abgebrochen\n" + +#: agent/divert-scd.c:217 +msgid "Admin PIN" +msgstr "Admin PIN" + +#: agent/divert-scd.c:275 +msgid "Repeat this PIN" +msgstr "PIN bitte wiederholen" + +#: agent/divert-scd.c:278 +msgid "PIN not correctly repeated; try again" +msgstr "PIN wurde nicht korrekt eingegeben; nochmal versuchen" + +#: agent/divert-scd.c:290 #, c-format -msgid "key %s: PGP 2.x style key - skipped\n" -msgstr "Schlssel %s: PGP 2.x-artiger Schlssel - bersprungen\n" +msgid "Please enter the PIN%s%s%s to unlock the card" +msgstr "Bitte geben Sie die PIN%s%s%s ein um die Karte zu entsperren" -#: g10/export.c:373 +#: agent/genkey.c:109 #, c-format -msgid "key %s: key material on-card - skipped\n" -msgstr "Schlssel %s: Schlsselmaterial ist auf einer Karte - bergangen\n" - -#: g10/export.c:521 -msgid "about to export an unprotected subkey\n" +msgid "Please enter the passphrase to%0Ato protect your new key" msgstr "" +"Bitte geben Sie das Mantra (Passphrase) ein%0Aum Ihren Schlüssel zu schützen" -#: g10/export.c:544 +#: agent/genkey.c:218 +msgid "Please enter the new passphrase" +msgstr "Bitte geben Sie das Mantra (Passphrase) ein:" + +#: agent/query.c:193 #, c-format -msgid "failed to unprotect the subkey: %s\n" -msgstr "Entfernen des Schutzes fr des Unterschlssel fehlgeschlagen: %s\n" +msgid "failed to acquire the pinentry lock: %s\n" +msgstr "Die Sperre für das Pinentry kann nicht gesetzt werden: %s\n" -# translated by wk -#: g10/export.c:565 +#: agent/query.c:356 +msgid "" +"Please enter your PIN, so that the secret key can be unlocked for this " +"session" +msgstr "" +"Bitte geben Sie Ihre PIN ein, so daß der geheime Schlüssel benutzt werden " +"kann" + +#: agent/query.c:359 +msgid "" +"Please enter your passphrase, so that the secret key can be unlocked for " +"this session" +msgstr "" +"Bitte geben Sie Ihr Mantra (Passphrase) ein, so daß der geheime Schlüssel " +"benutzt werden kann" + +#: agent/query.c:417 agent/query.c:429 +msgid "PIN too long" +msgstr "Die PIN ist zu lang" + +#: agent/query.c:418 +msgid "Passphrase too long" +msgstr "Das Matra (Passphrase) ist zu lang" + +#: agent/query.c:426 +msgid "Invalid characters in PIN" +msgstr "Ungültige Zeichen in der PIN" + +#: agent/query.c:431 +msgid "PIN too short" +msgstr "Die PIN ist zu kurz" + +#: agent/query.c:443 +msgid "Bad PIN" +msgstr "Falsche PIN" + +#: agent/query.c:444 +msgid "Bad Passphrase" +msgstr "Falsches Mantra (Passphrase)" + +#: agent/query.c:484 +msgid "Passphrase" +msgstr "Mantra" + +#. TRANSLATORS: This prompt is shown by the Pinentry +#. and has one special property: A "%%0A" is used by +#. Pinentry to insert a line break. The double +#. percent sign is actually needed because it is also +#. a printf format string. If you need to insert a +#. plain % sign, you need to encode it as "%%25". The +#. second "%s" gets replaced by a hexdecimal +#. fingerprint string whereas the first one receives +#. the name as store in the certificate. +#: agent/trustlist.c:306 #, c-format -msgid "WARNING: secret key %s does not have a simple SK checksum\n" -msgstr "WARNUNG: Der geheime Schlssel %s hat keine einfache SK-Prfsumme\n" +msgid "" +"Please verify that the certificate identified as:%%0A \"%s\"%%0Ahas the " +"fingerprint:%%0A %s" +msgstr "" +"Bitte prüfen Sie, daß das Zertifikat mit dem Namen:%%0A \"%s\"%%0Afolgenden " +"Fingerabdruck hat:%%0A %s" -#: g10/export.c:598 -msgid "WARNING: nothing exported\n" -msgstr "WARNUNG: Nichts exportiert\n" +#. TRANSLATORS: "Correct" is the label of a button and intended to +#. be hit if the fingerprint matches the one of the CA. The other +#. button is "the default "Cancel" of the Pinentry. +#: agent/trustlist.c:318 +msgid "Correct" +msgstr "Korrekt" -#: g10/gpg.c:375 +#. TRANSLATORS: This prompt is shown by the Pinentry +#. and has one special property: A "%%0A" is used by +#. Pinentry to insert a line break. The double +#. percent sign is actually needed because it is also +#. a printf format string. If you need to insert a +#. plain % sign, you need to encode it as "%%25". The +#. "%s" gets replaced by the name as store in the +#. certificate. +#: agent/trustlist.c:335 +#, c-format +msgid "" +"Do you ultimately trust%%0A \"%s\"%%0Ato correctly certify user " +"certificates?" +msgstr "" +"Wenn Sie vollständiges Vertrauen haben, daß%%0A \"%s\"%%" +"0ABenutzerzertifikate verläßlich zertifiziert, so antworten Sie mit \"Ja\"" + +#: agent/trustlist.c:343 +msgid "Yes" +msgstr "Ja" + +#: agent/trustlist.c:343 +msgid "No" +msgstr "Nein" + +#: common/sysutils.c:88 +#, c-format +msgid "can't disable core dumps: %s\n" +msgstr "" +"Das Erstellen eines Speicherabzugs (core-dump) kann nicht verhindert werden: " +"%s\n" + +#: common/sysutils.c:183 +#, c-format +msgid "Warning: unsafe ownership on %s \"%s\"\n" +msgstr "WARNUNG: Unsichere Besitzrechte für %s \"%s\"\n" + +#: common/sysutils.c:215 +#, c-format +msgid "Warning: unsafe permissions on %s \"%s\"\n" +msgstr "WARNUNG: Unsichere Zugriffsrechte für %s \"%s\"\n" + +#: common/simple-pwquery.c:310 +msgid "gpg-agent is not available in this session\n" +msgstr "Der gpg-agent ist nicht verfügbar\n" + +#: common/simple-pwquery.c:368 +#, c-format +msgid "can't connect to `%s': %s\n" +msgstr "Verbindung zu `%s' kann nicht aufgebaut werden: %s\n" + +#: common/simple-pwquery.c:379 +msgid "communication problem with gpg-agent\n" +msgstr "Kommunikationsproblem mit gpg-agent\n" + +#: common/simple-pwquery.c:389 +msgid "problem setting the gpg-agent options\n" +msgstr "Beim setzen der gpg-agent Optionen ist ein problem aufgetreten\n" + +#: common/simple-pwquery.c:527 common/simple-pwquery.c:615 +msgid "canceled by user\n" +msgstr "Vom Benutzer abgebrochen\n" + +#: common/simple-pwquery.c:534 common/simple-pwquery.c:621 +msgid "problem with the agent\n" +msgstr "Problem mit dem Agenten\n" + +#: jnlib/logging.c:611 +#, c-format +msgid "you found a bug ... (%s:%d)\n" +msgstr "Sie haben einen Bug (Softwarefehler) gefunden ... (%s:%d)\n" + +#: kbx/kbxutil.c:69 sm/gpgsm.c:241 tools/gpgconf.c:54 msgid "" "@Commands:\n" " " msgstr "" -"@Befehle:\n" +"@Kommandos:\n" " " -#: g10/gpg.c:377 -msgid "|[file]|make a signature" -msgstr "|[Datei]|Eine Unterschrift erzeugen" - -#: g10/gpg.c:378 -msgid "|[file]|make a clear text signature" -msgstr "|[Datei]|Eine Klartextunterschrift erzeugen" - -#: g10/gpg.c:379 -msgid "make a detached signature" -msgstr "Eine abgetrennte Unterschrift erzeugen" - -#: g10/gpg.c:380 -msgid "encrypt data" -msgstr "Daten verschlsseln" - -#: g10/gpg.c:382 -msgid "encryption only with symmetric cipher" -msgstr "Daten symmetrisch verschlsseln" - -#: g10/gpg.c:384 -msgid "decrypt data (default)" -msgstr "Daten entschlsseln (Voreinstellung)" - -#: g10/gpg.c:386 -msgid "verify a signature" -msgstr "Signatur prfen" - -#: g10/gpg.c:388 -msgid "list keys" -msgstr "Liste der Schlssel" - -#: g10/gpg.c:390 -msgid "list keys and signatures" -msgstr "Liste der Schlssel und ihrer Signaturen" - -#: g10/gpg.c:391 -msgid "list and check key signatures" -msgstr "Signaturen der Schlssel auflisten und prfen" - -#: g10/gpg.c:392 -msgid "list keys and fingerprints" -msgstr "Liste der Schlssel und ihrer \"Fingerabdrcke\"" - -#: g10/gpg.c:393 -msgid "list secret keys" -msgstr "Liste der geheimen Schlssel" - -#: g10/gpg.c:394 -msgid "generate a new key pair" -msgstr "Ein neues Schlsselpaar erzeugen" - -#: g10/gpg.c:395 -msgid "remove keys from the public keyring" -msgstr "Schlssel aus dem ff. Schlsselbund entfernen" - -#: g10/gpg.c:397 -msgid "remove keys from the secret keyring" -msgstr "Schlssel aus dem geh. Schlsselbund entfernen" - -#: g10/gpg.c:398 -msgid "sign a key" -msgstr "Schlssel signieren" - -#: g10/gpg.c:399 -msgid "sign a key locally" -msgstr "Schlssel nur fr diesen Rechner signieren" - -#: g10/gpg.c:400 -msgid "sign or edit a key" -msgstr "Unterschreiben oder bearbeiten eines Schl." - -#: g10/gpg.c:401 -msgid "generate a revocation certificate" -msgstr "Ein Schlsselwiderruf-Zertifikat erzeugen" - -#: g10/gpg.c:403 -msgid "export keys" -msgstr "Schlssel exportieren" - -#: g10/gpg.c:404 -msgid "export keys to a key server" -msgstr "Schlssel zu einem Schl.server exportieren" - -#: g10/gpg.c:405 -msgid "import keys from a key server" -msgstr "Schlssel von einem Schl.server importieren" - -#: g10/gpg.c:407 -msgid "search for keys on a key server" -msgstr "Schlssel auf einem Schl.server suchen" - -#: g10/gpg.c:409 -msgid "update all keys from a keyserver" -msgstr "alle Schlssel per Schl.server aktualisieren" - -#: g10/gpg.c:413 -msgid "import/merge keys" -msgstr "Schlssel importieren/kombinieren" - -#: g10/gpg.c:416 -msgid "print the card status" -msgstr "den Karten-Status ausgeben" - -#: g10/gpg.c:417 -msgid "change data on a card" -msgstr "Daten auf einer Karte ndern" - -#: g10/gpg.c:418 -msgid "change a card's PIN" -msgstr "PIN einer Karte ndern" - -#: g10/gpg.c:426 -msgid "update the trust database" -msgstr "ndern der \"Trust\"-Datenbank" - -#: g10/gpg.c:433 -msgid "|algo [files]|print message digests" -msgstr "|algo [Dateien]|Message-Digests fr die Dateien ausgeben" - -#: g10/gpg.c:437 g10/gpgv.c:71 +#: kbx/kbxutil.c:77 sm/gpgsm.c:276 tools/gpgconf.c:60 msgid "" "@\n" "Options:\n" @@ -1138,60 +507,797 @@ msgstr "" "Optionen:\n" " " -#: g10/gpg.c:439 -msgid "create ascii armored output" -msgstr "Ausgabe mit ASCII-Hlle versehen" - -#: g10/gpg.c:441 -msgid "|NAME|encrypt for NAME" -msgstr "|NAME|Verschlsseln fr NAME" - -#: g10/gpg.c:452 -msgid "use this user-id to sign or decrypt" -msgstr "Mit dieser User-ID signieren" - -#: g10/gpg.c:453 -msgid "|N|set compress level N (0 disables)" -msgstr "Kompressionsstufe auf N setzen (0=keine)" - -#: g10/gpg.c:458 -msgid "use canonical text mode" -msgstr "Textmodus benutzen" - -#: g10/gpg.c:472 -msgid "use as output file" -msgstr "Als Ausgabedatei benutzen" - -#: g10/gpg.c:474 g10/gpgv.c:73 -msgid "verbose" -msgstr "Detaillierte Informationen" - -#: g10/gpg.c:485 +#: kbx/kbxutil.c:84 sm/gpgsm.c:342 tools/gpgconf.c:65 msgid "do not make any changes" -msgstr "Keine wirklichen nderungen durchfhren" +msgstr "Keine Änderungen durchführen" -#: g10/gpg.c:486 -msgid "prompt before overwriting" -msgstr "vor berschreiben nachfragen" +#: kbx/kbxutil.c:86 +msgid "set debugging flags" +msgstr "Debug Flags setzen" -#: g10/gpg.c:527 -msgid "use strict OpenPGP behavior" -msgstr "OpenPGP-Verhalten strikt beachten" +#: kbx/kbxutil.c:87 +msgid "enable full debugging" +msgstr "Alle Debug Flags setzen" -#: g10/gpg.c:528 -msgid "generate PGP 2.x compatible messages" -msgstr "PGP 2.x-kompatibele Botschaften erzeugen" +#: kbx/kbxutil.c:108 +msgid "Please report bugs to " +msgstr "Bitte richten sie Berichte über Bugs (Softwarefehler) an " -#: g10/gpg.c:556 +#: kbx/kbxutil.c:108 +msgid ".\n" +msgstr ".\n" + +#: kbx/kbxutil.c:112 +msgid "Usage: kbxutil [options] [files] (-h for help)" +msgstr "Gebrauch: kbxutil [Optionen] [Dateien] (-h für Hilfe)" + +#: kbx/kbxutil.c:115 +msgid "" +"Syntax: kbxutil [options] [files]\n" +"list, export, import Keybox data\n" +msgstr "" +"Syntax: kbxutil [Optionen] [Dateien]\n" +"Anlistem exportieren und Importieren von KeyBox Dateien\n" + +#: scd/scdaemon.c:105 +msgid "run in multi server mode (foreground)" +msgstr "Im Multiserver Modus ausführen" + +#: scd/scdaemon.c:111 sm/gpgsm.c:354 +msgid "read options from file" +msgstr "Konfigurationsoptionen aus Datei lesen" + +#: scd/scdaemon.c:121 +msgid "|N|connect to reader at port N" +msgstr "|N|Verbinde mit dem Leser auf Port N" + +#: scd/scdaemon.c:122 +msgid "|NAME|use NAME as ct-API driver" +msgstr "|NAME|Benutze NAME als CT-API Treiber" + +#: scd/scdaemon.c:123 +msgid "|NAME|use NAME as PC/SC driver" +msgstr "|NAME|Benutze NAME als PC/SC Treiber" + +#: scd/scdaemon.c:126 +msgid "do not use the internal CCID driver" +msgstr "Den internen CCID Treiber nicht benutzen" + +#: scd/scdaemon.c:131 +msgid "do not use a reader's keypad" +msgstr "Die Tastatur des Kartenleser nicht benutzen" + +#: scd/scdaemon.c:132 +msgid "allow the use of admin card commands" +msgstr "Erlaube die Benutzung von \"Admin\" Kommandos" + +#: scd/scdaemon.c:191 +msgid "Usage: scdaemon [options] (-h for help)" +msgstr "Gebrauch: scdaemon [Optionen] (-h für Hilfe)" + +#: scd/scdaemon.c:193 +msgid "" +"Syntax: scdaemon [options] [command [args]]\n" +"Smartcard daemon for GnuPG\n" +msgstr "" +"Synatx: scdaemon [Optionen] [Kommando [Argumente]]\n" +"Smartcard Daemon für GnuPG\n" + +#: scd/scdaemon.c:665 +msgid "please use the option `--daemon' to run the program in the background\n" +msgstr "" +"Bitte die Option `--daemon' nutzen um das Programm im Hintergund " +"auszuführen\n" + +#: scd/scdaemon.c:1006 +#, c-format +msgid "handler for fd %d started\n" +msgstr "Handhabungsroutine für fd %d gestartet\n" + +#: scd/scdaemon.c:1011 +#, c-format +msgid "handler for fd %d terminated\n" +msgstr "Handhabungsroutine für den fd %d beendet\n" + +#: scd/app-openpgp.c:596 +#, c-format +msgid "failed to store the fingerprint: %s\n" +msgstr "Der Fingerprint kann nicht gespeichert werden: %s\n" + +#: scd/app-openpgp.c:609 +#, c-format +msgid "failed to store the creation date: %s\n" +msgstr "Das Erzeugungsdatum kann nicht gespeichert werden: %s\n" + +#: scd/app-openpgp.c:1004 +#, c-format +msgid "reading public key failed: %s\n" +msgstr "Fehler beim Lesen des öffentlichen Schlüssels: %s\n" + +#: scd/app-openpgp.c:1012 scd/app-openpgp.c:1948 +msgid "response does not contain the public key data\n" +msgstr "Die Antwort enthält keine Public Key Daten\n" + +#: scd/app-openpgp.c:1020 scd/app-openpgp.c:1956 +msgid "response does not contain the RSA modulus\n" +msgstr "Die Antwort enthält keinen RSA Modulus\n" + +#: scd/app-openpgp.c:1029 scd/app-openpgp.c:1966 +msgid "response does not contain the RSA public exponent\n" +msgstr "Die Antwort enthält keinen öffenlichen RSA Exponent\n" + +#: scd/app-openpgp.c:1297 scd/app-openpgp.c:1385 scd/app-openpgp.c:2192 +#, c-format +msgid "PIN callback returned error: %s\n" +msgstr "Fehler vom PIN \"callback\": %s\n" + +#: scd/app-openpgp.c:1303 scd/app-openpgp.c:1391 scd/app-openpgp.c:2198 +#, c-format +msgid "PIN for CHV%d is too short; minimum length is %d\n" +msgstr "Die PIN für den CHV%d ist zu kurz; Mindestlänge ist %d\n" + +#: scd/app-openpgp.c:1312 scd/app-openpgp.c:1326 scd/app-openpgp.c:1401 +#: scd/app-openpgp.c:2207 scd/app-openpgp.c:2221 +#, c-format +msgid "verify CHV%d failed: %s\n" +msgstr "Prüfen von CHV%d fehlgeschlagen: %s\n" + +#: scd/app-openpgp.c:1349 +msgid "access to admin commands is not configured\n" +msgstr "Zugriff auf Admin Kommandos ist nicht konfiguriert\n" + +#: scd/app-openpgp.c:1364 scd/app-openpgp.c:2427 +msgid "error retrieving CHV status from card\n" +msgstr "Fehler beim Holen des CHV Status von der Karte\n" + +#: scd/app-openpgp.c:1370 scd/app-openpgp.c:2436 +msgid "card is permanently locked!\n" +msgstr "Die Karte ist dauerhaft gesperrt!\n" + +#: scd/app-openpgp.c:1375 +#, c-format +msgid "%d Admin PIN attempts remaining before card is permanently locked\n" +msgstr "" +"Noch %d Admin PIN Versuche möglich bevor die Karte dauerhaft gesperrt wird\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. +#: scd/app-openpgp.c:1382 +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. +#: scd/app-openpgp.c:1531 +msgid "|AN|New Admin PIN" +msgstr "|AN|Neue Admin PIN" + +#: scd/app-openpgp.c:1531 +msgid "|N|New PIN" +msgstr "|N|Neue PIN" + +#: scd/app-openpgp.c:1535 +#, c-format +msgid "error getting new PIN: %s\n" +msgstr "Fehler beim Holen der neuen PIN: %s\n" + +#: scd/app-openpgp.c:1585 scd/app-openpgp.c:2034 +msgid "error reading application data\n" +msgstr "Fehler beim Lesen der Anwendungsdaten\n" + +#: scd/app-openpgp.c:1591 scd/app-openpgp.c:2041 +msgid "error reading fingerprint DO\n" +msgstr "Fehler beim Lesen des Fingerabdruck Datenobjekts\n" + +#: scd/app-openpgp.c:1601 +msgid "key already exists\n" +msgstr "Schlüssel existiert bereits\n" + +#: scd/app-openpgp.c:1605 +msgid "existing key will be replaced\n" +msgstr "Existierender Schlüssel wird ersetzt\n" + +#: scd/app-openpgp.c:1607 +msgid "generating new key\n" +msgstr "Neuer Schlüssel wird erzeugt\n" + +#: scd/app-openpgp.c:1774 +msgid "creation timestamp missing\n" +msgstr "Erzeugungsdatum fehlt\n" + +#: scd/app-openpgp.c:1781 +#, c-format +msgid "RSA modulus missing or not of size %d bits\n" +msgstr "Der RSA Modulus fehlt oder ist nicht %d Bits lang\n" + +#: scd/app-openpgp.c:1788 +#, c-format +msgid "RSA public exponent missing or larger than %d bits\n" +msgstr "Der öffentliche RSA Exponent fehlt oder ist länger als %d Bits\n" + +#: scd/app-openpgp.c:1796 scd/app-openpgp.c:1803 +#, c-format +msgid "RSA prime %s missing or not of size %d bits\n" +msgstr "Die RSA Primzahl %s fehlt oder ist nicht %d Bits lang\n" + +#: scd/app-openpgp.c:1866 +#, c-format +msgid "failed to store the key: %s\n" +msgstr "Fehler beim Speichern des Schlüssels: %s\n" + +#: scd/app-openpgp.c:1925 +msgid "please wait while key is being generated ...\n" +msgstr "Bitte warten bis der Schlüssel erzeugt wurde ...\n" + +#: scd/app-openpgp.c:1939 +msgid "generating key failed\n" +msgstr "Fehler beim Erzeugen des Schlüssels\n" + +#: scd/app-openpgp.c:1942 +#, c-format +msgid "key generation completed (%d seconds)\n" +msgstr "Schlüsselerzeugung vollendet (%d Sekunden)\n" + +#: scd/app-openpgp.c:1999 +msgid "invalid structure of OpenPGP card (DO 0x93)\n" +msgstr "Ungültige Struktur der OpenPGP Karte (DO 0x93)\n" + +#: scd/app-openpgp.c:2125 +#, c-format +msgid "card does not support digest algorithm %s\n" +msgstr "Der Hashalgorithmus %s wird von der Karte nicht unterstützt\n" + +#: scd/app-openpgp.c:2172 +#, c-format +msgid "signatures created so far: %lu\n" +msgstr "Anzahl bereits erzeugter Signaturen: %lu\n" + +#: scd/app-openpgp.c:2180 +#, c-format +msgid "||Please enter the PIN%%0A[sigs done: %lu]" +msgstr "||Bitte geben Sie die PIN ein%%0A[Sigs bisher: %lu]" + +#: scd/app-openpgp.c:2441 +msgid "" +"verification of Admin PIN is currently prohibited through this command\n" +msgstr "" +"Die Überprüfung der Admin PIN is momentan durch ein Kommando verboten " +"worden\n" + +#: scd/app-openpgp.c:2514 scd/app-openpgp.c:2524 +#, c-format +msgid "can't access %s - invalid OpenPGP card?\n" +msgstr "Zugriff auf %s nicht möglich - ungültige OpenPGP Karte?\n" + +#: scd/app-nks.c:345 +msgid "the NullPIN has not yet been changed\n" +msgstr "Die Nullpin wurde noch nicht geändert\n" + +#: sm/base64.c:318 +#, c-format +msgid "invalid radix64 character %02x skipped\n" +msgstr "Ungültiges Basis-64 Zeichen %02X wurde übergangen\n" + +#: sm/call-agent.c:102 +msgid "no running gpg-agent - starting one\n" +msgstr "Kein aktiver gpg-agent - es wird einer gestarted\n" + +#: sm/call-agent.c:167 +msgid "can't connect to the agent - trying fall back\n" +msgstr "Verbindung zum gpg-agent nicht möglich - Ersatzmethode wird versucht\n" + +#: sm/call-dirmngr.c:182 +#, c-format +msgid "no running dirmngr - starting `%s'\n" +msgstr "Kein aktiver Dirmngr - `%s' wird einer gestartet\n" + +#: sm/call-dirmngr.c:216 +msgid "malformed DIRMNGR_INFO environment variable\n" +msgstr "Die Variable DIRMNGR_INFO ist fehlerhaft\n" + +#: sm/call-dirmngr.c:228 +#, c-format +msgid "dirmngr protocol version %d is not supported\n" +msgstr "Die Dirmngr Protokollversion %d wird nicht unterstützt\n" + +#: sm/call-dirmngr.c:242 +msgid "can't connect to the dirmngr - trying fall back\n" +msgstr "" +"Verbindung zum Dirmngr kann nicht aufgebaut werden - Ersatzmethode wird " +"versucht\n" + +#: sm/certdump.c:61 sm/certdump.c:147 +msgid "none" +msgstr "keine" + +#: sm/certdump.c:156 +msgid "[none]" +msgstr "[keine]" + +#: sm/certdump.c:529 sm/certdump.c:592 +msgid "[Error - invalid encoding]" +msgstr "[Fehler - Ungültige Kodierung]" + +#: sm/certdump.c:537 +msgid "[Error - out of core]" +msgstr "[Fehler - Nich genügend Speicher]" + +#: sm/certdump.c:572 +msgid "[Error - No name]" +msgstr "[Fehler - Kein Name]" + +#: sm/certdump.c:597 +msgid "[Error - invalid DN]" +msgstr "[Fehler - Ungültiger DN]" + +#: sm/certdump.c:758 +#, c-format +msgid "" +"Please enter the passphrase to unlock the secret key for:\n" +"\"%s\"\n" +"S/N %s, ID %08lX, created %s" +msgstr "" +"Bitte geben Sie die Passphrase an, um den \n" +"geheimen Schlüssel von\n" +"\"%s\"\n" +"S/N %s, ID %08lX, erzeugt %s\n" +"zu entsperren" + +#: sm/certlist.c:123 +msgid "no key usage specified - assuming all usages\n" +msgstr "" +"Schlüsselverwendungszweck nicht vorhanden - für alle Zwecke akzeptiert\n" + +#: sm/certlist.c:133 sm/keylist.c:246 +#, c-format +msgid "error getting key usage information: %s\n" +msgstr "Fehler beim holen der Schlüsselbenutzungsinformationen: %s\n" + +#: sm/certlist.c:143 +msgid "certificate should have not been used for certification\n" +msgstr "Das Zertifikat hätte nicht zum Zertifizieren benutzt werden sollen\n" + +#: sm/certlist.c:155 +msgid "certificate should have not been used for OCSP response signing\n" +msgstr "" +"Das Zertifikat hätte nicht zum Signieren von OCSP Antworten benutzt werden " +"sollen\n" + +#: sm/certlist.c:166 +msgid "certificate should have not been used for encryption\n" +msgstr "Das Zertifikat hätte nicht zum Verschlüsseln benutzt werden sollen\n" + +#: sm/certlist.c:167 +msgid "certificate should have not been used for signing\n" +msgstr "Das Zertifikat hätte nicht zum Signieren benutzt werden sollen\n" + +#: sm/certlist.c:168 +msgid "certificate is not usable for encryption\n" +msgstr "Das Zertifikat kann nicht zum Verschlüsseln benutzt werden\n" + +#: sm/certlist.c:169 +msgid "certificate is not usable for signing\n" +msgstr "Das Zertifikat kann nicht zum Signieren benutzt werden\n" + +#: sm/certchain.c:115 +#, c-format +msgid "critical certificate extension %s is not supported" +msgstr "Die kritische Zertifikaterweiterung %s wird nicht unterstützt" + +#: sm/certchain.c:142 +msgid "issuer certificate is not marked as a CA" +msgstr "Das Herausgeberzertifikat ist nicht für eine CA gekennzeichnet" + +#: sm/certchain.c:180 +msgid "critical marked policy without configured policies" +msgstr "kritische Richtlinie ohne konfigurierte Richtlinien" + +#: sm/certchain.c:190 +#, c-format +msgid "failed to open `%s': %s\n" +msgstr "Datei `%s' kann nicht geöffnet werden: %s\n" + +#: sm/certchain.c:197 sm/certchain.c:226 +msgid "note: non-critical certificate policy not allowed" +msgstr "Notiz: Die unkritische Zertifikatrichtlinie ist nicht erlaubt" + +#: sm/certchain.c:201 sm/certchain.c:230 +msgid "certificate policy not allowed" +msgstr "Die Zertifikatrichtlinie ist nicht erlaubt" + +#: sm/certchain.c:341 +msgid "looking up issuer at external location\n" +msgstr "Der Herausgeber wird von einer externen Stelle gesucht\n" + +#: sm/certchain.c:361 +#, c-format +msgid "number of issuers matching: %d\n" +msgstr "Anzahl der übereinstimmenden Heruasgeber: %d\n" + +#: sm/certchain.c:514 sm/certchain.c:678 sm/certchain.c:1116 sm/decrypt.c:261 +#: sm/encrypt.c:342 sm/sign.c:325 sm/verify.c:107 +msgid "failed to allocated keyDB handle\n" +msgstr "Ein keyDB Handle konnte nicht bereitgestellt werden\n" + +#: sm/certchain.c:605 +msgid "certificate has been revoked" +msgstr "Das Zertifikat wurde widerrufen" + +#: sm/certchain.c:614 +msgid "no CRL found for certificate" +msgstr "Keine CRL für das Zertifikat gefunden" + +#: sm/certchain.c:618 +msgid "the available CRL is too old" +msgstr "Die vorhandene CRL ist zu alt" + +#: sm/certchain.c:620 +msgid "please make sure that the \"dirmngr\" is properly installed\n" +msgstr "" +"Bitte vergewissern Sie sich das der \"dirmngr\" richtig installierrt ist\n" + +#: sm/certchain.c:625 +#, c-format +msgid "checking the CRL failed: %s" +msgstr "Die CRL konnte nicht geprüft werden: %s" + +#: sm/certchain.c:698 +msgid "no issuer found in certificate" +msgstr "Im Zertifikat ist kein Herausgeber enthalten" + +#: sm/certchain.c:711 +#, c-format +msgid "certificate with invalid validity: %s" +msgstr "Zertifikat mit unzulässiger Gültigkeit: %s" + +#: sm/certchain.c:727 +msgid "certificate not yet valid" +msgstr "Das Zertifikat ist noch nicht gültig" + +#: sm/certchain.c:740 +msgid "certificate has expired" +msgstr "Das Zertifikat ist abgelaufen" + +#: sm/certchain.c:777 +msgid "self-signed certificate has a BAD signature" +msgstr "Das eigenbeglaubigte Zertifikat hat eine FALSCHE Signatur" + +#: sm/certchain.c:842 +msgid "root certificate is not marked trusted" +msgstr "Das Wurzelzertifikat ist nicht als vertrauenswürdig markiert" + +#: sm/certchain.c:853 +#, c-format +msgid "fingerprint=%s\n" +msgstr "Fingerprint=%s\n" + +#: sm/certchain.c:858 +msgid "root certificate has now been marked as trusted\n" +msgstr "Das Wurzelzertifikat wurde nun als vertrauenswürdig markiert\n" + +#: sm/certchain.c:873 +#, c-format +msgid "checking the trust list failed: %s\n" +msgstr "Fehler beim Prüfen der vertrauenswürdigen Zertifikate: %s\n" + +#: sm/certchain.c:899 sm/import.c:158 +msgid "certificate chain too long\n" +msgstr "Der Zertifikatkette ist zu lang\n" + +#: sm/certchain.c:911 +msgid "issuer certificate not found" +msgstr "Herausgeberzertifikat nicht gefunden" + +#: sm/certchain.c:944 +msgid "certificate has a BAD signature" +msgstr "Das Zertifikat hat eine FALSCHE Signatur" + +#: sm/certchain.c:974 +msgid "found another possible matching CA certificate - trying again" +msgstr "" +"Eine anderes möglicherweise passendes CA-Zertifikat gefunden - versuche " +"nochmal" + +#: sm/certchain.c:997 +#, c-format +msgid "certificate chain longer than allowed by CA (%d)" +msgstr "Die Zertifikatkette ist länger als von der CA erlaubt (%d)" + +#: sm/decrypt.c:128 +msgid "" +"WARNING: message was encrypted with a weak key in the symmetric cipher.\n" +msgstr "" +"WARNUNG: Die Nachricht wurde mich einem schwachen Schlüssel (Weak Key) " +"erzeugt\n" + +#: sm/decrypt.c:326 +msgid "(this is the RC2 algorithm)\n" +msgstr "(Dies ist der RC-2 Algorithmus)\n" + +#: sm/decrypt.c:328 +msgid "(this does not seem to be an encrypted message)\n" +msgstr "(dies is wahrscheinlich keine verschlüsselte Nachricht)\n" + +#: sm/delete.c:52 sm/delete.c:103 +#, c-format +msgid "certificate `%s' not found: %s\n" +msgstr "Zertifikat `%s' nicht gefunden: %s\n" + +#: sm/delete.c:113 sm/keydb.c:1380 sm/keydb.c:1473 +#, c-format +msgid "error locking keybox: %s\n" +msgstr "Fehler beim Sperren der Keybox: %s\n" + +#: sm/delete.c:134 +#, c-format +msgid "duplicated certificate `%s' deleted\n" +msgstr "Doppeltes Zertifikat `%s' gelöscht\n" + +#: sm/delete.c:136 +#, c-format +msgid "certificate `%s' deleted\n" +msgstr "Zertifikat `%s' gelöscht\n" + +#: sm/delete.c:166 +#, c-format +msgid "deleting certificate \"%s\" failed: %s\n" +msgstr "Fehler beim Löschen des Zertifikats \"%s\": %s\n" + +#: sm/encrypt.c:121 +msgid "weak key created - retrying\n" +msgstr "Schwacher Schlüssel - es wird erneut versucht\n" + +#: sm/encrypt.c:333 +msgid "no valid recipients given\n" +msgstr "Keine gültigen Empfänger angegeben\n" + +#: sm/gpgsm.c:243 +msgid "|[FILE]|make a signature" +msgstr "|[DATEI]|Erzeuge eine Signatur" + +#: sm/gpgsm.c:244 +msgid "|[FILE]|make a clear text signature" +msgstr "|[DATEI]|Erzeuge eine Klartextsignatur" + +#: sm/gpgsm.c:245 +msgid "make a detached signature" +msgstr "Erzeuge eine abgetrennte Signatur" + +#: sm/gpgsm.c:246 +msgid "encrypt data" +msgstr "Verschlüssele die Daten" + +#: sm/gpgsm.c:247 +msgid "encryption only with symmetric cipher" +msgstr "Verschlüsselung nur mit symmetrischem Algrithmus" + +#: sm/gpgsm.c:248 +msgid "decrypt data (default)" +msgstr "Enschlüssele die Daten" + +#: sm/gpgsm.c:249 +msgid "verify a signature" +msgstr "Überprüfen einer Signatur" + +#: sm/gpgsm.c:251 +msgid "list keys" +msgstr "Schlüssel anzeigen" + +#: sm/gpgsm.c:252 +msgid "list external keys" +msgstr "Externe Schlüssel anzeigen" + +#: sm/gpgsm.c:253 +msgid "list secret keys" +msgstr "Geheime Schlüssel anzeigen" + +#: sm/gpgsm.c:254 +msgid "list certificate chain" +msgstr "Schlüssel mit Zertifikatekette anzeigen" + +#: sm/gpgsm.c:256 +msgid "list keys and fingerprints" +msgstr "Schlüssel und Fingerprint anzeigen" + +#: sm/gpgsm.c:257 +msgid "generate a new key pair" +msgstr "Neues Schlüsselpaar erzeugen" + +#: sm/gpgsm.c:258 +msgid "remove key from the public keyring" +msgstr "Schlüssel aus dem öffentlichen Schlüsselbund löschen" + +#: sm/gpgsm.c:259 +msgid "export keys to a key server" +msgstr "Schlüssen an eine Schlüsselserver exportieren" + +#: sm/gpgsm.c:260 +msgid "import keys from a key server" +msgstr "Schlüssel von einem Schlüsselserver importieren" + +#: sm/gpgsm.c:261 +msgid "import certificates" +msgstr "Zertifikate importieren" + +#: sm/gpgsm.c:262 +msgid "export certificates" +msgstr "Zertifikate exportieren" + +#: sm/gpgsm.c:263 +msgid "register a smartcard" +msgstr "Smartcard registrieren" + +#: sm/gpgsm.c:264 +msgid "run in server mode" +msgstr "Im Server Modus ausführen" + +#: sm/gpgsm.c:265 +msgid "pass a command to the dirmngr" +msgstr "Das Kommand an den Dirmngr durchreichen" + +#: sm/gpgsm.c:267 +msgid "invoke gpg-protect-tool" +msgstr "Rufe das gpg-protect-tool auf" + +#: sm/gpgsm.c:268 +msgid "change a passphrase" +msgstr "Das Mantra (Passphrase) ändern" + +#: sm/gpgsm.c:278 +msgid "create ascii armored output" +msgstr "Ausgabe mit ASCII Hülle wird erzeugt" + +#: sm/gpgsm.c:280 +msgid "create base-64 encoded output" +msgstr "Ausgabe im Basis-64 format erzeugen" + +#: sm/gpgsm.c:282 +msgid "assume input is in PEM format" +msgstr "Eingabedaten sind im PEM Format" + +#: sm/gpgsm.c:284 +msgid "assume input is in base-64 format" +msgstr "Eingabedaten sind im Basis-64 Format" + +#: sm/gpgsm.c:286 +msgid "assume input is in binary format" +msgstr "Eingabedaten sind im Binärformat" + +#: sm/gpgsm.c:288 +msgid "|NAME|encrypt for NAME" +msgstr "|NAME|Verschlüsseln für NAME" + +#: sm/gpgsm.c:291 +msgid "use system's dirmngr if available" +msgstr "Benutze den System Dirmngr when verfügbar" + +#: sm/gpgsm.c:292 +msgid "never consult a CRL" +msgstr "Niemals eine CRL konsultieren" + +#: sm/gpgsm.c:299 +msgid "check validity using OCSP" +msgstr "Die Gültigkeit mittels OCSP prüfen" + +#: sm/gpgsm.c:302 +msgid "|N|number of certificates to include" +msgstr "|N|Sende N Zertifikate mit" + +#: sm/gpgsm.c:305 +msgid "|FILE|take policy information from FILE" +msgstr "|DATEI|Richtlinieninformationen DATEI entnehmen" + +#: sm/gpgsm.c:308 +msgid "do not check certificate policies" +msgstr "Zertikikatrichtlinien nicht überprüfen" + +#: sm/gpgsm.c:312 +msgid "fetch missing issuer certificates" +msgstr "Fehlende Zertifikate automatisch holen" + +#: sm/gpgsm.c:316 +msgid "|NAME|use NAME as default recipient" +msgstr "|NAME|Benutze NAME als voreingestellten Empfänger" + +#: sm/gpgsm.c:318 +msgid "use the default key as default recipient" +msgstr "Benuzte voreingestellten Schlüssel als Standardempfänger" + +#: sm/gpgsm.c:324 +msgid "use this user-id to sign or decrypt" +msgstr "Benuzte diese Benutzer ID zum Signieren oder Entschlüsseln" + +#: sm/gpgsm.c:327 +msgid "|N|set compress level N (0 disables)" +msgstr "|N|Benutze Komprimierungsstufe N" + +#: sm/gpgsm.c:329 +msgid "use canonical text mode" +msgstr "Kanonischen Textmodus benutzen" + +#: sm/gpgsm.c:332 tools/gpgconf.c:62 +msgid "use as output file" +msgstr "als Ausgabedatei benutzen" + +#: sm/gpgsm.c:335 +msgid "don't use the terminal at all" +msgstr "Das Terminal überhaupt nicht benutzen" + +#: sm/gpgsm.c:339 +msgid "force v3 signatures" +msgstr "Version 3 Signaturen erzwingen" + +#: sm/gpgsm.c:340 +msgid "always use a MDC for encryption" +msgstr "Immer das MDC Verfahren zum verschlüsseln mitbenutzen" + +#: sm/gpgsm.c:345 +msgid "batch mode: never ask" +msgstr "Stapelverarbeitungs Modus: Nie nachfragen" + +#: sm/gpgsm.c:346 +msgid "assume yes on most questions" +msgstr "\"Ja\" auf die meisten Anfragen annehmen" + +#: sm/gpgsm.c:347 +msgid "assume no on most questions" +msgstr "\"Nein\" auf die meisten Anfragen annehmen" + +#: sm/gpgsm.c:349 +msgid "add this keyring to the list of keyrings" +msgstr "Diesen Keyring in die Liste der Keyrings aufnehmen" + +#: sm/gpgsm.c:350 +msgid "add this secret keyring to the list" +msgstr "Diese geheimen Keyring in die Liste aufnehmen" + +#: sm/gpgsm.c:351 +msgid "|NAME|use NAME as default secret key" +msgstr "|NAME|Benutze NAME als voreingestellten Schlüssel" + +#: sm/gpgsm.c:352 +msgid "|HOST|use this keyserver to lookup keys" +msgstr "|HOST|Benutze HOST als Schlüsselserver" + +#: sm/gpgsm.c:353 +msgid "|NAME|set terminal charset to NAME" +msgstr "|NAME|Den Zeichensatz für das Terminal auf NAME setzen" + +#: sm/gpgsm.c:357 +msgid "|LEVEL|set the debugging level to LEVEL" +msgstr "|NAME|Die Debugstufe auf NAME setzen" + +#: sm/gpgsm.c:365 +msgid "|FD|write status info to this FD" +msgstr "|FD|Statusinformationen auf Dateidescriptor FD schreiben" + +#: sm/gpgsm.c:372 +msgid "|FILE|load extension module FILE" +msgstr "|DATEI|Das Erweiterungsmodul DATEI laden" + +#: sm/gpgsm.c:378 +msgid "|NAME|use cipher algorithm NAME" +msgstr "|NAME|Den Verschlüsselungsalgrithmus NAME benutzen" + +#: sm/gpgsm.c:380 +msgid "|NAME|use message digest algorithm NAME" +msgstr "|NAME|Den Hashalgorithmus NAME benutzen" + +#: sm/gpgsm.c:382 +msgid "|N|use compress algorithm N" +msgstr "|N|Den Kompressionsalgorithmus Nummer N benutzen" + +#: sm/gpgsm.c:390 msgid "" "@\n" "(See the man page for a complete listing of all commands and options)\n" msgstr "" "@\n" -"(Auf der \"man\"-Seite ist eine vollstndige Liste aller Kommandos und " -"Optionen)\n" +"(Die \"man\" Seite beschreibt alle Kommands und Optionen)\n" -#: g10/gpg.c:559 +#: sm/gpgsm.c:393 msgid "" "@\n" "Examples:\n" @@ -1205,6437 +1311,441 @@ msgstr "" "@\n" "Beispiele:\n" "\n" -" -se -r Bob [Datei] Signieren und verschlsseln fr Benutzer Bob\n" -" --clearsign [Datei] Eine Klartextsignatur erzeugen\n" -" --detach-sign [Datei] Eine abgetrennte Signatur erzeugen\n" -" --list-keys [Namen] Schlssel anzeigen\n" -" --fingerprint [Namen] \"Fingerabdrcke\" anzeigen\n" +" -se -r Bob [Datei] Signieren und verschlüsseln für Benutzer Bob\\n\n" +" --clearsign [Datei] Eine Klartextsignatur erzeugen\\n\n" +" --detach-sign [Datei] Eine abgetrennte Signatur erzeugen\\n\n" +" --list-keys [Namen] Schlüssel anzeigenn\n" +" --fingerprint [Namen] \"Fingerabdrücke\" anzeigen\\n\n" -#: g10/gpg.c:757 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" +#: sm/gpgsm.c:516 +msgid "Usage: gpgsm [options] [files] (-h for help)" +msgstr "Gebrauch: gpgsm [Optionen] [Dateien] (-h für Hilfe)" -#: g10/gpg.c:774 -msgid "Usage: gpg [options] [files] (-h for help)" -msgstr "Aufruf: gpg [Optionen] [Dateien] (-h fr Hilfe)" - -#: g10/gpg.c:777 +#: sm/gpgsm.c:519 msgid "" -"Syntax: gpg [options] [files]\n" -"sign, check, encrypt or decrypt\n" +"Syntax: gpgsm [options] [files]\n" +"sign, check, encrypt or decrypt using the S/MIME protocol\n" "default operation depends on the input data\n" msgstr "" -"Aufruf: gpg [Optionen] [Dateien]\n" -"Signieren, prfen, verschlsseln, entschlsseln.\n" -"Die voreingestellte Operation ist abhngig von den Eingabedaten\n" +"Gebrauch: gpgsm [Optionen] [Dateien]\n" +"Signieren, prüfen, ver- und entschlüsseln mittels S/MIME protocol\n" -#: g10/gpg.c:788 +#: sm/gpgsm.c:526 msgid "" "\n" "Supported algorithms:\n" msgstr "" "\n" -"Untersttzte Verfahren:\n" +"Unterstützte Algorithmen:\n" -#: g10/gpg.c:791 -msgid "Pubkey: " -msgstr "ff.Schlssel: " +#: sm/gpgsm.c:613 +msgid "usage: gpgsm [options] " +msgstr "Gebrauch: gpgsm [Optionen] " -#: g10/gpg.c:797 g10/keyedit.c:2310 -msgid "Cipher: " -msgstr "Verschl.: " - -#: g10/gpg.c:803 -msgid "Hash: " -msgstr "Hash: " - -#: g10/gpg.c:809 g10/keyedit.c:2356 -msgid "Compression: " -msgstr "Komprimierung: " - -#: g10/gpg.c:892 -msgid "usage: gpg [options] " -msgstr "Aufruf: gpg [Optionen] " - -#: g10/gpg.c:1040 +#: sm/gpgsm.c:678 msgid "conflicting commands\n" -msgstr "Widersprchliche Befehle\n" +msgstr "Widersprechende Kommandos\n" -#: g10/gpg.c:1058 +#: sm/gpgsm.c:694 #, c-format -msgid "no = sign found in group definition `%s'\n" -msgstr "Kein '='-Zeichen in der Gruppendefinition gefunden `%s'\n" +msgid "can't encrypt to `%s': %s\n" +msgstr "Verschlüsseln für `%s' nicht möglich: %s\n" -#: g10/gpg.c:1255 +#: sm/gpgsm.c:768 #, c-format -msgid "WARNING: unsafe ownership on homedir `%s'\n" -msgstr "WARNUNG: Unsicheres Besitzverhltnis des Home-Verzeichnis `%s'\n" +msgid "libksba is too old (need %s, have %s)\n" +msgstr "Die Bibliothek Libksba is nicht aktuell (benötige %s, habe %s)\n" -#: g10/gpg.c:1258 -#, c-format -msgid "WARNING: unsafe ownership on configuration file `%s'\n" -msgstr "WARNUNG: Unsicheres Besitzverhltnis der Konfigurationsdatei `%s'\n" - -#: g10/gpg.c:1261 -#, c-format -msgid "WARNING: unsafe ownership on extension `%s'\n" -msgstr "WARNUNG: Unsicheres Besitzverhltnis auf die Erweiterung `%s'\n" - -#: g10/gpg.c:1267 -#, c-format -msgid "WARNING: unsafe permissions on homedir `%s'\n" -msgstr "WARNUNG: Unsichere Zugriffsrechte des Home-Verzeichnis `%s'\n" - -#: g10/gpg.c:1270 -#, c-format -msgid "WARNING: unsafe permissions on configuration file `%s'\n" -msgstr "WARNUNG: Unsichere Zugriffsrechte der Konfigurationsdatei `%s'\n" - -#: g10/gpg.c:1273 -#, c-format -msgid "WARNING: unsafe permissions on extension `%s'\n" -msgstr "WARNUNG: Unsichere Zugriffsrechte auf die Erweiterung `%s'\n" - -#: g10/gpg.c:1279 -#, c-format -msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n" -msgstr "" -"WARNUNG: Unsicheres Besitzverhltnis des umgebenden Verzeichnisses fr Home-" -"Verzeichnis `%s'\n" - -#: g10/gpg.c:1282 -#, c-format -msgid "" -"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n" -msgstr "" -"WARNUNG: Unsicheres Besitzverhltnis des umgebenden Verzeichnisses der " -"Konfigurationsdatei `%s'\n" - -#: g10/gpg.c:1285 -#, c-format -msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n" -msgstr "" -"WARNUNG: Unsicheres Besitzverhltnis des umgebenden Verzeichnisses `%s'\n" - -#: g10/gpg.c:1291 -#, 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:1294 -#, 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:1297 -#, 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:1438 -#, c-format -msgid "unknown configuration item `%s'\n" -msgstr "Unbekanntes Konfigurationselement `%s'\n" - -#: g10/gpg.c:1531 -msgid "display photo IDs during key listings" -msgstr "" - -#: g10/gpg.c:1533 -msgid "show policy URLs during signature listings" -msgstr "" - -#: g10/gpg.c:1535 -msgid "show all notations during signature listings" -msgstr "Alle Notationen mit den Signaturen anlisten" - -#: g10/gpg.c:1537 -msgid "show IETF standard notations during signature listings" -msgstr "" - -#: g10/gpg.c:1541 -msgid "show user-supplied notations during signature listings" -msgstr "" - -#: g10/gpg.c:1543 -msgid "show preferred keyserver URLs during signature listings" -msgstr "Der bevorzugten Schlsselserver mit den Signaturen anlisten" - -#: g10/gpg.c:1545 -msgid "show user ID validity during key listings" -msgstr "" - -#: g10/gpg.c:1547 -msgid "show revoked and expired user IDs in key listings" -msgstr "" - -#: g10/gpg.c:1549 -msgid "show revoked and expired subkeys in key listings" -msgstr "" - -#: g10/gpg.c:1551 -msgid "show the keyring name in key listings" -msgstr "Anzeigen des Schlsselbundes, in dem ein Schlssel drin ist" - -#: g10/gpg.c:1553 -msgid "show expiration dates during signature listings" -msgstr "Das Ablaufdatum mit den Signaturen anlisten" - -#: g10/gpg.c:1920 -#, c-format -msgid "NOTE: old default options file `%s' ignored\n" -msgstr "Hinweis: Alte voreingestellte Optionendatei '%s' wurde ignoriert\n" - -#: g10/gpg.c:1962 -#, c-format -msgid "NOTE: no default option file `%s'\n" -msgstr "Hinweis: Keine voreingestellte Optionendatei '%s' vorhanden\n" - -#: g10/gpg.c:1966 -#, c-format -msgid "option file `%s': %s\n" -msgstr "Optionendatei '%s': %s\n" - -#: g10/gpg.c:1973 -#, c-format -msgid "reading options from `%s'\n" -msgstr "Optionen werden aus '%s' gelesen\n" - -#: g10/gpg.c:2188 g10/gpg.c:2814 g10/gpg.c:2833 -#, c-format -msgid "NOTE: %s is not for normal use!\n" -msgstr "Hinweis: %s ist nicht fr den blichen Gebrauch gedacht!\n" - -#: g10/gpg.c:2201 -#, c-format -msgid "cipher extension `%s' not loaded due to unsafe permissions\n" -msgstr "" -"Verschlsselungserweiterung `%s' wurde wegen unsicherer Zugriffsrechte nicht " -"geladen\n" - -#: g10/gpg.c:2364 g10/gpg.c:2376 -#, c-format -msgid "`%s' is not a valid signature expiration\n" -msgstr "`%s' ist kein gltiges Unterschriftablaufdatum\n" - -#: g10/gpg.c:2452 -#, c-format -msgid "`%s' is not a valid character set\n" -msgstr "`%s' ist kein gltiger Zeichensatz\n" - -#: g10/gpg.c:2476 g10/gpg.c:2663 g10/keyedit.c:4064 -msgid "could not parse keyserver URL\n" -msgstr "Schlsselserver-URL konnte nicht analysiert werden\n" - -#: g10/gpg.c:2488 -#, c-format -msgid "%s:%d: invalid keyserver options\n" -msgstr "%s:%d: ungltige Schlsselserver-Option\n" - -#: g10/gpg.c:2491 -msgid "invalid keyserver options\n" -msgstr "Ungltige Schlsselserver-Option\n" - -#: g10/gpg.c:2498 -#, c-format -msgid "%s:%d: invalid import options\n" -msgstr "%s:%d: ungltige Import-Option\n" - -#: g10/gpg.c:2501 -msgid "invalid import options\n" -msgstr "Ungltige Import-Option\n" - -#: g10/gpg.c:2508 -#, c-format -msgid "%s:%d: invalid export options\n" -msgstr "%s:%d: ungltige Export-Option.\n" - -#: g10/gpg.c:2511 -msgid "invalid export options\n" -msgstr "Ungltige Export-Option\n" - -#: g10/gpg.c:2518 -#, c-format -msgid "%s:%d: invalid list options\n" -msgstr "%s:%d: ungltige Listen-Option.\n" - -#: g10/gpg.c:2521 -msgid "invalid list options\n" -msgstr "Ungltige Listen-Option\n" - -#: g10/gpg.c:2529 -msgid "display photo IDs during signature verification" -msgstr "" - -#: g10/gpg.c:2531 -msgid "show policy URLs during signature verification" -msgstr "" - -#: g10/gpg.c:2533 -msgid "show all notations during signature verification" -msgstr "Alle Notationen wahrend der Signaturprfung anzeigen" - -#: g10/gpg.c:2535 -msgid "show IETF standard notations during signature verification" -msgstr "" - -#: g10/gpg.c:2539 -msgid "show user-supplied notations during signature verification" -msgstr "" - -#: g10/gpg.c:2541 -msgid "show preferred keyserver URLs during signature verification" -msgstr "" -"Die URL fr den bevorzugten Schlsselserver whrend der Signaturprfung " -"anzeigen" - -#: g10/gpg.c:2543 -msgid "show user ID validity during signature verification" -msgstr "Die Gltigkeit der User-ID whrend der Signaturprfung anzeigen" - -#: g10/gpg.c:2545 -msgid "show revoked and expired user IDs in signature verification" -msgstr "" - -#: g10/gpg.c:2547 -msgid "validate signatures with PKA data" -msgstr "" - -#: g10/gpg.c:2549 -msgid "elevate the trust of signatures with valid PKA data" -msgstr "" - -#: g10/gpg.c:2556 -#, c-format -msgid "%s:%d: invalid verify options\n" -msgstr "%s:%d: ungltige berprfuns-Option.\n" - -#: g10/gpg.c:2559 -msgid "invalid verify options\n" -msgstr "Ungltige berprfungs-Option\n" - -#: g10/gpg.c:2566 -#, c-format -msgid "unable to set exec-path to %s\n" -msgstr "Der Ausfhrungspfad konnte nicht auf %s gesetzt werden.\n" - -#: g10/gpg.c:2729 -#, fuzzy, c-format -msgid "%s:%d: invalid auto-key-locate list\n" -msgstr "%s:%d: ungltige berprfuns-Option.\n" - -#: g10/gpg.c:2732 -msgid "invalid auto-key-locate list\n" -msgstr "" - -#: g10/gpg.c:2803 +#: sm/gpgsm.c:1229 msgid "WARNING: program may create a core file!\n" -msgstr "WARNUNG: Programm knnte eine core-dump-Datei schreiben!\n" +msgstr "WARNUNG: Programm könnte eine core-dump-Datei schreiben!\n" -#: g10/gpg.c:2807 -#, c-format -msgid "WARNING: %s overrides %s\n" -msgstr "WARNUNG: %s ersetzt %s\n" +#: sm/gpgsm.c:1246 +msgid "WARNING: running with faked system time: " +msgstr "WARNUNG: Ausführung mit gefälschter Systemzeit: " -#: g10/gpg.c:2816 -#, c-format -msgid "%s not allowed with %s!\n" -msgstr "%s kann nicht zusammen mit %s verwendet werden!\n" - -#: g10/gpg.c:2819 -#, c-format -msgid "%s makes no sense with %s!\n" -msgstr "%s zusammen mit %s ist nicht sinnvoll!\n" - -#: g10/gpg.c:2826 -#, 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:2841 -#, fuzzy, c-format -msgid "will not run with insecure memory due to %s\n" -msgstr "schreiben des geheimen Schlssels nach '%s'\n" - -#: g10/gpg.c:2855 -msgid "you can only make detached or clear signatures while in --pgp2 mode\n" -msgstr "" -"Im --pgp2-Modus knnen Sie nur abgetrennte oder Klartextunterschriften " -"machen\n" - -#: g10/gpg.c:2861 -msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n" -msgstr "" -"Im --pgp2-Modus knnen Sie nicht gleichzeitig unterschreiben und " -"verschlsseln\n" - -#: g10/gpg.c:2867 -msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n" -msgstr "" -"Im --pgp2-Modus mssen Sie Dateien benutzen und knnen keine Pipes " -"verwenden.\n" - -#: g10/gpg.c:2880 -msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n" -msgstr "" -"Verschlssen einer Botschaft bentigt im --pgp2-Modus die IDEA-" -"Verschlsselung\n" - -#: g10/gpg.c:2947 g10/gpg.c:2971 +#: sm/gpgsm.c:1272 msgid "selected cipher algorithm is invalid\n" -msgstr "Das ausgewhlte Verschlsselungsverfahren ist ungltig\n" +msgstr "Das ausgewählte Verschlüsselungsverfahren ist ungültig\n" -#: g10/gpg.c:2953 g10/gpg.c:2977 +#: sm/gpgsm.c:1280 msgid "selected digest algorithm is invalid\n" -msgstr "Das ausgewhlte Hashverfahren ist ungltig\n" +msgstr "Das ausgewählte Hashverfahren ist ungültig\n" -#: g10/gpg.c:2959 -msgid "selected compression algorithm is invalid\n" -msgstr "Das ausgewhlte Komprimierungsverfahren ist ungltig\n" - -#: g10/gpg.c:2965 -msgid "selected certification digest algorithm is invalid\n" -msgstr "Das ausgewhlte Hashverfahren ist ungltig\n" - -#: g10/gpg.c:2980 -msgid "completes-needed must be greater than 0\n" -msgstr "completes-needed mssen grer als 0 sein\n" - -#: g10/gpg.c:2982 -msgid "marginals-needed must be greater than 1\n" -msgstr "marginals-needed mssen grer als 1 sein\n" - -#: g10/gpg.c:2984 -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:2986 -msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n" -msgstr "ungltiger \"default-cert-level\"; Wert mu 0, 1, 2 oder 3 sein\n" - -#: g10/gpg.c:2988 -msgid "invalid min-cert-level; must be 1, 2, or 3\n" -msgstr "ungltiger \"min-cert-level\"; Wert mu 0, 1, 2 oder 3 sein\n" - -#: g10/gpg.c:2991 -msgid "NOTE: simple S2K mode (0) is strongly discouraged\n" -msgstr "Hinweis: Vom \"simple S2K\"-Modus (0) ist strikt abzuraten\n" - -#: g10/gpg.c:2995 -msgid "invalid S2K mode; must be 0, 1 or 3\n" -msgstr "ungltiger \"simple S2K\"-Modus; Wert mu 0, 1 oder 3 sein\n" - -#: g10/gpg.c:3002 -msgid "invalid default preferences\n" -msgstr "ungltige Standard Voreinstellungen\n" - -#: g10/gpg.c:3011 -msgid "invalid personal cipher preferences\n" -msgstr "ungltige private Verschlsselungsvoreinstellungen\n" - -#: g10/gpg.c:3015 -msgid "invalid personal digest preferences\n" -msgstr "ungltige private Hashvoreinstellungen\n" - -#: g10/gpg.c:3019 -msgid "invalid personal compress preferences\n" -msgstr "ungltige private Komprimierungsvoreinstellungen\n" - -#: g10/gpg.c:3052 +#: sm/gpgsm.c:1310 #, c-format -msgid "%s does not yet work with %s\n" -msgstr "%s arbeitet noch nicht mit %s zusammen\n" +msgid "can't sign using `%s': %s\n" +msgstr "Signieren mit `%s' nicht möglich: %s\n" -#: g10/gpg.c:3099 +#: sm/gpgsm.c:1483 +msgid "this command has not yet been implemented\n" +msgstr "Dieses Kommando wurde noch nicht implementiert\n" + +#: sm/gpgsm.c:1713 sm/gpgsm.c:1750 sm/qualified.c:74 #, c-format -msgid "you may not use cipher algorithm `%s' while in %s mode\n" -msgstr "" -"Die Benutzung des Verschlsselungsverfahren %s ist im %s-Modus nicht " -"erlaubt.\n" +msgid "can't open `%s': %s\n" +msgstr "Datei `%s' kann nicht geöffnet werden: %s\n" -#: g10/gpg.c:3104 +#: sm/import.c:110 #, 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" +msgid "total number processed: %lu\n" +msgstr "gesamte verarbeitete Anzahl: %lu\n" -#: g10/gpg.c:3109 -#, 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:3208 -#, c-format -msgid "failed to initialize the TrustDB: %s\n" -msgstr "Die Trust-DB kann nicht initialisiert werden: %s\n" - -#: g10/gpg.c:3219 -msgid "WARNING: recipients (-r) given without using public key encryption\n" -msgstr "" -"WARNUNG: Empfnger (-r) angegeben ohne Verwendung von Public-Key-Verfahren\n" - -#: g10/gpg.c:3230 -msgid "--store [filename]" -msgstr "--store [Dateiname]" - -#: g10/gpg.c:3237 -msgid "--symmetric [filename]" -msgstr "--symmetric [Dateiname]" - -#: g10/gpg.c:3239 -#, c-format -msgid "symmetric encryption of `%s' failed: %s\n" -msgstr "Symmetrische Entschlsselung von `%s' fehlgeschlagen: %s\n" - -#: g10/gpg.c:3249 -msgid "--encrypt [filename]" -msgstr "--encrypt [Dateiname]" - -#: g10/gpg.c:3262 -msgid "--symmetric --encrypt [filename]" -msgstr "--symmetric --encrypt [Dateiname]" - -#: g10/gpg.c:3264 -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:3267 -#, 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:3285 -msgid "--sign [filename]" -msgstr "--sign [Dateiname]" - -#: g10/gpg.c:3298 -msgid "--sign --encrypt [filename]" -msgstr "--sign --encrypt [Dateiname]" - -#: g10/gpg.c:3313 -msgid "--symmetric --sign --encrypt [filename]" -msgstr "--symmetric --sign --encrypt [Dateiname]" - -#: g10/gpg.c:3315 -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:3318 -#, 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:3338 -msgid "--sign --symmetric [filename]" -msgstr "--sign --symmetric [Dateiname]" - -#: g10/gpg.c:3347 -msgid "--clearsign [filename]" -msgstr "--clearsign [Dateiname]" - -#: g10/gpg.c:3372 -msgid "--decrypt [filename]" -msgstr "--decrypt [Dateiname]" - -#: g10/gpg.c:3380 -msgid "--sign-key user-id" -msgstr "--sign-key User-ID" - -#: g10/gpg.c:3384 -msgid "--lsign-key user-id" -msgstr "--lsign-key User-ID" - -#: g10/gpg.c:3405 -msgid "--edit-key user-id [commands]" -msgstr "--edit-key User-ID [Befehle]" - -#: g10/gpg.c:3476 -msgid "-k[v][v][v][c] [user-id] [keyring]" -msgstr "-k[v][v][v][c] [User-ID] [Schlsselbund]" - -#: g10/gpg.c:3518 -#, c-format -msgid "keyserver send failed: %s\n" -msgstr "Senden an Schlsselserver fehlgeschlagen: %s\n" - -#: g10/gpg.c:3520 -#, c-format -msgid "keyserver receive failed: %s\n" -msgstr "Empfangen vom Schlsselserver fehlgeschlagen: %s\n" - -#: g10/gpg.c:3522 -#, c-format -msgid "key export failed: %s\n" -msgstr "Schlsselexport fehlgeschlagen: %s\n" - -#: g10/gpg.c:3533 -#, c-format -msgid "keyserver search failed: %s\n" -msgstr "Suche auf dem Schlsselserver fehlgeschlagen: %s\n" - -#: g10/gpg.c:3543 -#, c-format -msgid "keyserver refresh failed: %s\n" -msgstr "Refresh vom Schlsselserver fehlgeschlagen: %s\n" - -#: g10/gpg.c:3594 -#, c-format -msgid "dearmoring failed: %s\n" -msgstr "Entfernen der ASCII-Hlle ist fehlgeschlagen: %s\n" - -#: g10/gpg.c:3602 -#, c-format -msgid "enarmoring failed: %s\n" -msgstr "Anbringen der ASCII-Hlle ist fehlgeschlagen: %s\n" - -#: g10/gpg.c:3689 -#, c-format -msgid "invalid hash algorithm `%s'\n" -msgstr "Ungltiges Hashverfahren '%s'\n" - -#: g10/gpg.c:3812 -msgid "[filename]" -msgstr "[Dateiname]" - -#: g10/gpg.c:3816 -msgid "Go ahead and type your message ...\n" -msgstr "Auf geht's - Botschaft eintippen ...\n" - -#: g10/gpg.c:4120 -msgid "the given certification policy URL is invalid\n" -msgstr "Die angegebene Zertifikat-Richtlinien-URL ist ungltig\n" - -#: g10/gpg.c:4122 -msgid "the given signature policy URL is invalid\n" -msgstr "Die angegebene Unterschriften-Richtlinien-URL ist ungltig\n" - -#: g10/gpg.c:4155 -#, fuzzy -msgid "the given preferred keyserver URL is invalid\n" -msgstr "Die angegebene Unterschriften-Richtlinien-URL ist ungltig\n" - -#: g10/getkey.c:152 -msgid "too many entries in pk cache - disabled\n" -msgstr "zu viele Eintrge 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 "" -"Ungltiger Schlssel %s, gltig gemacht per --allow-non-selfsigned-uid\n" - -#: g10/getkey.c:2380 g10/keyedit.c:3707 -#, c-format -msgid "no secret subkey for public subkey %s - ignoring\n" -msgstr "" -"Kein privater Unterschlssel zum ffentlichen Unterschlssel %s - " -"bergangen\n" - -#: g10/getkey.c:2611 -#, c-format -msgid "using subkey %s instead of primary key %s\n" -msgstr "der Zweitschlssel %s wird anstelle des Hauptschlssels %s verwendet\n" - -#: g10/getkey.c:2658 -#, fuzzy, c-format -msgid "key %s: secret key without public key - skipped\n" -msgstr "" -"Schlssel %08lX: geheimer Schlssel, aber ohne ffentlichen Schlssel - " -"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 "Schlssel aus diesem Schlsselbund 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 fr 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 mssen 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 Schlsseln\n" -"uneingeschrnkt vertraut wird. Das sind blicherweise die Schlssel\n" -"auf deren geheimen Schlssel Sie Zugruff haben.\n" -"Antworten Sie mit \"yes\" um diesen Schlssel uneingeschrnkt zu vertrauen\n" - -#: g10/helptext.c:62 -msgid "If you want to use this untrusted key anyway, answer \"yes\"." -msgstr "" -"Wenn Sie diesen nicht vertrauenswrdigen Schlssel 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 Schlssel zum unterschreiben\n" -"und verschlsseln 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 "Whlen Sie die gewnschte Schlssellnge" - -#: 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 bentigten Wert so an, wie er im Prompt erscheint.\n" -"Es ist zwar mglich ein \"ISO\"-Datum (JJJJ-MM-DD) einzugeben, aber man\n" -"erhlt 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 Schlsselinhabers 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 Schlsselerzeugung fortzusetzen.\n" -"B um die Schlsselerzeugung 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 Unterschlssel 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 Schlssels beglaubigen wollen, sollten Sie " -"zunchst\n" -"sicherstellen, da der Schlssel demjenigen gehrt, der in der User-ID " -"genannt\n" -"ist. Fr Dritte ist es hilfreich zu wissen, wie gut diese Zuordnung " -"berprft\n" -"wurde.\n" -"\n" -"\"0\" zeigt, da Sie keine bestimmte Aussage ber die Sorgfalt der \n" -" Schlsselzuordnung machen.\n" -"\n" -"\"1\" Sie glauben, da der Schlssel der benannten Person gehrt,\n" -" aber Sie konnten oder nahmen die berpfung berhaupt nicht vor.\n" -" Dies ist hilfreich fr eine \"persona\"-berprfung, wobei man den\n" -" Schlssel eines Pseudonym-Trgers beglaubigt\n" -"\n" -"\"2\" Sie nahmen eine flchtige berprfung vor. Das heit Sie haben z.B.\n" -" den Schlsselfingerabdruck kontrolliert und die User-ID des Schlssels\n" -" anhand des Fotos geprft.\n" -"\n" -"\"3\" Sie haben eine ausfhrlich Kontrolle des Schlssels vorgenommen.\n" -" Das kann z.B. die Kontrolle des Schlsselfingerabdrucks mit dem\n" -" Schlsselinhaber persnlich vorgenommen haben; da Sie die User-ID des\n" -" Schlssel anhand einer schwer zu flschenden Urkunde mit Foto (wie z.B.\n" -" einem Pa) abgeglichen haben und schlielich per Email-Verkehr die\n" -" Email-Adresse als zum Schlsselbesitzer gehrig erkannt haben.\n" -"\n" -"Beachten Sie, da diese Beispiele fr die Antworten 2 und 3 *nur* Beispiele\n" -"sind. Schluendlich ist es Ihre Sache, was Sie unter \"flchtig\" oder\n" -" \"ausfhrlich\" verstehen, wenn Sie Schlssel Dritter beglaubigen.\n" -"\n" -"Wenn Sie nicht wissen, wie Sie antworten sollen, whlen 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 LSCHEN.\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 Unterschlssel zu lschen" - -#: 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 gltige Beglaubigung fr den Schlssel. Es ist normalerweise\n" -"unntig sie zu lschen. Sie ist mglicherweise sogar notwendig, um einen\n" -"Trust-Weg zu diesem oder einem durch diesen Schlssel beglaubigten " -"Schlssel\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 geprft werden, da Sie den passenden " -"Schlssel\n" -"nicht besitzen. Sie sollten die Lschung der Beglaubigung verschieben, bis\n" -"sie wissen, welcher Schlssel verwendet wurde. Denn vielleicht wrde 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 ungltig. Es ist sinnvoll sie aus Ihrem\n" -"Schlsselbund 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 Schlssel. Normalerweise ist\n" -"es nicht gut, solche Beglaubigungen zu entfernen. Um ehrlich zu sein:\n" -"Es knnte dann sein, da GnuPG diesen Schlssel gar nicht mehr benutzen " -"kann.\n" -"Sie sollten diese Eigenbeglaubigung also nur dann entfernen, wenn sie aus\n" -"irgendeinem Grund nicht gltig ist und eine zweite Beglaubigung verfgbar " -"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 ausgewhlten)\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 gehrt" - -#: 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 mchten" - -#: 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 bettigen, 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 fr die Zertifizierung angeben. Je nach\n" -"Zusammenhang knnen Sie aus dieser Liste auswhlen:\n" -" \"Schlssel wurde kompromitiert\"\n" -" Falls Sie Grund zu der Annahme haben, da nicht berechtigte Personen\n" -" Zugriff zu Ihrem geheimen Schlssel hatten\n" -" \"Schlssel ist berholt\"\n" -" Falls Sie diesen Schlssel durch einem neuen ersetzt haben.\n" -" \"Schlssel wird nicht mehr benutzt\"\n" -" Falls Sie diesen Schlssel zurckgezogen haben.\n" -" \"User-ID ist nicht mehr gltig\"\n" -" Um bekanntzugeben, da die User-ID nicht mehr benutzt werden soll.\n" -" So weist man normalerweise auf eine ungltige 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 mchten, knnen Sie hier einen Text eingeben, der darlegt, warum\n" -"Sie diesen Widerruf herausgeben. Der Text sollte mglichst 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 fr '%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 Schlssel pat nicht zum geheimen Schlssel!\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 Schlssel" - -#: g10/import.c:108 -msgid "remove as much as possible from key after import" -msgstr "" - -#: g10/import.c:266 -#, c-format -msgid "skipping block of type %d\n" -msgstr "berspringe den Block vom Typ %d\n" - -#: g10/import.c:275 -#, c-format -msgid "%lu keys processed so far\n" -msgstr "%lu Schlssel bislang bearbeitet\n" - -#: g10/import.c:292 -#, c-format -msgid "Total number processed: %lu\n" -msgstr "Anzahl insgesamt bearbeiteter Schlssel: %lu\n" - -#: g10/import.c:294 -#, c-format -msgid " skipped new keys: %lu\n" -msgstr " ignorierte neue Schlssel: %lu\n" - -#: g10/import.c:297 -#, c-format -msgid " w/o user IDs: %lu\n" -msgstr " ohne User-ID: %lu\n" - -#: g10/import.c:299 +#: sm/import.c:113 #, c-format msgid " imported: %lu" -msgstr " importiert: %lu" +msgstr " importiert: %lu" -#: g10/import.c:305 +#: sm/import.c:117 #, c-format msgid " unchanged: %lu\n" -msgstr " unverndert: %lu\n" +msgstr " nicht geändert: %lu\n" -#: g10/import.c:307 -#, c-format -msgid " new user IDs: %lu\n" -msgstr " neue User-IDs: %lu\n" - -#: g10/import.c:309 -#, c-format -msgid " new subkeys: %lu\n" -msgstr " neue Unterschlssel: %lu\n" - -#: g10/import.c:311 -#, c-format -msgid " new signatures: %lu\n" -msgstr " neue Signaturen: %lu\n" - -#: g10/import.c:313 -#, c-format -msgid " new key revocations: %lu\n" -msgstr " neue Schlsselwiderrufe: %lu\n" - -#: g10/import.c:315 +#: sm/import.c:119 #, c-format msgid " secret keys read: %lu\n" -msgstr " gelesene geheime Schlssel: %lu\n" +msgstr " gelesene private Schlüssel: %lu\n" -#: g10/import.c:317 +#: sm/import.c:121 #, c-format msgid " secret keys imported: %lu\n" -msgstr " geheime Schlssel importiert: %lu\n" +msgstr "importierte priv. Schlüssel: %lu\n" -#: g10/import.c:319 +#: sm/import.c:123 #, c-format msgid " secret keys unchanged: %lu\n" -msgstr " unvernderte geh.Schl.: %lu\n" +msgstr "ungeänderte priv. Schlüssel: %lu\n" -#: g10/import.c:321 +#: sm/import.c:125 #, c-format msgid " not imported: %lu\n" -msgstr " nicht importiert: %lu\n" +msgstr " nicht importiert: %lu\n" -#: g10/import.c:323 -#, fuzzy, c-format -msgid " signatures cleaned: %lu\n" -msgstr " neue Signaturen: %lu\n" +#: sm/import.c:227 +msgid "error storing certificate\n" +msgstr "Fehler beim speichern des Zertifikats\n" -#: g10/import.c:325 -#, fuzzy, c-format -msgid " user IDs cleaned: %lu\n" -msgstr " gelesene geheime Schlssel: %lu\n" +#: sm/import.c:235 +msgid "basic certificate checks failed - not imported\n" +msgstr "Grundlegende Zertifikatprüfungen fehlgeschlagen - nicht importiert\n" -#: g10/import.c:566 +#: sm/import.c:421 sm/import.c:453 #, c-format -msgid "WARNING: key %s contains preferences for unavailable\n" -msgstr "WARNING: Schlssel %s hat Einstellungen zu nicht verfgbaren\n" +msgid "error importing certificate: %s\n" +msgstr "Fehler beim Importieren des Zertifikats: %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:570 -#, fuzzy -msgid " algorithms on these user IDs:\n" -msgstr " Algorithmen fr diese User IDs:\n" - -#: g10/import.c:607 -#, c-format -msgid " \"%s\": preference for cipher algorithm %s\n" -msgstr "" - -#: g10/import.c:619 -#, fuzzy, c-format -msgid " \"%s\": preference for digest algorithm %s\n" -msgstr "%s Unterschrift, Hashmethode \"%s\"\n" - -#: g10/import.c:631 -#, fuzzy, c-format -msgid " \"%s\": preference for compression algorithm %s\n" -msgstr "Das ausgewhlte Komprimierungsverfahren ist ungltig\n" - -#: g10/import.c:644 -msgid "it is strongly suggested that you update your preferences and\n" -msgstr "" - -#: g10/import.c:646 -msgid "re-distribute this key to avoid potential algorithm mismatch problems\n" -msgstr "" - -#: g10/import.c:670 -#, c-format -msgid "you can update your preferences with: gpg --edit-key %s updpref save\n" -msgstr "" - -#: g10/import.c:720 g10/import.c:1118 -#, c-format -msgid "key %s: no user ID\n" -msgstr "Schlssel %s: Keine User-ID\n" - -#: g10/import.c:749 -#, c-format -msgid "key %s: PKS subkey corruption repaired\n" -msgstr "Schlssel %s: PKS Unterschlsseldefekt repariert\n" - -#: g10/import.c:764 -#, c-format -msgid "key %s: accepted non self-signed user ID \"%s\"\n" -msgstr "Schlssel %s: Nicht eigenbeglaubigte User-ID `%s' bernommen\n" - -#: g10/import.c:770 -#, fuzzy, c-format -msgid "key %s: no valid user IDs\n" -msgstr "Schlssel %08lX: Keine gltigen User-IDs\n" - -#: g10/import.c:772 -msgid "this may be caused by a missing self-signature\n" -msgstr "dies knnte durch fehlende Eigenbeglaubigung verursacht worden sein\n" - -#: g10/import.c:782 g10/import.c:1240 -#, fuzzy, c-format -msgid "key %s: public key not found: %s\n" -msgstr "Schlssel %08lX: ffentlicher Schlssel nicht gefunden: %s\n" - -#: g10/import.c:788 -#, fuzzy, c-format -msgid "key %s: new key - skipped\n" -msgstr "Schlssel %08lX: neuer Schlssel - bersprungen\n" - -#: g10/import.c:797 -#, c-format -msgid "no writable keyring found: %s\n" -msgstr "kein schreibbarer Schlsselbund gefunden: %s\n" - -#: g10/import.c:802 g10/openfile.c:267 g10/sign.c:831 g10/sign.c:1135 -#, c-format -msgid "writing to `%s'\n" -msgstr "Schreiben nach '%s'\n" - -#: g10/import.c:806 g10/import.c:901 g10/import.c:1158 g10/import.c:1301 -#: g10/import.c:2363 g10/import.c:2385 -#, c-format -msgid "error writing keyring `%s': %s\n" -msgstr "Fehler beim Schreiben des Schlsselbundes `%s': %s\n" - -#: g10/import.c:825 -#, fuzzy, c-format -msgid "key %s: public key \"%s\" imported\n" -msgstr "Schlssel %08lX: ffentlicher Schlssel \"%s\" importiert\n" - -#: g10/import.c:849 -#, fuzzy, c-format -msgid "key %s: doesn't match our copy\n" -msgstr "Schlssel %08lX: Stimmt nicht mit unserer Kopie berein\n" - -#: g10/import.c:866 g10/import.c:1258 -#, fuzzy, c-format -msgid "key %s: can't locate original keyblock: %s\n" -msgstr "" -"Schlssel %08lX: der lokale originale Schlsselblocks wurde nicht gefunden: %" -"s\n" - -#: g10/import.c:874 g10/import.c:1265 -#, fuzzy, c-format -msgid "key %s: can't read original keyblock: %s\n" -msgstr "" -"Schlssel %08lX: Lesefehler im lokalen originalen Schlsselblocks: %s\n" - -#: g10/import.c:911 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new user ID\n" -msgstr "Schlssel %08lX: \"%s\" 1 neue User-ID\n" - -#: g10/import.c:914 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new user IDs\n" -msgstr "Schlssel %08lX: \"%s\" %d neue User-IDs\n" - -#: g10/import.c:917 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new signature\n" -msgstr "Schlssel %08lX: \"%s\" 1 neue Signatur\n" - -#: g10/import.c:920 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new signatures\n" -msgstr "Schlssel %08lX: \"%s\" %d neue Signaturen\n" - -#: g10/import.c:923 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new subkey\n" -msgstr "Schlssel %08lX: \"%s\" 1 neuer Unterschlssel\n" - -#: g10/import.c:926 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new subkeys\n" -msgstr "Schlssel %08lX: \"%s\" %d neue Unterschlssel\n" - -#: g10/import.c:929 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signature cleaned\n" -msgstr "Schlssel %08lX: \"%s\" %d neue Signaturen\n" - -#: g10/import.c:932 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signatures cleaned\n" -msgstr "Schlssel %08lX: \"%s\" %d neue Signaturen\n" - -#: g10/import.c:935 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d user ID cleaned\n" -msgstr "Schlssel %08lX: \"%s\" %d neue User-IDs\n" - -#: g10/import.c:938 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d user IDs cleaned\n" -msgstr "Schlssel %08lX: \"%s\" %d neue User-IDs\n" - -#: g10/import.c:961 -#, fuzzy, c-format -msgid "key %s: \"%s\" not changed\n" -msgstr "Schlssel %08lX: \"%s\" Nicht gendert\n" - -#: g10/import.c:1124 -#, fuzzy, c-format -msgid "key %s: secret key with invalid cipher %d - skipped\n" -msgstr "" -"Schlssel %08lX: geheimer Schlssel mit ungltiger Verschlsselung %d - " -"bersprungen\n" - -#: g10/import.c:1135 -#, fuzzy -msgid "importing secret keys not allowed\n" -msgstr "schreiben des geheimen Schlssels nach '%s'\n" - -#: g10/import.c:1152 g10/import.c:2378 -#, c-format -msgid "no default secret keyring: %s\n" -msgstr "Kein voreingestellter geheimer Schlsselbund: %s\n" - -#: g10/import.c:1163 -#, fuzzy, c-format -msgid "key %s: secret key imported\n" -msgstr "Schlssel %08lX: Geheimer Schlssel importiert\n" - -#: g10/import.c:1193 -#, fuzzy, c-format -msgid "key %s: already in secret keyring\n" -msgstr "Schlssel %08lX: Ist bereits im geheimen Schlsselbund\n" - -#: g10/import.c:1203 -#, fuzzy, c-format -msgid "key %s: secret key not found: %s\n" -msgstr "Schlssel %08lX: geheimer Schlssel nicht gefunden: %s\n" - -#: g10/import.c:1233 -#, fuzzy, c-format -msgid "key %s: no public key - can't apply revocation certificate\n" -msgstr "" -"Schlssel %08lX: Kein ffentlicher Schlssel - der Schlsselwiderruf kann " -"nicht angebracht werden\n" - -#: g10/import.c:1276 -#, fuzzy, c-format -msgid "key %s: invalid revocation certificate: %s - rejected\n" -msgstr "Schlssel %08lX: Ungltiges Widerrufzertifikat: %s - zurckgewiesen\n" - -#: g10/import.c:1308 -#, fuzzy, c-format -msgid "key %s: \"%s\" revocation certificate imported\n" -msgstr "Schlssel %08lX: \"%s\" Widerrufzertifikat importiert\n" - -#: g10/import.c:1374 -#, fuzzy, c-format -msgid "key %s: no user ID for signature\n" -msgstr "Schlssel %08lX: Keine User-ID fr Signatur\n" - -#: g10/import.c:1389 -#, fuzzy, c-format -msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n" -msgstr "" -"Schlssel %08lX: Nicht untersttztes Public-Key-Verfahren fr User-ID \"%s" -"\"\n" - -#: g10/import.c:1391 -#, fuzzy, c-format -msgid "key %s: invalid self-signature on user ID \"%s\"\n" -msgstr "Schlssel %08lX: Ungltige Eigenbeglaubigung fr User-ID \"%s\"\n" - -#: g10/import.c:1409 -#, fuzzy, c-format -msgid "key %s: no subkey for key binding\n" -msgstr "" -"Schlssel %08lX: Kein Unterschlssel fr die Unterschlsselanbindungs-" -"Beglaubigung\n" - -#: g10/import.c:1420 g10/import.c:1470 -#, fuzzy, c-format -msgid "key %s: unsupported public key algorithm\n" -msgstr "Schlssel %08lX: Nicht untersttztes Public-Key-Verfahren\n" - -#: g10/import.c:1422 -#, fuzzy, c-format -msgid "key %s: invalid subkey binding\n" -msgstr "Schlssel %08lX: Ungltige Unterschlssel-Anbindung\n" - -#: g10/import.c:1437 -#, fuzzy, c-format -msgid "key %s: removed multiple subkey binding\n" -msgstr "Schlssel %08lX: Ungltige Unterschlssel-Anbindung entfernt\n" - -#: g10/import.c:1459 -#, fuzzy, c-format -msgid "key %s: no subkey for key revocation\n" -msgstr "" -"Schlssel %08lX: Kein Unterschlssel fr die Unterschlsselwiderruf-" -"Beglaubigung\n" - -#: g10/import.c:1472 -#, fuzzy, c-format -msgid "key %s: invalid subkey revocation\n" -msgstr "Schlssel %08lX: Ungltiger Unterschlsselwiderruf\n" - -#: g10/import.c:1487 -#, fuzzy, c-format -msgid "key %s: removed multiple subkey revocation\n" -msgstr "" -"Schlssel %08lX: Mehrfacher Unterschlssel-Widerruf-Beglaubigung entfernt\n" - -#: g10/import.c:1529 -#, fuzzy, c-format -msgid "key %s: skipped user ID \"%s\"\n" -msgstr "Schlssel %08lX: User-ID bergangen '" - -#: g10/import.c:1550 -#, fuzzy, c-format -msgid "key %s: skipped subkey\n" -msgstr "Schlssel %08lX: Unterschlssel ignoriert\n" - -#: g10/import.c:1577 -#, fuzzy, c-format -msgid "key %s: non exportable signature (class 0x%02X) - skipped\n" -msgstr "" -"Schlssel %08lX: Nicht exportfhige Unterschrift (Klasse %02x) - bergangen\n" - -#: g10/import.c:1587 -#, fuzzy, c-format -msgid "key %s: revocation certificate at wrong place - skipped\n" -msgstr "Schlssel %08lX: Widerrufzertifikat an falschem Platz - bergangen\n" - -#: g10/import.c:1604 -#, fuzzy, c-format -msgid "key %s: invalid revocation certificate: %s - skipped\n" -msgstr "Schlssel %08lX: Ungltiges Widerrufzertifikat: %s - bergangen\n" - -#: g10/import.c:1618 -#, fuzzy, c-format -msgid "key %s: subkey signature in wrong place - skipped\n" -msgstr "Schlssel %08lX: Widerrufzertifikat an falschem Platz - bergangen\n" - -#: g10/import.c:1626 -#, fuzzy, c-format -msgid "key %s: unexpected signature class (0x%02X) - skipped\n" -msgstr "" -"Schlssel %08lX: unerwartete Unterschriftenklasse (0x%02x) - bergangen\n" - -#: g10/import.c:1726 -#, fuzzy, c-format -msgid "key %s: duplicated user ID detected - merged\n" -msgstr "Schlssel %08lX: Doppelte User-ID entdeckt - zusammengefhrt\n" - -#: g10/import.c:1788 -#, fuzzy, c-format -msgid "WARNING: key %s may be revoked: fetching revocation key %s\n" -msgstr "" -"WARNUNG: Schlssel %08lX ist u.U. widerrufen: hole Widerrufschlssel %08lX\n" - -#: g10/import.c:1802 -#, fuzzy, c-format -msgid "WARNING: key %s may be revoked: revocation key %s not present.\n" -msgstr "" -"WARNUNG: Schlssel %08lX ist u.U. widerrufen: Widerrufschlssel %08lX ist " -"nicht vorhanden\n" - -#: g10/import.c:1861 -#, fuzzy, c-format -msgid "key %s: \"%s\" revocation certificate added\n" -msgstr "Schlssel %08lX: \"%s\" Widerrufzertifikat hinzugefgt\n" - -#: g10/import.c:1895 -#, fuzzy, c-format -msgid "key %s: direct key signature added\n" -msgstr "Schlssel %08lX: \"direct-key\"-Signaturen hinzugefgt\n" - -#: g10/import.c:2284 -#, fuzzy -msgid "NOTE: a key's S/N does not match the card's one\n" -msgstr "ffentliche Schlssel pat nicht zum geheimen Schlssel!\n" - -#: g10/import.c:2292 -#, fuzzy -msgid "NOTE: primary key is online and stored on card\n" -msgstr "bersprungen: geheimer Schlssel bereits vorhanden\n" - -#: g10/import.c:2294 -#, fuzzy -msgid "NOTE: secondary key is online and stored on card\n" -msgstr "bersprungen: geheimer Schlssel bereits vorhanden\n" - -#: g10/keydb.c:168 -#, c-format -msgid "error creating keyring `%s': %s\n" -msgstr "Fehler beim Erzeugen des Schlsselbundes `%s': %s\n" - -#: g10/keydb.c:175 -#, c-format -msgid "keyring `%s' created\n" -msgstr "Schlsselbund `%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 "Schlsselbund-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 Schlssel nicht geprft\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 Schlsseln nicht geprft\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 geprft\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 geprft\n" - -#: g10/keyedit.c:357 -msgid "1 user ID without valid self-signature detected\n" -msgstr "Eine User-ID ohne gltige Eigenbeglaubigung entdeckt\n" - -#: g10/keyedit.c:359 -#, c-format -msgid "%d user IDs without valid self-signatures detected\n" -msgstr "%d User-IDs ohne gltige 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" -"Schlssel anderer User korrekt zu prfen (durch Vergleich\n" -"mit Lichtbildausweisen, Vergleich der Fingerabdrcke 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 vollstndig\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 grer 1 erlaubt dem zu unterschreibenden Schlssel\n" -"Trust-Signatures fr 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 einzuschrnken,\n" -"oder nur die Eingabetaste fr 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 mglich.\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 gendert 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 fr 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 fr diesen Rechner gltig.\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 Schlssel %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 Schlssel %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 fr Schlssel %08lX\n" - -#: g10/keyedit.c:825 -msgid "This key has expired!" -msgstr "Dieser Schlssel ist verfallen!" - -#: g10/keyedit.c:843 -#, c-format -msgid "This key is due to expire on %s.\n" -msgstr "Dieser Schlssel 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 Schlsseln unterschrieben " -"werden\n" - -#: g10/keyedit.c:891 -msgid "This would make the key unusable in PGP 2.x.\n" -msgstr "Dies wrde den Schlssel fr 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 berprft, ob der Schlssel, den Sie jetzt beglaubigen\n" -"wollen, wirklich der o.g. Person gehrt?\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 berprft.%s\n" - -#: g10/keyedit.c:925 -#, c-format -msgid " (2) I have done casual checking.%s\n" -msgstr " (2) Ich habe es flchtig berprft.%s\n" - -#: g10/keyedit.c:927 -#, c-format -msgid " (3) I have done very careful checking.%s\n" -msgstr " (3) Ich habe es sehr sorgfltig berprft.%s\n" - -# translated by wk -#: g10/keyedit.c:933 -#, fuzzy -msgid "Your selection? (enter `?' for more information): " -msgstr "Ihre Auswahl? ('?' fr 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 Schlssel mit Ihrem\n" -"Schlssel 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 exportfhig 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 exportfhig markiert werden.\n" - -#: g10/keyedit.c:1002 -#, fuzzy -msgid "I have not checked this key at all.\n" -msgstr "" -"\n" -"Ich habe diesen Schlssel berhaupt nicht berprft.\n" - -#: g10/keyedit.c:1007 -#, fuzzy -msgid "I have checked this key casually.\n" -msgstr "" -"\n" -"Ich habe diesen Schlssel flchtig berprft.\n" - -#: g10/keyedit.c:1012 -#, fuzzy -msgid "I have checked this key very carefully.\n" -msgstr "" -"\n" -"Ich habe diesen Schlssel sehr sorgfltig berprft.\n" - -#: g10/keyedit.c:1022 -msgid "Really sign? (y/N) " -msgstr "Wirklich unterschreiben? (j/N) " - -#: g10/keyedit.c:1067 g10/keyedit.c:4783 g10/keyedit.c:4874 g10/keyedit.c:4938 -#: g10/keyedit.c:4999 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 Schlssel ist nicht geschtzt.\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 Haupschlssels 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 Haupschlssels sind nicht vorhanden\n" - -#: g10/keyedit.c:1155 g10/keygen.c:3206 -msgid "Key is protected.\n" -msgstr "Schlssel ist geschtzt.\n" - -#: g10/keyedit.c:1179 -#, c-format -msgid "Can't edit this key: %s\n" -msgstr "Dieser Schlssel 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 fr diesen geheimen Schlssel 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 "Mchten 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 "Schlssel und User-IDs auflisten" - -#: g10/keyedit.c:1365 -msgid "select user ID N" -msgstr "User-ID N auswhlen" - -#: g10/keyedit.c:1366 -#, fuzzy -msgid "select subkey N" -msgstr "User-ID N auswhlen" - -#: 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 Schlssel nur fr diesen Rechner beglaubigen" - -#: g10/keyedit.c:1379 -#, fuzzy -msgid "sign selected user IDs with a trust signature" -msgstr "Tip: Whlen 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 hinzufgen" - -#: g10/keyedit.c:1387 -msgid "add a photo ID" -msgstr "Eine Foto-ID hinzufgen" - -#: 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 Zweitschlssel entfernen" - -#: g10/keyedit.c:1408 -msgid "add a revocation key" -msgstr "Einen Widerrufschlssel hinzufgen" - -#: g10/keyedit.c:1410 -#, fuzzy -msgid "delete signatures from the selected user IDs" -msgstr "" -"Mchten Sie die Voreinstellungen der ausgewhlten User-IDs wirklich ndern? " - -#: g10/keyedit.c:1412 -#, fuzzy -msgid "change the expiration date for the key or selected subkeys" -msgstr "Sie knnen das Verfallsdatum eines v3-Schlssels 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 Schlssel" - -#: g10/keyedit.c:1419 -msgid "list preferences (expert)" -msgstr "Liste der Voreinstellungen (fr Experten)" - -#: g10/keyedit.c:1421 -msgid "list preferences (verbose)" -msgstr "Liste der Voreinstellungen (ausfhrlich)" - -#: g10/keyedit.c:1423 -#, fuzzy -msgid "set preference list for the selected user IDs" -msgstr "" -"Mchten Sie die Voreinstellungen der ausgewhlten User-IDs wirklich ndern? " - -#: g10/keyedit.c:1428 -#, fuzzy -msgid "set the preferred keyserver URL for the selected user IDs" -msgstr "Schlsselserver-URI konnte nicht zerlegt werden\n" - -#: g10/keyedit.c:1430 -#, fuzzy -msgid "set a notation for the selected user IDs" -msgstr "" -"Mchten Sie die Voreinstellungen der ausgewhlten 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 "Mchten Sie wirklich alle ausgewhlten 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 Zweitschlssel widerrufen" - -#: g10/keyedit.c:1446 -#, fuzzy -msgid "enable key" -msgstr "Schlssel anschalten" - -#: g10/keyedit.c:1447 -#, fuzzy -msgid "disable key" -msgstr "Schlssel 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 Schlsselblocks `%s': %s\n" - -#: g10/keyedit.c:1588 -msgid "Secret key is available.\n" -msgstr "Geheimer Schlssel ist vorhanden.\n" - -#: g10/keyedit.c:1669 -msgid "Need the secret key to do this.\n" -msgstr "Hierzu wird der geheime Schlssel bentigt.\n" - -#: g10/keyedit.c:1677 -msgid "Please use the command \"toggle\" first.\n" -msgstr "Bitte verwenden sie zunchst 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 "Schlssel 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: Whlen 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 ausgewhlt werden.\n" - -#: g10/keyedit.c:1818 -msgid "You can't delete the last user ID!\n" -msgstr "Die letzte User-ID kann nicht gelscht werden!\n" - -#: g10/keyedit.c:1820 -#, fuzzy -msgid "Really remove all selected user IDs? (y/N) " -msgstr "Mchten Sie alle ausgewhlten 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 Schlssel mu ausgewhlt 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 geffnet werden: %s\n" - -#: g10/keyedit.c:1942 -#, fuzzy, c-format -msgid "Error reading backup key from `%s': %s\n" -msgstr "Fehler beim Erzeugen des Schlsselbundes `%s': %s\n" - -#: g10/keyedit.c:1966 -msgid "You must select at least one key.\n" -msgstr "Zumindestens ein Schlssel mu ausgewhlt werden.\n" - -#: g10/keyedit.c:1969 -#, fuzzy -msgid "Do you really want to delete the selected keys? (y/N) " -msgstr "Mchten Sie die ausgewhlten Schlssel wirklich entfernen? " - -#: g10/keyedit.c:1970 -#, fuzzy -msgid "Do you really want to delete this key? (y/N) " -msgstr "Mchten Sie diesen Schlssel wirklich entfernen? " - -#: g10/keyedit.c:2005 -#, fuzzy -msgid "Really revoke all selected user IDs? (y/N) " -msgstr "Mchten Sie wirklich alle ausgewhlten 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 "Mchten Sie diesen Schlssel wirklich vollstndig widerrufen? " - -#: g10/keyedit.c:2035 -msgid "Do you really want to revoke the selected subkeys? (y/N) " -msgstr "Mchten Sie die ausgewhlten Unterschlssel wirklich widerrufen? " - -#: g10/keyedit.c:2037 -msgid "Do you really want to revoke this subkey? (y/N) " -msgstr "Mchten Sie diesen Schlssel 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 "" -"Mchten Sie die Voreinstellungen der ausgewhlten 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 "Schlssel ist nicht gendert worden, also ist kein Speichern ntig.\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 Schlssel 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 Schlssel knnte widerrufen worden sein von %s Schlssel " - -#: g10/keyedit.c:2710 -#, fuzzy, c-format -msgid "This key may be revoked by %s key %s" -msgstr "Dieser Schlssel knnte widerrufen worden sein von %s Schlssel " - -#: 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 " [verfllt: %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 " [verfllt: %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 "Gltigkeit: %s" - -#: g10/keyedit.c:2767 -msgid "This key has been disabled" -msgstr "Hinweis: Dieser Schlssel 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" -"Schlsselgltigkeit 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 primr markiert. Dieses Kommando kann\n" -"dazu fhren, da eine andere User-ID as primr 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 Schlssel. Hinzufgen einer Foto-ID " -"knnte\n" -" bei einigen PGP-Versionen zur Zurckweisung des Schlssels fhren.\n" - -#: g10/keyedit.c:3016 g10/keyedit.c:3346 -msgid "Are you sure you still want to add it? (y/N) " -msgstr "Wollen Sie ihn immer noch hinzufgen? (j/N) " - -#: g10/keyedit.c:3022 -msgid "You may not add a photo ID to a PGP2-style key.\n" -msgstr "Sie knnen einem PGP2-artigen Schlsel keine Foto-ID hinzufgen.\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 ungltige 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 "ungltig" - -#: g10/keyedit.c:3249 -#, fuzzy, c-format -msgid "User ID \"%s\": already clean\n" -msgstr "User-ID \"%s\" ist bereits widerrufen\n" - -#: g10/keyedit.c:3341 -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 Schlssel. Hinzufgen eines vorgesehenen\n" -" Widerrufers knnte bei einigen PGP-Versionen zur Zurckweisung\n" -" des Schlssels fhren.\n" - -#: g10/keyedit.c:3352 -msgid "You may not add a designated revoker to a PGP 2.x-style key.\n" -msgstr "" -"Sie knnen einem PGP2-artigen Schlsel keine vorgesehenen Widerrufer " -"hinzufgen.\n" - -#: g10/keyedit.c:3372 -msgid "Enter the user ID of the designated revoker: " -msgstr "Geben sie die User-ID des designierten Widerrufers ein: " - -#: g10/keyedit.c:3397 -msgid "cannot appoint a PGP 2.x style key as a designated revoker\n" -msgstr "" -"Ein PGP 2.x-artiger Schlssel kann nicht als vorgesehener Widerrufer " -"eingetragen werden\n" - -#: g10/keyedit.c:3412 -msgid "you cannot appoint a key as its own designated revoker\n" -msgstr "Ein Schlssel kann nicht sein eigener vorgesehener Widerrufer werden\n" - -#: g10/keyedit.c:3434 -msgid "this key has already been designated as a revoker\n" -msgstr "Dieser Schlssel wurde bereits als ein Widerrufer vorgesehen\n" - -#: g10/keyedit.c:3453 -msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n" -msgstr "" -"WARNUNG: Einen Schlssel als vorgesehenen Widerrufer zu deklarieren, kann " -"nicht rckgangig gemacht werden!\n" - -#: g10/keyedit.c:3459 -#, fuzzy -msgid "" -"Are you sure you want to appoint this key as a designated revoker? (y/N) " -msgstr "" -"Mchten Sie diesen Schlssel wirklich als vorgesehenen Widerrufer " -"deklarieren? (j/N): " - -#: g10/keyedit.c:3520 -msgid "Please remove selections from the secret keys.\n" -msgstr "Bitte entfernen Sie die Auswahl von den geheimen Schlsseln.\n" - -#: g10/keyedit.c:3526 -#, fuzzy -msgid "Please select at most one subkey.\n" -msgstr "Bitte whlen Sie hchstens einen Zweitschlssel aus.\n" - -#: g10/keyedit.c:3530 -#, fuzzy -msgid "Changing expiration time for a subkey.\n" -msgstr "ndern des Verfallsdatums des Zweitschlssels.\n" - -#: g10/keyedit.c:3533 -msgid "Changing expiration time for the primary key.\n" -msgstr "ndern des Verfallsdatums des Hauptschlssels.\n" - -#: g10/keyedit.c:3579 -msgid "You can't change the expiration date of a v3 key\n" -msgstr "Sie knnen das Verfallsdatum eines v3-Schlssels nicht ndern\n" - -#: g10/keyedit.c:3595 -msgid "No corresponding signature in secret ring\n" -msgstr "Keine entsprechende Signatur im geheimen Schlsselbund\n" - -#: g10/keyedit.c:3668 -#, fuzzy, c-format -msgid "signing subkey %s is already cross-certified\n" -msgstr "WARNUNG: Signaturunterschlssel %08lX hat keine Rcksignatur\n" - -#: g10/keyedit.c:3674 -#, c-format -msgid "subkey %s does not sign and so does not need to be cross-certified\n" -msgstr "" - -#: g10/keyedit.c:3836 -msgid "Please select exactly one user ID.\n" -msgstr "Bitte genau eine User-ID auswhlen.\n" - -#: g10/keyedit.c:3875 g10/keyedit.c:3985 g10/keyedit.c:4105 g10/keyedit.c:4246 -#, 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:4046 -msgid "Enter your preferred keyserver URL: " -msgstr "" - -#: g10/keyedit.c:4126 -#, fuzzy -msgid "Are you sure you want to replace it? (y/N) " -msgstr "Wollen Sie es wirklich benutzen? (j/N) " - -#: g10/keyedit.c:4127 -#, fuzzy -msgid "Are you sure you want to delete it? (y/N) " -msgstr "Wollen Sie es wirklich benutzen? (j/N) " - -#: g10/keyedit.c:4189 -#, fuzzy -msgid "Enter the notation: " -msgstr "Beglaubigungs-\"Notation\": " - -#: g10/keyedit.c:4338 -#, fuzzy -msgid "Proceed? (y/N) " -msgstr "berschreiben (j/N)? " - -#: g10/keyedit.c:4402 -#, c-format -msgid "No user ID with index %d\n" -msgstr "Keine User-ID mit Index %d\n" - -#: g10/keyedit.c:4460 -#, fuzzy, c-format -msgid "No user ID with hash %s\n" -msgstr "Keine User-ID mit Index %d\n" - -#: g10/keyedit.c:4487 -#, fuzzy, c-format -msgid "No subkey with index %d\n" -msgstr "Keine User-ID mit Index %d\n" - -#: g10/keyedit.c:4622 -#, fuzzy, c-format -msgid "user ID: \"%s\"\n" -msgstr "User-ID: \"" - -#: g10/keyedit.c:4625 g10/keyedit.c:4689 g10/keyedit.c:4732 -#, 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:4627 g10/keyedit.c:4691 g10/keyedit.c:4734 -msgid " (non-exportable)" -msgstr " (nicht-exportierbar)" - -#: g10/keyedit.c:4631 -#, c-format -msgid "This signature expired on %s.\n" -msgstr "Diese Unterschrift ist seit %s verfallen.\n" - -#: g10/keyedit.c:4635 -msgid "Are you sure you still want to revoke it? (y/N) " -msgstr "Wollen Sie ihn immer noch widerrufen? (j/N) " - -#: g10/keyedit.c:4639 -msgid "Create a revocation certificate for this signature? (y/N) " -msgstr "Ein Widerrufszertifikat fr diese Unterschrift erzeugen (j/N)" - -#: g10/keyedit.c:4666 -#, 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:4692 -#, fuzzy -msgid " (non-revocable)" -msgstr " (nicht-exportierbar)" - -#: g10/keyedit.c:4699 -#, fuzzy, c-format -msgid "revoked by your key %s on %s\n" -msgstr " widerrufen durch %08lX um %s\n" - -#: g10/keyedit.c:4721 -msgid "You are about to revoke these signatures:\n" -msgstr "Es werden nun folgende Beglaubigungen entfernt:\n" - -#: g10/keyedit.c:4741 -msgid "Really create the revocation certificates? (y/N) " -msgstr "Wirklich ein Unterschrift-Widerrufszertifikat erzeugen? (j/N) " - -#: g10/keyedit.c:4771 -msgid "no secret key\n" -msgstr "Kein geheimer Schlssel\n" - -#: g10/keyedit.c:4841 -#, c-format -msgid "user ID \"%s\" is already revoked\n" -msgstr "User-ID \"%s\" ist bereits widerrufen\n" - -#: g10/keyedit.c:4858 -#, 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:4922 -#, fuzzy, c-format -msgid "Key %s is already revoked.\n" -msgstr "User-ID \"%s\" ist bereits widerrufen\n" - -#: g10/keyedit.c:4984 -#, fuzzy, c-format -msgid "Subkey %s is already revoked.\n" -msgstr "User-ID \"%s\" ist bereits widerrufen\n" - -#: g10/keyedit.c:5079 -#, 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) fr Schlssel %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 "Ungltiges 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 "Ungltig Schlssellnge; %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 "Schlssellnge 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 verschlsseln" - -#: g10/keygen.c:1332 -#, fuzzy -msgid "Authenticate" -msgstr "uneingeschrnkt" - -#: 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 verschlsseln)\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 whlen Sie, welche Art von Schlssel Sie mchten:\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 verschlsseln)\n" - -#: g10/keygen.c:1440 -#, fuzzy, c-format -msgid " (%d) Elgamal (encrypt only)\n" -msgstr " (%d) ElGamal (nur verschlsseln)\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 verschlsseln)\n" - -#: g10/keygen.c:1445 -#, fuzzy, c-format -msgid " (%d) RSA (set your own capabilities)\n" -msgstr " (%d) RSA (nur verschlsseln)\n" - -#: g10/keygen.c:1514 -#, fuzzy, c-format -msgid "DSA keypair will have %u bits.\n" -msgstr "Das DSA-Schlsselpaar 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 Schlssellnge wnschen 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 Schlssellnge betrgt %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 whlen Sie, wie lange der Schlssel gltig bleiben soll.\n" -" 0 = Schlssel verfllt nie\n" -" <n> = Schlssel verfllt nach n Tagen\n" -" <n>w = Schlssel verfllt nach n Wochen\n" -" <n>m = Schlssel verfllt nach n Monaten\n" -" <n>y = Schlssel verfllt 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 whlen Sie, wie lange die Beglaubigung gltig bleiben soll.\n" -" 0 = Schlssel verfllt nie\n" -" <n> = Schlssel verfllt nach n Tagen\n" -" <n>w = Schlssel verfllt nach n Wochen\n" -" <n>m = Schlssel verfllt nach n Monaten\n" -" <n>y = Schlssel verfllt nach n Jahren\n" - -#: g10/keygen.c:1644 -msgid "Key is valid for? (0) " -msgstr "Wie lange bleibt der Schlssel gltig? (0) " - -#: g10/keygen.c:1649 -#, fuzzy, c-format -msgid "Signature is valid for? (%s) " -msgstr "Wie lange bleibt die Beglaubigung gltig? (0) " - -#: g10/keygen.c:1667 -msgid "invalid value\n" -msgstr "Ungltiger Wert.\n" - -#: g10/keygen.c:1674 -msgid "Key does not expire at all\n" -msgstr "Schlssel verfllt nie\n" - -#: g10/keygen.c:1675 -msgid "Signature does not expire at all\n" -msgstr "Signature verfllt nie\n" - -#: g10/keygen.c:1680 -#, c-format -msgid "Key expires at %s\n" -msgstr "Key verfllt am %s\n" - -#: g10/keygen.c:1681 -#, c-format -msgid "Signature expires at %s\n" -msgstr "Unterschrift verfllt 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 bentigen eine User-ID, um Ihren Schlssel 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 "Ungltiges 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 ungltig\n" - -#: g10/keygen.c:1762 -msgid "Comment: " -msgstr "Kommentar: " - -#: g10/keygen.c:1768 -msgid "Invalid character in comment\n" -msgstr "Ungltiges 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 gewhlt:\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 bentigen eine Passphrase, um den geheimen Schlssel zu schtzen.\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 mchten keine Passphrase - Dies ist *nicht* zu empfehlen!\n" -"Es ist trotzdem mglich. Sie knnen 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 mssen eine ganze Menge Zufallswerte erzeugen. Sie knnen dies\n" -"untersttzen, 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 "Schlsselerzeugung abgebrochen.\n" - -#: g10/keygen.c:2907 g10/keygen.c:3052 -#, c-format -msgid "writing public key to `%s'\n" -msgstr "schreiben des ffentlichen Schlssels 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 Schlssels nach '%s'\n" - -#: g10/keygen.c:2912 g10/keygen.c:3058 -#, c-format -msgid "writing secret key to `%s'\n" -msgstr "schreiben des geheimen Schlssels nach '%s'\n" - -#: g10/keygen.c:3041 -#, c-format -msgid "no writable public keyring found: %s\n" -msgstr "kein schreibbarer ffentlicher Schlsselbund gefunden: %s\n" - -#: g10/keygen.c:3047 -#, c-format -msgid "no writable secret keyring found: %s\n" -msgstr "kein schreibbarer geheimer Schlsselbund gefunden: %s\n" - -#: g10/keygen.c:3065 -#, c-format -msgid "error writing public keyring `%s': %s\n" -msgstr "Fehler beim Schreiben des ff. Schlsselbundes `%s': %s\n" - -#: g10/keygen.c:3072 -#, c-format -msgid "error writing secret keyring `%s': %s\n" -msgstr "Fehler beim Schreiben des geheimen Schlsselbundes `%s': %s\n" - -#: g10/keygen.c:3095 -msgid "public and secret key created and signed.\n" -msgstr "ffentlichen und geheimen Schlssel 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 Schlssel nicht zum Verschlsseln benutzt\n" -"werden kann. Sie knnen aber mit dem Befehl \"--edit-key\" einen\n" -"Zweitschlssel fr 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 "Schlsselerzeugung 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 Schlssel 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 Schlssel 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: Unterschlssel fr v3-Schlssen 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 "lschen des Schlsselblocks 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 Schlssel %08lX verfllt 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 "Schlsselbund" - -#: 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-Hlle 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 Unvernderte\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 "Prfen des Schlsselbundes `%s'\n" - -#: g10/keyring.c:1422 -#, fuzzy, c-format -msgid "%lu keys cached so far (%lu signatures)\n" -msgstr "%lu Schlssel bislang geprft (%lu Beglaubigungen)\n" - -#: g10/keyring.c:1434 -#, fuzzy, c-format -msgid "%lu keys cached (%lu signatures)\n" -msgstr "%lu Schlssel geprft (%lu Beglaubigungen)\n" - -#: g10/keyring.c:1505 -#, c-format -msgid "%s: keyring created\n" -msgstr "%s: Schlsselbund 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 ungltig\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 whrend 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:1421 -#, fuzzy, c-format -msgid "invalid keyserver protocol (us %d!=handler %d)\n" -msgstr "Ungltige export Option\n" - -#: g10/keyserver.c:906 -#, fuzzy, c-format -msgid "key \"%s\" not found on keyserver\n" -msgstr "Schlssel `%s' nicht gefunden: %s\n" - -#: g10/keyserver.c:908 -#, fuzzy -msgid "key not found on keyserver\n" -msgstr "Schlssel `%s' nicht gefunden: %s\n" - -#: g10/keyserver.c:1145 -#, fuzzy, c-format -msgid "requesting key %s from %s server %s\n" -msgstr "Schlssel %08lX wird von %s angefordert\n" - -#: g10/keyserver.c:1149 -#, fuzzy, c-format -msgid "requesting key %s from %s\n" -msgstr "Schlssel %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:1324 -#, fuzzy, c-format -msgid "sending key %s to %s server %s\n" -msgstr "suche nach \"%s\" auf HKP-Server %s\n" - -#: g10/keyserver.c:1328 -#, fuzzy, c-format -msgid "sending key %s to %s\n" -msgstr "" -"\"\n" -"unterschrieben mit Ihrem Schlssel %08lX um %s\n" - -#: g10/keyserver.c:1371 -#, fuzzy, c-format -msgid "searching for \"%s\" from %s server %s\n" -msgstr "suche nach \"%s\" auf HKP-Server %s\n" - -#: g10/keyserver.c:1374 -#, fuzzy, c-format -msgid "searching for \"%s\" from %s\n" -msgstr "suche nach \"%s\" auf HKP-Server %s\n" - -#: g10/keyserver.c:1381 g10/keyserver.c:1477 -#, fuzzy -msgid "no keyserver action!\n" -msgstr "Ungltige export Option\n" - -#: g10/keyserver.c:1429 -#, c-format -msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n" -msgstr "" - -#: g10/keyserver.c:1438 -msgid "keyserver did not send VERSION\n" -msgstr "" - -#: g10/keyserver.c:1500 g10/keyserver.c:2028 -msgid "no keyserver known (use option --keyserver)\n" -msgstr "Kein Schlsselserver bekannt (Option --keyserver verwenden)\n" - -#: g10/keyserver.c:1506 -msgid "external keyserver calls are not supported in this build\n" -msgstr "" - -#: g10/keyserver.c:1518 -#, c-format -msgid "no handler for keyserver scheme `%s'\n" -msgstr "" - -#: g10/keyserver.c:1523 -#, c-format -msgid "action `%s' not supported with keyserver scheme `%s'\n" -msgstr "" - -#: g10/keyserver.c:1531 -#, c-format -msgid "%s does not support handler version %d\n" -msgstr "" - -#: g10/keyserver.c:1538 -#, fuzzy -msgid "keyserver timed out\n" -msgstr "Schlsselserverfehler" - -#: g10/keyserver.c:1543 -#, fuzzy -msgid "keyserver internal error\n" -msgstr "Schlsselserverfehler" - -#: g10/keyserver.c:1552 -#, fuzzy, c-format -msgid "keyserver communications error: %s\n" -msgstr "Empfangen vom Schlsselserver fehlgeschlagen: %s\n" - -#: g10/keyserver.c:1577 g10/keyserver.c:1611 -#, fuzzy, c-format -msgid "\"%s\" not a key ID: skipping\n" -msgstr "%s: Dies ist keine gltige Schlssel-ID\n" - -#: g10/keyserver.c:1870 -#, fuzzy, c-format -msgid "WARNING: unable to refresh key %s via %s: %s\n" -msgstr "" -"WARNUNG: die temporre Datei (%s) `%s' konnte nicht entfernt werden: %s\n" - -#: g10/keyserver.c:1892 -#, fuzzy, c-format -msgid "refreshing 1 key from %s\n" -msgstr "Schlssel %08lX wird von %s angefordert\n" - -#: g10/keyserver.c:1894 -#, fuzzy, c-format -msgid "refreshing %d keys from %s\n" -msgstr "Schlssel %08lX wird von %s angefordert\n" - -#: g10/keyserver.c:1950 -#, fuzzy, c-format -msgid "WARNING: unable to fetch URI %s: %s\n" -msgstr "" -"WARNUNG: die temporre Datei (%s) `%s' konnte nicht entfernt werden: %s\n" - -#: g10/keyserver.c:1956 -#, fuzzy, c-format -msgid "WARNING: unable to parse URI %s\n" -msgstr "" -"WARNUNG: die temporre 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 Lnge fr einen verschlsselten Sitzungsschlssel (%d)\n" - -#: g10/mainproc.c:291 -#, c-format -msgid "%s encrypted session key\n" -msgstr "%s verschlsselter Sitzungsschlssel\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 Schlssel ist %s\n" - -#: g10/mainproc.c:439 -msgid "public key encrypted data: good DEK\n" -msgstr "Mit ffentlichem Schlssel verschlsselte Daten: Korrekte DEK\n" - -#: g10/mainproc.c:472 -#, c-format -msgid "encrypted with %u-bit %s key, ID %s, created %s\n" -msgstr "verschlsselt mit %u-Bit %s Schlssel, 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 "verschlsselt mit %s Schlssel, ID %s\n" - -#: g10/mainproc.c:494 -#, c-format -msgid "public key decryption failed: %s\n" -msgstr "Entschlsselung mit Public-Key-Verfahren fehlgeschlagen: %s\n" - -#: g10/mainproc.c:508 -#, c-format -msgid "encrypted with %lu passphrases\n" -msgstr "Verschlsselt mit %lu Passphrases\n" - -#: g10/mainproc.c:510 -msgid "encrypted with 1 passphrase\n" -msgstr "Verschlsselt mit einer Passphrase\n" - -#: g10/mainproc.c:541 g10/mainproc.c:563 -#, c-format -msgid "assuming %s encrypted data\n" -msgstr "vermutlich %s-verschlsselte Daten\n" - -#: g10/mainproc.c:549 -#, c-format -msgid "IDEA cipher unavailable, optimistically attempting to use %s instead\n" -msgstr "IDEA-Verschlsselung nicht verfgbar; versucht wird stattdessen %s\n" - -#: g10/mainproc.c:581 -msgid "decryption okay\n" -msgstr "Entschlsselung erfolgreich\n" - -#: g10/mainproc.c:585 -msgid "WARNING: message was not integrity protected\n" -msgstr "" -"WARNUNG: Botschaft wurde nicht integrittsgeschtzt (integrity protected)\n" - -#: g10/mainproc.c:598 -msgid "WARNING: encrypted message has been manipulated!\n" -msgstr "Warnung: Verschlsselte Botschaft ist manipuliert worden!\n" - -#: g10/mainproc.c:604 -#, c-format -msgid "decryption failed: %s\n" -msgstr "Entschlsselung 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 "Ursprnglicher 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-berprfung unterdrckt\n" - -#: g10/mainproc.c:1508 -#, fuzzy -msgid "can't handle this ambiguous signature data\n" -msgstr "diese Mehrfachunterschriften knnen 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 Schlssel ID %08lX\n" - -#: g10/mainproc.c:1544 -msgid "Key available at: " -msgstr "Schlssel erhltlich 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 +#: sm/import.c:525 sm/import.c:550 #, c-format -msgid "Signature expires %s\n" -msgstr "Diese Unterschrift verfllt am %s.\n" +msgid "error creating temporary file: %s\n" +msgstr "Fehler beim Erstellen einer temporären Datei: %s\n" -#: g10/mainproc.c:1871 +#: sm/import.c:533 #, c-format -msgid "%s signature, digest algorithm %s\n" -msgstr "%s Unterschrift, Hashmethode \"%s\"\n" +msgid "error writing to temporary file: %s\n" +msgstr "Fehler beim Schreiben auf eine temporäre Datei: %s\n" -#: g10/mainproc.c:1872 -msgid "binary" -msgstr "Binre" - -#: 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 geprft 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 geprft.\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 "ungltiges 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 "Verschlsselungsverfahren 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 Empfngervoreinstellungen\n" - -#: g10/misc.c:447 -msgid "the IDEA cipher plugin is not present\n" -msgstr "das IDEA-Verschlsselungs-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: mibilligte Option \"%s\".\n" - -#: g10/misc.c:685 -#, c-format -msgid "WARNING: \"%s\" is a deprecated option\n" -msgstr "WARNUNG: \"%s\" ist eine mibilligte 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 mibilligte 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 knnte fr %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 Empfnger '%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:305 -#, c-format -msgid "assuming signed data in `%s'\n" -msgstr "die unterzeichneten Daten sind wohl in '%s'\n" - -#: g10/openfile.c:384 -#, c-format -msgid "new configuration file `%s' created\n" -msgstr "Neue Konfigurationsdatei `%s' erstellt\n" - -#: g10/openfile.c:386 -#, c-format -msgid "WARNING: options in `%s' are not yet active during this run\n" -msgstr "" -"WARNUNG: Optionen in `%s' sind whrend dieses Laufes noch nicht wirksam\n" - -#: g10/openfile.c:418 -#, 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: Mglicherweise unsicherer symmetrisch verschlsselter " -"Sitzungsschlssel\n" - -#: g10/parse-packet.c:1157 -#, 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 untersttzt\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 " (Hauptschlssel-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 bentigen eine Passphrase, um den geheimen Schlssel zu entsperren.\n" -"Benutzer: \"%.*s\"\n" -"%u-bit %s Schlssel, 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:968 -#, 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:973 -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 bentigen eine Passphrase, um den geheimen Schlssel zu entsperren.\n" -"Benutzer: \"" - -#: g10/passphrase.c:901 -#, fuzzy, c-format -msgid "%u-bit %s key, ID %s, created %s" -msgstr "%u-Bit %s Schlssel, ID %08lX, erzeugt %s" - -#: g10/passphrase.c:910 -#, c-format -msgid " (subkey on main key ID %s)" -msgstr "" - -#: g10/passphrase.c:977 -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" -"Whlen Sie ein Bild fr Ihre Photo ID aus. Das Bild mu eine JPEG Datei\n" -"sein. Bitte beachten Sie, da das Bild in Ihrem ffentlichen\n" -"Schlssel gespeichert wird. Wenn Sie ein sehr groes Bild benutzen,\n" -"wir Ihr Schlssel leider auch sehr gro werden. Ein Bild der Gre\n" -"240x288 Pixel ist eine gute Wahl.\n" - -#: g10/photoid.c:95 -msgid "Enter JPEG filename for photo ID: " -msgstr "Dateiname mit JPEG fr die Photo ID eingeben: " - -#: g10/photoid.c:116 -#, fuzzy, c-format -msgid "unable to open JPEG file `%s': %s\n" -msgstr "Datei kann nicht geffnet 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 "Schlssel ist berholt" - -#: g10/pkclist.c:66 g10/revoke.c:624 -msgid "Key has been compromised" -msgstr "Hinweis: Dieser Schlssel ist nicht mehr sicher" - -#: g10/pkclist.c:68 g10/revoke.c:626 -msgid "Key is no longer used" -msgstr "Schlssel 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 gltig" - -#: g10/pkclist.c:74 -msgid "reason for revocation: " -msgstr "Grund fr 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 fr:\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 Schlssel gehrt 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 = Zurck zum Men\n" - -#: g10/pkclist.c:288 -#, fuzzy -msgid " s = skip this key\n" -msgstr " s = diesen Schlssel 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 fr diesen Schlssel betrgt: %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 "Mchten Sie diesem Schlssel wirklich uneingeschrnkt vertrauen? " - -#: g10/pkclist.c:334 -msgid "Certificates leading to an ultimately trusted key:\n" -msgstr "Zertifikate fhren zu einem letztlich vertrauenswrdigen Schlssel:\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 Schlssel wirklich dem angegebenen " -"Besitzer gehrt.\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 beschrnkte Garantie, da dieser Schlssel wirklich " -"dem angegebenen Besitzer gehrt.\n" - -#: g10/pkclist.c:430 -#, fuzzy -msgid "This key probably belongs to the named user\n" -msgstr "Dieser Schlssel gehrt wahrscheinlich dem angegebenen Besitzer\n" - -#: g10/pkclist.c:435 -msgid "This key belongs to us\n" -msgstr "" -"Dieser Schlssel gehrt uns (da wir nmlich den geheimen Schlssel 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 Schlssel dem vorgeblichen Besitzer gehrt.\n" -"Wenn Sie *wirklich* wissen, was Sie tun, knnen Sie die nchste\n" -"Frage mit ja beantworten\n" - -#: g10/pkclist.c:468 -#, fuzzy -msgid "Use this key anyway? (y/N) " -msgstr "Diesen Schlssel trotzdem benutzen? " - -#: g10/pkclist.c:502 -msgid "WARNING: Using untrusted key!\n" -msgstr "WARNUNG: Ein Schlssel 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 schlssel ist u.U. widerrufen: Widerrufschlssel ist nicht " -"vorhanden\n" - -#: g10/pkclist.c:518 -msgid "WARNING: This key has been revoked by its designated revoker!\n" -msgstr "" -"WARNUNG: Dieser Schlssel wurde vom vorgesehen Widerrufer widerrufen!\n" - -#: g10/pkclist.c:521 -msgid "WARNING: This key has been revoked by its owner!\n" -msgstr "WARNUNG: Dieser Schlssel wurde von seinem Besitzer widerrufen!\n" - -#: g10/pkclist.c:522 -#, fuzzy -msgid " This could mean that the signature is forged.\n" -msgstr " Das knnte bedeuten, da die Signatur geflscht ist.\n" - -#: g10/pkclist.c:528 -msgid "WARNING: This subkey has been revoked by its owner!\n" -msgstr "WARNUNG: Dieser Unterschlssel wurde von seinem Besitzer widerrufen!\n" - -#: g10/pkclist.c:533 -msgid "Note: This key has been disabled.\n" -msgstr "Hinweis: Dieser Schlssel 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 Schlssel ist verfallen!\n" - -#: g10/pkclist.c:602 -msgid "WARNING: This key is not certified with a trusted signature!\n" -msgstr "WARNUNG: Dieser Schlssel trgt keine vertrauenswrdige 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 gehrt.\n" - -#: g10/pkclist.c:612 -msgid "WARNING: We do NOT trust this key!\n" -msgstr "WARNUNG: Wir haben KEIN Vertrauen zu diesem Schlssel!\n" - -#: g10/pkclist.c:613 -msgid " The signature is probably a FORGERY.\n" -msgstr " Die Signatur ist wahrscheinlich eine FLSCHUNG.\n" - -#: g10/pkclist.c:621 -msgid "" -"WARNING: This key is not certified with sufficiently trusted signatures!\n" -msgstr "" -"WARNUNG: Dieser Schlssel ist nicht durch hinreichend vertrauenswrdige " -"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 gehrt.\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 Schlssel 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 knnen 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 Schlssel bereits als Standardempfnger gesetzt\n" - -#: g10/pkclist.c:990 -msgid "Public key is disabled.\n" -msgstr "ffentlicher Schlssel ist abgeschaltet.\n" - -#: g10/pkclist.c:999 -msgid "skipped: public key already set\n" -msgstr "bersprungen: ffentlicher Schlssel bereits gesetzt\n" - -#: g10/pkclist.c:1034 -#, fuzzy, c-format -msgid "unknown default recipient \"%s\"\n" -msgstr "Unbekannter voreingestellter Empfnger '%s'\n" - -#: g10/pkclist.c:1092 -#, c-format -msgid "%s: skipped: public key is disabled\n" -msgstr "%s: bersprungen: ffentlicher Schlssel ist abgeschaltet\n" - -#: g10/pkclist.c:1154 -msgid "no valid addressees\n" -msgstr "Keine gltigen Adressaten\n" - -#: g10/plaintext.c:91 -msgid "data not saved; use option \"--output\" to save it\n" -msgstr "" -"Daten wurden nicht gespeichert; verwenden Sie dafr 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 Empfnger; Versuch mit geheimen Schlssel %08lX ...\n" - -#: g10/pubkey-enc.c:135 -msgid "okay, we are the anonymous recipient.\n" -msgstr "Alles klar, wir sind der ungenannte Empfnger.\n" - -#: g10/pubkey-enc.c:223 -msgid "old encoding of the DEK is not supported\n" -msgstr "alte Kodierung des DEK wird nicht untersttzt\n" - -#: g10/pubkey-enc.c:244 -#, c-format -msgid "cipher algorithm %d%s is unknown or disabled\n" -msgstr "Verschsselungsverfahren %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 Verschlsselungsverfahren\n" - -#: g10/pubkey-enc.c:302 -#, fuzzy, c-format -msgid "NOTE: secret key %s expired at %s\n" -msgstr "Hinweis: geheimer Schlssel %08lX verfllt am %s\n" - -#: g10/pubkey-enc.c:308 -msgid "NOTE: key has been revoked" -msgstr "Hinweis: Schlssel 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 "Schlssel %08lX: Keine User-ID\n" - -#: g10/revoke.c:308 -msgid "To be revoked by:\n" -msgstr "Schlssel soll widerrufen werden von:\n" - -#: g10/revoke.c:312 -msgid "(This is a sensitive revocation key)\n" -msgstr "(Dies ist ein \"sensitiver\" Widerrufsschlssel)\n" - -#: g10/revoke.c:316 -#, fuzzy -msgid "Create a designated revocation certificate for this key? (y/N) " -msgstr "Ein Widerrufszertifikat fr diesen Schlssel erzeugen? (j/N) " - -#: g10/revoke.c:329 g10/revoke.c:554 -msgid "ASCII armored output forced.\n" -msgstr "Ausgabe mit ASCII Hlle 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 "Widerrufsschlssel fr `%s' nicht gefunden\n" - -#: g10/revoke.c:471 -#, fuzzy, c-format -msgid "secret key \"%s\" not found: %s\n" -msgstr "Geheimer Schlssel `%s' nicht gefunden: %s\n" - -#: g10/revoke.c:500 -#, c-format -msgid "no corresponding public key: %s\n" -msgstr "kein zugehriger ffentlicher Schlssel: %s\n" - -#: g10/revoke.c:511 -msgid "public key does not match secret key!\n" -msgstr "ffentliche Schlssel pat nicht zum geheimen Schlssel!\n" - -#: g10/revoke.c:518 -#, fuzzy -msgid "Create a revocation certificate for this key? (y/N) " -msgstr "Ein Widerrufszertifikat fr diesen Schlssel 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 Schlssel ist nicht geschtzt.\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" -"knnen; falls Mallory (ein Angreifer) Zugang zu diesem Zertifikat\n" -"erhlt, kann erIhren Schlssel unbrauchbar machen. Es wre klug,\n" -"dieses Widerrufszertifikat auch auszudrucken und sicher aufzubewahren,\n" -"falls das ursprngliche Mediumnicht mehr lesbar ist. Aber Obacht: Das\n" -"Drucksystem kann unter Umstnden eine Kopie anderen Nutzern zugnglich\n" -"machen.\n" - -#: g10/revoke.c:635 -msgid "Please select the reason for the revocation:\n" -msgstr "Grund fr 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 mchten Sie hier %d auswhlen)\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 fr 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 Schlssels 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 untersttzt\n" - -#: g10/seckey-cert.c:72 -#, c-format -msgid "protection digest %d is not supported\n" -msgstr "Hashschutzverfahren %d wird nicht untersttzt\n" - -#: g10/seckey-cert.c:266 -msgid "Invalid passphrase; please try again" -msgstr "Ungltige 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 Schlssel 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 mibilligte 16-bit Prfsumme wird zum Schutz des geheimen Schlssels " -"benutzt\n" - -#: g10/seskey.c:54 -msgid "weak key created - retrying\n" -msgstr "Unsicherer Schlssel 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 Schlssels fr " -"sym.Verschlsselung 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: Signaturunterschlssel %08lX hat keine Rcksignatur\n" - -#: g10/sig-check.c:113 -#, fuzzy, c-format -msgid "WARNING: signing subkey %s has an invalid cross-certification\n" -msgstr "" -"WARNUNG: Signaturunterschlssel %08lX hat eine ungltige Rcksignatur\n" - -#: g10/sig-check.c:181 -#, fuzzy, c-format -msgid "public key %s is %lu second newer than the signature\n" -msgstr "" -"ffentlicher Schlssel %08lX ist um %lu Sekunde jnger 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 Schlssel %08lX ist um %lu Sekunden jnger 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 Schlssel 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 Schlssel 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: Signaturschlssel %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 Schlssel %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 "" -"Schlssel %08lX: Kein Unterschlssel fr die Unterschlsselwiderruf-" -"Beglaubigung\n" - -#: g10/sig-check.c:570 -#, fuzzy, c-format -msgid "key %s: no subkey for subkey binding signature\n" -msgstr "" -"Schlssel %08lX: Kein Unterschlssel fr die Unterschlsselanbindungs-" -"Beglaubigung\n" - -#: g10/sign.c:85 -msgid "can't put notation data into v3 (PGP 2.x style) signatures\n" -msgstr "" -"Notationen knnen in einen v3 (PGP 2.x-artigen) Schlssel 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 knnen in eine v3 (PGP 2.x-artige) Schlsselunterschrift 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) Schlssel 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 Schlssel(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 "Prfung 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 Schlsseln 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 Empfngervoreinstellungen\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 knnen Sie Klartextunterschriften nur mit PGP-2.x-artigen " -"Schlssel machen\n" - -#: g10/sign.c:1278 -#, c-format -msgid "%s encryption will be used\n" -msgstr "%s Verschlsselung wird verwendet\n" - -#: g10/skclist.c:127 g10/skclist.c:191 -msgid "key is not flagged as insecure - can't use it with the faked RNG!\n" -msgstr "" -"Schlssel ist nicht als unsicher gekennzeichnet - er ist nur mit einem\n" -"echten Zufallsgenerator verwendbar\n" - -#: g10/skclist.c:158 -#, fuzzy, c-format -msgid "skipped \"%s\": duplicated\n" -msgstr "bersprungen '%s': doppelt\n" - -#: g10/skclist.c:166 g10/skclist.c:176 g10/skclist.c:185 -#, fuzzy, c-format -msgid "skipped \"%s\": %s\n" -msgstr "bersprungen '%s': %s\n" - -#: g10/skclist.c:171 -msgid "skipped: secret key already present\n" -msgstr "bersprungen: geheimer Schlssel bereits vorhanden\n" - -#: g10/skclist.c:186 -#, 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-Schlssel. Das " -"ist fr 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 +#: sm/import.c:542 #, 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 "" +msgid "error reading input: %s\n" +msgstr "Fehler beim Lesen der Eingabe: %s\n" -#: g10/tdbdump.c:174 -#, fuzzy -msgid "invalid fingerprint" -msgstr "Fehler: ungltiger 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 +#: sm/keydb.c:188 #, c-format -msgid "trustdb: sync failed: %s\n" -msgstr "\"Trust-DB\": sync fehlgeschlagen: %s\n" +msgid "error creating keybox `%s': %s\n" +msgstr "Die \"Keybox\" `%s' konnte nicht erstellt werden: %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" +#: sm/keydb.c:191 +msgid "you may want to start the gpg-agent first\n" +msgstr "Sie sollten zuerst den gpg-agent starten\n" -#: g10/tdbio.c:135 g10/tdbio.c:1452 +#: sm/keydb.c:196 #, 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" +msgid "keybox `%s' created\n" +msgstr "Die \"Keybox\" `%s' wurde erstellt\n" -#: g10/tdbio.c:498 -#, fuzzy, c-format -msgid "can't access `%s': %s\n" -msgstr "kann '%s' nicht schlieen: %s\n" - -#: g10/tdbio.c:513 +#: sm/keydb.c:219 #, 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" +msgstr "Datei `%s' konnte nicht gesperrt werden\n" -#: g10/tdbio.c:525 g10/tdbio.c:592 -#, fuzzy, c-format -msgid "can't lock `%s'\n" -msgstr "'%s' kann nicht geffnet werden\n" +#: sm/keydb.c:1300 sm/keydb.c:1366 +msgid "failed to get the fingerprint\n" +msgstr "Kann den Fingerprint nicht ermitteln\n" -#: g10/tdbio.c:551 +#: sm/keydb.c:1307 sm/keydb.c:1373 +msgid "failed to allocate keyDB handle\n" +msgstr "Kann keinen KeyDB Handler bereitstellen\n" + +#: sm/keydb.c:1328 #, c-format -msgid "%s: failed to create version record: %s" -msgstr "%s: Fehler beim Erzeugen des Versionsatzes: %s" +msgid "problem looking for existing certificate: %s\n" +msgstr "Problem bei der Suche nach vorhandenem Zertifikat: %s\n" -#: g10/tdbio.c:555 +#: sm/keydb.c:1336 #, c-format -msgid "%s: invalid trustdb created\n" -msgstr "%s: ungltige trust-db erzeugt\n" +msgid "error finding writable keyDB: %s\n" +msgstr "Fehler bei der Suche nach einer schreibbaren KeyDB: %s\n" -#: g10/tdbio.c:558 +#: sm/keydb.c:1344 #, c-format -msgid "%s: trustdb created\n" -msgstr "%s: trust-db erzeugt\n" +msgid "error storing certificate: %s\n" +msgstr "Fehler beim Speichern des Zertifikats: %s\n" -#: g10/tdbio.c:602 -msgid "NOTE: trustdb not writable\n" -msgstr "Notiz: Die \"trustdb\" ist nicht schreibbar\n" - -#: g10/tdbio.c:619 +#: sm/keydb.c:1388 #, c-format -msgid "%s: invalid trustdb\n" -msgstr "%s: ungltige 'Trust'-Datenbank\n" +msgid "problem re-searching certificate: %s\n" +msgstr "Problem bei Wiederfinden des Zertifikats: %s\n" -#: g10/tdbio.c:651 +#: sm/keydb.c:1397 sm/keydb.c:1485 #, c-format -msgid "%s: failed to create hashtable: %s\n" -msgstr "%s: hashtable kann nicht erzeugt werden: %s\n" +msgid "error getting stored flags: %s\n" +msgstr "Fehler beim Holen der gespeicherten Flags: %s\n" -#: g10/tdbio.c:659 +#: sm/keydb.c:1406 sm/keydb.c:1496 #, c-format -msgid "%s: error updating version record: %s\n" -msgstr "%s: Fehler beim ndern des Versionsatzes: %s\n" +msgid "error storing flags: %s\n" +msgstr "Fehler beim Speichern der Flags: %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 +#: sm/sign.c:444 #, c-format -msgid "%s: error reading version record: %s\n" -msgstr "%s: Fehler beim Lesen des Versionsatzes: %s\n" +msgid "checking for qualified certificate failed: %s\n" +msgstr "Prüfung auf ein qualifiziertes Zertifikats fehlgeschlagen: %s\n" -#: g10/tdbio.c:735 +#: sm/sign.c:479 sm/verify.c:189 +msgid "(this is the MD2 algorithm)\n" +msgstr "(Dies ist der MD2 Algorithmus)\n" + +#: sm/verify.c:388 +msgid "Signature made " +msgstr "Signatur erzeugt am " + +#: sm/verify.c:392 +msgid "[date not given]" +msgstr "[Datum nicht vorhanden]" + +#: sm/verify.c:393 #, c-format -msgid "%s: error writing version record: %s\n" -msgstr "%s: Fehler beim Schreiben des Versionsatzes: %s\n" +msgid " using certificate ID %08lX\n" +msgstr "mittels Zertifikat ID %08lX\n" -#: g10/tdbio.c:1174 +#: sm/verify.c:506 +msgid "Good signature from" +msgstr "Korrekte Signatur von" + +#: sm/verify.c:507 +msgid " aka" +msgstr " alias" + +#: sm/qualified.c:113 #, c-format -msgid "trustdb: lseek failed: %s\n" -msgstr "trustdb: lseek fehlgeschlagen: %s\n" +msgid "invalid formatted fingerprint in `%s', line %d\n" +msgstr "Der Fingerabdruck in `%s', Zeile %d is fehlerhaft formatiert\n" -#: g10/tdbio.c:1182 +#: sm/qualified.c:131 #, c-format -msgid "trustdb: read failed (n=%d): %s\n" -msgstr "trustdb: read failed (n=%d): %s\n" +msgid "invalid country code in `%s', line %d\n" +msgstr "Ungültiger Landescode in `%s', Zeile %d\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 anhngen: %s\n" - -#: g10/tdbio.c:1504 -msgid "the trustdb is corrupted; please run \"gpg --fix-trustdb\".\n" -msgstr "" -"Die \"Trust\"-Datenbank ist beschdigt; 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 lnger als %d Zeichen knnen nicht benutzt werden\n" - -#: g10/textfilter.c:248 -#, c-format -msgid "input line longer than %d characters\n" -msgstr "Eingabezeile ist lnger als %d Zeichen\n" - -#: g10/trustdb.c:227 -#, c-format -msgid "`%s' is not a valid long keyID\n" -msgstr "'%s' ist keine gltige lange Schlssel-ID\n" - -#: g10/trustdb.c:258 -#, fuzzy, c-format -msgid "key %s: accepted as trusted key\n" -msgstr "Schlssel %08lX: Akzeptiert als vertrauenswrdiger Schlssel\n" - -#: g10/trustdb.c:296 -#, fuzzy, c-format -msgid "key %s occurs more than once in the trustdb\n" -msgstr "Schlssel %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 "" -"Schlssel %08lX: kein ffentlicher Schlssel fr den vertrauenswrdigen " -"Schlssel - bersprungen\n" - -#: g10/trustdb.c:321 -#, fuzzy, c-format -msgid "key %s marked as ultimately trusted\n" -msgstr "Schlssel ist als uneingeschrnkt vertrauenswrdig 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 "uneingeschrnkt" - -#: 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 "vollstndig" - -#: g10/trustdb.c:537 -msgid "ultimate" -msgstr "uneingeschrnkt" - -#: g10/trustdb.c:577 -msgid "no need for a trustdb check\n" -msgstr "\"Trust-DB\"-berprfung nicht ntig\n" - -#: g10/trustdb.c:583 g10/trustdb.c:2352 -#, c-format -msgid "next trustdb check due at %s\n" -msgstr "nchste \"Trust-DB\"-Pflichtberprfung 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\"-berprfung ist beim \"%s\"-Vertrauensmodell nicht ntig\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 ntig\n" - -#: g10/trustdb.c:839 g10/trustdb.c:1277 -#, fuzzy, c-format -msgid "public key %s not found: %s\n" -msgstr "ffentlicher Schlssel %08lX nicht gefunden: %s\n" - -#: g10/trustdb.c:1034 -msgid "please do a --check-trustdb\n" -msgstr "Bitte ein --check-trustdb durchfhren\n" - -#: g10/trustdb.c:1038 -msgid "checking the trustdb\n" -msgstr "\"Trust-DB\" wird berprft\n" - -# translated by wk -#: g10/trustdb.c:2095 -#, c-format -msgid "%d keys processed (%d validity counts cleared)\n" -msgstr "%d Schlssel verarbeitet (%d Validity Zhler gelscht)\n" - -#: g10/trustdb.c:2160 -msgid "no ultimately trusted keys found\n" -msgstr "keine uneingeschrnkt vertrauenswrdige Schlssel gefunden\n" - -#: g10/trustdb.c:2174 -#, fuzzy, c-format -msgid "public key of ultimately trusted key %s not found\n" -msgstr "" -"ff.Schlssel des uneingeschrnkt vertrautem Schlssel %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 +#: sm/qualified.c:224 #, c-format msgid "" -"depth: %d valid: %3d signed: %3d trust: %d-, %dq, %dn, %dm, %df, %du\n" +"You are about to create a signature using your certificate:\n" +"\"%s\"\n" +"This will create a qualified signature by law equated to a handwritten " +"signature.\n" +"\n" +"%s%sAre you really sure that you want to do this?" msgstr "" +"Sie sind dabei, eine Signatur mit dem Zertifikat:\n" +"\"%s\"\n" +"zu erzeugen. Dies wird eine qualifizierte Signatur erzeugen, \n" +"die gesetzlich einer handgeschriebenen gleichgestellt ist.\n" +"\n" +"%s%sSind Sie wirklich sicher, daß Sie dies möchten?" -#: g10/trustdb.c:2358 -#, c-format -msgid "unable to update trustdb version record: write failed: %s\n" -msgstr "" -"\"Trust-DB\"-Versions-Satz kann nicht gendert werden: Schreiben " -"fehlgeschlagen: %s\n" - -#: g10/verify.c:117 +#: sm/qualified.c:233 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" +"Note, that this software is not officially approved to create or verify such " +"signatures.\n" msgstr "" -"Die Unterschrift konnte nicht berprft werden.\n" -"Denken Sie daran, da die Datei mit der Unterschrift (.sig oder .asc)\n" -"als erster in der Kommandozeile stehen sollte.\n" +"Bitte beachten Sie, daß diese Software nicht offiziell zur Erzeugung\n" +"oder Prüfung von qualifizierten Signaturen zugelassen ist.\n" -#: g10/verify.c:192 +#: sm/qualified.c:321 #, 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 Schssel" - -#: util/errors.c:61 -msgid "bad secret key" -msgstr "Falscher geheimer Schlssel" - -#: util/errors.c:62 -msgid "bad signature" -msgstr "Falsche Unterschrift" - -#: util/errors.c:63 -msgid "checksum error" -msgstr "Prfsummen-Fehler" - -#: util/errors.c:64 -msgid "bad passphrase" -msgstr "Falsche Passphrase" - -#: util/errors.c:65 -msgid "public key not found" -msgstr "ffentlicher Schlssel nicht gefunden" - -#: util/errors.c:66 -msgid "unknown cipher algorithm" -msgstr "Unbekanntes Verschlsselungsverfahren" - -#: util/errors.c:67 -msgid "can't open the keyring" -msgstr "Der Schlsselbund kann nicht geffnet werden" - -#: util/errors.c:68 -msgid "invalid packet" -msgstr "Ungltiges Paket" - -#: util/errors.c:69 -msgid "invalid armor" -msgstr "Ungltige ASCII-Hlle" - -#: 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 Schlssel ist nicht vorhanden" - -#: util/errors.c:72 -msgid "wrong secret key used" -msgstr "Falscher geheimer Schlssel benutzt" - -#: util/errors.c:73 -msgid "not supported" -msgstr "Wird nicht untersttzt" - -#: util/errors.c:74 -msgid "bad key" -msgstr "Falscher Schlssel" - -#: 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 "Ungltige Passphrase" - -#: util/errors.c:81 -msgid "unimplemented pubkey algorithm" -msgstr "nicht implementiertes ffentliches Schlsselverfahren" - -#: util/errors.c:82 -msgid "unimplemented cipher algorithm" -msgstr "Verschlsselungsverfahren 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 "Ungltiger Schlsselbund" - -#: util/errors.c:88 -msgid "bad certificate" -msgstr "Falsches Zertifikat" - -#: util/errors.c:89 -msgid "malformed user id" -msgstr "Ungnstig aufgebaute User-ID" - -#: util/errors.c:90 -msgid "file close error" -msgstr "Fehler beim Schlieen 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 Lschen 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 Schlsselverfahren" - -#: util/errors.c:96 -msgid "file exists" -msgstr "Datei existiert bereits" - -#: util/errors.c:97 -msgid "weak key" -msgstr "Unsicherer Schlssel" - -#: util/errors.c:98 -msgid "invalid argument" -msgstr "Ungltiges Argument" - -#: util/errors.c:99 -msgid "bad URI" -msgstr "fehlerhafter URI" - -#: util/errors.c:100 -msgid "unsupported URI" -msgstr "Nicht untersttzter URI" - -#: util/errors.c:101 -msgid "network error" -msgstr "Netzwerkfehler" - -#: util/errors.c:103 -msgid "not encrypted" -msgstr "nicht verschlsselt" - -#: util/errors.c:104 -msgid "not processed" -msgstr "nicht bearbeitet" - -#: util/errors.c:106 -msgid "unusable public key" -msgstr "unbrauchbarer ffentlicher Schssel" - -#: util/errors.c:107 -msgid "unusable secret key" -msgstr "unbrauchbarer geheimer Schlssel" - -#: util/errors.c:108 -msgid "keyserver error" -msgstr "Schlsselserverfehler" - -#: 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" +msgid "" +"You are about to create a signature using your certificate:\n" +"\"%s\"\n" +"Note, that this certificate will NOT create a qualified signature!" msgstr "" +"Sie sind dabei, eine Signatur mit dem Zertifikat:\n" +"\"%s\n" +"zu erzeugen. Bitte beachten Sie, daß dies KEINE qualifizierte\n" +"Signatur erzeugen wird." -#. TRANSLATORS: See doc/TRANSLATE about this string. -#: util/miscutil.c:409 -msgid "cancel|cancel" +#: tools/gpgconf.c:56 +msgid "list all components" +msgstr "Liste aller Komponenten" + +#: tools/gpgconf.c:57 +msgid "|COMPONENT|list options" +msgstr "|KOMPONENTE|Zeige die Optionen an" + +#: tools/gpgconf.c:58 +msgid "|COMPONENT|change options" +msgstr "|KOMPONENTE|Ändere die Optionen" + +#: tools/gpgconf.c:64 +msgid "quiet" +msgstr "Weniger Ausgaben" + +#: tools/gpgconf.c:66 +msgid "activate changes at runtime, if possible" +msgstr "Aktiviere Änderungen zur Laufzeit; falls möglich" + +#: tools/gpgconf.c:89 +msgid "Usage: gpgconf [options] (-h for help)" +msgstr "Gebrauch: gpgconf [Optionen] (-h für Hilfe)" + +#: tools/gpgconf.c:92 +msgid "" +"Syntax: gpgconf [options]\n" +"Manage configuration options for tools of the GnuPG system\n" msgstr "" +"Syntax: gpgconf {Optionen]\n" +"Verwalte Konfigurationsoptionen für Programme des GnuPG Systems\n" -#: util/miscutil.c:410 -msgid "oO" -msgstr "oO" +#: tools/gpgconf.c:176 +msgid "usage: gpgconf [options] " +msgstr "Gebrauch: gpgconf [Optionen] " -#: util/miscutil.c:411 -msgid "cC" -msgstr "cC" +#: tools/gpgconf.c:178 +msgid "Need one component argument" +msgstr "Benötige ein Komponenten Argument" -#: util/secmem.c:97 -msgid "WARNING: using insecure memory!\n" -msgstr "WARNUNG: Sensible Daten knnten auf Platte ausgelagert werden.\n" +#: tools/gpgconf.c:187 +msgid "Component not found" +msgstr "Komponente nicht gefunden" -#: 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 fr weitere Informationen\n" +#: tools/gpgconf-comp.c:437 tools/gpgconf-comp.c:501 tools/gpgconf-comp.c:568 +#: tools/gpgconf-comp.c:624 tools/gpgconf-comp.c:693 +msgid "Options controlling the diagnostic output" +msgstr "Optionen zur Einstellung Diagnoseausgaben" -# " Um dies zu vermeiden, kann das Programm suid(root) installiert werden.\n" -# " Bitte wenden Sie sich hierzu an den Systemadministrator.\n" -#: util/secmem.c:350 -msgid "operation is not possible without initialized secure memory\n" -msgstr "Vorgang ist ohne sicheren Hauptspeicher nicht mglich\n" +#: tools/gpgconf-comp.c:450 tools/gpgconf-comp.c:514 tools/gpgconf-comp.c:581 +#: tools/gpgconf-comp.c:637 tools/gpgconf-comp.c:716 +msgid "Options controlling the configuration" +msgstr "Optionen zur Einstellung der Konfiguration" -#: util/secmem.c:351 -msgid "(you may have used the wrong program for this task)\n" -msgstr "" -"(mglicherweise haben Sie das falsche Programm fr diese Aufgabe benutzt)\n" +#: tools/gpgconf-comp.c:460 tools/gpgconf-comp.c:539 tools/gpgconf-comp.c:588 +#: tools/gpgconf-comp.c:647 tools/gpgconf-comp.c:723 +msgid "Options useful for debugging" +msgstr "Nützliche Optionen zum Debuggen" -#~ msgid "DSA requires the use of a 160 bit hash algorithm\n" -#~ msgstr "DSA bentigt einen 160-bit Hash Algorithmus\n" +#: tools/gpgconf-comp.c:465 tools/gpgconf-comp.c:544 tools/gpgconf-comp.c:593 +#: tools/gpgconf-comp.c:652 tools/gpgconf-comp.c:731 +msgid "|FILE|write server mode logs to FILE" +msgstr "|DATEI|Schreibe im Servermodus Logs auf DATEI" -#~ msgid "" -#~ "please see http://www.gnupg.org/why-not-idea.html for more information\n" -#~ msgstr "Fr weitere Info siehe http://www.gnupg.org/why-not-idea.html\n" +#: tools/gpgconf-comp.c:473 tools/gpgconf-comp.c:549 tools/gpgconf-comp.c:660 +msgid "Options controlling the security" +msgstr "Optionen zur Einstellung der Sicherheit" -#~ 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" +#: tools/gpgconf-comp.c:601 +msgid "Configuration for Keyservers" +msgstr "Konfiguration der Schlüsselserver" -#~ msgid "a user notation name must contain the '@' character\n" -#~ msgstr "Ein \"notation\"-Wert darf das '@'-Zeichen nicht verwenden\n" +#: tools/gpgconf-comp.c:606 +msgid "allow PKA lookups (DNS requests)" +msgstr "Erlaube PKA Zugriffe (DNS Anfragen)" -#, fuzzy -#~ msgid "a notation name must not contain more than one '@' character\n" -#~ msgstr "Ein \"notation\"-Wert darf das '@'-Zeichen nicht verwenden\n" +#: tools/gpgconf-comp.c:665 +msgid "do not check CRLs for root certificates" +msgstr "CRL bei Wurzelzertifikaten nicht überprüfen" -#~ msgid "a notation value must not use any control characters\n" -#~ msgstr "Ein \"notation\"-Wert darf keine Kontrollzeichen verwenden\n" +#: tools/gpgconf-comp.c:706 +msgid "Options controlling the format of the output" +msgstr "Optionen zum Einstellen der Ausgabeformate" -#~ msgid "WARNING: invalid notation data found\n" -#~ msgstr "WARNUNG: Ungltige \"Notation\"-Daten gefunden\n" +#: tools/gpgconf-comp.c:742 +msgid "Options controlling the interactivity and enforcement" +msgstr "Optionen zur Einstellung der Interaktivität und Geltendmachung" -#~ msgid "not human readable" -#~ msgstr "nicht als Klartext darstellbar" +#: tools/gpgconf-comp.c:752 +msgid "Configuration for HTTP servers" +msgstr "Konfiguration für HTTP Server" -#, fuzzy -#~ msgid "all export-clean-* options from above" -#~ msgstr "Optionen aus der Datei lesen" +#: tools/gpgconf-comp.c:763 +msgid "use system's HTTP proxy setting" +msgstr "Einstellungen des System HTTP-Proxy benutzen" -#, fuzzy -#~ msgid "all import-clean-* options from above" -#~ msgstr "Optionen aus der Datei lesen" +#: tools/gpgconf-comp.c:768 +msgid "Configuration of LDAP servers to use" +msgstr "Konfiguration der zu nutzenden LDAP-Server" -#~ msgid "expired: %s)" -#~ msgstr "verfllt: %s)" +#: tools/gpgconf-comp.c:805 +msgid "Configuration for OCSP" +msgstr "Konfiguration zu OCSP" -#, fuzzy -#~ msgid "key %s: expired signature from key %s - skipped\n" -#~ msgstr "" -#~ "Schlssel %08lX: unerwartete Unterschriftenklasse (0x%02x) - bergangen\n" +#~ msgid "[Error - unknown encoding]" +#~ msgstr "[Fehler - Unbekannte Kodierung]" -#, fuzzy -#~ msgid "Unable to clean `%s'\n" -#~ msgstr "Ausfhren des Programms `%s' nicht mglich: %s\n" +#~ msgid "do not allow multiple connections" +#~ msgstr "Nicht mehr als eine Verbindung erlauben" -#, fuzzy -#~ msgid "User ID \"%s\": %d signature removed.\n" -#~ msgstr "User-ID \"%s\" ist widerrufen." +#~ msgid "|N|set OpenSC debug level to N" +#~ msgstr "|N|Den OpenSC Debugstufe auf N setzen" -#, fuzzy -#~ msgid "User ID \"%s\": %d signatures removed.\n" -#~ msgstr "User-ID \"%s\" ist widerrufen." +#~ msgid "do not use the OpenSC layer" +#~ msgstr "Den OpenSC basierten Kartenzugriff nicht nutzen" -#, fuzzy -#~ msgid "User ID \"%s\" removed: %s\n" -#~ msgstr "User-ID \"%s\" ist widerrufen." - -#, fuzzy -#~ msgid "No user IDs are removable.\n" -#~ msgstr "Keine User-ID fr Schlssel\n" +#~ msgid "PIN [sigs done: %lu]" +#~ msgstr "PIN [erzeugte signaturen: %lu]" #~ 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 Lnge des RSA-Modulus betrgt nicht %d\n" +#~ msgid "reading the key failed\n" +#~ msgstr "Fehler beim Lesen des Schlüssels: %s\n" -#~ msgid "length of an RSA prime is not %d\n" -#~ msgstr "die Lnge einer RSA-Primzahl ist nicht %d\n" +#~ msgid "error creating a pipe: %s\n" +#~ msgstr "Fehler beim Erzeugen einer \"Pipe\": %s\n" -#~ msgid "bad passphrase or unknown cipher algorithm (%d)\n" +#~ msgid "error forking process: %s\n" +#~ msgstr "Fehler beim \"Forken\" des Prozess: %s\n" + +#~ msgid "waiting for protect-tool to terminate failed: %s\n" #~ msgstr "" -#~ "Falsche Passphrase oder unbekanntes Verschlsselungsverfahren (%d)\n" +#~ "Das Warten auf die Beendigung des protect-tools ist fehlgeschlagen: %s\n" -#~ msgid "can't set client pid for the agent\n" -#~ msgstr "Client-PID fr den Agent kann nicht gesetzt werden\n" +#~ msgid "error running `%s': probably not installed\n" +#~ msgstr "Feler bei Ausführung von `%s': wahrscheinlich nicht installiert\n" -#~ msgid "can't get server read FD for the agent\n" -#~ msgstr "Server-Lese-Handle fr den Agent nicht verfgbar\n" +#~ msgid "error running `%s': exit status %d\n" +#~ msgstr "Fehler bei Ausführung von `%s': Endestatus %d\n" -#~ msgid "can't get server write FD for the agent\n" -#~ msgstr "Server-Schreib-Handle fr den Agent nicht verfgbar\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 "Zweitschlssel N auswhlen" - -#~ msgid "list signatures" -#~ msgstr "Liste der Signaturen" - -#~ msgid "sign the key" -#~ msgstr "Den Schlssel signieren" - -#~ msgid "add a secondary key" -#~ msgstr "Einen Zweitschlssel hinzufgen" - -#~ 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 "genderte Voreinstellungen" - -#~ msgid "No secondary key with index %d\n" -#~ msgstr "Kein Zweitschlssel 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 Schlssel nicht-widerrufbar beglaubigen" - -#~ msgid "sign the key locally and non-revocably" -#~ msgstr "" -#~ "Den Schlssel nicht-widerrufbar und nur fr diesen Rechner signieren" - -#~ msgid "q" -#~ msgstr "q" - -#~ msgid "help" -#~ msgstr "help" - -#~ msgid "list" -#~ msgstr "Liste der Schlssel" - -#~ 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 "Schlsselserverfehler" - -#~ 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 "Usage: sc-investigate [options] (-h for help)\n" +#~ msgstr "Gebrauch: sc-investigate [Optionen] (-h für Hilfe)\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" +#~ "Syntax: sc-investigate [options] [args]]\n" +#~ "Have a look at smartcards\n" #~ msgstr "" -#~ "Es wird ein neues %s Schlsselpaar erzeugt.\n" -#~ " kleinste Schlssellnge ist 768 Bit\n" -#~ " standard Schlssellnge ist 1024 Bit\n" -#~ " grte sinnvolle Schlssellnge ist 2048 Bit\n" +#~ "Gebrauch: sc-investigate [Optionen] [Argumente]\n" +#~ "Den Inhalt einer Smartcard inspizieren\n" -#~ msgid "DSA only allows keysizes from 512 to 1024\n" -#~ msgstr "DSA erlaubt nur Schlssellngen von 512 bis 1024\n" - -#~ msgid "keysize too small; 1024 is smallest value allowed for RSA.\n" -#~ msgstr "zu kurz; 1024 ist die kleinste fr RSA mgliche Schlssellnge.\n" - -#~ msgid "keysize too small; 768 is smallest value allowed.\n" -#~ msgstr "zu kurz; 768 ist die kleinste mgliche Schlssellnge.\n" - -#~ msgid "keysize too large; %d is largest value allowed.\n" -#~ msgstr "Schsselgre zu hoch; %d ist der Maximalwert.\n" - -#~ msgid "" -#~ "Keysizes larger than 2048 are not suggested because\n" -#~ "computations take REALLY long!\n" +#~ msgid "can't access Extended Capability Flags - invalid OpenPGP card?\n" #~ msgstr "" -#~ "Schlssellngen grer als 2048 werden nicht empfohlen, da die\n" -#~ "Berechnungen dann WIRKLICH lange brauchen!\n" +#~ "Zugriff auf die Extended Capability Flags nicht möglich - ungültige " +#~ "OpenPGP Karte?\n" -#, fuzzy -#~ msgid "Are you sure that you want this keysize? (y/N) " -#~ msgstr "Sind Sie sicher, da Sie diese Schlssellnge wnschen? " +#~ msgid "Enter passphrase:" +#~ msgstr "Bitte das Mantra (Passphrase) eingeben:" -#~ msgid "" -#~ "Okay, but keep in mind that your monitor and keyboard radiation is also " -#~ "very vulnerable to attacks!\n" +#~ msgid "[error]" +#~ msgstr "[Fehler]" + +#~ msgid "no key usage specified - accepted for encryption\n" #~ msgstr "" -#~ "Gut, aber bitte denken Sie auch daran, da Monitor und Tastatur Daten " -#~ "abstrahlen und diese leicht mitgelesen werden knnen.\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 Verschlsselungsmethode 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 durchgefhrt werden.\n" - -#~ msgid "key `%s' not found: %s\n" -#~ msgstr "Schlssel `%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 geffnet werden: %s\n" - -#, fuzzy -#~ msgid " \"" -#~ msgstr " alias \"" - -#~ msgid "key %08lX: key has been revoked!\n" -#~ msgstr "Schlssel %08lX: Schlssel wurde widerrufen\n" - -#~ msgid "key %08lX: subkey has been revoked!\n" -#~ msgstr "Schlssel %08lX: Unterschlssel wurde widerrufen\n" - -#~ msgid "%08lX: key has expired\n" -#~ msgstr "%08lX: Schlssel ist verfallen!\n" - -#~ msgid "%08lX: We do NOT trust this key\n" -#~ msgstr "%08lX: Wir haben KEIN Vertrauen zu diesem Schlssel!\n" - -#~ msgid " (%d) RSA (sign and encrypt)\n" -#~ msgstr " (%d) RSA (signieren/beglaubigen und verschlsseln)\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 verschlsseln)\n" - -#, fuzzy -#~ msgid " (%d) RSA (encrypt and auth)\n" -#~ msgstr " (%d) RSA (nur verschlsseln)\n" - -#, fuzzy -#~ msgid " (%d) RSA (sign, encrypt and auth)\n" -#~ msgstr " (%d) RSA (signieren/beglaubigen und verschlsseln)\n" - -#~ msgid "%s: can't open: %s\n" -#~ msgstr "%s: kann nicht geffnet 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 geffnet 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 vollstndig\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 Schlssel %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 Schlssel trotzdem benutzen wollen,\n" -#~ "so antworten Sie mit \"ja\"." - -#~ msgid "Unable to open photo \"%s\": %s\n" -#~ msgstr "Das Bild \"%s\" konnte nicht geffnet werden: %s\n" - -#~ msgid "can't open file: %s\n" -#~ msgstr "Datei kann nicht geffnet 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 " (Hauptschlssel-ID %08lX)" - -#~ msgid "rev! subkey has been revoked: %s\n" -#~ msgstr "rev! Unterschlssel wurde widerrufen: %s\n" - -#~ msgid "rev- faked revocation found\n" -#~ msgstr "rev- geflschter Schlsselwiderruf entdeckt\n" - -#~ msgid "rev? problem checking revocation: %s\n" -#~ msgstr "rev? Schwierigkeiten bei der Widerruf-berprfung: %s\n" - -#, fuzzy -#~ msgid " [expired: %s]" -#~ msgstr " [verfllt: %s]" - -#~ msgid " [expires: %s]" -#~ msgstr " [verfllt: %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 verschlsseln" - -#~ msgid "store only" -#~ msgstr "Nur speichern" - -#~ msgid "|[files]|decrypt files" -#~ msgstr "|[Dateien]|Dateien entschlsseln" - -#~ msgid "sign a key non-revocably" -#~ msgstr "Schlssel nicht widerrufbar signieren" - -#~ msgid "sign a key locally and non-revocably" -#~ msgstr "Schlssel nur fr 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 beschdigten \"Trust\"-Datenb." - -#~ msgid "De-Armor a file or stdin" -#~ msgstr "Datei oder stdin von der ASCII-Hlle befreien" - -#~ msgid "En-Armor a file or stdin" -#~ msgstr "Datei oder stdin in eine ASCII-Hlle einpacken" - -#~ msgid "|NAME|use NAME as default recipient" -#~ msgstr "|NAME|NAME als voreingestellten Empfnger benutzen" - -#~ msgid "use the default key as default recipient" -#~ msgstr "" -#~ "Den Standardschlssel als voreingestellten\n" -#~ "Empfnger 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 Verschlsseln ein Siegel (MDC) verwenden" - -#~ msgid "never use a MDC for encryption" -#~ msgstr "Beim Verschlsseln 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 Schlsselbund mitbenutzen" - -#~ msgid "add this secret keyring to the list" -#~ msgstr "Als geheimen Schlsselbund mitbenutzen" - -#~ msgid "|NAME|use NAME as default secret key" -#~ msgstr "|NAME|NAME als voreingestellten Schlssel benutzen" - -#~ msgid "|HOST|use this keyserver to lookup keys" -#~ msgstr "|HOST|Schlssel 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 Schlssel uneingeschrnkt 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-, Verschlsselungs- und\n" -#~ "Hashoptionen auf OpenPGP-Verhalten einstellen" - -#~ msgid "set all packet, cipher and digest options to PGP 2.x behavior" -#~ msgstr "" -#~ "alle Paket-, Verschlsselungs- 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 fr Passphrasen benutzen" - -#~ msgid "|NAME|use cipher algorithm NAME for passphrases" -#~ msgstr "|NAME|Verschl.verfahren NAME fr 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 "Empfnger-ID verschlsselter 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 fr 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 gehrt.\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 Schlssel wirklich dem " -#~ "vorgeblichen\n" -#~ "Besitzer gehrt, aber er wird trotzdem akzeptiert\n" - -#~ msgid "preference %c%lu is not valid\n" -#~ msgstr "Voreinstellung %c%lu ist nicht gltig\n" - -#~ msgid "too many `%c' preferences\n" -#~ msgstr "zu viele `%c' Voreinstellungen\n" - -#~ msgid "key %08lX: not a rfc2440 key - skipped\n" -#~ msgstr "Schlssel %08lX: dies ist kein RFC2440-Schssel - bersprungen\n" - -#~ msgid "" -#~ "NOTE: Elgamal primary key detected - this may take some time to import\n" -#~ msgstr "" -#~ "HINWEIS: Elgamal-Hauptschlssel gefunden - der Import knnte einige Zeit " -#~ "dauern\n" - -#~ msgid " (default)" -#~ msgstr "Daten entschlsseln (Voreinstellung)" - -#~ msgid "%s%c %4u%c/%08lX created: %s expires: %s" -#~ msgstr "%s%c %4u%c/%08lX erstellt: %s verfllt: %s" - -#~ msgid "Policy: " -#~ msgstr "Richtlinie: " - -#~ msgid "can't get key from keyserver: %s\n" -#~ msgstr "Schlssel ist beim Schlsselserver nicht erhltlich: %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 Schlsselserver untersttzt --search-keys nicht\n" - -#~ msgid "can't search keyserver: %s\n" -#~ msgstr "kann Schlsselserver nicht durchsuchen: %s\n" - -#~ msgid "" -#~ "key %08lX: this is a PGP generated ElGamal key which is NOT secure for " -#~ "signatures!\n" -#~ msgstr "" -#~ "Schlssel %08lX: Dieser durch PGP erzeugte ElGamal-Schlssel ist fr " -#~ "Signaturen NICHT sicher genug!\n" - -#~ msgid "" -#~ "key %08lX has been created %lu second in future (time warp or clock " -#~ "problem)\n" -#~ msgstr "" -#~ "Der Schlssel %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 Schlssel %08lX wurde %lu Sekunden in der Zukunft erzeugt (Zeitreise " -#~ "oder Uhren stimmen nicht berein)\n" - -#~ msgid "key %08lX marked as ultimately trusted\n" -#~ msgstr "" -#~ "Schlssel %08lX ist als uneingeschrnkt vertrauenswrdig gekennzeichnet\n" - -#~ msgid "signature from Elgamal signing key %08lX to %08lX skipped\n" -#~ msgstr "Signatur von Elgamal Signaturschlssel %08lX fr %08lX ignoriert\n" - -#~ msgid "signature from %08lX to Elgamal signing key %08lX skipped\n" -#~ msgstr "Signatur von %08lX fr Elgamal Signaturschlssel %08lX ignoriert\n" - -#~ msgid "checking at depth %d signed=%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/%d/%d\n" -#~ msgstr "berprfen, Tiefe %d, gltig=%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 "" -#~ "Whlen 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 " -#~ "berprfung\n" -#~ " wesentlich schneller abluft, als die von \"ElGamal\".\n" -#~ "\n" -#~ "ElGamal ist ein Verfahren fr Unterschrift, Beglaubigung und " -#~ "Verschlsselung\n" -#~ " OpenPGP unterscheidet zwischen zwei Arten von ElGamal: eines nur zum\n" -#~ " Unterschreiben/Beglaubigen und eines zustzlich zum Verschlsseln.\n" -#~ " Eigentlich sind diese Arten identisch; allerdings mssen einige " -#~ "Parameter\n" -#~ " auf eine besondere Art gewhlt werden, um einen sicheren Schlssel fr\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 zustzlichem Verschlsseln) zu verstehen.\n" -#~ "\n" -#~ "Der Hauptschlssel (\"primary Key\") mu auf jeden Fall zum " -#~ "Unterschreiben fhig\n" -#~ "sein. Deshalb kann ein nur-Verschlssel-ElGamal-Schlssel dafr 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 Schlssel in RFC 2440 definiert sind, ist ihre Verwendung " -#~ "nicht\n" -#~ "empfohlen. Sie werden nmlich nicht von allen Programmen untersttzt.\n" -#~ "Auerdem sind damit ezeugte Unterschriften recht gro und ihre " -#~ "berprfung\n" -#~ "ist langsam." - -#~ msgid "%lu keys so far checked (%lu signatures)\n" -#~ msgstr "%lu Schlssel bislang geprft (%lu Beglaubigungen)\n" - -#~ msgid "key incomplete\n" -#~ msgstr "Schlssel nicht vollstndig\n" - -#~ msgid "key %08lX incomplete\n" -#~ msgstr "Schlssel %08lX unvollstndig\n" - -#~ msgid "no|no" -#~ msgstr "nein" - -#~ msgid "quit|quit" -#~ msgstr "quit" - -#~ msgid " (%d) ElGamal (sign and encrypt)\n" -#~ msgstr " (%d) ElGamal (signieren/beglaubigen und verschlsseln)\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 untersttzt. Sie knnen diesen " -#~ "Schlssel\n" -#~ "nicht zur Verstndigung mit PGP-Anwendern benutzen. Ausserdem ist " -#~ "dieses\n" -#~ "Verfahren sehr langsam, und es knnte nicht so sicher wie die anderen " -#~ "sein.\n" - -#~ msgid "Create anyway? " -#~ msgstr "Trotzdem erstellen? " - -#~ msgid "invalid symkey algorithm detected (%d)\n" -#~ msgstr "Ungltiger Veschlsselungsalgorithmus entdeckt (%d)\n" - -#~ msgid "this keyserver is not fully HKP compatible\n" -#~ msgstr "Dieser Schlsselserver ist nicht vollstndig 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 fr Gruppe \"%s\"\n" - -#~ msgid "" -#~ "you have to start GnuPG again, so it can read the new configuration file\n" -#~ msgstr "" -#~ "Sie mssen GnuPG noch einmal starten, damit es die neue " -#~ "Konfigurationsdatei liest\n" - -#~ msgid "changing permission of `%s' failed: %s\n" -#~ msgstr "ndern der Zugriffsrechte fr `%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 mssen 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 Schlssel besitzt bereits eine Foto-ID.\n" -#~ " Ein hinzugefgte Foto-ID knnte einige Versionen von PGP " -#~ "verwirren.\n" - -#~ msgid "You may only have one photo ID on a key.\n" -#~ msgstr "Sie knnen nur eine Foto-ID fr diesen Schlssel haben.\n" - -#~ msgid "Are you sure you still want to sign it?\n" -#~ msgstr "Sind Sie sicher, da Sie dies wiklich unterschreiben mchten?\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 "Schlssel %08lX: Unsere Kopie hat keine Eigenbeglaubigung\n" - -#~ msgid "Do you really need such a large keysize? " -#~ msgstr "Brauchen Sie wirklich einen derartig langen Schlssel? " - -#~ 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 Schlssel 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 Schlssel ist %08lX\n" - -#~ msgid "%lu key(s) to refresh\n" -#~ msgstr "\t%lu Schlssel mit Fehlern\n" - -#~ msgid "|[NAMES]|check the trust database" -#~ msgstr "|[NAMEN]|berprfen 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 "" -#~ "Fr diesen Schlssel konnte kein gltiger \"Trust Path\" gefunden " -#~ "werden.\n" -#~ "Mal sehen, ob wir sonst irgendwie ein paar fehlende \"Owner trust\" " -#~ "Werte \n" -#~ "ermitteln knnen.\n" -#~ "\n" - -#~ msgid "" -#~ "No path leading to one of our keys found.\n" -#~ "\n" -#~ msgstr "" -#~ "Kein Pfad fhrt zu einem unserer Schlsseln.\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 gendert.\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 Prfen des Schlssels: %s\n" - -#~ msgid "too many entries in unk cache - disabled\n" -#~ msgstr "zu viele Eintrge im unk-Lager - abgeschaltet\n" - -#~ msgid "secret key %08lX not imported (use %s to allow for it)\n" -#~ msgstr "" -#~ "Geheimer Schlssel %08lX nicht importiert (%s verwenden, um das zu " -#~ "ermglichen)\n" - -#~ msgid "assuming bad MDC due to an unknown critical bit\n" -#~ msgstr "" -#~ "Vermutlich ist das Siegel (MDC) BESCHDIGT (wegen unbekanntem \"critical " -#~ "bit\")\n" - -#~ msgid "error reading dir record for LID %lu: %s\n" -#~ msgstr "Fehler beim Lesen des Dir-Satzes fr 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 Hauptschlssel fr LID %lu\n" - -#~ msgid "error reading primary key for LID %lu: %s\n" -#~ msgstr "Fehler beim Lesen den Hauptschlssels der LID %lu: %s\n" - -#~ msgid "key %08lX: query record failed\n" -#~ msgstr "Schlssel %08lX: Satzabfrage fehlgeschlagen\n" - -#~ msgid "key %08lX: already in trusted key table\n" -#~ msgstr "Schlssel %08lX: Ist bereits in geheimer Schlsseltabelle\n" - -#~ msgid "NOTE: secret key %08lX is NOT protected.\n" -#~ msgstr "HINWEIS: Geheimer Schlssel %08lX ist NICHT geschtzt.\n" - -#~ msgid "key %08lX: secret and public key don't match\n" -#~ msgstr "" -#~ "Schlssel %08lX: geheimer und ffentlicher Schlssel passen nicht " -#~ "zusammen.\n" - -#~ msgid "key %08lX.%lu: Good subkey binding\n" -#~ msgstr "Schlssel %08lX.%lu: Korrekte Unterschlssel-Anbindung\n" - -#~ msgid "key %08lX.%lu: Invalid subkey binding: %s\n" -#~ msgstr "Schlssel %08lX.%lu: Ungltige Unterschlssel-Anbindung: %s\n" - -#~ msgid "key %08lX.%lu: Valid key revocation\n" -#~ msgstr "Schlssel %08lX.%lu: Gltiger Schlsselwiderruf\n" - -#~ msgid "key %08lX.%lu: Invalid key revocation: %s\n" -#~ msgstr "Schlssel %08lX.%lu: Ungltiger Schlsselwiderruf: %s\n" - -#~ msgid "Good self-signature" -#~ msgstr "Korrekte Eigenbeglaubigung" - -#~ msgid "Invalid self-signature" -#~ msgstr "Ungltige Eigenbeglaubigung" - -#~ msgid "Valid user ID revocation skipped due to a newer self signature" -#~ msgstr "" -#~ "Gltiger User-ID-Widerruf ignoriert, da eine neuere Eigenbeglaubigung " -#~ "vorliegt" - -#~ msgid "Valid user ID revocation" -#~ msgstr "Gltiger User-ID-Widerruf" - -#~ msgid "Invalid user ID revocation" -#~ msgstr "Ungltiger User-ID-Widerruf" - -#~ msgid "Valid certificate revocation" -#~ msgstr "Gltiger Zerifikat-Widerruf" - -#~ msgid "Good certificate" -#~ msgstr "Korrektes Zertifikat" - -#~ msgid "Invalid certificate revocation" -#~ msgstr "Ungltiger Zertifikatswiderruf" - -#~ msgid "Invalid certificate" -#~ msgstr "Ungltiges 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 ?: Einfgen fehlgeschlagen: %s\n" - -#~ msgid "lid %lu: insert failed: %s\n" -#~ msgstr "lid %lu: Einfgen fehlgeschlagen: %s\n" - -#~ msgid "lid %lu: inserted\n" -#~ msgstr "lid %lu: eingefgt\n" - -#~ msgid "\t%lu keys inserted\n" -#~ msgstr "\t%lu Schlssel eingefgt\n" - -#~ msgid "lid %lu: dir record w/o key - skipped\n" -#~ msgstr "lid %lu: Dir-Satz ohne Schlssel - bergangen\n" - -#~ msgid "\t%lu due to new pubkeys\n" -#~ msgstr "\t%lu wegen neuer Schlssel\n" - -#~ msgid "\t%lu keys skipped\n" -#~ msgstr "\t%lu Schlssel bersprungen\n" - -#~ msgid "\t%lu keys updated\n" -#~ msgstr "\t%lu Schlssel gendert\n" - -#~ msgid "Ooops, no keys\n" -#~ msgstr "Huch, keine Schlssel\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 "Schlssel %08lX: 'trust record' einfgen fehlgeschlagen: %s\n" - -#~ msgid "key %08lX.%lu: inserted into trustdb\n" -#~ msgstr "Schlssel %08lX.%lu: in \"trustdb\" eingefgt\n" - -#~ msgid "key %08lX.%lu: created in future (time warp or clock problem)\n" -#~ msgstr "" -#~ "Schlssel %08lX.%lu: wurde in der Zukunft erzeugt (Zeitreise oder Uhren " -#~ "stimmen nicht berein)\n" - -#~ msgid "key %08lX.%lu: expired at %s\n" -#~ msgstr "Schlssel %08lX.%lu: verfallen am %s\n" - -#~ msgid "key %08lX.%lu: trust check failed: %s\n" -#~ msgstr "Schlssel %08lX.%lu: Vertrauensprfung 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 eingefgt\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 "" -#~ "Mchten Sie wirklich einen Unterschriften-/Verschlsselungschlssel " -#~ "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 Schlsselbund `%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 knnen noch nicht benutzt werden\n" - -#~ msgid "%s: can't create keyring: %s\n" -#~ msgstr "%s: Schlsselbund kann nicht erzeugt werden: %s\n" - -#~ msgid "RSA key cannot be used in this version\n" -#~ msgstr "RSA-Schlssel knnen in dieser Version nicht verwendet werden\n" - -#~ msgid "No key for user ID\n" -#~ msgstr "Kein Schlssel fr User-ID\n" - -#~ msgid "no secret key for decryption available\n" -#~ msgstr "kein geheimer Schlssel zur Entschlsselung 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 Schlsselerzeugung kann nur im interaktiven Modus benutzt werden.\n" +#~ "Schlüsselverwendungszweck nicht vorhanden - wird zum Verschlüsseln " +#~ "akzeptiert\n" diff --git a/po/el.po b/po/el.po deleted file mode 100644 index e4dc91eab..000000000 --- a/po/el.po +++ /dev/null @@ -1,7237 +0,0 @@ -# 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-07-28 11:12+0200\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:1003 g10/gpg.c:3461 g10/import.c:195 g10/keygen.c:2385 -#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:342 -#: 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:1002 g10/keygen.c:2864 -#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:263 -#: g10/openfile.c:357 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:320 -#, c-format -msgid "armor: %s\n" -msgstr ": %s\n" - -#: g10/armor.c:359 -msgid "invalid armor header: " -msgstr " : " - -#: g10/armor.c:370 -msgid "armor header: " -msgstr " : " - -#: g10/armor.c:381 -msgid "invalid clearsig header\n" -msgstr " clearsig\n" - -#: g10/armor.c:433 -msgid "nested clear text signatures\n" -msgstr " \n" - -#: g10/armor.c:568 -#, fuzzy -msgid "unexpected armor: " -msgstr " :" - -#: g10/armor.c:580 -msgid "invalid dash escaped line: " -msgstr " dash escaped : " - -#: g10/armor.c:734 g10/armor.c:1343 -#, fuzzy, c-format -msgid "invalid radix64 character %02X skipped\n" -msgstr " radix64 %02x \n" - -#: g10/armor.c:777 -msgid "premature eof (no CRC)\n" -msgstr " ( CRC)\n" - -#: g10/armor.c:811 -msgid "premature eof (in CRC)\n" -msgstr " ( CRC)\n" - -#: g10/armor.c:819 -msgid "malformed CRC\n" -msgstr " CRC\n" - -#: g10/armor.c:823 g10/armor.c:1380 -#, fuzzy, c-format -msgid "CRC error; %06lX - %06lX\n" -msgstr " CRC: %06lx - %06lx\n" - -#: g10/armor.c:843 -#, fuzzy -msgid "premature eof (in trailer)\n" -msgstr " ( railer)\n" - -#: g10/armor.c:847 -msgid "error in trailer line\n" -msgstr " trailer\n" - -#: g10/armor.c:1158 -msgid "no valid OpenPGP data found.\n" -msgstr " OpenPGP .\n" - -#: g10/armor.c:1163 -#, c-format -msgid "invalid armor: line longer than %d characters\n" -msgstr " : %d \n" - -#: g10/armor.c:1167 -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:280 -#, 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:3826 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:3387 g10/keyserver.c:1700 -#: 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:2349 g10/keyserver.c:1714 -#: 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:67 g10/mainproc.c:293 -#, c-format -msgid "%s encrypted data\n" -msgstr "%s \n" - -#: g10/encr-data.c:69 g10/mainproc.c:297 -#, c-format -msgid "encrypted with unknown algorithm %d\n" -msgstr " %d\n" - -#: g10/encr-data.c:93 -msgid "" -"WARNING: message was encrypted with a weak key in the symmetric cipher.\n" -msgstr "" -": \n" -" .\n" - -#: g10/encr-data.c:104 -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:415 -#, 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:375 -msgid "" -"@Commands:\n" -" " -msgstr "" -"@:\n" -" " - -#: g10/gpg.c:377 -msgid "|[file]|make a signature" -msgstr "|[]| " - -#: g10/gpg.c:378 -msgid "|[file]|make a clear text signature" -msgstr "|[]| " - -#: g10/gpg.c:379 -msgid "make a detached signature" -msgstr " " - -#: g10/gpg.c:380 -msgid "encrypt data" -msgstr " " - -#: g10/gpg.c:382 -msgid "encryption only with symmetric cipher" -msgstr " " - -#: g10/gpg.c:384 -msgid "decrypt data (default)" -msgstr " ()" - -#: g10/gpg.c:386 -msgid "verify a signature" -msgstr " " - -#: g10/gpg.c:388 -msgid "list keys" -msgstr " " - -#: g10/gpg.c:390 -msgid "list keys and signatures" -msgstr " " - -#: g10/gpg.c:391 -#, fuzzy -msgid "list and check key signatures" -msgstr " " - -#: g10/gpg.c:392 -msgid "list keys and fingerprints" -msgstr " (fingerprints)" - -#: g10/gpg.c:393 -msgid "list secret keys" -msgstr " " - -#: g10/gpg.c:394 -msgid "generate a new key pair" -msgstr " " - -#: g10/gpg.c:395 -msgid "remove keys from the public keyring" -msgstr " " - -#: g10/gpg.c:397 -msgid "remove keys from the secret keyring" -msgstr " " - -#: g10/gpg.c:398 -msgid "sign a key" -msgstr " " - -#: g10/gpg.c:399 -msgid "sign a key locally" -msgstr " " - -#: g10/gpg.c:400 -msgid "sign or edit a key" -msgstr " " - -#: g10/gpg.c:401 -msgid "generate a revocation certificate" -msgstr " " - -#: g10/gpg.c:403 -msgid "export keys" -msgstr " " - -#: g10/gpg.c:404 -msgid "export keys to a key server" -msgstr " " - -#: g10/gpg.c:405 -msgid "import keys from a key server" -msgstr " " - -#: g10/gpg.c:407 -msgid "search for keys on a key server" -msgstr " " - -#: g10/gpg.c:409 -msgid "update all keys from a keyserver" -msgstr " " - -#: g10/gpg.c:413 -msgid "import/merge keys" -msgstr "/ " - -#: g10/gpg.c:416 -msgid "print the card status" -msgstr "" - -#: g10/gpg.c:417 -msgid "change data on a card" -msgstr "" - -#: g10/gpg.c:418 -msgid "change a card's PIN" -msgstr "" - -#: g10/gpg.c:426 -msgid "update the trust database" -msgstr " " - -#: g10/gpg.c:433 -msgid "|algo [files]|print message digests" -msgstr "| []| " - -#: g10/gpg.c:437 g10/gpgv.c:71 -msgid "" -"@\n" -"Options:\n" -" " -msgstr "" -"@\n" -":\n" -" " - -#: g10/gpg.c:439 -msgid "create ascii armored output" -msgstr " ascii " - -#: g10/gpg.c:441 -msgid "|NAME|encrypt for NAME" -msgstr "|| " - -#: g10/gpg.c:452 -msgid "use this user-id to sign or decrypt" -msgstr " (user id) " - -#: g10/gpg.c:453 -msgid "|N|set compress level N (0 disables)" -msgstr "|N| N (0 )" - -#: g10/gpg.c:458 -msgid "use canonical text mode" -msgstr " " - -#: g10/gpg.c:472 -msgid "use as output file" -msgstr " " - -#: g10/gpg.c:474 g10/gpgv.c:73 -msgid "verbose" -msgstr "" - -#: g10/gpg.c:485 -msgid "do not make any changes" -msgstr " " - -#: g10/gpg.c:486 -msgid "prompt before overwriting" -msgstr " " - -#: g10/gpg.c:527 -msgid "use strict OpenPGP behavior" -msgstr "" - -#: g10/gpg.c:528 -msgid "generate PGP 2.x compatible messages" -msgstr "" - -#: g10/gpg.c:556 -msgid "" -"@\n" -"(See the man page for a complete listing of all commands and options)\n" -msgstr "" -"@\n" -"( man )\n" - -#: g10/gpg.c:559 -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:757 g10/gpgv.c:98 -msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n" -msgstr " <gnupg-bugs@gnu.org>\n" - -#: g10/gpg.c:774 -msgid "Usage: gpg [options] [files] (-h for help)" -msgstr ": gpg [] [] (-h )" - -#: g10/gpg.c:777 -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:788 -msgid "" -"\n" -"Supported algorithms:\n" -msgstr "" -"\n" -" :\n" - -#: g10/gpg.c:791 -msgid "Pubkey: " -msgstr ":" - -#: g10/gpg.c:797 g10/keyedit.c:2310 -msgid "Cipher: " -msgstr ": " - -#: g10/gpg.c:803 -msgid "Hash: " -msgstr "Hash: " - -#: g10/gpg.c:809 g10/keyedit.c:2356 -msgid "Compression: " -msgstr ": " - -#: g10/gpg.c:892 -msgid "usage: gpg [options] " -msgstr ": gpg [] " - -#: g10/gpg.c:1040 -msgid "conflicting commands\n" -msgstr " \n" - -#: g10/gpg.c:1058 -#, fuzzy, c-format -msgid "no = sign found in group definition `%s'\n" -msgstr " = \"%s\"\n" - -#: g10/gpg.c:1255 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on homedir `%s'\n" -msgstr ": %s \"%s\"\n" - -#: g10/gpg.c:1258 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on configuration file `%s'\n" -msgstr ": %s \"%s\"\n" - -#: g10/gpg.c:1261 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on extension `%s'\n" -msgstr ": %s \"%s\"\n" - -#: g10/gpg.c:1267 -#, fuzzy, c-format -msgid "WARNING: unsafe permissions on homedir `%s'\n" -msgstr ": %s \"%s\"\n" - -#: g10/gpg.c:1270 -#, fuzzy, c-format -msgid "WARNING: unsafe permissions on configuration file `%s'\n" -msgstr ": %s \"%s\"\n" - -#: g10/gpg.c:1273 -#, fuzzy, c-format -msgid "WARNING: unsafe permissions on extension `%s'\n" -msgstr ": %s \"%s\"\n" - -#: g10/gpg.c:1279 -#, fuzzy, c-format -msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n" -msgstr "" -": %s \"%s\"\n" - -#: g10/gpg.c:1282 -#, fuzzy, c-format -msgid "" -"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n" -msgstr "" -": %s \"%s\"\n" - -#: g10/gpg.c:1285 -#, fuzzy, c-format -msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n" -msgstr "" -": %s \"%s\"\n" - -#: g10/gpg.c:1291 -#, fuzzy, c-format -msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n" -msgstr ": %s \"%s\"\n" - -#: g10/gpg.c:1294 -#, fuzzy, c-format -msgid "" -"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n" -msgstr ": %s \"%s\"\n" - -#: g10/gpg.c:1297 -#, fuzzy, c-format -msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n" -msgstr ": %s \"%s\"\n" - -#: g10/gpg.c:1438 -#, fuzzy, c-format -msgid "unknown configuration item `%s'\n" -msgstr " \"%s\"\n" - -#: g10/gpg.c:1531 -msgid "display photo IDs during key listings" -msgstr "" - -#: g10/gpg.c:1533 -msgid "show policy URLs during signature listings" -msgstr "" - -#: g10/gpg.c:1535 -#, fuzzy -msgid "show all notations during signature listings" -msgstr " \n" - -#: g10/gpg.c:1537 -msgid "show IETF standard notations during signature listings" -msgstr "" - -#: g10/gpg.c:1541 -msgid "show user-supplied notations during signature listings" -msgstr "" - -#: g10/gpg.c:1543 -#, fuzzy -msgid "show preferred keyserver URLs during signature listings" -msgstr " URL \n" - -#: g10/gpg.c:1545 -msgid "show user ID validity during key listings" -msgstr "" - -#: g10/gpg.c:1547 -msgid "show revoked and expired user IDs in key listings" -msgstr "" - -#: g10/gpg.c:1549 -msgid "show revoked and expired subkeys in key listings" -msgstr "" - -#: g10/gpg.c:1551 -#, fuzzy -msgid "show the keyring name in key listings" -msgstr " " - -#: g10/gpg.c:1553 -#, fuzzy -msgid "show expiration dates during signature listings" -msgstr " \n" - -#: g10/gpg.c:1920 -#, c-format -msgid "NOTE: old default options file `%s' ignored\n" -msgstr ": `%s'\n" - -#: g10/gpg.c:1962 -#, c-format -msgid "NOTE: no default option file `%s'\n" -msgstr ": `%s'\n" - -#: g10/gpg.c:1966 -#, c-format -msgid "option file `%s': %s\n" -msgstr " `%s': %s\n" - -#: g10/gpg.c:1973 -#, c-format -msgid "reading options from `%s'\n" -msgstr " `%s'\n" - -#: g10/gpg.c:2188 g10/gpg.c:2814 g10/gpg.c:2833 -#, c-format -msgid "NOTE: %s is not for normal use!\n" -msgstr ": %s !\n" - -#: g10/gpg.c:2201 -#, fuzzy, c-format -msgid "cipher extension `%s' not loaded due to unsafe permissions\n" -msgstr "" -" \"%s\" \n" -" \n" - -#: g10/gpg.c:2364 g10/gpg.c:2376 -#, fuzzy, c-format -msgid "`%s' is not a valid signature expiration\n" -msgstr " %s \n" - -#: g10/gpg.c:2452 -#, fuzzy, c-format -msgid "`%s' is not a valid character set\n" -msgstr " %s \n" - -#: g10/gpg.c:2476 g10/gpg.c:2663 g10/keyedit.c:4064 -#, fuzzy -msgid "could not parse keyserver URL\n" -msgstr " URI \n" - -#: g10/gpg.c:2488 -#, fuzzy, c-format -msgid "%s:%d: invalid keyserver options\n" -msgstr "%s:%d: \n" - -#: g10/gpg.c:2491 -#, fuzzy -msgid "invalid keyserver options\n" -msgstr " \n" - -#: g10/gpg.c:2498 -#, c-format -msgid "%s:%d: invalid import options\n" -msgstr "%s:%d: \n" - -#: g10/gpg.c:2501 -msgid "invalid import options\n" -msgstr " \n" - -#: g10/gpg.c:2508 -#, c-format -msgid "%s:%d: invalid export options\n" -msgstr "%s:%d: \n" - -#: g10/gpg.c:2511 -msgid "invalid export options\n" -msgstr " \n" - -#: g10/gpg.c:2518 -#, fuzzy, c-format -msgid "%s:%d: invalid list options\n" -msgstr "%s:%d: \n" - -#: g10/gpg.c:2521 -#, fuzzy -msgid "invalid list options\n" -msgstr " \n" - -#: g10/gpg.c:2529 -msgid "display photo IDs during signature verification" -msgstr "" - -#: g10/gpg.c:2531 -msgid "show policy URLs during signature verification" -msgstr "" - -#: g10/gpg.c:2533 -#, fuzzy -msgid "show all notations during signature verification" -msgstr " %s \n" - -#: g10/gpg.c:2535 -msgid "show IETF standard notations during signature verification" -msgstr "" - -#: g10/gpg.c:2539 -msgid "show user-supplied notations during signature verification" -msgstr "" - -#: g10/gpg.c:2541 -#, fuzzy -msgid "show preferred keyserver URLs during signature verification" -msgstr " URL \n" - -#: g10/gpg.c:2543 -#, fuzzy -msgid "show user ID validity during signature verification" -msgstr " %s \n" - -#: g10/gpg.c:2545 -msgid "show revoked and expired user IDs in signature verification" -msgstr "" - -#: g10/gpg.c:2547 -msgid "validate signatures with PKA data" -msgstr "" - -#: g10/gpg.c:2549 -msgid "elevate the trust of signatures with valid PKA data" -msgstr "" - -#: g10/gpg.c:2556 -#, fuzzy, c-format -msgid "%s:%d: invalid verify options\n" -msgstr "%s:%d: \n" - -#: g10/gpg.c:2559 -#, fuzzy -msgid "invalid verify options\n" -msgstr " \n" - -#: g10/gpg.c:2566 -#, c-format -msgid "unable to set exec-path to %s\n" -msgstr " exec-path %s\n" - -#: g10/gpg.c:2729 -#, fuzzy, c-format -msgid "%s:%d: invalid auto-key-locate list\n" -msgstr "%s:%d: \n" - -#: g10/gpg.c:2732 -msgid "invalid auto-key-locate list\n" -msgstr "" - -#: g10/gpg.c:2803 -msgid "WARNING: program may create a core file!\n" -msgstr ": core!\n" - -#: g10/gpg.c:2807 -#, c-format -msgid "WARNING: %s overrides %s\n" -msgstr ": %s %s\n" - -#: g10/gpg.c:2816 -#, c-format -msgid "%s not allowed with %s!\n" -msgstr " %s %s!\n" - -#: g10/gpg.c:2819 -#, c-format -msgid "%s makes no sense with %s!\n" -msgstr " %s %s!\n" - -#: g10/gpg.c:2826 -#, fuzzy, c-format -msgid "NOTE: %s is not available in this version\n" -msgstr " gpg-agent \n" - -#: g10/gpg.c:2841 -#, fuzzy, c-format -msgid "will not run with insecure memory due to %s\n" -msgstr " `%s'\n" - -#: g10/gpg.c:2855 -msgid "you can only make detached or clear signatures while in --pgp2 mode\n" -msgstr "" -" --pgp2 \n" - -#: g10/gpg.c:2861 -msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n" -msgstr "" -" --pgp2 " -"\n" - -#: g10/gpg.c:2867 -msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n" -msgstr " ( pipes) --pgp2.\n" - -#: g10/gpg.c:2880 -msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n" -msgstr "" -" --pgp2 . IDEA\n" - -#: g10/gpg.c:2947 g10/gpg.c:2971 -msgid "selected cipher algorithm is invalid\n" -msgstr " \n" - -#: g10/gpg.c:2953 g10/gpg.c:2977 -msgid "selected digest algorithm is invalid\n" -msgstr " \n" - -#: g10/gpg.c:2959 -#, fuzzy -msgid "selected compression algorithm is invalid\n" -msgstr " \n" - -#: g10/gpg.c:2965 -msgid "selected certification digest algorithm is invalid\n" -msgstr "" -" \n" -" \n" - -#: g10/gpg.c:2980 -msgid "completes-needed must be greater than 0\n" -msgstr "completes-needed 0\n" - -#: g10/gpg.c:2982 -msgid "marginals-needed must be greater than 1\n" -msgstr "marginals-needed 1\n" - -#: g10/gpg.c:2984 -#, 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:2986 -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:2988 -msgid "invalid min-cert-level; must be 1, 2, or 3\n" -msgstr " min-cert-level 0, 1, 2, 3\n" - -#: g10/gpg.c:2991 -msgid "NOTE: simple S2K mode (0) is strongly discouraged\n" -msgstr ": S2K (0) \n" - -#: g10/gpg.c:2995 -msgid "invalid S2K mode; must be 0, 1 or 3\n" -msgstr " S2K; 0, 1 3\n" - -#: g10/gpg.c:3002 -msgid "invalid default preferences\n" -msgstr " \n" - -#: g10/gpg.c:3011 -msgid "invalid personal cipher preferences\n" -msgstr " \n" - -#: g10/gpg.c:3015 -msgid "invalid personal digest preferences\n" -msgstr " \n" - -#: g10/gpg.c:3019 -msgid "invalid personal compress preferences\n" -msgstr " \n" - -#: g10/gpg.c:3052 -#, c-format -msgid "%s does not yet work with %s\n" -msgstr " %s %s\n" - -#: g10/gpg.c:3099 -#, fuzzy, c-format -msgid "you may not use cipher algorithm `%s' while in %s mode\n" -msgstr " \"%s\" %s\n" - -#: g10/gpg.c:3104 -#, fuzzy, c-format -msgid "you may not use digest algorithm `%s' while in %s mode\n" -msgstr "" -" \"%s\" %s\n" - -#: g10/gpg.c:3109 -#, fuzzy, c-format -msgid "you may not use compression algorithm `%s' while in %s mode\n" -msgstr "" -" \"%s\" %s\n" - -#: g10/gpg.c:3208 -#, c-format -msgid "failed to initialize the TrustDB: %s\n" -msgstr " TrustDB: %s\n" - -#: g10/gpg.c:3219 -msgid "WARNING: recipients (-r) given without using public key encryption\n" -msgstr "" -": (-r) \n" -" \n" - -#: g10/gpg.c:3230 -msgid "--store [filename]" -msgstr "--store [ ]" - -#: g10/gpg.c:3237 -msgid "--symmetric [filename]" -msgstr "--symmetric [ ]" - -#: g10/gpg.c:3239 -#, fuzzy, c-format -msgid "symmetric encryption of `%s' failed: %s\n" -msgstr " : %s\n" - -#: g10/gpg.c:3249 -msgid "--encrypt [filename]" -msgstr "--encrypt [ ]" - -#: g10/gpg.c:3262 -#, fuzzy -msgid "--symmetric --encrypt [filename]" -msgstr "--sign --encrypt [ ]" - -#: g10/gpg.c:3264 -msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n" -msgstr "" - -#: g10/gpg.c:3267 -#, fuzzy, c-format -msgid "you cannot use --symmetric --encrypt while in %s mode\n" -msgstr " %s %s.\n" - -#: g10/gpg.c:3285 -msgid "--sign [filename]" -msgstr "--sign [ ]" - -#: g10/gpg.c:3298 -msgid "--sign --encrypt [filename]" -msgstr "--sign --encrypt [ ]" - -#: g10/gpg.c:3313 -#, fuzzy -msgid "--symmetric --sign --encrypt [filename]" -msgstr "--sign --encrypt [ ]" - -#: g10/gpg.c:3315 -msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n" -msgstr "" - -#: g10/gpg.c:3318 -#, fuzzy, c-format -msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n" -msgstr " %s %s.\n" - -#: g10/gpg.c:3338 -msgid "--sign --symmetric [filename]" -msgstr "--sign --symmetric [ ]" - -#: g10/gpg.c:3347 -msgid "--clearsign [filename]" -msgstr "--clearsign [ ]" - -#: g10/gpg.c:3372 -msgid "--decrypt [filename]" -msgstr "--decrypt [ ]" - -#: g10/gpg.c:3380 -msgid "--sign-key user-id" -msgstr "--sign-key user-id" - -#: g10/gpg.c:3384 -msgid "--lsign-key user-id" -msgstr "--lsign-key user-id" - -#: g10/gpg.c:3405 -msgid "--edit-key user-id [commands]" -msgstr "--edit-key user-id []" - -#: g10/gpg.c:3476 -msgid "-k[v][v][v][c] [user-id] [keyring]" -msgstr "-k[v][v][v][c] [user-id] []" - -#: g10/gpg.c:3518 -#, c-format -msgid "keyserver send failed: %s\n" -msgstr "keyserver : %s\n" - -#: g10/gpg.c:3520 -#, c-format -msgid "keyserver receive failed: %s\n" -msgstr "keyserver : %s\n" - -#: g10/gpg.c:3522 -#, c-format -msgid "key export failed: %s\n" -msgstr " : %s\n" - -#: g10/gpg.c:3533 -#, c-format -msgid "keyserver search failed: %s\n" -msgstr "keyserver : %s\n" - -#: g10/gpg.c:3543 -#, c-format -msgid "keyserver refresh failed: %s\n" -msgstr "keyserver : %s\n" - -#: g10/gpg.c:3594 -#, c-format -msgid "dearmoring failed: %s\n" -msgstr " : %s\n" - -#: g10/gpg.c:3602 -#, c-format -msgid "enarmoring failed: %s\n" -msgstr " : %s\n" - -#: g10/gpg.c:3689 -#, c-format -msgid "invalid hash algorithm `%s'\n" -msgstr " hash `%s'\n" - -#: g10/gpg.c:3812 -msgid "[filename]" -msgstr "[ ]" - -#: g10/gpg.c:3816 -msgid "Go ahead and type your message ...\n" -msgstr " ...\n" - -#: g10/gpg.c:4120 -msgid "the given certification policy URL is invalid\n" -msgstr " URL \n" - -#: g10/gpg.c:4122 -msgid "the given signature policy URL is invalid\n" -msgstr " URL \n" - -#: g10/gpg.c:4155 -#, 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:3707 -#, 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:266 -#, c-format -msgid "skipping block of type %d\n" -msgstr " %d\n" - -#: g10/import.c:275 -#, fuzzy, c-format -msgid "%lu keys processed so far\n" -msgstr "%lu \n" - -#: g10/import.c:292 -#, c-format -msgid "Total number processed: %lu\n" -msgstr " : %lu\n" - -#: g10/import.c:294 -#, c-format -msgid " skipped new keys: %lu\n" -msgstr " : %lu\n" - -#: g10/import.c:297 -#, c-format -msgid " w/o user IDs: %lu\n" -msgstr " user ID: %lu\n" - -#: g10/import.c:299 -#, c-format -msgid " imported: %lu" -msgstr " : %lu" - -#: g10/import.c:305 -#, c-format -msgid " unchanged: %lu\n" -msgstr " : %lu\n" - -#: g10/import.c:307 -#, c-format -msgid " new user IDs: %lu\n" -msgstr " user ID: %lu\n" - -#: g10/import.c:309 -#, c-format -msgid " new subkeys: %lu\n" -msgstr " : %lu\n" - -#: g10/import.c:311 -#, c-format -msgid " new signatures: %lu\n" -msgstr " : %lu\n" - -#: g10/import.c:313 -#, c-format -msgid " new key revocations: %lu\n" -msgstr " : %lu\n" - -#: g10/import.c:315 -#, c-format -msgid " secret keys read: %lu\n" -msgstr " : %lu\n" - -#: g10/import.c:317 -#, c-format -msgid " secret keys imported: %lu\n" -msgstr " : %lu\n" - -#: g10/import.c:319 -#, c-format -msgid " secret keys unchanged: %lu\n" -msgstr " : %lu\n" - -#: g10/import.c:321 -#, c-format -msgid " not imported: %lu\n" -msgstr " : %lu\n" - -#: g10/import.c:323 -#, fuzzy, c-format -msgid " signatures cleaned: %lu\n" -msgstr " : %lu\n" - -#: g10/import.c:325 -#, fuzzy, c-format -msgid " user IDs cleaned: %lu\n" -msgstr " : %lu\n" - -#: g10/import.c:566 -#, 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:570 -#, fuzzy -msgid " algorithms on these user IDs:\n" -msgstr " user ID:\n" - -#: g10/import.c:607 -#, c-format -msgid " \"%s\": preference for cipher algorithm %s\n" -msgstr "" - -#: g10/import.c:619 -#, fuzzy, c-format -msgid " \"%s\": preference for digest algorithm %s\n" -msgstr "%s , %s\n" - -#: g10/import.c:631 -#, c-format -msgid " \"%s\": preference for compression algorithm %s\n" -msgstr "" - -#: g10/import.c:644 -msgid "it is strongly suggested that you update your preferences and\n" -msgstr "" - -#: g10/import.c:646 -msgid "re-distribute this key to avoid potential algorithm mismatch problems\n" -msgstr "" - -#: g10/import.c:670 -#, c-format -msgid "you can update your preferences with: gpg --edit-key %s updpref save\n" -msgstr "" - -#: g10/import.c:720 g10/import.c:1118 -#, fuzzy, c-format -msgid "key %s: no user ID\n" -msgstr " %08lX: user ID\n" - -#: g10/import.c:749 -#, fuzzy, c-format -msgid "key %s: PKS subkey corruption repaired\n" -msgstr " %08lX: HKP\n" - -#: g10/import.c:764 -#, fuzzy, c-format -msgid "key %s: accepted non self-signed user ID \"%s\"\n" -msgstr " %08lX: - user ID '%s'\n" - -#: g10/import.c:770 -#, fuzzy, c-format -msgid "key %s: no valid user IDs\n" -msgstr " %08lX: user ID\n" - -#: g10/import.c:772 -msgid "this may be caused by a missing self-signature\n" -msgstr " \n" - -#: g10/import.c:782 g10/import.c:1240 -#, fuzzy, c-format -msgid "key %s: public key not found: %s\n" -msgstr " %08lX: : %s\n" - -#: g10/import.c:788 -#, fuzzy, c-format -msgid "key %s: new key - skipped\n" -msgstr " %08lX: - \n" - -#: g10/import.c:797 -#, c-format -msgid "no writable keyring found: %s\n" -msgstr " : %s\n" - -#: g10/import.c:802 g10/openfile.c:267 g10/sign.c:831 g10/sign.c:1135 -#, c-format -msgid "writing to `%s'\n" -msgstr " `%s'\n" - -#: g10/import.c:806 g10/import.c:901 g10/import.c:1158 g10/import.c:1301 -#: g10/import.c:2363 g10/import.c:2385 -#, c-format -msgid "error writing keyring `%s': %s\n" -msgstr " `%s': %s\n" - -#: g10/import.c:825 -#, fuzzy, c-format -msgid "key %s: public key \"%s\" imported\n" -msgstr " %08lX: \"%s\" \n" - -#: g10/import.c:849 -#, fuzzy, c-format -msgid "key %s: doesn't match our copy\n" -msgstr " %08lX: \n" - -#: g10/import.c:866 g10/import.c:1258 -#, fuzzy, c-format -msgid "key %s: can't locate original keyblock: %s\n" -msgstr " %08lX: : %s\n" - -#: g10/import.c:874 g10/import.c:1265 -#, fuzzy, c-format -msgid "key %s: can't read original keyblock: %s\n" -msgstr " %08lX: : %s\n" - -#: g10/import.c:911 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new user ID\n" -msgstr " %08lX: \"%s\" 1 user ID\n" - -#: g10/import.c:914 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new user IDs\n" -msgstr " %08lX: \"%s\" %d user ID\n" - -#: g10/import.c:917 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new signature\n" -msgstr " %08lX: \"%s\" 1 \n" - -#: g10/import.c:920 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new signatures\n" -msgstr " %08lX: \"%s\" %d \n" - -#: g10/import.c:923 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new subkey\n" -msgstr " %08lX: \"%s\" 1 \n" - -#: g10/import.c:926 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new subkeys\n" -msgstr " %08lX: \"%s\" %d \n" - -#: g10/import.c:929 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signature cleaned\n" -msgstr " %08lX: \"%s\" %d \n" - -#: g10/import.c:932 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signatures cleaned\n" -msgstr " %08lX: \"%s\" %d \n" - -#: g10/import.c:935 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d user ID cleaned\n" -msgstr " %08lX: \"%s\" %d user ID\n" - -#: g10/import.c:938 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d user IDs cleaned\n" -msgstr " %08lX: \"%s\" %d user ID\n" - -#: g10/import.c:961 -#, fuzzy, c-format -msgid "key %s: \"%s\" not changed\n" -msgstr " %08lX: \"%s\" \n" - -#: g10/import.c:1124 -#, fuzzy, c-format -msgid "key %s: secret key with invalid cipher %d - skipped\n" -msgstr " %08lX: . %d - \n" - -#: g10/import.c:1135 -#, fuzzy -msgid "importing secret keys not allowed\n" -msgstr " `%s'\n" - -#: g10/import.c:1152 g10/import.c:2378 -#, c-format -msgid "no default secret keyring: %s\n" -msgstr " : %s\n" - -#: g10/import.c:1163 -#, fuzzy, c-format -msgid "key %s: secret key imported\n" -msgstr " %08lX: \n" - -#: g10/import.c:1193 -#, fuzzy, c-format -msgid "key %s: already in secret keyring\n" -msgstr " %08lX: \n" - -#: g10/import.c:1203 -#, fuzzy, c-format -msgid "key %s: secret key not found: %s\n" -msgstr " %08lX: : %s\n" - -#: g10/import.c:1233 -#, fuzzy, c-format -msgid "key %s: no public key - can't apply revocation certificate\n" -msgstr "" -" %08lX: - " -"\n" - -#: g10/import.c:1276 -#, fuzzy, c-format -msgid "key %s: invalid revocation certificate: %s - rejected\n" -msgstr " %08lX: : %s - \n" - -#: g10/import.c:1308 -#, fuzzy, c-format -msgid "key %s: \"%s\" revocation certificate imported\n" -msgstr " %08lX: \"%s\" \n" - -#: g10/import.c:1374 -#, fuzzy, c-format -msgid "key %s: no user ID for signature\n" -msgstr " %08lX: user ID \n" - -#: g10/import.c:1389 -#, fuzzy, c-format -msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n" -msgstr "" -" %08lX: user id \"%" -"s\"\n" - -#: g10/import.c:1391 -#, fuzzy, c-format -msgid "key %s: invalid self-signature on user ID \"%s\"\n" -msgstr " %08lX: - user id \"%s\"\n" - -#: g10/import.c:1409 -#, fuzzy, c-format -msgid "key %s: no subkey for key binding\n" -msgstr " %08lX: \n" - -#: g10/import.c:1420 g10/import.c:1470 -#, fuzzy, c-format -msgid "key %s: unsupported public key algorithm\n" -msgstr " %08lX: \n" - -#: g10/import.c:1422 -#, fuzzy, c-format -msgid "key %s: invalid subkey binding\n" -msgstr " %08lX: \n" - -#: g10/import.c:1437 -#, fuzzy, c-format -msgid "key %s: removed multiple subkey binding\n" -msgstr " %08lX: \n" - -#: g10/import.c:1459 -#, fuzzy, c-format -msgid "key %s: no subkey for key revocation\n" -msgstr " %08lX: \n" - -#: g10/import.c:1472 -#, fuzzy, c-format -msgid "key %s: invalid subkey revocation\n" -msgstr " %08lX: \n" - -#: g10/import.c:1487 -#, fuzzy, c-format -msgid "key %s: removed multiple subkey revocation\n" -msgstr " %08lX: \n" - -#: g10/import.c:1529 -#, fuzzy, c-format -msgid "key %s: skipped user ID \"%s\"\n" -msgstr " %08lX: user ID '" - -#: g10/import.c:1550 -#, fuzzy, c-format -msgid "key %s: skipped subkey\n" -msgstr " %08lX: \n" - -#: g10/import.c:1577 -#, fuzzy, c-format -msgid "key %s: non exportable signature (class 0x%02X) - skipped\n" -msgstr " %08lX: ( %02x) - \n" - -#: g10/import.c:1587 -#, fuzzy, c-format -msgid "key %s: revocation certificate at wrong place - skipped\n" -msgstr "" -" %08lX: - \n" - -#: g10/import.c:1604 -#, fuzzy, c-format -msgid "key %s: invalid revocation certificate: %s - skipped\n" -msgstr " %08lX: : %s - \n" - -#: g10/import.c:1618 -#, fuzzy, c-format -msgid "key %s: subkey signature in wrong place - skipped\n" -msgstr "" -" %08lX: - \n" - -#: g10/import.c:1626 -#, fuzzy, c-format -msgid "key %s: unexpected signature class (0x%02X) - skipped\n" -msgstr " %08lX: (0x%02x) - \n" - -#: g10/import.c:1726 -#, fuzzy, c-format -msgid "key %s: duplicated user ID detected - merged\n" -msgstr " %08lX: user ID - \n" - -#: g10/import.c:1788 -#, fuzzy, c-format -msgid "WARNING: key %s may be revoked: fetching revocation key %s\n" -msgstr "" -": %08lX : %" -"08lX\n" - -#: g10/import.c:1802 -#, fuzzy, c-format -msgid "WARNING: key %s may be revoked: revocation key %s not present.\n" -msgstr "" -": %08lX : %08lX\n" -" .\n" - -#: g10/import.c:1861 -#, fuzzy, c-format -msgid "key %s: \"%s\" revocation certificate added\n" -msgstr " %08lX: \"%s\" \n" - -#: g10/import.c:1895 -#, fuzzy, c-format -msgid "key %s: direct key signature added\n" -msgstr " %08lX: \n" - -#: g10/import.c:2284 -#, fuzzy -msgid "NOTE: a key's S/N does not match the card's one\n" -msgstr " !\n" - -#: g10/import.c:2292 -#, fuzzy -msgid "NOTE: primary key is online and stored on card\n" -msgstr ": \n" - -#: g10/import.c:2294 -#, 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:4783 g10/keyedit.c:4874 g10/keyedit.c:4938 -#: g10/keyedit.c:4999 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:3346 -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:3249 -#, fuzzy, c-format -msgid "User ID \"%s\": already clean\n" -msgstr " user ID \"%s\" \n" - -#: g10/keyedit.c:3341 -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:3352 -msgid "You may not add a designated revoker to a PGP 2.x-style key.\n" -msgstr "" -" PGP2.x.\n" - -#: g10/keyedit.c:3372 -msgid "Enter the user ID of the designated revoker: " -msgstr " user ID : " - -#: g10/keyedit.c:3397 -msgid "cannot appoint a PGP 2.x style key as a designated revoker\n" -msgstr "" -" PGP 2.x, \n" - -#: g10/keyedit.c:3412 -msgid "you cannot appoint a key as its own designated revoker\n" -msgstr "" -" \n" - -#: g10/keyedit.c:3434 -#, fuzzy -msgid "this key has already been designated as a revoker\n" -msgstr "" -": !\n" - -#: g10/keyedit.c:3453 -msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n" -msgstr "" -": " -"!\n" - -#: g10/keyedit.c:3459 -#, fuzzy -msgid "" -"Are you sure you want to appoint this key as a designated revoker? (y/N) " -msgstr "" -" ; (y/" -"N): " - -#: g10/keyedit.c:3520 -msgid "Please remove selections from the secret keys.\n" -msgstr " .\n" - -#: g10/keyedit.c:3526 -#, fuzzy -msgid "Please select at most one subkey.\n" -msgstr " .\n" - -#: g10/keyedit.c:3530 -#, fuzzy -msgid "Changing expiration time for a subkey.\n" -msgstr " .\n" - -#: g10/keyedit.c:3533 -msgid "Changing expiration time for the primary key.\n" -msgstr " .\n" - -#: g10/keyedit.c:3579 -msgid "You can't change the expiration date of a v3 key\n" -msgstr " v3 \n" - -#: g10/keyedit.c:3595 -msgid "No corresponding signature in secret ring\n" -msgstr " \n" - -#: g10/keyedit.c:3668 -#, fuzzy, c-format -msgid "signing subkey %s is already cross-certified\n" -msgstr "" -": %08lX ' " -"\n" - -#: g10/keyedit.c:3674 -#, c-format -msgid "subkey %s does not sign and so does not need to be cross-certified\n" -msgstr "" - -#: g10/keyedit.c:3836 -msgid "Please select exactly one user ID.\n" -msgstr " user ID.\n" - -#: g10/keyedit.c:3875 g10/keyedit.c:3985 g10/keyedit.c:4105 g10/keyedit.c:4246 -#, fuzzy, c-format -msgid "skipping v3 self-signature on user ID \"%s\"\n" -msgstr " v3 - user id \"%s\"\n" - -#: g10/keyedit.c:4046 -msgid "Enter your preferred keyserver URL: " -msgstr "" - -#: g10/keyedit.c:4126 -#, fuzzy -msgid "Are you sure you want to replace it? (y/N) " -msgstr " ; (y/N) " - -#: g10/keyedit.c:4127 -#, fuzzy -msgid "Are you sure you want to delete it? (y/N) " -msgstr " ; (y/N) " - -#: g10/keyedit.c:4189 -#, fuzzy -msgid "Enter the notation: " -msgstr " : " - -#: g10/keyedit.c:4338 -#, fuzzy -msgid "Proceed? (y/N) " -msgstr " (y/N); " - -#: g10/keyedit.c:4402 -#, c-format -msgid "No user ID with index %d\n" -msgstr " user ID %d\n" - -#: g10/keyedit.c:4460 -#, fuzzy, c-format -msgid "No user ID with hash %s\n" -msgstr " user ID %d\n" - -#: g10/keyedit.c:4487 -#, fuzzy, c-format -msgid "No subkey with index %d\n" -msgstr " user ID %d\n" - -#: g10/keyedit.c:4622 -#, fuzzy, c-format -msgid "user ID: \"%s\"\n" -msgstr "user ID: \"" - -#: g10/keyedit.c:4625 g10/keyedit.c:4689 g10/keyedit.c:4732 -#, fuzzy, c-format -msgid "signed by your key %s on %s%s%s\n" -msgstr " %08lX %s%s%s\n" - -#: g10/keyedit.c:4627 g10/keyedit.c:4691 g10/keyedit.c:4734 -msgid " (non-exportable)" -msgstr " (-)" - -#: g10/keyedit.c:4631 -#, c-format -msgid "This signature expired on %s.\n" -msgstr " %s.\n" - -#: g10/keyedit.c:4635 -msgid "Are you sure you still want to revoke it? (y/N) " -msgstr " ; " - -#: g10/keyedit.c:4639 -msgid "Create a revocation certificate for this signature? (y/N) " -msgstr " ; (y/N)" - -#: g10/keyedit.c:4666 -#, fuzzy, c-format -msgid "You have signed these user IDs on key %s:\n" -msgstr " user ID:\n" - -#: g10/keyedit.c:4692 -#, fuzzy -msgid " (non-revocable)" -msgstr " (-)" - -#: g10/keyedit.c:4699 -#, fuzzy, c-format -msgid "revoked by your key %s on %s\n" -msgstr " %08lX %s\n" - -#: g10/keyedit.c:4721 -msgid "You are about to revoke these signatures:\n" -msgstr " :\n" - -#: g10/keyedit.c:4741 -msgid "Really create the revocation certificates? (y/N) " -msgstr " ; (y/N)" - -#: g10/keyedit.c:4771 -msgid "no secret key\n" -msgstr " \n" - -#: g10/keyedit.c:4841 -#, c-format -msgid "user ID \"%s\" is already revoked\n" -msgstr " user ID \"%s\" \n" - -#: g10/keyedit.c:4858 -#, c-format -msgid "WARNING: a user ID signature is dated %d seconds in the future\n" -msgstr "" -": user ID %d \n" - -#: g10/keyedit.c:4922 -#, fuzzy, c-format -msgid "Key %s is already revoked.\n" -msgstr " user ID \"%s\" \n" - -#: g10/keyedit.c:4984 -#, fuzzy, c-format -msgid "Subkey %s is already revoked.\n" -msgstr " user ID \"%s\" \n" - -#: g10/keyedit.c:5079 -#, 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:1421 -#, 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:1324 -#, fuzzy, c-format -msgid "sending key %s to %s server %s\n" -msgstr " \"%s\" HKP %s\n" - -#: g10/keyserver.c:1328 -#, fuzzy, c-format -msgid "sending key %s to %s\n" -msgstr "" -"\"\n" -" %08lX %s\n" - -#: g10/keyserver.c:1371 -#, fuzzy, c-format -msgid "searching for \"%s\" from %s server %s\n" -msgstr " \"%s\" HKP %s\n" - -#: g10/keyserver.c:1374 -#, fuzzy, c-format -msgid "searching for \"%s\" from %s\n" -msgstr " \"%s\" HKP %s\n" - -#: g10/keyserver.c:1381 g10/keyserver.c:1477 -#, fuzzy -msgid "no keyserver action!\n" -msgstr " \n" - -#: g10/keyserver.c:1429 -#, c-format -msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n" -msgstr "" - -#: g10/keyserver.c:1438 -msgid "keyserver did not send VERSION\n" -msgstr "" - -#: g10/keyserver.c:1500 g10/keyserver.c:2028 -msgid "no keyserver known (use option --keyserver)\n" -msgstr "" - -#: g10/keyserver.c:1506 -msgid "external keyserver calls are not supported in this build\n" -msgstr "" - -#: g10/keyserver.c:1518 -#, c-format -msgid "no handler for keyserver scheme `%s'\n" -msgstr "" - -#: g10/keyserver.c:1523 -#, c-format -msgid "action `%s' not supported with keyserver scheme `%s'\n" -msgstr "" - -#: g10/keyserver.c:1531 -#, c-format -msgid "%s does not support handler version %d\n" -msgstr "" - -#: g10/keyserver.c:1538 -#, fuzzy -msgid "keyserver timed out\n" -msgstr " " - -#: g10/keyserver.c:1543 -#, fuzzy -msgid "keyserver internal error\n" -msgstr " " - -#: g10/keyserver.c:1552 -#, fuzzy, c-format -msgid "keyserver communications error: %s\n" -msgstr "keyserver : %s\n" - -#: g10/keyserver.c:1577 g10/keyserver.c:1611 -#, c-format -msgid "\"%s\" not a key ID: skipping\n" -msgstr "" - -#: g10/keyserver.c:1870 -#, fuzzy, c-format -msgid "WARNING: unable to refresh key %s via %s: %s\n" -msgstr ": tempfile (%s) `%s': %s\n" - -#: g10/keyserver.c:1892 -#, fuzzy, c-format -msgid "refreshing 1 key from %s\n" -msgstr " %08lX %s\n" - -#: g10/keyserver.c:1894 -#, fuzzy, c-format -msgid "refreshing %d keys from %s\n" -msgstr " %08lX %s\n" - -#: g10/keyserver.c:1950 -#, fuzzy, c-format -msgid "WARNING: unable to fetch URI %s: %s\n" -msgstr ": tempfile (%s) `%s': %s\n" - -#: g10/keyserver.c:1956 -#, 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:305 -#, c-format -msgid "assuming signed data in `%s'\n" -msgstr " `%s'\n" - -#: g10/openfile.c:384 -#, c-format -msgid "new configuration file `%s' created\n" -msgstr " `%s'\n" - -#: g10/openfile.c:386 -#, c-format -msgid "WARNING: options in `%s' are not yet active during this run\n" -msgstr "" -": `%s' \n" - -#: g10/openfile.c:418 -#, 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:1157 -#, 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:968 -#, fuzzy -msgid "can't query passphrase in batch mode\n" -msgstr " \n" - -#: g10/passphrase.c:812 g10/passphrase.c:973 -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:977 -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:127 g10/skclist.c:191 -msgid "key is not flagged as insecure - can't use it with the faked RNG!\n" -msgstr "" -" - " -" RNG!\n" - -#: g10/skclist.c:158 -#, fuzzy, c-format -msgid "skipped \"%s\": duplicated\n" -msgstr " `%s': \n" - -#: g10/skclist.c:166 g10/skclist.c:176 g10/skclist.c:185 -#, fuzzy, c-format -msgid "skipped \"%s\": %s\n" -msgstr " `%s': %s\n" - -#: g10/skclist.c:171 -msgid "skipped: secret key already present\n" -msgstr ": \n" - -#: g10/skclist.c:186 -#, 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:350 -msgid "operation is not possible without initialized secure memory\n" -msgstr " \n" - -#: util/secmem.c:351 -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 "User ID \"%s\": %d signature removed.\n" -#~ msgstr " user ID \"%s\" ." - -#, fuzzy -#~ msgid "User ID \"%s\": %d signatures removed.\n" -#~ msgstr " user ID \"%s\" ." - -#, fuzzy -#~ msgid "User ID \"%s\" removed: %s\n" -#~ msgstr " user ID \"%s\" ." - -#, 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.insert-header b/po/en@boldquot.insert-header deleted file mode 100644 index c5b6cead6..000000000 --- a/po/en@boldquot.insert-header +++ /dev/null @@ -1,12 +0,0 @@ -/^msgid /{ -x -s/m/m/ -ta -r en@boldquot.header -g -N -bb -:a -x -:b -} diff --git a/po/en@quot.insert-header b/po/en@quot.insert-header deleted file mode 100644 index 64c963a84..000000000 --- a/po/en@quot.insert-header +++ /dev/null @@ -1,12 +0,0 @@ -/^msgid /{ -x -s/m/m/ -ta -r en@quot.header -g -N -bb -:a -x -:b -} diff --git a/po/eo.po b/po/eo.po deleted file mode 100644 index 59e92e35a..000000000 --- a/po/eo.po +++ /dev/null @@ -1,7420 +0,0 @@ -# Mesaoj 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-07-28 11:12+0200\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:1003 g10/gpg.c:3461 g10/import.c:195 g10/keygen.c:2385 -#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:342 -#: 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:1002 g10/keygen.c:2864 -#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:263 -#: g10/openfile.c:357 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 kvazastokastilo estas nur simpla protezo, por ke la\n" -"programo entute ruliu; 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" -"Nesufie 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 "forvio 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 "forvio 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:320 -#, c-format -msgid "armor: %s\n" -msgstr "kiraso: %s\n" - -#: g10/armor.c:359 -msgid "invalid armor header: " -msgstr "nevalida kirasoapo: " - -#: g10/armor.c:370 -msgid "armor header: " -msgstr "kirasoapo: " - -#: g10/armor.c:381 -msgid "invalid clearsig header\n" -msgstr "nevalida apo de klarteksta subskribo\n" - -#: g10/armor.c:433 -msgid "nested clear text signatures\n" -msgstr "ingitaj klartekstaj subskriboj\n" - -#: g10/armor.c:568 -#, fuzzy -msgid "unexpected armor: " -msgstr "neatendita kiraso:" - -#: g10/armor.c:580 -msgid "invalid dash escaped line: " -msgstr "nevalida strek-eskapita linio: " - -#: g10/armor.c:734 g10/armor.c:1343 -#, fuzzy, c-format -msgid "invalid radix64 character %02X skipped\n" -msgstr "nevalida signo %02x en bazo 64 ignorita\n" - -#: g10/armor.c:777 -msgid "premature eof (no CRC)\n" -msgstr "tro frua dosierfino (nenia CRC)\n" - -#: g10/armor.c:811 -msgid "premature eof (in CRC)\n" -msgstr "tro frua dosierfino (en CRC)\n" - -#: g10/armor.c:819 -msgid "malformed CRC\n" -msgstr "misformita CRC\n" - -#: g10/armor.c:823 g10/armor.c:1380 -#, fuzzy, c-format -msgid "CRC error; %06lX - %06lX\n" -msgstr "CRC-eraro; %06lx - %06lx\n" - -#: g10/armor.c:843 -#, fuzzy -msgid "premature eof (in trailer)\n" -msgstr "tro frua dosierfino (en vosto)\n" - -#: g10/armor.c:847 -msgid "error in trailer line\n" -msgstr "eraro en vostolinio\n" - -#: g10/armor.c:1158 -msgid "no valid OpenPGP data found.\n" -msgstr "validaj OpenPGP-datenoj ne trovitaj.\n" - -#: g10/armor.c:1163 -#, c-format -msgid "invalid armor: line longer than %d characters\n" -msgstr "nevalida kiraso: linio pli longa ol %d signojn\n" - -#: g10/armor.c:1167 -msgid "" -"quoted printable character in armor - probably a buggy MTA has been used\n" -msgstr "" -"quoted-printable-signo en kiraso - verajne cima pototransendilo 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 reimo\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:280 -#, 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 signoeno\n" - -#: g10/card-util.c:811 -#, fuzzy -msgid "Error: invalid characters in preference string.\n" -msgstr "nevalida signo en signoeno\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 eksvalidios 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 "ani la daton de eksvalidio" - -#: g10/card-util.c:1331 -#, fuzzy -msgid "change the language preferences" -msgstr "ani 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 "forvio 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:3826 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:3387 g10/keyserver.c:1700 -#: 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:2349 g10/keyserver.c:1714 -#: 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 reimo sen \"--yes\"\n" - -#: g10/delkey.c:147 -#, fuzzy -msgid "Delete this key from the keyring? (y/N) " -msgstr "u forvii 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 forvii in? " - -#: g10/delkey.c:165 -#, c-format -msgid "deleting keyblock failed: %s\n" -msgstr "forvio 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 forvii 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 reimo %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:67 g10/mainproc.c:293 -#, c-format -msgid "%s encrypted data\n" -msgstr "%s-ifritaj datenoj\n" - -#: g10/encr-data.c:69 g10/mainproc.c:297 -#, c-format -msgid "encrypted with unknown algorithm %d\n" -msgstr "ifrita per nekonata metodo %d\n" - -#: g10/encr-data.c:93 -msgid "" -"WARNING: message was encrypted with a weak key in the symmetric cipher.\n" -msgstr "" -"AVERTO: mesao estis ifrita per malforta losilo en la simetria ifro.\n" - -#: g10/encr-data.c:104 -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:415 -#, 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 malusta 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:375 -msgid "" -"@Commands:\n" -" " -msgstr "" -"@Komandoj:\n" -" " - -#: g10/gpg.c:377 -msgid "|[file]|make a signature" -msgstr "|[dosiero]|fari subskribon" - -#: g10/gpg.c:378 -msgid "|[file]|make a clear text signature" -msgstr "|[dosiero]|fari klartekstan subskribon" - -#: g10/gpg.c:379 -msgid "make a detached signature" -msgstr "fari apartan subskribon" - -#: g10/gpg.c:380 -msgid "encrypt data" -msgstr "ifri datenojn" - -#: g10/gpg.c:382 -msgid "encryption only with symmetric cipher" -msgstr "ifri nur kun simetria ifro" - -#: g10/gpg.c:384 -msgid "decrypt data (default)" -msgstr "malifri datenojn (implicita elekto)" - -#: g10/gpg.c:386 -msgid "verify a signature" -msgstr "kontroli subskribon" - -#: g10/gpg.c:388 -msgid "list keys" -msgstr "listigi losilojn" - -#: g10/gpg.c:390 -msgid "list keys and signatures" -msgstr "listigi losilojn kaj subskribojn" - -#: g10/gpg.c:391 -#, fuzzy -msgid "list and check key signatures" -msgstr "kontroli losilsubskribojn" - -#: g10/gpg.c:392 -msgid "list keys and fingerprints" -msgstr "listigi losilojn kaj fingropurojn" - -#: g10/gpg.c:393 -msgid "list secret keys" -msgstr "listigi sekretajn losilojn" - -#: g10/gpg.c:394 -msgid "generate a new key pair" -msgstr "krei novan losilparon" - -#: g10/gpg.c:395 -msgid "remove keys from the public keyring" -msgstr "forigi losilojn de la publika losilaro" - -#: g10/gpg.c:397 -msgid "remove keys from the secret keyring" -msgstr "forigi losilojn de la sekreta losilaro" - -#: g10/gpg.c:398 -msgid "sign a key" -msgstr "subskribi losilon" - -#: g10/gpg.c:399 -msgid "sign a key locally" -msgstr "subskribi losilon loke" - -#: g10/gpg.c:400 -msgid "sign or edit a key" -msgstr "subskribi a redakti losilon" - -#: g10/gpg.c:401 -msgid "generate a revocation certificate" -msgstr "krei revokatestilon" - -#: g10/gpg.c:403 -msgid "export keys" -msgstr "eksporti losilojn" - -#: g10/gpg.c:404 -msgid "export keys to a key server" -msgstr "eksporti losilojn al losilservilo" - -#: g10/gpg.c:405 -msgid "import keys from a key server" -msgstr "importi losilojn de losilservilo" - -#: g10/gpg.c:407 -msgid "search for keys on a key server" -msgstr "seri losilojn e losilservilo" - -#: g10/gpg.c:409 -msgid "update all keys from a keyserver" -msgstr "aktualigi iujn losilojn de losilservilo" - -#: g10/gpg.c:413 -msgid "import/merge keys" -msgstr "importi/kunfandi losilojn" - -#: g10/gpg.c:416 -msgid "print the card status" -msgstr "" - -#: g10/gpg.c:417 -msgid "change data on a card" -msgstr "" - -#: g10/gpg.c:418 -msgid "change a card's PIN" -msgstr "" - -#: g10/gpg.c:426 -msgid "update the trust database" -msgstr "aktualigi la fido-datenaron" - -#: g10/gpg.c:433 -msgid "|algo [files]|print message digests" -msgstr "|metodo [dosieroj]|presi mesao-kompendiojn" - -#: g10/gpg.c:437 g10/gpgv.c:71 -msgid "" -"@\n" -"Options:\n" -" " -msgstr "" -"@\n" -"Opcioj:\n" -" " - -#: g10/gpg.c:439 -msgid "create ascii armored output" -msgstr "krei eligon en askia kiraso" - -#: g10/gpg.c:441 -msgid "|NAME|encrypt for NAME" -msgstr "|NOMO|ifri por NOMO" - -#: g10/gpg.c:452 -msgid "use this user-id to sign or decrypt" -msgstr "uzi i tiun uzantidentigilon por subskribi a malifri" - -#: g10/gpg.c:453 -msgid "|N|set compress level N (0 disables)" -msgstr "|N|difini densig-nivelon N (0=nenia)" - -#: g10/gpg.c:458 -msgid "use canonical text mode" -msgstr "uzi tekstan reimon" - -#: g10/gpg.c:472 -msgid "use as output file" -msgstr "uzi dosieron por eligo" - -#: g10/gpg.c:474 g10/gpgv.c:73 -msgid "verbose" -msgstr "detala eligo" - -#: g10/gpg.c:485 -msgid "do not make any changes" -msgstr "fari neniajn anojn" - -#: g10/gpg.c:486 -msgid "prompt before overwriting" -msgstr "" - -#: g10/gpg.c:527 -msgid "use strict OpenPGP behavior" -msgstr "" - -#: g10/gpg.c:528 -msgid "generate PGP 2.x compatible messages" -msgstr "" - -#: g10/gpg.c:556 -msgid "" -"@\n" -"(See the man page for a complete listing of all commands and options)\n" -msgstr "" -"@\n" -"(Vidu la manpaon por kompleta listo de iuj komandoj kaj opcioj)\n" - -#: g10/gpg.c:559 -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 fingropurojn\n" - -#: g10/gpg.c:757 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:774 -msgid "Usage: gpg [options] [files] (-h for help)" -msgstr "Uzado: gpg [opcioj] [dosieroj] (-h por helpo)" - -#: g10/gpg.c:777 -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 malifri\n" -"implicita operacio dependas de la enigataj datenoj\n" - -#: g10/gpg.c:788 -msgid "" -"\n" -"Supported algorithms:\n" -msgstr "" -"\n" -"Realigitaj metodoj:\n" - -#: g10/gpg.c:791 -msgid "Pubkey: " -msgstr "" - -#: g10/gpg.c:797 g10/keyedit.c:2310 -msgid "Cipher: " -msgstr "" - -#: g10/gpg.c:803 -msgid "Hash: " -msgstr "" - -#: g10/gpg.c:809 g10/keyedit.c:2356 -#, fuzzy -msgid "Compression: " -msgstr "Komento: " - -#: g10/gpg.c:892 -msgid "usage: gpg [options] " -msgstr "uzado: gpg [opcioj] " - -#: g10/gpg.c:1040 -msgid "conflicting commands\n" -msgstr "malkongruaj komandoj\n" - -#: g10/gpg.c:1058 -#, c-format -msgid "no = sign found in group definition `%s'\n" -msgstr "" - -#: g10/gpg.c:1255 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on homedir `%s'\n" -msgstr "Averto: malsekura posedeco sur %s \"%s\"\n" - -#: g10/gpg.c:1258 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on configuration file `%s'\n" -msgstr "Averto: malsekura posedeco sur %s \"%s\"\n" - -#: g10/gpg.c:1261 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on extension `%s'\n" -msgstr "Averto: malsekura posedeco sur %s \"%s\"\n" - -#: g10/gpg.c:1267 -#, fuzzy, c-format -msgid "WARNING: unsafe permissions on homedir `%s'\n" -msgstr "Averto: malsekuraj permesoj sur %s \"%s\"\n" - -#: g10/gpg.c:1270 -#, fuzzy, c-format -msgid "WARNING: unsafe permissions on configuration file `%s'\n" -msgstr "Averto: malsekuraj permesoj sur %s \"%s\"\n" - -#: g10/gpg.c:1273 -#, fuzzy, c-format -msgid "WARNING: unsafe permissions on extension `%s'\n" -msgstr "Averto: malsekuraj permesoj sur %s \"%s\"\n" - -#: g10/gpg.c:1279 -#, fuzzy, c-format -msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n" -msgstr "Averto: malsekura posedeco sur %s \"%s\"\n" - -#: g10/gpg.c:1282 -#, 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:1285 -#, fuzzy, c-format -msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n" -msgstr "Averto: malsekura posedeco sur %s \"%s\"\n" - -#: g10/gpg.c:1291 -#, fuzzy, c-format -msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n" -msgstr "Averto: malsekuraj permesoj sur %s \"%s\"\n" - -#: g10/gpg.c:1294 -#, 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:1297 -#, fuzzy, c-format -msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n" -msgstr "Averto: malsekuraj permesoj sur %s \"%s\"\n" - -#: g10/gpg.c:1438 -#, fuzzy, c-format -msgid "unknown configuration item `%s'\n" -msgstr "%s: nova opcio-dosiero kreita\n" - -#: g10/gpg.c:1531 -msgid "display photo IDs during key listings" -msgstr "" - -#: g10/gpg.c:1533 -msgid "show policy URLs during signature listings" -msgstr "" - -#: g10/gpg.c:1535 -#, fuzzy -msgid "show all notations during signature listings" -msgstr "Mankas responda subskribo en sekreta losilaro\n" - -#: g10/gpg.c:1537 -msgid "show IETF standard notations during signature listings" -msgstr "" - -#: g10/gpg.c:1541 -msgid "show user-supplied notations during signature listings" -msgstr "" - -#: g10/gpg.c:1543 -#, fuzzy -msgid "show preferred keyserver URLs during signature listings" -msgstr "la donita gvidlinia URL por subskriboj ne validas\n" - -#: g10/gpg.c:1545 -msgid "show user ID validity during key listings" -msgstr "" - -#: g10/gpg.c:1547 -msgid "show revoked and expired user IDs in key listings" -msgstr "" - -#: g10/gpg.c:1549 -msgid "show revoked and expired subkeys in key listings" -msgstr "" - -#: g10/gpg.c:1551 -#, fuzzy -msgid "show the keyring name in key listings" -msgstr "montri, en kiu losilaro estas listigita losilo" - -#: g10/gpg.c:1553 -#, fuzzy -msgid "show expiration dates during signature listings" -msgstr "Mankas responda subskribo en sekreta losilaro\n" - -#: g10/gpg.c:1920 -#, fuzzy, c-format -msgid "NOTE: old default options file `%s' ignored\n" -msgstr "NOTO: mankas implicita opcio-dosiero '%s'\n" - -#: g10/gpg.c:1962 -#, c-format -msgid "NOTE: no default option file `%s'\n" -msgstr "NOTO: mankas implicita opcio-dosiero '%s'\n" - -#: g10/gpg.c:1966 -#, c-format -msgid "option file `%s': %s\n" -msgstr "opcio-dosiero '%s': %s\n" - -#: g10/gpg.c:1973 -#, c-format -msgid "reading options from `%s'\n" -msgstr "legas opciojn el '%s'\n" - -#: g10/gpg.c:2188 g10/gpg.c:2814 g10/gpg.c:2833 -#, c-format -msgid "NOTE: %s is not for normal use!\n" -msgstr "NOTO: %s ne estas por normala uzado!\n" - -#: g10/gpg.c:2201 -#, c-format -msgid "cipher extension `%s' not loaded due to unsafe permissions\n" -msgstr "" - -#: g10/gpg.c:2364 g10/gpg.c:2376 -#, fuzzy, c-format -msgid "`%s' is not a valid signature expiration\n" -msgstr "%s ne estas valida signaro\n" - -#: g10/gpg.c:2452 -#, fuzzy, c-format -msgid "`%s' is not a valid character set\n" -msgstr "%s ne estas valida signaro\n" - -#: g10/gpg.c:2476 g10/gpg.c:2663 g10/keyedit.c:4064 -#, fuzzy -msgid "could not parse keyserver URL\n" -msgstr "ne povis analizi URI de losilservilo\n" - -#: g10/gpg.c:2488 -#, fuzzy, c-format -msgid "%s:%d: invalid keyserver options\n" -msgstr "AVERTO: '%s' estas malplena dosiero\n" - -#: g10/gpg.c:2491 -#, fuzzy -msgid "invalid keyserver options\n" -msgstr "nevalida losilaro" - -#: g10/gpg.c:2498 -#, fuzzy, c-format -msgid "%s:%d: invalid import options\n" -msgstr "AVERTO: '%s' estas malplena dosiero\n" - -#: g10/gpg.c:2501 -#, fuzzy -msgid "invalid import options\n" -msgstr "nevalida kiraso" - -#: g10/gpg.c:2508 -#, fuzzy, c-format -msgid "%s:%d: invalid export options\n" -msgstr "AVERTO: '%s' estas malplena dosiero\n" - -#: g10/gpg.c:2511 -#, fuzzy -msgid "invalid export options\n" -msgstr "nevalida losilaro" - -#: g10/gpg.c:2518 -#, fuzzy, c-format -msgid "%s:%d: invalid list options\n" -msgstr "AVERTO: '%s' estas malplena dosiero\n" - -#: g10/gpg.c:2521 -#, fuzzy -msgid "invalid list options\n" -msgstr "nevalida kiraso" - -#: g10/gpg.c:2529 -msgid "display photo IDs during signature verification" -msgstr "" - -#: g10/gpg.c:2531 -msgid "show policy URLs during signature verification" -msgstr "" - -#: g10/gpg.c:2533 -#, fuzzy -msgid "show all notations during signature verification" -msgstr "%s ne estas valida signaro\n" - -#: g10/gpg.c:2535 -msgid "show IETF standard notations during signature verification" -msgstr "" - -#: g10/gpg.c:2539 -msgid "show user-supplied notations during signature verification" -msgstr "" - -#: g10/gpg.c:2541 -#, fuzzy -msgid "show preferred keyserver URLs during signature verification" -msgstr "la donita gvidlinia URL por subskriboj ne validas\n" - -#: g10/gpg.c:2543 -#, fuzzy -msgid "show user ID validity during signature verification" -msgstr "%s ne estas valida signaro\n" - -#: g10/gpg.c:2545 -msgid "show revoked and expired user IDs in signature verification" -msgstr "" - -#: g10/gpg.c:2547 -msgid "validate signatures with PKA data" -msgstr "" - -#: g10/gpg.c:2549 -msgid "elevate the trust of signatures with valid PKA data" -msgstr "" - -#: g10/gpg.c:2556 -#, fuzzy, c-format -msgid "%s:%d: invalid verify options\n" -msgstr "AVERTO: '%s' estas malplena dosiero\n" - -#: g10/gpg.c:2559 -#, fuzzy -msgid "invalid verify options\n" -msgstr "nevalida losilaro" - -#: g10/gpg.c:2566 -#, c-format -msgid "unable to set exec-path to %s\n" -msgstr "" - -#: g10/gpg.c:2729 -#, fuzzy, c-format -msgid "%s:%d: invalid auto-key-locate list\n" -msgstr "AVERTO: '%s' estas malplena dosiero\n" - -#: g10/gpg.c:2732 -msgid "invalid auto-key-locate list\n" -msgstr "" - -#: g10/gpg.c:2803 -msgid "WARNING: program may create a core file!\n" -msgstr "AVERTO: programo povas krei core-dosieron!\n" - -#: g10/gpg.c:2807 -#, c-format -msgid "WARNING: %s overrides %s\n" -msgstr "AVERTO: %s nuligas %s\n" - -#: g10/gpg.c:2816 -#, c-format -msgid "%s not allowed with %s!\n" -msgstr "%s ne eblas kun %s!\n" - -#: g10/gpg.c:2819 -#, c-format -msgid "%s makes no sense with %s!\n" -msgstr "%s ne havas sencon kun %s!\n" - -#: g10/gpg.c:2826 -#, 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:2841 -#, fuzzy, c-format -msgid "will not run with insecure memory due to %s\n" -msgstr "skribas sekretan losilon al '%s'\n" - -#: g10/gpg.c:2855 -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:2861 -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:2867 -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:2880 -msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n" -msgstr "ifri mesaon kun --pgp2 postulas la ifron IDEA\n" - -#: g10/gpg.c:2947 g10/gpg.c:2971 -msgid "selected cipher algorithm is invalid\n" -msgstr "elektita ifrad-metodo ne validas\n" - -#: g10/gpg.c:2953 g10/gpg.c:2977 -msgid "selected digest algorithm is invalid\n" -msgstr "elektita kompendi-metodo ne validas\n" - -#: g10/gpg.c:2959 -#, fuzzy -msgid "selected compression algorithm is invalid\n" -msgstr "elektita ifrad-metodo ne validas\n" - -#: g10/gpg.c:2965 -#, fuzzy -msgid "selected certification digest algorithm is invalid\n" -msgstr "elektita kompendi-metodo ne validas\n" - -#: g10/gpg.c:2980 -msgid "completes-needed must be greater than 0\n" -msgstr "completes-needed devas esti pli granda ol 0\n" - -#: g10/gpg.c:2982 -msgid "marginals-needed must be greater than 1\n" -msgstr "marginals-needed devas esti pli granda ol 1\n" - -#: g10/gpg.c:2984 -#, 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:2986 -#, 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:2988 -#, 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:2991 -msgid "NOTE: simple S2K mode (0) is strongly discouraged\n" -msgstr "NOTO: simpla S2K-reimo (0) estas forte malrekomendata\n" - -#: g10/gpg.c:2995 -msgid "invalid S2K mode; must be 0, 1 or 3\n" -msgstr "nevalida S2K-reimo; devas esti 0, 1 a 3\n" - -#: g10/gpg.c:3002 -#, fuzzy -msgid "invalid default preferences\n" -msgstr "nevalidaj preferoj\n" - -#: g10/gpg.c:3011 -#, fuzzy -msgid "invalid personal cipher preferences\n" -msgstr "nevalidaj preferoj\n" - -#: g10/gpg.c:3015 -#, fuzzy -msgid "invalid personal digest preferences\n" -msgstr "nevalidaj preferoj\n" - -#: g10/gpg.c:3019 -#, fuzzy -msgid "invalid personal compress preferences\n" -msgstr "nevalidaj preferoj\n" - -#: g10/gpg.c:3052 -#, fuzzy, c-format -msgid "%s does not yet work with %s\n" -msgstr "%s ne havas sencon kun %s!\n" - -#: g10/gpg.c:3099 -#, fuzzy, c-format -msgid "you may not use cipher algorithm `%s' while in %s mode\n" -msgstr "Tiu komando ne eblas en la reimo %s.\n" - -#: g10/gpg.c:3104 -#, fuzzy, c-format -msgid "you may not use digest algorithm `%s' while in %s mode\n" -msgstr "Tiu komando ne eblas en la reimo %s.\n" - -#: g10/gpg.c:3109 -#, fuzzy, c-format -msgid "you may not use compression algorithm `%s' while in %s mode\n" -msgstr "Tiu komando ne eblas en la reimo %s.\n" - -#: g10/gpg.c:3208 -#, c-format -msgid "failed to initialize the TrustDB: %s\n" -msgstr "malsukcesis doni komencajn valorojn al fido-datenaro: %s\n" - -#: g10/gpg.c:3219 -msgid "WARNING: recipients (-r) given without using public key encryption\n" -msgstr "" - -#: g10/gpg.c:3230 -msgid "--store [filename]" -msgstr "--store [dosiero]" - -#: g10/gpg.c:3237 -msgid "--symmetric [filename]" -msgstr "--symmetric [dosiero]" - -#: g10/gpg.c:3239 -#, fuzzy, c-format -msgid "symmetric encryption of `%s' failed: %s\n" -msgstr "malifrado malsukcesis: %s\n" - -#: g10/gpg.c:3249 -msgid "--encrypt [filename]" -msgstr "--encrypt [dosiero]" - -#: g10/gpg.c:3262 -#, fuzzy -msgid "--symmetric --encrypt [filename]" -msgstr "--sign --encrypt [dosiero]" - -#: g10/gpg.c:3264 -msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n" -msgstr "" - -#: g10/gpg.c:3267 -#, fuzzy, c-format -msgid "you cannot use --symmetric --encrypt while in %s mode\n" -msgstr "Tiu komando ne eblas en la reimo %s.\n" - -#: g10/gpg.c:3285 -msgid "--sign [filename]" -msgstr "--sign [dosiero]" - -#: g10/gpg.c:3298 -msgid "--sign --encrypt [filename]" -msgstr "--sign --encrypt [dosiero]" - -#: g10/gpg.c:3313 -#, fuzzy -msgid "--symmetric --sign --encrypt [filename]" -msgstr "--sign --encrypt [dosiero]" - -#: g10/gpg.c:3315 -msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n" -msgstr "" - -#: g10/gpg.c:3318 -#, fuzzy, c-format -msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n" -msgstr "Tiu komando ne eblas en la reimo %s.\n" - -#: g10/gpg.c:3338 -msgid "--sign --symmetric [filename]" -msgstr "--sign --symmetric [dosiero]" - -#: g10/gpg.c:3347 -msgid "--clearsign [filename]" -msgstr "--clearsign [dosiero]" - -#: g10/gpg.c:3372 -msgid "--decrypt [filename]" -msgstr "--decrypt [dosiero]" - -#: g10/gpg.c:3380 -msgid "--sign-key user-id" -msgstr "--sign-key uzantidentigilo" - -#: g10/gpg.c:3384 -msgid "--lsign-key user-id" -msgstr "--lsign-key uzantidentigilo" - -#: g10/gpg.c:3405 -msgid "--edit-key user-id [commands]" -msgstr "--edit-key uzantidentigilo [komandoj]" - -#: g10/gpg.c:3476 -msgid "-k[v][v][v][c] [user-id] [keyring]" -msgstr "-k[v][v][v][c] [uzantidentigilo] [losilaro]" - -#: g10/gpg.c:3518 -#, fuzzy, c-format -msgid "keyserver send failed: %s\n" -msgstr "Kreado de losiloj malsukcesis: %s\n" - -#: g10/gpg.c:3520 -#, fuzzy, c-format -msgid "keyserver receive failed: %s\n" -msgstr "listigo de sekretaj losiloj malsukcesis: %s\n" - -#: g10/gpg.c:3522 -#, fuzzy, c-format -msgid "key export failed: %s\n" -msgstr "Kreado de losiloj malsukcesis: %s\n" - -#: g10/gpg.c:3533 -#, fuzzy, c-format -msgid "keyserver search failed: %s\n" -msgstr "get_dir_record: search_record malsukcesis: %s\n" - -#: g10/gpg.c:3543 -#, fuzzy, c-format -msgid "keyserver refresh failed: %s\n" -msgstr "listigo de sekretaj losiloj malsukcesis: %s\n" - -#: g10/gpg.c:3594 -#, c-format -msgid "dearmoring failed: %s\n" -msgstr "elkirasigo malsukcesis: %s\n" - -#: g10/gpg.c:3602 -#, c-format -msgid "enarmoring failed: %s\n" -msgstr "enkirasigo malsukcesis: %s\n" - -#: g10/gpg.c:3689 -#, c-format -msgid "invalid hash algorithm `%s'\n" -msgstr "nevalida kompendi-metodo '%s'\n" - -#: g10/gpg.c:3812 -msgid "[filename]" -msgstr "[dosiero]" - -#: g10/gpg.c:3816 -msgid "Go ahead and type your message ...\n" -msgstr "Ektajpu vian mesaon ...\n" - -#: g10/gpg.c:4120 -msgid "the given certification policy URL is invalid\n" -msgstr "la donita gvidlinia URL por atestado ne validas\n" - -#: g10/gpg.c:4122 -msgid "the given signature policy URL is invalid\n" -msgstr "la donita gvidlinia URL por subskriboj ne validas\n" - -#: g10/gpg.c:4155 -#, 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 - malaltas\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:3707 -#, 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 forvii 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 mesaon." - -#: 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 eraromesaon; anstatae 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 ani la nomon.\n" -"K por ani la komenton.\n" -"A por ani la retadreson.\n" -"B por darigi 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 sublosilo 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 psedonoma uzanto.\n" -"\n" -"\"2\" signifas, ke vi malzorge kontrolis la losilon. Ekzemple, povas esti,\n" -" ke vi kontrolis la fingropuron 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 fingropuron 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 interano de retmesaoj), 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 forvii la uzantidentigilon.\n" -"Tiam anka iuj atestiloj perdios!" - -#: g10/helptext.c:195 -msgid "Answer \"yes\" if it is okay to delete the subkey" -msgstr "Respondu per \"jes\", se la sublosilo estu forviita" - -#: 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 forvii\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 forvion, 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 "" -"ani 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 antaenigitaj 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 aplikias" - -#: 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 anstataigita\"\n" -" Uzu i tion, se vi anstataigis 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:266 -#, c-format -msgid "skipping block of type %d\n" -msgstr "ignoras blokon de speco %d\n" - -#: g10/import.c:275 -#, fuzzy, c-format -msgid "%lu keys processed so far\n" -msgstr "%lu losiloj jam traktitaj\n" - -#: g10/import.c:292 -#, c-format -msgid "Total number processed: %lu\n" -msgstr " Nombro traktita entute: %lu\n" - -#: g10/import.c:294 -#, c-format -msgid " skipped new keys: %lu\n" -msgstr " ignoritaj novaj losiloj: %lu\n" - -#: g10/import.c:297 -#, c-format -msgid " w/o user IDs: %lu\n" -msgstr " sen uzantidentigilo: %lu\n" - -#: g10/import.c:299 -#, c-format -msgid " imported: %lu" -msgstr " importitaj: %lu" - -#: g10/import.c:305 -#, c-format -msgid " unchanged: %lu\n" -msgstr " neanitaj: %lu\n" - -#: g10/import.c:307 -#, c-format -msgid " new user IDs: %lu\n" -msgstr " novaj uzantidentigiloj: %lu\n" - -#: g10/import.c:309 -#, c-format -msgid " new subkeys: %lu\n" -msgstr " novaj sublosiloj: %lu\n" - -#: g10/import.c:311 -#, c-format -msgid " new signatures: %lu\n" -msgstr " novaj subskriboj: %lu\n" - -#: g10/import.c:313 -#, c-format -msgid " new key revocations: %lu\n" -msgstr " novaj losilrevokoj: %lu\n" - -#: g10/import.c:315 -#, c-format -msgid " secret keys read: %lu\n" -msgstr " sekretaj losiloj legitaj: %lu\n" - -#: g10/import.c:317 -#, c-format -msgid " secret keys imported: %lu\n" -msgstr "sekretaj losiloj importitaj: %lu\n" - -#: g10/import.c:319 -#, c-format -msgid " secret keys unchanged: %lu\n" -msgstr "sekretaj losiloj neanitaj: %lu\n" - -#: g10/import.c:321 -#, fuzzy, c-format -msgid " not imported: %lu\n" -msgstr " importitaj: %lu" - -#: g10/import.c:323 -#, fuzzy, c-format -msgid " signatures cleaned: %lu\n" -msgstr " novaj subskriboj: %lu\n" - -#: g10/import.c:325 -#, fuzzy, c-format -msgid " user IDs cleaned: %lu\n" -msgstr " sekretaj losiloj legitaj: %lu\n" - -#: g10/import.c:566 -#, 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:570 -#, fuzzy -msgid " algorithms on these user IDs:\n" -msgstr "Vi subskribis la sekvajn uzantidentigilojn:\n" - -#: g10/import.c:607 -#, c-format -msgid " \"%s\": preference for cipher algorithm %s\n" -msgstr "" - -#: g10/import.c:619 -#, fuzzy, c-format -msgid " \"%s\": preference for digest algorithm %s\n" -msgstr "%s-subskribo de: %s\n" - -#: g10/import.c:631 -#, c-format -msgid " \"%s\": preference for compression algorithm %s\n" -msgstr "" - -#: g10/import.c:644 -msgid "it is strongly suggested that you update your preferences and\n" -msgstr "" - -#: g10/import.c:646 -msgid "re-distribute this key to avoid potential algorithm mismatch problems\n" -msgstr "" - -#: g10/import.c:670 -#, c-format -msgid "you can update your preferences with: gpg --edit-key %s updpref save\n" -msgstr "" - -#: g10/import.c:720 g10/import.c:1118 -#, fuzzy, c-format -msgid "key %s: no user ID\n" -msgstr "losilo %08lX: mankas uzantidentigilo\n" - -#: g10/import.c:749 -#, fuzzy, c-format -msgid "key %s: PKS subkey corruption repaired\n" -msgstr "losilo %08lX: mankas sublosilo por losilbindado\n" - -#: g10/import.c:764 -#, 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:770 -#, fuzzy, c-format -msgid "key %s: no valid user IDs\n" -msgstr "losilo %08lX: mankas valida uzantidentigilo\n" - -#: g10/import.c:772 -msgid "this may be caused by a missing self-signature\n" -msgstr "tio povas esti kazata de mankanta mem-subskribo\n" - -#: g10/import.c:782 g10/import.c:1240 -#, fuzzy, c-format -msgid "key %s: public key not found: %s\n" -msgstr "losilo %08lX: publika losilo ne trovita: %s\n" - -#: g10/import.c:788 -#, fuzzy, c-format -msgid "key %s: new key - skipped\n" -msgstr "losilo %08lX: nova losilo - ignorita\n" - -#: g10/import.c:797 -#, c-format -msgid "no writable keyring found: %s\n" -msgstr "neniu skribebla losilaro trovita: %s\n" - -#: g10/import.c:802 g10/openfile.c:267 g10/sign.c:831 g10/sign.c:1135 -#, c-format -msgid "writing to `%s'\n" -msgstr "skribas al '%s'\n" - -#: g10/import.c:806 g10/import.c:901 g10/import.c:1158 g10/import.c:1301 -#: g10/import.c:2363 g10/import.c:2385 -#, c-format -msgid "error writing keyring `%s': %s\n" -msgstr "eraro dum skribado de losilaro '%s': %s\n" - -#: g10/import.c:825 -#, fuzzy, c-format -msgid "key %s: public key \"%s\" imported\n" -msgstr "losilo %08lX: publika losilo importita\n" - -#: g10/import.c:849 -#, fuzzy, c-format -msgid "key %s: doesn't match our copy\n" -msgstr "losilo %08lX: diferencas de nia kopio\n" - -#: g10/import.c:866 g10/import.c:1258 -#, 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:874 g10/import.c:1265 -#, 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:911 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new user ID\n" -msgstr "losilo %08lX: 1 nova uzantidentigilo\n" - -#: g10/import.c:914 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new user IDs\n" -msgstr "losilo %08lX: %d novaj uzantidentigiloj\n" - -#: g10/import.c:917 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new signature\n" -msgstr "losilo %08lX: 1 nova subskribo\n" - -#: g10/import.c:920 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new signatures\n" -msgstr "losilo %08lX: %d novaj subskriboj\n" - -#: g10/import.c:923 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new subkey\n" -msgstr "losilo %08lX: 1 nova sublosilo\n" - -#: g10/import.c:926 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new subkeys\n" -msgstr "losilo %08lX: %d novaj sublosiloj\n" - -#: g10/import.c:929 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signature cleaned\n" -msgstr "losilo %08lX: %d novaj subskriboj\n" - -#: g10/import.c:932 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signatures cleaned\n" -msgstr "losilo %08lX: %d novaj subskriboj\n" - -#: g10/import.c:935 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d user ID cleaned\n" -msgstr "losilo %08lX: %d novaj uzantidentigiloj\n" - -#: g10/import.c:938 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d user IDs cleaned\n" -msgstr "losilo %08lX: %d novaj uzantidentigiloj\n" - -#: g10/import.c:961 -#, fuzzy, c-format -msgid "key %s: \"%s\" not changed\n" -msgstr "losilo %08lX: ne anita\n" - -#: g10/import.c:1124 -#, 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:1135 -#, fuzzy -msgid "importing secret keys not allowed\n" -msgstr "skribas sekretan losilon al '%s'\n" - -#: g10/import.c:1152 g10/import.c:2378 -#, c-format -msgid "no default secret keyring: %s\n" -msgstr "mankas implicita sekreta losilaro: %s\n" - -#: g10/import.c:1163 -#, fuzzy, c-format -msgid "key %s: secret key imported\n" -msgstr "losilo %08lX: sekreta losilo importita\n" - -#: g10/import.c:1193 -#, fuzzy, c-format -msgid "key %s: already in secret keyring\n" -msgstr "losilo %08lX: jam en sekreta losilaro\n" - -#: g10/import.c:1203 -#, fuzzy, c-format -msgid "key %s: secret key not found: %s\n" -msgstr "losilo %08lX: sekreta losilo ne trovita: %s\n" - -#: g10/import.c:1233 -#, 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:1276 -#, fuzzy, c-format -msgid "key %s: invalid revocation certificate: %s - rejected\n" -msgstr "losilo %08lX: nevalida revokatestilo: %s - malakceptita\n" - -#: g10/import.c:1308 -#, fuzzy, c-format -msgid "key %s: \"%s\" revocation certificate imported\n" -msgstr "losilo %08lX: revokatestilo importita\n" - -#: g10/import.c:1374 -#, fuzzy, c-format -msgid "key %s: no user ID for signature\n" -msgstr "losilo %08lX: mankas uzantidentigilo por subskribo\n" - -#: g10/import.c:1389 -#, fuzzy, c-format -msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n" -msgstr "losilo %08lX: nerealigita publiklosila metodo\n" - -#: g10/import.c:1391 -#, fuzzy, c-format -msgid "key %s: invalid self-signature on user ID \"%s\"\n" -msgstr "losilo %08lX: nevalida mem-subskribo\n" - -#: g10/import.c:1409 -#, fuzzy, c-format -msgid "key %s: no subkey for key binding\n" -msgstr "losilo %08lX: mankas sublosilo por losilbindado\n" - -#: g10/import.c:1420 g10/import.c:1470 -#, fuzzy, c-format -msgid "key %s: unsupported public key algorithm\n" -msgstr "losilo %08lX: nerealigita publiklosila metodo\n" - -#: g10/import.c:1422 -#, fuzzy, c-format -msgid "key %s: invalid subkey binding\n" -msgstr "losilo %08lX: nevalida sublosila bindado\n" - -#: g10/import.c:1437 -#, fuzzy, c-format -msgid "key %s: removed multiple subkey binding\n" -msgstr "losilo %08lX: nevalida sublosila bindado\n" - -#: g10/import.c:1459 -#, fuzzy, c-format -msgid "key %s: no subkey for key revocation\n" -msgstr "losilo %08lX: mankas sublosilo por losilbindado\n" - -#: g10/import.c:1472 -#, fuzzy, c-format -msgid "key %s: invalid subkey revocation\n" -msgstr "losilo %08lX.%lu: Valida sublosilrevoko\n" - -#: g10/import.c:1487 -#, fuzzy, c-format -msgid "key %s: removed multiple subkey revocation\n" -msgstr "losilo %08lX: nevalida sublosila bindado\n" - -#: g10/import.c:1529 -#, fuzzy, c-format -msgid "key %s: skipped user ID \"%s\"\n" -msgstr "losilo %08lX: ignoris uzantidentigilon '" - -#: g10/import.c:1550 -#, fuzzy, c-format -msgid "key %s: skipped subkey\n" -msgstr "losilo %08lX: ignoris sublosilon\n" - -#: g10/import.c:1577 -#, 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:1587 -#, fuzzy, c-format -msgid "key %s: revocation certificate at wrong place - skipped\n" -msgstr "losilo %08lX: revokatestilo en malusta loko - ignorita\n" - -#: g10/import.c:1604 -#, fuzzy, c-format -msgid "key %s: invalid revocation certificate: %s - skipped\n" -msgstr "losilo %08lX: nevalida revokatestilo: %s - ignorita\n" - -#: g10/import.c:1618 -#, fuzzy, c-format -msgid "key %s: subkey signature in wrong place - skipped\n" -msgstr "losilo %08lX: revokatestilo en malusta loko - ignorita\n" - -#: g10/import.c:1626 -#, 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:1726 -#, fuzzy, c-format -msgid "key %s: duplicated user ID detected - merged\n" -msgstr "losilo %08lX: trovis ripetitan uzantidentigilon - kunfandita\n" - -#: g10/import.c:1788 -#, 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:1802 -#, 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:1861 -#, fuzzy, c-format -msgid "key %s: \"%s\" revocation certificate added\n" -msgstr "losilo %08lX: revokatestilo aldonita\n" - -#: g10/import.c:1895 -#, fuzzy, c-format -msgid "key %s: direct key signature added\n" -msgstr "losilo %08lX: rekta losilsubskribo aldonita\n" - -#: g10/import.c:2284 -msgid "NOTE: a key's S/N does not match the card's one\n" -msgstr "" - -#: g10/import.c:2292 -#, fuzzy -msgid "NOTE: primary key is online and stored on card\n" -msgstr "ignorita: sekreta losilo jam eestas\n" - -#: g10/import.c:2294 -#, 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 eksvalidiu 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 eksvalidiis!" - -#: g10/keyedit.c:843 -#, c-format -msgid "This key is due to expire on %s.\n" -msgstr "i tiu losilo eksvalidios 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 eksvalidiu 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 mesao 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 kazata 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:4783 g10/keyedit.c:4874 g10/keyedit.c:4938 -#: g10/keyedit.c:4999 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 verajne 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 "forvii 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 "forvii 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 ani la daton de eksvalidio 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 "ani la pasfrazon" - -#: g10/keyedit.c:1436 -msgid "change the ownertrust" -msgstr "ani 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 "malalti 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 reimo %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 forvii 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 forvii la elektitajn losilojn? " - -#: g10/keyedit.c:1970 -#, fuzzy -msgid "Do you really want to delete this key? (y/N) " -msgstr "u vi vere volas forvii 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 anojn? " - -#: g10/keyedit.c:2208 -#, fuzzy -msgid "Quit without saving? (y/N) " -msgstr "u fini sen skribi anojn? " - -#: 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 anita, 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 " [eksvalidios: %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 " [eksvalidios: %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 malaltita" - -#: 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" -" kazos, ke iuj versioj de PGP malakceptos la losilon.\n" - -#: g10/keyedit.c:3016 g10/keyedit.c:3346 -#, 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 forvii i tiun bonan subskribon? (j/N/f)" - -#: g10/keyedit.c:3172 -msgid "Delete this invalid signature? (y/N/q)" -msgstr "u forvii i tiun nevalidan subskribon? (j/N/f)" - -#: g10/keyedit.c:3176 -msgid "Delete this unknown signature? (y/N/q)" -msgstr "u forvii i tiun nekonatan subskribon? (j/N/f)" - -#: g10/keyedit.c:3182 -msgid "Really delete this self-signature? (y/N)" -msgstr "u vere forvii i tiun mem-subskribon? (j/N)" - -#: g10/keyedit.c:3196 -#, c-format -msgid "Deleted %d signature.\n" -msgstr "Forviis %d subskribon.\n" - -#: g10/keyedit.c:3197 -#, c-format -msgid "Deleted %d signatures.\n" -msgstr "Forviis %d subskribojn.\n" - -#: g10/keyedit.c:3200 -msgid "Nothing deleted.\n" -msgstr "Nenio estis forviita.\n" - -#: g10/keyedit.c:3233 g10/trustdb.c:1703 -msgid "invalid" -msgstr "nevalida" - -#: g10/keyedit.c:3249 -#, fuzzy, c-format -msgid "User ID \"%s\": already clean\n" -msgstr "Uzantidentigilo \"%s\" estas revokita.\n" - -#: g10/keyedit.c:3341 -#, 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" -" kazos, ke iuj versioj de PGP malakceptos la losilon.\n" - -#: g10/keyedit.c:3352 -#, 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:3372 -#, fuzzy -msgid "Enter the user ID of the designated revoker: " -msgstr "Donu la losilgrandon" - -#: g10/keyedit.c:3397 -msgid "cannot appoint a PGP 2.x style key as a designated revoker\n" -msgstr "" - -#: g10/keyedit.c:3412 -msgid "you cannot appoint a key as its own designated revoker\n" -msgstr "" - -#: g10/keyedit.c:3434 -#, 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:3453 -msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n" -msgstr "" - -#: g10/keyedit.c:3459 -#, 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:3520 -msgid "Please remove selections from the secret keys.\n" -msgstr "Bonvolu malelekti la sekretajn losilojn.\n" - -#: g10/keyedit.c:3526 -#, fuzzy -msgid "Please select at most one subkey.\n" -msgstr "Bonvolu elekti maksimume unu flankan losilon.\n" - -#: g10/keyedit.c:3530 -#, fuzzy -msgid "Changing expiration time for a subkey.\n" -msgstr "anas la daton de eksvalidio de flanka losilo.\n" - -#: g10/keyedit.c:3533 -msgid "Changing expiration time for the primary key.\n" -msgstr "anas la daton de eksvalidio de la efa losilo.\n" - -#: g10/keyedit.c:3579 -msgid "You can't change the expiration date of a v3 key\n" -msgstr "Vi ne povas ani la daton de eksvalidio de v3-losilo\n" - -#: g10/keyedit.c:3595 -msgid "No corresponding signature in secret ring\n" -msgstr "Mankas responda subskribo en sekreta losilaro\n" - -#: g10/keyedit.c:3668 -#, fuzzy, c-format -msgid "signing subkey %s is already cross-certified\n" -msgstr "Uzantidentigilo \"%s\" estas revokita.\n" - -#: g10/keyedit.c:3674 -#, c-format -msgid "subkey %s does not sign and so does not need to be cross-certified\n" -msgstr "" - -#: g10/keyedit.c:3836 -msgid "Please select exactly one user ID.\n" -msgstr "Bonvolu elekti precize unu uzantidentigilon.\n" - -#: g10/keyedit.c:3875 g10/keyedit.c:3985 g10/keyedit.c:4105 g10/keyedit.c:4246 -#, fuzzy, c-format -msgid "skipping v3 self-signature on user ID \"%s\"\n" -msgstr "losilo %08lX: nevalida mem-subskribo\n" - -#: g10/keyedit.c:4046 -msgid "Enter your preferred keyserver URL: " -msgstr "" - -#: g10/keyedit.c:4126 -#, 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:4127 -#, 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:4189 -#, fuzzy -msgid "Enter the notation: " -msgstr "Subskribo-notacio: " - -#: g10/keyedit.c:4338 -#, fuzzy -msgid "Proceed? (y/N) " -msgstr "u surskribi (j/N)? " - -#: g10/keyedit.c:4402 -#, c-format -msgid "No user ID with index %d\n" -msgstr "Mankas uzantidentigilo kun indekso %d\n" - -#: g10/keyedit.c:4460 -#, fuzzy, c-format -msgid "No user ID with hash %s\n" -msgstr "Mankas uzantidentigilo kun indekso %d\n" - -#: g10/keyedit.c:4487 -#, fuzzy, c-format -msgid "No subkey with index %d\n" -msgstr "Mankas uzantidentigilo kun indekso %d\n" - -#: g10/keyedit.c:4622 -#, fuzzy, c-format -msgid "user ID: \"%s\"\n" -msgstr "uzantidentigilo: \"" - -#: g10/keyedit.c:4625 g10/keyedit.c:4689 g10/keyedit.c:4732 -#, 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:4627 g10/keyedit.c:4691 g10/keyedit.c:4734 -msgid " (non-exportable)" -msgstr "" - -#: g10/keyedit.c:4631 -#, fuzzy, c-format -msgid "This signature expired on %s.\n" -msgstr "i tiu losilo eksvalidios je %s.\n" - -#: g10/keyedit.c:4635 -#, 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:4639 -#, fuzzy -msgid "Create a revocation certificate for this signature? (y/N) " -msgstr "u krei revokatestilon por i tiu subskribo? (j/N)" - -#: g10/keyedit.c:4666 -#, fuzzy, c-format -msgid "You have signed these user IDs on key %s:\n" -msgstr "Vi subskribis la sekvajn uzantidentigilojn:\n" - -#: g10/keyedit.c:4692 -#, fuzzy -msgid " (non-revocable)" -msgstr "subskribi losilon nerevokeble" - -#: g10/keyedit.c:4699 -#, fuzzy, c-format -msgid "revoked by your key %s on %s\n" -msgstr " revokita de %08lX je %s\n" - -#: g10/keyedit.c:4721 -msgid "You are about to revoke these signatures:\n" -msgstr "Vi revokos la sekvajn subskribojn:\n" - -#: g10/keyedit.c:4741 -#, fuzzy -msgid "Really create the revocation certificates? (y/N) " -msgstr "u vere krei la revokatestilojn? (j/N)" - -#: g10/keyedit.c:4771 -msgid "no secret key\n" -msgstr "mankas sekreta losilo\n" - -#: g10/keyedit.c:4841 -#, fuzzy, c-format -msgid "user ID \"%s\" is already revoked\n" -msgstr "Uzantidentigilo \"%s\" estas revokita.\n" - -#: g10/keyedit.c:4858 -#, c-format -msgid "WARNING: a user ID signature is dated %d seconds in the future\n" -msgstr "" - -#: g10/keyedit.c:4922 -#, fuzzy, c-format -msgid "Key %s is already revoked.\n" -msgstr "Uzantidentigilo \"%s\" estas revokita.\n" - -#: g10/keyedit.c:4984 -#, fuzzy, c-format -msgid "Subkey %s is already revoked.\n" -msgstr "Uzantidentigilo \"%s\" estas revokita.\n" - -#: g10/keyedit.c:5079 -#, 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 signoeno\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 eksvalidios\n" -" <n> = losilo eksvalidios post n tagoj\n" -" <n>w = losilo eksvalidios post n semajnoj\n" -" <n>m = losilo eksvalidios post n monatoj\n" -" <n>y = losilo eksvalidios 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 eksvalidios\n" -" <n> = losilo eksvalidios post n tagoj\n" -" <n>w = losilo eksvalidios post n semajnoj\n" -" <n>m = losilo eksvalidios post n monatoj\n" -" <n>y = losilo eksvalidios 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 eksvalidios\n" - -#: g10/keygen.c:1675 -#, fuzzy -msgid "Signature does not expire at all\n" -msgstr "%s neniam eksvalidios\n" - -#: g10/keygen.c:1680 -#, fuzzy, c-format -msgid "Key expires at %s\n" -msgstr "%s eksvalidios je %s\n" - -#: g10/keygen.c:1681 -#, fuzzy, c-format -msgid "Signature expires at %s\n" -msgstr "i tiu losilo eksvalidios 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 komencii 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 "anu (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 "anu (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 verajne estas *malbona* ideo!\n" -"Mi tamen faros tiel. Vi povos iam ajn ani 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 sufie 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 " -"horloeraro)\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 " -"horloeraro)\n" - -#: g10/keygen.c:3181 g10/keygen.c:3311 -msgid "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n" -msgstr "NOTO: krei sublosilojn 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 "forvio 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 eksvalidiis 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 fingropurojn" - -#: 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 neanita\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:1421 -#, 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 "seras pri \"%s\" e HKP-servilo %s\n" - -#: g10/keyserver.c:1176 -#, fuzzy, c-format -msgid "searching for names from %s\n" -msgstr "seras pri \"%s\" e HKP-servilo %s\n" - -#: g10/keyserver.c:1324 -#, fuzzy, c-format -msgid "sending key %s to %s server %s\n" -msgstr "seras pri \"%s\" e HKP-servilo %s\n" - -#: g10/keyserver.c:1328 -#, fuzzy, c-format -msgid "sending key %s to %s\n" -msgstr "" -"\"\n" -"subskribita per via losilo %08lX je %s\n" - -#: g10/keyserver.c:1371 -#, fuzzy, c-format -msgid "searching for \"%s\" from %s server %s\n" -msgstr "seras pri \"%s\" e HKP-servilo %s\n" - -#: g10/keyserver.c:1374 -#, fuzzy, c-format -msgid "searching for \"%s\" from %s\n" -msgstr "seras pri \"%s\" e HKP-servilo %s\n" - -#: g10/keyserver.c:1381 g10/keyserver.c:1477 -#, fuzzy -msgid "no keyserver action!\n" -msgstr "nevalida losilaro" - -#: g10/keyserver.c:1429 -#, c-format -msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n" -msgstr "" - -#: g10/keyserver.c:1438 -msgid "keyserver did not send VERSION\n" -msgstr "" - -#: g10/keyserver.c:1500 g10/keyserver.c:2028 -msgid "no keyserver known (use option --keyserver)\n" -msgstr "neniu losilservilo konata (uzu la opcion --keyserver)\n" - -#: g10/keyserver.c:1506 -msgid "external keyserver calls are not supported in this build\n" -msgstr "" - -#: g10/keyserver.c:1518 -#, c-format -msgid "no handler for keyserver scheme `%s'\n" -msgstr "" - -#: g10/keyserver.c:1523 -#, c-format -msgid "action `%s' not supported with keyserver scheme `%s'\n" -msgstr "" - -#: g10/keyserver.c:1531 -#, c-format -msgid "%s does not support handler version %d\n" -msgstr "" - -#: g10/keyserver.c:1538 -#, fuzzy -msgid "keyserver timed out\n" -msgstr "losilservila eraro" - -#: g10/keyserver.c:1543 -#, fuzzy -msgid "keyserver internal error\n" -msgstr "losilservila eraro" - -#: g10/keyserver.c:1552 -#, fuzzy, c-format -msgid "keyserver communications error: %s\n" -msgstr "listigo de sekretaj losiloj malsukcesis: %s\n" - -#: g10/keyserver.c:1577 g10/keyserver.c:1611 -#, fuzzy, c-format -msgid "\"%s\" not a key ID: skipping\n" -msgstr "%s: ne valida losilidentigilo\n" - -#: g10/keyserver.c:1870 -#, 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:1892 -#, fuzzy, c-format -msgid "refreshing 1 key from %s\n" -msgstr "petas la losilon %08lX de HKP-losilservilo %s ...\n" - -#: g10/keyserver.c:1894 -#, fuzzy, c-format -msgid "refreshing %d keys from %s\n" -msgstr "petas la losilon %08lX de HKP-losilservilo %s ...\n" - -#: g10/keyserver.c:1950 -#, fuzzy, c-format -msgid "WARNING: unable to fetch URI %s: %s\n" -msgstr "Averto: malsekura posedeco sur %s \"%s\"\n" - -#: g10/keyserver.c:1956 -#, 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 "publiklosile 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 "publiklosila malifrado 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 anstatae\n" - -#: g10/mainproc.c:581 -msgid "decryption okay\n" -msgstr "malifrado 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 mesao estis manipulita!\n" - -#: g10/mainproc.c:604 -#, c-format -msgid "decryption failed: %s\n" -msgstr "malifrado 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 malaltita\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 eksvalidios 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 "Eksvalidiinta 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 eksvalidios je %s.\n" - -#: g10/mainproc.c:1868 -#, fuzzy, c-format -msgid "Signature expires %s\n" -msgstr "i tiu losilo eksvalidios 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 malalti 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 publiklosilan 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 aldonao 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 mesao 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:305 -#, c-format -msgid "assuming signed data in `%s'\n" -msgstr "supozas subskribitajn datenojn en '%s'\n" - -#: g10/openfile.c:384 -#, fuzzy, c-format -msgid "new configuration file `%s' created\n" -msgstr "%s: nova opcio-dosiero kreita\n" - -#: g10/openfile.c:386 -#, c-format -msgid "WARNING: options in `%s' are not yet active during this run\n" -msgstr "" - -#: g10/openfile.c:418 -#, 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 publiklosilan metodon %d\n" - -#: g10/parse-packet.c:708 -msgid "WARNING: potentially insecure symmetrically encrypted session key\n" -msgstr "" - -#: g10/parse-packet.c:1157 -#, 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 konektii 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 - malaltas uzadon de agento\n" - -#: g10/passphrase.c:532 g10/passphrase.c:914 -#, fuzzy, c-format -msgid " (main key ID %s)" -msgstr " (eflosilo %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 mallosi 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:968 -#, fuzzy -msgid "can't query passphrase in batch mode\n" -msgstr "ne povas kontroli pasvorton en neinteraga reimo\n" - -#: g10/passphrase.c:812 g10/passphrase.c:973 -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 mallosi 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:977 -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 anstataigita." - -#: 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 verajne 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 ani 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 verajne 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 sublosilo estas revokita de sia posedanto!\n" - -#: g10/pkclist.c:533 -msgid "Note: This key has been disabled.\n" -msgstr "Noto: i tiu losilo estas malaltita.\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 eksvalidiis!\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 verajne 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 sufie 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 malaltita.\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 malaltita\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 malaltita\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 eksvalidiis 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 ani 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 " -"horloeraro)\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 " -"horloeraro)\n" - -#: g10/sig-check.c:205 -#, fuzzy, c-format -msgid "NOTE: signature key %s expired %s\n" -msgstr "NOTO: subskribo-losilo %08lX eksvalidiis 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 sublosilo 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 sublosilo 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:127 g10/skclist.c:191 -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:158 -#, fuzzy, c-format -msgid "skipped \"%s\": duplicated\n" -msgstr "ignoris '%s': ripetita\n" - -#: g10/skclist.c:166 g10/skclist.c:176 g10/skclist.c:185 -#, fuzzy, c-format -msgid "skipped \"%s\": %s\n" -msgstr "ignoris '%s': %s\n" - -#: g10/skclist.c:171 -msgid "skipped: secret key already present\n" -msgstr "ignorita: sekreta losilo jam eestas\n" - -#: g10/skclist.c:186 -#, 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 fuita; 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 publiklosila 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 "malusta 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 publiklosila 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 forvio 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 publiklosila 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:350 -msgid "operation is not possible without initialized secure memory\n" -msgstr "operacio ne eblas sen sekura memoro kun komenca valoro\n" - -#: util/secmem.c:351 -msgid "(you may have used the wrong program for this task)\n" -msgstr "(eble vi uzis la malustan 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 " [eksvalidios: %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 "User ID \"%s\": %d signature removed.\n" -#~ msgstr "Uzantidentigilo \"%s\" estas revokita.\n" - -#, fuzzy -#~ msgid "User ID \"%s\": %d signatures removed.\n" -#~ msgstr "Uzantidentigilo \"%s\" estas revokita.\n" - -#, fuzzy -#~ msgid "User ID \"%s\" removed: %s\n" -#~ msgstr "Uzantidentigilo \"%s\" estas revokita.\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 "forvii subskribojn" - -#~ msgid "change the expire date" -#~ msgstr "ani la daton de eksvalidio" - -#~ 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 daras 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 reimo\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: sublosilo estas revokita!\n" - -#~ msgid "%08lX: key has expired\n" -#~ msgstr "%08lX: losilo eksvalidiis\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 " (eflosilo %08lX)" - -#~ msgid "rev! subkey has been revoked: %s\n" -#~ msgstr "rev! sublosilo 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 " [eksvalidios: %s]" - -#~ msgid " [expires: %s]" -#~ msgstr " [eksvalidios: %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]|malifri 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 fuitan 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 reimo: 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 seri 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 reimon 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-reimon 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 "malifri datenojn (implicita elekto)" - -#~ msgid "%s%c %4u%c/%08lX created: %s expires: %s" -#~ msgstr "%s%c %4u%c/%08lX kreita: %s eksvalidios: %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 seri 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 " -#~ "horloeraro)\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 " -#~ "horloeraro)\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: nurifra, 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 nurifra 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 "ano 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 anitaj.\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 - malaltas\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 sublosila bindado\n" - -#~ msgid "key %08lX.%lu: Invalid subkey binding: %s\n" -#~ msgstr "losilo %08lX.%lu: Nevalida sublosila 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 malusta registro.\n" - -#~ msgid "duplicated certificate - deleted" -#~ msgstr "ripetita atestilo - forviita" - -#~ msgid "tdbio_search_dir failed: %s\n" -#~ msgstr "tdbio_search_dir malsukcesis: %s\n" - -#~ msgid "lid ?: insert failed: %s\n" -#~ msgstr "lid ?: enovo malsukcesis: %s\n" - -#~ msgid "lid %lu: insert failed: %s\n" -#~ msgstr "lid %lu: enovo malsukcesis: %s\n" - -#~ msgid "lid %lu: inserted\n" -#~ msgstr "lid %lu: enovita\n" - -#~ msgid "\t%lu keys inserted\n" -#~ msgstr "\t%lu losiloj enovitaj\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: sero pri dosieruja registro malsukcesis: %s\n" - -#~ msgid "key %08lX: insert trust record failed: %s\n" -#~ msgstr "losilo %08lX: enovo de fidoregistro malsukcesis: %s\n" - -#~ msgid "key %08lX.%lu: inserted into trustdb\n" -#~ msgstr "losilo %08lX.%lu: enovis 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 horloeraro)\n" - -#~ msgid "key %08lX.%lu: expired at %s\n" -#~ msgstr "losilo %08lX.%lu: eksvalidiis 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 - enovas\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 malifrado\n" diff --git a/po/es.po b/po/es.po deleted file mode 100644 index 4f2b044ed..000000000 --- a/po/es.po +++ /dev/null @@ -1,7459 +0,0 @@ -# Mensajes en espaol 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 Surez <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-07-28 11:12+0200\n" -"PO-Revision-Date: 2005-03-25 16:50+0100\n" -"Last-Translator: Jaime Surez <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 mdulo acumulador de entropa\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:1003 g10/gpg.c:3461 g10/import.c:195 g10/keygen.c:2385 -#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:342 -#: 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 informacin 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. Tambin 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 vaco\n" - -#: cipher/random.c:474 -msgid "WARNING: invalid size of random_seed file - not used\n" -msgstr "" -"ATENCIN: tamao 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:1002 g10/keygen.c:2864 -#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:263 -#: g10/openfile.c:357 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 "ATENCIN: usando un generador de nmeros 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 nmeros aleatorios es slo un apao\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 entropa. 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 entropa.\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 algn\n" -"otro trabajo para que el sistema pueda recolectar ms entropa\n" -"(se necesitan %d bytes ms).\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 creacin: %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 pblica\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 mdulo 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 pblico 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 funcin 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 mnima %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 verificacin 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 aplicacin\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 pblico demasiado grande (ms 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 generacin de la clave fall\n" - -#: g10/app-openpgp.c:1904 -#, c-format -msgid "key generation completed (%d seconds)\n" -msgstr "generacin 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 invlida (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 invlida?\n" - -#: g10/armor.c:320 -#, c-format -msgid "armor: %s\n" -msgstr "armadura: %s\n" - -#: g10/armor.c:359 -msgid "invalid armor header: " -msgstr "cabecera de armadura invlida: " - -#: g10/armor.c:370 -msgid "armor header: " -msgstr "cabecera de armadura: " - -#: g10/armor.c:381 -msgid "invalid clearsig header\n" -msgstr "cabecera de firma clara invlida\n" - -#: g10/armor.c:433 -msgid "nested clear text signatures\n" -msgstr "firmas en texto claro anidadas\n" - -#: g10/armor.c:568 -msgid "unexpected armor: " -msgstr "armadura inesperada: " - -#: g10/armor.c:580 -msgid "invalid dash escaped line: " -msgstr "Lnea con guiones invlida: " - -#: g10/armor.c:734 g10/armor.c:1343 -#, c-format -msgid "invalid radix64 character %02X skipped\n" -msgstr "caracter invlido radix64 %02X omitido\n" - -#: g10/armor.c:777 -msgid "premature eof (no CRC)\n" -msgstr "Fin de fichero prematuro (falta suma de comprobacin)\n" - -#: g10/armor.c:811 -msgid "premature eof (in CRC)\n" -msgstr "Fin de suma de comprobacin prematuro\n" - -#: g10/armor.c:819 -msgid "malformed CRC\n" -msgstr "Suma de comprobacin mal creada\n" - -#: g10/armor.c:823 g10/armor.c:1380 -#, c-format -msgid "CRC error; %06lX - %06lX\n" -msgstr "Error en suma de comprobacin: %06lX - %06lX\n" - -#: g10/armor.c:843 -msgid "premature eof (in trailer)\n" -msgstr "fin de fichero prematuro (en el cierre)\n" - -#: g10/armor.c:847 -msgid "error in trailer line\n" -msgstr "error en la lnea de cierre\n" - -#: g10/armor.c:1158 -msgid "no valid OpenPGP data found.\n" -msgstr "no se han encontrados datos OpenPGP vlidos\n" - -#: g10/armor.c:1163 -#, c-format -msgid "invalid armor: line longer than %d characters\n" -msgstr "armadura incorrecta: lnea ms larga de %d caracteres\n" - -#: g10/armor.c:1167 -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 eleccin: " - -#: 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: slo 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 (mximo %d caracteres).\n" - -#: g10/card-util.c:581 -msgid "URL to retrieve public key: " -msgstr "URL de donde recuperar la clave pblica: " - -#: g10/card-util.c:589 -#, c-format -msgid "Error: URL too long (limit is %d characters).\n" -msgstr "Error: URL demasiado larga (el mximo son %d caracteres).\n" - -#: g10/card-util.c:687 g10/card-util.c:756 g10/import.c:280 -#, 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 (lmite 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 (lmite 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 invlida.\n" - -#: g10/card-util.c:811 -msgid "Error: invalid characters in preference string.\n" -msgstr "Error: caracteres invlidos 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 vlida.\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 invlido de huella dactilar.\n" - -#: g10/card-util.c:938 -#, c-format -msgid "key operation not possible: %s\n" -msgstr "la operacin 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 informacin 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 fbrica del PIN son\n" -" PIN = `%s' PIN Administrador = `%s'\n" -"Debera 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 autentificacin\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 "Eleccin invlida.\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 proteccin 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 estn 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 opcin 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 slo 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 invlida (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 nmero 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; intntelo de nuevo" - -#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3826 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:3387 g10/keyserver.c:1700 -#: 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:2349 g10/keyserver.c:1714 -#: 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 informacin 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 pblica! \"%s\"!\n" - -#: g10/delkey.c:208 -msgid "use option \"--delete-secret-keys\" to delete it first.\n" -msgstr "use antes la opcin \"--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 contrasea: %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 simtrico 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 "ATENCIN `%s' es un fichero vaco\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 simtrico %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 compresin %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 simtrico %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:67 g10/mainproc.c:293 -#, c-format -msgid "%s encrypted data\n" -msgstr "datos cifrados %s\n" - -#: g10/encr-data.c:69 g10/mainproc.c:297 -#, c-format -msgid "encrypted with unknown algorithm %d\n" -msgstr "cifrado con algoritmo desconocido %d\n" - -#: g10/encr-data.c:93 -msgid "" -"WARNING: message was encrypted with a weak key in the symmetric cipher.\n" -msgstr "" -"ATENCIN: mensaje cifrado con una clave dbil en el cifrado simtrico.\n" - -#: g10/encr-data.c:104 -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:415 -#, 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 intrprete 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 revocacin 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 comprobacin simple SK\n" - -#: g10/export.c:598 -msgid "WARNING: nothing exported\n" -msgstr "ATENCIN: 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? -# Quin dice que no se puede? :-) -#: g10/gpg.c:375 -msgid "" -"@Commands:\n" -" " -msgstr "" -"@rdenes:\n" -" " - -#: g10/gpg.c:377 -msgid "|[file]|make a signature" -msgstr "|[file]|crea una firma" - -#: g10/gpg.c:378 -msgid "|[file]|make a clear text signature" -msgstr "|[file]|crea una firma en texto claro" - -#: g10/gpg.c:379 -msgid "make a detached signature" -msgstr "crea una firma separada" - -#: g10/gpg.c:380 -msgid "encrypt data" -msgstr "cifra datos" - -#: g10/gpg.c:382 -msgid "encryption only with symmetric cipher" -msgstr "cifra slo con un cifrado simtrico" - -#: g10/gpg.c:384 -msgid "decrypt data (default)" -msgstr "descifra datos (predefinido)" - -#: g10/gpg.c:386 -msgid "verify a signature" -msgstr "verifica una firma" - -#: g10/gpg.c:388 -msgid "list keys" -msgstr "lista claves" - -#: g10/gpg.c:390 -msgid "list keys and signatures" -msgstr "lista claves y firmas" - -#: g10/gpg.c:391 -msgid "list and check key signatures" -msgstr "lista y comprueba firmas de las claves" - -#: g10/gpg.c:392 -msgid "list keys and fingerprints" -msgstr "lista claves y huellas dactilares" - -#: g10/gpg.c:393 -msgid "list secret keys" -msgstr "lista claves secretas" - -#: g10/gpg.c:394 -msgid "generate a new key pair" -msgstr "genera un nuevo par de claves" - -#: g10/gpg.c:395 -msgid "remove keys from the public keyring" -msgstr "elimina claves del anillo pblico" - -#: g10/gpg.c:397 -msgid "remove keys from the secret keyring" -msgstr "elimina claves del anillo privado" - -#: g10/gpg.c:398 -msgid "sign a key" -msgstr "firma la clave" - -#: g10/gpg.c:399 -msgid "sign a key locally" -msgstr "firma la clave localmente" - -#: g10/gpg.c:400 -msgid "sign or edit a key" -msgstr "firma o modifica una clave" - -#: g10/gpg.c:401 -msgid "generate a revocation certificate" -msgstr "genera un certificado de revocacin" - -#: g10/gpg.c:403 -msgid "export keys" -msgstr "exporta claves" - -#: g10/gpg.c:404 -msgid "export keys to a key server" -msgstr "exporta claves a un servidor de claves" - -#: g10/gpg.c:405 -msgid "import keys from a key server" -msgstr "importa claves desde un servidor de claves" - -#: g10/gpg.c:407 -msgid "search for keys on a key server" -msgstr "busca claves en un servidor de claves" - -#: g10/gpg.c:409 -msgid "update all keys from a keyserver" -msgstr "actualiza todas las claves desde un servidor de claves" - -#: g10/gpg.c:413 -msgid "import/merge keys" -msgstr "importa/fusiona claves" - -#: g10/gpg.c:416 -msgid "print the card status" -msgstr "escribir estado de la tarjeta" - -#: g10/gpg.c:417 -msgid "change data on a card" -msgstr "cambiar datos en la tarjeta" - -#: g10/gpg.c:418 -msgid "change a card's PIN" -msgstr "cambiar el PIN de la tarjeta" - -#: g10/gpg.c:426 -msgid "update the trust database" -msgstr "actualiza la base de datos de confianza" - -#: g10/gpg.c:433 -msgid "|algo [files]|print message digests" -msgstr "|algo [ficheros]|imprime resmenes de mensaje" - -#: g10/gpg.c:437 g10/gpgv.c:71 -msgid "" -"@\n" -"Options:\n" -" " -msgstr "" -"@\n" -"Opciones:\n" -" " - -#: g10/gpg.c:439 -msgid "create ascii armored output" -msgstr "crea una salida ascii con armadura" - -#: g10/gpg.c:441 -msgid "|NAME|encrypt for NAME" -msgstr "|NOMBRE|cifra para NOMBRE" - -#: g10/gpg.c:452 -msgid "use this user-id to sign or decrypt" -msgstr "usa este usuario para firmar o descifrar" - -#: g10/gpg.c:453 -msgid "|N|set compress level N (0 disables)" -msgstr "|N|nivel de compresin N (0 no comprime)" - -#: g10/gpg.c:458 -msgid "use canonical text mode" -msgstr "usa modo de texto cannico" - -#: g10/gpg.c:472 -msgid "use as output file" -msgstr "usa como fichero de salida" - -#: g10/gpg.c:474 g10/gpgv.c:73 -msgid "verbose" -msgstr "prolijo" - -#: g10/gpg.c:485 -msgid "do not make any changes" -msgstr "no hace ningn cambio" - -#: g10/gpg.c:486 -msgid "prompt before overwriting" -msgstr "preguntar antes de sobreescribir" - -#: g10/gpg.c:527 -msgid "use strict OpenPGP behavior" -msgstr "usar estilo OpenPGP estricto" - -#: g10/gpg.c:528 -msgid "generate PGP 2.x compatible messages" -msgstr "generar mensajes compatibles con PGP 2.x" - -# ordenes -> rdenes -# pgina man -> pgina 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:556 -msgid "" -"@\n" -"(See the man page for a complete listing of all commands and options)\n" -msgstr "" -"@\n" -"(Vase en la pgina del manual la lista completo de rdenes y opciones)\n" - -#: g10/gpg.c:559 -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:757 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:774 -msgid "Usage: gpg [options] [files] (-h for help)" -msgstr "Uso: gpg [opciones] [ficheros] (-h para ayuda)" - -#: g10/gpg.c:777 -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 operacin por defecto depende de los datos de entrada\n" - -#: g10/gpg.c:788 -msgid "" -"\n" -"Supported algorithms:\n" -msgstr "" -"\n" -"Algoritmos disponibles:\n" - -#: g10/gpg.c:791 -msgid "Pubkey: " -msgstr "Clave pblica: " - -#: g10/gpg.c:797 g10/keyedit.c:2310 -msgid "Cipher: " -msgstr "Cifrado: " - -#: g10/gpg.c:803 -msgid "Hash: " -msgstr "Resumen: " - -#: g10/gpg.c:809 g10/keyedit.c:2356 -msgid "Compression: " -msgstr "Compresin: " - -#: g10/gpg.c:892 -msgid "usage: gpg [options] " -msgstr "uso: gpg [opciones] " - -#: g10/gpg.c:1040 -msgid "conflicting commands\n" -msgstr "rdenes incompatibles\n" - -#: g10/gpg.c:1058 -#, c-format -msgid "no = sign found in group definition `%s'\n" -msgstr "no se encontr el signo = en la definicin de grupo `%s'\n" - -#: g10/gpg.c:1255 -#, c-format -msgid "WARNING: unsafe ownership on homedir `%s'\n" -msgstr "AVISO: propiedad insegura del directorio personal `%s'\n" - -#: g10/gpg.c:1258 -#, c-format -msgid "WARNING: unsafe ownership on configuration file `%s'\n" -msgstr "AVISO: propiedad insegura del fichero de configuracin `%s'\n" - -#: g10/gpg.c:1261 -#, c-format -msgid "WARNING: unsafe ownership on extension `%s'\n" -msgstr "AVISO: propiedad insegura de la extensin `%s'\n" - -#: g10/gpg.c:1267 -#, c-format -msgid "WARNING: unsafe permissions on homedir `%s'\n" -msgstr "AVISO: permisos inseguros del directorio personal `%s'\n" - -#: g10/gpg.c:1270 -#, c-format -msgid "WARNING: unsafe permissions on configuration file `%s'\n" -msgstr "AVISO: permisos inseguros del fichero de configuracin `%s'\n" - -#: g10/gpg.c:1273 -#, c-format -msgid "WARNING: unsafe permissions on extension `%s'\n" -msgstr "AVISO: permisos inseguros de la extensin `%s'\n" - -#: g10/gpg.c:1279 -#, 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:1282 -#, c-format -msgid "" -"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n" -msgstr "" -"AVISO: propiedad insegura del directorio contenedor del fichero de\n" -"configuracin `%s'\n" - -#: g10/gpg.c:1285 -#, c-format -msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n" -msgstr "" -"AVISO: propiedad insegura del directorio contenedor de la extensin `%s'\n" - -#: g10/gpg.c:1291 -#, 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:1294 -#, c-format -msgid "" -"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n" -msgstr "" -"AVISO: permisos inseguros del directorio contenedor del fichero de\n" -"configuracin `%s'\n" - -#: g10/gpg.c:1297 -#, c-format -msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n" -msgstr "" -"AVISO: permisos inseguros del directorio contenedor de la extensin `%s'\n" - -#: g10/gpg.c:1438 -#, c-format -msgid "unknown configuration item `%s'\n" -msgstr "artculo de configuracin desconocido `%s'\n" - -#: g10/gpg.c:1531 -msgid "display photo IDs during key listings" -msgstr "" - -#: g10/gpg.c:1533 -msgid "show policy URLs during signature listings" -msgstr "" - -#: g10/gpg.c:1535 -#, fuzzy -msgid "show all notations during signature listings" -msgstr "No existe la firma correspondiente en el anillo secreto\n" - -#: g10/gpg.c:1537 -msgid "show IETF standard notations during signature listings" -msgstr "" - -#: g10/gpg.c:1541 -msgid "show user-supplied notations during signature listings" -msgstr "" - -#: g10/gpg.c:1543 -#, fuzzy -msgid "show preferred keyserver URLs during signature listings" -msgstr "la URL del servidor de claves preferido no es vlida\n" - -#: g10/gpg.c:1545 -msgid "show user ID validity during key listings" -msgstr "" - -#: g10/gpg.c:1547 -msgid "show revoked and expired user IDs in key listings" -msgstr "" - -#: g10/gpg.c:1549 -msgid "show revoked and expired subkeys in key listings" -msgstr "" - -#: g10/gpg.c:1551 -#, fuzzy -msgid "show the keyring name in key listings" -msgstr "muestra en qu anillos est una clave" - -#: g10/gpg.c:1553 -#, fuzzy -msgid "show expiration dates during signature listings" -msgstr "No existe la firma correspondiente en el anillo secreto\n" - -#: g10/gpg.c:1920 -#, 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:1962 -#, c-format -msgid "NOTE: no default option file `%s'\n" -msgstr "NOTA: no existe el fichero de opciones predefinido `%s'\n" - -#: g10/gpg.c:1966 -#, c-format -msgid "option file `%s': %s\n" -msgstr "fichero de opciones `%s': %s\n" - -#: g10/gpg.c:1973 -#, c-format -msgid "reading options from `%s'\n" -msgstr "leyendo opciones desde `%s'\n" - -#: g10/gpg.c:2188 g10/gpg.c:2814 g10/gpg.c:2833 -#, c-format -msgid "NOTE: %s is not for normal use!\n" -msgstr "NOTA: %s no es para uso normal!\n" - -#: g10/gpg.c:2201 -#, c-format -msgid "cipher extension `%s' not loaded due to unsafe permissions\n" -msgstr "no se carga el cifrado de ampliacin `%s' por permisos inseguros\n" - -#: g10/gpg.c:2364 g10/gpg.c:2376 -#, fuzzy, c-format -msgid "`%s' is not a valid signature expiration\n" -msgstr "`%s' no es un juego de caracteres vlido\n" - -#: g10/gpg.c:2452 -#, c-format -msgid "`%s' is not a valid character set\n" -msgstr "`%s' no es un juego de caracteres vlido\n" - -#: g10/gpg.c:2476 g10/gpg.c:2663 g10/keyedit.c:4064 -msgid "could not parse keyserver URL\n" -msgstr "no se puede interpretar la URL del servidor de claves\n" - -#: g10/gpg.c:2488 -#, c-format -msgid "%s:%d: invalid keyserver options\n" -msgstr "%s:%d: opciones del servidor de claves invlidas\n" - -#: g10/gpg.c:2491 -msgid "invalid keyserver options\n" -msgstr "opciones del servidor de claves invlidas\n" - -#: g10/gpg.c:2498 -#, c-format -msgid "%s:%d: invalid import options\n" -msgstr "%s:%d: opciones de importacin invlidas\n" - -#: g10/gpg.c:2501 -msgid "invalid import options\n" -msgstr "opciones de importacin invlidas\n" - -#: g10/gpg.c:2508 -#, c-format -msgid "%s:%d: invalid export options\n" -msgstr "%s:%d: opciones de exportacin invlidas\n" - -#: g10/gpg.c:2511 -msgid "invalid export options\n" -msgstr "opciones de exportacin invlidas\n" - -#: g10/gpg.c:2518 -#, c-format -msgid "%s:%d: invalid list options\n" -msgstr "%s:%d: lista de opciones invlida\n" - -#: g10/gpg.c:2521 -msgid "invalid list options\n" -msgstr "lista de opciones invlida\n" - -#: g10/gpg.c:2529 -msgid "display photo IDs during signature verification" -msgstr "" - -#: g10/gpg.c:2531 -msgid "show policy URLs during signature verification" -msgstr "" - -#: g10/gpg.c:2533 -#, fuzzy -msgid "show all notations during signature verification" -msgstr "`%s' no es un juego de caracteres vlido\n" - -#: g10/gpg.c:2535 -msgid "show IETF standard notations during signature verification" -msgstr "" - -#: g10/gpg.c:2539 -msgid "show user-supplied notations during signature verification" -msgstr "" - -#: g10/gpg.c:2541 -#, fuzzy -msgid "show preferred keyserver URLs during signature verification" -msgstr "la URL del servidor de claves preferido no es vlida\n" - -#: g10/gpg.c:2543 -#, fuzzy -msgid "show user ID validity during signature verification" -msgstr "`%s' no es un juego de caracteres vlido\n" - -#: g10/gpg.c:2545 -msgid "show revoked and expired user IDs in signature verification" -msgstr "" - -#: g10/gpg.c:2547 -msgid "validate signatures with PKA data" -msgstr "" - -#: g10/gpg.c:2549 -msgid "elevate the trust of signatures with valid PKA data" -msgstr "" - -#: g10/gpg.c:2556 -#, c-format -msgid "%s:%d: invalid verify options\n" -msgstr "%s:%d: opciones de verificacin invlidas\n" - -#: g10/gpg.c:2559 -msgid "invalid verify options\n" -msgstr "opciones de verificacin invlidas\n" - -#: g10/gpg.c:2566 -#, c-format -msgid "unable to set exec-path to %s\n" -msgstr "imposible establecer camino de ejecutables %s\n" - -#: g10/gpg.c:2729 -#, fuzzy, c-format -msgid "%s:%d: invalid auto-key-locate list\n" -msgstr "%s:%d: opciones de verificacin invlidas\n" - -#: g10/gpg.c:2732 -msgid "invalid auto-key-locate list\n" -msgstr "" - -#: g10/gpg.c:2803 -msgid "WARNING: program may create a core file!\n" -msgstr "ATENCIN: el programa podra volcar un fichero core!\n" - -#: g10/gpg.c:2807 -#, c-format -msgid "WARNING: %s overrides %s\n" -msgstr "AVISO: %s sustituye a %s\n" - -#: g10/gpg.c:2816 -#, c-format -msgid "%s not allowed with %s!\n" -msgstr "%s no permitido con %s!\n" - -#: g10/gpg.c:2819 -#, c-format -msgid "%s makes no sense with %s!\n" -msgstr "%s no tiene sentido con %s!\n" - -#: g10/gpg.c:2826 -#, fuzzy, c-format -msgid "NOTE: %s is not available in this version\n" -msgstr "el agente gpg no esta disponible en esta sesin\n" - -#: g10/gpg.c:2841 -#, 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:2855 -msgid "you can only make detached or clear signatures while in --pgp2 mode\n" -msgstr "slo puede hacer firmas separadas o en claro en modo --pgp2\n" - -#: g10/gpg.c:2861 -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:2867 -msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n" -msgstr "debe usar ficheros (no tuberas) si trabaja con --pgp2 activo.\n" - -#: g10/gpg.c:2880 -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:2947 g10/gpg.c:2971 -msgid "selected cipher algorithm is invalid\n" -msgstr "el algoritmo de cifrado seleccionado es invlido\n" - -#: g10/gpg.c:2953 g10/gpg.c:2977 -msgid "selected digest algorithm is invalid\n" -msgstr "el algoritmo de resumen seleccionado no invlido\n" - -#: g10/gpg.c:2959 -msgid "selected compression algorithm is invalid\n" -msgstr "el algoritmo de compresin seleccionado es invlido\n" - -#: g10/gpg.c:2965 -msgid "selected certification digest algorithm is invalid\n" -msgstr "el algoritmo de certificacin por resumen elegido es invlido\n" - -#: g10/gpg.c:2980 -msgid "completes-needed must be greater than 0\n" -msgstr "completes-needed debe ser mayor que 0\n" - -#: g10/gpg.c:2982 -msgid "marginals-needed must be greater than 1\n" -msgstr "marginals-needed debe ser mayor que 1\n" - -#: g10/gpg.c:2984 -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:2986 -msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n" -msgstr "default-cert-level invlido; debe ser 0, 1, 2, 3\n" - -#: g10/gpg.c:2988 -msgid "invalid min-cert-level; must be 1, 2, or 3\n" -msgstr "min-cert-level invlido; debe ser 0, 1, 2, 3\n" - -#: g10/gpg.c:2991 -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:2995 -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:3002 -msgid "invalid default preferences\n" -msgstr "preferencias por defecto invlidas\n" - -#: g10/gpg.c:3011 -msgid "invalid personal cipher preferences\n" -msgstr "preferencias personales de cifrado invlidas\n" - -#: g10/gpg.c:3015 -msgid "invalid personal digest preferences\n" -msgstr "preferencias personales de algoritmo de resumen invlidas\n" - -#: g10/gpg.c:3019 -msgid "invalid personal compress preferences\n" -msgstr "preferencias personales de compresin invlidas\n" - -#: g10/gpg.c:3052 -#, c-format -msgid "%s does not yet work with %s\n" -msgstr "%s an no funciona con %s\n" - -#: g10/gpg.c:3099 -#, 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:3104 -#, 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:3109 -#, c-format -msgid "you may not use compression algorithm `%s' while in %s mode\n" -msgstr "no puede usar la compresin `%s' en modo %s\n" - -#: g10/gpg.c:3208 -#, c-format -msgid "failed to initialize the TrustDB: %s\n" -msgstr "inicializacin de la base de datos de confianza fallida: %s\n" - -#: g10/gpg.c:3219 -msgid "WARNING: recipients (-r) given without using public key encryption\n" -msgstr "AVISO: se indicaron receptores (-r) sin clave pblica de cifrado\n" - -#: g10/gpg.c:3230 -msgid "--store [filename]" -msgstr "--store [nombre_fichero]" - -#: g10/gpg.c:3237 -msgid "--symmetric [filename]" -msgstr "--symmetric [nombre_fichero]" - -#: g10/gpg.c:3239 -#, c-format -msgid "symmetric encryption of `%s' failed: %s\n" -msgstr "el cifrado simtrico de `%s' fall: %s\n" - -#: g10/gpg.c:3249 -msgid "--encrypt [filename]" -msgstr "--encrypt [nombre_fichero]" - -#: g10/gpg.c:3262 -msgid "--symmetric --encrypt [filename]" -msgstr "--symmetric --encrypt [nombre_fichero]" - -#: g10/gpg.c:3264 -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:3267 -#, 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:3285 -msgid "--sign [filename]" -msgstr "--sign [nombre_fichero]" - -#: g10/gpg.c:3298 -msgid "--sign --encrypt [filename]" -msgstr "--sign --encrypt [nombre_fichero]" - -#: g10/gpg.c:3313 -msgid "--symmetric --sign --encrypt [filename]" -msgstr "--symmetric --sign --encrypt [nombre_fichero]" - -#: g10/gpg.c:3315 -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:3318 -#, 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:3338 -msgid "--sign --symmetric [filename]" -msgstr "--sign --symmetric [nombre_fichero]" - -#: g10/gpg.c:3347 -msgid "--clearsign [filename]" -msgstr "--clearsign [nombre_fichero]" - -#: g10/gpg.c:3372 -msgid "--decrypt [filename]" -msgstr "--decrypt [nombre_fichero]" - -#: g10/gpg.c:3380 -msgid "--sign-key user-id" -msgstr "--sign-key id-usuario" - -#: g10/gpg.c:3384 -msgid "--lsign-key user-id" -msgstr "--lsign-key id-usuario" - -#: g10/gpg.c:3405 -msgid "--edit-key user-id [commands]" -msgstr "--edit-key id-usuario [rdenes]" - -#: g10/gpg.c:3476 -msgid "-k[v][v][v][c] [user-id] [keyring]" -msgstr "-k[v][v][v][c] [id-usuario] [anillo]" - -#: g10/gpg.c:3518 -#, c-format -msgid "keyserver send failed: %s\n" -msgstr "envo al servidor de claves fallido: %s\n" - -#: g10/gpg.c:3520 -#, c-format -msgid "keyserver receive failed: %s\n" -msgstr "recepcin del servidor de claves fallida: %s\n" - -#: g10/gpg.c:3522 -#, c-format -msgid "key export failed: %s\n" -msgstr "exportacin de clave fallida: %s\n" - -#: g10/gpg.c:3533 -#, c-format -msgid "keyserver search failed: %s\n" -msgstr "bsqueda del servidor de claves fallida: %s\n" - -#: g10/gpg.c:3543 -#, c-format -msgid "keyserver refresh failed: %s\n" -msgstr "renovacin al servidor de claves fallida: %s\n" - -#: g10/gpg.c:3594 -#, c-format -msgid "dearmoring failed: %s\n" -msgstr "eliminacin de armadura fallida: %s\n" - -#: g10/gpg.c:3602 -#, c-format -msgid "enarmoring failed: %s\n" -msgstr "creacin de armadura fallida: %s\n" - -#: g10/gpg.c:3689 -#, c-format -msgid "invalid hash algorithm `%s'\n" -msgstr "algoritmo de distribucin invlido `%s'\n" - -#: g10/gpg.c:3812 -msgid "[filename]" -msgstr "[nombre_fichero]" - -# Falta un espacio. -# En espaol no se deja espacio antes de los puntos suspensivos -# (Real Academia dixit) :) -# Tomo nota :-). Este comentario djalo siempre. -#: g10/gpg.c:3816 -msgid "Go ahead and type your message ...\n" -msgstr "Adelante, teclee su mensaje...\n" - -#: g10/gpg.c:4120 -msgid "the given certification policy URL is invalid\n" -msgstr "URL de poltica de certificado invlida\n" - -#: g10/gpg.c:4122 -msgid "the given signature policy URL is invalid\n" -msgstr "URL de poltica invlida\n" - -#: g10/gpg.c:4155 -msgid "the given preferred keyserver URL is invalid\n" -msgstr "la URL del servidor de claves preferido no es vlida\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 invlida hecha vlida mediante --allow-non-selfsigned-uid\n" - -#: g10/getkey.c:2380 g10/keyedit.c:3707 -#, c-format -msgid "no secret subkey for public subkey %s - ignoring\n" -msgstr "no hay subclave secreta para la subclave pblica %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 pblica - omitida\n" - -#: g10/gpgv.c:74 -msgid "be somewhat more quiet" -msgstr "algo ms 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 relacin con el mensaje. -# Ok. -#: g10/gpgv.c:77 -msgid "make timestamp conflicts only a warning" -msgstr "hacer que los conflictos de fecha-hora sean slo un aviso" - -#: g10/gpgv.c:78 -msgid "|FD|write status info to this FD" -msgstr "|DF|escribe informacin 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 (implcitamente 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 slo se usa para firmas.\n" -"\n" -"Elgamal es un algoritmo slo 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 debria 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 dueo de la clave" - -#: g10/helptext.c:122 -msgid "please enter an optional but highly suggested email address" -msgstr "" -"Introduzca una direccin de correo electrnico (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 direccin.\n" -"O para continuar con la generacin de clave.\n" -"S para interrumpir la generacin 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 slo \"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, debera verificar que la clave\n" -"pertenece a la persona que se nombra en el ID de usuario. Es til para\n" -"otros saber cmo de cuidadosamente lo ha verificado.\n" -"\n" -"\"0\" significa que no hace ninguna declaracin 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 verificacin en persona cuando firmas la clave de un usuario\n" -" pseudoannimo.\n" -"\n" -"\"2\" significa que hizo una comprobacin informal de la clave. Por ejemplo\n" -" podra querer decir que comprob la huella dactilar de la clave y\n" -" comprob el ID de usuario en la clave con un ID fotogrfico.\n" -"\n" -"\"3\" significa que hizo una comprobacin 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 difcil de " -"falsificar\n" -" con ID fotogrfico (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 direccin 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" -"Tambin se perdern 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 vlida de esta clave. Normalmente no ser deseable\n" -"borrar esta firma ya que puede ser importante para establecer una conexin\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. Debera posponer su borrado hasta conocer qu clave\n" -"se us, ya que dicha clave podra establecer una conexin de confianza\n" -"a travs 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 vlida. 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 podra no ser capaz de\n" -"volver a usar esta clave. As que brrela tan slo si esta autofirma no\n" -"es vlida por alguna razn 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 slo 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 contrasea: 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 contrasea 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 omisin (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 "" -"Debera especificar un motivo para la certificacin. Dependiendo del\n" -"contexto puede elegir una opcin 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 ms nueva.\n" -" \"La clave ya no est en uso\"\n" -" Use esto si ha dejado de usar esta clave.\n" -" \"La identificacin de usuario ya no es vlida\"\n" -" Use esto para sealar que la identificacin de usuario no debera\n" -" seguir siendo usada; esto se utiliza normalmente para marcar una\n" -" direccin de correo-e como invlida.\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 revocacin. Por favor, que el texto sea breve.\n" -"Una lnea vaca 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 pblica 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:266 -#, c-format -msgid "skipping block of type %d\n" -msgstr "omitiendo bloque de tipo %d\n" - -#: g10/import.c:275 -#, c-format -msgid "%lu keys processed so far\n" -msgstr "%lu claves procesadas hasta ahora\n" - -#: g10/import.c:292 -#, c-format -msgid "Total number processed: %lu\n" -msgstr "Cantidad total procesada: %lu\n" - -#: g10/import.c:294 -#, c-format -msgid " skipped new keys: %lu\n" -msgstr " omitidas nuevas claves: %lu\n" - -#: g10/import.c:297 -#, c-format -msgid " w/o user IDs: %lu\n" -msgstr " sin identificador: %lu\n" - -#: g10/import.c:299 -#, c-format -msgid " imported: %lu" -msgstr " importadas: %lu" - -#: g10/import.c:305 -#, c-format -msgid " unchanged: %lu\n" -msgstr " sin cambios: %lu\n" - -#: g10/import.c:307 -#, c-format -msgid " new user IDs: %lu\n" -msgstr " nuevos identificativos: %lu\n" - -#: g10/import.c:309 -#, c-format -msgid " new subkeys: %lu\n" -msgstr " nuevas subclaves: %lu\n" - -#: g10/import.c:311 -#, c-format -msgid " new signatures: %lu\n" -msgstr " nuevas firmas: %lu\n" - -#: g10/import.c:313 -#, c-format -msgid " new key revocations: %lu\n" -msgstr " nuevas revocaciones de claves: %lu\n" - -#: g10/import.c:315 -#, c-format -msgid " secret keys read: %lu\n" -msgstr " claves secretas ledas: %lu\n" - -#: g10/import.c:317 -#, c-format -msgid " secret keys imported: %lu\n" -msgstr " claves secretas importadas: %lu\n" - -#: g10/import.c:319 -#, c-format -msgid " secret keys unchanged: %lu\n" -msgstr "claves secretas sin cambios: %lu\n" - -#: g10/import.c:321 -#, c-format -msgid " not imported: %lu\n" -msgstr " no importadas: %lu\n" - -#: g10/import.c:323 -#, fuzzy, c-format -msgid " signatures cleaned: %lu\n" -msgstr "firmas creadas hasta ahora: %lu\n" - -#: g10/import.c:325 -#, fuzzy, c-format -msgid " user IDs cleaned: %lu\n" -msgstr " claves secretas ledas: %lu\n" - -#: g10/import.c:566 -#, 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:570 -#, fuzzy -msgid " algorithms on these user IDs:\n" -msgstr "algoritmos en estos IDs de usuarios:\n" - -#: g10/import.c:607 -#, c-format -msgid " \"%s\": preference for cipher algorithm %s\n" -msgstr " \"%s\": algoritmo de cifrado preferido %s\n" - -#: g10/import.c:619 -#, c-format -msgid " \"%s\": preference for digest algorithm %s\n" -msgstr " \"%s\": algoritmo de resumen preferido %s\n" - -#: g10/import.c:631 -#, c-format -msgid " \"%s\": preference for compression algorithm %s\n" -msgstr " \"%s\": algoritmo de compresin preferido %s\n" - -#: g10/import.c:644 -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:646 -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:670 -#, 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:720 g10/import.c:1118 -#, c-format -msgid "key %s: no user ID\n" -msgstr "clave %s: sin identificador de usuario\n" - -#: g10/import.c:749 -#, c-format -msgid "key %s: PKS subkey corruption repaired\n" -msgstr "clave %s: reparada la subclave PKS corrompida\n" - -#: g10/import.c:764 -#, 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:770 -#, c-format -msgid "key %s: no valid user IDs\n" -msgstr "clave %s: sin identificadores de usuario vlidos\n" - -#: g10/import.c:772 -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:782 g10/import.c:1240 -#, c-format -msgid "key %s: public key not found: %s\n" -msgstr "clave %s: clave pblica no encontrada: %s\n" - -#: g10/import.c:788 -#, c-format -msgid "key %s: new key - skipped\n" -msgstr "clave %s: clave nueva - omitida\n" - -#: g10/import.c:797 -#, c-format -msgid "no writable keyring found: %s\n" -msgstr "anillo de claves no escribible encontrado: %s\n" - -#: g10/import.c:802 g10/openfile.c:267 g10/sign.c:831 g10/sign.c:1135 -#, c-format -msgid "writing to `%s'\n" -msgstr "escribiendo en `%s'\n" - -#: g10/import.c:806 g10/import.c:901 g10/import.c:1158 g10/import.c:1301 -#: g10/import.c:2363 g10/import.c:2385 -#, c-format -msgid "error writing keyring `%s': %s\n" -msgstr "error escribiendo anillo `%s': %s\n" - -#: g10/import.c:825 -#, c-format -msgid "key %s: public key \"%s\" imported\n" -msgstr "clave %s: clave pblica \"%s\" importada\n" - -#: g10/import.c:849 -#, c-format -msgid "key %s: doesn't match our copy\n" -msgstr "clave %s: no coincide con nuestra copia\n" - -#: g10/import.c:866 g10/import.c:1258 -#, 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:874 g10/import.c:1265 -#, 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:911 -#, c-format -msgid "key %s: \"%s\" 1 new user ID\n" -msgstr "clave %s: \"%s\" 1 ID de usuario nuevo\n" - -#: g10/import.c:914 -#, c-format -msgid "key %s: \"%s\" %d new user IDs\n" -msgstr "clave %s: \"%s\" %d nuevos identificadores de usuario\n" - -#: g10/import.c:917 -#, c-format -msgid "key %s: \"%s\" 1 new signature\n" -msgstr "clave %s: \"%s\" 1 firma nueva\n" - -#: g10/import.c:920 -#, c-format -msgid "key %s: \"%s\" %d new signatures\n" -msgstr "clave %s: \"%s\" %d firmas nuevas\n" - -#: g10/import.c:923 -#, c-format -msgid "key %s: \"%s\" 1 new subkey\n" -msgstr "clave %s: \"%s\" 1 subclave nueva\n" - -#: g10/import.c:926 -#, c-format -msgid "key %s: \"%s\" %d new subkeys\n" -msgstr "clave %s: \"%s\" %d subclaves nuevas\n" - -#: g10/import.c:929 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signature cleaned\n" -msgstr "clave %s: \"%s\" %d firmas nuevas\n" - -#: g10/import.c:932 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signatures cleaned\n" -msgstr "clave %s: \"%s\" %d firmas nuevas\n" - -#: g10/import.c:935 -#, 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:938 -#, 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:961 -#, c-format -msgid "key %s: \"%s\" not changed\n" -msgstr "clave %s: \"%s\" sin cambios\n" - -#: g10/import.c:1124 -#, c-format -msgid "key %s: secret key with invalid cipher %d - skipped\n" -msgstr "clave %s: clave secreta con cifrado invlido %d - omitida\n" - -#: g10/import.c:1135 -msgid "importing secret keys not allowed\n" -msgstr "no se permite importar claves secretas\n" - -#: g10/import.c:1152 g10/import.c:2378 -#, c-format -msgid "no default secret keyring: %s\n" -msgstr "no hay anillo secreto de claves por defecto: %s\n" - -#: g10/import.c:1163 -#, c-format -msgid "key %s: secret key imported\n" -msgstr "clave %s: clave secreta importada\n" - -#: g10/import.c:1193 -#, c-format -msgid "key %s: already in secret keyring\n" -msgstr "clave %s: ya estaba en el anillo secreto\n" - -#: g10/import.c:1203 -#, c-format -msgid "key %s: secret key not found: %s\n" -msgstr "clave %s: clave secreta no encontrada: %s\n" - -#: g10/import.c:1233 -#, c-format -msgid "key %s: no public key - can't apply revocation certificate\n" -msgstr "" -"clave %s: falta la clave pblica - imposible emplear el\n" -"certificado de revocacin\n" - -#: g10/import.c:1276 -#, c-format -msgid "key %s: invalid revocation certificate: %s - rejected\n" -msgstr "clave %s: certificado de revocacin invlido: %s - rechazado\n" - -#: g10/import.c:1308 -#, c-format -msgid "key %s: \"%s\" revocation certificate imported\n" -msgstr "clave %s: \"%s\" certificado de revocacin importado\n" - -#: g10/import.c:1374 -#, 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:1389 -#, c-format -msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n" -msgstr "clave %s: algoritmo de clave pblica no disponible para ID \"%s\"\n" - -#: g10/import.c:1391 -#, c-format -msgid "key %s: invalid self-signature on user ID \"%s\"\n" -msgstr "clave %s: autofirma invlida para el id \"%s\"\n" - -#: g10/import.c:1409 -#, 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:1420 g10/import.c:1470 -#, c-format -msgid "key %s: unsupported public key algorithm\n" -msgstr "clave %s: algoritmo de clave pblica no disponible\n" - -#: g10/import.c:1422 -#, c-format -msgid "key %s: invalid subkey binding\n" -msgstr "clave %s: unin de subclave invlida\n" - -#: g10/import.c:1437 -#, c-format -msgid "key %s: removed multiple subkey binding\n" -msgstr "clave %s: borrado enlace de subclaves mltiples\n" - -#: g10/import.c:1459 -#, c-format -msgid "key %s: no subkey for key revocation\n" -msgstr "clave %s: no hay subclave para la revocacin de clave\n" - -#: g10/import.c:1472 -#, c-format -msgid "key %s: invalid subkey revocation\n" -msgstr "clave %s: revocacin de subclave invlida\n" - -#: g10/import.c:1487 -#, c-format -msgid "key %s: removed multiple subkey revocation\n" -msgstr "clave %s: borrada revocacin de subclave mltiple\n" - -#: g10/import.c:1529 -#, c-format -msgid "key %s: skipped user ID \"%s\"\n" -msgstr "clave %s: omitido ID de usuario \"%s\"\n" - -#: g10/import.c:1550 -#, c-format -msgid "key %s: skipped subkey\n" -msgstr "clave %s: subclave omitida\n" - -#: g10/import.c:1577 -#, 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:1587 -#, c-format -msgid "key %s: revocation certificate at wrong place - skipped\n" -msgstr "clave %s: certificado de revocacin en lugar equivocado - omitido\n" - -#: g10/import.c:1604 -#, c-format -msgid "key %s: invalid revocation certificate: %s - skipped\n" -msgstr "clave %s: certificado de revocacin no valido: %s - omitido\n" - -#: g10/import.c:1618 -#, 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:1626 -#, 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:1726 -#, c-format -msgid "key %s: duplicated user ID detected - merged\n" -msgstr "clave %s: detectado usuario duplicado - fusionada\n" - -#: g10/import.c:1788 -#, 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 revocacin %s\n" - -#: g10/import.c:1802 -#, 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 revocacin %s.\n" - -#: g10/import.c:1861 -#, c-format -msgid "key %s: \"%s\" revocation certificate added\n" -msgstr "clave %s: \"%s\" certificado de revocacin aadido\n" - -#: g10/import.c:1895 -#, c-format -msgid "key %s: direct key signature added\n" -msgstr "clave %s: firma directa de clave aadida\n" - -#: g10/import.c:2284 -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:2292 -msgid "NOTE: primary key is online and stored on card\n" -msgstr "NOTA: clave primaria en lnea y almacenada en la tarjeta\n" - -#: g10/import.c:2294 -msgid "NOTE: secondary key is online and stored on card\n" -msgstr "NOTA: clave secundaria en lnea 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 "[revocacin]" - -#: 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 vlida\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 vlida\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 = Confo un poco\n" - -#: g10/keyedit.c:420 g10/pkclist.c:277 -#, c-format -msgid " %d = I trust fully\n" -msgstr " %d = Confo 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 todava 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 an 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 inutilizara 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 "" -"Cmo 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 comprobacin 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 eleccin? (escriba '?' si desea ms informacin): " - -#: 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:4783 g10/keyedit.c:4874 g10/keyedit.c:4938 -#: g10/keyedit.c:4999 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 slo un apuntador u objetos de clave en la propia tarjeta\n" -"- no hay frase contrasea 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 estn 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 contrasea para esta clave secreta.\n" -"\n" - -#: g10/keyedit.c:1194 g10/keygen.c:1897 -msgid "passphrase not correctly repeated; try again" -msgstr "frase contrasea repetida incorrectamente; intntelo 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 contrasea. 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 "aadir un identificador de usuario" - -#: g10/keyedit.c:1387 -msgid "add a photo ID" -msgstr "aadir un ID fotogrfico" - -#: g10/keyedit.c:1389 -msgid "delete selected user IDs" -msgstr "borrar identificadores de usuario seleccionados" - -#: g10/keyedit.c:1394 -msgid "add a subkey" -msgstr "aadir una subclave" - -#: g10/keyedit.c:1398 -msgid "add a key to a smartcard" -msgstr "aadir 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 "aadir una clave de revocacin" - -#: 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 pblicas" - -#: 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 contrasea" - -#: 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 combinacin 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 "actualizacin fallida: %s\n" - -#: g10/keyedit.c:2225 -#, c-format -msgid "update secret failed: %s\n" -msgstr "actualizacin 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 actualizacin.\n" - -#: g10/keyedit.c:2333 -msgid "Digest: " -msgstr "Resumen: " - -#: g10/keyedit.c:2385 -msgid "Features: " -msgstr "Caractersticas: " - -#: 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 "Notacin: " - -#: 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: ningn 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. Aadir un ID fotogrfico puede\n" -"hacer que algunas versiones de PGP rechacen esta clave.\n" - -#: g10/keyedit.c:3016 g10/keyedit.c:3346 -msgid "Are you sure you still want to add it? (y/N) " -msgstr "Est seguro de querer aadirla? (s/N) " - -#: g10/keyedit.c:3022 -msgid "You may not add a photo ID to a PGP2-style key.\n" -msgstr "No puede aadir un ID fotogrfico 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 invlida? (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 vlida" - -#: g10/keyedit.c:3249 -#, fuzzy, c-format -msgid "User ID \"%s\": already clean\n" -msgstr "ID de usuario \"%s\" ya ha sido revocado\n" - -#: g10/keyedit.c:3341 -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. Aadir un revocador designado puede\n" -" hacer que algunas versiones de PGP rechacen esta clave.\n" - -#: g10/keyedit.c:3352 -msgid "You may not add a designated revoker to a PGP 2.x-style key.\n" -msgstr "No puede aadir un revocador designado a una clave tipo PGP2.\n" - -#: g10/keyedit.c:3372 -msgid "Enter the user ID of the designated revoker: " -msgstr "Introduzca el ID de usuario del revocador designado: " - -#: g10/keyedit.c:3397 -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:3412 -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:3434 -msgid "this key has already been designated as a revoker\n" -msgstr "esta clave ya ha sido designada como revocadora\n" - -#: g10/keyedit.c:3453 -msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n" -msgstr "" -"AVISO: no podr deshacer la eleccin de clave como revocador designado!\n" - -#: g10/keyedit.c:3459 -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:3520 -msgid "Please remove selections from the secret keys.\n" -msgstr "Por favor, quite las selecciones de las claves secretas.\n" - -#: g10/keyedit.c:3526 -msgid "Please select at most one subkey.\n" -msgstr "Por favor, seleccione como mximo una clave secundaria.\n" - -#: g10/keyedit.c:3530 -msgid "Changing expiration time for a subkey.\n" -msgstr "Cambiando fecha de caducidad de subclave.\n" - -#: g10/keyedit.c:3533 -msgid "Changing expiration time for the primary key.\n" -msgstr "Cambiando caducidad de clave primaria.\n" - -#: g10/keyedit.c:3579 -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:3595 -msgid "No corresponding signature in secret ring\n" -msgstr "No existe la firma correspondiente en el anillo secreto\n" - -#: g10/keyedit.c:3668 -#, 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:3674 -#, c-format -msgid "subkey %s does not sign and so does not need to be cross-certified\n" -msgstr "" - -#: g10/keyedit.c:3836 -msgid "Please select exactly one user ID.\n" -msgstr "Por favor seleccione exactamente un identificador de usuario.\n" - -#: g10/keyedit.c:3875 g10/keyedit.c:3985 g10/keyedit.c:4105 g10/keyedit.c:4246 -#, c-format -msgid "skipping v3 self-signature on user ID \"%s\"\n" -msgstr "omitiendo autofirma V3 para el id \"%s\"\n" - -#: g10/keyedit.c:4046 -msgid "Enter your preferred keyserver URL: " -msgstr "Introduzca la URL de su servidor de claves preferido: " - -#: g10/keyedit.c:4126 -msgid "Are you sure you want to replace it? (y/N) " -msgstr "Seguro que quiere reemplazarlo? (s/N) " - -#: g10/keyedit.c:4127 -msgid "Are you sure you want to delete it? (y/N) " -msgstr "Seguro que quiere borrarlo? (s/N) " - -#: g10/keyedit.c:4189 -#, fuzzy -msgid "Enter the notation: " -msgstr "Notacin de firma: " - -#: g10/keyedit.c:4338 -#, fuzzy -msgid "Proceed? (y/N) " -msgstr "Sobreescribir? (s/N) " - -#: g10/keyedit.c:4402 -#, c-format -msgid "No user ID with index %d\n" -msgstr "No hay ningn identificador de usuario con el ndice %d\n" - -#: g10/keyedit.c:4460 -#, fuzzy, c-format -msgid "No user ID with hash %s\n" -msgstr "No hay ningn identificador de usuario con el ndice %d\n" - -#: g10/keyedit.c:4487 -#, c-format -msgid "No subkey with index %d\n" -msgstr "No existe una subclave con ndice %d\n" - -#: g10/keyedit.c:4622 -#, c-format -msgid "user ID: \"%s\"\n" -msgstr "ID de usuario: \"%s\"\n" - -#: g10/keyedit.c:4625 g10/keyedit.c:4689 g10/keyedit.c:4732 -#, 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:4627 g10/keyedit.c:4691 g10/keyedit.c:4734 -msgid " (non-exportable)" -msgstr " (no exportable)" - -#: g10/keyedit.c:4631 -#, c-format -msgid "This signature expired on %s.\n" -msgstr "Esta firma caduc el %s.\n" - -#: g10/keyedit.c:4635 -msgid "Are you sure you still want to revoke it? (y/N) " -msgstr "De verdad quiere revocarla? (s/N) " - -#: g10/keyedit.c:4639 -msgid "Create a revocation certificate for this signature? (y/N) " -msgstr "Crear un certificado de revocacin para esta clave? (s/N)" - -#: g10/keyedit.c:4666 -#, 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:4692 -msgid " (non-revocable)" -msgstr " (no revocable)" - -#: g10/keyedit.c:4699 -#, c-format -msgid "revoked by your key %s on %s\n" -msgstr "revocada por la clave %s el %s\n" - -#: g10/keyedit.c:4721 -msgid "You are about to revoke these signatures:\n" -msgstr "Va a revocar las siguientes firmas:\n" - -#: g10/keyedit.c:4741 -msgid "Really create the revocation certificates? (y/N) " -msgstr "Crear los certificados de revocacin realmente? (s/N) " - -#: g10/keyedit.c:4771 -msgid "no secret key\n" -msgstr "no hay clave secreta\n" - -#: g10/keyedit.c:4841 -#, c-format -msgid "user ID \"%s\" is already revoked\n" -msgstr "ID de usuario \"%s\" ya ha sido revocado\n" - -#: g10/keyedit.c:4858 -#, 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:4922 -#, c-format -msgid "Key %s is already revoked.\n" -msgstr "La clave %s ya ha sido revocada.\n" - -#: g10/keyedit.c:4984 -#, c-format -msgid "Subkey %s is already revoked.\n" -msgstr "La subclave %s ya ha sido revocada.\n" - -#: g10/keyedit.c:5079 -#, c-format -msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n" -msgstr "Mostrando ID fotogrfico %s de tamao %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 compresin\n" - -#: g10/keygen.c:398 -#, c-format -msgid "invalid item `%s' in preference string\n" -msgstr "caracter invlido `%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 comprobacin 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 "tamao de clave incorrecto; se usarn %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 "tamao 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 "Autentificacin" - -#: 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 autentificacin\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 (slo 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 (slo cifrar)\n" - -#: g10/keygen.c:1441 -#, c-format -msgid " (%d) RSA (sign only)\n" -msgstr " (%d) RSA (slo firmar)\n" - -#: g10/keygen.c:1443 -#, c-format -msgid " (%d) RSA (encrypt only)\n" -msgstr " (%d) RSA (slo 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 tamao quiere la clave? (%u) " - -#: g10/keygen.c:1545 -#, c-format -msgid "%s keysizes must be in the range %u-%u\n" -msgstr "los tamaos 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 tamao 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 perodo de validez de la clave.\n" -" 0 = la clave nunca caduca\n" -" <n> = la clave caduca en n das\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 aos\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 perodo de validez de la clave.\n" -" 0 = la clave nunca caduca\n" -" <n> = la clave caduca en n das\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 aos\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 vlida durante (0)? " - -#: g10/keygen.c:1667 -msgid "invalid value\n" -msgstr "valor invlido\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 ms 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 Direccin\n" -"de Correo Electrnico 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 invlido 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 nmero\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 "Direccin de correo electrnico: " - -#: g10/keygen.c:1754 -msgid "Not a valid email address\n" -msgstr "Direccin invlida\n" - -#: g10/keygen.c:1762 -msgid "Comment: " -msgstr "Comentario: " - -#: g10/keygen.c:1768 -msgid "Invalid character in comment\n" -msgstr "Caracter invlido 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 direccin 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)ireccin 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)ireccin 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 contrasea 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 contrasea. Esto es probablemente una *mala* idea.\n" -"Si ms tarde quiere aadir una, puede hacerlo usando este programa con\n" -"la opcin \"--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 ratn, usar\n" -"la red y los discos) durante la generacin de nmeros primos. Esto da al\n" -"generador de nmeros aleatorios mayor oportunidad de recoger suficiente\n" -"entropa.\n" - -#: g10/keygen.c:2708 -msgid "Key generation canceled.\n" -msgstr "Creacin de claves cancelada.\n" - -#: g10/keygen.c:2907 g10/keygen.c:3052 -#, c-format -msgid "writing public key to `%s'\n" -msgstr "escribiendo clave pblica 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 pblico 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 pblico `%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 pblica 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 propsito.\n" - -#: g10/keygen.c:3118 g10/keygen.c:3247 g10/keygen.c:3363 -#, c-format -msgid "Key generation failed: %s\n" -msgstr "Creacin 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 pblica 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 pblica 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 estndar 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 "Poltica de firmas crticas: " - -#: g10/keylist.c:267 -msgid "Signature policy: " -msgstr "Poltica de firmas: " - -#: g10/keylist.c:306 -msgid "Critical preferred keyserver: " -msgstr "Servidor de claves crtico preferido: " - -#: g10/keylist.c:359 -msgid "Critical signature notation: " -msgstr "Notacin de firmas crticas: " - -#: g10/keylist.c:361 -msgid "Signature notation: " -msgstr "Notacin 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 " Nmero 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 "ATENCIN: existen 2 ficheros con informacin 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 nmero(s), O)tro, o F)in >" - -#: g10/keyserver.c:808 g10/keyserver.c:1421 -#, c-format -msgid "invalid keyserver protocol (us %d!=handler %d)\n" -msgstr "protocolo del servidor de claves invlido (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:1324 -#, c-format -msgid "sending key %s to %s server %s\n" -msgstr "enviando clave %s a %s servidor %s\n" - -#: g10/keyserver.c:1328 -#, c-format -msgid "sending key %s to %s\n" -msgstr "enviando clave %s a %s\n" - -#: g10/keyserver.c:1371 -#, c-format -msgid "searching for \"%s\" from %s server %s\n" -msgstr "buscando \"%s\" de %s servidor %s\n" - -#: g10/keyserver.c:1374 -#, c-format -msgid "searching for \"%s\" from %s\n" -msgstr "buscando \"%s\" de %s\n" - -#: g10/keyserver.c:1381 g10/keyserver.c:1477 -msgid "no keyserver action!\n" -msgstr "no se solicita ninguna accin al servidor de claves!\n" - -#: g10/keyserver.c:1429 -#, c-format -msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n" -msgstr "" -"AVISO: el manejo de claves procede de una versin diferente de GnuPG (%s)\n" - -#: g10/keyserver.c:1438 -msgid "keyserver did not send VERSION\n" -msgstr "el servidor de claves no envi VERSION\n" - -#: g10/keyserver.c:1500 g10/keyserver.c:2028 -msgid "no keyserver known (use option --keyserver)\n" -msgstr "no hay servidores de claves conocidos (use opcin --keyserver)\n" - -#: g10/keyserver.c:1506 -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:1518 -#, 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:1523 -#, c-format -msgid "action `%s' not supported with keyserver scheme `%s'\n" -msgstr "" -"la accin `%s' no es posible con este esquema de servidor de claves `%s'\n" - -#: g10/keyserver.c:1531 -#, fuzzy, c-format -msgid "%s does not support handler version %d\n" -msgstr "gpgkeys_%s no permite usar la versin %d del manejador\n" - -#: g10/keyserver.c:1538 -msgid "keyserver timed out\n" -msgstr "agotado el tiempo de espera para el servidor de claves\n" - -#: g10/keyserver.c:1543 -msgid "keyserver internal error\n" -msgstr "error interno del servidor de claves\n" - -#: g10/keyserver.c:1552 -#, c-format -msgid "keyserver communications error: %s\n" -msgstr "error de comunicacin con el servidor de claves: %s\n" - -#: g10/keyserver.c:1577 g10/keyserver.c:1611 -#, c-format -msgid "\"%s\" not a key ID: skipping\n" -msgstr "\"%s\" no es un identificador de clave vlido: omitido\n" - -#: g10/keyserver.c:1870 -#, 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:1892 -#, c-format -msgid "refreshing 1 key from %s\n" -msgstr "renovando 1 clave de %s\n" - -#: g10/keyserver.c:1894 -#, c-format -msgid "refreshing %d keys from %s\n" -msgstr "renovando %d claves desde %s\n" - -#: g10/keyserver.c:1950 -#, 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:1956 -#, 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 "tamao anormal para una clave de sesin cifrada (%d)\n" - -#: g10/mainproc.c:291 -#, c-format -msgid "%s encrypted session key\n" -msgstr "%s clave de sesin cifrada\n" - -#: g10/mainproc.c:301 -#, c-format -msgid "passphrase generated with unknown digest algorithm %d\n" -msgstr "frase contrasea generada con algoritmo de resumen desconocido %d\n" - -#: g10/mainproc.c:382 -#, c-format -msgid "public key is %s\n" -msgstr "la clave pblica es %s\n" - -#: g10/mainproc.c:439 -msgid "public key encrypted data: good DEK\n" -msgstr "datos cifrados con la clave pblica: 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 pblica fallido: %s\n" - -#: g10/mainproc.c:508 -#, c-format -msgid "encrypted with %lu passphrases\n" -msgstr "cifrado con %lu frases contrasea\n" - -#: g10/mainproc.c:510 -msgid "encrypted with 1 passphrase\n" -msgstr "cifrado con 1 frase contrasea\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 "ATENCIN: la intgridad del mensaje no est protegida\n" - -#: g10/mainproc.c:598 -msgid "WARNING: encrypted message has been manipulated!\n" -msgstr "ATENCIN: 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 \"slo-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 "revocacin 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 verificacin 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 mltiples\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 mltiples firmas. Slo 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 raz invlido 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 pblica 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 opcin 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 mustreme ms informacin\n" - -#: g10/misc.c:681 -#, c-format -msgid "%s:%d: deprecated option \"%s\"\n" -msgstr "%s:%d: opcin desaconsejada \"%s\"\n" - -#: g10/misc.c:685 -#, c-format -msgid "WARNING: \"%s\" is a deprecated option\n" -msgstr "ATENCIN: \"%s\" es una opcin 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 "ATENCIN: \"%s\" es una opcin 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 podra no ser utilizable por %s\n" - -#: g10/misc.c:1017 -#, c-format -msgid "ambiguous option `%s'\n" -msgstr "opcin ambigua `%s'\n" - -#: g10/misc.c:1042 -#, c-format -msgid "unknown option `%s'\n" -msgstr "opcin 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:305 -#, c-format -msgid "assuming signed data in `%s'\n" -msgstr "asumiendo que hay datos firmados en `%s'\n" - -#: g10/openfile.c:384 -#, c-format -msgid "new configuration file `%s' created\n" -msgstr "creado un nuevo fichero de configuracin `%s'\n" - -#: g10/openfile.c:386 -#, c-format -msgid "WARNING: options in `%s' are not yet active during this run\n" -msgstr "AVISO: las opciones en `%s' no estn an activas en esta ejecucin\n" - -#: g10/openfile.c:418 -#, 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 pblica %d\n" - -#: g10/parse-packet.c:708 -msgid "WARNING: potentially insecure symmetrically encrypted session key\n" -msgstr "" -"AVISO: clave de sesin cifrada simtricamente potencialmente insegura\n" - -#: g10/parse-packet.c:1157 -#, c-format -msgid "subpacket of type %d has critical bit set\n" -msgstr "el subpaquete de tipo %d tiene el bit crtico 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 sesin\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 versin %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 contrasea 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 contrasea\n" - -#: g10/passphrase.c:573 -msgid "Enter passphrase\n" -msgstr "Introduzca frase contrasea\n" - -#: g10/passphrase.c:649 -msgid "cancelled by user\n" -msgstr "cancelado por el usuario\n" - -#: g10/passphrase.c:805 g10/passphrase.c:968 -msgid "can't query passphrase in batch mode\n" -msgstr "imposible pedir frase contrasea en modo de proceso por lotes\n" - -#: g10/passphrase.c:812 g10/passphrase.c:973 -msgid "Enter passphrase: " -msgstr "Introduzca frase contrasea: " - -#: 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 contrasea 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:977 -msgid "Repeat passphrase: " -msgstr "Repita frase contrasea: " - -#: 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 fotogrfico. La imagen debe ser un\n" -"fichero JPEG. Recuerde que la imgen se almacena en su clave pblica.\n" -"Si usa una foto muy grande, su clave ser tambin muy grande!\n" -"Una imagen cercana a 240x288 tiene un tamao adecuado.\n" - -#: g10/photoid.c:95 -msgid "Enter JPEG filename for photo ID: " -msgstr "Introduzca nombre del fichero JPEG para ID fotogrfico: " - -#: 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 fotogrfico!\n" - -#: g10/pkclist.c:62 g10/revoke.c:623 -msgid "No reason specified" -msgstr "No se dio ninguna razn" - -#: 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 vlido" - -#: g10/pkclist.c:74 -msgid "reason for revocation: " -msgstr "razn para la revocacin: " - -#: g10/pkclist.c:91 -msgid "revocation comment: " -msgstr "comentario a la revocacin: " - -#: 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 = confo 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 mnimo nivel de confianza para esta clave es: %s\n" -"\n" - -#: g10/pkclist.c:299 g10/revoke.c:652 -msgid "Your decision? " -msgstr "Su decisin? " - -#: 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 "ATENCIN: 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 revocacin)\n" - -#: g10/pkclist.c:518 -msgid "WARNING: This key has been revoked by its designated revoker!\n" -msgstr "" -"ATENCIN: 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 "ATENCIN: 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 "ATENCIN: 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 "" -"ATENCIN: 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 "ATENCIN: 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 FALSIFICACIN.\n" - -#: g10/pkclist.c:621 -msgid "" -"WARNING: This key is not certified with sufficiently trusted signatures!\n" -msgstr "" -"ATENCIN: 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 pblica 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 lnea vaca: " - -#: 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 pblica ya designada como destinataria por defecto\n" - -#: g10/pkclist.c:990 -msgid "Public key is disabled.\n" -msgstr "Clave pblica deshabilitada.\n" - -#: g10/pkclist.c:999 -msgid "skipped: public key already set\n" -msgstr "omitida: clave pblica 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 pblica deshabilitada\n" - -#: g10/pkclist.c:1154 -msgid "no valid addressees\n" -msgstr "no hay direcciones vlidas\n" - -#: g10/plaintext.c:91 -msgid "data not saved; use option \"--output\" to save it\n" -msgstr "datos no grabados; use la opcin \"--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 annimo; probando clave secreta %s ...\n" - -#: g10/pubkey-enc.c:135 -msgid "okay, we are the anonymous recipient.\n" -msgstr "de acuerdo, somos el destinatario annimo.\n" - -#: g10/pubkey-enc.c:223 -msgid "old encoding of the DEK is not supported\n" -msgstr "la antigua codificacin 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 "construccin 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 revocacin confidencial)\n" - -#: g10/revoke.c:316 -msgid "Create a designated revocation certificate for this key? (y/N) " -msgstr "Crear un certificado de revocacin 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 revocacin creado.\n" - -#: g10/revoke.c:413 -#, c-format -msgid "no revocation keys found for \"%s\"\n" -msgstr "no se encuetran claves de revocacin 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 pblica correspondiente: %s\n" - -#: g10/revoke.c:511 -msgid "public key does not match secret key!\n" -msgstr "la clave pblica 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 revocacin para esta clave? (s/N) " - -#: g10/revoke.c:535 -msgid "unknown protection algorithm\n" -msgstr "algoritmo de proteccin 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 revocacin creado.\n" -"\n" -"Por favor consrvelo 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 precaucin: el sistema\n" -"de impresin de su mquina podra 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 razn para la revocacin:\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 quera seleccionar %d aqu)\n" - -#: g10/revoke.c:688 -msgid "Enter an optional description; end it with an empty line:\n" -msgstr "Introduzca una descripcin opcional; acbela con una lnea vaca:\n" - -#: g10/revoke.c:716 -#, c-format -msgid "Reason for revocation: %s\n" -msgstr "Razn para la revocacin: %s\n" - -#: g10/revoke.c:718 -msgid "(No description given)\n" -msgstr "(No se di descripcin)\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 estn disponibles\n" - -#: g10/seckey-cert.c:61 -#, c-format -msgid "protection algorithm %d%s is not supported\n" -msgstr "el algoritmo de proteccin %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 contrasea incorrecta; intntelo 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 "" -"ATENCIN: detectada clave dbil - por favor cambie la frase contrasea.\n" - -#: g10/seckey-cert.c:366 -msgid "generating the deprecated 16-bit checksum for secret key protection\n" -msgstr "" -"generando la suma de comprobacin de 16 bits (desaconsejada) para \n" -"proteger la clave secreta.\n" - -#: g10/seskey.c:54 -msgid "weak key created - retrying\n" -msgstr "creada clave dbil - reintentando\n" - -#: g10/seskey.c:59 -#, c-format -msgid "cannot avoid weak key for symmetric cipher; tried %d times!\n" -msgstr "" -"imposible evitar clave dbil para cifrado simtrico despus 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 invlido\n" - -#: g10/sig-check.c:181 -#, c-format -msgid "public key %s is %lu second newer than the signature\n" -msgstr "la clave pblica %s es %lu segundos ms 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 pblica %s es %lu segundos ms 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 crtico 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 revocacin 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 notacin 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 poltica . 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 poltica 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 poltica 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 poltica (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 comprobacin 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 "" -"slo 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 "slo 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:127 g10/skclist.c:191 -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:158 -#, c-format -msgid "skipped \"%s\": duplicated\n" -msgstr "\"%s\" omitido: duplicado\n" - -#: g10/skclist.c:166 g10/skclist.c:176 g10/skclist.c:185 -#, c-format -msgid "skipped \"%s\": %s\n" -msgstr "omitido \"%s\": %s\n" - -#: g10/skclist.c:171 -msgid "skipped: secret key already present\n" -msgstr "omitido: clave secreta ya presente\n" - -#: g10/skclist.c:186 -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 "lnea demasiado larga" - -#: g10/tdbdump.c:168 -msgid "colon missing" -msgstr "falta una coma" - -#: g10/tdbdump.c:174 -msgid "invalid fingerprint" -msgstr "huella dactilar no vlida" - -#: 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 sincronizacin: %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 "transaccin 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 creacin del registro de versin: %s" - -#: g10/tdbio.c:555 -#, c-format -msgid "%s: invalid trustdb created\n" -msgstr "%s: se ha creado base de datos de confianza invlida\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 invlida\n" - -#: g10/tdbio.c:651 -#, c-format -msgid "%s: failed to create hashtable: %s\n" -msgstr "%s: fallo en la creacin 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 versin: %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 versin: %s\n" - -#: g10/tdbio.c:735 -#, c-format -msgid "%s: error writing version record: %s\n" -msgstr "%s: error escribiendo registro de versin: %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 versin con nmero de registro %lu\n" - -#: g10/tdbio.c:1226 -#, c-format -msgid "%s: invalid file version %d\n" -msgstr "%s: versin del fichero %d invlida\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 aadir 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 daada. 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 lneas de texto de ms de %d caracteres\n" - -#: g10/textfilter.c:248 -#, c-format -msgid "input line longer than %d characters\n" -msgstr "lnea 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 vlido\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 ms 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 pblica - 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, peticin 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 comprobacin 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 comprobacin 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 comprobacin 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 pblica %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 pblica 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 versin 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" -"debera ser el primero que se da en la lnea de rdenes.\n" - -#: g10/verify.c:192 -#, c-format -msgid "input line %u too long or missing LF\n" -msgstr "la lnea %u es demasiado larga o no tiene avance de lnea (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 "Versin desconocida" - -#: util/errors.c:58 -msgid "unknown pubkey algorithm" -msgstr "Algoritmo de clave pblica 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 pblica 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 comprobacin" - -# Por qu no frase de paso? -# Porque todo el mundo sabe lo que es una contrasea -# 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 ms listos? :-) -# -#: util/errors.c:64 -msgid "bad passphrase" -msgstr "Frase contrasea incorrecta" - -#: util/errors.c:65 -msgid "public key not found" -msgstr "Clave pblica 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 saba -# cmo se dice llavero en ingls... -# 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 invlido" - -#: util/errors.c:69 -msgid "invalid armor" -msgstr "armadura invlida" - -#: 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 compresin 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 contrasea incorrecta" - -#: util/errors.c:81 -msgid "unimplemented pubkey algorithm" -msgstr "algoritmo de clave pblica 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 "lmite de recurso" - -#: util/errors.c:87 -msgid "invalid keyring" -msgstr "anillo invlido" - -#: 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 relacin 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 pblica no utilizable" - -#: util/errors.c:96 -msgid "file exists" -msgstr "el fichero existe" - -#: util/errors.c:97 -msgid "weak key" -msgstr "clave dbil" - -#: util/errors.c:98 -msgid "invalid argument" -msgstr "argumento invlido" - -#: 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 pblica 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, preferira 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 "ATENCIN: 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 ms informacin\n" - -#: util/secmem.c:350 -msgid "operation is not possible without initialized secure memory\n" -msgstr "operacin imposible sin memoria segura inicializada\n" - -#: util/secmem.c:351 -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 ms " -#~ "informacin\n" - -#~ msgid "" -#~ "a notation name must have only printable characters or spaces, and end " -#~ "with an '='\n" -#~ msgstr "" -#~ "un nombre de notacin debe tener slo caracteres imprimibles o espacios, " -#~ "y acabar con un '='\n" - -#~ msgid "a user notation name must contain the '@' character\n" -#~ msgstr "un nombre de notacin de usuario debe contener el caracter '@'\n" - -#, fuzzy -#~ msgid "a notation name must not contain more than one '@' character\n" -#~ msgstr "un nombre de notacin de usuario debe contener el caracter '@'\n" - -#~ msgid "a notation value must not use any control characters\n" -#~ msgstr "un valor de notacin no debe usar ningn caracter de control\n" - -#~ msgid "WARNING: invalid notation data found\n" -#~ msgstr "ATENCIN: encontrados datos de notacin invlidos\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 "User ID \"%s\": %d signature removed.\n" -#~ msgstr "ID de usuario \"%s\" revocado." - -#, fuzzy -#~ msgid "User ID \"%s\": %d signatures removed.\n" -#~ msgstr "ID de usuario \"%s\" revocado." - -#, fuzzy -#~ msgid "User ID \"%s\" removed: %s\n" -#~ msgstr "ID de usuario \"%s\" revocado." - -#, 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 nmero de serie: %s\n" - -#~ msgid "length of RSA modulus is not %d\n" -#~ msgstr "la longitud del mdulo 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 comunicacin con el agente gpg\n" - -#~ msgid "passphrase too long\n" -#~ msgstr "frase contrasea demasiado larga\n" - -#~ msgid "invalid response from agent\n" -#~ msgstr "respuesta del agente invlida\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 slo lectura en esta versin\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 "slo 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 slo 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 daada" - -#~ msgid "De-Armor a file or stdin" -#~ msgstr "quita la armadura de un fichero o de la entrada estndar" - -#~ msgid "En-Armor a file or stdin" -#~ msgstr "crea la armadura a un fichero o a la entrada estndar" - -#~ 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 acepcin b) de asumir -# dice "b) (suponer) to assume, suppose..." -# Adems 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 "aade este anillo a la lista de anillos" - -#~ msgid "add this secret keyring to the list" -#~ msgstr "aade 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 informacin de estado en el fichero" - -#~ msgid "|KEYID|ultimately trust this key" -#~ msgstr "|ID-CLAVE|confa plenamente en esta clave" - -#~ msgid "|FILE|load extension module FILE" -#~ msgstr "|FICHERO|carga mdulo 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 contrasea N" - -#~ msgid "|NAME|use message digest algorithm NAME for passphrases" -#~ msgstr "" -#~ "|NOMBRE|usa algoritmo de resumen de mensaje NOMBRE para las contraseas" - -#~ msgid "|NAME|use cipher algorithm NAME for passphrases" -#~ msgstr "|NOMBRE|usa el algoritmo de cifrado NOMBRE para las contraseas" - -#~ 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 compresin N" - -#~ msgid "throw keyid field of encrypted packets" -#~ msgstr "elimina campo keyid de los paquetes cifrados" - -#~ msgid "Show Photo IDs" -#~ msgstr "Muestra IDs fotogrficos" - -#~ msgid "Don't show Photo IDs" -#~ msgstr "No muestra IDs fotogrficos" - -#~ msgid "Set command line to view Photo IDs" -#~ msgstr "Ajusta linea de comandos para ver IDs fotogrficos" - -#~ msgid "compress algorithm `%s' is read-only in this release\n" -#~ msgstr "" -#~ "el algoritmo de compresin `%s' es de slo lectura en esta versin\n" - -#~ msgid "compress algorithm must be in range %d..%d\n" -#~ msgstr "el algoritmo de compresin 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 vlida\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 tamao mnimo es 768 bits\n" -#~ " el tamao por defecto es 1024 bits\n" -#~ " el tamao mximo recomendado es 2048 bits\n" - -#~ msgid "DSA only allows keysizes from 512 to 1024\n" -#~ msgstr "DSA slo permite tamaos desde 512 a 1024\n" - -#~ msgid "keysize too small; 1024 is smallest value allowed for RSA.\n" -#~ msgstr "" -#~ "tamao de clave insuficiente; 1024 es el mnimo permitido para RSA.\n" - -#~ msgid "keysize too small; 768 is smallest value allowed.\n" -#~ msgstr "tamao insuficiente; 768 es el valor mnimo permitido\n" - -#~ msgid "keysize too large; %d is largest value allowed.\n" -#~ msgstr "tamao excesivo; %d es el mximo valor permitido.\n" - -#~ msgid "" -#~ "Keysizes larger than 2048 are not suggested because\n" -#~ "computations take REALLY long!\n" -#~ msgstr "" -#~ "No se recomiendan claves de ms de 2048 bits porque\n" -#~ "el tiempo de clculo es REALMENTE largo!\n" - -#~ msgid "Are you sure that you want this keysize? " -#~ msgstr "Seguro que quiere una clave de este tamao? " - -#~ 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 tambin 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: ATENCIN: fichero vaco\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 "aaidu" - -#~ msgid "addphoto" -#~ msgstr "aadirfoto" - -#~ msgid "deluid" -#~ msgstr "borridu" - -#~ msgid "delphoto" -#~ msgstr "borfoto" - -#~ msgid "add a secondary key" -#~ msgstr "aade una clave secundaria" - -#~ msgid "delkey" -#~ msgstr "borrcla" - -#~ msgid "addrevoker" -#~ msgstr "aarevoc" - -#~ 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 revocacin falsificada\n" - -#~ msgid "rev? problem checking revocation: %s\n" -#~ msgstr "rev? problema comprobando la revocacin: %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 "Poltica: " - -#~ msgid "Experimental algorithms should not be used!\n" -#~ msgstr "No se deberan 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 ms " -#~ "estndar!\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 (tambin conocido como DSS) es un algoritmo de firma digital que " -#~ "slo\n" -#~ "puede usarse para firmas. Es el algoritmo sugerido porque la " -#~ "verificacin\n" -#~ "de firmas DSA es mucho ms rpida 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: slo para cifrado y para\n" -#~ "firma y cifrado. En realidad es lo mismo, pero se deben seleccionar " -#~ "ciertos\n" -#~ "parmetros 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" -#~ "opcin de clave ElGamal slo 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 estn 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 slo es posible con GnuPG. No ser posible\n" -#~ "comunicarse mediante esta clave con usuarios de PGP. Este algoritmo\n" -#~ "es adems muy lento, y podra 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 simtrico invlido (%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 notacin" - -#~ msgid "" -#~ "the first character of a notation name must be a letter or an underscore\n" -#~ msgstr "" -#~ "El primer carcter de una notacin 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 notacin 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 fotogrfico.\n" -#~ " Aadir 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 fotogrfico 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 tamao? " - -#, fuzzy -#~ msgid " Are you sure you still want to sign it?\n" -#~ msgstr "Seguro que quiere una clave de este tamao? " - -#~ msgid "too many random bits requested; the limit is %d\n" -#~ msgstr "se solicitan demasiados bits aleatorios; el lmite 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 "Informacin 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 vlida 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 ningn certificado sin valor de confianza.\n" -#~ "\n" - -#~ msgid "" -#~ "No trust values changed.\n" -#~ "\n" -#~ msgstr "" -#~ "No se cambi ningn valor de confianza.\n" -#~ "\n" - -#~ msgid "%08lX: no info to calculate a trust probability\n" -#~ msgstr "" -#~ "%08lX: no hay informacin para calcular la probabilidad de confianza\n" - -#~ msgid "skipped: public key already set with --encrypt-to\n" -#~ msgstr "omitida: clave pblica 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 pblico 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 crtico 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: peticin 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 pblica y secreta no se corresponden\n" - -#~ msgid "key %08lX.%lu: Good subkey binding\n" -#~ msgstr "clave %08lX.%lu: unin de subclave vlida\n" - -#~ msgid "key %08lX.%lu: Invalid subkey binding: %s\n" -#~ msgstr "clave %08lX.%lu: unin de subclave invlida: %s\n" - -#~ msgid "key %08lX.%lu: Valid key revocation\n" -#~ msgstr "clave %08lX.%lu: revocacin de clave vlida\n" - -#~ msgid "key %08lX.%lu: Invalid key revocation: %s\n" -#~ msgstr "clave %08lX.%lu: revocacin de clave invlida: %s\n" - -#~ msgid "Good self-signature" -#~ msgstr "Autofirma vlida" - -#~ msgid "Invalid self-signature" -#~ msgstr "Autofirma invlida" - -#~ msgid "Valid user ID revocation skipped due to a newer self signature" -#~ msgstr "" -#~ "Revocacin vlida de ID de usuario omitida, existe autofirma ms reciente" - -#~ msgid "Valid user ID revocation" -#~ msgstr "Revocacin de ID de usuario vlida" - -#~ msgid "Invalid user ID revocation" -#~ msgstr "Revocacin de ID de usuario invlida." - -#~ msgid "Valid certificate revocation" -#~ msgstr "Revocacin de certificado vlida" - -#~ msgid "Good certificate" -#~ msgstr "Certificado correcto" - -#~ msgid "Invalid certificate revocation" -#~ msgstr "Certificado de revocacin 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 ?: insercin fallida: %s\n" - -#~ msgid "lid %lu: insert failed: %s\n" -#~ msgstr "lid %lu: insercin 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 pblicas\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 ningn ID de usuario\n" - -#~ msgid "check_trust: search dir record failed: %s\n" -#~ msgstr "check_trust: bsqueda registro directorio fallida: %s\n" - -#~ msgid "key %08lX: insert trust record failed: %s\n" -#~ msgstr "clave %08lX: insercin 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: comprobacin 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 "" -#~ "ATENCON: todava 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 versin\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 estn en desuso, considere la creacin de una nueva clave " -#~ "para futuros usos\n" - -#~ msgid "set debugging flags" -#~ msgstr "establece los parmetros de depuracin" - -#~ msgid "enable full debugging" -#~ msgstr "habilita depuracin 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 creacin de claves slo 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 resmenes 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 bsqueda 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 bsqueda 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 bsqueda 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 bsqueda\n" - -#~ msgid "very strange: no public key\n" -#~ msgstr "muy raro: no hay clave pblica\n" - -#~ msgid "hintlist %lu[%d] of %lu does not point to a dir record\n" -#~ msgstr "" -#~ "la lista de bsqueda %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 pblica 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: actualizacin 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: actualizacin 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 pblico `%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 vlido\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 pblica?" - -#~ msgid "did not use primary key for insert_trust_record()\n" -#~ msgstr "no se us clave primaria para insert_trust_record()\n" - -#~ msgid "second" -#~ msgstr "segundo" - -#~ msgid "seconds" -#~ msgstr "segundos" diff --git a/po/et.po b/po/et.po deleted file mode 100644 index 7cf6a2d3c..000000000 --- a/po/et.po +++ /dev/null @@ -1,7121 +0,0 @@ -# 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-07-28 11:12+0200\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 "vhem 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 "vhem 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 vtme 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:1003 g10/gpg.c:3461 g10/import.c:195 g10/keygen.c:2385 -#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:342 -#: 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 "mrkus: random_seed fail on thi\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 "mrkus: random_seed faili ei uuendatud\n" - -#: cipher/random.c:544 g10/exec.c:481 g10/gpg.c:1002 g10/keygen.c:2864 -#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:263 -#: g10/openfile.c:357 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 thi kest, et programmid\n" -"kiks - 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 vltimiseks vite teha arvutiga\n" -"mingit td, see tstab 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 tid,\n" -"et anda masinal vimalust 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 ebannestus: %s\n" - -#: g10/app-openpgp.c:609 -#, fuzzy, c-format -msgid "failed to store the creation date: %s\n" -msgstr "vtmehoidla vahemlu uuesti loomine ebannestus: %s\n" - -#: g10/app-openpgp.c:977 -#, fuzzy, c-format -msgid "reading public key failed: %s\n" -msgstr "vtmebloki kustutamine ebannestus: %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 "vtmeserverile saatmine ebannestus: %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 vtmebloki 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 vtmepaar" - -#: 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 ebannestus: %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 "vtmebloki kustutamine ebannestus: %s\n" - -#: g10/app-openpgp.c:1904 -#, fuzzy, c-format -msgid "key generation completed (%d seconds)\n" -msgstr "Vtme genereerimine ebannestus: %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, snumilhendi 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:320 -#, c-format -msgid "armor: %s\n" -msgstr "pakend: %s\n" - -#: g10/armor.c:359 -msgid "invalid armor header: " -msgstr "vigane pakendi pis: " - -#: g10/armor.c:370 -msgid "armor header: " -msgstr "pakendi pis: " - -#: g10/armor.c:381 -msgid "invalid clearsig header\n" -msgstr "vigane avateksti allkirja pis\n" - -#: g10/armor.c:433 -msgid "nested clear text signatures\n" -msgstr "avateksti allkirjad ksteise sees\n" - -#: g10/armor.c:568 -#, fuzzy -msgid "unexpected armor: " -msgstr "ootamatu pakend:" - -#: g10/armor.c:580 -msgid "invalid dash escaped line: " -msgstr "vigane kriipsudega mrgitud rida: " - -#: g10/armor.c:734 g10/armor.c:1343 -#, fuzzy, c-format -msgid "invalid radix64 character %02X skipped\n" -msgstr "vigane radix64 smbol %02x vahele jetud\n" - -#: g10/armor.c:777 -msgid "premature eof (no CRC)\n" -msgstr "enneaegne faililpp (puudub CRC)\n" - -#: g10/armor.c:811 -msgid "premature eof (in CRC)\n" -msgstr "enneaegne faililpp (poolik CRC)\n" - -#: g10/armor.c:819 -msgid "malformed CRC\n" -msgstr "vigane CRC\n" - -#: g10/armor.c:823 g10/armor.c:1380 -#, fuzzy, c-format -msgid "CRC error; %06lX - %06lX\n" -msgstr "CRC viga; %06lx - %06lx\n" - -#: g10/armor.c:843 -#, fuzzy -msgid "premature eof (in trailer)\n" -msgstr "enneaegne faililpp (lpetaval real)\n" - -#: g10/armor.c:847 -msgid "error in trailer line\n" -msgstr "viga lpetaval real\n" - -#: g10/armor.c:1158 -msgid "no valid OpenPGP data found.\n" -msgstr "ei leia OpenPGP andmeid.\n" - -#: g10/armor.c:1163 -#, c-format -msgid "invalid armor: line longer than %d characters\n" -msgstr "vigane pakend: rida on pikem, kui %d smbolit\n" - -#: g10/armor.c:1167 -msgid "" -"quoted printable character in armor - probably a buggy MTA has been used\n" -msgstr "" -"kvooditud smbol pakendis - tenoliselt 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 vti ei ole kttesaadav" - -#: 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 "Phjus puudub" - -#: g10/card-util.c:441 -#, fuzzy -msgid "not forced" -msgstr "ei tdeldud" - -#: 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 vtit 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:280 -#, 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 smbol eelistuste snes\n" - -#: g10/card-util.c:811 -#, fuzzy -msgid "Error: invalid characters in preference string.\n" -msgstr "lubamatu smbol eelistuste snes\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 srmejlg\n" - -#: g10/card-util.c:867 -#, fuzzy -msgid "CA fingerprint: " -msgstr "nita srmejlge" - -#: g10/card-util.c:890 -#, fuzzy -msgid "Error: invalid formatted fingerprint.\n" -msgstr "viga: vigane srmejlg\n" - -#: g10/card-util.c:938 -#, fuzzy, c-format -msgid "key operation not possible: %s\n" -msgstr "Vtme genereerimine ebannestus: %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 vtme vtmehoidlasse `%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 vtmetpi 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 krpteerimiseks)\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 thistamise phjus:\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 vtme salajased komponendid ei ole kttesaadavad.\n" - -#: g10/card-util.c:1248 -#, fuzzy -msgid "secret key already stored on a card\n" -msgstr "jtsin vahele: avalik vti on juba olemas\n" - -#: g10/card-util.c:1319 g10/keyedit.c:1357 -msgid "quit this menu" -msgstr "vlju sellest menst" - -#: g10/card-util.c:1321 -#, fuzzy -msgid "show admin commands" -msgstr "vastuolulised ksud\n" - -#: g10/card-util.c:1322 g10/keyedit.c:1360 -msgid "show this help" -msgstr "nita seda abiinfot" - -#: g10/card-util.c:1324 -#, fuzzy -msgid "list all available data" -msgstr "Vtme 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 kuupeva" - -#: 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 "nita srmejlge" - -#: 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 vtmepaar" - -#: 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 "Ksklus> " - -#: g10/card-util.c:1495 -#, fuzzy -msgid "Admin-only command\n" -msgstr "vastuolulised ksud\n" - -#: g10/card-util.c:1526 -#, fuzzy -msgid "Admin commands are allowed\n" -msgstr "vastuolulised ksud\n" - -#: g10/card-util.c:1528 -#, fuzzy -msgid "Admin commands are not allowed\n" -msgstr "kirjutan salajase vtme faili `%s'\n" - -#: g10/card-util.c:1602 g10/keyedit.c:2244 -msgid "Invalid command (try \"help\")\n" -msgstr "Vigane ksklus (proovige \"help\")\n" - -#: g10/cardglue.c:416 -#, fuzzy -msgid "card reader not available\n" -msgstr "salajane vti ei ole kttesaadav" - -#: 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 "vtmebloki kustutamine ebannestus: %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:3826 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 "vti --output ei tta selle ksuga\n" - -#: g10/delkey.c:75 g10/export.c:311 g10/keyedit.c:3387 g10/keyserver.c:1700 -#: g10/revoke.c:228 -#, fuzzy, c-format -msgid "key \"%s\" not found: %s\n" -msgstr "vtit '%s' ei leitud: %s\n" - -#: g10/delkey.c:83 g10/export.c:341 g10/import.c:2349 g10/keyserver.c:1714 -#: g10/revoke.c:234 g10/revoke.c:478 -#, c-format -msgid "error reading keyblock: %s\n" -msgstr "viga vtmebloki 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 mra vtit srmejljega)\n" - -#: g10/delkey.c:135 -#, fuzzy -msgid "can't do this in batch mode without \"--yes\"\n" -msgstr "pakettmoodis ei nnestu seda teha vtmeta \"--yes\"\n" - -#: g10/delkey.c:147 -#, fuzzy -msgid "Delete this key from the keyring? (y/N) " -msgstr "Kustutan selle vtme vtmehoidlast? " - -#: g10/delkey.c:155 -#, fuzzy -msgid "This is a secret key! - really delete? (y/N) " -msgstr "See on salajane vti! - kas kustutan testi? " - -#: g10/delkey.c:165 -#, c-format -msgid "deleting keyblock failed: %s\n" -msgstr "vtmebloki kustutamine ebannestus: %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 vtme \"%s\" jaoks on salajane vti!\n" - -#: g10/delkey.c:208 -msgid "use option \"--delete-secret-keys\" to delete it first.\n" -msgstr "selle kustutamiseks kasutage vtit \"--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 tttu ei saa smmeetrilist 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 thi 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 vtmeid pikkusega kuni 2048 bitti saab krpteerida 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 "kikide krpteeritavate vtmetega 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 "" -"smmetrilise 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 "" -"smmetrilise 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 krptitud kasutajale: \"%s\"\n" - -#: g10/encr-data.c:67 g10/mainproc.c:293 -#, c-format -msgid "%s encrypted data\n" -msgstr "%s krpteeritud andmed\n" - -#: g10/encr-data.c:69 g10/mainproc.c:297 -#, c-format -msgid "encrypted with unknown algorithm %d\n" -msgstr "krpteeritud tundmatu algoritmiga %d\n" - -#: g10/encr-data.c:93 -msgid "" -"WARNING: message was encrypted with a weak key in the symmetric cipher.\n" -msgstr "HOIATUS: teade on krptitud smmeetrilise ifri nrga vtmega.\n" - -#: g10/encr-data.c:104 -msgid "problem handling encrypted packet\n" -msgstr "probleem krptitud paketi ksitlemisel\n" - -#: g10/exec.c:49 -msgid "no remote program execution supported\n" -msgstr "mittelokaalse programmi kivitamist ei toetata\n" - -#: g10/exec.c:176 g10/openfile.c:415 -#, 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 "" -"vliste programmide kivitamine 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 nuab vliste programmide kivitamiseks ajutiste failide " -"kasutamist\n" - -#: g10/exec.c:425 -#, fuzzy, c-format -msgid "unable to execute program `%s': %s\n" -msgstr "ei nnestu kivitada %s \"%s\": %s\n" - -#: g10/exec.c:428 -#, fuzzy, c-format -msgid "unable to execute shell `%s': %s\n" -msgstr "ei nnestu kivitada %s \"%s\": %s\n" - -#: g10/exec.c:513 -#, c-format -msgid "system error while calling external program: %s\n" -msgstr "ssteemi viga vlise programmi kasutamisel: %s\n" - -#: g10/exec.c:524 g10/exec.c:590 -msgid "unnatural exit of external program\n" -msgstr "vline programm lpetas erandlikult\n" - -#: g10/exec.c:539 -msgid "unable to execute external program\n" -msgstr "vlist programmi ei nnestu kivitada\n" - -#: g10/exec.c:555 -#, c-format -msgid "unable to read external program response: %s\n" -msgstr "ei nnestu lugeda vlise 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 mrgitakse 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 thistamise vtmeid\n" -"\n" - -#: g10/export.c:67 -#, fuzzy -msgid "remove the passphrase from exported subkeys" -msgstr "thista sekundaarne vti" - -#: g10/export.c:69 -#, fuzzy -msgid "remove unusable parts from key during export" -msgstr "mittekasutatav salajane vti" - -#: 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 vtme faili `%s'\n" - -#: g10/export.c:354 -#, fuzzy, c-format -msgid "key %s: not protected - skipped\n" -msgstr "vti %08lX: ei ole kaitstud - jtsin vahele\n" - -#: g10/export.c:362 -#, fuzzy, c-format -msgid "key %s: PGP 2.x style key - skipped\n" -msgstr "vti %08lX: PGP 2.x stiilis vti - jtsin vahele\n" - -#: g10/export.c:373 -#, fuzzy, c-format -msgid "key %s: key material on-card - skipped\n" -msgstr "vti %08lX: alamvtme allkiri on vales kohas - jtan 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 ebannestus: %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 vtmes %08lX puudub lihtne SK kontrollsumma\n" - -#: g10/export.c:598 -msgid "WARNING: nothing exported\n" -msgstr "HOIATUS: midagi ei eksporditud\n" - -#: g10/gpg.c:375 -msgid "" -"@Commands:\n" -" " -msgstr "" -"@Ksud:\n" -" " - -#: g10/gpg.c:377 -msgid "|[file]|make a signature" -msgstr "|[fail]|loo allkiri" - -#: g10/gpg.c:378 -msgid "|[file]|make a clear text signature" -msgstr "|[fail]|loo avateksti allkiri" - -#: g10/gpg.c:379 -msgid "make a detached signature" -msgstr "loo eraldiseisev allkiri" - -#: g10/gpg.c:380 -msgid "encrypt data" -msgstr "krpteeri andmed" - -#: g10/gpg.c:382 -msgid "encryption only with symmetric cipher" -msgstr "krpteerimine kasutades ainult smmeetrilist ifrit" - -#: g10/gpg.c:384 -msgid "decrypt data (default)" -msgstr "dekrpteeri andmed (vaikimisi)" - -#: g10/gpg.c:386 -msgid "verify a signature" -msgstr "kontrolli allkirja" - -#: g10/gpg.c:388 -msgid "list keys" -msgstr "nita vtmeid" - -#: g10/gpg.c:390 -msgid "list keys and signatures" -msgstr "nita vtmeid ja allkirju" - -#: g10/gpg.c:391 -#, fuzzy -msgid "list and check key signatures" -msgstr "kontrolli vtmete allkirju" - -#: g10/gpg.c:392 -msgid "list keys and fingerprints" -msgstr "nita vtmeid ja srmejlgi" - -#: g10/gpg.c:393 -msgid "list secret keys" -msgstr "nita salajasi vtmeid" - -#: g10/gpg.c:394 -msgid "generate a new key pair" -msgstr "genereeri uus vtmepaar" - -#: g10/gpg.c:395 -msgid "remove keys from the public keyring" -msgstr "eemalda vtmed avalike vtmete hoidlast" - -#: g10/gpg.c:397 -msgid "remove keys from the secret keyring" -msgstr "eemalda vtmed salajaste vtmete hoidlast" - -#: g10/gpg.c:398 -msgid "sign a key" -msgstr "allkirjasta vti" - -#: g10/gpg.c:399 -msgid "sign a key locally" -msgstr "allkirjasta vti lokaalselt" - -#: g10/gpg.c:400 -msgid "sign or edit a key" -msgstr "allkirjasta vi toimeta vtit" - -#: g10/gpg.c:401 -msgid "generate a revocation certificate" -msgstr "genereeri thistamise sertifikaat" - -#: g10/gpg.c:403 -msgid "export keys" -msgstr "ekspordi vtmed" - -#: g10/gpg.c:404 -msgid "export keys to a key server" -msgstr "ekspordi vtmed vtmeserverisse" - -#: g10/gpg.c:405 -msgid "import keys from a key server" -msgstr "impordi vtmed vtmeserverist" - -#: g10/gpg.c:407 -msgid "search for keys on a key server" -msgstr "otsi vtmeid vtmeserverist" - -#: g10/gpg.c:409 -msgid "update all keys from a keyserver" -msgstr "uuenda vtmeid vtmeserverist" - -#: g10/gpg.c:413 -msgid "import/merge keys" -msgstr "impordi/mesti vtmed" - -#: g10/gpg.c:416 -msgid "print the card status" -msgstr "" - -#: g10/gpg.c:417 -msgid "change data on a card" -msgstr "" - -#: g10/gpg.c:418 -msgid "change a card's PIN" -msgstr "" - -#: g10/gpg.c:426 -msgid "update the trust database" -msgstr "uuenda usalduse andmebaasi" - -#: g10/gpg.c:433 -msgid "|algo [files]|print message digests" -msgstr "|algo [failid]|trki teatelhendid" - -#: g10/gpg.c:437 g10/gpgv.c:71 -msgid "" -"@\n" -"Options:\n" -" " -msgstr "" -"@\n" -"Vtmed:\n" -" " - -#: g10/gpg.c:439 -msgid "create ascii armored output" -msgstr "loo ascii pakendis vljund" - -#: g10/gpg.c:441 -msgid "|NAME|encrypt for NAME" -msgstr "|NIMI|krpti NIMEle" - -#: g10/gpg.c:452 -msgid "use this user-id to sign or decrypt" -msgstr "kasuta seda kasutaja IDd" - -#: g10/gpg.c:453 -msgid "|N|set compress level N (0 disables)" -msgstr "|N|mra pakkimise tase N (0 blokeerib)" - -#: g10/gpg.c:458 -msgid "use canonical text mode" -msgstr "kasuta kanoonilist tekstimoodi" - -#: g10/gpg.c:472 -msgid "use as output file" -msgstr "kasuta vljundfailina" - -#: g10/gpg.c:474 g10/gpgv.c:73 -msgid "verbose" -msgstr "ole jutukas" - -#: g10/gpg.c:485 -msgid "do not make any changes" -msgstr "ra tee mingeid muutusi" - -#: g10/gpg.c:486 -msgid "prompt before overwriting" -msgstr "ksi enne lekirjutamist" - -#: g10/gpg.c:527 -msgid "use strict OpenPGP behavior" -msgstr "" - -#: g10/gpg.c:528 -msgid "generate PGP 2.x compatible messages" -msgstr "" - -#: g10/gpg.c:556 -msgid "" -"@\n" -"(See the man page for a complete listing of all commands and options)\n" -msgstr "" -"@\n" -"(Kikide kskude ja vtmete tieliku kirjelduse leiate manualist)\n" - -#: g10/gpg.c:559 -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" -"Nited:\n" -"\n" -" -se -r Bob [fail] allkirjasta ja krpti kasutajale Bob\n" -" --clearsign [fail] loo avateksti allkiri\n" -" --detach-sign [fail] loo eraldiseisev allkiri\n" -" --list-keys [nimed] nita vtmeid\n" -" --fingerprint [nimed] nita srmejlgi\n" - -#: g10/gpg.c:757 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:774 -msgid "Usage: gpg [options] [files] (-h for help)" -msgstr "Kasuta: gpg [vtmed] [failid] (-h nitab abiinfot)" - -#: g10/gpg.c:777 -msgid "" -"Syntax: gpg [options] [files]\n" -"sign, check, encrypt or decrypt\n" -"default operation depends on the input data\n" -msgstr "" -"Sntaks: gpg [vtmed] [failid]\n" -"allkirjasta, kontrolli, krpti ja dekrpti\n" -"vaikimisi operatsioon sltub sisendandmetest\n" - -#: g10/gpg.c:788 -msgid "" -"\n" -"Supported algorithms:\n" -msgstr "" -"\n" -"Toetatud algoritmid:\n" - -#: g10/gpg.c:791 -msgid "Pubkey: " -msgstr "Avalik vti: " - -#: g10/gpg.c:797 g10/keyedit.c:2310 -msgid "Cipher: " -msgstr "iffer: " - -#: g10/gpg.c:803 -msgid "Hash: " -msgstr "Rsi: " - -#: g10/gpg.c:809 g10/keyedit.c:2356 -msgid "Compression: " -msgstr "Pakkimine: " - -#: g10/gpg.c:892 -msgid "usage: gpg [options] " -msgstr "kasuta: gpg [vtmed] " - -#: g10/gpg.c:1040 -msgid "conflicting commands\n" -msgstr "vastuolulised ksud\n" - -#: g10/gpg.c:1058 -#, fuzzy, c-format -msgid "no = sign found in group definition `%s'\n" -msgstr "grupi definitsioonis \"%s\" puudub smbol =\n" - -#: g10/gpg.c:1255 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on homedir `%s'\n" -msgstr "HOIATUS: ebaturvaline omanik %s \"%s\"\n" - -#: g10/gpg.c:1258 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on configuration file `%s'\n" -msgstr "HOIATUS: ebaturvaline omanik %s \"%s\"\n" - -#: g10/gpg.c:1261 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on extension `%s'\n" -msgstr "HOIATUS: ebaturvaline omanik %s \"%s\"\n" - -#: g10/gpg.c:1267 -#, fuzzy, c-format -msgid "WARNING: unsafe permissions on homedir `%s'\n" -msgstr "HOIATUS: ebaturvalised igused %s \"%s\"\n" - -#: g10/gpg.c:1270 -#, fuzzy, c-format -msgid "WARNING: unsafe permissions on configuration file `%s'\n" -msgstr "HOIATUS: ebaturvalised igused %s \"%s\"\n" - -#: g10/gpg.c:1273 -#, fuzzy, c-format -msgid "WARNING: unsafe permissions on extension `%s'\n" -msgstr "HOIATUS: ebaturvalised igused %s \"%s\"\n" - -#: g10/gpg.c:1279 -#, fuzzy, c-format -msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n" -msgstr "HOIATUS: ebaturvaline kataloogi omanik %s \"%s\"\n" - -#: g10/gpg.c:1282 -#, 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:1285 -#, fuzzy, c-format -msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n" -msgstr "HOIATUS: ebaturvaline kataloogi omanik %s \"%s\"\n" - -#: g10/gpg.c:1291 -#, fuzzy, c-format -msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n" -msgstr "Hoiatus: ebaturvalised kataloogi igused %s \"%s\"\n" - -#: g10/gpg.c:1294 -#, 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:1297 -#, fuzzy, c-format -msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n" -msgstr "Hoiatus: ebaturvalised kataloogi igused %s \"%s\"\n" - -#: g10/gpg.c:1438 -#, fuzzy, c-format -msgid "unknown configuration item `%s'\n" -msgstr "tundmatu seade \"%s\"\n" - -#: g10/gpg.c:1531 -msgid "display photo IDs during key listings" -msgstr "" - -#: g10/gpg.c:1533 -msgid "show policy URLs during signature listings" -msgstr "" - -#: g10/gpg.c:1535 -#, fuzzy -msgid "show all notations during signature listings" -msgstr "Vastavat allkirja salajaste vtmete hoidlas pole\n" - -#: g10/gpg.c:1537 -msgid "show IETF standard notations during signature listings" -msgstr "" - -#: g10/gpg.c:1541 -msgid "show user-supplied notations during signature listings" -msgstr "" - -#: g10/gpg.c:1543 -#, fuzzy -msgid "show preferred keyserver URLs during signature listings" -msgstr "antud allkirja poliisi URL on vigane\n" - -#: g10/gpg.c:1545 -msgid "show user ID validity during key listings" -msgstr "" - -#: g10/gpg.c:1547 -msgid "show revoked and expired user IDs in key listings" -msgstr "" - -#: g10/gpg.c:1549 -msgid "show revoked and expired subkeys in key listings" -msgstr "" - -#: g10/gpg.c:1551 -#, fuzzy -msgid "show the keyring name in key listings" -msgstr "nita millisesse vtmehoidlasse nidatud vti kuulub" - -#: g10/gpg.c:1553 -#, fuzzy -msgid "show expiration dates during signature listings" -msgstr "Vastavat allkirja salajaste vtmete hoidlas pole\n" - -#: g10/gpg.c:1920 -#, c-format -msgid "NOTE: old default options file `%s' ignored\n" -msgstr "MRKUS: ignoreerin vana vaikimisi vtmete faili `%s'\n" - -#: g10/gpg.c:1962 -#, c-format -msgid "NOTE: no default option file `%s'\n" -msgstr "MRKUS: vaikimisi vtmete fail `%s' puudub\n" - -#: g10/gpg.c:1966 -#, c-format -msgid "option file `%s': %s\n" -msgstr "vtmete fail `%s': %s\n" - -#: g10/gpg.c:1973 -#, c-format -msgid "reading options from `%s'\n" -msgstr "loen vtmeid failist `%s'\n" - -#: g10/gpg.c:2188 g10/gpg.c:2814 g10/gpg.c:2833 -#, c-format -msgid "NOTE: %s is not for normal use!\n" -msgstr "MRKUS: %s ei ole tavapraseks kasutamiseks!\n" - -#: g10/gpg.c:2201 -#, fuzzy, c-format -msgid "cipher extension `%s' not loaded due to unsafe permissions\n" -msgstr "ebaturvaliste iguste tttu ei laetud ifri laiendust \"%s\"\n" - -#: g10/gpg.c:2364 g10/gpg.c:2376 -#, fuzzy, c-format -msgid "`%s' is not a valid signature expiration\n" -msgstr "%s ei ole lubatud kooditabel\n" - -#: g10/gpg.c:2452 -#, fuzzy, c-format -msgid "`%s' is not a valid character set\n" -msgstr "%s ei ole lubatud kooditabel\n" - -#: g10/gpg.c:2476 g10/gpg.c:2663 g10/keyedit.c:4064 -#, fuzzy -msgid "could not parse keyserver URL\n" -msgstr "ei saa parsida vtmeserveri URI\n" - -#: g10/gpg.c:2488 -#, fuzzy, c-format -msgid "%s:%d: invalid keyserver options\n" -msgstr "%s:%d: vigased ekspordi vtmed\n" - -#: g10/gpg.c:2491 -#, fuzzy -msgid "invalid keyserver options\n" -msgstr "vigased ekspordi vtmed\n" - -#: g10/gpg.c:2498 -#, c-format -msgid "%s:%d: invalid import options\n" -msgstr "%s:%d: vigased impordi vtmed\n" - -#: g10/gpg.c:2501 -msgid "invalid import options\n" -msgstr "vigased impordi vtmed\n" - -#: g10/gpg.c:2508 -#, c-format -msgid "%s:%d: invalid export options\n" -msgstr "%s:%d: vigased ekspordi vtmed\n" - -#: g10/gpg.c:2511 -msgid "invalid export options\n" -msgstr "vigased ekspordi vtmed\n" - -#: g10/gpg.c:2518 -#, fuzzy, c-format -msgid "%s:%d: invalid list options\n" -msgstr "%s:%d: vigased impordi vtmed\n" - -#: g10/gpg.c:2521 -#, fuzzy -msgid "invalid list options\n" -msgstr "vigased impordi vtmed\n" - -#: g10/gpg.c:2529 -msgid "display photo IDs during signature verification" -msgstr "" - -#: g10/gpg.c:2531 -msgid "show policy URLs during signature verification" -msgstr "" - -#: g10/gpg.c:2533 -#, fuzzy -msgid "show all notations during signature verification" -msgstr "%s ei ole lubatud kooditabel\n" - -#: g10/gpg.c:2535 -msgid "show IETF standard notations during signature verification" -msgstr "" - -#: g10/gpg.c:2539 -msgid "show user-supplied notations during signature verification" -msgstr "" - -#: g10/gpg.c:2541 -#, fuzzy -msgid "show preferred keyserver URLs during signature verification" -msgstr "antud allkirja poliisi URL on vigane\n" - -#: g10/gpg.c:2543 -#, fuzzy -msgid "show user ID validity during signature verification" -msgstr "%s ei ole lubatud kooditabel\n" - -#: g10/gpg.c:2545 -msgid "show revoked and expired user IDs in signature verification" -msgstr "" - -#: g10/gpg.c:2547 -msgid "validate signatures with PKA data" -msgstr "" - -#: g10/gpg.c:2549 -msgid "elevate the trust of signatures with valid PKA data" -msgstr "" - -#: g10/gpg.c:2556 -#, fuzzy, c-format -msgid "%s:%d: invalid verify options\n" -msgstr "%s:%d: vigased ekspordi vtmed\n" - -#: g10/gpg.c:2559 -#, fuzzy -msgid "invalid verify options\n" -msgstr "vigased ekspordi vtmed\n" - -#: g10/gpg.c:2566 -#, c-format -msgid "unable to set exec-path to %s\n" -msgstr "exec-path vrtuseks ei nnestu seada %s\n" - -#: g10/gpg.c:2729 -#, fuzzy, c-format -msgid "%s:%d: invalid auto-key-locate list\n" -msgstr "%s:%d: vigased ekspordi vtmed\n" - -#: g10/gpg.c:2732 -msgid "invalid auto-key-locate list\n" -msgstr "" - -#: g10/gpg.c:2803 -msgid "WARNING: program may create a core file!\n" -msgstr "HOIATUS: programm vib salvestada oma mlupildi!\n" - -#: g10/gpg.c:2807 -#, c-format -msgid "WARNING: %s overrides %s\n" -msgstr "HOIATUS: %s mrab le %s\n" - -#: g10/gpg.c:2816 -#, c-format -msgid "%s not allowed with %s!\n" -msgstr "%s ja %s ei ole koos lubatud!\n" - -#: g10/gpg.c:2819 -#, c-format -msgid "%s makes no sense with %s!\n" -msgstr "%s ja %s ei oma koos mtet!\n" - -#: g10/gpg.c:2826 -#, 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:2841 -#, fuzzy, c-format -msgid "will not run with insecure memory due to %s\n" -msgstr "kirjutan salajase vtme faili `%s'\n" - -#: g10/gpg.c:2855 -msgid "you can only make detached or clear signatures while in --pgp2 mode\n" -msgstr "" -"--pgp2 moodis saate luua ainult eraldiseisvaid vi avateksti allkirju\n" - -#: g10/gpg.c:2861 -msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n" -msgstr "--pgp2 moodis ei saa korraga allkirjastada ja krpteerida\n" - -#: g10/gpg.c:2867 -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:2880 -msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n" -msgstr "teate krpteerimine --pgp2 moodis nuab IDEA iffrit\n" - -#: g10/gpg.c:2947 g10/gpg.c:2971 -msgid "selected cipher algorithm is invalid\n" -msgstr "valitud ifri algoritm ei ole lubatud\n" - -#: g10/gpg.c:2953 g10/gpg.c:2977 -msgid "selected digest algorithm is invalid\n" -msgstr "valitud lhendi algoritm ei ole lubatud\n" - -#: g10/gpg.c:2959 -#, fuzzy -msgid "selected compression algorithm is invalid\n" -msgstr "valitud ifri algoritm ei ole lubatud\n" - -#: g10/gpg.c:2965 -msgid "selected certification digest algorithm is invalid\n" -msgstr "valitud sertifikaadi lhendi algoritm ei ole lubatud\n" - -#: g10/gpg.c:2980 -msgid "completes-needed must be greater than 0\n" -msgstr "completes-needed peab olema suurem, kui 0\n" - -#: g10/gpg.c:2982 -msgid "marginals-needed must be greater than 1\n" -msgstr "marginals-needed peab olema suurem, kui 1\n" - -#: g10/gpg.c:2984 -#, 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:2986 -msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n" -msgstr "vigane vaikimisi-sert-tase; peab olema 0, 1, 2 vi 3\n" - -#: g10/gpg.c:2988 -msgid "invalid min-cert-level; must be 1, 2, or 3\n" -msgstr "vigane min-sert-tase; peab olema 1, 2 vi 3\n" - -#: g10/gpg.c:2991 -msgid "NOTE: simple S2K mode (0) is strongly discouraged\n" -msgstr "MRKUS: lihtne S2K mood (0) ei soovitata kasutada\n" - -#: g10/gpg.c:2995 -msgid "invalid S2K mode; must be 0, 1 or 3\n" -msgstr "vigane S2K mood; peab olema 0, 1 vi 3\n" - -#: g10/gpg.c:3002 -msgid "invalid default preferences\n" -msgstr "vigased vaikimisi eelistused\n" - -#: g10/gpg.c:3011 -msgid "invalid personal cipher preferences\n" -msgstr "vigased isikliku ifri eelistused\n" - -#: g10/gpg.c:3015 -msgid "invalid personal digest preferences\n" -msgstr "vigased isikliku lhendi eelistused\n" - -#: g10/gpg.c:3019 -msgid "invalid personal compress preferences\n" -msgstr "vigased isikliku pakkimise eelistused\n" - -#: g10/gpg.c:3052 -#, c-format -msgid "%s does not yet work with %s\n" -msgstr "%s ei tta veel koos %s-ga\n" - -#: g10/gpg.c:3099 -#, 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:3104 -#, fuzzy, c-format -msgid "you may not use digest algorithm `%s' while in %s mode\n" -msgstr "snumilhendi algoritm \"%s\" ei ole moodis %s lubatud\n" - -#: g10/gpg.c:3109 -#, 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:3208 -#, c-format -msgid "failed to initialize the TrustDB: %s\n" -msgstr "TrustDB initsialiseerimine ebannestus: %s\n" - -#: g10/gpg.c:3219 -msgid "WARNING: recipients (-r) given without using public key encryption\n" -msgstr "" -"HOIATUS: mrati saajad (-r) aga ei kasutata avaliku vtme krptograafiat\n" - -#: g10/gpg.c:3230 -msgid "--store [filename]" -msgstr "--store [failinimi]" - -#: g10/gpg.c:3237 -msgid "--symmetric [filename]" -msgstr "--symmetric [failinimi]" - -#: g10/gpg.c:3239 -#, fuzzy, c-format -msgid "symmetric encryption of `%s' failed: %s\n" -msgstr "lahtikrpteerimine ebannestus: %s\n" - -#: g10/gpg.c:3249 -msgid "--encrypt [filename]" -msgstr "--encrypt [failinimi]" - -#: g10/gpg.c:3262 -#, fuzzy -msgid "--symmetric --encrypt [filename]" -msgstr "--sign --encrypt [failinimi]" - -#: g10/gpg.c:3264 -msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n" -msgstr "" - -#: g10/gpg.c:3267 -#, 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:3285 -msgid "--sign [filename]" -msgstr "--sign [failinimi]" - -#: g10/gpg.c:3298 -msgid "--sign --encrypt [filename]" -msgstr "--sign --encrypt [failinimi]" - -#: g10/gpg.c:3313 -#, fuzzy -msgid "--symmetric --sign --encrypt [filename]" -msgstr "--sign --encrypt [failinimi]" - -#: g10/gpg.c:3315 -msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n" -msgstr "" - -#: g10/gpg.c:3318 -#, 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:3338 -msgid "--sign --symmetric [filename]" -msgstr "--sign --symmetric [failinimi]" - -#: g10/gpg.c:3347 -msgid "--clearsign [filename]" -msgstr "--clearsign [failinimi]" - -#: g10/gpg.c:3372 -msgid "--decrypt [filename]" -msgstr "--decrypt [failinimi]" - -#: g10/gpg.c:3380 -msgid "--sign-key user-id" -msgstr "--sign-key kasutaja-id" - -#: g10/gpg.c:3384 -msgid "--lsign-key user-id" -msgstr "--lsign-key kasutaja-id" - -#: g10/gpg.c:3405 -msgid "--edit-key user-id [commands]" -msgstr "--edit-key kasutaja-id [ksud]" - -#: g10/gpg.c:3476 -msgid "-k[v][v][v][c] [user-id] [keyring]" -msgstr "-k[v][v][v][c] [kasutaja-id] [vtmehoidla]" - -#: g10/gpg.c:3518 -#, c-format -msgid "keyserver send failed: %s\n" -msgstr "vtmeserverile saatmine ebannestus: %s\n" - -#: g10/gpg.c:3520 -#, c-format -msgid "keyserver receive failed: %s\n" -msgstr "vtmeserverilt lugemine ebannestus: %s\n" - -#: g10/gpg.c:3522 -#, c-format -msgid "key export failed: %s\n" -msgstr "vtme eksport ebannestus: %s\n" - -#: g10/gpg.c:3533 -#, c-format -msgid "keyserver search failed: %s\n" -msgstr "vtmeserveri otsing ebannestus: %s\n" - -#: g10/gpg.c:3543 -#, c-format -msgid "keyserver refresh failed: %s\n" -msgstr "vtmeserveri uuendamine ebannestus: %s\n" - -#: g10/gpg.c:3594 -#, c-format -msgid "dearmoring failed: %s\n" -msgstr "lahtipakendamine ebannestus: %s\n" - -#: g10/gpg.c:3602 -#, c-format -msgid "enarmoring failed: %s\n" -msgstr "pakendamine ebannestus: %s\n" - -#: g10/gpg.c:3689 -#, c-format -msgid "invalid hash algorithm `%s'\n" -msgstr "vigane rsialgoritm `%s'\n" - -#: g10/gpg.c:3812 -msgid "[filename]" -msgstr "[failinimi]" - -#: g10/gpg.c:3816 -msgid "Go ahead and type your message ...\n" -msgstr "Kirjutage nd oma teade ...\n" - -#: g10/gpg.c:4120 -msgid "the given certification policy URL is invalid\n" -msgstr "antud sertifikaadi poliisi URL on vigane\n" - -#: g10/gpg.c:4122 -msgid "the given signature policy URL is invalid\n" -msgstr "antud allkirja poliisi URL on vigane\n" - -#: g10/gpg.c:4155 -#, 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 vtmete puhvris on liiga palju vtmeid - 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 vti %08lX muudeti kehtivaks vtme --allow-non-selfsigned-uid " -"kasutamisega\n" - -#: g10/getkey.c:2380 g10/keyedit.c:3707 -#, fuzzy, c-format -msgid "no secret subkey for public subkey %s - ignoring\n" -msgstr "avalikul alamvtmel %08lX puudub salajane alamvti - ignoreerin\n" - -#: g10/getkey.c:2611 -#, fuzzy, c-format -msgid "using subkey %s instead of primary key %s\n" -msgstr "kasutan sekundaarset vtit %08lX primaarse vtme %08lX asemel\n" - -#: g10/getkey.c:2658 -#, fuzzy, c-format -msgid "key %s: secret key without public key - skipped\n" -msgstr "vti %08lX: salajane vti avaliku vtmeta - jtsin vahele\n" - -#: g10/gpgv.c:74 -msgid "be somewhat more quiet" -msgstr "ole mnevrra vaiksem" - -#: g10/gpgv.c:75 -msgid "take the keys from this keyring" -msgstr "vta vtmed sellest vtmehoidlast" - -#: 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 [vtmed] [failid] (-h nitab abiinfot)" - -#: g10/gpgv.c:105 -msgid "" -"Syntax: gpg [options] [files]\n" -"Check signatures against known trusted keys\n" -msgstr "" -"Sntaks: gpg [vtmed] [failid]\n" -"kontrolli allkirju tuntud usaldusvrsete vtmetega\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 nd vrtus; seda vrtust ei avalikustata\n" -"kolmandatele pooltele. Seda vrtust on vaja et realiseerida usaldusvrk." - -#: 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 vrgu loomiseks peab GnuPG teadma, millised vtmed on\n" -"absoluutselt usaldatavad. Need on tavaliselt vtmed, mille puhul\n" -"on teil juurdeps ka nende salajastele vtmetele. Kui soovite\n" -"mrata seda vtit 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 vtit, 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 mte kasutada sama vtit allkirjastamiseks ja\n" -"krpteerimiseks. 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 vtmepikkus" - -#: 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\" vi \"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 nutav vrtus, nagu viibal nidati.\n" -"Vimalik on ka sisestada ISO kuupev (AAAA-KK-PP), aga te ei\n" -"saa korrektset veateadet, kuna ssteem ritab antud vrtust\n" -"tlgendada vahemikuna." - -#: g10/helptext.c:117 -msgid "Enter the name of the key holder" -msgstr "Sisestage vtmehoidja 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 vga soovitav" - -#: g10/helptext.c:126 -msgid "Please enter an optional comment" -msgstr "Te vite nd 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 jtkata vtme loomist.\n" -"V et lpetada vtme loomine." - -#: g10/helptext.c:140 -msgid "Answer \"yes\" (or just \"y\") if it is okay to generate the sub key." -msgstr "Vastake \"jah\" (vi \"j\"), kui vib alustada alamvtme 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 vtme kasutaja ID, kontrollige kigepealt, kas vti\n" -"ikka kuulub antud ID-ga nidatud isikule. Teistel inimestel on hea teada,\n" -"kui hoolikalt te seda kontrolli olete teostanud.\n" -"\n" -"\"0\" thendab, et te ei vida oma kontrollimise kohta midagi.\n" -"\n" -"\"1\" thendab, et te usute, et vtit omab isik, kes seda vidab omavat, " -"kuid\n" -" te ei saanud vi ei soovinud seda videt tiendavalt kontrollida. See\n" -" on kasulik \"persooni\" kontrolliks, kui te allkirjastate isiku pseudo-\n" -" nmi vtit.\n" -"\n" -"\"2\" thendab, et te teostasite vtme pealiskaudset kontrolli. See vib\n" -" niteks thendada, et te kontrollisite vtme srmejlge ja " -"kontrollisite\n" -" vtme kasutaja ID foto ID vastu.\n" -"\n" -"\"3\" thendab, et te teostasite vtme phjalikku kontrolli. See vib " -"niteks\n" -" thendada, et vrdlesite vtme srmejlge vrme omanikuga otse suheldes\n" -" ja et te kontrollisite raskesti vltsitavast allikast (nt. pass) et\n" -" vtme omaniku nimi vastab vtmel nidatud kasutaja IDle ja te kontrol-\n" -" lisite, et vtmel nidatud e-posti aadress kuulub vtme omanikule.\n" -"\n" -"pange thele, et nited tasemete 2 ja 3 juures on *ainult* nited. Sltub\n" -"ainult teist, milline on \"pealiskaudse\" ja \"phjaliku\" kontrolli " -"thendus,\n" -"kui te allkirjastate teisi vtmeid.\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 KIK 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 testi 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 alamvtme vib 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 vtme kehtiv allkiri; tavaliselt seda ei soovita kustutada,\n" -"kuna see allkiri vib olla vajalik, et kirjeldada antud vtme vi\n" -"antud vtmega sertifitseeritud teise vtme 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 vti.\n" -"Te peaksite peatama kustutamise, kuni on teada, millist vtit see\n" -"kasutab, sest see vti vib moodustada usaldussuhte lbi mne juba\n" -"sertifitseeritud vtme." - -#: 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 mistlik see vtmehoidlast 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 vtmega. Sellist allkirja ei ole\n" -"ldiselt soovitatav eemaldada. Peale selle kustutamist ei pruugi\n" -"GnuPG enam olla vimeline seda vtit leidma. Kustutada viks\n" -"vaid siis, kui see allkiri ei ole miskiprast kehtiv ja on\n" -"olemas ka teine allkiri, mis kasutajat vtmega 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 kikide kasutaja ID-de seaded (vi ainult valitud)\n" -"vastavaks hetkel mratud seadetele. Kikide asjasse puutuvate\n" -"ise loodud allkirjade ajatempleid suurendatakse he sekundi vrra.\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 vib 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 mrama sertifitseerimise phjuse. Sltuvalt kontekstist on\n" -"teil vimalus valida ks jrgnevaist:\n" -" \"Vti on kompromiteeritud\"\n" -" Kasutage seda, kui teil on phjust uskuda, et autoriseerimata\n" -" isikud on saanud juurdepsu teie salajasele vtmele.\n" -" \"Vti on asendatud\"\n" -" Kasutage seda, kui te olete selle vtme asendanud uuemaga.\n" -" \"Vti ei ole enam kasutusel\"\n" -" Kasutage seda, kui te ei kasuta enam seda vtit.\n" -" \"Kasutaja ID ei ole enam kehtiv\"\n" -" Kasutage seda mrkimaks, et konkreetset kasutaja ID ei peaks enam\n" -" kasutama; seda kasutatakse tavaliselt mrkimaks 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, vite nd sisestada phjenduse, miks te\n" -"soovite seda thistamise sertifikaati esitada. Palun kirjutage\n" -"lhidalt. Thi rida lpetab 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 vti ei sobi salajase vtmega!\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 vti" - -#: g10/import.c:108 -msgid "remove as much as possible from key after import" -msgstr "" - -#: g10/import.c:266 -#, c-format -msgid "skipping block of type %d\n" -msgstr "jtan bloki tbiga %d vahele\n" - -#: g10/import.c:275 -#, fuzzy, c-format -msgid "%lu keys processed so far\n" -msgstr "%lu vtit on seni tdeldud\n" - -#: g10/import.c:292 -#, c-format -msgid "Total number processed: %lu\n" -msgstr "Tdeldud kokku: %lu\n" - -#: g10/import.c:294 -#, c-format -msgid " skipped new keys: %lu\n" -msgstr " vahele jetud uusi vtmeid: %lu\n" - -#: g10/import.c:297 -#, c-format -msgid " w/o user IDs: %lu\n" -msgstr " puudub kasutaja ID: %lu\n" - -#: g10/import.c:299 -#, c-format -msgid " imported: %lu" -msgstr " imporditud: %lu" - -#: g10/import.c:305 -#, c-format -msgid " unchanged: %lu\n" -msgstr " muutmata: %lu\n" - -#: g10/import.c:307 -#, c-format -msgid " new user IDs: %lu\n" -msgstr " uusi kasutajaid: %lu\n" - -#: g10/import.c:309 -#, c-format -msgid " new subkeys: %lu\n" -msgstr " uusi alamvtmeid: %lu\n" - -#: g10/import.c:311 -#, c-format -msgid " new signatures: %lu\n" -msgstr " uusi allkirju: %lu\n" - -#: g10/import.c:313 -#, c-format -msgid " new key revocations: %lu\n" -msgstr " uusi thistamisi: %lu\n" - -#: g10/import.c:315 -#, c-format -msgid " secret keys read: %lu\n" -msgstr " loetud salajasi vtmeid: %lu\n" - -#: g10/import.c:317 -#, c-format -msgid " secret keys imported: %lu\n" -msgstr " salajasi vtmeid imporditud: %lu\n" - -#: g10/import.c:319 -#, c-format -msgid " secret keys unchanged: %lu\n" -msgstr " muutmata salajasi vtmeid: %lu\n" - -#: g10/import.c:321 -#, c-format -msgid " not imported: %lu\n" -msgstr " pole imporditud: %lu\n" - -#: g10/import.c:323 -#, fuzzy, c-format -msgid " signatures cleaned: %lu\n" -msgstr " uusi allkirju: %lu\n" - -#: g10/import.c:325 -#, fuzzy, c-format -msgid " user IDs cleaned: %lu\n" -msgstr " loetud salajasi vtmeid: %lu\n" - -#: g10/import.c:566 -#, 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:570 -#, fuzzy -msgid " algorithms on these user IDs:\n" -msgstr "Te olete allkirjastanud jrgnevad kasutaja IDd:\n" - -#: g10/import.c:607 -#, c-format -msgid " \"%s\": preference for cipher algorithm %s\n" -msgstr "" - -#: g10/import.c:619 -#, fuzzy, c-format -msgid " \"%s\": preference for digest algorithm %s\n" -msgstr "%s allkiri, snumilhendi algoritm %s\n" - -#: g10/import.c:631 -#, c-format -msgid " \"%s\": preference for compression algorithm %s\n" -msgstr "" - -#: g10/import.c:644 -msgid "it is strongly suggested that you update your preferences and\n" -msgstr "" - -#: g10/import.c:646 -msgid "re-distribute this key to avoid potential algorithm mismatch problems\n" -msgstr "" - -#: g10/import.c:670 -#, c-format -msgid "you can update your preferences with: gpg --edit-key %s updpref save\n" -msgstr "" - -#: g10/import.c:720 g10/import.c:1118 -#, fuzzy, c-format -msgid "key %s: no user ID\n" -msgstr "vti %08lX: kasutaja ID puudub\n" - -#: g10/import.c:749 -#, fuzzy, c-format -msgid "key %s: PKS subkey corruption repaired\n" -msgstr "vti %08lX: HKP alamvtme rike parandatud\n" - -#: g10/import.c:764 -#, fuzzy, c-format -msgid "key %s: accepted non self-signed user ID \"%s\"\n" -msgstr "" -"vti %08lX: aktsepteerisin iseenda poolt allakirjutamata kasutaja ID '%s'\n" - -#: g10/import.c:770 -#, fuzzy, c-format -msgid "key %s: no valid user IDs\n" -msgstr "vti %08lX: puudub kehtiv kasutaja ID\n" - -#: g10/import.c:772 -msgid "this may be caused by a missing self-signature\n" -msgstr "see vib olla phjustatud puuduvast iseenda allkirjast\n" - -#: g10/import.c:782 g10/import.c:1240 -#, fuzzy, c-format -msgid "key %s: public key not found: %s\n" -msgstr "vti %08lX: avalikku vtit ei leitud: %s\n" - -#: g10/import.c:788 -#, fuzzy, c-format -msgid "key %s: new key - skipped\n" -msgstr "vti %08lX: uus vti - jtsin vahele\n" - -#: g10/import.c:797 -#, c-format -msgid "no writable keyring found: %s\n" -msgstr "ei leia kirjutatavat vtmehoidlat: %s\n" - -#: g10/import.c:802 g10/openfile.c:267 g10/sign.c:831 g10/sign.c:1135 -#, c-format -msgid "writing to `%s'\n" -msgstr "kirjutan faili `%s'\n" - -#: g10/import.c:806 g10/import.c:901 g10/import.c:1158 g10/import.c:1301 -#: g10/import.c:2363 g10/import.c:2385 -#, c-format -msgid "error writing keyring `%s': %s\n" -msgstr "viga vtmehoidlasse `%s' kirjutamisel: %s\n" - -#: g10/import.c:825 -#, fuzzy, c-format -msgid "key %s: public key \"%s\" imported\n" -msgstr "vti %08lX: avalik vti \"%s\" on imporditud\n" - -#: g10/import.c:849 -#, fuzzy, c-format -msgid "key %s: doesn't match our copy\n" -msgstr "vti %08lX: ei sobi meie koopiaga\n" - -#: g10/import.c:866 g10/import.c:1258 -#, fuzzy, c-format -msgid "key %s: can't locate original keyblock: %s\n" -msgstr "vti %08lX: ei leia algset vtmeblokki: %s\n" - -#: g10/import.c:874 g10/import.c:1265 -#, fuzzy, c-format -msgid "key %s: can't read original keyblock: %s\n" -msgstr "vti %08lX: ei nnestu lugeda algset vtmeblokki: %s\n" - -#: g10/import.c:911 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new user ID\n" -msgstr "vti %08lX: \"%s\" 1 uus kasutaja ID\n" - -#: g10/import.c:914 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new user IDs\n" -msgstr "vti %08lX: \"%s\" %d uut kasutaja IDd\n" - -#: g10/import.c:917 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new signature\n" -msgstr "vti %08lX: \"%s\" 1 uus allkiri\n" - -#: g10/import.c:920 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new signatures\n" -msgstr "vti %08lX: \"%s\" %d uut allkirja\n" - -#: g10/import.c:923 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new subkey\n" -msgstr "vti %08lX: \"%s\" 1 uus alamvti\n" - -#: g10/import.c:926 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new subkeys\n" -msgstr "vti %08lX: \"%s\" %d uut alamvtit\n" - -#: g10/import.c:929 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signature cleaned\n" -msgstr "vti %08lX: \"%s\" %d uut allkirja\n" - -#: g10/import.c:932 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signatures cleaned\n" -msgstr "vti %08lX: \"%s\" %d uut allkirja\n" - -#: g10/import.c:935 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d user ID cleaned\n" -msgstr "vti %08lX: \"%s\" %d uut kasutaja IDd\n" - -#: g10/import.c:938 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d user IDs cleaned\n" -msgstr "vti %08lX: \"%s\" %d uut kasutaja IDd\n" - -#: g10/import.c:961 -#, fuzzy, c-format -msgid "key %s: \"%s\" not changed\n" -msgstr "vti %08lX: \"%s\" ei muudetud\n" - -#: g10/import.c:1124 -#, fuzzy, c-format -msgid "key %s: secret key with invalid cipher %d - skipped\n" -msgstr "vti %08lX: salajane vti vigase ifriga %d - jtsin vahele\n" - -#: g10/import.c:1135 -#, fuzzy -msgid "importing secret keys not allowed\n" -msgstr "kirjutan salajase vtme faili `%s'\n" - -#: g10/import.c:1152 g10/import.c:2378 -#, c-format -msgid "no default secret keyring: %s\n" -msgstr "puudub salajaste vtmete vaikimisi vtmehoidla: %s\n" - -#: g10/import.c:1163 -#, fuzzy, c-format -msgid "key %s: secret key imported\n" -msgstr "vti %08lX: salajane vti on imporditud\n" - -#: g10/import.c:1193 -#, fuzzy, c-format -msgid "key %s: already in secret keyring\n" -msgstr "vti %08lX: on juba salajaste vtmete hoidlas\n" - -#: g10/import.c:1203 -#, fuzzy, c-format -msgid "key %s: secret key not found: %s\n" -msgstr "vti %08lX: salajast vtit ei leitud: %s\n" - -#: g10/import.c:1233 -#, fuzzy, c-format -msgid "key %s: no public key - can't apply revocation certificate\n" -msgstr "" -"vti %08lX: avalik vti puudub - thistamise sertifikaati ei saa rakendada\n" - -#: g10/import.c:1276 -#, fuzzy, c-format -msgid "key %s: invalid revocation certificate: %s - rejected\n" -msgstr "vti %08lX: vigane thistamise sertifikaat: %s - lkkasin tagasi\n" - -#: g10/import.c:1308 -#, fuzzy, c-format -msgid "key %s: \"%s\" revocation certificate imported\n" -msgstr "vti %08lX: \"%s\" thistamise sertifikaat imporditud\n" - -#: g10/import.c:1374 -#, fuzzy, c-format -msgid "key %s: no user ID for signature\n" -msgstr "vti %08lX: allkirjal puudub kasutaja ID\n" - -#: g10/import.c:1389 -#, fuzzy, c-format -msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n" -msgstr "vti %08lX: mittetoetatud avaliku vtme algoritm kasutajaga \"%s\"\n" - -#: g10/import.c:1391 -#, fuzzy, c-format -msgid "key %s: invalid self-signature on user ID \"%s\"\n" -msgstr "vti %08lX: kasutajal \"%s\" on vigane iseenda allkiri\n" - -#: g10/import.c:1409 -#, fuzzy, c-format -msgid "key %s: no subkey for key binding\n" -msgstr "vti %08lX: vtmeseosel puudub alamvti\n" - -#: g10/import.c:1420 g10/import.c:1470 -#, fuzzy, c-format -msgid "key %s: unsupported public key algorithm\n" -msgstr "vti %08lX: mittetoetatud avaliku vtme algoritm\n" - -#: g10/import.c:1422 -#, fuzzy, c-format -msgid "key %s: invalid subkey binding\n" -msgstr "vti %08lX: vigane alamvtme seos\n" - -#: g10/import.c:1437 -#, fuzzy, c-format -msgid "key %s: removed multiple subkey binding\n" -msgstr "vti %08lX: vigane mitme alamvtme seos\n" - -#: g10/import.c:1459 -#, fuzzy, c-format -msgid "key %s: no subkey for key revocation\n" -msgstr "vti %08lX: vtme thistamiseks puudub alamvti\n" - -#: g10/import.c:1472 -#, fuzzy, c-format -msgid "key %s: invalid subkey revocation\n" -msgstr "vti %08lX: vigane alamvtme thistamine\n" - -#: g10/import.c:1487 -#, fuzzy, c-format -msgid "key %s: removed multiple subkey revocation\n" -msgstr "vti %08lX: eemaldasin mitme alamvtme thistamise\n" - -#: g10/import.c:1529 -#, fuzzy, c-format -msgid "key %s: skipped user ID \"%s\"\n" -msgstr "vti %08lX: jtsin vahele kasutaja ID '" - -#: g10/import.c:1550 -#, fuzzy, c-format -msgid "key %s: skipped subkey\n" -msgstr "vti %08lX: jtsin alamvtme vahele\n" - -#: g10/import.c:1577 -#, fuzzy, c-format -msgid "key %s: non exportable signature (class 0x%02X) - skipped\n" -msgstr "vti %08lX: mitte eksporditav allkiri (klass %02x) - jtan vahele\n" - -#: g10/import.c:1587 -#, fuzzy, c-format -msgid "key %s: revocation certificate at wrong place - skipped\n" -msgstr "vti %08lX: thistamise sertifikaat on vales kohas - jtan vahele\n" - -#: g10/import.c:1604 -#, fuzzy, c-format -msgid "key %s: invalid revocation certificate: %s - skipped\n" -msgstr "vti %08lX: vigane thistamise sertifikaat: %s - jtan vahele\n" - -#: g10/import.c:1618 -#, fuzzy, c-format -msgid "key %s: subkey signature in wrong place - skipped\n" -msgstr "vti %08lX: alamvtme allkiri on vales kohas - jtan vahele\n" - -#: g10/import.c:1626 -#, fuzzy, c-format -msgid "key %s: unexpected signature class (0x%02X) - skipped\n" -msgstr "vti %08lX: ootamatu allkirja klass (0x%02x) - jtan vahele\n" - -#: g10/import.c:1726 -#, fuzzy, c-format -msgid "key %s: duplicated user ID detected - merged\n" -msgstr "vti %08lX: tuvastasin dubleeritud kasutaja ID - mestisin\n" - -#: g10/import.c:1788 -#, fuzzy, c-format -msgid "WARNING: key %s may be revoked: fetching revocation key %s\n" -msgstr "" -"HOIATUS: vti %08lX vib olla thistatud: laen thistamise vtit %08lX\n" - -#: g10/import.c:1802 -#, fuzzy, c-format -msgid "WARNING: key %s may be revoked: revocation key %s not present.\n" -msgstr "" -"HOIATUS: vti %08lX vib olla thistatud: thistamise vtit %08lX pole.\n" - -#: g10/import.c:1861 -#, fuzzy, c-format -msgid "key %s: \"%s\" revocation certificate added\n" -msgstr "vti %08lX: \"%s\" thistamise sertifikaat lisatud\n" - -#: g10/import.c:1895 -#, fuzzy, c-format -msgid "key %s: direct key signature added\n" -msgstr "vti %08lX: lisatud vahetu vtme allkiri\n" - -#: g10/import.c:2284 -#, fuzzy -msgid "NOTE: a key's S/N does not match the card's one\n" -msgstr "avalik vti ei sobi salajase vtmega!\n" - -#: g10/import.c:2292 -#, fuzzy -msgid "NOTE: primary key is online and stored on card\n" -msgstr "jtsin vahele: avalik vti on juba olemas\n" - -#: g10/import.c:2294 -#, fuzzy -msgid "NOTE: secondary key is online and stored on card\n" -msgstr "jtsin vahele: avalik vti on juba olemas\n" - -#: g10/keydb.c:168 -#, c-format -msgid "error creating keyring `%s': %s\n" -msgstr "viga vtmehoidla `%s' loomisel: %s\n" - -#: g10/keydb.c:175 -#, c-format -msgid "keyring `%s' created\n" -msgstr "vtmehoidla `%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 "vtmehoidla vahemlu uuesti loomine ebannestus: %s\n" - -#: g10/keyedit.c:266 -msgid "[revocation]" -msgstr "[thistamine]" - -#: 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 ji testimata, kuna vti 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 ji testimata, kuna vtmed puuduvad\n" - -#: g10/keyedit.c:353 g10/keylist.c:398 -msgid "1 signature not checked due to an error\n" -msgstr "1 allkiri ji vea tttu kontrollimata\n" - -#: g10/keyedit.c:355 g10/keylist.c:400 -#, c-format -msgid "%d signatures not checked due to errors\n" -msgstr "%d allkirja ji vigade tttu 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, kuivrd te usaldate seda kasutajat\n" -"teiste kasutajate vtmete kontrollimisel (kontrollige\n" -"passe, kontrollige erinevatest allikatest npujlgi...)?\n" -"\n" - -#: g10/keyedit.c:419 g10/pkclist.c:275 -#, fuzzy, c-format -msgid " %d = I trust marginally\n" -msgstr " %d = Usaldan vhesel mral\n" - -#: g10/keyedit.c:420 g10/pkclist.c:277 -#, fuzzy, c-format -msgid " %d = I trust fully\n" -msgstr " %d = Usaldan tiesti\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 thistatud." - -#: 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 testi? " - -#: 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 tielikuks 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 vtmega %08lX\n" - -#: g10/keyedit.c:783 -#, fuzzy, c-format -msgid "\"%s\" was already signed by key %s\n" -msgstr "\"%s\" on juba allkirjastatud vtmega %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 "Vtmega %08lX pole midagi allkirjastada\n" - -#: g10/keyedit.c:825 -msgid "This key has expired!" -msgstr "See vti on aegunud!" - -#: g10/keyedit.c:843 -#, c-format -msgid "This key is due to expire on %s.\n" -msgstr "See vti 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 vtmele OpenPGP allkirja anda.\n" - -#: g10/keyedit.c:891 -msgid "This would make the key unusable in PGP 2.x.\n" -msgstr "See muudab vtme 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 vti, 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 vga 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 testi kindel, et soovite seda vtit oma\n" -"vtmega 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 mrgita 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 mrgita kehtetuks mitte-tunnistatavaks.\n" - -#: g10/keyedit.c:988 -#, fuzzy -msgid "The signature will be marked as non-exportable.\n" -msgstr "" -"\n" -"Allkiri mrgitakse mitte-eksporditavaks.\n" - -#: g10/keyedit.c:995 -#, fuzzy -msgid "The signature will be marked as non-revocable.\n" -msgstr "" -"\n" -"Allkiri mrgitakse 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 vtit ldse kontrollinud.\n" - -#: g10/keyedit.c:1007 -#, fuzzy -msgid "I have checked this key casually.\n" -msgstr "" -"\n" -"Ma olen seda vtit kontrollinud ainult pealiskaudselt.\n" - -#: g10/keyedit.c:1012 -#, fuzzy -msgid "I have checked this key very carefully.\n" -msgstr "" -"\n" -"Ma olen kontrollinud seda vtit vga hoolikalt.\n" - -#: g10/keyedit.c:1022 -#, fuzzy -msgid "Really sign? (y/N) " -msgstr "Allkirjastan testi? " - -#: g10/keyedit.c:1067 g10/keyedit.c:4783 g10/keyedit.c:4874 g10/keyedit.c:4938 -#: g10/keyedit.c:4999 g10/sign.c:352 -#, c-format -msgid "signing failed: %s\n" -msgstr "allkirjastamine ebannestus: %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 vti 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 vtme salajased komponendid ei ole kttesaadavad.\n" - -#: g10/keyedit.c:1151 g10/keygen.c:3202 -#, fuzzy -msgid "Secret parts of primary key are stored on-card.\n" -msgstr "Primaarse vtme salajased komponendid ei ole kttesaadavad.\n" - -#: g10/keyedit.c:1155 g10/keygen.c:3206 -msgid "Key is protected.\n" -msgstr "Vti on kaitstud.\n" - -#: g10/keyedit.c:1179 -#, c-format -msgid "Can't edit this key: %s\n" -msgstr "Seda vtit ei nnestu toimetada: %s\n" - -#: g10/keyedit.c:1185 -msgid "" -"Enter the new passphrase for this secret key.\n" -"\n" -msgstr "" -"Sisestage sellele salajasele vtmele 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 tenoliselt *halb* idee!\n" -"\n" - -#: g10/keyedit.c:1202 -#, fuzzy -msgid "Do you really want to do this? (y/N) " -msgstr "Kas te testi soovite seda teha? " - -#: g10/keyedit.c:1273 -msgid "moving a key signature to the correct place\n" -msgstr "tstan vtme allkirja igesse kohta\n" - -#: g10/keyedit.c:1359 -msgid "save and quit" -msgstr "salvesta ja vlju" - -#: g10/keyedit.c:1362 -#, fuzzy -msgid "show key fingerprint" -msgstr "nita srmejlge" - -#: g10/keyedit.c:1363 -msgid "list key and user IDs" -msgstr "nita vtit 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 "thista 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 vti 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 vti" - -#: g10/keyedit.c:1408 -msgid "add a revocation key" -msgstr "lisa thistamise vti" - -#: g10/keyedit.c:1410 -#, fuzzy -msgid "delete signatures from the selected user IDs" -msgstr "Kas uuendan testi kik kasutaja ID-de seaded? " - -#: g10/keyedit.c:1412 -#, fuzzy -msgid "change the expiration date for the key or selected subkeys" -msgstr "v3 vtme aegumise aega ei saa muuta.\n" - -#: g10/keyedit.c:1414 -#, fuzzy -msgid "flag the selected user ID as primary" -msgstr "mrgi kasutaja ID primaarseks" - -#: g10/keyedit.c:1416 -#, fuzzy -msgid "toggle between the secret and public key listings" -msgstr "llita salajaste vi avalike vtmete loendi vahel" - -#: g10/keyedit.c:1419 -msgid "list preferences (expert)" -msgstr "nita eelistusi (ekspert)" - -#: g10/keyedit.c:1421 -msgid "list preferences (verbose)" -msgstr "nita eelistusi (detailsena)" - -#: g10/keyedit.c:1423 -#, fuzzy -msgid "set preference list for the selected user IDs" -msgstr "Kas uuendan testi kik kasutaja ID-de seaded? " - -#: g10/keyedit.c:1428 -#, fuzzy -msgid "set the preferred keyserver URL for the selected user IDs" -msgstr "ei saa parsida vtmeserveri URI\n" - -#: g10/keyedit.c:1430 -#, fuzzy -msgid "set a notation for the selected user IDs" -msgstr "Kas uuendan testi kik 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 thistan testi kik valitud kasutaja IDd? " - -#: g10/keyedit.c:1440 -#, fuzzy -msgid "revoke selected user IDs" -msgstr "thista kasutaja ID" - -#: g10/keyedit.c:1445 -#, fuzzy -msgid "revoke key or selected subkeys" -msgstr "thista sekundaarne vti" - -#: g10/keyedit.c:1446 -#, fuzzy -msgid "enable key" -msgstr "luba vti" - -#: g10/keyedit.c:1447 -#, fuzzy -msgid "disable key" -msgstr "blokeeri vti" - -#: g10/keyedit.c:1448 -#, fuzzy -msgid "show selected photo IDs" -msgstr "nita 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 vtmebloki `%s' lugemisel: %s\n" - -#: g10/keyedit.c:1588 -msgid "Secret key is available.\n" -msgstr "Salajane vti on kasutatav.\n" - -#: g10/keyedit.c:1669 -msgid "Need the secret key to do this.\n" -msgstr "Selle tegamiseks on vaja salajast vtit.\n" - -#: g10/keyedit.c:1677 -msgid "Please use the command \"toggle\" first.\n" -msgstr "Palun kasutage kigepealt ksku \"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 "Vti on thistatud." - -#: g10/keyedit.c:1755 -#, fuzzy -msgid "Really sign all user IDs? (y/N) " -msgstr "Kas allkirjastan testi kik 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 ksklus 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 vhemalt 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 testi kik kasutaja IDd? " - -#: g10/keyedit.c:1821 -#, fuzzy -msgid "Really remove this user ID? (y/N) " -msgstr "Kas eemaldan testi selle kasutaja ID? " - -#: g10/keyedit.c:1871 -#, fuzzy -msgid "Really move the primary key? (y/N) " -msgstr "Kas eemaldan testi selle kasutaja ID? " - -#: g10/keyedit.c:1883 -#, fuzzy -msgid "You must select exactly one key.\n" -msgstr "Te peata valima vhemalt he vtme.\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 vtmehoidla `%s' loomisel: %s\n" - -#: g10/keyedit.c:1966 -msgid "You must select at least one key.\n" -msgstr "Te peata valima vhemalt he vtme.\n" - -#: g10/keyedit.c:1969 -#, fuzzy -msgid "Do you really want to delete the selected keys? (y/N) " -msgstr "Kas te testi soovite valitud vtmeid kustutada? " - -#: g10/keyedit.c:1970 -#, fuzzy -msgid "Do you really want to delete this key? (y/N) " -msgstr "Kas te testi soovite seda vtit kustutada? " - -#: g10/keyedit.c:2005 -#, fuzzy -msgid "Really revoke all selected user IDs? (y/N) " -msgstr "Kas thistan testi kik valitud kasutaja IDd? " - -#: g10/keyedit.c:2006 -#, fuzzy -msgid "Really revoke this user ID? (y/N) " -msgstr "Kas thistan testi selle kasutaja ID? " - -#: g10/keyedit.c:2024 -#, fuzzy -msgid "Do you really want to revoke the entire key? (y/N) " -msgstr "Kas te testi soovite seda vtit thistada? " - -#: g10/keyedit.c:2035 -#, fuzzy -msgid "Do you really want to revoke the selected subkeys? (y/N) " -msgstr "Kas te testi soovite valitud vtmeid thistada? " - -#: g10/keyedit.c:2037 -#, fuzzy -msgid "Do you really want to revoke this subkey? (y/N) " -msgstr "Kas te testi soovite seda vtit thistada? " - -#: 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 testi kik kasutaja ID-de seaded? " - -#: g10/keyedit.c:2137 -#, fuzzy -msgid "Really update the preferences? (y/N) " -msgstr "Kas testi 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 "Vljun salvestamata? " - -#: g10/keyedit.c:2218 -#, c-format -msgid "update failed: %s\n" -msgstr "uuendamine ebannestus: %s\n" - -#: g10/keyedit.c:2225 -#, c-format -msgid "update secret failed: %s\n" -msgstr "salajase vtme uuendamine ebannestus: %s\n" - -#: g10/keyedit.c:2232 -msgid "Key not changed so no update needed.\n" -msgstr "Vtit ei muudetud, seega pole uuendamist vaja.\n" - -#: g10/keyedit.c:2333 -msgid "Digest: " -msgstr "Teatelhend: " - -#: 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 vtme vib olla thistanud %s vti " - -#: g10/keyedit.c:2710 -#, fuzzy, c-format -msgid "This key may be revoked by %s key %s" -msgstr "Selle vtme vib olla thistanud %s vti " - -#: 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 "[thistatud] " - -#: 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 vti 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 thele panna et kuni te pole programmi uuesti kivitanud, ei pruugi\n" -"nidatud vtme 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 "[thistatud] " - -#: 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 mrgitud primaarseks. See ksklus vib\n" -" phjustada muu kasutaja ID primaarseks mramist.\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 vti. Foto ID lisamine vib sundida mningaid\n" -" PGP versioone seda vtit tagasi lkkama.\n" - -#: g10/keyedit.c:3016 g10/keyedit.c:3346 -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 vtmele 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 testi 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:3249 -#, fuzzy, c-format -msgid "User ID \"%s\": already clean\n" -msgstr "kasutaja ID \"%s\" on juba thistatud\n" - -#: g10/keyedit.c:3341 -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 vti. Mratud thistaja lisamine vib\n" -" phjustada mningaid PGP versioone seda vtit tagasi lkkama.\n" - -#: g10/keyedit.c:3352 -msgid "You may not add a designated revoker to a PGP 2.x-style key.\n" -msgstr "PGP 2.x-stiili vtmele ei saa mratud thistajat lisada.\n" - -#: g10/keyedit.c:3372 -msgid "Enter the user ID of the designated revoker: " -msgstr "Sisestage mratud thistaja kasutaja ID: " - -#: g10/keyedit.c:3397 -msgid "cannot appoint a PGP 2.x style key as a designated revoker\n" -msgstr "PGP 2.x stiilis vtit ei saa nimetada mratud thistajaks\n" - -#: g10/keyedit.c:3412 -msgid "you cannot appoint a key as its own designated revoker\n" -msgstr "te ei saa nimetada vtit iseenda mratud thistajaks\n" - -#: g10/keyedit.c:3434 -#, fuzzy -msgid "this key has already been designated as a revoker\n" -msgstr "HOIATUS: See vti on mratud thistaja poolt thistatud!\n" - -#: g10/keyedit.c:3453 -msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n" -msgstr "HOIATUS: vtme seadmist mratud thistajaks ei saa tagasi vtta!\n" - -#: g10/keyedit.c:3459 -#, fuzzy -msgid "" -"Are you sure you want to appoint this key as a designated revoker? (y/N) " -msgstr "" -"Olete kindel, et soovite seda vtit seada mratud thistajaks? (j/E): " - -#: g10/keyedit.c:3520 -msgid "Please remove selections from the secret keys.\n" -msgstr "Palun eemaldage salajastelt vtmetelt valikud.\n" - -#: g10/keyedit.c:3526 -#, fuzzy -msgid "Please select at most one subkey.\n" -msgstr "palun valige limalt ks sekundaarne vti.\n" - -#: g10/keyedit.c:3530 -#, fuzzy -msgid "Changing expiration time for a subkey.\n" -msgstr "Muudan sekundaarse vtme aegumise aega.\n" - -#: g10/keyedit.c:3533 -msgid "Changing expiration time for the primary key.\n" -msgstr "Muudan primaarse vtme aegumise aega.\n" - -#: g10/keyedit.c:3579 -msgid "You can't change the expiration date of a v3 key\n" -msgstr "v3 vtme aegumise aega ei saa muuta.\n" - -#: g10/keyedit.c:3595 -msgid "No corresponding signature in secret ring\n" -msgstr "Vastavat allkirja salajaste vtmete hoidlas pole\n" - -#: g10/keyedit.c:3668 -#, fuzzy, c-format -msgid "signing subkey %s is already cross-certified\n" -msgstr "HOIATUS: allkirjastamise alamvti %08lX ei ole rist-sertifitseeritud\n" - -#: g10/keyedit.c:3674 -#, c-format -msgid "subkey %s does not sign and so does not need to be cross-certified\n" -msgstr "" - -#: g10/keyedit.c:3836 -msgid "Please select exactly one user ID.\n" -msgstr "Palun valige tpselt ks kasutaja ID.\n" - -#: g10/keyedit.c:3875 g10/keyedit.c:3985 g10/keyedit.c:4105 g10/keyedit.c:4246 -#, fuzzy, c-format -msgid "skipping v3 self-signature on user ID \"%s\"\n" -msgstr "jtan kasutaja \"%s\" v3 iseenda allkirja vahele\n" - -#: g10/keyedit.c:4046 -msgid "Enter your preferred keyserver URL: " -msgstr "" - -#: g10/keyedit.c:4126 -#, fuzzy -msgid "Are you sure you want to replace it? (y/N) " -msgstr "Olete kindel, et soovite seda kasutada (j/E)? " - -#: g10/keyedit.c:4127 -#, fuzzy -msgid "Are you sure you want to delete it? (y/N) " -msgstr "Olete kindel, et soovite seda kasutada (j/E)? " - -#: g10/keyedit.c:4189 -#, fuzzy -msgid "Enter the notation: " -msgstr "Allkirja noteerimine: " - -#: g10/keyedit.c:4338 -#, fuzzy -msgid "Proceed? (y/N) " -msgstr "Kirjutan le (j/E)? " - -#: g10/keyedit.c:4402 -#, c-format -msgid "No user ID with index %d\n" -msgstr "Kasutaja ID numbriga %d puudub\n" - -#: g10/keyedit.c:4460 -#, fuzzy, c-format -msgid "No user ID with hash %s\n" -msgstr "Kasutaja ID numbriga %d puudub\n" - -#: g10/keyedit.c:4487 -#, fuzzy, c-format -msgid "No subkey with index %d\n" -msgstr "Kasutaja ID numbriga %d puudub\n" - -#: g10/keyedit.c:4622 -#, fuzzy, c-format -msgid "user ID: \"%s\"\n" -msgstr "kasutaja ID: \"" - -#: g10/keyedit.c:4625 g10/keyedit.c:4689 g10/keyedit.c:4732 -#, fuzzy, c-format -msgid "signed by your key %s on %s%s%s\n" -msgstr " allkirjastanud %08lX %s%s%s\n" - -#: g10/keyedit.c:4627 g10/keyedit.c:4691 g10/keyedit.c:4734 -msgid " (non-exportable)" -msgstr " (mitte-eksporditav)" - -#: g10/keyedit.c:4631 -#, c-format -msgid "This signature expired on %s.\n" -msgstr "See allkiri aegub %s.\n" - -#: g10/keyedit.c:4635 -msgid "Are you sure you still want to revoke it? (y/N) " -msgstr "Olete kindel, et soovite seda ikka thistada? (j/E) " - -#: g10/keyedit.c:4639 -msgid "Create a revocation certificate for this signature? (y/N) " -msgstr "Loon sellele allkirjale thistamise sertifikaadi? (j/E) " - -#: g10/keyedit.c:4666 -#, fuzzy, c-format -msgid "You have signed these user IDs on key %s:\n" -msgstr "Te olete allkirjastanud jrgnevad kasutaja IDd:\n" - -#: g10/keyedit.c:4692 -#, fuzzy -msgid " (non-revocable)" -msgstr " (mitte-eksporditav)" - -#: g10/keyedit.c:4699 -#, fuzzy, c-format -msgid "revoked by your key %s on %s\n" -msgstr " thistanud %08lX %s\n" - -#: g10/keyedit.c:4721 -msgid "You are about to revoke these signatures:\n" -msgstr "Te asute thistama jrgmisi allkirju:\n" - -#: g10/keyedit.c:4741 -msgid "Really create the revocation certificates? (y/N) " -msgstr "Kas testi loon thistamise sertifikaadid? (j/E) " - -#: g10/keyedit.c:4771 -msgid "no secret key\n" -msgstr "salajast vtit pole\n" - -#: g10/keyedit.c:4841 -#, c-format -msgid "user ID \"%s\" is already revoked\n" -msgstr "kasutaja ID \"%s\" on juba thistatud\n" - -#: g10/keyedit.c:4858 -#, 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:4922 -#, fuzzy, c-format -msgid "Key %s is already revoked.\n" -msgstr "kasutaja ID \"%s\" on juba thistatud\n" - -#: g10/keyedit.c:4984 -#, fuzzy, c-format -msgid "Subkey %s is already revoked.\n" -msgstr "kasutaja ID \"%s\" on juba thistatud\n" - -#: g10/keyedit.c:5079 -#, fuzzy, c-format -msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n" -msgstr "Nitan %s foto IDd suurusega %ld, vti 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 smbol eelistuste snes\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 vtit 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 vtme 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 "vtme 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 "krpteeri 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 krptimiseks)\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 vtmetpi 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 krpteerimiseks)\n" - -#: g10/keygen.c:1440 -#, fuzzy, c-format -msgid " (%d) Elgamal (encrypt only)\n" -msgstr " (%d) ElGamal (ainult krptimiseks)\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 krpteerimiseks)\n" - -#: g10/keygen.c:1445 -#, fuzzy, c-format -msgid " (%d) RSA (set your own capabilities)\n" -msgstr " (%d) RSA (ainult krpteerimiseks)\n" - -#: g10/keygen.c:1514 -#, fuzzy, c-format -msgid "DSA keypair will have %u bits.\n" -msgstr "DSA vtmepaari 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 vtmepikkust 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 vtmepikkus 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 mrake, kui kaua on vti kehtiv.\n" -" 0 = vti ei aegu\n" -" <n> = vti aegub n pevaga\n" -" <n>w = vti aegub n ndalaga\n" -" <n>m = vti aegub n kuuga\n" -" <n>y = vti 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 mrake, kui kaua allkiri kehtib.\n" -" 0 = allkiri ei aegu\n" -" <n> = allkiri aegub n pevaga\n" -" <n>w = allkiri aegub n ndalaga\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 "Vti 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 vrtus\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 ssteem ei saa esitada kuupevi peale aastat 2038.\n" -"Siiski ksitletakse 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" -"Vtme identifitseerimiseks on vaja mrata kasutaja; tarkvara konstrueerib\n" -"kasutaja id kasutades prisnime, kommentaari ja e-posti aadressi kujul:\n" -" \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n" -"\n" - -#: g10/keygen.c:1728 -msgid "Real name: " -msgstr "Prisnimi: " - -#: g10/keygen.c:1736 -msgid "Invalid character in name\n" -msgstr "Lubamatu smbol nimes\n" - -#: g10/keygen.c:1738 -msgid "Name may not start with a digit\n" -msgstr "Nimi ei vi alata numbriga\n" - -#: g10/keygen.c:1740 -msgid "Name must be at least 5 characters long\n" -msgstr "Nimes peab olema vhemalt 5 smbolit\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 smbol 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 prisnimesse 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 vi (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 vi (O)k/(V)lju? " - -#: g10/keygen.c:1848 -msgid "Please correct the error first\n" -msgstr "Palun parandage kigepealt viga\n" - -#: g10/keygen.c:1888 -msgid "" -"You need a Passphrase to protect your secret key.\n" -"\n" -msgstr "" -"Te vajate oma salajase vtme 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 tenoliselt *halb* idee!\n" -"Ma siiski tidan teie soovi. Te saate oma parooli alati muuta,\n" -"kasutades seda programmi vtmega \"--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 vimaluse\n" -"koguda paremat entroopiat.\n" - -#: g10/keygen.c:2708 -msgid "Key generation canceled.\n" -msgstr "Vtme genereerimine katkestati.\n" - -#: g10/keygen.c:2907 g10/keygen.c:3052 -#, c-format -msgid "writing public key to `%s'\n" -msgstr "kirjutan avaliku vtme 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 vtme faili `%s'\n" - -#: g10/keygen.c:2912 g10/keygen.c:3058 -#, c-format -msgid "writing secret key to `%s'\n" -msgstr "kirjutan salajase vtme faili `%s'\n" - -#: g10/keygen.c:3041 -#, c-format -msgid "no writable public keyring found: %s\n" -msgstr "kirjutatavat avalike vtmete hoidlat pole: %s\n" - -#: g10/keygen.c:3047 -#, c-format -msgid "no writable secret keyring found: %s\n" -msgstr "kirjutatavat salajaste vtmete hoidlat pole: %s\n" - -#: g10/keygen.c:3065 -#, c-format -msgid "error writing public keyring `%s': %s\n" -msgstr "viga avaliku vtme vtmehoidlasse `%s' kirjutamisel: %s\n" - -#: g10/keygen.c:3072 -#, c-format -msgid "error writing secret keyring `%s': %s\n" -msgstr "viga salajase vtme vtmehoidlasse `%s' kirjutamisel: %s\n" - -#: g10/keygen.c:3095 -msgid "public and secret key created and signed.\n" -msgstr "avalik ja salajane vti 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 vtit ei saa kasutada krptimiseks. \n" -"Krptimiseks tuleb genereerida teine vti, seda saate teha\n" -"kasutades vtit \"--edit-key\".\n" - -#: g10/keygen.c:3118 g10/keygen.c:3247 g10/keygen.c:3363 -#, c-format -msgid "Key generation failed: %s\n" -msgstr "Vtme genereerimine ebannestus: %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 "vti loodi %lu sekund tulevikus (ajahpe vi 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 "vti loodi %lu sekundit tulevikus (ajahpe vi kella probleem)\n" - -#: g10/keygen.c:3181 g10/keygen.c:3311 -msgid "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n" -msgstr "MRKUS: v3 vtmetele alamvtmete loomine ei ole OpenPGP hilduv\n" - -#: g10/keygen.c:3220 g10/keygen.c:3344 -#, fuzzy -msgid "Really create? (y/N) " -msgstr "Loon testi? " - -#: g10/keygen.c:3509 -#, fuzzy, c-format -msgid "storing key onto card failed: %s\n" -msgstr "vtmebloki kustutamine ebannestus: %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 "MRKUS: salajane vti %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 "Vtmehoidla" - -#: g10/keylist.c:1505 -msgid "Primary key fingerprint:" -msgstr "Primaarse vtme srmejlg:" - -#: g10/keylist.c:1507 -msgid " Subkey fingerprint:" -msgstr " Alamvtme srmejlg:" - -#. 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 vtme srmejlg:" - -#: g10/keylist.c:1516 -msgid " Subkey fingerprint:" -msgstr " Alamvtme srmejlg:" - -#: g10/keylist.c:1520 g10/keylist.c:1524 -#, fuzzy -msgid " Key fingerprint =" -msgstr " Vtme srmejlg =" - -#: 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 ebannestus: %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 vimalik turvaprobleem\n" - -#: g10/keyring.c:1376 -#, fuzzy, c-format -msgid "caching keyring `%s'\n" -msgstr "kontrollin vtmehoidlat `%s'\n" - -#: g10/keyring.c:1422 -#, fuzzy, c-format -msgid "%lu keys cached so far (%lu signatures)\n" -msgstr "kontrollitud %lu vtit (%lu allkirja)\n" - -#: g10/keyring.c:1434 -#, fuzzy, c-format -msgid "%lu keys cached (%lu signatures)\n" -msgstr "kontrollitud %lu vtit (%lu allkirja)\n" - -#: g10/keyring.c:1505 -#, c-format -msgid "%s: keyring created\n" -msgstr "%s: vtmehoidla 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:1421 -#, fuzzy, c-format -msgid "invalid keyserver protocol (us %d!=handler %d)\n" -msgstr "vigased ekspordi vtmed\n" - -#: g10/keyserver.c:906 -#, fuzzy, c-format -msgid "key \"%s\" not found on keyserver\n" -msgstr "vtit '%s' ei leitud: %s\n" - -#: g10/keyserver.c:908 -#, fuzzy -msgid "key not found on keyserver\n" -msgstr "vtit '%s' ei leitud: %s\n" - -#: g10/keyserver.c:1145 -#, fuzzy, c-format -msgid "requesting key %s from %s server %s\n" -msgstr "ksin vtit %08lX vtmeserverist %s\n" - -#: g10/keyserver.c:1149 -#, fuzzy, c-format -msgid "requesting key %s from %s\n" -msgstr "ksin vtit %08lX vtmeserverist %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:1324 -#, fuzzy, c-format -msgid "sending key %s to %s server %s\n" -msgstr "otsin \"%s\" HKP serverist %s\n" - -#: g10/keyserver.c:1328 -#, fuzzy, c-format -msgid "sending key %s to %s\n" -msgstr "" -"\"\n" -"allkirjastatud teie vtmega %08lX %s\n" - -#: g10/keyserver.c:1371 -#, fuzzy, c-format -msgid "searching for \"%s\" from %s server %s\n" -msgstr "otsin \"%s\" HKP serverist %s\n" - -#: g10/keyserver.c:1374 -#, fuzzy, c-format -msgid "searching for \"%s\" from %s\n" -msgstr "otsin \"%s\" HKP serverist %s\n" - -#: g10/keyserver.c:1381 g10/keyserver.c:1477 -#, fuzzy -msgid "no keyserver action!\n" -msgstr "vigased ekspordi vtmed\n" - -#: g10/keyserver.c:1429 -#, c-format -msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n" -msgstr "" - -#: g10/keyserver.c:1438 -msgid "keyserver did not send VERSION\n" -msgstr "" - -#: g10/keyserver.c:1500 g10/keyserver.c:2028 -msgid "no keyserver known (use option --keyserver)\n" -msgstr "" - -#: g10/keyserver.c:1506 -msgid "external keyserver calls are not supported in this build\n" -msgstr "" - -#: g10/keyserver.c:1518 -#, c-format -msgid "no handler for keyserver scheme `%s'\n" -msgstr "" - -#: g10/keyserver.c:1523 -#, c-format -msgid "action `%s' not supported with keyserver scheme `%s'\n" -msgstr "" - -#: g10/keyserver.c:1531 -#, c-format -msgid "%s does not support handler version %d\n" -msgstr "" - -#: g10/keyserver.c:1538 -#, fuzzy -msgid "keyserver timed out\n" -msgstr "vtmeserveri viga" - -#: g10/keyserver.c:1543 -#, fuzzy -msgid "keyserver internal error\n" -msgstr "vtmeserveri viga" - -#: g10/keyserver.c:1552 -#, fuzzy, c-format -msgid "keyserver communications error: %s\n" -msgstr "vtmeserverilt lugemine ebannestus: %s\n" - -#: g10/keyserver.c:1577 g10/keyserver.c:1611 -#, c-format -msgid "\"%s\" not a key ID: skipping\n" -msgstr "" - -#: g10/keyserver.c:1870 -#, 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:1892 -#, fuzzy, c-format -msgid "refreshing 1 key from %s\n" -msgstr "ksin vtit %08lX vtmeserverist %s\n" - -#: g10/keyserver.c:1894 -#, fuzzy, c-format -msgid "refreshing %d keys from %s\n" -msgstr "ksin vtit %08lX vtmeserverist %s\n" - -#: g10/keyserver.c:1950 -#, 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:1956 -#, 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 krptitud sessiooni vtme jaoks (%d)\n" - -#: g10/mainproc.c:291 -#, c-format -msgid "%s encrypted session key\n" -msgstr "%s krpteeritud sessiooni vti\n" - -#: g10/mainproc.c:301 -#, fuzzy, c-format -msgid "passphrase generated with unknown digest algorithm %d\n" -msgstr "krpteeritud tundmatu algoritmiga %d\n" - -#: g10/mainproc.c:382 -#, fuzzy, c-format -msgid "public key is %s\n" -msgstr "avalik vti on %08lX\n" - -#: g10/mainproc.c:439 -msgid "public key encrypted data: good DEK\n" -msgstr "avaliku vtmega krpteeritud andmed: hea DEK\n" - -#: g10/mainproc.c:472 -#, fuzzy, c-format -msgid "encrypted with %u-bit %s key, ID %s, created %s\n" -msgstr "krpteeritud %u-bitise %s vtmega, 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 "krpteeritud %s vtmega, ID %08lX\n" - -#: g10/mainproc.c:494 -#, c-format -msgid "public key decryption failed: %s\n" -msgstr "avaliku vtmega lahtikrpteerimine ebannestus: %s\n" - -#: g10/mainproc.c:508 -#, c-format -msgid "encrypted with %lu passphrases\n" -msgstr "krpteeritud kasutades %lu parooli\n" - -#: g10/mainproc.c:510 -msgid "encrypted with 1 passphrase\n" -msgstr "krpteeritud he parooliga\n" - -#: g10/mainproc.c:541 g10/mainproc.c:563 -#, c-format -msgid "assuming %s encrypted data\n" -msgstr "eeldan %s krpteeritud 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 "lahtikrpteerimine nnestus\n" - -#: g10/mainproc.c:585 -msgid "WARNING: message was not integrity protected\n" -msgstr "HOIATUS: teate koosklalisus ei ole tagatud\n" - -#: g10/mainproc.c:598 -msgid "WARNING: encrypted message has been manipulated!\n" -msgstr "HOIATUS: krpteeritud teadet on muudetud!\n" - -#: g10/mainproc.c:604 -#, c-format -msgid "decryption failed: %s\n" -msgstr "lahtikrpteerimine ebannestus: %s\n" - -#: g10/mainproc.c:623 -msgid "NOTE: sender requested \"for-your-eyes-only\"\n" -msgstr "MRKUS: saatja nudis \"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 thistus - 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 jeti ra\n" - -#: g10/mainproc.c:1508 -#, fuzzy -msgid "can't handle this ambiguous signature data\n" -msgstr "neid allkirju ei nnestu tdelda\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 li %.*s kasutades %s vtit ID %08lX\n" - -#: g10/mainproc.c:1544 -msgid "Key available at: " -msgstr "Vtme 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, snumilhendi 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 mlupildi 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 ebannestus (n=%d): %s\n" - -#: g10/misc.c:316 -#, fuzzy, c-format -msgid "WARNING: using experimental public key algorithm %s\n" -msgstr "ei oska ksitleda avaliku vtme 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, snumilhendi algoritm %s\n" - -#: g10/misc.c:351 -#, fuzzy, c-format -msgid "WARNING: digest algorithm %s is deprecated\n" -msgstr "" -"snumilhendi 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 tiendavat infot\n" - -#: g10/misc.c:681 -#, c-format -msgid "%s:%d: deprecated option \"%s\"\n" -msgstr "%s:%d: ebasoovitav vti \"%s\"\n" - -#: g10/misc.c:685 -#, c-format -msgid "WARNING: \"%s\" is a deprecated option\n" -msgstr "HOIATUS: vtit \"%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: vtit \"%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 vtmeid 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 standardvljundisse\n" - -#: g10/openfile.c:305 -#, c-format -msgid "assuming signed data in `%s'\n" -msgstr "eeldan allkirjastatud andmeid failis `%s'\n" - -#: g10/openfile.c:384 -#, c-format -msgid "new configuration file `%s' created\n" -msgstr "uus omaduste fail `%s' on loodud\n" - -#: g10/openfile.c:386 -#, 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:418 -#, 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 ksitleda avaliku vtme algoritmi %d\n" - -#: g10/parse-packet.c:708 -msgid "WARNING: potentially insecure symmetrically encrypted session key\n" -msgstr "" -"HOIATUS: tenoliselt ebaturvaline smmeetriliselt krpteeritud sessiooni " -"vti\n" - -#: g10/parse-packet.c:1157 -#, c-format -msgid "subpacket of type %d has critical bit set\n" -msgstr "alampaketil tbiga %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 vtme 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 vtme lahtilukustamiseks parooli:\n" -"\"%.*s\"\n" -"%u-bitti %s vti, 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:968 -#, fuzzy -msgid "can't query passphrase in batch mode\n" -msgstr "pakettmoodis ei saa parooli ksida\n" - -#: g10/passphrase.c:812 g10/passphrase.c:973 -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 vtme lahtilukustamiseks\n" -"parooli: \"" - -#: g10/passphrase.c:901 -#, fuzzy, c-format -msgid "%u-bit %s key, ID %s, created %s" -msgstr "%u-bitine %s vti, ID %08lX, loodud %s" - -#: g10/passphrase.c:910 -#, c-format -msgid " (subkey on main key ID %s)" -msgstr "" - -#: g10/passphrase.c:977 -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 vtmes. Kui kasutate\n" -"vga suurt pilti, on ka kti vha suur!\n" -"Mistlik pildi suurus viks 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 nidata!\n" - -#: g10/pkclist.c:62 g10/revoke.c:623 -msgid "No reason specified" -msgstr "Phjus puudub" - -#: g10/pkclist.c:64 g10/revoke.c:625 -msgid "Key is superseded" -msgstr "Vti on asendatud" - -#: g10/pkclist.c:66 g10/revoke.c:624 -msgid "Key has been compromised" -msgstr "Vti on kompromiteeritud" - -#: g10/pkclist.c:68 g10/revoke.c:626 -msgid "Key is no longer used" -msgstr "Vti 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 "thistamise phjus: " - -#: g10/pkclist.c:91 -msgid "revocation comment: " -msgstr "thistamise kommentaar: " - -#: g10/pkclist.c:206 -msgid "iImMqQsS" -msgstr "iItTvVjJ" - -#: g10/pkclist.c:214 -#, fuzzy -msgid "No trust value assigned to:\n" -msgstr "" -"Usalduse vrtus 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 vti kuulub tenoliselt 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 phimensse\n" - -#: g10/pkclist.c:288 -#, fuzzy -msgid " s = skip this key\n" -msgstr " j = jta see vti vahele\n" - -#: g10/pkclist.c:289 -#, fuzzy -msgid " q = quit\n" -msgstr " v = vlju\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 testi soovite seda vtit absoluutselt usaldada? " - -#: g10/pkclist.c:334 -msgid "Certificates leading to an ultimately trusted key:\n" -msgstr "Sertifikaadid tiesti usaldatava vtmeni:\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 nitaks, et see vti 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 nitaks, et see vti kuulub omanikule\n" - -#: g10/pkclist.c:430 -#, fuzzy -msgid "This key probably belongs to the named user\n" -msgstr "See vti kuulub tenoliselt omanikule\n" - -#: g10/pkclist.c:435 -msgid "This key belongs to us\n" -msgstr "See vti 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 vti kuulub isikule, keda mainitakse\n" -"kasutaja ID vljal. Kui te *testi* teate, mida te teete,\n" -"vite jrgnevale ksimusele vastata jaatavalt\n" -"\n" - -#: g10/pkclist.c:468 -#, fuzzy -msgid "Use this key anyway? (y/N) " -msgstr "Kasutan seda vtit ikka? " - -#: g10/pkclist.c:502 -msgid "WARNING: Using untrusted key!\n" -msgstr "HOIATUS: Kasutan mitteusaldatavat vtit!\n" - -#: g10/pkclist.c:509 -msgid "WARNING: this key might be revoked (revocation key not present)\n" -msgstr "HOIATUS: see vti vib olla thistatud (thistamise vtit pole)\n" - -#: g10/pkclist.c:518 -msgid "WARNING: This key has been revoked by its designated revoker!\n" -msgstr "HOIATUS: See vti on mratud thistaja poolt thistatud!\n" - -#: g10/pkclist.c:521 -msgid "WARNING: This key has been revoked by its owner!\n" -msgstr "HOIATUS: See vti on omaniku poolt thistatud!\n" - -#: g10/pkclist.c:522 -#, fuzzy -msgid " This could mean that the signature is forged.\n" -msgstr " See vib thendada, et allkiri on vltsing.\n" - -#: g10/pkclist.c:528 -msgid "WARNING: This subkey has been revoked by its owner!\n" -msgstr "HOIATUS: See alamvti on omaniku poolt thistatud!\n" - -#: g10/pkclist.c:533 -msgid "Note: This key has been disabled.\n" -msgstr "Mrkus: See vti 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 "Mrkus: See vti on aegunud!\n" - -#: g10/pkclist.c:602 -msgid "WARNING: This key is not certified with a trusted signature!\n" -msgstr "HOIATUS: Seda vtit 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 nitaks, et allkiri kuulub omanikule.\n" - -#: g10/pkclist.c:612 -msgid "WARNING: We do NOT trust this key!\n" -msgstr "HOIATUS: Me EI usalda seda vtit!\n" - -#: g10/pkclist.c:613 -msgid " The signature is probably a FORGERY.\n" -msgstr " Allkiri on tenoliselt VLTSING.\n" - -#: g10/pkclist.c:621 -msgid "" -"WARNING: This key is not certified with sufficiently trusted signatures!\n" -msgstr "" -"HOIATUS: Seda vtit 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: jtsin vahele: %s\n" - -#: g10/pkclist.c:834 g10/pkclist.c:1114 -#, c-format -msgid "%s: skipped: public key already present\n" -msgstr "%s: jtsin vahele: avalik vti on juba olemas\n" - -#: g10/pkclist.c:885 -msgid "You did not specify a user ID. (you may use \"-r\")\n" -msgstr "Te ei mranud kasutaja IDd. (vite kasutada vtit \"-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. Lpetage thja 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 "jtsin vahele: avalik vti on juba vaikimisi saaja\n" - -#: g10/pkclist.c:990 -msgid "Public key is disabled.\n" -msgstr "Avalik vti on blokeeritud.\n" - -#: g10/pkclist.c:999 -msgid "skipped: public key already set\n" -msgstr "jtsin vahele: avalik vti 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: jtsin vahele: avalik vti 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 vtit \"--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 ebannestus `%s'\n" - -#: g10/pubkey-enc.c:104 -#, fuzzy, c-format -msgid "anonymous recipient; trying secret key %s ...\n" -msgstr "anonmne saaja; proovin salajast vtit %08lX ...\n" - -#: g10/pubkey-enc.c:135 -msgid "okay, we are the anonymous recipient.\n" -msgstr "ok, me oleme anonmne 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 vi blokeeritud\n" - -#: g10/pubkey-enc.c:282 -#, fuzzy, c-format -msgid "WARNING: cipher algorithm %s not found in recipient preferences\n" -msgstr "MRKUS: ifri algoritm %d puudub eelistustes\n" - -#: g10/pubkey-enc.c:302 -#, fuzzy, c-format -msgid "NOTE: secret key %s expired at %s\n" -msgstr "MRKUS: salajane vti %08lX aegus %s\n" - -#: g10/pubkey-enc.c:308 -msgid "NOTE: key has been revoked" -msgstr "MRKUS: vti on thistatud" - -#: 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 ebannestus: %s\n" - -#: g10/revoke.c:147 -#, fuzzy, c-format -msgid "key %s has no user IDs\n" -msgstr "vti %08lX: kasutaja ID puudub\n" - -#: g10/revoke.c:308 -msgid "To be revoked by:\n" -msgstr "Thistaja:\n" - -#: g10/revoke.c:312 -msgid "(This is a sensitive revocation key)\n" -msgstr "(See on tundlik thistamise vti)\n" - -#: g10/revoke.c:316 -#, fuzzy -msgid "Create a designated revocation certificate for this key? (y/N) " -msgstr "Loon sellele vtmele thistamise sertifikaadi? " - -#: g10/revoke.c:329 g10/revoke.c:554 -msgid "ASCII armored output forced.\n" -msgstr "Vljundis 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 ebannestus: %s\n" - -#: g10/revoke.c:407 -msgid "Revocation certificate created.\n" -msgstr "Thistamise sertifikaat on loodud.\n" - -#: g10/revoke.c:413 -#, fuzzy, c-format -msgid "no revocation keys found for \"%s\"\n" -msgstr "" -"`%s' jaoks pole thistamise vtmeid\n" -"\n" - -#: g10/revoke.c:471 -#, fuzzy, c-format -msgid "secret key \"%s\" not found: %s\n" -msgstr "salajast vtit `%s' ei leitud: %s\n" - -#: g10/revoke.c:500 -#, c-format -msgid "no corresponding public key: %s\n" -msgstr "vastavat avalikku vtit pole: %s\n" - -#: g10/revoke.c:511 -msgid "public key does not match secret key!\n" -msgstr "avalik vti ei sobi salajase vtmega!\n" - -#: g10/revoke.c:518 -#, fuzzy -msgid "Create a revocation certificate for this key? (y/N) " -msgstr "Loon sellele vtmele thistamise 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 "MRKUS: See vti 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 "" -"Thistamise sertifikaat on loodud.\n" -"\n" -"Palun salvestage see andmekandjale, mida saate kindlasse kohta ra panna.\n" -"Kui mallory saab sellele sertifikaadile juurdepsu, vib ta seda kasutades\n" -"muuta kik teie vtmed kasutamisklbmatuks.\n" -"Samuti on mistlik trkkida see sertifikaat paberile ja panna hoiule " -"juhuks,\n" -"kui meedia muutub loetamatuks. Aga olge ettevaatlik: teie arvuti " -"trkissteem\n" -"vib salvestada need andmed ja teha teistele kttesaadavaks! \n" - -#: g10/revoke.c:635 -msgid "Please select the reason for the revocation:\n" -msgstr "Palun valige thistamise phjus:\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 "(Tenoliselt 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. Lpetage thja reaga:\n" - -#: g10/revoke.c:716 -#, c-format -msgid "Reason for revocation: %s\n" -msgstr "Thistamise phjus: %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 hsti? " - -#: g10/seckey-cert.c:55 -msgid "secret key parts are not available\n" -msgstr "salajase vtme komponendid ei ole kttesaadavad\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 nrga vtme - 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 vtme kaitseks mittesoovitavat 16 bitist kontrollsummat\n" - -#: g10/seskey.c:54 -msgid "weak key created - retrying\n" -msgstr "loodi nrk vti - proovin uuesti\n" - -#: g10/seskey.c:59 -#, c-format -msgid "cannot avoid weak key for symmetric cipher; tried %d times!\n" -msgstr "" -"smmeetrilises ifris ei nnestu vltida nrga vtme 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 lhend 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 alamvti %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 alamvtmel %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 vti %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 vti %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 "vti loodi %lu sekund tulevikus (ajahpe vi 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 "vti loodi %lu sekundit tulevikus (ajahpe vi kella probleem)\n" - -#: g10/sig-check.c:205 -#, fuzzy, c-format -msgid "NOTE: signature key %s expired %s\n" -msgstr "MRKUS: allkirja vti %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 tttu vtmel %08lX vigast allkirja\n" - -#: g10/sig-check.c:544 -#, fuzzy, c-format -msgid "key %s: no subkey for subkey revocation signature\n" -msgstr "vti %08lX: alamvtme thistamise paketile puudub alamvti\n" - -#: g10/sig-check.c:570 -#, fuzzy, c-format -msgid "key %s: no subkey for subkey binding signature\n" -msgstr "vti %08lX: alamvtme allkirjaga sidumiseks puudub alamvti\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) vtme allkirja lisada\n" - -#: g10/sign.c:107 -#, c-format -msgid "WARNING: unable to %%-expand notation (too large). Using unexpanded.\n" -msgstr "" -"HOIATUS: noteerimise %%-asendus ebannestus (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 vtme (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 ebannestus (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 ebannestus (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 vtmetega 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 "" -"snumilhendi 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 vtmetega saab avateksti allkirjastada ainult --pgp2 moodis\n" - -#: g10/sign.c:1278 -#, c-format -msgid "%s encryption will be used\n" -msgstr "kasutatakse %s krpteerimist\n" - -#: g10/skclist.c:127 g10/skclist.c:191 -msgid "key is not flagged as insecure - can't use it with the faked RNG!\n" -msgstr "" -"vti ei ole mrgitud ebaturvaliseks - sellega ei saa vlts RNGd kasutada!\n" - -#: g10/skclist.c:158 -#, fuzzy, c-format -msgid "skipped \"%s\": duplicated\n" -msgstr "`%s' jtsin vahele: duplikaat\n" - -#: g10/skclist.c:166 g10/skclist.c:176 g10/skclist.c:185 -#, fuzzy, c-format -msgid "skipped \"%s\": %s\n" -msgstr "`%s' jtsin vahele: %s\n" - -#: g10/skclist.c:171 -msgid "skipped: secret key already present\n" -msgstr "jtsin vahele: avalik vti on juba olemas\n" - -#: g10/skclist.c:186 -#, fuzzy -msgid "this is a PGP generated Elgamal key which is not secure for signatures!" -msgstr "" -"jtsin `%s' vahele: see on PGP genereeritud ElGamal vti,\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, tp %d: kirjutamine ebannestus: %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 vrtuste 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 srmejlg\n" - -#: g10/tdbdump.c:179 -#, fuzzy -msgid "ownertrust value missing" -msgstr "impordi usalduse vrtused" - -#: 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 ebannestus: %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 ebannestus: %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 "MRKUS: 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 ebannestus: %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 ebannestus: %s\n" - -#: g10/tdbio.c:1182 -#, c-format -msgid "trustdb: read failed (n=%d): %s\n" -msgstr "trustdb: lugemine ebannestus (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 ebannestus: %s\n" - -#: g10/tdbio.c:1459 -#, c-format -msgid "%s: failed to append a record: %s\n" -msgstr "%s: kirje lisamine ebannestus: %s\n" - -#: g10/tdbio.c:1504 -msgid "the trustdb is corrupted; please run \"gpg --fix-trustdb\".\n" -msgstr "trustdb on vigane; palun kivitage \"gpg --fix-trustdb\".\n" - -#: g10/textfilter.c:149 -#, c-format -msgid "can't handle text lines longer than %d characters\n" -msgstr "ei suuda ksitleda tekstiridu mis on pikemad, kui %d smbolit\n" - -#: g10/textfilter.c:248 -#, c-format -msgid "input line longer than %d characters\n" -msgstr "sisendrida on pikem, kui %d smbolit\n" - -#: g10/trustdb.c:227 -#, c-format -msgid "`%s' is not a valid long keyID\n" -msgstr "`%s' ei ole kehtiv pikk vtmeID\n" - -#: g10/trustdb.c:258 -#, fuzzy, c-format -msgid "key %s: accepted as trusted key\n" -msgstr "vti %08lX: aktsepteerin usaldusvrse vtmena\n" - -#: g10/trustdb.c:296 -#, fuzzy, c-format -msgid "key %s occurs more than once in the trustdb\n" -msgstr "vti %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 "vti %08lX: usaldataval vtmel pole avalikku vtit - jtsin vahele\n" - -#: g10/trustdb.c:321 -#, fuzzy, c-format -msgid "key %s marked as ultimately trusted\n" -msgstr "vti on mrgitud abslouutselt usaldatuks.\n" - -#: g10/trustdb.c:345 -#, c-format -msgid "trust record %lu, req type %d: read failed: %s\n" -msgstr "usalduse kirje %lu, pringu tp %d: lugemine ebannestus: %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 tpi %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 "[thistatud] " - -#: 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 jrgmine 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 vtit %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 vtit tdeldud (%d kehtivust puhastatud)\n" - -#: g10/trustdb.c:2160 -msgid "no ultimately trusted keys found\n" -msgstr "absoluutselt usaldatavaid vtmeid pole\n" - -#: g10/trustdb.c:2174 -#, fuzzy, c-format -msgid "public key of ultimately trusted key %s not found\n" -msgstr "puudub absoluutselt usaldatava vtme %08lX avalik vti\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, tp %d: kirjutamine ebannestus: %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 vi .asc)\n" -"peab olema ksureal 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 vi seavahetus puudub\n" - -#: util/errors.c:55 -msgid "general error" -msgstr "ldine viga" - -#: util/errors.c:56 -msgid "unknown packet type" -msgstr "tundmatu paketi tp" - -#: util/errors.c:57 -msgid "unknown version" -msgstr "tundmatu versioon" - -#: util/errors.c:58 -msgid "unknown pubkey algorithm" -msgstr "tundmatu avaliku vtme algoritm" - -#: util/errors.c:59 -msgid "unknown digest algorithm" -msgstr "tundmatu lhendi algoritm" - -#: util/errors.c:60 -msgid "bad public key" -msgstr "halb avalik vti" - -#: util/errors.c:61 -msgid "bad secret key" -msgstr "halb salajane vti" - -#: 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 vtit" - -#: util/errors.c:66 -msgid "unknown cipher algorithm" -msgstr "tundmatu ifri algoritm" - -#: util/errors.c:67 -msgid "can't open the keyring" -msgstr "vtmehoidlat 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 vti ei ole kttesaadav" - -#: util/errors.c:72 -msgid "wrong secret key used" -msgstr "kasutati valet salajast vtit" - -#: util/errors.c:73 -msgid "not supported" -msgstr "ei ole toetatud" - -#: util/errors.c:74 -msgid "bad key" -msgstr "halb vti" - -#: 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 vtme 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 vtmehoidla" - -#: 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 vtme algoritm" - -#: util/errors.c:96 -msgid "file exists" -msgstr "fail on olemas" - -#: util/errors.c:97 -msgid "weak key" -msgstr "nrk vti" - -#: 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 "vrgu viga" - -#: util/errors.c:103 -msgid "not encrypted" -msgstr "krptimata" - -#: util/errors.c:104 -msgid "not processed" -msgstr "ei tdeldud" - -#: util/errors.c:106 -msgid "unusable public key" -msgstr "mittekasutatav avalik vti" - -#: util/errors.c:107 -msgid "unusable secret key" -msgstr "mittekasutatav salajane vti" - -#: util/errors.c:108 -msgid "keyserver error" -msgstr "vtmeserveri viga" - -#: util/errors.c:109 -#, fuzzy -msgid "canceled" -msgstr "Katkesta" - -#: util/errors.c:110 -#, fuzzy -msgid "no card" -msgstr "krptimata" - -#: 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 "vlju" - -#: 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 mlu!\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:350 -msgid "operation is not possible without initialized secure memory\n" -msgstr "initsialiseerimata turvalise mluta ei ole operatsioon vimalik\n" - -#: util/secmem.c:351 -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 nuab 160 bitist rsialgoritmi 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 vivad olla ainult trkitavad smbolid vi thikud\n" -#~ "ning lpus peab olema '='\n" - -#~ msgid "a user notation name must contain the '@' character\n" -#~ msgstr "kasutaja noteerimise nimi peab sisaldama '@' mrki\n" - -#, fuzzy -#~ msgid "a notation name must not contain more than one '@' character\n" -#~ msgstr "kasutaja noteerimise nimi peab sisaldama '@' mrki\n" - -#~ msgid "a notation value must not use any control characters\n" -#~ msgstr "noteerimise vrtus ei vi sisaldada kontroll smboleid\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 vtmed failist" - -#, fuzzy -#~ msgid "all import-clean-* options from above" -#~ msgstr "loe vtmed failist" - -#, fuzzy -#~ msgid "expired: %s)" -#~ msgstr " [aegub: %s]" - -#, fuzzy -#~ msgid "key %s: expired signature from key %s - skipped\n" -#~ msgstr "vti %08lX: ootamatu allkirja klass (0x%02x) - jtan vahele\n" - -#, fuzzy -#~ msgid "Unable to clean `%s'\n" -#~ msgstr "ei nnestu kivitada %s \"%s\": %s\n" - -#, fuzzy -#~ msgid "User ID \"%s\": %d signature removed.\n" -#~ msgstr "Kasutaja ID \"%s\" on thistatud." - -#, fuzzy -#~ msgid "User ID \"%s\": %d signatures removed.\n" -#~ msgstr "Kasutaja ID \"%s\" on thistatud." - -#, fuzzy -#~ msgid "User ID \"%s\" removed: %s\n" -#~ msgstr "Kasutaja ID \"%s\" on thistatud." - -#, fuzzy -#~ msgid "No user IDs are removable.\n" -#~ msgstr "kasutaja ID \"%s\" on juba thistatud\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 vi 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 vti N" - -#~ msgid "list signatures" -#~ msgstr "nita allkirju" - -#~ msgid "sign the key" -#~ msgstr "allkirjasta vti" - -#~ msgid "add a secondary key" -#~ msgstr "lisa sekundaarne vti" - -#~ msgid "delete signatures" -#~ msgstr "kustuta allkirjad" - -#~ msgid "change the expire date" -#~ msgstr "muuda aegumise kuupeva" - -#~ msgid "set preference list" -#~ msgstr "sea eelistuste nimekiri" - -#~ msgid "updated preferences" -#~ msgstr "uuendatud eelistused" - -#~ msgid "No secondary key with index %d\n" -#~ msgstr "Sekundaarne vti 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 vti kehtetuks mitte-tunnistatavana" - -#~ msgid "sign the key locally and non-revocably" -#~ msgstr "allkirjasta vti 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 "llita" - -#~ msgid "t" -#~ msgstr "t" - -#~ msgid "pref" -#~ msgstr "pref" - -#~ msgid "showpref" -#~ msgstr "showpref" - -#~ msgid "setpref" -#~ msgstr "setpref" - -#~ msgid "updpref" -#~ msgstr "updpref" - -#, fuzzy -#~ msgid "keyserver" -#~ msgstr "vtmeserveri 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 "snumilhendi 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 vtmepaari genereerimist.\n" -#~ " minimaalne vtmepikkus on 768 bitti\n" -#~ " vaikimisi vtmepikkus on 1024 bitti\n" -#~ " suurim soovitatav vtmepikkus on 2048 bitti\n" - -#~ msgid "DSA only allows keysizes from 512 to 1024\n" -#~ msgstr "DSA lubab vtmepikkuseid ainult vahemikus 512 kuni 1024\n" - -#~ msgid "keysize too small; 1024 is smallest value allowed for RSA.\n" -#~ msgstr "vtmepikkus on liiga vike; RSA korral on vikseim vrtus 1024.\n" - -#~ msgid "keysize too small; 768 is smallest value allowed.\n" -#~ msgstr "vtmepikkus on liiga vike; vikseim lubatud vrtus on 768.\n" - -#~ msgid "keysize too large; %d is largest value allowed.\n" -#~ msgstr "vtmepikkus on liiga suur; suurim lubatud vrtus on %d.\n" - -#~ msgid "" -#~ "Keysizes larger than 2048 are not suggested because\n" -#~ "computations take REALLY long!\n" -#~ msgstr "" -#~ "Suuremad vtmepikkused kui 2048 ei ole soovitatavad, kuna\n" -#~ "arvutused vtavad VGA palju aega!\n" - -#, fuzzy -#~ msgid "Are you sure that you want this keysize? (y/N) " -#~ msgstr "Olete kindel, et soovite sellist vtmepikkust? " - -#~ 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" -#~ "vimalikud rndeobjektid!\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 mnd 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 "vtit '%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 "vti %08lX: vti on thistatud!\n" - -#~ msgid "key %08lX: subkey has been revoked!\n" -#~ msgstr "vti %08lX: alamvti on thistatud!\n" - -#~ msgid "%08lX: key has expired\n" -#~ msgstr "%08lX: vti on aegunud\n" - -#~ msgid "%08lX: We do NOT trust this key\n" -#~ msgstr "%08lX: Me EI usalda seda vtit\n" - -#~ msgid " (%d) RSA (sign and encrypt)\n" -#~ msgstr " (%d) RSA (allkirjastamiseks ja krptimiseks)\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 krptimiseks)\n" - -#, fuzzy -#~ msgid " (%d) RSA (encrypt and auth)\n" -#~ msgstr " (%d) RSA (ainult krpteerimiseks)\n" - -#, fuzzy -#~ msgid " (%d) RSA (sign, encrypt and auth)\n" -#~ msgstr " (%d) RSA (allkirjastamiseks ja krptimiseks)\n" - -#~ msgid "%s: can't open: %s\n" -#~ msgstr "%s: ei nnestu avada: %s\n" - -#~ msgid "%s: WARNING: empty file\n" -#~ msgstr "%s: HOIATUS: thi 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 vhesel mral\n" - -#, fuzzy -#~ msgid " (%d) I trust fully\n" -#~ msgstr " %d = Usaldan tiesti\n" - -#, fuzzy -#~ msgid "expires" -#~ msgstr "expire" - -#, fuzzy -#~ msgid "" -#~ "\"\n" -#~ "locally signed with your key %s at %s\n" -#~ msgstr "" -#~ "\"\n" -#~ "lokaalselt allkirjastatud teie vtmega %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 vtit, 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 vrtus puudub\n" - -#~ msgid " (main key ID %08lX)" -#~ msgstr " (peamise vtme ID %08lX)" - -#~ msgid "rev! subkey has been revoked: %s\n" -#~ msgstr "rev! alamvti on thistatud: %s\n" - -#~ msgid "rev- faked revocation found\n" -#~ msgstr "rev- leitud vltsitud thistamine\n" - -#~ msgid "rev? problem checking revocation: %s\n" -#~ msgstr "rev? probleem thistamise kontrollimisel: %s\n" - -#, fuzzy -#~ msgid " [expired: %s]" -#~ msgstr " [aegub: %s]" - -#~ msgid " [expires: %s]" -#~ msgstr " [aegub: %s]" - -#, fuzzy -#~ msgid " [revoked: %s]" -#~ msgstr "[thistatud] " - -#~ 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: snumilhend `%s' ei ole OpenPGP osa. Kasutamine omal " -#~ "vastutusel!\n" - -#~ msgid "|[files]|encrypt files" -#~ msgstr "|[failid]|krpteeri failid" - -#~ msgid "store only" -#~ msgstr "ainult salvesta" - -#~ msgid "|[files]|decrypt files" -#~ msgstr "|[failid]|dekrpteeri failid" - -#~ msgid "sign a key non-revocably" -#~ msgstr "allkirjasta vti mitte-thistatavana" - -#~ msgid "sign a key locally and non-revocably" -#~ msgstr "allkirjasta vti lokaalselt ja mitte-thistatavana" - -#~ msgid "list only the sequence of packets" -#~ msgstr "nita ainult pakettide jrjendeid" - -#~ msgid "export the ownertrust values" -#~ msgstr "ekspordi usalduse vrtused" - -#~ 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 vi standardsisend lahti" - -#~ msgid "En-Armor a file or stdin" -#~ msgstr "Pakenda fail vi 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 vtit" - -#~ 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 vtme allkirju" - -#~ msgid "do not force v4 key signatures" -#~ msgstr "ra kasuta v3 vtme allkirju" - -#~ msgid "always use a MDC for encryption" -#~ msgstr "krptimisel kasuta alati MDC" - -#~ msgid "never use a MDC for encryption" -#~ msgstr "krptimisel ra kasuta kunagi MDC" - -#~ msgid "use the gpg-agent" -#~ msgstr "kasuta gpg-agenti" - -#~ msgid "batch mode: never ask" -#~ msgstr "pakettmood: ra ksi kunagi" - -#~ msgid "assume yes on most questions" -#~ msgstr "eelda enamus ksimustele jah vastust" - -#~ msgid "assume no on most questions" -#~ msgstr "eelda enamus ksimustele ei vastust" - -#~ msgid "add this keyring to the list of keyrings" -#~ msgstr "lisa see vtmehoidla vtmehoidlate nimekirja" - -#~ msgid "add this secret keyring to the list" -#~ msgstr "lisa see salajaste vtmete hoidla nimekirja" - -#~ msgid "|NAME|use NAME as default secret key" -#~ msgstr "|NIMI|kasuta NIME vaikimisi salajase vtmena" - -#~ msgid "|HOST|use this keyserver to lookup keys" -#~ msgstr "|HOST|kasuta seda vtmeserverit" - -#~ 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 "|VTMEID|usalda seda vtit tielikult" - -#~ 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 kikides tegevustes OpenPGP vtmeid" - -#~ msgid "set all packet, cipher and digest options to PGP 2.x behavior" -#~ msgstr "" -#~ "kasuta kikide pakettide, iffrite ja lhendi 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 lhendialgoritmi 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 teatelhendi algoritmi NIMI" - -#~ msgid "|N|use compress algorithm N" -#~ msgstr "|N|kasuta pakkimisalgoritmi N" - -#~ msgid "throw keyid field of encrypted packets" -#~ msgstr "ra lisa krptimisel vtme 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 ksurida 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 vti testi 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 "vti %08lX: ei ole rfc2440 vti - jtsin vahele\n" - -#~ msgid "" -#~ "NOTE: Elgamal primary key detected - this may take some time to import\n" -#~ msgstr "" -#~ "MRKUS: Tuvastasin Elgamal primaarvtme - importimine vib vtta mne " -#~ "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 "vtmeserverist ei saa vtit: %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' ebannestus: olek=%u\n" - -#~ msgid "this keyserver does not support --search-keys\n" -#~ msgstr "see vtmeserver ei toeta --search-keys\n" - -#~ msgid "can't search keyserver: %s\n" -#~ msgstr "vtmeserverist ei saa otsida: %s\n" - -#~ msgid "" -#~ "key %08lX: this is a PGP generated ElGamal key which is NOT secure for " -#~ "signatures!\n" -#~ msgstr "" -#~ "vti %08lX: see on PGP genereeritud ElGamal vti ja EI OLE " -#~ "allkirjastamiseks turvaline!\n" - -#~ msgid "" -#~ "key %08lX has been created %lu second in future (time warp or clock " -#~ "problem)\n" -#~ msgstr "" -#~ "vti %08lX loodi %lu sekund tulevikus (ajahpe vi kella probleem)\n" - -#~ msgid "" -#~ "key %08lX has been created %lu seconds in future (time warp or clock " -#~ "problem)\n" -#~ msgstr "" -#~ "vti %08lX loodi %lu sekundit tulevikus (ajahpe vi kella probleem)\n" - -#~ msgid "key %08lX marked as ultimately trusted\n" -#~ msgstr "vti %08lX on mrgitud abslouutselt usaldatavaks\n" - -#~ msgid "signature from Elgamal signing key %08lX to %08lX skipped\n" -#~ msgstr "" -#~ "jtsin Elgamal allkirjastamise vtme %08lX allkirja %08lX-le vahele\n" - -#~ msgid "signature from %08lX to Elgamal signing key %08lX skipped\n" -#~ msgstr "" -#~ "jtsin %08lX allkirja Elgamal allkirjastamise vtmele %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 sgavusel %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" -#~ "krptimisel. OpenPGP eristab selle algoritmi kahte varianti: ainult\n" -#~ "krptivat ja krptivat ning allkirjastavat. Algoritm on sama, aga\n" -#~ "turvaliseks allkirjastamiseks on vaja valida sobivad parameetrid. See\n" -#~ "programm toetab mlemat varianti, aga teised OpenPGP realisatsioonid\n" -#~ "ei pruugi krptivat ning allkirjastavat vimalust tunda.\n" -#~ "\n" -#~ "Esimene (primaarne) vti peab alati olema selline, mida saab kasutada\n" -#~ "allkirjastamisel; see on ka phjus, miks selles mens ei lubata valida\n" -#~ "ainult krptivat ElGamal vtit." - -#~ 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 vtmed on kirjeldatud dokumendis RFC2440, ei ole nende\n" -#~ "kasutamine soovitatav, kuna mitte kik 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 vtit (%lu allkirja)\n" - -#~ msgid "key incomplete\n" -#~ msgstr "mittetielik vti\n" - -#~ msgid "key %08lX incomplete\n" -#~ msgstr "vti %08lX ei ole tielik\n" diff --git a/po/fi.po b/po/fi.po deleted file mode 100644 index 273cce964..000000000 --- a/po/fi.po +++ /dev/null @@ -1,7219 +0,0 @@ -# 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-07-28 11:12+0200\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:1003 g10/gpg.c:3461 g10/import.c:195 g10/keygen.c:2385 -#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:342 -#: 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:1002 g10/keygen.c:2864 -#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:263 -#: g10/openfile.c:357 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:320 -#, c-format -msgid "armor: %s\n" -msgstr "ascii-koodaus: %s\n" - -#: g10/armor.c:359 -msgid "invalid armor header: " -msgstr "epäkelpo ascii-koodausotsake: " - -#: g10/armor.c:370 -msgid "armor header: " -msgstr "ascii-koodausotsake: " - -#: g10/armor.c:381 -msgid "invalid clearsig header\n" -msgstr "epäkelpo selkotekstisen allekirjoituksen otsikko\n" - -#: g10/armor.c:433 -msgid "nested clear text signatures\n" -msgstr "sisäkkäisiä tekstimuotoisia allekirjoituksia\n" - -#: g10/armor.c:568 -#, fuzzy -msgid "unexpected armor: " -msgstr "odottamaton ascii-koodaus:" - -#: g10/armor.c:580 -msgid "invalid dash escaped line: " -msgstr "epäkelpo viiva rivin lopussa: " - -#: g10/armor.c:734 g10/armor.c:1343 -#, fuzzy, c-format -msgid "invalid radix64 character %02X skipped\n" -msgstr "epäkelpo radix64-merkki %02x ohitettu\n" - -#: g10/armor.c:777 -msgid "premature eof (no CRC)\n" -msgstr "ennenaikainen tiedoston loppu (ei CRC:tä)\n" - -#: g10/armor.c:811 -msgid "premature eof (in CRC)\n" -msgstr "ennenaikainen tiedoston loppu (CRC:ssä)\n" - -#: g10/armor.c:819 -msgid "malformed CRC\n" -msgstr "väärinmuotoiltu CRC\n" - -#: g10/armor.c:823 g10/armor.c:1380 -#, fuzzy, c-format -msgid "CRC error; %06lX - %06lX\n" -msgstr "CRC-virhe; %06lx - %06lx\n" - -#: g10/armor.c:843 -#, fuzzy -msgid "premature eof (in trailer)\n" -msgstr "Ennenaikainen tiedoston loppu (Trailerissa)\n" - -#: g10/armor.c:847 -msgid "error in trailer line\n" -msgstr "virhe trailer-rivissä\n" - -#: g10/armor.c:1158 -msgid "no valid OpenPGP data found.\n" -msgstr "kelvollista OpenPGP-dataa ei löytynyt.\n" - -#: g10/armor.c:1163 -#, 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:1167 -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:280 -#, 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:3826 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:3387 g10/keyserver.c:1700 -#: 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:2349 g10/keyserver.c:1714 -#: 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:67 g10/mainproc.c:293 -#, c-format -msgid "%s encrypted data\n" -msgstr "%s salattua dataa\n" - -#: g10/encr-data.c:69 g10/mainproc.c:297 -#, c-format -msgid "encrypted with unknown algorithm %d\n" -msgstr "salattu tuntemattomalla algoritmilla %d\n" - -#: g10/encr-data.c:93 -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:104 -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:415 -#, 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:375 -msgid "" -"@Commands:\n" -" " -msgstr "" -"@Komennot:\n" -" " - -#: g10/gpg.c:377 -msgid "|[file]|make a signature" -msgstr "|[tiedosto]|tee allekirjoitus" - -#: g10/gpg.c:378 -msgid "|[file]|make a clear text signature" -msgstr "|[tiedosto]|tee selkokielinen allekirjoitus" - -#: g10/gpg.c:379 -msgid "make a detached signature" -msgstr "tee erillinen allekirjoitus" - -#: g10/gpg.c:380 -msgid "encrypt data" -msgstr "salaa tiedot" - -#: g10/gpg.c:382 -msgid "encryption only with symmetric cipher" -msgstr "salaa vain symmetrisellä salaimella" - -#: g10/gpg.c:384 -msgid "decrypt data (default)" -msgstr "avaa tiedot (oletus)" - -#: g10/gpg.c:386 -msgid "verify a signature" -msgstr "tarkista allekirjoitus" - -#: g10/gpg.c:388 -msgid "list keys" -msgstr "näytä avaimet" - -#: g10/gpg.c:390 -msgid "list keys and signatures" -msgstr "näytä avaimet allekirjoituksineen" - -#: g10/gpg.c:391 -#, fuzzy -msgid "list and check key signatures" -msgstr "tarkista avainten allekirjoitukset" - -#: g10/gpg.c:392 -msgid "list keys and fingerprints" -msgstr "näytä avaimet sormenjälkineen" - -#: g10/gpg.c:393 -msgid "list secret keys" -msgstr "näytä salaiset avaimet" - -#: g10/gpg.c:394 -msgid "generate a new key pair" -msgstr "luo uusi avainpari" - -#: g10/gpg.c:395 -msgid "remove keys from the public keyring" -msgstr "poista avaimet julkisten avainten renkaasta" - -#: g10/gpg.c:397 -msgid "remove keys from the secret keyring" -msgstr "poista avaimet salaisten avainten renkaasta" - -#: g10/gpg.c:398 -msgid "sign a key" -msgstr "allekirjoita avain" - -#: g10/gpg.c:399 -msgid "sign a key locally" -msgstr "allekirjoita avain paikallisesti" - -#: g10/gpg.c:400 -msgid "sign or edit a key" -msgstr "allekirjoita tai muokkaa avainta" - -#: g10/gpg.c:401 -msgid "generate a revocation certificate" -msgstr "luo mitätöintivarmenne" - -#: g10/gpg.c:403 -msgid "export keys" -msgstr "vie avaimia" - -#: g10/gpg.c:404 -msgid "export keys to a key server" -msgstr "vie avaimia palvelimelle" - -#: g10/gpg.c:405 -msgid "import keys from a key server" -msgstr "nouda avaimia avainpalvelimelta" - -#: g10/gpg.c:407 -msgid "search for keys on a key server" -msgstr "etsi avaimia avainpalvelimelta" - -#: g10/gpg.c:409 -msgid "update all keys from a keyserver" -msgstr "päivitä kaikki avaimet avainpalvelimelta" - -#: g10/gpg.c:413 -msgid "import/merge keys" -msgstr "nouda/liitä avaimia" - -#: g10/gpg.c:416 -msgid "print the card status" -msgstr "" - -#: g10/gpg.c:417 -msgid "change data on a card" -msgstr "" - -#: g10/gpg.c:418 -msgid "change a card's PIN" -msgstr "" - -#: g10/gpg.c:426 -msgid "update the trust database" -msgstr "päivitä luottamustietokanta" - -#: g10/gpg.c:433 -msgid "|algo [files]|print message digests" -msgstr "|algo [tiedostot]|tulosta viestien tiivisteet" - -#: g10/gpg.c:437 g10/gpgv.c:71 -msgid "" -"@\n" -"Options:\n" -" " -msgstr "" -"@\n" -"Valitsimet:\n" -" " - -#: g10/gpg.c:439 -msgid "create ascii armored output" -msgstr "tuota ascii-koodattu tuloste" - -#: g10/gpg.c:441 -msgid "|NAME|encrypt for NAME" -msgstr "|NIMI|salaa vastaanottajalle NIMI" - -#: g10/gpg.c:452 -msgid "use this user-id to sign or decrypt" -msgstr "käytä tätä käyttäjätunnusta allekirjoittamiseen ja avaamiseen" - -#: g10/gpg.c:453 -msgid "|N|set compress level N (0 disables)" -msgstr "|N|aseta pakkausaste N (0 poistaa käytöstä)" - -#: g10/gpg.c:458 -msgid "use canonical text mode" -msgstr "käytä tekstimuotoa" - -#: g10/gpg.c:472 -msgid "use as output file" -msgstr "käytä tulostustiedostona" - -#: g10/gpg.c:474 g10/gpgv.c:73 -msgid "verbose" -msgstr "monisanainen" - -#: g10/gpg.c:485 -msgid "do not make any changes" -msgstr "älä tee muutoksia" - -#: g10/gpg.c:486 -msgid "prompt before overwriting" -msgstr "kysy ennen ylikirjoittamista" - -#: g10/gpg.c:527 -msgid "use strict OpenPGP behavior" -msgstr "" - -#: g10/gpg.c:528 -msgid "generate PGP 2.x compatible messages" -msgstr "" - -#: g10/gpg.c:556 -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:559 -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:757 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:774 -msgid "Usage: gpg [options] [files] (-h for help)" -msgstr "Käyttö: gpg [valitsimet] [tiedostot] (-h näyttää ohjeen)" - -#: g10/gpg.c:777 -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:788 -msgid "" -"\n" -"Supported algorithms:\n" -msgstr "" -"\n" -"Tuetut algoritmit:\n" - -#: g10/gpg.c:791 -msgid "Pubkey: " -msgstr "JulkAvain: " - -#: g10/gpg.c:797 g10/keyedit.c:2310 -msgid "Cipher: " -msgstr "Salaus: " - -#: g10/gpg.c:803 -msgid "Hash: " -msgstr "Tiiviste: " - -#: g10/gpg.c:809 g10/keyedit.c:2356 -msgid "Compression: " -msgstr "Pakkaus: " - -#: g10/gpg.c:892 -msgid "usage: gpg [options] " -msgstr "käyttö: gpg [valitsimet] " - -#: g10/gpg.c:1040 -msgid "conflicting commands\n" -msgstr "ristiriitainen komento\n" - -#: g10/gpg.c:1058 -#, 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:1255 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on homedir `%s'\n" -msgstr "VAROITUS: omistussuhde kohteessa %s \"%s\" ei ole turvallinen\"\n" - -#: g10/gpg.c:1258 -#, 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:1261 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on extension `%s'\n" -msgstr "VAROITUS: omistussuhde kohteessa %s \"%s\" ei ole turvallinen\"\n" - -#: g10/gpg.c:1267 -#, 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:1270 -#, 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:1273 -#, 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:1279 -#, 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:1282 -#, 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:1285 -#, 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:1291 -#, 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:1294 -#, 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:1297 -#, 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:1438 -#, fuzzy, c-format -msgid "unknown configuration item `%s'\n" -msgstr "tuntematon asetus \"%s\"\n" - -#: g10/gpg.c:1531 -msgid "display photo IDs during key listings" -msgstr "" - -#: g10/gpg.c:1533 -msgid "show policy URLs during signature listings" -msgstr "" - -#: g10/gpg.c:1535 -#, fuzzy -msgid "show all notations during signature listings" -msgstr "Salaisesta avainrenkaasta ei löydy vastaavaa allekirjoitusta\n" - -#: g10/gpg.c:1537 -msgid "show IETF standard notations during signature listings" -msgstr "" - -#: g10/gpg.c:1541 -msgid "show user-supplied notations during signature listings" -msgstr "" - -#: g10/gpg.c:1543 -#, fuzzy -msgid "show preferred keyserver URLs during signature listings" -msgstr "annettu allekirjoituskäytännön URL on virheellinen\n" - -#: g10/gpg.c:1545 -msgid "show user ID validity during key listings" -msgstr "" - -#: g10/gpg.c:1547 -msgid "show revoked and expired user IDs in key listings" -msgstr "" - -#: g10/gpg.c:1549 -msgid "show revoked and expired subkeys in key listings" -msgstr "" - -#: g10/gpg.c:1551 -#, fuzzy -msgid "show the keyring name in key listings" -msgstr "näytä mihin avainrenkaaseen tulostettu avain kuuluu" - -#: g10/gpg.c:1553 -#, fuzzy -msgid "show expiration dates during signature listings" -msgstr "Salaisesta avainrenkaasta ei löydy vastaavaa allekirjoitusta\n" - -#: g10/gpg.c:1920 -#, 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:1962 -#, c-format -msgid "NOTE: no default option file `%s'\n" -msgstr "HUOM: Ei oletusasetustiedostoa \"%s\"\n" - -#: g10/gpg.c:1966 -#, c-format -msgid "option file `%s': %s\n" -msgstr "asetustiedosto \"%s\": %s\n" - -#: g10/gpg.c:1973 -#, c-format -msgid "reading options from `%s'\n" -msgstr "luetaan asetukset tiedostosta \"%s\"\n" - -#: g10/gpg.c:2188 g10/gpg.c:2814 g10/gpg.c:2833 -#, c-format -msgid "NOTE: %s is not for normal use!\n" -msgstr "HUOM: %s ei ole normaaliin käyttöön!\n" - -#: g10/gpg.c:2201 -#, 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:2364 g10/gpg.c:2376 -#, fuzzy, c-format -msgid "`%s' is not a valid signature expiration\n" -msgstr "%s ei kelpaa merkistöksi\n" - -#: g10/gpg.c:2452 -#, fuzzy, c-format -msgid "`%s' is not a valid character set\n" -msgstr "%s ei kelpaa merkistöksi\n" - -#: g10/gpg.c:2476 g10/gpg.c:2663 g10/keyedit.c:4064 -#, fuzzy -msgid "could not parse keyserver URL\n" -msgstr "avainpalvelimen URI:iä ei voi jäsentää\n" - -#: g10/gpg.c:2488 -#, fuzzy, c-format -msgid "%s:%d: invalid keyserver options\n" -msgstr "%s:%d: virheelliset vientivalitsimet\n" - -#: g10/gpg.c:2491 -#, fuzzy -msgid "invalid keyserver options\n" -msgstr "virheelliset vientivalitsimet\n" - -#: g10/gpg.c:2498 -#, c-format -msgid "%s:%d: invalid import options\n" -msgstr "%s:%d: virheelliset tuontivalitsimet\n" - -#: g10/gpg.c:2501 -msgid "invalid import options\n" -msgstr "virheelliset tuontivalitsimet\n" - -#: g10/gpg.c:2508 -#, c-format -msgid "%s:%d: invalid export options\n" -msgstr "%s:%d: virheelliset vientivalitsimet\n" - -#: g10/gpg.c:2511 -msgid "invalid export options\n" -msgstr "virheelliset vientivalitsimet\n" - -#: g10/gpg.c:2518 -#, fuzzy, c-format -msgid "%s:%d: invalid list options\n" -msgstr "%s:%d: virheelliset tuontivalitsimet\n" - -#: g10/gpg.c:2521 -#, fuzzy -msgid "invalid list options\n" -msgstr "virheelliset tuontivalitsimet\n" - -#: g10/gpg.c:2529 -msgid "display photo IDs during signature verification" -msgstr "" - -#: g10/gpg.c:2531 -msgid "show policy URLs during signature verification" -msgstr "" - -#: g10/gpg.c:2533 -#, fuzzy -msgid "show all notations during signature verification" -msgstr "%s ei kelpaa merkistöksi\n" - -#: g10/gpg.c:2535 -msgid "show IETF standard notations during signature verification" -msgstr "" - -#: g10/gpg.c:2539 -msgid "show user-supplied notations during signature verification" -msgstr "" - -#: g10/gpg.c:2541 -#, fuzzy -msgid "show preferred keyserver URLs during signature verification" -msgstr "annettu allekirjoituskäytännön URL on virheellinen\n" - -#: g10/gpg.c:2543 -#, fuzzy -msgid "show user ID validity during signature verification" -msgstr "%s ei kelpaa merkistöksi\n" - -#: g10/gpg.c:2545 -msgid "show revoked and expired user IDs in signature verification" -msgstr "" - -#: g10/gpg.c:2547 -msgid "validate signatures with PKA data" -msgstr "" - -#: g10/gpg.c:2549 -msgid "elevate the trust of signatures with valid PKA data" -msgstr "" - -#: g10/gpg.c:2556 -#, fuzzy, c-format -msgid "%s:%d: invalid verify options\n" -msgstr "%s:%d: virheelliset vientivalitsimet\n" - -#: g10/gpg.c:2559 -#, fuzzy -msgid "invalid verify options\n" -msgstr "virheelliset vientivalitsimet\n" - -#: g10/gpg.c:2566 -#, c-format -msgid "unable to set exec-path to %s\n" -msgstr "exec-polkua kohteeseen %s ei voi asettaa\n" - -#: g10/gpg.c:2729 -#, fuzzy, c-format -msgid "%s:%d: invalid auto-key-locate list\n" -msgstr "%s:%d: virheelliset vientivalitsimet\n" - -#: g10/gpg.c:2732 -msgid "invalid auto-key-locate list\n" -msgstr "" - -#: g10/gpg.c:2803 -msgid "WARNING: program may create a core file!\n" -msgstr "VAROITUS: ohjelma voi luoda core-tiedoston!\n" - -#: g10/gpg.c:2807 -#, c-format -msgid "WARNING: %s overrides %s\n" -msgstr "VAROITUS: %s korvaa %s:n\n" - -#: g10/gpg.c:2816 -#, c-format -msgid "%s not allowed with %s!\n" -msgstr "%s ja %s eivät ole sallittuja yhdessä!\n" - -#: g10/gpg.c:2819 -#, c-format -msgid "%s makes no sense with %s!\n" -msgstr "%s ja %s yhdessä on järjetöntä!\n" - -#: g10/gpg.c:2826 -#, 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:2841 -#, fuzzy, c-format -msgid "will not run with insecure memory due to %s\n" -msgstr "kirjoitan salaisen avaimen kohteeseen \"%s\"\n" - -#: g10/gpg.c:2855 -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:2861 -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:2867 -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:2880 -msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n" -msgstr "viestin salaaaminen --pgp2-tilassa vaatii IDEA-salaimen\n" - -#: g10/gpg.c:2947 g10/gpg.c:2971 -msgid "selected cipher algorithm is invalid\n" -msgstr "valittu salausalgoritmi ei kelpaa\n" - -#: g10/gpg.c:2953 g10/gpg.c:2977 -msgid "selected digest algorithm is invalid\n" -msgstr "valittu tiivistealgoritmi ei kelpaa\n" - -#: g10/gpg.c:2959 -#, fuzzy -msgid "selected compression algorithm is invalid\n" -msgstr "valittu salausalgoritmi ei kelpaa\n" - -#: g10/gpg.c:2965 -msgid "selected certification digest algorithm is invalid\n" -msgstr "valittu varmenteen tiivistealgoritmi ei kelpaa\n" - -#: g10/gpg.c:2980 -msgid "completes-needed must be greater than 0\n" -msgstr "completes-needed täytyy olla suurempi kuin 0\n" - -#: g10/gpg.c:2982 -msgid "marginals-needed must be greater than 1\n" -msgstr "marginals-needed täytyy olla suurempi kuin 1\n" - -#: g10/gpg.c:2984 -#, 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:2986 -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:2988 -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:2991 -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:2995 -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:3002 -msgid "invalid default preferences\n" -msgstr "virheelliset oletusarvoiset valinnat\n" - -#: g10/gpg.c:3011 -msgid "invalid personal cipher preferences\n" -msgstr "virheelliset henkilökohtaisen salaimen valinnat\n" - -#: g10/gpg.c:3015 -msgid "invalid personal digest preferences\n" -msgstr "virheelliset henkilökohtaiset tiivisteen valinnat\n" - -#: g10/gpg.c:3019 -msgid "invalid personal compress preferences\n" -msgstr "virheelliset henkilökohtaiset pakkausvalinnat\n" - -#: g10/gpg.c:3052 -#, c-format -msgid "%s does not yet work with %s\n" -msgstr "%s ja %s eivät vielä toimi yhdessä\n" - -#: g10/gpg.c:3099 -#, 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:3104 -#, 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:3109 -#, 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:3208 -#, c-format -msgid "failed to initialize the TrustDB: %s\n" -msgstr "TrustDB:n alustaminen ei onnistu: %s\n" - -#: g10/gpg.c:3219 -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:3230 -msgid "--store [filename]" -msgstr "--store [tiedostonimi]" - -#: g10/gpg.c:3237 -msgid "--symmetric [filename]" -msgstr "--symmetric [tiedostonimi]" - -#: g10/gpg.c:3239 -#, fuzzy, c-format -msgid "symmetric encryption of `%s' failed: %s\n" -msgstr "avaus epäonnistui: %s\n" - -#: g10/gpg.c:3249 -msgid "--encrypt [filename]" -msgstr "--encrypt [tiedostonimi]" - -#: g10/gpg.c:3262 -#, fuzzy -msgid "--symmetric --encrypt [filename]" -msgstr "--sign --encrypt [tiedostonimi]" - -#: g10/gpg.c:3264 -msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n" -msgstr "" - -#: g10/gpg.c:3267 -#, 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:3285 -msgid "--sign [filename]" -msgstr "--allekirjoita [tiedostonimi]" - -#: g10/gpg.c:3298 -msgid "--sign --encrypt [filename]" -msgstr "--sign --encrypt [tiedostonimi]" - -#: g10/gpg.c:3313 -#, fuzzy -msgid "--symmetric --sign --encrypt [filename]" -msgstr "--sign --encrypt [tiedostonimi]" - -#: g10/gpg.c:3315 -msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n" -msgstr "" - -#: g10/gpg.c:3318 -#, 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:3338 -msgid "--sign --symmetric [filename]" -msgstr "--sign --symmetric [tiedostonimi]" - -#: g10/gpg.c:3347 -msgid "--clearsign [filename]" -msgstr "--clearsign [tiedostonimi]" - -#: g10/gpg.c:3372 -msgid "--decrypt [filename]" -msgstr "--decrypt [tiedostonimi]" - -#: g10/gpg.c:3380 -msgid "--sign-key user-id" -msgstr "--sign-key käyttäjätunnus" - -#: g10/gpg.c:3384 -msgid "--lsign-key user-id" -msgstr "--lsign-key käyttäjätunnus" - -#: g10/gpg.c:3405 -msgid "--edit-key user-id [commands]" -msgstr "--edit-key käyttäjätunnus [komennot]" - -#: g10/gpg.c:3476 -msgid "-k[v][v][v][c] [user-id] [keyring]" -msgstr "-k[v][v][v][c] [käyttäjätunnus] [avainrengas]" - -#: g10/gpg.c:3518 -#, c-format -msgid "keyserver send failed: %s\n" -msgstr "avainpalvelimelle lähettäminen epäonnistui: %s\n" - -#: g10/gpg.c:3520 -#, c-format -msgid "keyserver receive failed: %s\n" -msgstr "avainpalvelimelta vastaanotto epäonnistui: %s\n" - -#: g10/gpg.c:3522 -#, c-format -msgid "key export failed: %s\n" -msgstr "avaimen vienti epäonnistui: %s\n" - -#: g10/gpg.c:3533 -#, c-format -msgid "keyserver search failed: %s\n" -msgstr "avainpalvelimelta etsiminen epäonnistui: %s\n" - -#: g10/gpg.c:3543 -#, c-format -msgid "keyserver refresh failed: %s\n" -msgstr "avainpalvelimen päivitys epäonnistui: %s\n" - -#: g10/gpg.c:3594 -#, c-format -msgid "dearmoring failed: %s\n" -msgstr "ascii-koodauksen purku epäonnistui: %s\n" - -#: g10/gpg.c:3602 -#, c-format -msgid "enarmoring failed: %s\n" -msgstr "ascii-koodaaminen epäonnistui: %s\n" - -#: g10/gpg.c:3689 -#, c-format -msgid "invalid hash algorithm `%s'\n" -msgstr "virheellinen tiivistealgoritmi \"%s\"\n" - -#: g10/gpg.c:3812 -msgid "[filename]" -msgstr "[tiedostonimi]" - -#: g10/gpg.c:3816 -msgid "Go ahead and type your message ...\n" -msgstr "Kirjoita viestisi...\n" - -#: g10/gpg.c:4120 -msgid "the given certification policy URL is invalid\n" -msgstr "annettu varmennekäytännön URL on virheellinen\n" - -#: g10/gpg.c:4122 -msgid "the given signature policy URL is invalid\n" -msgstr "annettu allekirjoituskäytännön URL on virheellinen\n" - -#: g10/gpg.c:4155 -#, 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:3707 -#, 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:266 -#, c-format -msgid "skipping block of type %d\n" -msgstr "ohitetaan tyypin %d lohko\n" - -#: g10/import.c:275 -#, fuzzy, c-format -msgid "%lu keys processed so far\n" -msgstr "tähän mennessä käsitelty %lu avainta\n" - -#: g10/import.c:292 -#, c-format -msgid "Total number processed: %lu\n" -msgstr "Kaikkiaan käsitelty: %lu\n" - -#: g10/import.c:294 -#, c-format -msgid " skipped new keys: %lu\n" -msgstr " ohitetaan uudet avaimet: %lu\n" - -#: g10/import.c:297 -#, c-format -msgid " w/o user IDs: %lu\n" -msgstr " ilman käyttäjätunnuksia: %lu\n" - -#: g10/import.c:299 -#, c-format -msgid " imported: %lu" -msgstr " tuotu: %lu" - -#: g10/import.c:305 -#, c-format -msgid " unchanged: %lu\n" -msgstr " muuttamatonta: %lu\n" - -#: g10/import.c:307 -#, c-format -msgid " new user IDs: %lu\n" -msgstr " uusia käyttäjätunnuksia: %lu\n" - -#: g10/import.c:309 -#, c-format -msgid " new subkeys: %lu\n" -msgstr " uusia aliavaimia: %lu\n" - -#: g10/import.c:311 -#, c-format -msgid " new signatures: %lu\n" -msgstr " uusia allekirjoituksia: %lu\n" - -#: g10/import.c:313 -#, c-format -msgid " new key revocations: %lu\n" -msgstr " uusia avainten mitätöintejä: %lu\n" - -#: g10/import.c:315 -#, c-format -msgid " secret keys read: %lu\n" -msgstr " luettuja salaisia avaimia: %lu\n" - -#: g10/import.c:317 -#, c-format -msgid " secret keys imported: %lu\n" -msgstr " tuotuja salaisia avaimia: %lu\n" - -#: g10/import.c:319 -#, c-format -msgid " secret keys unchanged: %lu\n" -msgstr " muuttamattomia salaisia avaimia: %lu\n" - -#: g10/import.c:321 -#, c-format -msgid " not imported: %lu\n" -msgstr " ei tuotu: %lu\n" - -#: g10/import.c:323 -#, fuzzy, c-format -msgid " signatures cleaned: %lu\n" -msgstr " uusia allekirjoituksia: %lu\n" - -#: g10/import.c:325 -#, fuzzy, c-format -msgid " user IDs cleaned: %lu\n" -msgstr " luettuja salaisia avaimia: %lu\n" - -#: g10/import.c:566 -#, 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:570 -#, fuzzy -msgid " algorithms on these user IDs:\n" -msgstr "Olet allekirjoittanut seuraavat käyttäjätunnukset:\n" - -#: g10/import.c:607 -#, c-format -msgid " \"%s\": preference for cipher algorithm %s\n" -msgstr "" - -# Ensimmäinen %s on binary, textmode tai unknown, ks. alla -#: g10/import.c:619 -#, fuzzy, c-format -msgid " \"%s\": preference for digest algorithm %s\n" -msgstr "%sallekirjoitus, tiivistealgoritmi %s\n" - -#: g10/import.c:631 -#, c-format -msgid " \"%s\": preference for compression algorithm %s\n" -msgstr "" - -#: g10/import.c:644 -msgid "it is strongly suggested that you update your preferences and\n" -msgstr "" - -#: g10/import.c:646 -msgid "re-distribute this key to avoid potential algorithm mismatch problems\n" -msgstr "" - -#: g10/import.c:670 -#, c-format -msgid "you can update your preferences with: gpg --edit-key %s updpref save\n" -msgstr "" - -#: g10/import.c:720 g10/import.c:1118 -#, fuzzy, c-format -msgid "key %s: no user ID\n" -msgstr "avain %08lX: ei käyttäjätunnusta\n" - -#: g10/import.c:749 -#, fuzzy, c-format -msgid "key %s: PKS subkey corruption repaired\n" -msgstr "avain %08lX: HKP-aliavainvirhe korjattu\n" - -#: g10/import.c:764 -#, 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:770 -#, fuzzy, c-format -msgid "key %s: no valid user IDs\n" -msgstr "avain %08lX: ei voimassaolevia käyttäjätunnuksia\n" - -#: g10/import.c:772 -msgid "this may be caused by a missing self-signature\n" -msgstr "tämän voi aiheuttaa puuttuva oma-allekirjoitus\n" - -#: g10/import.c:782 g10/import.c:1240 -#, 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:788 -#, fuzzy, c-format -msgid "key %s: new key - skipped\n" -msgstr "avain %08lX: uusi avain - ohitetaan\n" - -#: g10/import.c:797 -#, c-format -msgid "no writable keyring found: %s\n" -msgstr "kirjoitettavissa olevaa avainrengasta ei löydy: %s\n" - -#: g10/import.c:802 g10/openfile.c:267 g10/sign.c:831 g10/sign.c:1135 -#, c-format -msgid "writing to `%s'\n" -msgstr "kirjoitetaan kohteeseen \"%s\"\n" - -#: g10/import.c:806 g10/import.c:901 g10/import.c:1158 g10/import.c:1301 -#: g10/import.c:2363 g10/import.c:2385 -#, c-format -msgid "error writing keyring `%s': %s\n" -msgstr "virhe kirjoitettaessa avainrenkaaseen \"%s\": %s\n" - -#: g10/import.c:825 -#, fuzzy, c-format -msgid "key %s: public key \"%s\" imported\n" -msgstr "avain %08lX: julkinen avain \"%s\" tuotu\n" - -#: g10/import.c:849 -#, fuzzy, c-format -msgid "key %s: doesn't match our copy\n" -msgstr "avain %08lX: ei vastaa omaa kopiotamme\n" - -#: g10/import.c:866 g10/import.c:1258 -#, 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:874 g10/import.c:1265 -#, 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:911 -#, 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:914 -#, 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:917 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new signature\n" -msgstr "avain %08lX: \"%s\" 1 uusi allekirjoitus\n" - -#: g10/import.c:920 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new signatures\n" -msgstr "avain %08lX: \"%s\" %d uutta allekirjoitusta\n" - -#: g10/import.c:923 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new subkey\n" -msgstr "avain %08lX: \"%s\" 1 uusi aliavain\n" - -#: g10/import.c:926 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new subkeys\n" -msgstr "avain %08lX: \"%s\" %d uutta aliavainta\n" - -#: g10/import.c:929 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signature cleaned\n" -msgstr "avain %08lX: \"%s\" %d uutta allekirjoitusta\n" - -#: g10/import.c:932 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signatures cleaned\n" -msgstr "avain %08lX: \"%s\" %d uutta allekirjoitusta\n" - -#: g10/import.c:935 -#, 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:938 -#, 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:961 -#, fuzzy, c-format -msgid "key %s: \"%s\" not changed\n" -msgstr "avain %08lX: \"%s\" ei muutoksia\n" - -#: g10/import.c:1124 -#, 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:1135 -#, fuzzy -msgid "importing secret keys not allowed\n" -msgstr "kirjoitan salaisen avaimen kohteeseen \"%s\"\n" - -#: g10/import.c:1152 g10/import.c:2378 -#, c-format -msgid "no default secret keyring: %s\n" -msgstr "salaiselle avainrenkaalle ei ole asetettu oletusarvoa: %s\n" - -#: g10/import.c:1163 -#, fuzzy, c-format -msgid "key %s: secret key imported\n" -msgstr "avain %08lX: salainen avain tuotu\n" - -#: g10/import.c:1193 -#, fuzzy, c-format -msgid "key %s: already in secret keyring\n" -msgstr "avain %08lX: avain on jo avainrenkaassa\n" - -#: g10/import.c:1203 -#, 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:1233 -#, 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:1276 -#, 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:1308 -#, fuzzy, c-format -msgid "key %s: \"%s\" revocation certificate imported\n" -msgstr "avain %08lX: mitätöintivarmenne \"%s\" tuotu\n" - -#: g10/import.c:1374 -#, 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:1389 -#, 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:1391 -#, 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:1409 -#, fuzzy, c-format -msgid "key %s: no subkey for key binding\n" -msgstr "avain %08lX: ei aliavainta avainten riippuvuuksiin\n" - -#: g10/import.c:1420 g10/import.c:1470 -#, fuzzy, c-format -msgid "key %s: unsupported public key algorithm\n" -msgstr "avain %08lX: julkisen avaimen algoritmia ei tueta\n" - -#: g10/import.c:1422 -#, fuzzy, c-format -msgid "key %s: invalid subkey binding\n" -msgstr "avain %08lX: pätemätön aliavainriippuvuus\n" - -#: g10/import.c:1437 -#, fuzzy, c-format -msgid "key %s: removed multiple subkey binding\n" -msgstr "avain %08lX: moninkertainen aliavainriippuvuus poistettu\n" - -#: g10/import.c:1459 -#, 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:1472 -#, fuzzy, c-format -msgid "key %s: invalid subkey revocation\n" -msgstr "avain %08lX: epäkelpo aliavaimen mitätöinti\n" - -#: g10/import.c:1487 -#, fuzzy, c-format -msgid "key %s: removed multiple subkey revocation\n" -msgstr "avain %08lX: useiden aliavainten mitätöinti poistettu\n" - -#: g10/import.c:1529 -#, fuzzy, c-format -msgid "key %s: skipped user ID \"%s\"\n" -msgstr "avain %08lX: käyttäjätunnus ohitettu '" - -#: g10/import.c:1550 -#, fuzzy, c-format -msgid "key %s: skipped subkey\n" -msgstr "avain %08lX: aliavain ohitettu\n" - -#: g10/import.c:1577 -#, 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:1587 -#, 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:1604 -#, 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:1618 -#, 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:1626 -#, 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:1726 -#, 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:1788 -#, 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:1802 -#, 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:1861 -#, fuzzy, c-format -msgid "key %s: \"%s\" revocation certificate added\n" -msgstr "avain %08lX: \"%s\"-mitätöintivarmenne lisätty\n" - -#: g10/import.c:1895 -#, fuzzy, c-format -msgid "key %s: direct key signature added\n" -msgstr "avain %08lX: lisättiin suora avainallekirjoitus\n" - -#: g10/import.c:2284 -#, 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:2292 -#, fuzzy -msgid "NOTE: primary key is online and stored on card\n" -msgstr "ohitetaan: salainen avain on jo paikalla\n" - -#: g10/import.c:2294 -#, 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:4783 g10/keyedit.c:4874 g10/keyedit.c:4938 -#: g10/keyedit.c:4999 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:3346 -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:3249 -#, 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:3341 -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:3352 -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:3372 -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:3397 -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:3412 -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:3434 -#, 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:3453 -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:3459 -#, 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:3520 -msgid "Please remove selections from the secret keys.\n" -msgstr "Poista salaisten avainten valinnat, kiitos.\n" - -#: g10/keyedit.c:3526 -#, fuzzy -msgid "Please select at most one subkey.\n" -msgstr "Valitse korkeintaan yksi toissijainen avain, kiitos.\n" - -#: g10/keyedit.c:3530 -#, fuzzy -msgid "Changing expiration time for a subkey.\n" -msgstr "Muutetaan toissijaisen avaimen vanhentumisaikaa.\n" - -#: g10/keyedit.c:3533 -msgid "Changing expiration time for the primary key.\n" -msgstr "Muutetaan ensisijaisen avaimen vanhentumisaikaa.\n" - -#: g10/keyedit.c:3579 -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:3595 -msgid "No corresponding signature in secret ring\n" -msgstr "Salaisesta avainrenkaasta ei löydy vastaavaa allekirjoitusta\n" - -#: g10/keyedit.c:3668 -#, fuzzy, c-format -msgid "signing subkey %s is already cross-certified\n" -msgstr "VAROITUS: allekirjoitusaliavain %08lX ei ole ristiinvarmennettu\n" - -#: g10/keyedit.c:3674 -#, c-format -msgid "subkey %s does not sign and so does not need to be cross-certified\n" -msgstr "" - -#: g10/keyedit.c:3836 -msgid "Please select exactly one user ID.\n" -msgstr "Valitse tasan yksi käyttäjätunnus!\n" - -#: g10/keyedit.c:3875 g10/keyedit.c:3985 g10/keyedit.c:4105 g10/keyedit.c:4246 -#, 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:4046 -msgid "Enter your preferred keyserver URL: " -msgstr "" - -#: g10/keyedit.c:4126 -#, fuzzy -msgid "Are you sure you want to replace it? (y/N) " -msgstr "Haluatko varmasti käyttää sitä (k/E)? " - -#: g10/keyedit.c:4127 -#, fuzzy -msgid "Are you sure you want to delete it? (y/N) " -msgstr "Haluatko varmasti käyttää sitä (k/E)? " - -#: g10/keyedit.c:4189 -#, fuzzy -msgid "Enter the notation: " -msgstr "Allekirjoitusnotaatio: " - -#: g10/keyedit.c:4338 -#, fuzzy -msgid "Proceed? (y/N) " -msgstr "Ylikirjoita (k/E)? " - -#: g10/keyedit.c:4402 -#, c-format -msgid "No user ID with index %d\n" -msgstr "Indeksillä %d ei löydy käyttäjätunnusta\n" - -#: g10/keyedit.c:4460 -#, 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:4487 -#, fuzzy, c-format -msgid "No subkey with index %d\n" -msgstr "Indeksillä %d ei löydy käyttäjätunnusta\n" - -#: g10/keyedit.c:4622 -#, fuzzy, c-format -msgid "user ID: \"%s\"\n" -msgstr "käyttäjätunnus: \"" - -#: g10/keyedit.c:4625 g10/keyedit.c:4689 g10/keyedit.c:4732 -#, 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:4627 g10/keyedit.c:4691 g10/keyedit.c:4734 -msgid " (non-exportable)" -msgstr " (vientiin kelpaamaton)" - -#: g10/keyedit.c:4631 -#, c-format -msgid "This signature expired on %s.\n" -msgstr "Tämä allekirjoitus vanheni %s.\n" - -#: g10/keyedit.c:4635 -msgid "Are you sure you still want to revoke it? (y/N) " -msgstr "Haluatko varmasti mitätöidä sen? (k/E) " - -#: g10/keyedit.c:4639 -msgid "Create a revocation certificate for this signature? (y/N) " -msgstr "Luodaanko tälle alekirjoitukselle mitätöintivarmenne? (k/E) " - -#: g10/keyedit.c:4666 -#, 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:4692 -#, fuzzy -msgid " (non-revocable)" -msgstr " (vientiin kelpaamaton)" - -#: g10/keyedit.c:4699 -#, 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:4721 -msgid "You are about to revoke these signatures:\n" -msgstr "Olet mitätöimässä seuraavat allekirjoitukset:\n" - -#: g10/keyedit.c:4741 -msgid "Really create the revocation certificates? (y/N) " -msgstr "Varmastiko luo mitätöintivarmenteet? (k/E) " - -#: g10/keyedit.c:4771 -msgid "no secret key\n" -msgstr "salainen avain ei ole saatavilla\n" - -#: g10/keyedit.c:4841 -#, 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:4858 -#, 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:4922 -#, 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:4984 -#, 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:5079 -#, 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:1421 -#, 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:1324 -#, fuzzy, c-format -msgid "sending key %s to %s server %s\n" -msgstr "etsitään \"%s\" HKP-palvelimelta %s\n" - -#: g10/keyserver.c:1328 -#, fuzzy, c-format -msgid "sending key %s to %s\n" -msgstr "" -"\"\n" -"allekirjoitettu avaimellasi %08lX %s\n" - -#: g10/keyserver.c:1371 -#, fuzzy, c-format -msgid "searching for \"%s\" from %s server %s\n" -msgstr "etsitään \"%s\" HKP-palvelimelta %s\n" - -#: g10/keyserver.c:1374 -#, fuzzy, c-format -msgid "searching for \"%s\" from %s\n" -msgstr "etsitään \"%s\" HKP-palvelimelta %s\n" - -#: g10/keyserver.c:1381 g10/keyserver.c:1477 -#, fuzzy -msgid "no keyserver action!\n" -msgstr "virheelliset vientivalitsimet\n" - -#: g10/keyserver.c:1429 -#, c-format -msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n" -msgstr "" - -#: g10/keyserver.c:1438 -msgid "keyserver did not send VERSION\n" -msgstr "" - -#: g10/keyserver.c:1500 g10/keyserver.c:2028 -msgid "no keyserver known (use option --keyserver)\n" -msgstr "" - -#: g10/keyserver.c:1506 -msgid "external keyserver calls are not supported in this build\n" -msgstr "" - -#: g10/keyserver.c:1518 -#, c-format -msgid "no handler for keyserver scheme `%s'\n" -msgstr "" - -#: g10/keyserver.c:1523 -#, c-format -msgid "action `%s' not supported with keyserver scheme `%s'\n" -msgstr "" - -#: g10/keyserver.c:1531 -#, c-format -msgid "%s does not support handler version %d\n" -msgstr "" - -#: g10/keyserver.c:1538 -#, fuzzy -msgid "keyserver timed out\n" -msgstr "avainpalvelinvirhe" - -#: g10/keyserver.c:1543 -#, fuzzy -msgid "keyserver internal error\n" -msgstr "avainpalvelinvirhe" - -#: g10/keyserver.c:1552 -#, fuzzy, c-format -msgid "keyserver communications error: %s\n" -msgstr "avainpalvelimelta vastaanotto epäonnistui: %s\n" - -#: g10/keyserver.c:1577 g10/keyserver.c:1611 -#, c-format -msgid "\"%s\" not a key ID: skipping\n" -msgstr "" - -#: g10/keyserver.c:1870 -#, 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:1892 -#, fuzzy, c-format -msgid "refreshing 1 key from %s\n" -msgstr "pyydetään avainta %08lX kohteesta %s\n" - -#: g10/keyserver.c:1894 -#, fuzzy, c-format -msgid "refreshing %d keys from %s\n" -msgstr "pyydetään avainta %08lX kohteesta %s\n" - -#: g10/keyserver.c:1950 -#, 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:1956 -#, 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:305 -#, c-format -msgid "assuming signed data in `%s'\n" -msgstr "data kohteessa \"%s\" oletetaan allekirjoitetuksi\n" - -#: g10/openfile.c:384 -#, c-format -msgid "new configuration file `%s' created\n" -msgstr "uusi asetustiedosto \"%s\" luotu\n" - -#: g10/openfile.c:386 -#, 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:418 -#, 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:1157 -#, 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:968 -#, 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:973 -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:977 -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:127 g10/skclist.c:191 -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:158 -#, fuzzy, c-format -msgid "skipped \"%s\": duplicated\n" -msgstr "ohitetaan \"%s\": kopio\n" - -#: g10/skclist.c:166 g10/skclist.c:176 g10/skclist.c:185 -#, fuzzy, c-format -msgid "skipped \"%s\": %s\n" -msgstr "ohitetaan \"%s\": %s\n" - -#: g10/skclist.c:171 -msgid "skipped: secret key already present\n" -msgstr "ohitetaan: salainen avain on jo paikalla\n" - -#: g10/skclist.c:186 -#, 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:350 -msgid "operation is not possible without initialized secure memory\n" -msgstr "toiminto on mahdollinen vain, jos suojattu muisti alustetaan\n" - -#: util/secmem.c:351 -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 "User ID \"%s\": %d signature removed.\n" -#~ msgstr "Käyttäjätunnus \"%s\" on mitätöity." - -#, fuzzy -#~ msgid "User ID \"%s\": %d signatures removed.\n" -#~ msgstr "Käyttäjätunnus \"%s\" on mitätöity." - -#, fuzzy -#~ msgid "User ID \"%s\" removed: %s\n" -#~ msgstr "Käyttäjätunnus \"%s\" on mitätöity." - -#, 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.po b/po/fr.po deleted file mode 100644 index a1cb36fe0..000000000 --- a/po/fr.po +++ /dev/null @@ -1,6489 +0,0 @@ -# GnuPG French translation -# Copyright (C) 1998-2005 Free Software Foundation, Inc. -# Gal Quri <gael@lautre.net>, 1998. -# -# Thanks to Rmi Guyomarch <rguyom@mail.dotcom.fr> and <nmorant@amadeus.net> -# for pointing me out some errors. -# -# $Id$ -# -msgid "" -msgstr "" -"Project-Id-Version: gnupg 1.4.2rc2\n" -"Report-Msgid-Bugs-To: gnupg-i18n@gnupg.org\n" -"POT-Creation-Date: 2006-07-28 11:12+0200\n" -"PO-Revision-Date: 2005-06-28 00:24+0200\n" -"Last-Translator: Gal Quri <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 gnrer 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 gnrer un nombre premier avec moins de %d bits\n" - -#: cipher/random.c:173 -msgid "no entropy gathering module detected\n" -msgstr "aucun module de rcupration 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 secrte 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:1003 g10/gpg.c:3461 g10/import.c:195 g10/keygen.c:2385 -#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:342 -#: 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'accder `%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 rgulier - 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:1002 g10/keygen.c:2864 -#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:263 -#: g10/openfile.c:357 g10/sign.c:826 g10/sign.c:1130 g10/tdbio.c:536 -#, c-format -msgid "can't create `%s': %s\n" -msgstr "impossible de crer `%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 gnrateur de nombres alatoires peu sr !!\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 gnrateur de nombres alatoires n'est qu'un artifice visant excuter\n" -"GnuPG - ce n'est en aucune manire un gnrateur (RNG) fort!\n" -"\n" -"N'UTILISEZ PAS LES DONNES GNRES 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 plat que l'entropie soit rcupre. 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 alatoires 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 cration: %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 rponse ne contient pas les donnes 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 rponse 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 rponse 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 vrification CHV%d a chou: %s\n" - -#: g10/app-openpgp.c:1310 -msgid "access to admin commands is not configured\n" -msgstr "l'accs 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 rcupration 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 irrmdiablement bloque !\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 irrmdiablement bloque\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 donnes 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 dj\n" - -#: g10/app-openpgp.c:1566 -msgid "existing key will be replaced\n" -msgstr "la cl existante sera remplace\n" - -#: g10/app-openpgp.c:1568 -msgid "generating new key\n" -msgstr "gnrer une nouvelle cl\n" - -#: g10/app-openpgp.c:1735 -msgid "creation timestamp missing\n" -msgstr "l'horodatage de cration 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 gnre...\n" - -#: g10/app-openpgp.c:1901 -msgid "generating key failed\n" -msgstr "la gnration de la cl a chou\n" - -#: g10/app-openpgp.c:1904 -#, c-format -msgid "key generation completed (%d seconds)\n" -msgstr "la gnration de cl a t effectue (%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 cres 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 vrification 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'accder %s - carte OpenPGP invalide ?\n" - -#: g10/armor.c:320 -#, c-format -msgid "armor: %s\n" -msgstr "armure: %s\n" - -#: g10/armor.c:359 -msgid "invalid armor header: " -msgstr "en-tte d'armure invalide: " - -#: g10/armor.c:370 -msgid "armor header: " -msgstr "en-tte d'armure: " - -#: g10/armor.c:381 -msgid "invalid clearsig header\n" -msgstr "en-tte de signature claire invalide\n" - -#: g10/armor.c:433 -msgid "nested clear text signatures\n" -msgstr "signatures en texte clair imbriques\n" - -#: g10/armor.c:568 -msgid "unexpected armor: " -msgstr "armure inattendue: " - -#: g10/armor.c:580 -msgid "invalid dash escaped line: " -msgstr "ligne chappe par `-' invalide: " - -#: g10/armor.c:734 g10/armor.c:1343 -#, c-format -msgid "invalid radix64 character %02X skipped\n" -msgstr "caractre %02X invalide en radix64 ignor\n" - -#: g10/armor.c:777 -msgid "premature eof (no CRC)\n" -msgstr "fin de fichier prmature (pas de CRC)\n" - -#: g10/armor.c:811 -msgid "premature eof (in CRC)\n" -msgstr "fin de fichier prmature (dans le CRC)\n" - -#: g10/armor.c:819 -msgid "malformed CRC\n" -msgstr "CRC dform\n" - -#: g10/armor.c:823 g10/armor.c:1380 -#, c-format -msgid "CRC error; %06lX - %06lX\n" -msgstr "Erreur de CRC; %06lX - %06lX\n" - -#: g10/armor.c:843 -msgid "premature eof (in trailer)\n" -msgstr "fin de fichier prmature (dans la remorque)\n" - -#: g10/armor.c:847 -msgid "error in trailer line\n" -msgstr "erreur dans la ligne de remorque\n" - -#: g10/armor.c:1158 -msgid "no valid OpenPGP data found.\n" -msgstr "aucune donne OpenPGP valide n'a t trouve.\n" - -#: g10/armor.c:1163 -#, c-format -msgid "invalid armor: line longer than %d characters\n" -msgstr "armure invalide: ligne plus longue que %d caractres\n" - -#: g10/armor.c:1167 -msgid "" -"quoted printable character in armor - probably a buggy MTA has been used\n" -msgstr "" -"caractre 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 dtecte\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 "fminin" - -#: g10/card-util.c:414 -msgid "unspecified" -msgstr "non spcifi" - -#: 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 caractre < 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 dteneur de la carte: " - -#: g10/card-util.c:542 -msgid "Cardholder's given name: " -msgstr "Prnom du dteneur 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 caractres).\n" - -#: g10/card-util.c:581 -msgid "URL to retrieve public key: " -msgstr "URL pour rcuprer 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 caractres).\n" - -#: g10/card-util.c:687 g10/card-util.c:756 g10/import.c:280 -#, 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 "Donnes 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: Donnes d'indentification trop longues (la limite est\n" -"%d caractres).\n" - -#: g10/card-util.c:764 -msgid "Private DO data: " -msgstr "Donnes DO prives: " - -#: 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 caractres).\n" - -#: g10/card-util.c:794 -msgid "Language preferences: " -msgstr "Prfrences de langue: " - -#: g10/card-util.c:802 -msgid "Error: invalid length of preference string.\n" -msgstr "Erreur: longueur invalide de la chane de prfrences.\n" - -#: g10/card-util.c:811 -msgid "Error: invalid characters in preference string.\n" -msgstr "Erreur: caractres invalide dans la chane de prfrences.\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: rponse 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 formate.\n" - -#: g10/card-util.c:938 -#, c-format -msgid "key operation not possible: %s\n" -msgstr "l'opration 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 cls 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 rglages 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 "Slectionnez le type de cl gnrer:\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 "Slectionnez 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 secrtes 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 secrte est dj stocke 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 donnes disponibles" - -#: g10/card-util.c:1327 -msgid "change card holder's name" -msgstr "changer le nom du propritaire de la carte" - -#: g10/card-util.c:1328 -msgid "change URL to retrieve key" -msgstr "changer l'URL pour rcuprer la cl" - -#: g10/card-util.c:1329 -msgid "fetch the key specified in the card URL" -msgstr "aller chercher la cl spcifie 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 prfrences de langue" - -#: g10/card-util.c:1332 -msgid "change card holder's sex" -msgstr "changer le sexe du propritaire 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 paramtre obligeant rentrer le code PIN pour les\n" -"signatures" - -#: g10/card-util.c:1335 -msgid "generate new keys" -msgstr "gnrer de nouvelles cls" - -#: g10/card-util.c:1336 -msgid "menu to change or unblock the PIN" -msgstr "menu pour changer ou dverrouiller le PIN" - -#: g10/card-util.c:1337 -msgid "verify the PIN and list all data" -msgstr "vrifier le code PIN et lister toutes les donnes" - -#: 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 secrte n'est pas disponible" - -#: g10/cardglue.c:434 -msgid "Please insert the card and hit return or enter 'c' to cancel: " -msgstr "Insrez la carte et tapez entre ou entrez 'c' pour annuler: " - -#: g10/cardglue.c:446 -#, fuzzy, c-format -msgid "selecting openpgp failed: %s\n" -msgstr "la suppression du bloc de cls 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 prsente et insrez celle portant le numro de\n" -"srie:\n" -" %.*s\n" - -#: g10/cardglue.c:582 -msgid "Hit return when ready or enter 'c' to cancel: " -msgstr "Tapez entre quand vous tes prt 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 "Rptez ce code PIN: " - -#: g10/cardglue.c:952 -msgid "PIN not correctly repeated; try again" -msgstr "le code PIN n'a pas t correctement rpt ; recommencez" - -#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3826 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:3387 g10/keyserver.c:1700 -#: 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:2349 g10/keyserver.c:1714 -#: 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 spcifier 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-cls ? (o/N) " - -#: g10/delkey.c:155 -msgid "This is a secret key! - really delete? (y/N) " -msgstr "C'est une cl secrte ! - 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 cls a chou : %s\n" - -#: g10/delkey.c:175 -msgid "ownertrust information cleared\n" -msgstr "les informations de confiance au propritaires ont t effaces\n" - -#: g10/delkey.c:206 -#, c-format -msgid "there is a secret key for public key \"%s\"!\n" -msgstr "il y a une cl secrte 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 cration 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 symtrique 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' dj 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 cls 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 cls 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 symtrique %s (%d) entre\n" -"en dsaccord avec les prfrences 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 dsaccord avec les prfrences du destinataire\n" - -#: g10/encode.c:715 -#, c-format -msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n" -msgstr "" -"forcer le chiffrement symtrique %s (%d) entre en dsaccord\n" -"avec les prferences 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:67 g10/mainproc.c:293 -#, c-format -msgid "%s encrypted data\n" -msgstr "donnes chiffres avec %s\n" - -#: g10/encr-data.c:69 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:93 -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 symtrique.\n" - -#: g10/encr-data.c:104 -msgid "problem handling encrypted packet\n" -msgstr "problme de gestion des paquets chiffrs\n" - -#: g10/exec.c:49 -msgid "no remote program execution supported\n" -msgstr "aucun programme d'excution distante n'est support\n" - -#: g10/exec.c:176 g10/openfile.c:415 -#, c-format -msgid "can't create directory `%s': %s\n" -msgstr "impossible de crer le rpertoire `%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 dsactivs car les permissions\n" -"du fichier d'options sont trop peu sres\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'excuter le programme `%s': %s\n" - -#: g10/exec.c:428 -#, c-format -msgid "unable to execute shell `%s': %s\n" -msgstr "impossible d'excuter l'intrprteur de commandes `%s': %s\n" - -#: g10/exec.c:513 -#, c-format -msgid "system error while calling external program: %s\n" -msgstr "erreur systme 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'excuter le programme externe\n" - -#: g10/exec.c:555 -#, c-format -msgid "unable to read external program response: %s\n" -msgstr "impossible de lire la rponse 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 rpertoire temporaire `%s':\n" -"%s\n" - -#: g10/export.c:61 -#, fuzzy -msgid "export signatures that are marked as local-only" -msgstr "La signature sera marque comme non-rvocable.\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 rvocation trouve pour %s \n" - -#: g10/export.c:67 -#, fuzzy -msgid "remove the passphrase from exported subkeys" -msgstr "rvoquer la cl ou les sous-cls slectionnes" - -#: 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 secrtes\n" - -#: g10/export.c:354 -#, c-format -msgid "key %s: not protected - skipped\n" -msgstr "cl %s: non protge - ignore\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 - ignore\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 - ignore\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 secrte %s n'a pas de somme de contrle SK\n" -"simple\n" - -#: g10/export.c:598 -msgid "WARNING: nothing exported\n" -msgstr "ATTENTION: rien n'a t export\n" - -#: g10/gpg.c:375 -msgid "" -"@Commands:\n" -" " -msgstr "" -"@Commandes:\n" -" " - -#: g10/gpg.c:377 -msgid "|[file]|make a signature" -msgstr "|[fichier]|faire une signature" - -#: g10/gpg.c:378 -msgid "|[file]|make a clear text signature" -msgstr "|[fichier]|faire une signature en texte clair" - -#: g10/gpg.c:379 -msgid "make a detached signature" -msgstr "faire une signature dtache" - -#: g10/gpg.c:380 -msgid "encrypt data" -msgstr "chiffrer les donnes" - -#: g10/gpg.c:382 -msgid "encryption only with symmetric cipher" -msgstr "chiffrement symtrique seulement" - -#: g10/gpg.c:384 -msgid "decrypt data (default)" -msgstr "dchiffrer les donnes (dfaut)" - -#: g10/gpg.c:386 -msgid "verify a signature" -msgstr "vrifier une signature" - -#: g10/gpg.c:388 -msgid "list keys" -msgstr "lister les cls" - -#: g10/gpg.c:390 -msgid "list keys and signatures" -msgstr "lister les cls et les signatures" - -#: g10/gpg.c:391 -msgid "list and check key signatures" -msgstr "lister et vrifier les signatures des cls" - -#: g10/gpg.c:392 -msgid "list keys and fingerprints" -msgstr "lister les cls et les empreintes" - -#: g10/gpg.c:393 -msgid "list secret keys" -msgstr "lister les cls secrtes" - -#: g10/gpg.c:394 -msgid "generate a new key pair" -msgstr "gnrer une nouvelle paire de cls" - -#: g10/gpg.c:395 -msgid "remove keys from the public keyring" -msgstr "enlever les cls du porte-cls public" - -#: g10/gpg.c:397 -msgid "remove keys from the secret keyring" -msgstr "enlever les cls du porte-cls secret" - -#: g10/gpg.c:398 -msgid "sign a key" -msgstr "signer une cl" - -#: g10/gpg.c:399 -msgid "sign a key locally" -msgstr "signer une cl localement" - -#: g10/gpg.c:400 -msgid "sign or edit a key" -msgstr "signer ou diter une cl" - -#: g10/gpg.c:401 -msgid "generate a revocation certificate" -msgstr "gnrer un certificat de rvocation" - -#: g10/gpg.c:403 -msgid "export keys" -msgstr "exporter les cls" - -#: g10/gpg.c:404 -msgid "export keys to a key server" -msgstr "exporter les cls vers un serveur de cls" - -#: g10/gpg.c:405 -msgid "import keys from a key server" -msgstr "importer les cls d'un serveur de cls" - -#: g10/gpg.c:407 -msgid "search for keys on a key server" -msgstr "chercher les cls avec un serveur de cls" - -#: g10/gpg.c:409 -msgid "update all keys from a keyserver" -msgstr "mettre jour les cls depuis un serveur" - -#: g10/gpg.c:413 -msgid "import/merge keys" -msgstr "importer/fusionner les cls" - -#: g10/gpg.c:416 -msgid "print the card status" -msgstr "afficher l'tat de la carte" - -#: g10/gpg.c:417 -msgid "change data on a card" -msgstr "changer les donnes d'une carte" - -#: g10/gpg.c:418 -msgid "change a card's PIN" -msgstr "changer le code PIN d'une carte" - -#: g10/gpg.c:426 -msgid "update the trust database" -msgstr "mettre la base de confiance jour" - -#: g10/gpg.c:433 -msgid "|algo [files]|print message digests" -msgstr "|alg. [fich.]|indiquer les fonctions de hachage" - -#: g10/gpg.c:437 g10/gpgv.c:71 -msgid "" -"@\n" -"Options:\n" -" " -msgstr "" -"@\n" -"Options:\n" -" " - -#: g10/gpg.c:439 -msgid "create ascii armored output" -msgstr "crer une sortie ascii avec armure" - -#: g10/gpg.c:441 -msgid "|NAME|encrypt for NAME" -msgstr "|NOM|chiffrer pour NOM" - -#: g10/gpg.c:452 -msgid "use this user-id to sign or decrypt" -msgstr "utiliser ce nom pour signer ou dchiffrer" - -#: g10/gpg.c:453 -msgid "|N|set compress level N (0 disables)" -msgstr "|N|niveau de compression N (0 dsactive)" - -#: g10/gpg.c:458 -msgid "use canonical text mode" -msgstr "utiliser le mode texte canonique" - -#: g10/gpg.c:472 -msgid "use as output file" -msgstr "utiliser comme fichier de sortie" - -#: g10/gpg.c:474 g10/gpgv.c:73 -msgid "verbose" -msgstr "bavard" - -#: g10/gpg.c:485 -msgid "do not make any changes" -msgstr "ne rien changer" - -#: g10/gpg.c:486 -msgid "prompt before overwriting" -msgstr "demander avant d'craser un fichier" - -#: g10/gpg.c:527 -msgid "use strict OpenPGP behavior" -msgstr "utiliser strictement le comportement OpenPGP" - -#: g10/gpg.c:528 -msgid "generate PGP 2.x compatible messages" -msgstr "gnrer des messages compatibles avec PGP 2.x" - -#: g10/gpg.c:556 -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 complte des commandes et options)\n" - -#: g10/gpg.c:559 -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 dtache\n" -" --list-keys [utilisateur] montrer les cls\n" -" --fingerprint [utilisateur] montrer les empreintes\n" - -#: g10/gpg.c:757 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 problme de traduction <traduc@traduc.org>.\n" - -#: g10/gpg.c:774 -msgid "Usage: gpg [options] [files] (-h for help)" -msgstr "Utilisation: gpg [options] [fichiers] (-h pour l'aide)" - -#: g10/gpg.c:777 -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, vrifier, chiffrer ou dchiffrer\n" -"l'opration par dfaut dpend des donnes entres\n" - -#: g10/gpg.c:788 -msgid "" -"\n" -"Supported algorithms:\n" -msgstr "" -"\n" -"Algorithmes supports:\n" - -#: g10/gpg.c:791 -msgid "Pubkey: " -msgstr "Cl publique: " - -#: g10/gpg.c:797 g10/keyedit.c:2310 -msgid "Cipher: " -msgstr "Chiffrement: " - -#: g10/gpg.c:803 -msgid "Hash: " -msgstr "Hachage: " - -#: g10/gpg.c:809 g10/keyedit.c:2356 -msgid "Compression: " -msgstr "Compression: " - -#: g10/gpg.c:892 -msgid "usage: gpg [options] " -msgstr "utilisation: gpg [options] " - -#: g10/gpg.c:1040 -msgid "conflicting commands\n" -msgstr "commandes en conflit\n" - -#: g10/gpg.c:1058 -#, c-format -msgid "no = sign found in group definition `%s'\n" -msgstr "aucun signe = trouv dans la dfinition du groupe `%s'\n" - -#: g10/gpg.c:1255 -#, c-format -msgid "WARNING: unsafe ownership on homedir `%s'\n" -msgstr "" -"AVERTISSEMENT: le propritaire du rpertoire personnel `%s' est\n" -"peu sr\n" - -#: g10/gpg.c:1258 -#, c-format -msgid "WARNING: unsafe ownership on configuration file `%s'\n" -msgstr "" -"AVERTISSEMENT: le propritaire du fichier de configuration `%s'\n" -"est peu sr\n" - -#: g10/gpg.c:1261 -#, c-format -msgid "WARNING: unsafe ownership on extension `%s'\n" -msgstr "" -"AVERTISSEMENT: le propritaire de l'extension `%s' est peu\n" -"sr\n" - -#: g10/gpg.c:1267 -#, c-format -msgid "WARNING: unsafe permissions on homedir `%s'\n" -msgstr "" -"AVERTISSEMENT: les permissions du rpertoire personnel `%s'\n" -"sont peu sres\n" - -#: g10/gpg.c:1270 -#, c-format -msgid "WARNING: unsafe permissions on configuration file `%s'\n" -msgstr "" -"AVERTISSEMENT: les permissions du fichier de configuration\n" -"`%s' sont peu sres\n" - -#: g10/gpg.c:1273 -#, c-format -msgid "WARNING: unsafe permissions on extension `%s'\n" -msgstr "" -"AVERTISSEMENT: les permissions de l'extension `%s' sont\n" -"peu sres\n" - -#: g10/gpg.c:1279 -#, c-format -msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n" -msgstr "" -"AVERTISSEMENT: le propritaire du rpertoire contenant est peu\n" -"sr pour le rpertoire personnel `%s'\n" - -#: g10/gpg.c:1282 -#, c-format -msgid "" -"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n" -msgstr "" -"AVERTISSEMENT: le propritaire du rpertoire contenant est peu\n" -"sr pour le fichier de configuration `%s'\n" - -#: g10/gpg.c:1285 -#, c-format -msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n" -msgstr "" -"AVERTISSEMENT: le propritaire du rpertoire contenant est peu\n" -"sr pour l'extension `%s'\n" - -#: g10/gpg.c:1291 -#, c-format -msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n" -msgstr "" -"AVERTISSEMENT: les permissions du rpertoire contenant le\n" -"rpertoire personnel `%s' sont peu sres\n" - -#: g10/gpg.c:1294 -#, c-format -msgid "" -"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n" -msgstr "" -"AVERTISSEMENT: les permissions du rpertoire contenant le\n" -"fichier de configuration `%s' sont peu sres\n" - -#: g10/gpg.c:1297 -#, c-format -msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n" -msgstr "" -"AVERTISSEMENT: les permissions du rpertoire contenant\n" -"l'extension `%s' sont peu sres\n" - -#: g10/gpg.c:1438 -#, c-format -msgid "unknown configuration item `%s'\n" -msgstr "lment de configuration `%s' inconnu\n" - -#: g10/gpg.c:1531 -msgid "display photo IDs during key listings" -msgstr "" - -#: g10/gpg.c:1533 -msgid "show policy URLs during signature listings" -msgstr "" - -#: g10/gpg.c:1535 -#, fuzzy -msgid "show all notations during signature listings" -msgstr "Pas de signature correspondante dans le porte-cls secret\n" - -#: g10/gpg.c:1537 -msgid "show IETF standard notations during signature listings" -msgstr "" - -#: g10/gpg.c:1541 -msgid "show user-supplied notations during signature listings" -msgstr "" - -#: g10/gpg.c:1543 -#, fuzzy -msgid "show preferred keyserver URLs during signature listings" -msgstr "l'URL du serveur de cls favori qui a t donne est invalide\n" - -#: g10/gpg.c:1545 -msgid "show user ID validity during key listings" -msgstr "" - -#: g10/gpg.c:1547 -msgid "show revoked and expired user IDs in key listings" -msgstr "" - -#: g10/gpg.c:1549 -msgid "show revoked and expired subkeys in key listings" -msgstr "" - -#: g10/gpg.c:1551 -#, fuzzy -msgid "show the keyring name in key listings" -msgstr "" -"passer de la liste des cls secrtes celle des cls prives\n" -"et inversement" - -#: g10/gpg.c:1553 -#, fuzzy -msgid "show expiration dates during signature listings" -msgstr "Pas de signature correspondante dans le porte-cls secret\n" - -#: g10/gpg.c:1920 -#, c-format -msgid "NOTE: old default options file `%s' ignored\n" -msgstr "NOTE: l'ancien fichier d'options par dfaut `%s' a t ignor\n" - -#: g10/gpg.c:1962 -#, c-format -msgid "NOTE: no default option file `%s'\n" -msgstr "NOTE: pas de fichier d'options par dfaut `%s'\n" - -#: g10/gpg.c:1966 -#, c-format -msgid "option file `%s': %s\n" -msgstr "fichier d'options `%s': %s\n" - -#: g10/gpg.c:1973 -#, c-format -msgid "reading options from `%s'\n" -msgstr "lire les options de `%s'\n" - -#: g10/gpg.c:2188 g10/gpg.c:2814 g10/gpg.c:2833 -#, 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:2201 -#, c-format -msgid "cipher extension `%s' not loaded due to unsafe permissions\n" -msgstr "" -"l'extension de chiffrement `%s' n'a pas t charge car ses\n" -"permissions sont peu sres\n" - -#: g10/gpg.c:2364 g10/gpg.c:2376 -#, 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:2452 -#, c-format -msgid "`%s' is not a valid character set\n" -msgstr "`%s' n'est pas un jeu de caractres valide\n" - -#: g10/gpg.c:2476 g10/gpg.c:2663 g10/keyedit.c:4064 -msgid "could not parse keyserver URL\n" -msgstr "impossible d'interprter l'URL du serveur de cls\n" - -#: g10/gpg.c:2488 -#, c-format -msgid "%s:%d: invalid keyserver options\n" -msgstr "%s:%d: les options du serveur de cls sont invalides\n" - -#: g10/gpg.c:2491 -msgid "invalid keyserver options\n" -msgstr "les options du serveur de cls sont invalides\n" - -#: g10/gpg.c:2498 -#, c-format -msgid "%s:%d: invalid import options\n" -msgstr "%s:%d: options d'import invalides\n" - -#: g10/gpg.c:2501 -msgid "invalid import options\n" -msgstr "options d'import invalides\n" - -#: g10/gpg.c:2508 -#, c-format -msgid "%s:%d: invalid export options\n" -msgstr "%s:%d: options d'export invalides\n" - -#: g10/gpg.c:2511 -msgid "invalid export options\n" -msgstr "options d'export invalides\n" - -#: g10/gpg.c:2518 -#, c-format -msgid "%s:%d: invalid list options\n" -msgstr "%s:%d: options de liste invalides\n" - -#: g10/gpg.c:2521 -msgid "invalid list options\n" -msgstr "options de liste invalides\n" - -#: g10/gpg.c:2529 -msgid "display photo IDs during signature verification" -msgstr "" - -#: g10/gpg.c:2531 -msgid "show policy URLs during signature verification" -msgstr "" - -#: g10/gpg.c:2533 -#, fuzzy -msgid "show all notations during signature verification" -msgstr "`%s' n'est pas une date d'expiration de signature valide\n" - -#: g10/gpg.c:2535 -msgid "show IETF standard notations during signature verification" -msgstr "" - -#: g10/gpg.c:2539 -msgid "show user-supplied notations during signature verification" -msgstr "" - -#: g10/gpg.c:2541 -#, fuzzy -msgid "show preferred keyserver URLs during signature verification" -msgstr "l'URL du serveur de cls favori qui a t donne est invalide\n" - -#: g10/gpg.c:2543 -#, 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:2545 -msgid "show revoked and expired user IDs in signature verification" -msgstr "" - -#: g10/gpg.c:2547 -msgid "validate signatures with PKA data" -msgstr "" - -#: g10/gpg.c:2549 -msgid "elevate the trust of signatures with valid PKA data" -msgstr "" - -#: g10/gpg.c:2556 -#, c-format -msgid "%s:%d: invalid verify options\n" -msgstr "%s:%d: options de vrification invalides\n" - -#: g10/gpg.c:2559 -msgid "invalid verify options\n" -msgstr "options de vrification invalides\n" - -#: g10/gpg.c:2566 -#, c-format -msgid "unable to set exec-path to %s\n" -msgstr "impossible de mettre le chemin d'excution %s\n" - -#: g10/gpg.c:2729 -#, fuzzy, c-format -msgid "%s:%d: invalid auto-key-locate list\n" -msgstr "%s:%d: options de vrification invalides\n" - -#: g10/gpg.c:2732 -msgid "invalid auto-key-locate list\n" -msgstr "" - -#: g10/gpg.c:2803 -msgid "WARNING: program may create a core file!\n" -msgstr "ATTENTION: Le programme peut crer un fichier core !\n" - -#: g10/gpg.c:2807 -#, c-format -msgid "WARNING: %s overrides %s\n" -msgstr "ATTENTION: %s remplace %s\n" - -#: g10/gpg.c:2816 -#, c-format -msgid "%s not allowed with %s!\n" -msgstr "%s n'est pas permis avec %s !\n" - -#: g10/gpg.c:2819 -#, c-format -msgid "%s makes no sense with %s!\n" -msgstr "%s n'a aucun sens avec %s !\n" - -#: g10/gpg.c:2826 -#, 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:2841 -#, c-format -msgid "will not run with insecure memory due to %s\n" -msgstr "pas d'excution ave une mmoire non scurise cause de %s\n" - -#: g10/gpg.c:2855 -msgid "you can only make detached or clear signatures while in --pgp2 mode\n" -msgstr "" -"il n'est possible de faire une signature dtache ou en texte clair\n" -"qu'en mode --pgp2\n" - -#: g10/gpg.c:2861 -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 mme temps en mode --pgp2\n" - -#: g10/gpg.c:2867 -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:2880 -msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n" -msgstr "" -"chiffrer un message en mode --pgp2 ncessite l'algorithme de chiffrage IDEA\n" - -#: g10/gpg.c:2947 g10/gpg.c:2971 -msgid "selected cipher algorithm is invalid\n" -msgstr "l'algorithme de chiffrement slectionn est invalide\n" - -#: g10/gpg.c:2953 g10/gpg.c:2977 -msgid "selected digest algorithm is invalid\n" -msgstr "la fonction de hachage slectionne est invalide\n" - -#: g10/gpg.c:2959 -msgid "selected compression algorithm is invalid\n" -msgstr "l'algorithme de compression slectionn est invalide\n" - -#: g10/gpg.c:2965 -msgid "selected certification digest algorithm is invalid\n" -msgstr "la fonction de hachage de certification slectionne est invalide\n" - -#: g10/gpg.c:2980 -msgid "completes-needed must be greater than 0\n" -msgstr "completes-needed doit tre suprieur 0\n" - -#: g10/gpg.c:2982 -msgid "marginals-needed must be greater than 1\n" -msgstr "marginals-needed doit tre suprieur 1\n" - -#: g10/gpg.c:2984 -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:2986 -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:2988 -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:2991 -msgid "NOTE: simple S2K mode (0) is strongly discouraged\n" -msgstr "NOTE: le mode S2K simple (0) est fortement dconseill\n" - -#: g10/gpg.c:2995 -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:3002 -msgid "invalid default preferences\n" -msgstr "prfrences par dfaut invalides\n" - -#: g10/gpg.c:3011 -msgid "invalid personal cipher preferences\n" -msgstr "prfrences de chiffrement personnelles invalides\n" - -#: g10/gpg.c:3015 -msgid "invalid personal digest preferences\n" -msgstr "prfrences de hachage personnelles invalides\n" - -#: g10/gpg.c:3019 -msgid "invalid personal compress preferences\n" -msgstr "prfrences de compression personnelles invalides\n" - -#: g10/gpg.c:3052 -#, c-format -msgid "%s does not yet work with %s\n" -msgstr "%s ne marche pas encore avec %s\n" - -#: g10/gpg.c:3099 -#, 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:3104 -#, 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:3109 -#, 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:3208 -#, c-format -msgid "failed to initialize the TrustDB: %s\n" -msgstr "impossible d'initialiser la base de confiance: %s\n" - -#: g10/gpg.c:3219 -msgid "WARNING: recipients (-r) given without using public key encryption\n" -msgstr "" -"AVERTISSEMENT: des destinataires (-r) ont t donns alors que le\n" -"chiffrement ne se fait pas par cl publique\n" - -#: g10/gpg.c:3230 -msgid "--store [filename]" -msgstr "--store [nom du fichier]" - -#: g10/gpg.c:3237 -msgid "--symmetric [filename]" -msgstr "--symmetric [nom du fichier]" - -#: g10/gpg.c:3239 -#, c-format -msgid "symmetric encryption of `%s' failed: %s\n" -msgstr "le chiffrement symtrique de `%s' a chou: %s\n" - -#: g10/gpg.c:3249 -msgid "--encrypt [filename]" -msgstr "--encrypt [nom du fichier]" - -#: g10/gpg.c:3262 -msgid "--symmetric --encrypt [filename]" -msgstr "--symmetric --encrypt [nom du fichier]" - -#: g10/gpg.c:3264 -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:3267 -#, 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:3285 -msgid "--sign [filename]" -msgstr "--sign [nom du fichier]" - -#: g10/gpg.c:3298 -msgid "--sign --encrypt [filename]" -msgstr "--sign --encrypt [nom du fichier]" - -#: g10/gpg.c:3313 -msgid "--symmetric --sign --encrypt [filename]" -msgstr "--symmetric --sign --encrypt [nom du fichier]" - -#: g10/gpg.c:3315 -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:3318 -#, 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:3338 -msgid "--sign --symmetric [filename]" -msgstr "--sign --symmetric [nom du fichier]" - -#: g10/gpg.c:3347 -msgid "--clearsign [filename]" -msgstr "--clearsign [nom du fichier]" - -#: g10/gpg.c:3372 -msgid "--decrypt [filename]" -msgstr "--decrypt [nom du fichier]" - -#: g10/gpg.c:3380 -msgid "--sign-key user-id" -msgstr "--sign-key utilisateur" - -#: g10/gpg.c:3384 -msgid "--lsign-key user-id" -msgstr "--lsign-key utilisateur" - -#: g10/gpg.c:3405 -msgid "--edit-key user-id [commands]" -msgstr "--edit-key utilisateur [commandes]" - -#: g10/gpg.c:3476 -msgid "-k[v][v][v][c] [user-id] [keyring]" -msgstr "-k[v][v][v][c] [utilisateur] [porte-cls]" - -#: g10/gpg.c:3518 -#, c-format -msgid "keyserver send failed: %s\n" -msgstr "l'envoi vers le serveur de cls a chou: %s\n" - -#: g10/gpg.c:3520 -#, c-format -msgid "keyserver receive failed: %s\n" -msgstr "la rception depuis le serveur de cls a chou: %s\n" - -#: g10/gpg.c:3522 -#, c-format -msgid "key export failed: %s\n" -msgstr "l'export de la cl a chou: %s\n" - -#: g10/gpg.c:3533 -#, c-format -msgid "keyserver search failed: %s\n" -msgstr "la recherche au sein du serveur de cls a chou: %s\n" - -#: g10/gpg.c:3543 -#, c-format -msgid "keyserver refresh failed: %s\n" -msgstr "le rafrachissement par le serveur de cls a chou: %s\n" - -#: g10/gpg.c:3594 -#, c-format -msgid "dearmoring failed: %s\n" -msgstr "la suppression d'une armure a chou: %s\n" - -#: g10/gpg.c:3602 -#, c-format -msgid "enarmoring failed: %s\n" -msgstr "la construction d'une armure a chou: %s \n" - -#: g10/gpg.c:3689 -#, c-format -msgid "invalid hash algorithm `%s'\n" -msgstr "algorithme de hachage `%s' invalide\n" - -#: g10/gpg.c:3812 -msgid "[filename]" -msgstr "[nom du fichier]" - -#: g10/gpg.c:3816 -msgid "Go ahead and type your message ...\n" -msgstr "Vous pouvez taper votre message...\n" - -#: g10/gpg.c:4120 -msgid "the given certification policy URL is invalid\n" -msgstr "l'URL de politique de certification donne est invalide\n" - -#: g10/gpg.c:4122 -msgid "the given signature policy URL is invalid\n" -msgstr "l'URL de politique de signature donne est invalide\n" - -#: g10/gpg.c:4155 -msgid "the given preferred keyserver URL is invalid\n" -msgstr "l'URL du serveur de cls favori qui a t donne est invalide\n" - -#: g10/getkey.c:152 -msgid "too many entries in pk cache - disabled\n" -msgstr "trop d'entres dans le cache pk - dsactiv\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:3707 -#, c-format -msgid "no secret subkey for public subkey %s - ignoring\n" -msgstr "pas de sous-cl secrte pour la cl publique %s - ignore\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 secrte 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 cls de ce porte-cls" - -#: 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 cls 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" -"envoye une tierce personne. Nous en avons besoin pour crer le rseau\n" -"de confiance (web-of-trust); cela n'a rien voir avec le rseau 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 Rseau de confiance (Web of Trust), GnuPG a\n" -"besoin de savoir en quelles cls votre confiance est ultime - ce sont\n" -"en gnral les cls dont vous avez accs la cl secrte. Rpondez\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 sre quand-mme, rpondez 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 "" -"Slectionnez 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 premire 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 gnral ce n'est pas une bonne ide d'utiliser la mme cl pour\n" -"signer et pour chiffrer. Cet algorithme ne doit tre utilis que\n" -"pour certains domaines.\n" -"Consultez votre expert en scurit 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 "Rpondez 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 demande comme indiqu dans la ligne de commande.\n" -"On peut entrer une date ISO (AAAA-MM-JJ) mais le rsultat d'erreur sera\n" -"mauvais - le systme essaierait d'interprter la valeur donne comme un\n" -"intervalle." - -#: g10/helptext.c:117 -msgid "Enter the name of the key holder" -msgstr "Entrez le nom du propritaire 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 recommande" - -#: 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 gnrer la cl.\n" -"Q pour arrter de gnrer de cl." - -#: g10/helptext.c:140 -msgid "Answer \"yes\" (or just \"y\") if it is okay to generate the sub key." -msgstr "Rpondez oui (ou simplement o) pour gnrer 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" -"vrifier que la cl appartient la personne nomme. Il est utile que\n" -"les autres personnes sachent avec quel soin vous l'avez vrifi.\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 possder mais vous n'avez pas pu vrifier 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 vrifi la cl. Par exemple, cela\n" -"pourrait tre un vrification de l'empreinte et du nom de\n" -"l'utilisateur avec la photo.\n" -"\n" -"\"3\" signifie que vous avez compltement vrifi la cl. Par exemple,\n" -"cela pourrait tre une vrification de l'empreinte, du nom de\n" -"l'utilisateur avec un document difficile contrefaire (comme un\n" -"passeport) et de son adresse e-mail (vrifi par un change de\n" -"courrier lectronique).\n" -"\n" -"Notez bien que les exemples donns ci-dessus pour les niveaux 2 et\n" -"3 ne sont *que* des exemples.\n" -"C'est vous de dcider quelle valeur mettre quand vous signez\n" -"les cls des autres personnes.\n" -"\n" -"Si vous ne savez pas quelle rponse est la bonne, rpondez \"0\"." - -#: g10/helptext.c:186 -msgid "Answer \"yes\" if you want to sign ALL the user IDs" -msgstr "Rpondez 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 "" -"Rpondez oui si vous voulez vraiment supprimer ce nom\n" -"d'utilisateur. Tous les certificats seront alors perdus en mme temps !" - -#: g10/helptext.c:195 -msgid "Answer \"yes\" if it is okay to delete the subkey" -msgstr "Rpondez 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" -"intrt supprimer cette signature car elle peut tre importante pour\n" -"tablir une connection de confiance vers la cl ou une autre cl certifie\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 vrifie parce que vous n'avez pas la\n" -"cl correspondante. Vous devriez remettre sa supression jusqu' ce que\n" -"vous soyez sr de quelle cl a t utilise car cette cl de signature\n" -"peut tablir une connection de confiance vers une autre cl dj certifie." - -#: 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-cls." - -#: 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 ide. 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 prfrences de tous les noms d'utilisateurs (ou juste\n" -"ceux qui sont slectionns) vers la liste actuelle. La date de toutes\n" -"les auto-signatures affectes seront avances 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 secrte \n" - -#: g10/helptext.c:236 -msgid "Please repeat the last passphrase, so you are sure what you typed in." -msgstr "" -"Rptez la dernire phrase de passe pour tre sr 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 "Rpondez oui s'il faut vraiment rcrire 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 ENTRE le\n" -"fichier par dfaut (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 accder votre cl secrte sans autorisation.\n" -" La cl a t remplace\n" -" Utilisez cette option si vous avez remplac la cl par une nouvelle.\n" -" La cl n'est plus utilise\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 gnralement 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 dsirez, vous pouvez entrer un texte qui explique pourquoi vous\n" -"avez mis ce certificat de rvocation. Essayez de garder ce texte concis.\n" -"Une ligne vide dlimite 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 secrte !\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:266 -#, c-format -msgid "skipping block of type %d\n" -msgstr "un bloc de type %d a t ignor\n" - -#: g10/import.c:275 -#, c-format -msgid "%lu keys processed so far\n" -msgstr "%lu cls traites jusqu'ici\n" - -#: g10/import.c:292 -#, c-format -msgid "Total number processed: %lu\n" -msgstr " Quantit totale traite: %lu\n" - -#: g10/import.c:294 -#, c-format -msgid " skipped new keys: %lu\n" -msgstr " nouvelles cls ignores: %lu\n" - -#: g10/import.c:297 -#, c-format -msgid " w/o user IDs: %lu\n" -msgstr " sans nom d'utilisateur: %lu\n" - -#: g10/import.c:299 -#, c-format -msgid " imported: %lu" -msgstr " importe: %lu" - -#: g10/import.c:305 -#, c-format -msgid " unchanged: %lu\n" -msgstr " inchange: %lu\n" - -#: g10/import.c:307 -#, c-format -msgid " new user IDs: %lu\n" -msgstr " nouveaux noms d'utilisateurs: %lu\n" - -#: g10/import.c:309 -#, c-format -msgid " new subkeys: %lu\n" -msgstr " nouvelles sous-cls: %lu\n" - -#: g10/import.c:311 -#, c-format -msgid " new signatures: %lu\n" -msgstr " nouvelles signatures: %lu\n" - -#: g10/import.c:313 -#, c-format -msgid " new key revocations: %lu\n" -msgstr " nouvelles rvocations de cls: %lu\n" - -#: g10/import.c:315 -#, c-format -msgid " secret keys read: %lu\n" -msgstr " cls secrtes lues: %lu\n" - -#: g10/import.c:317 -#, c-format -msgid " secret keys imported: %lu\n" -msgstr " cls secrtes importes: %lu\n" - -#: g10/import.c:319 -#, c-format -msgid " secret keys unchanged: %lu\n" -msgstr " cls secrtes inchanges: %lu\n" - -#: g10/import.c:321 -#, c-format -msgid " not imported: %lu\n" -msgstr " non importe: %lu\n" - -#: g10/import.c:323 -#, c-format -msgid " signatures cleaned: %lu\n" -msgstr " signatures nettoyes: %lu\n" - -#: g10/import.c:325 -#, c-format -msgid " user IDs cleaned: %lu\n" -msgstr " noms d'utilisateur nettoys: %lu\n" - -#: g10/import.c:566 -#, fuzzy, c-format -msgid "WARNING: key %s contains preferences for unavailable\n" -msgstr "AVERTISSEMENT: la cl %s contient des prferences 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:570 -#, fuzzy -msgid " algorithms on these user IDs:\n" -msgstr "algorithmes indisponibles sur ces noms d'utilisateurs:\n" - -#: g10/import.c:607 -#, c-format -msgid " \"%s\": preference for cipher algorithm %s\n" -msgstr " %s : prfrence pour l'algorithme de chiffrement %s\n" - -#: g10/import.c:619 -#, c-format -msgid " \"%s\": preference for digest algorithm %s\n" -msgstr " %s : prfrence pour l'algorithme de hachage %s\n" - -#: g10/import.c:631 -#, c-format -msgid " \"%s\": preference for compression algorithm %s\n" -msgstr " %s : prfrence pour l'algorithme de compression %s\n" - -#: g10/import.c:644 -msgid "it is strongly suggested that you update your preferences and\n" -msgstr "il est fortement suggr de mettre jour vos prfrences et\n" - -#: g10/import.c:646 -msgid "re-distribute this key to avoid potential algorithm mismatch problems\n" -msgstr "" -"redistribuer cette cl pour viter les problmes potentiels qui seraient\n" -"causs par des algorithmes non appropris\n" - -#: g10/import.c:670 -#, c-format -msgid "you can update your preferences with: gpg --edit-key %s updpref save\n" -msgstr "" -"vous pouvez mettre jour vos prfrences avec: \n" -"gpg --edit-key %s updpref save\n" - -#: g10/import.c:720 g10/import.c:1118 -#, c-format -msgid "key %s: no user ID\n" -msgstr "cl %s: pas de nom d'utilisateur\n" - -#: g10/import.c:749 -#, c-format -msgid "key %s: PKS subkey corruption repaired\n" -msgstr "cl %s: corruption de sous-cl PKS rpare\n" - -#: g10/import.c:764 -#, 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:770 -#, c-format -msgid "key %s: no valid user IDs\n" -msgstr "cl %s: pas de nom d'utilisateur valide\n" - -#: g10/import.c:772 -msgid "this may be caused by a missing self-signature\n" -msgstr "cela peut provenir d'une auto-signature manquante\n" - -#: g10/import.c:782 g10/import.c:1240 -#, c-format -msgid "key %s: public key not found: %s\n" -msgstr "cl %s: cl publique non trouve: %s\n" - -#: g10/import.c:788 -#, c-format -msgid "key %s: new key - skipped\n" -msgstr "cl %s: nouvelle cl - ignore\n" - -#: g10/import.c:797 -#, 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:802 g10/openfile.c:267 g10/sign.c:831 g10/sign.c:1135 -#, c-format -msgid "writing to `%s'\n" -msgstr "criture de `%s'\n" - -#: g10/import.c:806 g10/import.c:901 g10/import.c:1158 g10/import.c:1301 -#: g10/import.c:2363 g10/import.c:2385 -#, c-format -msgid "error writing keyring `%s': %s\n" -msgstr "erreur durant l'criture du porte-cls `%s': %s\n" - -#: g10/import.c:825 -#, c-format -msgid "key %s: public key \"%s\" imported\n" -msgstr "cl %s: cl publique %s importe\n" - -#: g10/import.c:849 -#, c-format -msgid "key %s: doesn't match our copy\n" -msgstr "cl %s: ne ressemble pas notre copie\n" - -#: g10/import.c:866 g10/import.c:1258 -#, c-format -msgid "key %s: can't locate original keyblock: %s\n" -msgstr "cl %s: impossible de trouver le bloc de cls original: %s\n" - -#: g10/import.c:874 g10/import.c:1265 -#, c-format -msgid "key %s: can't read original keyblock: %s\n" -msgstr "cl %s: impossible de lire le bloc de cls original: %s\n" - -#: g10/import.c:911 -#, c-format -msgid "key %s: \"%s\" 1 new user ID\n" -msgstr "cl %s: %s un nouvel utilisateur\n" - -#: g10/import.c:914 -#, c-format -msgid "key %s: \"%s\" %d new user IDs\n" -msgstr "cl %s: %s %d nouveaux utilisateurs\n" - -#: g10/import.c:917 -#, c-format -msgid "key %s: \"%s\" 1 new signature\n" -msgstr "cl %s: %s une nouvelle signature\n" - -#: g10/import.c:920 -#, c-format -msgid "key %s: \"%s\" %d new signatures\n" -msgstr "cl %s: %s %d nouvelles signatures\n" - -#: g10/import.c:923 -#, c-format -msgid "key %s: \"%s\" 1 new subkey\n" -msgstr "cl %s: %s une nouvelle sous-cl\n" - -#: g10/import.c:926 -#, c-format -msgid "key %s: \"%s\" %d new subkeys\n" -msgstr "cl %s: %s %d nouvelles sous-cls\n" - -#: g10/import.c:929 -#, c-format -msgid "key %s: \"%s\" %d signature cleaned\n" -msgstr "cl %s: %s %d signature nettoye\n" - -#: g10/import.c:932 -#, c-format -msgid "key %s: \"%s\" %d signatures cleaned\n" -msgstr "cl %s: %s %d signatures nettoyes\n" - -#: g10/import.c:935 -#, c-format -msgid "key %s: \"%s\" %d user ID cleaned\n" -msgstr "cl %s: %s %d nom d'utilisateur nettoy\n" - -#: g10/import.c:938 -#, c-format -msgid "key %s: \"%s\" %d user IDs cleaned\n" -msgstr "cl %s: %s %d noms d'utilisateur nettoys\n" - -#: g10/import.c:961 -#, c-format -msgid "key %s: \"%s\" not changed\n" -msgstr "cl %s: %s n'a pas chang\n" - -#: g10/import.c:1124 -#, c-format -msgid "key %s: secret key with invalid cipher %d - skipped\n" -msgstr "" -"cl %s: cl secrte avec le chiffrement invalide %d - non prise\n" -"en compte\n" - -#: g10/import.c:1135 -msgid "importing secret keys not allowed\n" -msgstr "il est interdit d'importer les cl secrtes\n" - -#: g10/import.c:1152 g10/import.c:2378 -#, c-format -msgid "no default secret keyring: %s\n" -msgstr "pas de porte-cls par dfaut: %s\n" - -#: g10/import.c:1163 -#, c-format -msgid "key %s: secret key imported\n" -msgstr "cl %s: cl secrte importe\n" - -#: g10/import.c:1193 -#, c-format -msgid "key %s: already in secret keyring\n" -msgstr "cl %s: dj dans le porte-cls secret\n" - -#: g10/import.c:1203 -#, c-format -msgid "key %s: secret key not found: %s\n" -msgstr "cl %s: cl secrte non trouve: %s\n" - -#: g10/import.c:1233 -#, c-format -msgid "key %s: no public key - can't apply revocation certificate\n" -msgstr "" -"cl %s: pas de cl publique - le certificat de rvocation ne peut\n" -"tre appliqu\n" - -#: g10/import.c:1276 -#, c-format -msgid "key %s: invalid revocation certificate: %s - rejected\n" -msgstr "cl %s: certificat de rvocation invalide: %s - rejet\n" - -#: g10/import.c:1308 -#, c-format -msgid "key %s: \"%s\" revocation certificate imported\n" -msgstr "cl %s: %s certificat de rvocation import\n" - -#: g10/import.c:1374 -#, 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:1389 -#, 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:1391 -#, 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:1409 -#, 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:1420 g10/import.c:1470 -#, c-format -msgid "key %s: unsupported public key algorithm\n" -msgstr "cl %s: algorithme de cl publique non support\n" - -#: g10/import.c:1422 -#, c-format -msgid "key %s: invalid subkey binding\n" -msgstr "cl %s: liaison avec la sous-cl invalide\n" - -#: g10/import.c:1437 -#, c-format -msgid "key %s: removed multiple subkey binding\n" -msgstr "cl %s: supression de liaisons multiples avec des sous-cls\n" - -#: g10/import.c:1459 -#, c-format -msgid "key %s: no subkey for key revocation\n" -msgstr "cl %s: pas de sous-cl pour rvoquer la cl\n" - -#: g10/import.c:1472 -#, c-format -msgid "key %s: invalid subkey revocation\n" -msgstr "cl %s: rvocation de sous-cl invalide\n" - -#: g10/import.c:1487 -#, c-format -msgid "key %s: removed multiple subkey revocation\n" -msgstr "cl %s: suppression de la rvocation de sous-cls multiples\n" - -#: g10/import.c:1529 -#, 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:1550 -#, c-format -msgid "key %s: skipped subkey\n" -msgstr "cl %s: sous-cl non prise en compte\n" - -#: g10/import.c:1577 -#, c-format -msgid "key %s: non exportable signature (class 0x%02X) - skipped\n" -msgstr "cl %s: signature non exportable (classe 0x%02X) - ignore\n" - -#: g10/import.c:1587 -#, c-format -msgid "key %s: revocation certificate at wrong place - skipped\n" -msgstr "cl %s: certificat de rvocation au mauvais endroit - ignore\n" - -#: g10/import.c:1604 -#, c-format -msgid "key %s: invalid revocation certificate: %s - skipped\n" -msgstr "cl %s: certificat de rvocation invalide: %s - ignore\n" - -#: g10/import.c:1618 -#, c-format -msgid "key %s: subkey signature in wrong place - skipped\n" -msgstr "cl %s: signature de sous-cl au mauvais endroit - ignore\n" - -#: g10/import.c:1626 -#, c-format -msgid "key %s: unexpected signature class (0x%02X) - skipped\n" -msgstr "cl %s: classe de signature non attendue (0x%02X) - ignore\n" - -#: g10/import.c:1726 -#, c-format -msgid "key %s: duplicated user ID detected - merged\n" -msgstr "cl %s: nom d'utilisateur en double dtect - fusion accomplie\n" - -#: g10/import.c:1788 -#, c-format -msgid "WARNING: key %s may be revoked: fetching revocation key %s\n" -msgstr "" -"AVERTISSEMENT: la cl %s est peut-tre rvoque: recherche de\n" -"la cl de rvocation %s\n" - -#: g10/import.c:1802 -#, c-format -msgid "WARNING: key %s may be revoked: revocation key %s not present.\n" -msgstr "" -"AVERTISSEMENT: la cl %s est peut-tre rvoque: la cl de\n" -"rvocation %s est absente.\n" - -#: g10/import.c:1861 -#, c-format -msgid "key %s: \"%s\" revocation certificate added\n" -msgstr "cl %s: certificat de rvocation %s ajout\n" - -#: g10/import.c:1895 -#, c-format -msgid "key %s: direct key signature added\n" -msgstr "cl %s: ajout de la signature de cl directe\n" - -#: g10/import.c:2284 -msgid "NOTE: a key's S/N does not match the card's one\n" -msgstr "NOTE: le numro de srie d'une cl n'est pas celui de la carte\n" - -#: g10/import.c:2292 -msgid "NOTE: primary key is online and stored on card\n" -msgstr "NOTE: la cl primaire est en ligne et stocke sur la carte\n" - -#: g10/import.c:2294 -msgid "NOTE: secondary key is online and stored on card\n" -msgstr "NOTE: la cl secondaire est en ligne et stocke sur la carte\n" - -#: g10/keydb.c:168 -#, c-format -msgid "error creating keyring `%s': %s\n" -msgstr "erreur durant la cration du porte-cls `%s' : %s\n" - -#: g10/keydb.c:175 -#, c-format -msgid "keyring `%s' created\n" -msgstr "le porte-cls `%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 cls `%s': %s\n" - -#: g10/keydb.c:698 -#, c-format -msgid "failed to rebuild keyring cache: %s\n" -msgstr "la reconstruction du cache de porte-cls a chou : %s\n" - -#: g10/keyedit.c:266 -msgid "[revocation]" -msgstr "[rvocation]" - -#: 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 vrifie 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 vrifies cause de cls manquantes\n" - -#: g10/keyedit.c:353 g10/keylist.c:398 -msgid "1 signature not checked due to an error\n" -msgstr "une signature non vrifie 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 vrifies 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 dtect\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 dtect\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 "" -"Dcidez maintenant quel point vous avez confiance en cet utilisateur\n" -"pour qu'il vrifie les cls des autres utilisateurs (vous pouvez\n" -"vrifier son passeport, vrifier les empreintes de plusieurs sources\n" -"diffrentes, 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 entirement 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 suprieure 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 entre pour aucun domaine.\n" - -#: g10/keyedit.c:599 -#, c-format -msgid "User ID \"%s\" is revoked." -msgstr "Le nom d'utilisateur \"%s\" est rvoqu." - -#: 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 sr 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 rellement ? (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 crer 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 compltement exportable ? (o/N) " - -#: g10/keyedit.c:780 -#, c-format -msgid "\"%s\" was already locally signed by key %s\n" -msgstr " %s a dj 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 dj 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 mme 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 gnrer 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 vrifi que la cl que vous allez signer\n" -"appartient rellement la personne sus-nomme ? Si vous ne savez\n" -"quoi rpondre, entrez \"0\".\n" - -#: g10/keyedit.c:921 -#, c-format -msgid " (0) I will not answer.%s\n" -msgstr " (0) Je ne rpondrai 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 vrifi 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 vrifi.%s\n" - -#: g10/keyedit.c:927 -#, c-format -msgid " (3) I have done very careful checking.%s\n" -msgstr " (3) J'ai vrifi trs soigneusement.%s\n" - -#: g10/keyedit.c:933 -msgid "Your selection? (enter `?' for more information): " -msgstr "Votre slection ? (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 sr(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 marque 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 marque comme\n" -"non-rvocable.\n" - -#: g10/keyedit.c:988 -msgid "The signature will be marked as non-exportable.\n" -msgstr "La signature sera marque comme non-exportable.\n" - -#: g10/keyedit.c:995 -msgid "The signature will be marked as non-revocable.\n" -msgstr "La signature sera marque comme non-rvocable.\n" - -#: g10/keyedit.c:1002 -msgid "I have not checked this key at all.\n" -msgstr "Je n'ai pas du tout vrifi cette cl.\n" - -#: g10/keyedit.c:1007 -msgid "I have checked this key casually.\n" -msgstr "J'ai un peu vrifi cette cl.\n" - -#: g10/keyedit.c:1012 -msgid "I have checked this key very carefully.\n" -msgstr "J'ai vrifi cette cl avec grand soin.\n" - -#: g10/keyedit.c:1022 -msgid "Really sign? (y/N) " -msgstr "Signer rellement ? (o/N) " - -#: g10/keyedit.c:1067 g10/keyedit.c:4783 g10/keyedit.c:4874 g10/keyedit.c:4938 -#: g10/keyedit.c:4999 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 possde seulement des items partiels ou stocks 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 protge.\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 secrtes 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 secrtes de la cl principale sont stockes sur la\n" -"carte.\n" - -#: g10/keyedit.c:1155 g10/keygen.c:3206 -msgid "Key is protected.\n" -msgstr "La cl est protge.\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 secrte.\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 rpte ; 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* ide\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 "slectionner le nom d'utilisateur N" - -#: g10/keyedit.c:1366 -msgid "select subkey N" -msgstr "slectionner la sous-cl N" - -#: g10/keyedit.c:1367 -msgid "check signatures" -msgstr "vrifier les signatures" - -#: g10/keyedit.c:1372 -msgid "sign selected user IDs [* see below for related commands]" -msgstr "" -"signer les noms d'utilisateurs slectionns [* voir ci-dessous pour\n" -"les commandes similaires]" - -#: g10/keyedit.c:1377 -msgid "sign selected user IDs locally" -msgstr "signer le nom d'utilisateur slectionn localement" - -#: g10/keyedit.c:1379 -msgid "sign selected user IDs with a trust signature" -msgstr "signer les noms d'utilisateurs slectionns localement" - -#: g10/keyedit.c:1381 -msgid "sign selected user IDs with a non-revocable signature" -msgstr "" -"signer les noms d'utilisateurs slectionns avec une signature\n" -"non-rvocable" - -#: 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 slectionns" - -#: 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 "dplacer une cl vers une carte puce" - -#: g10/keyedit.c:1402 -msgid "move a backup key to a smartcard" -msgstr "dplacer une cl de sauvegarde vers une carte puce" - -#: g10/keyedit.c:1406 -msgid "delete selected subkeys" -msgstr "enlever les sous-cls slectionnes" - -#: g10/keyedit.c:1408 -msgid "add a revocation key" -msgstr "ajouter une cl de rvocation" - -#: g10/keyedit.c:1410 -msgid "delete signatures from the selected user IDs" -msgstr "enlever les signatures des noms d'utilisateur slectionns " - -#: 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-cls slectionnes" - -#: g10/keyedit.c:1414 -msgid "flag the selected user ID as primary" -msgstr "marquer le nom d'utilisateur slectionn comme principal" - -#: g10/keyedit.c:1416 -msgid "toggle between the secret and public key listings" -msgstr "" -"passer de la liste des cls secrtes celle des cls prives\n" -"et inversement" - -#: g10/keyedit.c:1419 -msgid "list preferences (expert)" -msgstr "lister les prfrences (expert)" - -#: g10/keyedit.c:1421 -msgid "list preferences (verbose)" -msgstr "lister les prfrences (bavard)" - -#: g10/keyedit.c:1423 -msgid "set preference list for the selected user IDs" -msgstr "" -"indiquer la liste des prfrences pour le nom d'utilisateur\n" -"slectionn" - -#: g10/keyedit.c:1428 -#, fuzzy -msgid "set the preferred keyserver URL for the selected user IDs" -msgstr "" -"indiquer l'URL du serveur de cls prfr pour les noms d'utilisateur\n" -"slectionns" - -#: g10/keyedit.c:1430 -#, fuzzy -msgid "set a notation for the selected user IDs" -msgstr "" -"indiquer la liste des prfrences pour le nom d'utilisateur\n" -"slectionn" - -#: 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 "rvoquer les signatures des noms d'utilisateur slectionns" - -#: g10/keyedit.c:1440 -msgid "revoke selected user IDs" -msgstr "rvoquer les noms d'utilisateur slectionns" - -#: g10/keyedit.c:1445 -msgid "revoke key or selected subkeys" -msgstr "rvoquer la cl ou les sous-cls slectionnes" - -#: g10/keyedit.c:1446 -msgid "enable key" -msgstr "activer la cl" - -#: g10/keyedit.c:1447 -msgid "disable key" -msgstr "dsactiver la cl" - -#: g10/keyedit.c:1448 -msgid "show selected photo IDs" -msgstr "montrer les photos d'identit slectionnes" - -#: 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 secrte %s : %s\n" - -#: g10/keyedit.c:1588 -msgid "Secret key is available.\n" -msgstr "La cl secrte est disponible.\n" - -#: g10/keyedit.c:1669 -msgid "Need the secret key to do this.\n" -msgstr "Il faut la cl secrte 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 prcde du caractre `l' pour les\n" -"signatures locales (lsign), par `t' pour les signatures de confiance\n" -"(tsign), par `nr' pour les signatures non-rvocables (nrsign), ou\n" -"bien toute combinaison possible (ltsign, tnrsign, etc.).\n" - -#: g10/keyedit.c:1736 -msgid "Key is revoked." -msgstr "La cl est rvoque." - -#: 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: Slectionner 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 slectionner 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 rellement tous les noms d'utilisateurs slectionns ? (o/N) " - -#: g10/keyedit.c:1821 -msgid "Really remove this user ID? (y/N) " -msgstr "Enlever rellement ce nom d'utilisateur ? (o/N) " - -#: g10/keyedit.c:1871 -msgid "Really move the primary key? (y/N) " -msgstr "Enlever rellement la cl principale ? (o/N) " - -#: g10/keyedit.c:1883 -msgid "You must select exactly one key.\n" -msgstr "Vous devez slectionner 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 slectionner 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 cls slectionnes ? (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 "Rvoquer rellement tous les noms d'utilisateurs slectionns ? (o/N) " - -#: g10/keyedit.c:2006 -msgid "Really revoke this user ID? (y/N) " -msgstr "Rvoquer rellement 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 rvoquer la cl entire ? (o/N) " - -#: g10/keyedit.c:2035 -msgid "Do you really want to revoke the selected subkeys? (y/N) " -msgstr "Voulez-vous vraiment rvoquer les sous-cls slectionnes ? (o/N) " - -#: g10/keyedit.c:2037 -msgid "Do you really want to revoke this subkey? (y/N) " -msgstr "Voulez-vous vraiment rvoquer 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 propritaire peut ne pas tre positionne 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 prfrences en :\n" - -#: g10/keyedit.c:2135 -msgid "Really update the preferences for the selected user IDs? (y/N) " -msgstr "" -"Mettre jour rellement les prfrences des noms d'utilisateurs\n" -"slectionns ? (o/N) " - -#: g10/keyedit.c:2137 -msgid "Really update the preferences? (y/N) " -msgstr "Faut-il vraiment mettre jour les prfrences ? (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 secrte 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 cls: pas-de-modification" - -#: g10/keyedit.c:2411 g10/keylist.c:308 -msgid "Preferred keyserver: " -msgstr "Serveur de cls prfr: " - -#: 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 prfrences 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 rvoque 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 rvoque 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 dsactive" - -#: 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 affiche pour la cl n'est pas ncessairement\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 "revoque" - -#: 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 "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 "" -"AVERTISSEMENT: aucun nom d'utilisateur n'a t dfini comme principal.\n" -"Cette commande risque de rendre un autre nom d'utilisateur principal\n" -"par dfaut.\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 empcher certaines versions de PGP d'accepter\n" -"cette cl\n" - -#: g10/keyedit.c:3016 g10/keyedit.c:3346 -msgid "Are you sure you still want to add it? (y/N) " -msgstr "Etes-vous sr 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 supprime.\n" - -#: g10/keyedit.c:3197 -#, c-format -msgid "Deleted %d signatures.\n" -msgstr "%d signatures supprimes\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:3249 -#, fuzzy, c-format -msgid "User ID \"%s\": already clean\n" -msgstr "Nom d'utilisateur \"%s\": dj nettoy.\n" - -#: g10/keyedit.c:3341 -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 rvocateur\n" -"dsign peut empcher certaines versions de PGP d'accepter\n" -"cette cl.\n" - -#: g10/keyedit.c:3352 -msgid "You may not add a designated revoker to a PGP 2.x-style key.\n" -msgstr "" -"Vous ne pouvez pas ajouter de rvocateur dsign une cl de style PGP2.\n" - -#: g10/keyedit.c:3372 -msgid "Enter the user ID of the designated revoker: " -msgstr "Entrez le nom d'utilisateur du rvocateur dsign: " - -#: g10/keyedit.c:3397 -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 rvocateur\n" -"dsign.\n" - -#: g10/keyedit.c:3412 -msgid "you cannot appoint a key as its own designated revoker\n" -msgstr "" -"vous ne pouvez pas utiliser une cl comme son propre rvocateur\n" -"dsign\n" - -#: g10/keyedit.c:3434 -msgid "this key has already been designated as a revoker\n" -msgstr "cette cl dj t dsigne comme un rvocateur\n" - -#: g10/keyedit.c:3453 -msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n" -msgstr "" -"AVERTISSEMENT: l'tablissement d'une cl comme rvocateur dsign\n" -"est irrversible !\n" - -#: g10/keyedit.c:3459 -msgid "" -"Are you sure you want to appoint this key as a designated revoker? (y/N) " -msgstr "" -"Etes-vous sr de vouloir tablir cette cl comme rvocateur\n" -"dsign ? (o/N) " - -#: g10/keyedit.c:3520 -msgid "Please remove selections from the secret keys.\n" -msgstr "Enlevez les slections des cls secrtes.\n" - -#: g10/keyedit.c:3526 -msgid "Please select at most one subkey.\n" -msgstr "Vous devez slectionner au plus une sous-cl.\n" - -#: g10/keyedit.c:3530 -msgid "Changing expiration time for a subkey.\n" -msgstr "Changer la date d'expiration d'une sous-cl.\n" - -#: g10/keyedit.c:3533 -msgid "Changing expiration time for the primary key.\n" -msgstr "Changer la date d'expiration de la cl principale.\n" - -#: g10/keyedit.c:3579 -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:3595 -msgid "No corresponding signature in secret ring\n" -msgstr "Pas de signature correspondante dans le porte-cls secret\n" - -#: g10/keyedit.c:3668 -#, 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:3674 -#, c-format -msgid "subkey %s does not sign and so does not need to be cross-certified\n" -msgstr "" - -#: g10/keyedit.c:3836 -msgid "Please select exactly one user ID.\n" -msgstr "Vous devez slectionner exactement un utilisateur.\n" - -#: g10/keyedit.c:3875 g10/keyedit.c:3985 g10/keyedit.c:4105 g10/keyedit.c:4246 -#, c-format -msgid "skipping v3 self-signature on user ID \"%s\"\n" -msgstr "l'auto-signature v3 du nom d'utilisateur %s a t ignore\n" - -#: g10/keyedit.c:4046 -msgid "Enter your preferred keyserver URL: " -msgstr "Entrez l'URL de votre serveur de cls favori: " - -#: g10/keyedit.c:4126 -msgid "Are you sure you want to replace it? (y/N) " -msgstr "Etes-vous sr de vouloir le remplacer ? (o/N) " - -#: g10/keyedit.c:4127 -msgid "Are you sure you want to delete it? (y/N) " -msgstr "Etes-vous sr de vouloir le supprimer ? (o/N) " - -#: g10/keyedit.c:4189 -#, fuzzy -msgid "Enter the notation: " -msgstr "Notation de signature: " - -#: g10/keyedit.c:4338 -#, fuzzy -msgid "Proceed? (y/N) " -msgstr "Rcrire par-dessus ? (o/N) " - -#: g10/keyedit.c:4402 -#, c-format -msgid "No user ID with index %d\n" -msgstr "Pas d'utilisateur avec l'index %d\n" - -#: g10/keyedit.c:4460 -#, c-format -msgid "No user ID with hash %s\n" -msgstr "Pas de nom d'utilisateur avec le hachage %s\n" - -#: g10/keyedit.c:4487 -#, c-format -msgid "No subkey with index %d\n" -msgstr "Pas de sous-cl avec l'index %d\n" - -#: g10/keyedit.c:4622 -#, c-format -msgid "user ID: \"%s\"\n" -msgstr "nom d'utilisateur: %s \n" - -#: g10/keyedit.c:4625 g10/keyedit.c:4689 g10/keyedit.c:4732 -#, 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:4627 g10/keyedit.c:4691 g10/keyedit.c:4734 -msgid " (non-exportable)" -msgstr " (non-exportable)" - -#: g10/keyedit.c:4631 -#, c-format -msgid "This signature expired on %s.\n" -msgstr "Cette signature a expir le %s.\n" - -#: g10/keyedit.c:4635 -msgid "Are you sure you still want to revoke it? (y/N) " -msgstr "Etes-vous sr de vouloir toujours le rvoquer ? (y/N) " - -#: g10/keyedit.c:4639 -msgid "Create a revocation certificate for this signature? (y/N) " -msgstr "Gnrer un certificat de rvocation pour cette signature ? (o/N) " - -#: g10/keyedit.c:4666 -#, 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:4692 -msgid " (non-revocable)" -msgstr " (non-rvocable)" - -#: g10/keyedit.c:4699 -#, c-format -msgid "revoked by your key %s on %s\n" -msgstr "rvoqu par votre cl %s %s\n" - -#: g10/keyedit.c:4721 -msgid "You are about to revoke these signatures:\n" -msgstr "Vous tes sur le point de rvoquer ces signatures:\n" - -#: g10/keyedit.c:4741 -msgid "Really create the revocation certificates? (y/N) " -msgstr "Crer rellement les certificats de rvocation ? (o/N) " - -#: g10/keyedit.c:4771 -msgid "no secret key\n" -msgstr "pas de cl secrte\n" - -#: g10/keyedit.c:4841 -#, c-format -msgid "user ID \"%s\" is already revoked\n" -msgstr "Le nom d'utilisateur \"%s\" est dj rvoqu.\n" - -#: g10/keyedit.c:4858 -#, 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:4922 -#, c-format -msgid "Key %s is already revoked.\n" -msgstr "La cl %s est dj rvoqu.\n" - -#: g10/keyedit.c:4984 -#, c-format -msgid "Subkey %s is already revoked.\n" -msgstr "La sous-cl %s est dj rvoque.\n" - -#: g10/keyedit.c:5079 -#, 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 "prfrence `%s' duplique\n" - -#: g10/keygen.c:269 -msgid "too many cipher preferences\n" -msgstr "trop de prfrences de chiffrement\n" - -#: g10/keygen.c:271 -msgid "too many digest preferences\n" -msgstr "trop de prfrences de hachage\n" - -#: g10/keygen.c:273 -msgid "too many compression preferences\n" -msgstr "trop de prfrences de compression\n" - -#: g10/keygen.c:398 -#, c-format -msgid "invalid item `%s' in preference string\n" -msgstr "lment `%s' invalide dans la chane de prfrences\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 "Slectionnez le type de cl dsir:\n" - -#: g10/keygen.c:1435 -#, c-format -msgid " (%d) DSA and Elgamal (default)\n" -msgstr " (%d) DSA et Elgamal (par dfaut)\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-mme les capacits)\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-mme les capacits)\n" - -#: g10/keygen.c:1514 -#, c-format -msgid "DSA keypair will have %u bits.\n" -msgstr "La paire de cls 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 cls %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 dsirez-vous ? (%u) " - -#: g10/keygen.c:1545 -#, c-format -msgid "%s keysizes must be in the range %u-%u\n" -msgstr "les tailles de cls %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 demande 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 "" -"Spcifiez 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 annes\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 "" -"Spcifiez 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 annes\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 systme 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 rel, d'un commentaire et d'une\n" -"adresse e-mail de cette manire:\n" -" Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de> \n" -"\n" - -#: g10/keygen.c:1728 -msgid "Real name: " -msgstr "Nom rel: " - -#: g10/keygen.c:1736 -msgid "Invalid character in name\n" -msgstr "Caractre 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 caractres 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 "Caractre 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 caractres '%s'.\n" - -#: g10/keygen.c:1797 -#, c-format -msgid "" -"You selected this USER-ID:\n" -" \"%s\"\n" -"\n" -msgstr "" -"Vous avez slectionn 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 rel 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 protger votre cl\n" -"secrte.\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 srement une *mauvaise*\n" -"ide !\n" -"Je l'accepte quand-mme. Vous pouvez changer votre phrase de passe\n" -"quand vous le dsirez, 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 alatoires doit tre gnr. Vous devriez faire\n" -"autre-chose (taper au clavier, dplacer la souris, utiliser les disques)\n" -"pendant la gnration de nombres premiers; cela donne au gnrateur de\n" -"nombres alatoires une meilleure chance d'avoir assez d'entropie.\n" - -#: g10/keygen.c:2708 -msgid "Key generation canceled.\n" -msgstr "La gnration de cl a t annule.\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 secrte 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 secrte dans `%s'\n" - -#: g10/keygen.c:3041 -#, c-format -msgid "no writable public keyring found: %s\n" -msgstr "" -"aucun portes-cls 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-cls 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-cls 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-cls secret `%s': %s\n" - -#: g10/keygen.c:3095 -msgid "public and secret key created and signed.\n" -msgstr "les cls publique et secrte ont t cres et signes.\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 utilise pour chiffrer. Vous pouvez\n" -"utiliser la commande --edit-key pour gnrer 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 gnration 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 cre %lu seconde dans le futur (rupture spatio-temporelle ou\n" -"problme 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 cre %lu secondes dans le futur (rupture spatio-temporelle ou\n" -"problme 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: crer des sous-cls pour des cls v3 n'est pas conforme OpenPGP\n" - -#: g10/keygen.c:3220 g10/keygen.c:3344 -msgid "Really create? (y/N) " -msgstr "Crer 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 crer 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 cls 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-cls" - -#: 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 srie 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 "Rparez ce problme de scurit possible\n" - -#: g10/keyring.c:1376 -#, c-format -msgid "caching keyring `%s'\n" -msgstr "mise en antmmoire du porte-cls `%s'\n" - -#: g10/keyring.c:1422 -#, c-format -msgid "%lu keys cached so far (%lu signatures)\n" -msgstr "%lu cls en antmmoire vrifies pour l'instant (%lu signatures)\n" - -#: g10/keyring.c:1434 -#, c-format -msgid "%lu keys cached (%lu signatures)\n" -msgstr "%lu cls en antmmoire (%lu signatures)\n" - -#: g10/keyring.c:1505 -#, c-format -msgid "%s: keyring created\n" -msgstr "%s: porte-cls 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 cls 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 cls `%s' ne sont pas\n" -"utilises dans cette plateforme\n" - -#: g10/keyserver.c:523 -msgid "disabled" -msgstr "dsactiv" - -#: 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:1421 -#, c-format -msgid "invalid keyserver protocol (us %d!=handler %d)\n" -msgstr "protocole serveur de cls 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 cls\n" - -#: g10/keyserver.c:908 -msgid "key not found on keyserver\n" -msgstr "cl non trouve dans le serveur de cls\n" - -#: g10/keyserver.c:1145 -#, c-format -msgid "requesting key %s from %s server %s\n" -msgstr "requte de la cl %s du serveur %s %s\n" - -#: g10/keyserver.c:1149 -#, c-format -msgid "requesting key %s from %s\n" -msgstr "requte 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:1324 -#, 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:1328 -#, c-format -msgid "sending key %s to %s\n" -msgstr "envoi de la cl %s %s\n" - -#: g10/keyserver.c:1371 -#, c-format -msgid "searching for \"%s\" from %s server %s\n" -msgstr "recherche de %s du serveur %s %s\n" - -#: g10/keyserver.c:1374 -#, c-format -msgid "searching for \"%s\" from %s\n" -msgstr "recherche de %s de %s\n" - -#: g10/keyserver.c:1381 g10/keyserver.c:1477 -msgid "no keyserver action!\n" -msgstr "pas d'action pour le serveur de cls !\n" - -#: g10/keyserver.c:1429 -#, c-format -msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n" -msgstr "" -"AVERTISSEMENT: le gestionnaire de serveurs de cls provient d'une\n" -"version diffrente de GnuPG (%s)\n" - -#: g10/keyserver.c:1438 -msgid "keyserver did not send VERSION\n" -msgstr "le serveurs de cls n'a pas envoy son numro de VERSION\n" - -#: g10/keyserver.c:1500 g10/keyserver.c:2028 -msgid "no keyserver known (use option --keyserver)\n" -msgstr "pas de serveur de cls connu (utilisez l'option --keyserver)\n" - -#: g10/keyserver.c:1506 -msgid "external keyserver calls are not supported in this build\n" -msgstr "" -"les appels externes un serveur de cl ne sont pas supports dans\n" -"cette compilation\n" - -#: g10/keyserver.c:1518 -#, c-format -msgid "no handler for keyserver scheme `%s'\n" -msgstr "pas de gestionnaire pour le type de serveurs de cls `%s'\n" - -#: g10/keyserver.c:1523 -#, c-format -msgid "action `%s' not supported with keyserver scheme `%s'\n" -msgstr "" -"l'action `%s' n'est pas supporte avec le type de serveurs\n" -"de cls `%s'\n" - -#: g10/keyserver.c:1531 -#, 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:1538 -msgid "keyserver timed out\n" -msgstr "le dlai d'attente du serveur de cls a expir\n" - -#: g10/keyserver.c:1543 -msgid "keyserver internal error\n" -msgstr "erreur interne du serveur de cls\n" - -#: g10/keyserver.c:1552 -#, c-format -msgid "keyserver communications error: %s\n" -msgstr "erreur de communication avec le serveur de cls: %s\n" - -#: g10/keyserver.c:1577 g10/keyserver.c:1611 -#, c-format -msgid "\"%s\" not a key ID: skipping\n" -msgstr " %s n'est pas une ID de cl: ignor\n" - -#: g10/keyserver.c:1870 -#, c-format -msgid "WARNING: unable to refresh key %s via %s: %s\n" -msgstr "" -"AVERTISSEMENT: impossible de rafrachir la cl %s\n" -"via %s: %s\n" - -#: g10/keyserver.c:1892 -#, c-format -msgid "refreshing 1 key from %s\n" -msgstr "rafrachissement d'une cl depuis %s\n" - -#: g10/keyserver.c:1894 -#, c-format -msgid "refreshing %d keys from %s\n" -msgstr "rafrachissement de %d cls depuis %s\n" - -#: g10/keyserver.c:1950 -#, fuzzy, c-format -msgid "WARNING: unable to fetch URI %s: %s\n" -msgstr "" -"AVERTISSEMENT: impossible de rafrachir la cl %s\n" -"via %s: %s\n" - -#: g10/keyserver.c:1956 -#, fuzzy, c-format -msgid "WARNING: unable to parse URI %s\n" -msgstr "" -"AVERTISSEMENT: impossible de rafrachir 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 chiffre (%d)\n" - -#: g10/mainproc.c:291 -#, c-format -msgid "%s encrypted session key\n" -msgstr "cl de session chiffre %s\n" - -#: g10/mainproc.c:301 -#, c-format -msgid "passphrase generated with unknown digest algorithm %d\n" -msgstr "phrase de passe gnre 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 "donnes chiffres 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, cre 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 dchiffrement 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 donnes chiffres 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 dchiffrement a russi\n" - -#: g10/mainproc.c:585 -msgid "WARNING: message was not integrity protected\n" -msgstr "AVERTISSEMENT: l'intgrit du message n'tait pas protge\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 dchiffrement a chou: %s\n" - -#: g10/mainproc.c:623 -msgid "NOTE: sender requested \"for-your-eyes-only\"\n" -msgstr "NOTE: l'expditeur 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 "rvocation 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 "vrification de signature supprime\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 expire 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 vrifier 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 dtache\n" - -#: g10/mainproc.c:2005 -msgid "" -"WARNING: multiple signatures detected. Only the first will be checked.\n" -msgstr "" -"AVERTISSEMENT: plusieurs signatures ont t dtctes. Seulement la " -"premire\n" -"sera vrifie.\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 dtect dans proc_tree()\n" - -#: g10/misc.c:122 -#, c-format -msgid "can't disable core dumps: %s\n" -msgstr "impossible d'empcher la gnration 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 exprimental 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 exprimental 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" -"exprimental %s\n" - -#: g10/misc.c:351 -#, c-format -msgid "WARNING: digest algorithm %s is deprecated\n" -msgstr "AVERTISSEMENT: l'algorithme de hachage %s est dconseill\n" - -#: g10/misc.c:447 -msgid "the IDEA cipher plugin is not present\n" -msgstr "le module de chiffrement IDEA n'est pas prsent\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 dconseille \"%s\"\n" - -#: g10/misc.c:685 -#, c-format -msgid "WARNING: \"%s\" is a deprecated option\n" -msgstr "AVERTISSEMENT: \"%s\" est une option dconseille.\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 dconseille - 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 "Rcrire 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:305 -#, c-format -msgid "assuming signed data in `%s'\n" -msgstr "les donnes signes sont supposes tre dans `%s'\n" - -#: g10/openfile.c:384 -#, c-format -msgid "new configuration file `%s' created\n" -msgstr " nouveau fichier de configuration `%s' cr\n" - -#: g10/openfile.c:386 -#, 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:418 -#, c-format -msgid "directory `%s' created\n" -msgstr "rpertoire `%s' cr\n" - -#: g10/parse-packet.c:138 -#, c-format -msgid "can't handle public key algorithm %d\n" -msgstr "impossible de grer 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 chiffre de manire symtrique est\n" -"potentiellement non sre\n" - -#: g10/parse-packet.c:1157 -#, c-format -msgid "subpacket of type %d has critical bit set\n" -msgstr "un sous-paquet de type %d possde 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 dfinie\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 "problme avec l'agent - arrt 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 dverrouiller la cl\n" -"secrte pour l'utilisateur:\n" -"\"%.*s\"\n" -"cl %u bits %s, ID %s, cre %s%s\n" - -#: g10/passphrase.c:571 -msgid "Repeat passphrase\n" -msgstr "Rptez 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:968 -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:973 -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 dverrouiller la\n" -"cl secrte 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, cre 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:977 -msgid "Repeat passphrase: " -msgstr "Rptez 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 stocke\n" -"dans votre cl publique. Si vous utilisez une image trs grosse, il\n" -"en sera de mme 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 trs grand (%d octets) !\n" - -#: g10/photoid.c:129 -msgid "Are you sure you want to use it? (y/N) " -msgstr "tes-vous sr 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 spcifie" - -#: g10/pkclist.c:64 g10/revoke.c:625 -msgid "Key is superseded" -msgstr "La cl a t remplace" - -#: 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 utilise" - -#: 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 rvocation: " - -#: g10/pkclist.c:91 -msgid "revocation comment: " -msgstr "commentaire de rvocation: " - -#: 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 dfinie 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 rllement 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 dcision ? " - -#: 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 sr 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 nome dans\n" -"le nom d'utilisateur. Si vous savez *vraiment* ce que vous faites,\n" -"vous pouvez rpondre oui la prochaine question.\n" -"\n" - -#: g10/pkclist.c:468 -msgid "Use this key anyway? (y/N) " -msgstr "Utiliser cette cl quand mme ? (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 rvoque (cl de rvocation\n" -"absente)\n" - -#: g10/pkclist.c:518 -msgid "WARNING: This key has been revoked by its designated revoker!\n" -msgstr "AVERTISSEMENT: Cette cl t rvoque par son rvocateur dsign !\n" - -#: g10/pkclist.c:521 -msgid "WARNING: This key has been revoked by its owner!\n" -msgstr "ATTENTION: Cette cl t rvoque par son propritaire !\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 rvoque par son propritaire !\n" - -#: g10/pkclist.c:533 -msgid "Note: This key has been disabled.\n" -msgstr "Note: cette cl a t dsactive.\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 certifie 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 propritaire.\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 sr que la signature appartient son " -"propritaire.\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 dj prsente\n" - -#: g10/pkclist.c:885 -msgid "You did not specify a user ID. (you may use \"-r\")\n" -msgstr "" -"Vous n'avez pas spcifi de nom d'utilisateur. (vous pouvez\n" -"utiliser -r)\n" -"\n" - -#: g10/pkclist.c:909 -msgid "Current recipients:\n" -msgstr "Rcipients 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 dj le destinataire par dfaut\n" - -#: g10/pkclist.c:990 -msgid "Public key is disabled.\n" -msgstr "La cl publique est dsactive.\n" - -#: g10/pkclist.c:999 -msgid "skipped: public key already set\n" -msgstr "ignor: cl publique dj active\n" - -#: g10/pkclist.c:1034 -#, c-format -msgid "unknown default recipient \"%s\"\n" -msgstr "destinataire par dfaut %s inconnu\n" - -#: g10/pkclist.c:1092 -#, c-format -msgid "%s: skipped: public key is disabled\n" -msgstr "%s: ignor: la cl publique est dsactive\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 donnes ne sont pas enregistres; 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 cration de `%s': %s\n" - -#: g10/plaintext.c:452 -msgid "Detached signature.\n" -msgstr "Signature dtache.\n" - -#: g10/plaintext.c:458 -msgid "Please enter name of data file: " -msgstr "Entrez le nom du fichier de donnes: " - -#: g10/plaintext.c:490 -msgid "reading stdin ...\n" -msgstr "lecture de l'entre standard...\n" - -#: g10/plaintext.c:524 -msgid "no signed data\n" -msgstr "pas de donnes signes\n" - -#: g10/plaintext.c:538 -#, c-format -msgid "can't open signed data `%s'\n" -msgstr "impossible d'ouvir les donnes signes `%s'\n" - -#: g10/pubkey-enc.c:104 -#, c-format -msgid "anonymous recipient; trying secret key %s ...\n" -msgstr "destinataire anonyme; essai de la cl secrte %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 dsactiv\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 prfrences du destinataire\n" - -#: g10/pubkey-enc.c:302 -#, c-format -msgid "NOTE: secret key %s expired at %s\n" -msgstr "NOTE: la cl secrte %s a expir le %s\n" - -#: g10/pubkey-enc.c:308 -msgid "NOTE: key has been revoked" -msgstr "NOTE: la cl a t rvoque" - -#: 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 rvoqu par:\n" - -#: g10/revoke.c:312 -msgid "(This is a sensitive revocation key)\n" -msgstr "(c'est une cl de rvocation sensible)\n" - -#: g10/revoke.c:316 -msgid "Create a designated revocation certificate for this key? (y/N) " -msgstr "Gnrer un certificat de rvocation dsigne pour cette cl ? (o/N) " - -#: g10/revoke.c:329 g10/revoke.c:554 -msgid "ASCII armored output forced.\n" -msgstr "sortie avec armure ASCII force.\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 rvocation cr.\n" - -#: g10/revoke.c:413 -#, c-format -msgid "no revocation keys found for \"%s\"\n" -msgstr "aucune cl de rvocation trouve pour %s \n" - -#: g10/revoke.c:471 -#, c-format -msgid "secret key \"%s\" not found: %s\n" -msgstr "la cl secrte %s n'a pas t trouve: %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 secrte !\n" - -#: g10/revoke.c:518 -msgid "Create a revocation certificate for this key? (y/N) " -msgstr "Gnrer un certificat de rvocation 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 protge !\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 rvocation cr.\n" -"\n" -"Dplacez-le dans un support que vous pouvez cacher ; si Mallory a\n" -"accs ce certificat il peut l'utiliser pour rendre votre cl\n" -"inutilisable.\n" -"Une bonne ide consiste imprimer ce certificat puis le stocker\n" -"ailleurs, au cas o le support devient illisible. Mais attention :\n" -"le systme d'impression de votre machine pourrait stocker ces\n" -"donnes 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 rvocation:\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 srement slectionner %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 rvocation: %s\n" - -#: g10/revoke.c:718 -msgid "(No description given)\n" -msgstr "(Aucune description donne)\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 secrtes 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 ; ressayez" - -#: 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 dtecte - 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 "" -"gnration de la somme de contrle de 16 bits (dprcie) pour protger\n" -"la cl secrte\n" - -#: g10/seskey.c:54 -msgid "weak key created - retrying\n" -msgstr "cl faible gnre - 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 symtrique:\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 rcente 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 rcente 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 cre %lu seconde dans le futur (rupture\n" -"spatio-temporelle ou problme 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 cre %lu secondes dans le futur (rupture\n" -"spatio-temporelle ou problme 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 suppose 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 rvocation 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 donnes 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 donnes de notation dans des signatures de\n" -"cls 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" -"(chane trop grande). Utilisation de la version non expanse.\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 expanse.\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 expanse.\n" - -#: g10/sign.c:347 -#, c-format -msgid "checking created signature failed: %s\n" -msgstr "Impossible de vrifier la signature cre: %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 gnrer une signature dtache avec des cls 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" -"dsaccord avec les prfrences 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 cls\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:127 g10/skclist.c:191 -msgid "key is not flagged as insecure - can't use it with the faked RNG!\n" -msgstr "" -"la cl n'est pas marque comme non-sre; on ne peut pas l'utiliser avec le\n" -"pseudo-gnrateur de nombres alatiores !\n" - -#: g10/skclist.c:158 -#, c-format -msgid "skipped \"%s\": duplicated\n" -msgstr " %s a t ignor: dupliqu\n" - -#: g10/skclist.c:166 g10/skclist.c:176 g10/skclist.c:185 -#, c-format -msgid "skipped \"%s\": %s\n" -msgstr " %s a t ignor: %s\n" - -#: g10/skclist.c:171 -msgid "skipped: secret key already present\n" -msgstr "ignor: cl secrte dj prsente\n" - -#: g10/skclist.c:186 -msgid "this is a PGP generated Elgamal key which is not secure for signatures!" -msgstr "" -"c'est une cl ElGamal gnre par PGP qui n'est pas sre 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 assignes, cre 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 propritaire 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'accder `%s': %s\n" - -#: g10/tdbio.c:513 -#, c-format -msgid "%s: directory does not exist!\n" -msgstr "%s: le rpertoire 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 crer 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 crer un enregistrement de version: %s" - -#: g10/tdbio.c:555 -#, c-format -msgid "%s: invalid trustdb created\n" -msgstr "%s: base de confiance invalide cre\n" - -#: g10/tdbio.c:558 -#, c-format -msgid "%s: trustdb created\n" -msgstr "%s: base de confiance cre\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 cration 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 numro %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" -"rpertoire: %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 zro: %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; excutez 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 caractres\n" - -#: g10/textfilter.c:248 -#, c-format -msgid "input line longer than %d characters\n" -msgstr "la ligne d'entre est plus longue que %d caractres\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: accepte 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 apparat 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 - ignore\n" - -#: g10/trustdb.c:321 -#, c-format -msgid "key %s marked as ultimately trusted\n" -msgstr "cl %s marque 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 requte %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 modle de confiance inconnu (%d) -\n" -"on utilise la place le modle de confiance %s\n" - -#: g10/trustdb.c:453 -#, c-format -msgid "using %s trust model\n" -msgstr "utilisation du modle 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 "[ revoque]" - -#: g10/trustdb.c:509 g10/trustdb.c:514 -msgid "[ expired]" -msgstr "[ expire ]" - -#: g10/trustdb.c:513 -msgid "[ unknown]" -msgstr "[ inconnue]" - -#: g10/trustdb.c:515 -msgid "[ undef ]" -msgstr "[indfinie]" - -#: g10/trustdb.c:516 -msgid "[marginal]" -msgstr "[marginale]" - -#: g10/trustdb.c:517 -msgid "[ full ]" -msgstr "[ entire ]" - -#: g10/trustdb.c:518 -msgid "[ultimate]" -msgstr "[ ultime ]" - -#: g10/trustdb.c:533 -msgid "undefined" -msgstr "indfinie" - -#: g10/trustdb.c:534 -msgid "never" -msgstr "jamais" - -#: g10/trustdb.c:535 -msgid "marginal" -msgstr "marginale" - -#: g10/trustdb.c:536 -msgid "full" -msgstr "entire" - -#: g10/trustdb.c:537 -msgid "ultimate" -msgstr "ultime" - -#: g10/trustdb.c:577 -msgid "no need for a trustdb check\n" -msgstr "vrification 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 vrification 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 "" -"vrification de la base de confiance inutile avec le modle 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 modle 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 trouve : %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 "vrifier la base de confiance\n" - -#: g10/trustdb.c:2095 -#, c-format -msgid "%d keys processed (%d validity counts cleared)\n" -msgstr "%d cls traites (%d comptes de validit rinitialiss)\n" - -#: g10/trustdb.c:2160 -msgid "no ultimately trusted keys found\n" -msgstr "aucune cl de confiance ultime n'a t trouve\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) ncessaires, %d complte(s) ncessaires, modle\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 vrifier 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'entre %u est trop longue ou il manque un caractre de saut\n" -"de ligne\n" - -#: util/errors.c:55 -msgid "general error" -msgstr "erreur gnrale" - -#: 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 secrte" - -#: util/errors.c:62 -msgid "bad signature" -msgstr "mauvaise signature" - -#: util/errors.c:63 -msgid "checksum error" -msgstr "somme de contrle errone" - -#: 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 trouve" - -#: 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-cls" - -#: 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 secrte n'est pas disponible" - -#: util/errors.c:72 -msgid "wrong secret key used" -msgstr "mauvaise cl secrte utilise" - -#: 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 cration 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 prcision multiple (MPI)" - -#: util/errors.c:86 -msgid "resource limit" -msgstr "limite de ressources atteinte" - -#: util/errors.c:87 -msgid "invalid keyring" -msgstr "porte-cls 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 "donnes inattendues" - -#: util/errors.c:94 -msgid "timestamp conflict" -msgstr "conflit de dates" - -#: util/errors.c:95 -msgid "unusable pubkey algorithm" -msgstr "algorithme de cls 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 supporte" - -#: util/errors.c:101 -msgid "network error" -msgstr "erreur de rseau" - -#: 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 secrte inutilisable" - -#: util/errors.c:108 -msgid "keyserver error" -msgstr "erreur du serveur de cls" - -#: 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 donnes signes\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 mmoire n'est pas sre !\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:350 -msgid "operation is not possible without initialized secure memory\n" -msgstr "" -"l'opration n'est pas possible tant que la mmoire sre n'est pas\n" -"initialise\n" - -#: util/secmem.c:351 -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 ncessite 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 caractres 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 caractre '@'\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 caractre '@'\n" - -#~ msgid "a notation value must not use any control characters\n" -#~ msgstr "" -#~ "une valeur de notation ne doit utiliser aucun caractre de contrle\n" - -#~ msgid "WARNING: invalid notation data found\n" -#~ msgstr "ATTENTION: des donnes de notation invalides ont t dtectes\n" - -#~ msgid "not human readable" -#~ msgstr "illisible par un humain" - -#~ msgid "expired: %s)" -#~ msgstr "expire: %s)" diff --git a/po/gl.po b/po/gl.po deleted file mode 100644 index 631c059a9..000000000 --- a/po/gl.po +++ /dev/null @@ -1,7551 +0,0 @@ -# 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-07-28 11:12+0200\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 nmero 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 nmero primo de menos de %d bits\n" - -#: cipher/random.c:173 -msgid "no entropy gathering module detected\n" -msgstr "non se detectou un mdulo de acumulacin de entropa\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:1003 g10/gpg.c:3461 g10/import.c:195 g10/keygen.c:2385 -#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:342 -#: 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 - ignrase\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: tamao do ficheiro random_seed non vlido - 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:1002 g10/keygen.c:2864 -#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:263 -#: g10/openfile.c:357 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: emprgase un xerador de nmeros 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 nmeros aleatorios s un truco para poder\n" -"executalo - non de ningn xeito un xerador de nmeros\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 entropa. Traballe un\n" -"pouco se iso evita que se aburra, que iso ha aumenta-la\n" -"calidade da entropa.\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 dispoibles. Por favor, faga outro\n" -"traballo para lle dar ao sistema operativo unha oportunidade de acumular\n" -"mis entropa (Precsanse %d bytes mis)\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 envo 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 xeracin 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 vlidos.\n" - -#: g10/armor.c:320 -#, c-format -msgid "armor: %s\n" -msgstr "armadura: %s\n" - -#: g10/armor.c:359 -msgid "invalid armor header: " -msgstr "cabeceira de armadura non vlida: " - -#: g10/armor.c:370 -msgid "armor header: " -msgstr "cabeceira de armadura: " - -#: g10/armor.c:381 -msgid "invalid clearsig header\n" -msgstr "cabeceira de sinatura en claro non vlida\n" - -#: g10/armor.c:433 -msgid "nested clear text signatures\n" -msgstr "sinaturas en texto claro aniadas\n" - -#: g10/armor.c:568 -#, fuzzy -msgid "unexpected armor: " -msgstr "armadura inesperada:" - -#: g10/armor.c:580 -msgid "invalid dash escaped line: " -msgstr "lia escapada cunha barra non vlida: " - -#: g10/armor.c:734 g10/armor.c:1343 -#, fuzzy, c-format -msgid "invalid radix64 character %02X skipped\n" -msgstr "carcter radix64 non vlido %02x omitido\n" - -#: g10/armor.c:777 -msgid "premature eof (no CRC)\n" -msgstr "fin de ficheiro prematura (non hai CRC)\n" - -#: g10/armor.c:811 -msgid "premature eof (in CRC)\n" -msgstr "fin de ficheiro prematura (no CRC)\n" - -#: g10/armor.c:819 -msgid "malformed CRC\n" -msgstr "CRC mal formado\n" - -#: g10/armor.c:823 g10/armor.c:1380 -#, fuzzy, c-format -msgid "CRC error; %06lX - %06lX\n" -msgstr "Erro de CRC; %06lx - %06lx\n" - -#: g10/armor.c:843 -#, fuzzy -msgid "premature eof (in trailer)\n" -msgstr "fin de ficheiro prematura (nas lias adicionais)\n" - -#: g10/armor.c:847 -msgid "error in trailer line\n" -msgstr "error nunha lia adicional\n" - -#: g10/armor.c:1158 -msgid "no valid OpenPGP data found.\n" -msgstr "non se atoparon datos OpenPGP vlidos.\n" - -#: g10/armor.c:1163 -#, c-format -msgid "invalid armor: line longer than %d characters\n" -msgstr "armadura incorrecta: lia mis longa ca %d caracteres\n" - -#: g10/armor.c:1167 -msgid "" -"quoted printable character in armor - probably a buggy MTA has been used\n" -msgstr "" -"carcter 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 dispoible" - -#: 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 sa seleccin? " - -#: 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 pblica 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:280 -#, 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 vlido na cadea de preferencias\n" - -#: g10/card-util.c:811 -#, fuzzy -msgid "Error: invalid characters in preference string.\n" -msgstr "caracter non vlido 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 vlida\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 vlida\n" - -#: g10/card-util.c:938 -#, fuzzy, c-format -msgid "key operation not possible: %s\n" -msgstr "A xeracin da chave fallou: %s\n" - -#: g10/card-util.c:939 -#, fuzzy -msgid "not an OpenPGP card" -msgstr "non se atoparon datos OpenPGP vlidos.\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 "Seleccin non vlida.\n" - -#: g10/card-util.c:1203 -#, fuzzy -msgid "Please select where to store the key:\n" -msgstr "Por favor, escolla o motivo da revocacin:\n" - -#: g10/card-util.c:1238 -#, fuzzy -msgid "unknown key protection algorithm\n" -msgstr "algoritmo de proteccin descoecido\n" - -#: g10/card-util.c:1243 -#, fuzzy -msgid "secret parts of key are not available\n" -msgstr "as partes secretas da chave primaria non estn dispoibles.\n" - -#: g10/card-util.c:1248 -#, fuzzy -msgid "secret key already stored on a card\n" -msgstr "omtese: a chave secreta xa est presente\n" - -#: g10/card-util.c:1319 g10/keyedit.c:1357 -msgid "quit this menu" -msgstr "sar 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 dispoible 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 expiracin" - -#: 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 dispoible" - -#: 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; tnteo de novo" - -#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3826 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:3387 g10/keyserver.c:1700 -#: 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:2349 g10/keyserver.c:1714 -#: 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 informacin 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 pblica \"%s\"!\n" - -#: g10/delkey.c:208 -msgid "use option \"--delete-secret-keys\" to delete it first.\n" -msgstr "empregue a opcin \"--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 simtrico 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 tdalas 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 simtrica %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 compresin %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 simtrica %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:67 g10/mainproc.c:293 -#, c-format -msgid "%s encrypted data\n" -msgstr "datos cifrados con %s\n" - -#: g10/encr-data.c:69 g10/mainproc.c:297 -#, c-format -msgid "encrypted with unknown algorithm %d\n" -msgstr "cifrado cun algoritmo descoecido %d\n" - -#: g10/encr-data.c:93 -msgid "" -"WARNING: message was encrypted with a weak key in the symmetric cipher.\n" -msgstr "AVISO: cifrouse a mensaxe cunha chave feble no cifrado simtrico.\n" - -#: g10/encr-data.c:104 -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 execucin remota de programas\n" - -#: g10/exec.c:176 g10/openfile.c:415 -#, 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 estn desactivadas debido a opcins 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 "sada 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 revocacin 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 comprobacin SK simple\n" - -#: g10/export.c:598 -msgid "WARNING: nothing exported\n" -msgstr "AVISO: non se exportou nada\n" - -#: g10/gpg.c:375 -msgid "" -"@Commands:\n" -" " -msgstr "" -"@Comandos:\n" -" " - -#: g10/gpg.c:377 -msgid "|[file]|make a signature" -msgstr "|[ficheiro]|facer unha sinatura" - -#: g10/gpg.c:378 -msgid "|[file]|make a clear text signature" -msgstr "|[ficheiro]|facer unha sinatura en texto claro" - -#: g10/gpg.c:379 -msgid "make a detached signature" -msgstr "facer unha sinatura separada" - -#: g10/gpg.c:380 -msgid "encrypt data" -msgstr "cifrar datos" - -#: g10/gpg.c:382 -msgid "encryption only with symmetric cipher" -msgstr "cifrar s con cifrado simtrico" - -#: g10/gpg.c:384 -msgid "decrypt data (default)" -msgstr "descifrar datos (por defecto)" - -#: g10/gpg.c:386 -msgid "verify a signature" -msgstr "verificar unha sinatura" - -#: g10/gpg.c:388 -msgid "list keys" -msgstr "ve-la lista de chaves" - -#: g10/gpg.c:390 -msgid "list keys and signatures" -msgstr "ve-la lista de chaves e sinaturas" - -#: g10/gpg.c:391 -#, fuzzy -msgid "list and check key signatures" -msgstr "verifica-las sinaturas das chaves" - -#: g10/gpg.c:392 -msgid "list keys and fingerprints" -msgstr "ve-la lista de chaves e pegadas dactilares" - -#: g10/gpg.c:393 -msgid "list secret keys" -msgstr "ve-la lista de chaves secretas" - -#: g10/gpg.c:394 -msgid "generate a new key pair" -msgstr "xerar un novo par de chaves" - -#: g10/gpg.c:395 -msgid "remove keys from the public keyring" -msgstr "borrar chaves do chaveiro pblico" - -#: g10/gpg.c:397 -msgid "remove keys from the secret keyring" -msgstr "borrar chaves do chaveiro secreto" - -#: g10/gpg.c:398 -msgid "sign a key" -msgstr "asinar unha chave" - -#: g10/gpg.c:399 -msgid "sign a key locally" -msgstr "asinar unha chave localmente" - -#: g10/gpg.c:400 -msgid "sign or edit a key" -msgstr "asinar ou editar unha chave" - -#: g10/gpg.c:401 -msgid "generate a revocation certificate" -msgstr "xerar un certificado de revocacin" - -#: g10/gpg.c:403 -msgid "export keys" -msgstr "exportar chaves" - -#: g10/gpg.c:404 -msgid "export keys to a key server" -msgstr "exportar chaves a un servidor de chaves" - -#: g10/gpg.c:405 -msgid "import keys from a key server" -msgstr "importar chaves dun servidor de chaves" - -#: g10/gpg.c:407 -msgid "search for keys on a key server" -msgstr "buscar chaves nun servidor de chaves" - -#: g10/gpg.c:409 -msgid "update all keys from a keyserver" -msgstr "actualizar tdalas chaves dun servidor de chaves" - -#: g10/gpg.c:413 -msgid "import/merge keys" -msgstr "importar/mesturar chaves" - -#: g10/gpg.c:416 -msgid "print the card status" -msgstr "" - -#: g10/gpg.c:417 -msgid "change data on a card" -msgstr "" - -#: g10/gpg.c:418 -msgid "change a card's PIN" -msgstr "" - -#: g10/gpg.c:426 -msgid "update the trust database" -msgstr "actualiza-la base de datos de confianza" - -#: g10/gpg.c:433 -msgid "|algo [files]|print message digests" -msgstr "|algo [ficheiros]|visualizar resumos de mensaxes" - -#: g10/gpg.c:437 g10/gpgv.c:71 -msgid "" -"@\n" -"Options:\n" -" " -msgstr "" -"@\n" -"Opcins:\n" -" " - -#: g10/gpg.c:439 -msgid "create ascii armored output" -msgstr "crear sada con armadura en ascii" - -#: g10/gpg.c:441 -msgid "|NAME|encrypt for NAME" -msgstr "|NOME|cifrar para NOME" - -#: g10/gpg.c:452 -msgid "use this user-id to sign or decrypt" -msgstr "empregar este id de usuario para asinar ou descifrar" - -#: g10/gpg.c:453 -msgid "|N|set compress level N (0 disables)" -msgstr "|N|axusta-lo nivel de compresin a N (0 desactiva)" - -#: g10/gpg.c:458 -msgid "use canonical text mode" -msgstr "usar modo de texto cannico" - -#: g10/gpg.c:472 -msgid "use as output file" -msgstr "usar coma ficheiro de sada" - -#: g10/gpg.c:474 g10/gpgv.c:73 -msgid "verbose" -msgstr "lareto" - -#: g10/gpg.c:485 -msgid "do not make any changes" -msgstr "non facer ningn cambio" - -#: g10/gpg.c:486 -msgid "prompt before overwriting" -msgstr "avisar antes de sobrescribir" - -#: g10/gpg.c:527 -msgid "use strict OpenPGP behavior" -msgstr "" - -#: g10/gpg.c:528 -msgid "generate PGP 2.x compatible messages" -msgstr "" - -#: g10/gpg.c:556 -msgid "" -"@\n" -"(See the man page for a complete listing of all commands and options)\n" -msgstr "" -"@\n" -"(Vexa a pxina man para un listado completo de comandos e opcins)\n" - -#: g10/gpg.c:559 -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:757 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 traduccin a <proxecto@trasno.net>.\n" - -#: g10/gpg.c:774 -msgid "Usage: gpg [options] [files] (-h for help)" -msgstr "Uso: gpg [opcins] [ficheiros] (-h para ve-la axuda)" - -#: g10/gpg.c:777 -msgid "" -"Syntax: gpg [options] [files]\n" -"sign, check, encrypt or decrypt\n" -"default operation depends on the input data\n" -msgstr "" -"Sintaxe: gpg [opcins] [ficheiros]\n" -"asinar, verificar, cifrar ou descifrar\n" -"a operacin por defecto depende dos datos de entrada\n" - -#: g10/gpg.c:788 -msgid "" -"\n" -"Supported algorithms:\n" -msgstr "" -"\n" -"Algoritmos soportados:\n" - -#: g10/gpg.c:791 -msgid "Pubkey: " -msgstr "Pblica: " - -#: g10/gpg.c:797 g10/keyedit.c:2310 -msgid "Cipher: " -msgstr "Cifra: " - -#: g10/gpg.c:803 -msgid "Hash: " -msgstr "Hash: " - -#: g10/gpg.c:809 g10/keyedit.c:2356 -msgid "Compression: " -msgstr "Compresin: " - -#: g10/gpg.c:892 -msgid "usage: gpg [options] " -msgstr "uso: gpg [opcins] " - -#: g10/gpg.c:1040 -msgid "conflicting commands\n" -msgstr "comandos conflictivos\n" - -#: g10/gpg.c:1058 -#, fuzzy, c-format -msgid "no = sign found in group definition `%s'\n" -msgstr "non se atopou un signo = na definicin do grupo \"%s\"\n" - -#: g10/gpg.c:1255 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on homedir `%s'\n" -msgstr "AVISO: propiedade insegura en %s \"%s\"\n" - -#: g10/gpg.c:1258 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on configuration file `%s'\n" -msgstr "AVISO: propiedade insegura en %s \"%s\"\n" - -#: g10/gpg.c:1261 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on extension `%s'\n" -msgstr "AVISO: propiedade insegura en %s \"%s\"\n" - -#: g10/gpg.c:1267 -#, fuzzy, c-format -msgid "WARNING: unsafe permissions on homedir `%s'\n" -msgstr "AVISO: permisos inseguros en %s \"%s\"\n" - -#: g10/gpg.c:1270 -#, fuzzy, c-format -msgid "WARNING: unsafe permissions on configuration file `%s'\n" -msgstr "AVISO: permisos inseguros en %s \"%s\"\n" - -#: g10/gpg.c:1273 -#, fuzzy, c-format -msgid "WARNING: unsafe permissions on extension `%s'\n" -msgstr "AVISO: permisos inseguros en %s \"%s\"\n" - -#: g10/gpg.c:1279 -#, 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:1282 -#, 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:1285 -#, 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:1291 -#, 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:1294 -#, 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:1297 -#, 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:1438 -#, fuzzy, c-format -msgid "unknown configuration item `%s'\n" -msgstr " creouse un novo ficheiro de configuracin `%s'\n" - -#: g10/gpg.c:1531 -msgid "display photo IDs during key listings" -msgstr "" - -#: g10/gpg.c:1533 -msgid "show policy URLs during signature listings" -msgstr "" - -#: g10/gpg.c:1535 -#, fuzzy -msgid "show all notations during signature listings" -msgstr "Non hai unha sinatura correspondiente no chaveiro secreto\n" - -#: g10/gpg.c:1537 -msgid "show IETF standard notations during signature listings" -msgstr "" - -#: g10/gpg.c:1541 -msgid "show user-supplied notations during signature listings" -msgstr "" - -#: g10/gpg.c:1543 -#, fuzzy -msgid "show preferred keyserver URLs during signature listings" -msgstr "o URL de normativa de sinaturas dado non vlido\n" - -#: g10/gpg.c:1545 -msgid "show user ID validity during key listings" -msgstr "" - -#: g10/gpg.c:1547 -msgid "show revoked and expired user IDs in key listings" -msgstr "" - -#: g10/gpg.c:1549 -msgid "show revoked and expired subkeys in key listings" -msgstr "" - -#: g10/gpg.c:1551 -#, fuzzy -msgid "show the keyring name in key listings" -msgstr "amosar en que chaveiro est unha chave listada" - -#: g10/gpg.c:1553 -#, fuzzy -msgid "show expiration dates during signature listings" -msgstr "Non hai unha sinatura correspondiente no chaveiro secreto\n" - -#: g10/gpg.c:1920 -#, c-format -msgid "NOTE: old default options file `%s' ignored\n" -msgstr "NOTA: ignrase o antigo ficheiro de opcins por defecto `%s'\n" - -#: g10/gpg.c:1962 -#, c-format -msgid "NOTE: no default option file `%s'\n" -msgstr "NOTA: non existe o ficheiro de opcins por defecto `%s'\n" - -#: g10/gpg.c:1966 -#, c-format -msgid "option file `%s': %s\n" -msgstr "ficheiro de opcins `%s': %s\n" - -#: g10/gpg.c:1973 -#, c-format -msgid "reading options from `%s'\n" -msgstr "lendo as opcins de `%s'\n" - -#: g10/gpg.c:2188 g10/gpg.c:2814 g10/gpg.c:2833 -#, c-format -msgid "NOTE: %s is not for normal use!\n" -msgstr "NOTA: %s non para uso normal!\n" - -#: g10/gpg.c:2201 -#, fuzzy, c-format -msgid "cipher extension `%s' not loaded due to unsafe permissions\n" -msgstr "" -"non se cargou a extensin de cifrado \"%s\" debido a permisos inseguros\n" - -#: g10/gpg.c:2364 g10/gpg.c:2376 -#, fuzzy, c-format -msgid "`%s' is not a valid signature expiration\n" -msgstr "%s non un xogo de caracteres vlido\n" - -#: g10/gpg.c:2452 -#, fuzzy, c-format -msgid "`%s' is not a valid character set\n" -msgstr "%s non un xogo de caracteres vlido\n" - -#: g10/gpg.c:2476 g10/gpg.c:2663 g10/keyedit.c:4064 -#, fuzzy -msgid "could not parse keyserver URL\n" -msgstr "non se puido analisa-lo URI do servidor de chaves\n" - -#: g10/gpg.c:2488 -#, fuzzy, c-format -msgid "%s:%d: invalid keyserver options\n" -msgstr "%s:%d: opcins de exportacin non vlidas\n" - -#: g10/gpg.c:2491 -#, fuzzy -msgid "invalid keyserver options\n" -msgstr "opcins de exportacin non vlidas\n" - -#: g10/gpg.c:2498 -#, c-format -msgid "%s:%d: invalid import options\n" -msgstr "%s:%d: opcins de importacin non vlidas\n" - -#: g10/gpg.c:2501 -msgid "invalid import options\n" -msgstr "opcins de importacin non vlidas\n" - -#: g10/gpg.c:2508 -#, c-format -msgid "%s:%d: invalid export options\n" -msgstr "%s:%d: opcins de exportacin non vlidas\n" - -#: g10/gpg.c:2511 -msgid "invalid export options\n" -msgstr "opcins de exportacin non vlidas\n" - -#: g10/gpg.c:2518 -#, fuzzy, c-format -msgid "%s:%d: invalid list options\n" -msgstr "%s:%d: opcins de importacin non vlidas\n" - -#: g10/gpg.c:2521 -#, fuzzy -msgid "invalid list options\n" -msgstr "opcins de importacin non vlidas\n" - -#: g10/gpg.c:2529 -msgid "display photo IDs during signature verification" -msgstr "" - -#: g10/gpg.c:2531 -msgid "show policy URLs during signature verification" -msgstr "" - -#: g10/gpg.c:2533 -#, fuzzy -msgid "show all notations during signature verification" -msgstr "%s non un xogo de caracteres vlido\n" - -#: g10/gpg.c:2535 -msgid "show IETF standard notations during signature verification" -msgstr "" - -#: g10/gpg.c:2539 -msgid "show user-supplied notations during signature verification" -msgstr "" - -#: g10/gpg.c:2541 -#, fuzzy -msgid "show preferred keyserver URLs during signature verification" -msgstr "o URL de normativa de sinaturas dado non vlido\n" - -#: g10/gpg.c:2543 -#, fuzzy -msgid "show user ID validity during signature verification" -msgstr "%s non un xogo de caracteres vlido\n" - -#: g10/gpg.c:2545 -msgid "show revoked and expired user IDs in signature verification" -msgstr "" - -#: g10/gpg.c:2547 -msgid "validate signatures with PKA data" -msgstr "" - -#: g10/gpg.c:2549 -msgid "elevate the trust of signatures with valid PKA data" -msgstr "" - -#: g10/gpg.c:2556 -#, fuzzy, c-format -msgid "%s:%d: invalid verify options\n" -msgstr "%s:%d: opcins de exportacin non vlidas\n" - -#: g10/gpg.c:2559 -#, fuzzy -msgid "invalid verify options\n" -msgstr "opcins de exportacin non vlidas\n" - -#: g10/gpg.c:2566 -#, c-format -msgid "unable to set exec-path to %s\n" -msgstr "non se puido estabrecer exec-path a %s\n" - -#: g10/gpg.c:2729 -#, fuzzy, c-format -msgid "%s:%d: invalid auto-key-locate list\n" -msgstr "%s:%d: opcins de exportacin non vlidas\n" - -#: g10/gpg.c:2732 -msgid "invalid auto-key-locate list\n" -msgstr "" - -#: g10/gpg.c:2803 -msgid "WARNING: program may create a core file!\n" -msgstr "AVISO: o programa pode crear un ficheiro 'core'!\n" - -#: g10/gpg.c:2807 -#, c-format -msgid "WARNING: %s overrides %s\n" -msgstr "AVISO: %s fai que se ignore %s\n" - -#: g10/gpg.c:2816 -#, c-format -msgid "%s not allowed with %s!\n" -msgstr "%s non se admite con %s!\n" - -#: g10/gpg.c:2819 -#, c-format -msgid "%s makes no sense with %s!\n" -msgstr "%s non ten sentido empregndoo con %s!\n" - -#: g10/gpg.c:2826 -#, fuzzy, c-format -msgid "NOTE: %s is not available in this version\n" -msgstr "gpg-agent non est dispoible nesta sesin\n" - -#: g10/gpg.c:2841 -#, 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:2855 -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:2861 -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:2867 -msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n" -msgstr "" -"debe empregar ficheiros (e non canalizacins) ao traballar con --pgp2 " -"activado.\n" - -#: g10/gpg.c:2880 -msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n" -msgstr "para cifrar unha mensaxe en modo --pgp2 precsase da cifra IDEA\n" - -#: g10/gpg.c:2947 g10/gpg.c:2971 -msgid "selected cipher algorithm is invalid\n" -msgstr "o algoritmo de cifrado seleccionado non vlido\n" - -#: g10/gpg.c:2953 g10/gpg.c:2977 -msgid "selected digest algorithm is invalid\n" -msgstr "o algoritmo de resumo seleccionado non vlido\n" - -#: g10/gpg.c:2959 -#, fuzzy -msgid "selected compression algorithm is invalid\n" -msgstr "o algoritmo de cifrado seleccionado non vlido\n" - -#: g10/gpg.c:2965 -msgid "selected certification digest algorithm is invalid\n" -msgstr "o algoritmo de resumo de certificacin seleccionado non vlido\n" - -#: g10/gpg.c:2980 -msgid "completes-needed must be greater than 0\n" -msgstr "completes-needed debe ser superior a 0\n" - -#: g10/gpg.c:2982 -msgid "marginals-needed must be greater than 1\n" -msgstr "marginals-needed debe ser superior a 1\n" - -#: g10/gpg.c:2984 -#, 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:2986 -#, fuzzy -msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n" -msgstr "nivel de comprobacin por defecto non vlido; debe ser 0, 1, 2 ou 3\n" - -#: g10/gpg.c:2988 -#, fuzzy -msgid "invalid min-cert-level; must be 1, 2, or 3\n" -msgstr "nivel de comprobacin por defecto non vlido; debe ser 0, 1, 2 ou 3\n" - -#: g10/gpg.c:2991 -msgid "NOTE: simple S2K mode (0) is strongly discouraged\n" -msgstr "NOTA: desaconsllase encarecidamente o modo S2K simple (0)\n" - -#: g10/gpg.c:2995 -msgid "invalid S2K mode; must be 0, 1 or 3\n" -msgstr "modo S2K non vlido; debe ser 0, 1 ou 3\n" - -#: g10/gpg.c:3002 -msgid "invalid default preferences\n" -msgstr "preferencias por defecto non vlidas\n" - -#: g10/gpg.c:3011 -msgid "invalid personal cipher preferences\n" -msgstr "preferencias de cifrado personais non vlidas\n" - -#: g10/gpg.c:3015 -msgid "invalid personal digest preferences\n" -msgstr "preferencias de resumo personais non vlidas\n" - -#: g10/gpg.c:3019 -msgid "invalid personal compress preferences\n" -msgstr "preferencias de compresin personais non vlidas\n" - -#: g10/gpg.c:3052 -#, c-format -msgid "%s does not yet work with %s\n" -msgstr "%s anda non traballa con %s!\n" - -#: g10/gpg.c:3099 -#, 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:3104 -#, 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:3109 -#, fuzzy, c-format -msgid "you may not use compression algorithm `%s' while in %s mode\n" -msgstr "non se pode empregar o algoritmo de compresin \"%s\" no modo %s\n" - -#: g10/gpg.c:3208 -#, 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:3219 -msgid "WARNING: recipients (-r) given without using public key encryption\n" -msgstr "" -"AVISO: deronse destinatarios (-r) sen empregar cifrado de chave pblica\n" - -#: g10/gpg.c:3230 -msgid "--store [filename]" -msgstr "--store [ficheiro]" - -#: g10/gpg.c:3237 -msgid "--symmetric [filename]" -msgstr "--symmetric [ficheiro]" - -#: g10/gpg.c:3239 -#, fuzzy, c-format -msgid "symmetric encryption of `%s' failed: %s\n" -msgstr "o descifrado fallou: %s\n" - -#: g10/gpg.c:3249 -msgid "--encrypt [filename]" -msgstr "--encrypt [ficheiro]" - -#: g10/gpg.c:3262 -#, fuzzy -msgid "--symmetric --encrypt [filename]" -msgstr "--sign --encrypt [ficheiro]" - -#: g10/gpg.c:3264 -msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n" -msgstr "" - -#: g10/gpg.c:3267 -#, 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:3285 -msgid "--sign [filename]" -msgstr "--sign [ficheiro]" - -#: g10/gpg.c:3298 -msgid "--sign --encrypt [filename]" -msgstr "--sign --encrypt [ficheiro]" - -#: g10/gpg.c:3313 -#, fuzzy -msgid "--symmetric --sign --encrypt [filename]" -msgstr "--sign --encrypt [ficheiro]" - -#: g10/gpg.c:3315 -msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n" -msgstr "" - -#: g10/gpg.c:3318 -#, 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:3338 -msgid "--sign --symmetric [filename]" -msgstr "--sign --symmetric [ficheiro]" - -#: g10/gpg.c:3347 -msgid "--clearsign [filename]" -msgstr "--clearsign [ficheiro]" - -#: g10/gpg.c:3372 -msgid "--decrypt [filename]" -msgstr "--decrypt [ficheiro]" - -#: g10/gpg.c:3380 -msgid "--sign-key user-id" -msgstr "--sign-key id-de-usuario" - -#: g10/gpg.c:3384 -msgid "--lsign-key user-id" -msgstr "--lsign-key id-de-usuario" - -#: g10/gpg.c:3405 -msgid "--edit-key user-id [commands]" -msgstr "--edit-key id-de-usuario [comandos]" - -#: g10/gpg.c:3476 -msgid "-k[v][v][v][c] [user-id] [keyring]" -msgstr "-k[v][v][v][c] [id-de-usuario] [chaveiro]" - -#: g10/gpg.c:3518 -#, c-format -msgid "keyserver send failed: %s\n" -msgstr "o envo ao servidor de chaves fallou: %s\n" - -#: g10/gpg.c:3520 -#, c-format -msgid "keyserver receive failed: %s\n" -msgstr "a recepcin do servidor de chaves fallou: %s\n" - -#: g10/gpg.c:3522 -#, c-format -msgid "key export failed: %s\n" -msgstr "a exportacin da chave fallou: %s\n" - -#: g10/gpg.c:3533 -#, c-format -msgid "keyserver search failed: %s\n" -msgstr "a busca no servidor de chaves fallou fallou: %s\n" - -#: g10/gpg.c:3543 -#, c-format -msgid "keyserver refresh failed: %s\n" -msgstr "a actualizacin no servidor de chaves fallou: %s\n" - -#: g10/gpg.c:3594 -#, c-format -msgid "dearmoring failed: %s\n" -msgstr "non se puido quita-la armadura: %s\n" - -#: g10/gpg.c:3602 -#, c-format -msgid "enarmoring failed: %s\n" -msgstr "non se puido poe-la armadura: %s\n" - -#: g10/gpg.c:3689 -#, c-format -msgid "invalid hash algorithm `%s'\n" -msgstr "algoritmo de hash non vlido `%s'\n" - -#: g10/gpg.c:3812 -msgid "[filename]" -msgstr "[ficheiro]" - -#: g10/gpg.c:3816 -msgid "Go ahead and type your message ...\n" -msgstr "Escriba a sa mensaxe ...\n" - -#: g10/gpg.c:4120 -msgid "the given certification policy URL is invalid\n" -msgstr "o URL de normativa de certificacin dado non vlido\n" - -#: g10/gpg.c:4122 -msgid "the given signature policy URL is invalid\n" -msgstr "o URL de normativa de sinaturas dado non vlido\n" - -#: g10/gpg.c:4155 -#, fuzzy -msgid "the given preferred keyserver URL is invalid\n" -msgstr "o URL de normativa de sinaturas dado non vlido\n" - -#: g10/getkey.c:152 -msgid "too many entries in pk cache - disabled\n" -msgstr "demasiadas entradas na cach de chaves pblicas - 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 vlida convertida en vlida por --allow-non-selfsigned-uid\n" - -#: g10/getkey.c:2380 g10/keyedit.c:3707 -#, fuzzy, c-format -msgid "no secret subkey for public subkey %s - ignoring\n" -msgstr "" -"non hai unha sub-chave secreta para a sub-chave pblica %08lX - ignrase\n" - -#: g10/getkey.c:2611 -#, fuzzy, c-format -msgid "using subkey %s instead of primary key %s\n" -msgstr "emprgase 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 pblica - omitida\n" - -#: g10/gpgv.c:74 -msgid "be somewhat more quiet" -msgstr "ser un pouquio mis 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 informacin de estado a este DF" - -#: g10/gpgv.c:102 -msgid "Usage: gpgv [options] [files] (-h for help)" -msgstr "Uso: gpgv [opcins] [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 [opcins] [ficheiros]\n" -"Comproba as sinaturas contra chaves de confianza coecidas\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 asignacin dun valor aqu cousa sa; este valor nunca se ha exportar\n" -"a ningn terceiro. Precsase 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 teen\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 confa, 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 debera 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 tamao 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 xeracin da chave.\n" -"S para sar da xeracin 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, debera 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 verificacins de\n" -" \"personaxes\", nas que asina a chave dun usuario pseudnimo.\n" -"\n" -"\"2\" significa que fixo unha comprobacin 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 identificacin " -"fotogrfica.\n" -"\n" -"\"3\" significa que fixo unha comprobacin 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 difcil de " -"falsificar\n" -" cunha identificacin fotogrfica (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" -" electrnico) que o enderezo de e-mail da chave pertence ao propietario\n" -" da chave.\n" -"\n" -"Tea 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 TDOLOS 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" -"Tamn se han perder tdolos 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 vlida na chave; normalmente non ha borrar esta\n" -"sinatura porque pode ser importante para estabrecer unha conexin 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 pose a chave\n" -"correspondente. Debera retrasa-lo borrado ata que saiba que chave\n" -"se empregou porque esta chave de sinatura podera estabrecer unha\n" -"conexin 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 mis esta chave. As que faga isto\n" -"s se esta auto-sinatura non correcta por algun motivo e hai\n" -"unha segunda sa disposicin." - -#: 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 tdolos IDs de usuario (ou s dos seleccionados)\n" -" lista actual de preferencias. A marca de tempo de tdalas 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 "" -"Debera especificar un motivo para o certificado. Dependendo do contexto\n" -"pode escoller desta lista:\n" -" \"Descobreuse a chave\"\n" -" Emprgueo se ten motivos para crer que algunha persoa non autorizada\n" -" obtivo acceso sa chave secreta.\n" -" \"A chave obsoleta\"\n" -" Emprgueo se cambiou esta chave cunha mis recente.\n" -" \"Xa non se emprega a chave\"\n" -" Emprgueo se retirou esta chave.\n" -" \"O ID de usuario xa non vlido\"\n" -" Emprgueo para indicar que o ID de usuario xa non se debera empregar;\n" -" adoita empregarse para marcar un enderezo de correo non vlido.\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 revocacin. Por favor, mantea este texto breve.\n" -"Unha lia en branco remata o texto.\n" - -#: g10/helptext.c:287 -msgid "No help available" -msgstr "Non hai axuda dispoible" - -#: g10/helptext.c:295 -#, c-format -msgid "No help available for `%s'" -msgstr "Non hai axuda dispoible 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 pblica 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:266 -#, c-format -msgid "skipping block of type %d\n" -msgstr "pasando por alto un bloque de tipo %d\n" - -#: g10/import.c:275 -#, fuzzy, c-format -msgid "%lu keys processed so far\n" -msgstr "%lu chaves procesadas hasta polo momento\n" - -#: g10/import.c:292 -#, c-format -msgid "Total number processed: %lu\n" -msgstr "Nmero total procesado: %lu\n" - -#: g10/import.c:294 -#, c-format -msgid " skipped new keys: %lu\n" -msgstr "novas chaves omitidas: %lu\n" - -#: g10/import.c:297 -#, c-format -msgid " w/o user IDs: %lu\n" -msgstr " sin IDs de usuario: %lu\n" - -#: g10/import.c:299 -#, c-format -msgid " imported: %lu" -msgstr " importadas: %lu" - -#: g10/import.c:305 -#, c-format -msgid " unchanged: %lu\n" -msgstr " sin cambios: %lu\n" - -#: g10/import.c:307 -#, c-format -msgid " new user IDs: %lu\n" -msgstr " novos IDs de usuario: %lu\n" - -#: g10/import.c:309 -#, c-format -msgid " new subkeys: %lu\n" -msgstr " novas sub-chaves: %lu\n" - -#: g10/import.c:311 -#, c-format -msgid " new signatures: %lu\n" -msgstr " novas sinaturas: %lu\n" - -#: g10/import.c:313 -#, c-format -msgid " new key revocations: %lu\n" -msgstr " novas revocacins de chaves: %lu\n" - -#: g10/import.c:315 -#, c-format -msgid " secret keys read: %lu\n" -msgstr "chaves secretas lidas: %lu\n" - -#: g10/import.c:317 -#, c-format -msgid " secret keys imported: %lu\n" -msgstr "chaves secretas importadas: %lu\n" - -#: g10/import.c:319 -#, c-format -msgid " secret keys unchanged: %lu\n" -msgstr "chaves secretas sin cambios: %lu\n" - -#: g10/import.c:321 -#, c-format -msgid " not imported: %lu\n" -msgstr " non importadas: %lu\n" - -#: g10/import.c:323 -#, fuzzy, c-format -msgid " signatures cleaned: %lu\n" -msgstr " novas sinaturas: %lu\n" - -#: g10/import.c:325 -#, fuzzy, c-format -msgid " user IDs cleaned: %lu\n" -msgstr "chaves secretas lidas: %lu\n" - -#: g10/import.c:566 -#, 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:570 -#, fuzzy -msgid " algorithms on these user IDs:\n" -msgstr "Asinou estes IDs de usuario: \n" - -#: g10/import.c:607 -#, c-format -msgid " \"%s\": preference for cipher algorithm %s\n" -msgstr "" - -#: g10/import.c:619 -#, fuzzy, c-format -msgid " \"%s\": preference for digest algorithm %s\n" -msgstr "Sinatura %s, algoritmo de resumo %s\n" - -#: g10/import.c:631 -#, c-format -msgid " \"%s\": preference for compression algorithm %s\n" -msgstr "" - -#: g10/import.c:644 -msgid "it is strongly suggested that you update your preferences and\n" -msgstr "" - -#: g10/import.c:646 -msgid "re-distribute this key to avoid potential algorithm mismatch problems\n" -msgstr "" - -#: g10/import.c:670 -#, c-format -msgid "you can update your preferences with: gpg --edit-key %s updpref save\n" -msgstr "" - -#: g10/import.c:720 g10/import.c:1118 -#, fuzzy, c-format -msgid "key %s: no user ID\n" -msgstr "chave %08lX: non hai ID de usuario\n" - -#: g10/import.c:749 -#, fuzzy, c-format -msgid "key %s: PKS subkey corruption repaired\n" -msgstr "chave %08lX: arranxouse a corrupcin da sub-chave HKP\n" - -#: g10/import.c:764 -#, 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:770 -#, fuzzy, c-format -msgid "key %s: no valid user IDs\n" -msgstr "chave %08lX: non hai IDs de usuario vlidos\n" - -#: g10/import.c:772 -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:782 g10/import.c:1240 -#, fuzzy, c-format -msgid "key %s: public key not found: %s\n" -msgstr "chave %08lX: chave pblica non atopada: %s\n" - -#: g10/import.c:788 -#, fuzzy, c-format -msgid "key %s: new key - skipped\n" -msgstr "chave %08lX: nova chave - omitida\n" - -#: g10/import.c:797 -#, 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:802 g10/openfile.c:267 g10/sign.c:831 g10/sign.c:1135 -#, c-format -msgid "writing to `%s'\n" -msgstr "escribindo a `%s'\n" - -#: g10/import.c:806 g10/import.c:901 g10/import.c:1158 g10/import.c:1301 -#: g10/import.c:2363 g10/import.c:2385 -#, c-format -msgid "error writing keyring `%s': %s\n" -msgstr "erro escribindo no chaveiro `%s': %s\n" - -#: g10/import.c:825 -#, fuzzy, c-format -msgid "key %s: public key \"%s\" imported\n" -msgstr "chave %08lX: chave pblica \"%s\" importada\n" - -#: g10/import.c:849 -#, fuzzy, c-format -msgid "key %s: doesn't match our copy\n" -msgstr "chave %08lX: non coincide coa nosa copia\n" - -#: g10/import.c:866 g10/import.c:1258 -#, 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:874 g10/import.c:1265 -#, 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:911 -#, 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:914 -#, 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:917 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new signature\n" -msgstr "chave %08lX: \"%s\" 1 nova sinatura\n" - -#: g10/import.c:920 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new signatures\n" -msgstr "chave %08lX: \"%s\" %d novas sinaturas\n" - -#: g10/import.c:923 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new subkey\n" -msgstr "chave %08lX: \"%s\" 1 nova sub-chave\n" - -#: g10/import.c:926 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new subkeys\n" -msgstr "chave %08lX: \"%s\" %d novas sub-chaves\n" - -#: g10/import.c:929 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signature cleaned\n" -msgstr "chave %08lX: \"%s\" %d novas sinaturas\n" - -#: g10/import.c:932 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signatures cleaned\n" -msgstr "chave %08lX: \"%s\" %d novas sinaturas\n" - -#: g10/import.c:935 -#, 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:938 -#, 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:961 -#, fuzzy, c-format -msgid "key %s: \"%s\" not changed\n" -msgstr "chave %08lX: \"%s\" sen cambios\n" - -#: g10/import.c:1124 -#, fuzzy, c-format -msgid "key %s: secret key with invalid cipher %d - skipped\n" -msgstr "chave %08lX: chave secreta cunha cifra %d non vlida - omitida\n" - -#: g10/import.c:1135 -#, fuzzy -msgid "importing secret keys not allowed\n" -msgstr "gravando a chave secreta en `%s'\n" - -#: g10/import.c:1152 g10/import.c:2378 -#, c-format -msgid "no default secret keyring: %s\n" -msgstr "non hai un chaveiro privado por defecto: %s\n" - -#: g10/import.c:1163 -#, fuzzy, c-format -msgid "key %s: secret key imported\n" -msgstr "chave %08lX: chave secreta importada\n" - -#: g10/import.c:1193 -#, fuzzy, c-format -msgid "key %s: already in secret keyring\n" -msgstr "chave %08lX: xa estaba no chaveiro secreto\n" - -#: g10/import.c:1203 -#, fuzzy, c-format -msgid "key %s: secret key not found: %s\n" -msgstr "chave %08lX: chave secreta non atopada: %s\n" - -#: g10/import.c:1233 -#, fuzzy, c-format -msgid "key %s: no public key - can't apply revocation certificate\n" -msgstr "" -"chave %08lX: non hai chave pblica - non se pode aplica-lo\n" -"certificado de revocacin\n" - -#: g10/import.c:1276 -#, fuzzy, c-format -msgid "key %s: invalid revocation certificate: %s - rejected\n" -msgstr "" -"chave %08lX: certificado de revocacin incorrecto:\n" -"%s - rechazado\n" - -#: g10/import.c:1308 -#, fuzzy, c-format -msgid "key %s: \"%s\" revocation certificate imported\n" -msgstr "chave %08lX: \"%s\" certificado de revocacin importado\n" - -#: g10/import.c:1374 -#, 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:1389 -#, fuzzy, c-format -msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n" -msgstr "" -"chave %08lX: algoritmo de chave pblica non soportado no ID de usuario \"%s" -"\"\n" - -#: g10/import.c:1391 -#, fuzzy, c-format -msgid "key %s: invalid self-signature on user ID \"%s\"\n" -msgstr "" -"chave %08lX: auto-sinatura non vlida no identificadr de usuario \"%s\"\n" - -#: g10/import.c:1409 -#, fuzzy, c-format -msgid "key %s: no subkey for key binding\n" -msgstr "chave %08lX: non hai sub-chave para a ligazn da chave\n" - -#: g10/import.c:1420 g10/import.c:1470 -#, fuzzy, c-format -msgid "key %s: unsupported public key algorithm\n" -msgstr "chave %08lX: algoritmo de chave pblica non soportado\n" - -#: g10/import.c:1422 -#, fuzzy, c-format -msgid "key %s: invalid subkey binding\n" -msgstr "chave %08lX: ligazn de sub-chave incorrecta\n" - -#: g10/import.c:1437 -#, fuzzy, c-format -msgid "key %s: removed multiple subkey binding\n" -msgstr "chave %08lX: eliminouse unha ligazn de sub-chave mltiple\n" - -#: g10/import.c:1459 -#, fuzzy, c-format -msgid "key %s: no subkey for key revocation\n" -msgstr "chave %08lX: non hai unha sub-chave para a revocacin da chave\n" - -#: g10/import.c:1472 -#, fuzzy, c-format -msgid "key %s: invalid subkey revocation\n" -msgstr "chave %08lX: revocacin de sub-chave non vlida\n" - -#: g10/import.c:1487 -#, fuzzy, c-format -msgid "key %s: removed multiple subkey revocation\n" -msgstr "chave %08lX: eliminouse a revocacin de sub-chaves mltiples\n" - -#: g10/import.c:1529 -#, fuzzy, c-format -msgid "key %s: skipped user ID \"%s\"\n" -msgstr "chave %08lX: omitido o ID de usuario '" - -#: g10/import.c:1550 -#, fuzzy, c-format -msgid "key %s: skipped subkey\n" -msgstr "chave %08lX: omitida a sub-chave\n" - -#: g10/import.c:1577 -#, 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:1587 -#, fuzzy, c-format -msgid "key %s: revocation certificate at wrong place - skipped\n" -msgstr "chave %08lX: certificado de revocacin no lugar errneo - omitido\n" - -#: g10/import.c:1604 -#, fuzzy, c-format -msgid "key %s: invalid revocation certificate: %s - skipped\n" -msgstr "chave %08lX: certificado de revocacin incorrecto: %s - omitido\n" - -#: g10/import.c:1618 -#, 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:1626 -#, 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:1726 -#, 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:1788 -#, 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 revocacin %" -"08lX\n" - -#: g10/import.c:1802 -#, 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 revocacin %08lX " -"ausente.\n" - -#: g10/import.c:1861 -#, fuzzy, c-format -msgid "key %s: \"%s\" revocation certificate added\n" -msgstr "chave %08lX: \"%s\" certificado de revocacin engadido\n" - -#: g10/import.c:1895 -#, fuzzy, c-format -msgid "key %s: direct key signature added\n" -msgstr "chave %08lX: engadiuse unha sinatura de chave directa\n" - -#: g10/import.c:2284 -#, fuzzy -msgid "NOTE: a key's S/N does not match the card's one\n" -msgstr "a chave pblica con coincide coa chave secreta!\n" - -#: g10/import.c:2292 -#, fuzzy -msgid "NOTE: primary key is online and stored on card\n" -msgstr "omtese: a chave secreta xa est presente\n" - -#: g10/import.c:2294 -#, fuzzy -msgid "NOTE: secondary key is online and stored on card\n" -msgstr "omtese: 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 "[revocacin]" - -#: 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 errnea\n" - -#: g10/keyedit.c:347 g10/keylist.c:392 -#, c-format -msgid "%d bad signatures\n" -msgstr "%d sinaturas errneas\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 vlida\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 vlida\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 confa 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 = Confo marxinalmente\n" - -#: g10/keyedit.c:420 g10/pkclist.c:277 -#, fuzzy, c-format -msgid " %d = I trust fully\n" -msgstr " %d = Confo 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 sa 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 substita caducada? (s/N) " - -#: g10/keyedit.c:755 -#, c-format -msgid "" -"Your current signature on \"%s\"\n" -"is a local signature.\n" -msgstr "" -"A sa 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 tdolos 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 sa 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 podera 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 comprobacins.%s\n" - -#: g10/keyedit.c:927 -#, c-format -msgid " (3) I have done very careful checking.%s\n" -msgstr " (3) Fixen comprobacins moi exhaustivas.%s\n" - -#: g10/keyedit.c:933 -#, fuzzy -msgid "Your selection? (enter `?' for more information): " -msgstr "A sa eleccin? (introduza '?' para ter mis informacin): " - -#: 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 sa 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:4783 g10/keyedit.c:4874 g10/keyedit.c:4938 -#: g10/keyedit.c:4999 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 estn dispoibles.\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 estn dispoibles.\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; tnteo 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 sar" - -#: 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 identificacin fotogrfica" - -#: 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 revocacin" - -#: 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 expiracin 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 pblicas 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 tdolos 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 identificacin fotogrfica" - -#: 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 "Cmpre 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 tdolos 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 descoecida" - -#: 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 tdolos 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 tdolos 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 "Sar sin gardar? " - -#: g10/keyedit.c:2218 -#, c-format -msgid "update failed: %s\n" -msgstr "a actualizacin fallou: %s\n" - -#: g10/keyedit.c:2225 -#, c-format -msgid "update secret failed: %s\n" -msgstr "o segredo da actualizacin 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 "Caractersticas: " - -#: 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 "Notacin: " - -#: 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 "" -"Tea 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 ningn 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 identificacin\n" -" fotogrfica algunhas versins de PGP han rexeitar esta chave.\n" - -#: g10/keyedit.c:3016 g10/keyedit.c:3346 -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 identificacin fotogrfica 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 descoecida? (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 vlida" - -#: g10/keyedit.c:3249 -#, fuzzy, c-format -msgid "User ID \"%s\": already clean\n" -msgstr "o ID de usuario \"%s\" xa est revocado\n" - -#: g10/keyedit.c:3341 -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 versins de PGP rexeiten esta chave.\n" - -#: g10/keyedit.c:3352 -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:3372 -msgid "Enter the user ID of the designated revoker: " -msgstr "Introduza o ID de usuario do revocador designado: " - -#: g10/keyedit.c:3397 -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:3412 -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:3434 -#, fuzzy -msgid "this key has already been designated as a revoker\n" -msgstr "AVISO: Esta chave est revocada polo propietario!\n" - -#: g10/keyedit.c:3453 -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:3459 -#, 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:3520 -msgid "Please remove selections from the secret keys.\n" -msgstr "Por favor, quite as seleccins das chaves secretas.\n" - -#: g10/keyedit.c:3526 -#, fuzzy -msgid "Please select at most one subkey.\n" -msgstr "Por favor, seleccione como mximo unha chave secundaria.\n" - -#: g10/keyedit.c:3530 -#, fuzzy -msgid "Changing expiration time for a subkey.\n" -msgstr "Cambiando a data de expiracin para a chave secundaria.\n" - -#: g10/keyedit.c:3533 -msgid "Changing expiration time for the primary key.\n" -msgstr "Cambiando a data de expiracin da chave primaria.\n" - -#: g10/keyedit.c:3579 -msgid "You can't change the expiration date of a v3 key\n" -msgstr "Non pode cambia-la data de expiracin dunha chave v3\n" - -#: g10/keyedit.c:3595 -msgid "No corresponding signature in secret ring\n" -msgstr "Non hai unha sinatura correspondiente no chaveiro secreto\n" - -#: g10/keyedit.c:3668 -#, 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:3674 -#, c-format -msgid "subkey %s does not sign and so does not need to be cross-certified\n" -msgstr "" - -#: g10/keyedit.c:3836 -msgid "Please select exactly one user ID.\n" -msgstr "Escolla exactamente un ID de usuario.\n" - -#: g10/keyedit.c:3875 g10/keyedit.c:3985 g10/keyedit.c:4105 g10/keyedit.c:4246 -#, 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:4046 -msgid "Enter your preferred keyserver URL: " -msgstr "" - -#: g10/keyedit.c:4126 -#, fuzzy -msgid "Are you sure you want to replace it? (y/N) " -msgstr "Est seguro de que quere empregala (s/N)? " - -#: g10/keyedit.c:4127 -#, fuzzy -msgid "Are you sure you want to delete it? (y/N) " -msgstr "Est seguro de que quere empregala (s/N)? " - -#: g10/keyedit.c:4189 -#, fuzzy -msgid "Enter the notation: " -msgstr "Notacin de sinaturas: " - -#: g10/keyedit.c:4338 -#, fuzzy -msgid "Proceed? (y/N) " -msgstr "Sobrescribir? (s/N) " - -#: g10/keyedit.c:4402 -#, c-format -msgid "No user ID with index %d\n" -msgstr "Non hai ID de usuario con ndice %d\n" - -#: g10/keyedit.c:4460 -#, fuzzy, c-format -msgid "No user ID with hash %s\n" -msgstr "Non hai ID de usuario con ndice %d\n" - -#: g10/keyedit.c:4487 -#, fuzzy, c-format -msgid "No subkey with index %d\n" -msgstr "Non hai ID de usuario con ndice %d\n" - -#: g10/keyedit.c:4622 -#, fuzzy, c-format -msgid "user ID: \"%s\"\n" -msgstr "ID de usuario: \"" - -#: g10/keyedit.c:4625 g10/keyedit.c:4689 g10/keyedit.c:4732 -#, 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:4627 g10/keyedit.c:4691 g10/keyedit.c:4734 -msgid " (non-exportable)" -msgstr " (non exportable)" - -#: g10/keyedit.c:4631 -#, c-format -msgid "This signature expired on %s.\n" -msgstr "Esta sinatura caducou o %s.\n" - -#: g10/keyedit.c:4635 -msgid "Are you sure you still want to revoke it? (y/N) " -msgstr "Est seguro de que quere revocala? (s/N) " - -#: g10/keyedit.c:4639 -msgid "Create a revocation certificate for this signature? (y/N) " -msgstr "Crear un certificado de revocacin para esta sinatura? (s/N) " - -#: g10/keyedit.c:4666 -#, fuzzy, c-format -msgid "You have signed these user IDs on key %s:\n" -msgstr "Asinou estes IDs de usuario: \n" - -#: g10/keyedit.c:4692 -#, fuzzy -msgid " (non-revocable)" -msgstr " (non exportable)" - -#: g10/keyedit.c:4699 -#, fuzzy, c-format -msgid "revoked by your key %s on %s\n" -msgstr " revocada por %08lX no %s\n" - -#: g10/keyedit.c:4721 -msgid "You are about to revoke these signatures:\n" -msgstr "Est a punto de revocar estas sinaturas:\n" - -#: g10/keyedit.c:4741 -msgid "Really create the revocation certificates? (y/N) " -msgstr "Realmente desexa crea-los certificados de revocacin? (s/N) " - -#: g10/keyedit.c:4771 -msgid "no secret key\n" -msgstr "non hai chave secreta\n" - -#: g10/keyedit.c:4841 -#, c-format -msgid "user ID \"%s\" is already revoked\n" -msgstr "o ID de usuario \"%s\" xa est revocado\n" - -#: g10/keyedit.c:4858 -#, 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:4922 -#, fuzzy, c-format -msgid "Key %s is already revoked.\n" -msgstr "o ID de usuario \"%s\" xa est revocado\n" - -#: g10/keyedit.c:4984 -#, fuzzy, c-format -msgid "Subkey %s is already revoked.\n" -msgstr "o ID de usuario \"%s\" xa est revocado\n" - -#: g10/keyedit.c:5079 -#, fuzzy, c-format -msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n" -msgstr "" -"Amosando a id. fotogrfica %s de tamao %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 vlido 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 "tamao de chave non vlido; 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 "tamao 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 tamao 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 tamao 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 debera ser vlida a chave.\n" -" 0 = a chave non caduca\n" -" <n> = a chave caduca en n das\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 debera ser vlida a sinatura.\n" -" 0 = a sinatura non caduca\n" -" <n> = a sinatura caduca en n das\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 vlida a chave? (0) " - -#: g10/keygen.c:1649 -#, fuzzy, c-format -msgid "Signature is valid for? (%s) " -msgstr "Por canto tempo vlida a sinatura? (0) " - -#: g10/keygen.c:1667 -msgid "invalid value\n" -msgstr "valor non vlido\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 mis al do 2038.\n" -"Anda 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 sa chave; o software constre " -"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 vlido no nome\n" - -#: g10/keygen.c:1738 -msgid "Name may not start with a digit\n" -msgstr "O nome non pode comezar cun dxito\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 vlido\n" - -#: g10/keygen.c:1762 -msgid "Comment: " -msgstr "Comentario: " - -#: g10/keygen.c:1768 -msgid "Invalid character in comment\n" -msgstr "Carcter non vlido 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 poa 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)ar? " - -#: 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)ar? " - -#: 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 sa 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 tdolos xeitos; pode cambia-lo contrasinal en calquera\n" -"momento, empregando este programa coa opcin \"--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 "" -"Cmpre 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 nmeros primos; isto proporcinalle ao xerador de\n" -"nmeros aleatorios unha opoertunidade de acumular entropa de abondo.\n" - -#: g10/keygen.c:2708 -msgid "Key generation canceled.\n" -msgstr "Cancelouse a xeracin de chaves.\n" - -#: g10/keygen.c:2907 g10/keygen.c:3052 -#, c-format -msgid "writing public key to `%s'\n" -msgstr "gravando a chave pblica 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 pblico 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 pblico `%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 "creronse e asinronse as chaves pblica 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 "" -"Tea 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 xeracin 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 creacin 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 crticas: " - -#: 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 "Notacin de sinaturas crticas: " - -#: g10/keylist.c:361 -msgid "Signature notation: " -msgstr "Notacin 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 poe-la armadura: %s\n" - -#: g10/keyring.c:1252 -msgid "WARNING: 2 files with confidential information exists.\n" -msgstr "AVISO: existen dous ficheiros con informacin 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, amae 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 vlido\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 opcins de `%s' anda non estn activas nesta execucin\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:1421 -#, fuzzy, c-format -msgid "invalid keyserver protocol (us %d!=handler %d)\n" -msgstr "opcins de exportacin non vlidas\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:1324 -#, fuzzy, c-format -msgid "sending key %s to %s server %s\n" -msgstr "buscando \"%s\" no servidor HKP %s\n" - -#: g10/keyserver.c:1328 -#, fuzzy, c-format -msgid "sending key %s to %s\n" -msgstr "" -"\"\n" -"asinado coa sa chave %08lX no %s\n" - -#: g10/keyserver.c:1371 -#, fuzzy, c-format -msgid "searching for \"%s\" from %s server %s\n" -msgstr "buscando \"%s\" no servidor HKP %s\n" - -#: g10/keyserver.c:1374 -#, fuzzy, c-format -msgid "searching for \"%s\" from %s\n" -msgstr "buscando \"%s\" no servidor HKP %s\n" - -#: g10/keyserver.c:1381 g10/keyserver.c:1477 -#, fuzzy -msgid "no keyserver action!\n" -msgstr "opcins de exportacin non vlidas\n" - -#: g10/keyserver.c:1429 -#, c-format -msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n" -msgstr "" - -#: g10/keyserver.c:1438 -msgid "keyserver did not send VERSION\n" -msgstr "" - -#: g10/keyserver.c:1500 g10/keyserver.c:2028 -msgid "no keyserver known (use option --keyserver)\n" -msgstr "" -"non hai un servidor de chaves coecido (empregue a opcin --keyserver)\n" - -#: g10/keyserver.c:1506 -msgid "external keyserver calls are not supported in this build\n" -msgstr "" - -#: g10/keyserver.c:1518 -#, c-format -msgid "no handler for keyserver scheme `%s'\n" -msgstr "" - -#: g10/keyserver.c:1523 -#, c-format -msgid "action `%s' not supported with keyserver scheme `%s'\n" -msgstr "" - -#: g10/keyserver.c:1531 -#, c-format -msgid "%s does not support handler version %d\n" -msgstr "" - -#: g10/keyserver.c:1538 -#, fuzzy -msgid "keyserver timed out\n" -msgstr "erro do servidor de chaves" - -#: g10/keyserver.c:1543 -#, fuzzy -msgid "keyserver internal error\n" -msgstr "erro do servidor de chaves" - -#: g10/keyserver.c:1552 -#, fuzzy, c-format -msgid "keyserver communications error: %s\n" -msgstr "a recepcin do servidor de chaves fallou: %s\n" - -#: g10/keyserver.c:1577 g10/keyserver.c:1611 -#, fuzzy, c-format -msgid "\"%s\" not a key ID: skipping\n" -msgstr "%s: non un ID de chave vlido\n" - -#: g10/keyserver.c:1870 -#, 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:1892 -#, fuzzy, c-format -msgid "refreshing 1 key from %s\n" -msgstr "solicitando a chave %08lX de %s\n" - -#: g10/keyserver.c:1894 -#, fuzzy, c-format -msgid "refreshing %d keys from %s\n" -msgstr "solicitando a chave %08lX de %s\n" - -#: g10/keyserver.c:1950 -#, 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:1956 -#, 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 "tamao moi estrao para unha chave de sesin cifrada (%d)\n" - -#: g10/mainproc.c:291 -#, c-format -msgid "%s encrypted session key\n" -msgstr "chave de sesin cifrada con %s\n" - -#: g10/mainproc.c:301 -#, fuzzy, c-format -msgid "passphrase generated with unknown digest algorithm %d\n" -msgstr "cifrado cun algoritmo descoecido %d\n" - -#: g10/mainproc.c:382 -#, fuzzy, c-format -msgid "public key is %s\n" -msgstr "a chave pblica %08lX\n" - -#: g10/mainproc.c:439 -msgid "public key encrypted data: good DEK\n" -msgstr "datos cifrados coa chave pblica: 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 pblica: %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 "supoendo 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 dispoible, tntase 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 tia proteccin 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 "revocacin 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 "verificacin 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 mltiples\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 dispoible 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 "descoecido" - -#: 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: detectronse sinaturas mltiples. 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 raz 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 actualizacin 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 pblica %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 mis informacin\n" - -#: g10/misc.c:681 -#, c-format -msgid "%s:%d: deprecated option \"%s\"\n" -msgstr "%s:%d: opcin a extinguir \"%s\"\n" - -#: g10/misc.c:685 -#, c-format -msgid "WARNING: \"%s\" is a deprecated option\n" -msgstr "AVISO: \"%s\" unha opcin 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 opcin 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 opcins de `%s'\n" - -#: g10/misc.c:1042 -#, fuzzy, c-format -msgid "unknown option `%s'\n" -msgstr "destinatario por defecto `%s' descoecido\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 descoecido\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 sada estndar\n" - -#: g10/openfile.c:305 -#, c-format -msgid "assuming signed data in `%s'\n" -msgstr "suponse que hai datos asinados en `%s'\n" - -#: g10/openfile.c:384 -#, c-format -msgid "new configuration file `%s' created\n" -msgstr " creouse un novo ficheiro de configuracin `%s'\n" - -#: g10/openfile.c:386 -#, c-format -msgid "WARNING: options in `%s' are not yet active during this run\n" -msgstr "AVISO: as opcins de `%s' anda non estn activas nesta execucin\n" - -#: g10/openfile.c:418 -#, 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 pblica %d\n" - -#: g10/parse-packet.c:708 -msgid "WARNING: potentially insecure symmetrically encrypted session key\n" -msgstr "" -"AVISO: chave de sesin cifrada simetricamente potencialmente insegura\n" - -#: g10/parse-packet.c:1157 -#, c-format -msgid "subpacket of type %d has critical bit set\n" -msgstr "un subpaquete de tipo %d ten o bit crtico posto\n" - -#: g10/passphrase.c:310 -msgid "gpg-agent is not available in this session\n" -msgstr "gpg-agent non est dispoible nesta sesin\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 versin %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:968 -#, 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:973 -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:977 -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 identificacin fotogrfica. A imaxe ten\n" -"que ser un ficheiro JPEG. Lembre que a imaxe armacnase coa sa chave\n" -"pblica. Se emprega unha imaxe moi grande, a sa chave tamn se ha volver\n" -"moi grande. Un bo tamao 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 identificacin fotogrfica!\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 vlido" - -#: g10/pkclist.c:74 -msgid "reason for revocation: " -msgstr "motivo para a revocacin: " - -#: g10/pkclist.c:91 -msgid "revocation comment: " -msgstr "comentario de revocacin: " - -#: 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 confo\n" - -#: g10/pkclist.c:279 -#, fuzzy, c-format -msgid " %d = I trust ultimately\n" -msgstr " %d = Confo 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 = sar\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 sa decisin? " - -#: 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 indicacins 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 indicacins 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 pertncenos a ns\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 tdolos xeitos?" - -#: g10/pkclist.c:502 -msgid "WARNING: Using untrusted key!\n" -msgstr "AVISO: Emprgase 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 revocacin %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 indicacins 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 pblica 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 lia 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 pblica xa est estabrecida coma destinatario por defecto\n" - -#: g10/pkclist.c:990 -msgid "Public key is disabled.\n" -msgstr "A chave pblica est desactivada.\n" - -#: g10/pkclist.c:999 -msgid "skipped: public key already set\n" -msgstr "omitido: chave pblica xa estabrecida\n" - -#: g10/pkclist.c:1034 -#, fuzzy, c-format -msgid "unknown default recipient \"%s\"\n" -msgstr "destinatario por defecto `%s' descoecido\n" - -#: g10/pkclist.c:1092 -#, c-format -msgid "%s: skipped: public key is disabled\n" -msgstr "%s: omitido: a chave pblica est desactivada\n" - -#: g10/pkclist.c:1154 -msgid "no valid addressees\n" -msgstr "non hai enderezos vlidos\n" - -#: g10/plaintext.c:91 -msgid "data not saved; use option \"--output\" to save it\n" -msgstr "os datos non foron gardados; use a opcin \"--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 annimo; tentando a chave secreta %08lX ...\n" - -#: g10/pubkey-enc.c:135 -msgid "okay, we are the anonymous recipient.\n" -msgstr "vale, ns somo-lo destinatario annimo.\n" - -#: g10/pubkey-enc.c:223 -msgid "old encoding of the DEK is not supported\n" -msgstr "a codificacin 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 descoecido 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 revocacin sensible)\n" - -#: g10/revoke.c:316 -#, fuzzy -msgid "Create a designated revocation certificate for this key? (y/N) " -msgstr "Crear un certificado de revocacin para esta sinatura? " - -#: g10/revoke.c:329 g10/revoke.c:554 -msgid "ASCII armored output forced.\n" -msgstr "Forzouse unha sada 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 revocacin.\n" - -#: g10/revoke.c:413 -#, fuzzy, c-format -msgid "no revocation keys found for \"%s\"\n" -msgstr "non se atoparon chaves de revocacin 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 pblica correspondente: %s\n" - -#: g10/revoke.c:511 -msgid "public key does not match secret key!\n" -msgstr "a chave pblica 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 revocacin para esta sinatura? " - -#: g10/revoke.c:535 -msgid "unknown protection algorithm\n" -msgstr "algoritmo de proteccin descoecido\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 revocacin.\n" -"\n" -"Por favor, trasldeo a un soporte que poida agochar; se Mallory consegue\n" -"acceso a este certificado pode empregalo para inutiliza-la sa chave.\n" -" unha boa idea imprimir este certificado e armacenalo, por se o soporte\n" -"se volve ilexible. Pero tea coidado: o sistema de impresin da sa\n" -"mquina podera armacena-los datos e deixrllelos dispoibles a outros.\n" - -#: g10/revoke.c:635 -msgid "Please select the reason for the revocation:\n" -msgstr "Por favor, escolla o motivo da revocacin:\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 descricin opcional; remtea cunha lia en branco:\n" - -#: g10/revoke.c:716 -#, c-format -msgid "Reason for revocation: %s\n" -msgstr "Motivo para a revocacin: %s\n" - -#: g10/revoke.c:718 -msgid "(No description given)\n" -msgstr "(Non se deu unha descricin)\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 dispoibles\n" - -#: g10/seckey-cert.c:61 -#, c-format -msgid "protection algorithm %d%s is not supported\n" -msgstr "o algoritmo de proteccin %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 proteccin %d%s non est soportado\n" - -#: g10/seckey-cert.c:266 -msgid "Invalid passphrase; please try again" -msgstr "Contrasinal non vlido; por favor, tnteo 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 proteccin 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 simtrico; 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 pblica %08lX %lu segundo mis 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 pblica %08lX %lu segundos mis 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 crtico " -"descoecido\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 revocacin 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 ligazn 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 poer datos de notacin 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 poer datos de notacin 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 notacin (grande de mis). 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 poer un URL de poltica 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 poer un URL de poltica 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 mis).\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 mis).\n" - -#: g10/sign.c:347 -#, c-format -msgid "checking created signature failed: %s\n" -msgstr "fallou a comprobacin 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:127 g10/skclist.c:191 -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 " -"nmeros aleatorios falso\n" - -#: g10/skclist.c:158 -#, fuzzy, c-format -msgid "skipped \"%s\": duplicated\n" -msgstr "omtese `%s': duplicada\n" - -#: g10/skclist.c:166 g10/skclist.c:176 g10/skclist.c:185 -#, fuzzy, c-format -msgid "skipped \"%s\": %s\n" -msgstr "omtese `%s': %s\n" - -#: g10/skclist.c:171 -msgid "skipped: secret key already present\n" -msgstr "omtese: a chave secreta xa est presente\n" - -#: g10/skclist.c:186 -#, fuzzy -msgid "this is a PGP generated Elgamal key which is not secure for signatures!" -msgstr "" -"omtese `%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 "lia longa de mis\n" - -#: g10/tdbdump.c:168 -msgid "colon missing" -msgstr "" - -#: g10/tdbdump.c:174 -#, fuzzy -msgid "invalid fingerprint" -msgstr "erro: pegada dactilar non vlida\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 sincronizacin: %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 "transaccin 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 versin: %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 vlida\n" - -#: g10/tdbio.c:651 -#, c-format -msgid "%s: failed to create hashtable: %s\n" -msgstr "%s: fallo ao crear unha tboa 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 versin: %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 versin: %s\n" - -#: g10/tdbio.c:735 -#, c-format -msgid "%s: error writing version record: %s\n" -msgstr "%s: erro ao escribi-lo rexistro de versin: %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 versin con nmero de rexistro %lu\n" - -#: g10/tdbio.c:1226 -#, c-format -msgid "%s: invalid file version %d\n" -msgstr "%s: versin 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 pr 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 lias de texto maiores que %d caracteres\n" - -#: g10/textfilter.c:248 -#, c-format -msgid "input line longer than %d characters\n" -msgstr "a lia de entrada contn mis 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 vlido\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 mis 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 pblica 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 peticin %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 "descoecido" - -#: 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 pblica %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 "procesronse %d chaves (marcronse %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 pblica 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) debera\n" -"se-lo primeiro ficheiro que se indique na lia de comandos.\n" - -#: g10/verify.c:192 -#, c-format -msgid "input line %u too long or missing LF\n" -msgstr "" -"a lia de entrada %u longa de mis ou fltalle a marca de fin de lia\n" - -#: util/errors.c:55 -msgid "general error" -msgstr "erro xeral" - -#: util/errors.c:56 -msgid "unknown packet type" -msgstr "tipo de paquete descoecido" - -#: util/errors.c:57 -msgid "unknown version" -msgstr "versin descoecida" - -#: util/errors.c:58 -msgid "unknown pubkey algorithm" -msgstr "algoritmo de chave pblica descoecido" - -#: util/errors.c:59 -msgid "unknown digest algorithm" -msgstr "algoritmo de resumo descoecido" - -#: util/errors.c:60 -msgid "bad public key" -msgstr "chave pblica errnea" - -#: util/errors.c:61 -msgid "bad secret key" -msgstr "chave secreta errnea" - -#: util/errors.c:62 -msgid "bad signature" -msgstr "sinatura errnea" - -#: util/errors.c:63 -msgid "checksum error" -msgstr "error de checksum" - -#: util/errors.c:64 -msgid "bad passphrase" -msgstr "contrasinal errneo" - -#: util/errors.c:65 -msgid "public key not found" -msgstr "non se atopou a chave pblica" - -#: util/errors.c:66 -msgid "unknown cipher algorithm" -msgstr "algoritmo de cifrado descoecido" - -#: 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 vlido" - -#: util/errors.c:69 -msgid "invalid armor" -msgstr "armadura non vlida" - -#: 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 dispoible" - -#: util/errors.c:72 -msgid "wrong secret key used" -msgstr "empregouse unha chave secreta errnea" - -#: 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 compresin descoecido" - -#: 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 creacin de ficheiro" - -#: util/errors.c:80 -msgid "invalid passphrase" -msgstr "contrasinal incorrecto" - -#: util/errors.c:81 -msgid "unimplemented pubkey algorithm" -msgstr "algoritmo de chave pblica 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 descoecida" - -#: 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 errneo" - -#: util/errors.c:86 -msgid "resource limit" -msgstr "lmite de recursos" - -#: util/errors.c:87 -msgid "invalid keyring" -msgstr "chaveiro incorrecto" - -#: util/errors.c:88 -msgid "bad certificate" -msgstr "certificado errneo" - -#: 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 pblica 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 vlido" - -#: 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 pblica 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 mis informacin\n" - -#: util/secmem.c:350 -msgid "operation is not possible without initialized secure memory\n" -msgstr "a operacin non posible sen memoria inicializada como segura\n" - -#: util/secmem.c:351 -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 mis " -#~ "informacin\n" - -#~ msgid "" -#~ "a notation name must have only printable characters or spaces, and end " -#~ "with an '='\n" -#~ msgstr "" -#~ "un nome de notacin 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 notacin de usuario debe conte-lo carcter '@'\n" - -#, fuzzy -#~ msgid "a notation name must not contain more than one '@' character\n" -#~ msgstr "un nome de notacin de usuario debe conte-lo carcter '@'\n" - -#~ msgid "a notation value must not use any control characters\n" -#~ msgstr "un valor de notacin non pode empregar ningn carcter de control\n" - -#~ msgid "WARNING: invalid notation data found\n" -#~ msgstr "AVISO: atopronse datos de notacin non vlidos\n" - -#~ msgid "not human readable" -#~ msgstr "non lexible por humanos" - -#, fuzzy -#~ msgid "all export-clean-* options from above" -#~ msgstr "le-las opcins dun ficheiro" - -#, fuzzy -#~ msgid "all import-clean-* options from above" -#~ msgstr "le-las opcins 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 "User ID \"%s\": %d signature removed.\n" -#~ msgstr "O ID de usuario \"%s\" est revocado." - -#, fuzzy -#~ msgid "User ID \"%s\": %d signatures removed.\n" -#~ msgstr "O ID de usuario \"%s\" est revocado." - -#, fuzzy -#~ msgid "User ID \"%s\" removed: %s\n" -#~ msgstr "O ID de usuario \"%s\" est revocado." - -#, 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 descoecido (%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 comunicacin 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 vlida\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 expiracin" - -#~ 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 versin\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" -#~ " tamao de chave mnimo: 768 bits\n" -#~ " tamao de chave por defecto: 1024 bits\n" -#~ " tamao de chave mximo recomendado: 2048 bits\n" - -#~ msgid "DSA only allows keysizes from 512 to 1024\n" -#~ msgstr "DSA s admite tamaos entre 512 e 1024\n" - -#~ msgid "keysize too small; 1024 is smallest value allowed for RSA.\n" -#~ msgstr "chave pequena de mis; 1024 o menor valor admitido para RSA.\n" - -#~ msgid "keysize too small; 768 is smallest value allowed.\n" -#~ msgstr "chave pequena de mis; 768 o menor valor admitido\n" - -#~ msgid "keysize too large; %d is largest value allowed.\n" -#~ msgstr "chave grande de mis; %d o maior tamao 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 clculos levan MOITO tempo!\n" - -#, fuzzy -#~ msgid "Are you sure that you want this keysize? (y/N) " -#~ msgstr "Est seguro de que quere este tamao 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 tea en conta que a radiacin do monitor e o teclado " -#~ "tamn son vulnerables a ataques!\n" - -#~ msgid "Experimental algorithms should not be used!\n" -#~ msgstr "Os algoritmos experimentais non deberan 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 mis " -#~ "estndar!\n" - -#, fuzzy -#~ msgid "writing to file `%s'\n" -#~ msgstr "escribindo a `%s'\n" - -#~ msgid "sorry, can't do this in batch mode\n" -#~ msgstr "sentmolo, 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 = Confo marxinalmente\n" - -#, fuzzy -#~ msgid " (%d) I trust fully\n" -#~ msgstr " %d = Confo totalmente\n" - -#, fuzzy -#~ msgid "expires" -#~ msgstr "expire" - -#, fuzzy -#~ msgid "" -#~ "\"\n" -#~ "locally signed with your key %s at %s\n" -#~ msgstr "" -#~ "\"\n" -#~ "asinado localmente coa sa 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 revocacin falsa\n" - -#~ msgid "rev? problem checking revocation: %s\n" -#~ msgstr "rev? problema ao comproba-la revocacin: %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" -#~ " Emprgueo baixo a sa 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 "actualizacin inatendida da base de datos de confianza" - -#~ msgid "fix a corrupted trust database" -#~ msgstr "amaar unha base de datos de confianza corrompida" - -#~ msgid "De-Armor a file or stdin" -#~ msgstr "Quita-la armadura a un ficheiro ou entrada estndar" - -#~ msgid "En-Armor a file or stdin" -#~ msgstr "Pr armadura a un ficheiro ou entrada estndar" - -#~ 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 maiora das preguntas" - -#~ msgid "assume no on most questions" -#~ msgstr "asumir `non' na maiora 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 informacin 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 mdulo de extensin 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 tdalas opcins de paquetes, cifrado e resumo ao comportamento " -#~ "OpenPGP" - -#~ msgid "set all packet, cipher and digest options to PGP 2.x behavior" -#~ msgstr "" -#~ "axustar tdalas opcins 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 compresin 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 Identificacins Fotogrficas" - -#~ msgid "Don't show Photo IDs" -#~ msgstr "Non amosar Identificacins Fotogrficas" - -#~ msgid "Set command line to view Photo IDs" -#~ msgstr "" -#~ "Estabrece-la lia de comando para ve-las Identificacins Fotogrficas" - -#~ msgid "compress algorithm `%s' is read-only in this release\n" -#~ msgstr "o algoritmo de compresin `%s' de s lectura nesta versin\n" - -#~ msgid "compress algorithm must be in range %d..%d\n" -#~ msgstr "o algoritmo de compresin 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 acptase de tdolos xeitos\n" - -#~ msgid "preference %c%lu is not valid\n" -#~ msgstr "a preferencia %c%lu non vlida\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 algn 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 (tamn chamado DSS) un algoritmo de sinatura dixital, que s se " -#~ "pode\n" -#~ "empregar para asinar. o algoritmo aconsellado porque moito mis " -#~ "rpido\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 das variantes do algoritmo: un que s cifra e outro que\n" -#~ "asina e cifra; realmente o mesmo, pero hai que escoller algns " -#~ "parmetros\n" -#~ "dun xeito especial para crear unha clave que sexa segura para asinar: " -#~ "este\n" -#~ "programa faino, pero outras implementacins de OpenPGP non teen 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 " -#~ "dispoible\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 "" -#~ "Anda que estas chaves estn definidas no RFC2440, non se aconsellan\n" -#~ "porque non estn soportadas por tdolos 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|sar" - -#~ 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 tamn \n" -#~ "moi lento, e pode non ser tan seguro coma as outras opcins.\n" - -#~ msgid "Create anyway? " -#~ msgstr "Crear de tdolos xeitos? " - -#~ msgid "invalid symkey algorithm detected (%d)\n" -#~ msgstr "detectouse un algoritmo de chave simtrica non vlido (%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 tdolos 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 " -#~ "configuracin\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 notacin" - -#~ msgid "" -#~ "the first character of a notation name must be a letter or an underscore\n" -#~ msgstr "" -#~ "o primeiro carcter dun nome de notacin debe ser unha letra ou guin " -#~ "baixo\n" - -#~ msgid "dots in a notation name must be surrounded by other characters\n" -#~ msgstr "" -#~ "os puntos dun nome de notacin 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 identificacin fotogrfica.\n" -#~ " Se engade outra pode confundir a algunhas versins de PGP.\n" - -#~ msgid "You may only have one photo ID on a key.\n" -#~ msgstr "S pode ter unha identificacin fotogrfica nunha chave.\n" - -#~ msgid " Fingerprint:" -#~ msgstr " Pegada dactilar:" - -#~ msgid "too many random bits requested; the limit is %d\n" -#~ msgstr "pedronse demasiados bits aleatorios; o lmite %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 mis informacin 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 vlida ata a chave. Hase ver " -#~ "se\n" -#~ "se pode asignar algn 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 ningn valor de confianza.\n" -#~ "\n" - -#~ msgid "%08lX: no info to calculate a trust probability\n" -#~ msgstr "" -#~ "%08lX: non hai informacin para calcular unha probabilidade de confianza\n" - -#~ msgid "skipped: public key already set with --encrypt-to\n" -#~ msgstr "omitida: a chave pblica 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 tamao 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 descoecidas - 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 crtico\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: esperbase un rexistro de directorio, obtvose 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 pblica 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 vlida: %s\n" - -#~ msgid "key %08lX.%lu: Valid key revocation\n" -#~ msgstr "chave %08lX.%lu: Revocacin de chave vlida\n" - -#~ msgid "key %08lX.%lu: Invalid key revocation: %s\n" -#~ msgstr "chave %08lX.%lu: Revocacin de chave non vlida: %s\n" - -#~ msgid "Good self-signature" -#~ msgstr "Auto-sinatura correcta" - -#~ msgid "Invalid self-signature" -#~ msgstr "Auto-sinatura non vlida" - -#~ msgid "Valid user ID revocation skipped due to a newer self signature" -#~ msgstr "" -#~ "Omtese unha revocacin de ID de usuario vlida debido a unha auto-" -#~ "sinatura mis recente" - -#~ msgid "Valid user ID revocation" -#~ msgstr "Revocacin de ID de usuario vlida" - -#~ msgid "Invalid user ID revocation" -#~ msgstr "Revocacin de ID de usuario non vlida" - -#~ msgid "Valid certificate revocation" -#~ msgstr "Revocacin de certificado vlida" - -#~ msgid "Good certificate" -#~ msgstr "Certificado correcto" - -#~ msgid "Invalid certificate revocation" -#~ msgstr "Revocacin de certificado non vlida" - -#~ msgid "Invalid certificate" -#~ msgstr "Certificado non vlido" - -#~ 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 insercin fallou: %s\n" - -#~ msgid "lid %lu: insert failed: %s\n" -#~ msgstr "lid %lu: a insercin 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 pblicas\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 bsqueda de rexistro de directorio fallou: %s\n" - -#~ msgid "key %08lX: insert trust record failed: %s\n" -#~ msgstr "" -#~ "chave %08lX:\n" -#~ "a insercin 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 verificacin 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 pr '%s' na base de datos de confianza: %s\n" - -#~ msgid "WARNING: can't yet handle long pref records\n" -#~ msgstr "" -#~ "AVISO: anda 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 depuracin" - -#~ msgid "enable full debugging" -#~ msgstr "habilitar depuracin 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 xeracin 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 estn obsoletas; por favor, considere a opcin de crear " -#~ "unha\n" -#~ "chave nova e usa-la no futuro.\n" diff --git a/po/hu.po b/po/hu.po deleted file mode 100644 index f57cf1e7e..000000000 --- a/po/hu.po +++ /dev/null @@ -1,7198 +0,0 @@ -# GnuPG Hungarian translation. -# Copyright (C) 2003, 2004 Free Software Foundation, Inc. -# Nagy Ferenc Lszl <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-07-28 11:12+0200\n" -"PO-Revision-Date: 2004-06-19 21:53+0200\n" -"Last-Translator: Nagy Ferenc Lszl <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 ltrehozni %d bitesnl kisebb prmszmot.\n" - -#: cipher/primegen.c:312 -#, c-format -msgid "can't generate a prime with less than %d bits\n" -msgstr "Nem tudok ltrehozni %d bitesnl kisebb prmszmot.\n" - -#: cipher/random.c:173 -msgid "no entropy gathering module detected\n" -msgstr "Nem szleltem entrpiagyjt 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 llomnyba.\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:1003 g10/gpg.c:3461 g10/import.c:195 g10/keygen.c:2385 -#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:342 -#: 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\" llomnyt: %s.\n" - -#: cipher/random.c:458 -#, c-format -msgid "can't stat `%s': %s\n" -msgstr "Nem tudom a stat mveletet elvgezni a(z) \"%s\" llomnyon: %s.\n" - -#: cipher/random.c:463 -#, c-format -msgid "`%s' is not a regular file - ignored\n" -msgstr "\"%s\" nem szablyos llomny. Figyelmen kvl hagyom.\n" - -#: cipher/random.c:468 -msgid "note: random_seed file is empty\n" -msgstr "" -"Megjegyzs: random_seed llomny (vletlenszm-genertor llapota) res.\n" - -#: cipher/random.c:474 -msgid "WARNING: invalid size of random_seed file - not used\n" -msgstr "FIGYELEM: rvnytelen mret random_seed llomny. Nem hasznlom.\n" - -#: cipher/random.c:482 -#, c-format -msgid "can't read `%s': %s\n" -msgstr "Nem tudom olvasni a(z) \"%s\" llomnyt: %s.\n" - -#: cipher/random.c:520 -msgid "note: random_seed file not updated\n" -msgstr "Megjegyzs: random_seed llomnyt nem frisstettem.\n" - -#: cipher/random.c:544 g10/exec.c:481 g10/gpg.c:1002 g10/keygen.c:2864 -#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:263 -#: g10/openfile.c:357 g10/sign.c:826 g10/sign.c:1130 g10/tdbio.c:536 -#, c-format -msgid "can't create `%s': %s\n" -msgstr "Nem tudom ltrehozni a(z) \"%s\" llomnyt: %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\" llomnyt: %s.\n" - -#: cipher/random.c:569 -#, c-format -msgid "can't close `%s': %s\n" -msgstr "Nem tudom bezrni a(z) \"%s\" llomnyt: %s.\n" - -#: cipher/random.c:814 -msgid "WARNING: using insecure random number generator!!\n" -msgstr "FIGYELEM: Nem biztonsgos vletlenszm-genertort hasznlok!!!\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 vletlenszm-genertor csak egy szksgmegolds, hogy a program\n" -"elinduljon, semmikppen nem egy ers vletlenszm-genertor!\n" -"\n" -"NE HASZNLJON SEMMILYEN ADATOT, AMIT EZ A PROGRAM ELLLT!\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 "" -"Krem, vrjon, entrpit gyjtk! Vagy inkbb csinljon kzben valamit\n" -"a gpen, az az entrpim minsgt is javtani 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 rendelkezsre elg vletlen bjt. Krem, csinljon most valami\n" -"mst, hogy az opercis rendszer entrpit gyjthessen!\n" -"(Mg %d bjt szksges.)\n" - -#: g10/app-openpgp.c:596 -#, fuzzy, c-format -msgid "failed to store the fingerprint: %s\n" -msgstr "Bizalmi adatbzis (%s) inicializlsa sikertelen!\n" - -#: g10/app-openpgp.c:609 -#, fuzzy, c-format -msgid "failed to store the creation date: %s\n" -msgstr "Nem tudtam jrapteni a kulcskarika cache-t: %s\n" - -#: g10/app-openpgp.c:977 -#, fuzzy, c-format -msgid "reading public key failed: %s\n" -msgstr "A kulcsblokk trlse 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 "Klds 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 ltrehozsakor: %s.\n" - -#: g10/app-openpgp.c:1546 g10/app-openpgp.c:1996 -#, fuzzy -msgid "error reading application data\n" -msgstr "Hiba a kulcsblokk olvassakor: %s\n" - -#: g10/app-openpgp.c:1552 g10/app-openpgp.c:2003 -#, fuzzy -msgid "error reading fingerprint DO\n" -msgstr "%s: Hiba szabad rekord olvassakor: %s.\n" - -#: g10/app-openpgp.c:1562 -#, fuzzy -msgid "key already exists\n" -msgstr "\"%s\" mr tmrtett.\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 kulcspr ltrehozsa" - -#: 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 adatbzis (%s) inicializlsa 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 trlse sikertelen: %s.\n" - -#: g10/app-openpgp.c:1904 -#, fuzzy, c-format -msgid "key generation completed (%d seconds)\n" -msgstr "Kulcsgenerls 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 alrs, %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 talltam rvnyes OpenPGP adatot.\n" - -#: g10/armor.c:320 -#, c-format -msgid "armor: %s\n" -msgstr "Pncl: %s\n" - -#: g10/armor.c:359 -msgid "invalid armor header: " -msgstr "rvnytelen pnclfejlc: " - -#: g10/armor.c:370 -msgid "armor header: " -msgstr "Pnclfejlc: " - -#: g10/armor.c:381 -msgid "invalid clearsig header\n" -msgstr "rvnytelen alrsfejlc!\n" - -#: g10/armor.c:433 -msgid "nested clear text signatures\n" -msgstr "Egymsba gyazott olvashatszveg-alrsok!\n" - -#: g10/armor.c:568 -#, fuzzy -msgid "unexpected armor: " -msgstr "Vratlan pncl:" - -#: g10/armor.c:580 -msgid "invalid dash escaped line: " -msgstr "rvnytelen ktjeles sor: " - -#: g10/armor.c:734 g10/armor.c:1343 -#, fuzzy, c-format -msgid "invalid radix64 character %02X skipped\n" -msgstr "Kihagytam a %02x kd rvnytelen radix64 karaktert.\n" - -#: g10/armor.c:777 -msgid "premature eof (no CRC)\n" -msgstr "Korai llomnyvg (nincs CRC).\n" - -#: g10/armor.c:811 -msgid "premature eof (in CRC)\n" -msgstr "Korai llomnyvg (a CRC-ben).\n" - -#: g10/armor.c:819 -msgid "malformed CRC\n" -msgstr "Hibs formj CRC.\n" - -#: g10/armor.c:823 g10/armor.c:1380 -#, fuzzy, c-format -msgid "CRC error; %06lX - %06lX\n" -msgstr "CRC hiba; %06lx - %06lx\n" - -#: g10/armor.c:843 -#, fuzzy -msgid "premature eof (in trailer)\n" -msgstr "Korai llomnyvg (a lezrsban).\n" - -#: g10/armor.c:847 -msgid "error in trailer line\n" -msgstr "Hiba a zr sorban!\n" - -#: g10/armor.c:1158 -msgid "no valid OpenPGP data found.\n" -msgstr "Nem talltam rvnyes OpenPGP adatot.\n" - -#: g10/armor.c:1163 -#, c-format -msgid "invalid armor: line longer than %d characters\n" -msgstr "rvnytelen pncl: %d karakternl hosszabb sor.\n" - -#: g10/armor.c:1167 -msgid "" -"quoted printable character in armor - probably a buggy MTA has been used\n" -msgstr "" -"quoted printable karakter a pnclban - valsznleg egy bugos MTA bne.\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 rendelkezsre" - -#: 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 megcsinlni ktegelt mdban!\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 vlaszt? " - -#: 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 nyilvnos 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:280 -#, c-format -msgid "error reading `%s': %s\n" -msgstr "Hiba \"%s\" olvassakor: %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 "preferencik frisstse" - -#: g10/card-util.c:802 -#, fuzzy -msgid "Error: invalid length of preference string.\n" -msgstr "rvnytelen karakter a preferencik kztt!\n" - -#: g10/card-util.c:811 -#, fuzzy -msgid "Error: invalid characters in preference string.\n" -msgstr "rvnytelen karakter a preferencik kztt!\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: rvnytelen 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: rvnytelen ujjlenyomat.\n" - -#: g10/card-util.c:938 -#, fuzzy, c-format -msgid "key operation not possible: %s\n" -msgstr "Kulcsgenerls sikertelen: %s\n" - -#: g10/card-util.c:939 -#, fuzzy -msgid "not an OpenPGP card" -msgstr "Nem talltam rvnyes 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 rsakor: %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 "Krem, adja meg, milyen kulcsot kvn:\n" - -#: g10/card-util.c:1125 g10/card-util.c:1206 -#, fuzzy -msgid " (1) Signature key\n" -msgstr "Az alrs lejrt: %s.\n" - -#: g10/card-util.c:1126 g10/card-util.c:1208 -#, fuzzy -msgid " (2) Encryption key\n" -msgstr " (%d) RSA (csak titkosts)\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 "rvnytelen vlaszts.\n" - -#: g10/card-util.c:1203 -#, fuzzy -msgid "Please select where to store the key:\n" -msgstr "Krem, vlassza ki a visszavons okt:\n" - -#: g10/card-util.c:1238 -#, fuzzy -msgid "unknown key protection algorithm\n" -msgstr "Ismeretlen vdelmi algoritmus!\n" - -#: g10/card-util.c:1243 -#, fuzzy -msgid "secret parts of key are not available\n" -msgstr "Az elsdleges kulcs titkos rszei nem elrhetk.\n" - -#: g10/card-util.c:1248 -#, fuzzy -msgid "secret key already stored on a card\n" -msgstr "Kihagytam: titkos kulcs mr jelen van.\n" - -#: g10/card-util.c:1319 g10/keyedit.c:1357 -msgid "quit this menu" -msgstr "kilps ebbl a menbl" - -#: g10/card-util.c:1321 -#, fuzzy -msgid "show admin commands" -msgstr "Egymsnak ellentmond parancsok!\n" - -#: g10/card-util.c:1322 g10/keyedit.c:1360 -msgid "show this help" -msgstr "megmutatja ezt a sgt" - -#: g10/card-util.c:1324 -#, fuzzy -msgid "list all available data" -msgstr "Kulcs tallhat: " - -#: 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 "lejrat megvltoztatsa" - -#: g10/card-util.c:1331 -#, fuzzy -msgid "change the language preferences" -msgstr "kulcstulajdonos megbzhatsgnak belltsa" - -#: 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 kulcspr ltrehozsa" - -#: 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 "Egymsnak ellentmond parancsok!\n" - -#: g10/card-util.c:1526 -#, fuzzy -msgid "Admin commands are allowed\n" -msgstr "Egymsnak ellentmond parancsok!\n" - -#: g10/card-util.c:1528 -#, fuzzy -msgid "Admin commands are not allowed\n" -msgstr "rom a titkos kulcsot a %s llomnyba.\n" - -#: g10/card-util.c:1602 g10/keyedit.c:2244 -msgid "Invalid command (try \"help\")\n" -msgstr "rvnytelen parancs! (Prblja a sgt: \"help\".)\n" - -#: g10/cardglue.c:416 -#, fuzzy -msgid "card reader not available\n" -msgstr "titkos kulcs nem ll rendelkezsre" - -#: 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 trlse 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 "Ismtelje meg a jelszt: " - -#: g10/cardglue.c:952 -#, fuzzy -msgid "PIN not correctly repeated; try again" -msgstr "Nem ismtelte meg helyesen a jelszt! Prblja jra!" - -#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3826 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 mkdik ehhez a parancshoz.\n" - -#: g10/delkey.c:75 g10/export.c:311 g10/keyedit.c:3387 g10/keyserver.c:1700 -#: g10/revoke.c:228 -#, fuzzy, c-format -msgid "key \"%s\" not found: %s\n" -msgstr "\"%s\" kulcs nem tallhat: %s\n" - -#: g10/delkey.c:83 g10/export.c:341 g10/import.c:2349 g10/keyserver.c:1714 -#: g10/revoke.c:234 g10/revoke.c:478 -#, c-format -msgid "error reading keyblock: %s\n" -msgstr "Hiba a kulcsblokk olvassakor: %s\n" - -#: g10/delkey.c:129 g10/delkey.c:136 -msgid "(unless you specify the key by fingerprint)\n" -msgstr "(Kivve, ha megad egy kulcsot az ujjlenyomatval.)\n" - -#: g10/delkey.c:135 -#, fuzzy -msgid "can't do this in batch mode without \"--yes\"\n" -msgstr "Nem tudom ezt megcsinlni ktegelt mdban \"--yes\" nlkl.\n" - -#: g10/delkey.c:147 -#, fuzzy -msgid "Delete this key from the keyring? (y/N) " -msgstr "Trljem ezt a kulcsot a kulcskarikrl? " - -#: g10/delkey.c:155 -#, fuzzy -msgid "This is a secret key! - really delete? (y/N) " -msgstr "Ez egy titkos kulcs! Valban trljem? " - -#: g10/delkey.c:165 -#, c-format -msgid "deleting keyblock failed: %s\n" -msgstr "A kulcsblokk trlse sikertelen: %s.\n" - -#: g10/delkey.c:175 -msgid "ownertrust information cleared\n" -msgstr "Kulcstulajdonos megbzhatsgi adatait trltem.\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\" nyilvnos kulcshoz!\n" - -#: g10/delkey.c:208 -msgid "use option \"--delete-secret-keys\" to delete it first.\n" -msgstr "Elszr azt trlje a \"--delete-secret-keys\" opcival!\n" - -#: g10/encode.c:213 g10/sign.c:1284 -#, c-format -msgid "error creating passphrase: %s\n" -msgstr "Hiba a jelsz ltrehozsakor: %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 hasznlni a S2K md miatt!\n" - -#: g10/encode.c:231 -#, c-format -msgid "using cipher %s\n" -msgstr "%s rejtjelezst hasznlok.\n" - -#: g10/encode.c:241 g10/encode.c:536 -#, c-format -msgid "`%s' already compressed\n" -msgstr "\"%s\" mr tmrtett.\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\" llomny 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 rvidebb RSA kulcsokkal titkosthat --pgp2 mdban!\n" - -#: g10/encode.c:480 -#, c-format -msgid "reading from `%s'\n" -msgstr "Olvasok a \"%s\" llomnybl.\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 rejtjelezt hasznlni az sszes cmzett 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 hasznlata srti a cmzett preferenciit!\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) tmrts hasznlata srti a cmzett preferenciit!\n" - -#: g10/encode.c:715 -#, c-format -msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n" -msgstr "A %s (%d) rejtjelez hasznlata srti a cmzett preferenciit!\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 hasznlhatja %s-t %s mdban!\n" - -#: g10/encode.c:812 -#, c-format -msgid "%s/%s encrypted for: \"%s\"\n" -msgstr "%s/%s titkostva \"%s\" szmra\n" - -#: g10/encr-data.c:67 g10/mainproc.c:293 -#, c-format -msgid "%s encrypted data\n" -msgstr "%s titkostott adat.\n" - -#: g10/encr-data.c:69 g10/mainproc.c:297 -#, c-format -msgid "encrypted with unknown algorithm %d\n" -msgstr "Ismeretlen algoritmussal (%d) titkostva.\n" - -#: g10/encr-data.c:93 -msgid "" -"WARNING: message was encrypted with a weak key in the symmetric cipher.\n" -msgstr "" -"FIGYELEM: Az zenet szimmetrikus titkostst gyenge kulccsal vgeztk.\n" - -#: g10/encr-data.c:104 -msgid "problem handling encrypted packet\n" -msgstr "Problma a titkostott csomag kezelsekor!\n" - -#: g10/exec.c:49 -msgid "no remote program execution supported\n" -msgstr "Kls program meghvsa nem tmogatott.\n" - -#: g10/exec.c:176 g10/openfile.c:415 -#, c-format -msgid "can't create directory `%s': %s\n" -msgstr "Nem tudom a \"%s\" knyvtrat ltrehozni: %s.\n" - -#: g10/exec.c:317 -msgid "" -"external program calls are disabled due to unsafe options file permissions\n" -msgstr "" -"A kls programok hvsa tiltott, mert az \"options\" llomny engedlyei\n" -"nem biztonsgosak.\n" - -#: g10/exec.c:347 -#, fuzzy -msgid "this platform requires temporary files when calling external programs\n" -msgstr "" -"Ez a platform tmeneti llomnyokat ignyel kls programok hvshoz.\n" - -#: g10/exec.c:425 -#, fuzzy, c-format -msgid "unable to execute program `%s': %s\n" -msgstr "Nem tudom vgrehajtani a kvetkez \"%s\"-t: \"%s\": %s.\n" - -#: g10/exec.c:428 -#, fuzzy, c-format -msgid "unable to execute shell `%s': %s\n" -msgstr "Nem tudom vgrehajtani a kvetkez \"%s\"-t: \"%s\": %s.\n" - -#: g10/exec.c:513 -#, c-format -msgid "system error while calling external program: %s\n" -msgstr "Rendszerhiba kls program hvsakor: %s.\n" - -#: g10/exec.c:524 g10/exec.c:590 -msgid "unnatural exit of external program\n" -msgstr "A kls program nem termszetes mdon rt vget.\n" - -#: g10/exec.c:539 -msgid "unable to execute external program\n" -msgstr "Nem tudom a vgrehajtani a kls programot.\n" - -#: g10/exec.c:555 -#, c-format -msgid "unable to read external program response: %s\n" -msgstr "Nem tudom beolvasni a kls program vlaszt: %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 trlni az (\"%s\") tmeneti llomnyt: \"%s\": %s.\n" - -#: g10/exec.c:613 -#, c-format -msgid "WARNING: unable to remove temp directory `%s': %s\n" -msgstr "FIGYELEM: nem tudom trlni a \"%s\" tmeneti knyvtrat: %s\n" - -#: g10/export.c:61 -#, fuzzy -msgid "export signatures that are marked as local-only" -msgstr "" -"\n" -"Az alrst \"nem visszavonhatnak\" jelljk.\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 talltam visszavon kulcsot a kvetkezhz: \"%s\".\n" - -#: g10/export.c:67 -#, fuzzy -msgid "remove the passphrase from exported subkeys" -msgstr "msodlagos kulcs visszavonsa" - -#: g10/export.c:69 -#, fuzzy -msgid "remove unusable parts from key during export" -msgstr "hasznlhatatlan 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 llomnyba.\n" - -#: g10/export.c:354 -#, fuzzy, c-format -msgid "key %s: not protected - skipped\n" -msgstr "%08lX kulcs: nem vdett - 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 stlus kulcs - kihagytam.\n" - -#: g10/export.c:373 -#, fuzzy, c-format -msgid "key %s: key material on-card - skipped\n" -msgstr "%08lX kulcs: Alkulcsalrs 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 adatbzis (%s) inicializlsa 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 ellenrzsszege.\n" - -#: g10/export.c:598 -msgid "WARNING: nothing exported\n" -msgstr "FIGYELEM: Semmit sem exportltam.\n" - -#: g10/gpg.c:375 -msgid "" -"@Commands:\n" -" " -msgstr "" -"@Parancsok:\n" -" " - -#: g10/gpg.c:377 -msgid "|[file]|make a signature" -msgstr "|[fjl]|alrs ksztse" - -#: g10/gpg.c:378 -msgid "|[file]|make a clear text signature" -msgstr "|[fjl]|olvashat szveg alrsa" - -#: g10/gpg.c:379 -msgid "make a detached signature" -msgstr "klnll alrs ksztse" - -#: g10/gpg.c:380 -msgid "encrypt data" -msgstr "adat titkostsa" - -#: g10/gpg.c:382 -msgid "encryption only with symmetric cipher" -msgstr "titkosts csak szimmetrikus rejtjelezvel" - -#: g10/gpg.c:384 -msgid "decrypt data (default)" -msgstr "adat visszafejtse (alaprtelmezs)" - -#: g10/gpg.c:386 -msgid "verify a signature" -msgstr "alrs ellenrzse" - -#: g10/gpg.c:388 -msgid "list keys" -msgstr "kulcsok listzsa" - -#: g10/gpg.c:390 -msgid "list keys and signatures" -msgstr "kulcsok s alrsok listzsa" - -#: g10/gpg.c:391 -#, fuzzy -msgid "list and check key signatures" -msgstr "kulcsalrsok ellenrzse" - -#: g10/gpg.c:392 -msgid "list keys and fingerprints" -msgstr "kulcsok s ujjlenyomatok listzsa" - -#: g10/gpg.c:393 -msgid "list secret keys" -msgstr "titkos kulcsok listzsa" - -#: g10/gpg.c:394 -msgid "generate a new key pair" -msgstr "j kulcspr ltrehozsa" - -#: g10/gpg.c:395 -msgid "remove keys from the public keyring" -msgstr "kulcsok eltvoltsa a nyilvnoskulcs-karikrl" - -#: g10/gpg.c:397 -msgid "remove keys from the secret keyring" -msgstr "kulcsok eltvoltsa a titkoskulcs-karikrl" - -#: g10/gpg.c:398 -msgid "sign a key" -msgstr "kulcs alrsa" - -#: g10/gpg.c:399 -msgid "sign a key locally" -msgstr "kulcs alrsa helyileg" - -#: g10/gpg.c:400 -msgid "sign or edit a key" -msgstr "kulcs alrsa vagy szerkesztse" - -#: g10/gpg.c:401 -msgid "generate a revocation certificate" -msgstr "visszavonsi igazols ksztse" - -#: g10/gpg.c:403 -msgid "export keys" -msgstr "kulcsok exportlsa" - -#: g10/gpg.c:404 -msgid "export keys to a key server" -msgstr "kulcsok exportlsa kulcsszerverre" - -#: g10/gpg.c:405 -msgid "import keys from a key server" -msgstr "kulcsok importlsa kulcsszerverrl" - -#: g10/gpg.c:407 -msgid "search for keys on a key server" -msgstr "kulcsok keresse kulcsszerveren" - -#: g10/gpg.c:409 -msgid "update all keys from a keyserver" -msgstr "minden kulcs frisstse kulcsszerverrl" - -#: g10/gpg.c:413 -msgid "import/merge keys" -msgstr "kulcsok importlsa/sszefzse" - -#: g10/gpg.c:416 -msgid "print the card status" -msgstr "" - -#: g10/gpg.c:417 -msgid "change data on a card" -msgstr "" - -#: g10/gpg.c:418 -msgid "change a card's PIN" -msgstr "" - -#: g10/gpg.c:426 -msgid "update the trust database" -msgstr "bizalmi adatbzis frisstse" - -#: g10/gpg.c:433 -msgid "|algo [files]|print message digests" -msgstr "|algo [fjlok]|zenet kivonatnak kirsa" - -#: g10/gpg.c:437 g10/gpgv.c:71 -msgid "" -"@\n" -"Options:\n" -" " -msgstr "" -"@\n" -"Opcik:\n" -" " - -#: g10/gpg.c:439 -msgid "create ascii armored output" -msgstr "ascii pnclozott kimenet ltrehozsa" - -#: g10/gpg.c:441 -msgid "|NAME|encrypt for NAME" -msgstr "|NV|titkosts NV rszre" - -#: g10/gpg.c:452 -msgid "use this user-id to sign or decrypt" -msgstr "felh. azonost alrshoz s visszafejtshez" - -#: g10/gpg.c:453 -msgid "|N|set compress level N (0 disables)" -msgstr "|N|tmrtsi szint belltsa N-re (0: tilts)" - -#: g10/gpg.c:458 -msgid "use canonical text mode" -msgstr "kanonikus szveges md hasznlata" - -#: g10/gpg.c:472 -msgid "use as output file" -msgstr "kimeneti llomny megadsa" - -#: g10/gpg.c:474 g10/gpgv.c:73 -msgid "verbose" -msgstr "bbeszd md" - -#: g10/gpg.c:485 -msgid "do not make any changes" -msgstr "ne csinljon semmi vltoztatst" - -#: g10/gpg.c:486 -msgid "prompt before overwriting" -msgstr "fellrs eltt rkrdezs" - -#: g10/gpg.c:527 -msgid "use strict OpenPGP behavior" -msgstr "" - -#: g10/gpg.c:528 -msgid "generate PGP 2.x compatible messages" -msgstr "" - -#: g10/gpg.c:556 -msgid "" -"@\n" -"(See the man page for a complete listing of all commands and options)\n" -msgstr "" -"@\n" -"(A parancsok s opcik teljes listjt a man oldalon tekintheti meg.)\n" - -#: g10/gpg.c:559 -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" -"Pldk:\n" -"\n" -" -se -r Bob [fjl] titkosts s alrs Bob rszre\n" -" --clearsign [fjl] olvashat szveg alrsa\n" -" --detach-sign [fjl] klnll alrs ksztse\n" -" --list-keys [nevek] kulcsok kiratsa\n" -" --fingerprint [nevek] ujjlenyomatok kiratsa\n" - -#: g10/gpg.c:757 g10/gpgv.c:98 -msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n" -msgstr "A hibkat (angolul) a <gnupg-bugs@gnu.org> cmre rja meg!\n" - -#: g10/gpg.c:774 -msgid "Usage: gpg [options] [files] (-h for help)" -msgstr "Hasznlat: gpg [opcik] [fjlok] (-h a sghoz)" - -#: g10/gpg.c:777 -msgid "" -"Syntax: gpg [options] [files]\n" -"sign, check, encrypt or decrypt\n" -"default operation depends on the input data\n" -msgstr "" -"Szintaxis: gpg [opcik] [fjlok]\n" -"Alrs, ellenrzs, titkosts vagy visszafejts.\n" -"Az alaprtelmezett mvelet a bemeneti adattl fgg.\n" - -#: g10/gpg.c:788 -msgid "" -"\n" -"Supported algorithms:\n" -msgstr "" -"\n" -"Tmogatott algoritmusok:\n" - -#: g10/gpg.c:791 -msgid "Pubkey: " -msgstr "Nyilvnos kulcs (pubkey): " - -#: g10/gpg.c:797 g10/keyedit.c:2310 -msgid "Cipher: " -msgstr "Rejtjelez (cipher): " - -#: g10/gpg.c:803 -msgid "Hash: " -msgstr "Kivonatol (hash): " - -#: g10/gpg.c:809 g10/keyedit.c:2356 -msgid "Compression: " -msgstr "Tmrt (compression): " - -#: g10/gpg.c:892 -msgid "usage: gpg [options] " -msgstr "Hasznlat: gpg [opcik] " - -#: g10/gpg.c:1040 -msgid "conflicting commands\n" -msgstr "Egymsnak ellentmond parancsok!\n" - -#: g10/gpg.c:1058 -#, fuzzy, c-format -msgid "no = sign found in group definition `%s'\n" -msgstr "Nem talltam = jelet a \"%s\" csoportdefinciban!\n" - -#: g10/gpg.c:1255 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on homedir `%s'\n" -msgstr "FIGYELEM: Nem biztonsgos tulajdonos: %s \"%s\"\n" - -#: g10/gpg.c:1258 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on configuration file `%s'\n" -msgstr "FIGYELEM: Nem biztonsgos tulajdonos: %s \"%s\"\n" - -#: g10/gpg.c:1261 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on extension `%s'\n" -msgstr "FIGYELEM: Nem biztonsgos tulajdonos: %s \"%s\"\n" - -#: g10/gpg.c:1267 -#, fuzzy, c-format -msgid "WARNING: unsafe permissions on homedir `%s'\n" -msgstr "FIGYELEM: nem biztonsgos engedlyek: %s \"%s\"\n" - -#: g10/gpg.c:1270 -#, fuzzy, c-format -msgid "WARNING: unsafe permissions on configuration file `%s'\n" -msgstr "FIGYELEM: nem biztonsgos engedlyek: %s \"%s\"\n" - -#: g10/gpg.c:1273 -#, fuzzy, c-format -msgid "WARNING: unsafe permissions on extension `%s'\n" -msgstr "FIGYELEM: nem biztonsgos engedlyek: %s \"%s\"\n" - -#: g10/gpg.c:1279 -#, fuzzy, c-format -msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n" -msgstr "FIGYELEM: nem biztonsgos knyvtrtulajdonos: %s \"%s\"\n" - -#: g10/gpg.c:1282 -#, fuzzy, c-format -msgid "" -"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n" -msgstr "FIGYELEM: nem biztonsgos knyvtrtulajdonos: %s \"%s\"\n" - -#: g10/gpg.c:1285 -#, fuzzy, c-format -msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n" -msgstr "FIGYELEM: nem biztonsgos knyvtrtulajdonos: %s \"%s\"\n" - -#: g10/gpg.c:1291 -#, fuzzy, c-format -msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n" -msgstr "FIGYELEM: nem biztonsgos knyvtrengedlyek: %s \"%s\"\n" - -#: g10/gpg.c:1294 -#, fuzzy, c-format -msgid "" -"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n" -msgstr "FIGYELEM: nem biztonsgos knyvtrengedlyek: %s \"%s\"\n" - -#: g10/gpg.c:1297 -#, fuzzy, c-format -msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n" -msgstr "FIGYELEM: nem biztonsgos knyvtrengedlyek: %s \"%s\"\n" - -#: g10/gpg.c:1438 -#, fuzzy, c-format -msgid "unknown configuration item `%s'\n" -msgstr "\"%s\": ismeretlen konfigurcis elem.\n" - -#: g10/gpg.c:1531 -msgid "display photo IDs during key listings" -msgstr "" - -#: g10/gpg.c:1533 -msgid "show policy URLs during signature listings" -msgstr "" - -#: g10/gpg.c:1535 -#, fuzzy -msgid "show all notations during signature listings" -msgstr "Nincs megfelel alrs a titkoskulcs-karikn.\n" - -#: g10/gpg.c:1537 -msgid "show IETF standard notations during signature listings" -msgstr "" - -#: g10/gpg.c:1541 -msgid "show user-supplied notations during signature listings" -msgstr "" - -#: g10/gpg.c:1543 -#, fuzzy -msgid "show preferred keyserver URLs during signature listings" -msgstr "A megadott alrsi eljrsmd URL-je rvnytelen!\n" - -#: g10/gpg.c:1545 -msgid "show user ID validity during key listings" -msgstr "" - -#: g10/gpg.c:1547 -msgid "show revoked and expired user IDs in key listings" -msgstr "" - -#: g10/gpg.c:1549 -msgid "show revoked and expired subkeys in key listings" -msgstr "" - -#: g10/gpg.c:1551 -#, fuzzy -msgid "show the keyring name in key listings" -msgstr "mutatja a kilistzott kulcs kulcskarikjt is" - -#: g10/gpg.c:1553 -#, fuzzy -msgid "show expiration dates during signature listings" -msgstr "Nincs megfelel alrs a titkoskulcs-karikn.\n" - -#: g10/gpg.c:1920 -#, c-format -msgid "NOTE: old default options file `%s' ignored\n" -msgstr "MEGJEGYZS: Figyelmen kvl hagytam a rgi opcikat (%s).\n" - -#: g10/gpg.c:1962 -#, c-format -msgid "NOTE: no default option file `%s'\n" -msgstr "MEGJEGYZS: Nincs alaprtelmezett opcis fjl (%s).\n" - -#: g10/gpg.c:1966 -#, c-format -msgid "option file `%s': %s\n" -msgstr "\"%s\" opcis fjl: %s\n" - -#: g10/gpg.c:1973 -#, c-format -msgid "reading options from `%s'\n" -msgstr "Az opcikat a \"%s\" llomnybl olvasom.\n" - -#: g10/gpg.c:2188 g10/gpg.c:2814 g10/gpg.c:2833 -#, c-format -msgid "NOTE: %s is not for normal use!\n" -msgstr "MEGJEGYZS: %s nem norml hasznlatra van!\n" - -#: g10/gpg.c:2201 -#, fuzzy, c-format -msgid "cipher extension `%s' not loaded due to unsafe permissions\n" -msgstr "A \"%s\" rejtjelez bvtst rossz engedlyek miatt tltm be.\n" - -#: g10/gpg.c:2364 g10/gpg.c:2376 -#, fuzzy, c-format -msgid "`%s' is not a valid signature expiration\n" -msgstr "%s nem rvnyes karakterkioszts!\n" - -#: g10/gpg.c:2452 -#, fuzzy, c-format -msgid "`%s' is not a valid character set\n" -msgstr "%s nem rvnyes karakterkioszts!\n" - -#: g10/gpg.c:2476 g10/gpg.c:2663 g10/keyedit.c:4064 -#, fuzzy -msgid "could not parse keyserver URL\n" -msgstr "rtelmezhetetlen a kulcsszerver URI-ja!\n" - -#: g10/gpg.c:2488 -#, fuzzy, c-format -msgid "%s:%d: invalid keyserver options\n" -msgstr "%s:%d: rvnytelen export opcik!\n" - -#: g10/gpg.c:2491 -#, fuzzy -msgid "invalid keyserver options\n" -msgstr "rvnytelen export opcik!\n" - -#: g10/gpg.c:2498 -#, c-format -msgid "%s:%d: invalid import options\n" -msgstr "%s:%d: rvnytelen import opcik!\n" - -#: g10/gpg.c:2501 -msgid "invalid import options\n" -msgstr "rvnytelen import opcik!\n" - -#: g10/gpg.c:2508 -#, c-format -msgid "%s:%d: invalid export options\n" -msgstr "%s:%d: rvnytelen export opcik!\n" - -#: g10/gpg.c:2511 -msgid "invalid export options\n" -msgstr "rvnytelen export opcik!\n" - -#: g10/gpg.c:2518 -#, fuzzy, c-format -msgid "%s:%d: invalid list options\n" -msgstr "%s:%d: rvnytelen import opcik!\n" - -#: g10/gpg.c:2521 -#, fuzzy -msgid "invalid list options\n" -msgstr "rvnytelen import opcik!\n" - -#: g10/gpg.c:2529 -msgid "display photo IDs during signature verification" -msgstr "" - -#: g10/gpg.c:2531 -msgid "show policy URLs during signature verification" -msgstr "" - -#: g10/gpg.c:2533 -#, fuzzy -msgid "show all notations during signature verification" -msgstr "%s nem rvnyes karakterkioszts!\n" - -#: g10/gpg.c:2535 -msgid "show IETF standard notations during signature verification" -msgstr "" - -#: g10/gpg.c:2539 -msgid "show user-supplied notations during signature verification" -msgstr "" - -#: g10/gpg.c:2541 -#, fuzzy -msgid "show preferred keyserver URLs during signature verification" -msgstr "A megadott alrsi eljrsmd URL-je rvnytelen!\n" - -#: g10/gpg.c:2543 -#, fuzzy -msgid "show user ID validity during signature verification" -msgstr "%s nem rvnyes karakterkioszts!\n" - -#: g10/gpg.c:2545 -msgid "show revoked and expired user IDs in signature verification" -msgstr "" - -#: g10/gpg.c:2547 -msgid "validate signatures with PKA data" -msgstr "" - -#: g10/gpg.c:2549 -msgid "elevate the trust of signatures with valid PKA data" -msgstr "" - -#: g10/gpg.c:2556 -#, fuzzy, c-format -msgid "%s:%d: invalid verify options\n" -msgstr "%s:%d: rvnytelen export opcik!\n" - -#: g10/gpg.c:2559 -#, fuzzy -msgid "invalid verify options\n" -msgstr "rvnytelen export opcik!\n" - -#: g10/gpg.c:2566 -#, c-format -msgid "unable to set exec-path to %s\n" -msgstr "Nem tudom a vgrehajtsi elrsi utat %s rtkre lltani!\n" - -#: g10/gpg.c:2729 -#, fuzzy, c-format -msgid "%s:%d: invalid auto-key-locate list\n" -msgstr "%s:%d: rvnytelen export opcik!\n" - -#: g10/gpg.c:2732 -msgid "invalid auto-key-locate list\n" -msgstr "" - -#: g10/gpg.c:2803 -msgid "WARNING: program may create a core file!\n" -msgstr "FIGYELEM: A program core llomnyt hozhat ltre!\n" - -#: g10/gpg.c:2807 -#, c-format -msgid "WARNING: %s overrides %s\n" -msgstr "FIGYELEM: %s hatstalantja %s-t!\n" - -#: g10/gpg.c:2816 -#, c-format -msgid "%s not allowed with %s!\n" -msgstr "%s s %s nem hasznlhat egytt!\n" - -#: g10/gpg.c:2819 -#, c-format -msgid "%s makes no sense with %s!\n" -msgstr "%s rtelmetlen %s mellett!\n" - -#: g10/gpg.c:2826 -#, fuzzy, c-format -msgid "NOTE: %s is not available in this version\n" -msgstr "GPG gynk nem elrhet ebben a munkafolyamatban.\n" - -#: g10/gpg.c:2841 -#, fuzzy, c-format -msgid "will not run with insecure memory due to %s\n" -msgstr "rom a titkos kulcsot a %s llomnyba.\n" - -#: g10/gpg.c:2855 -msgid "you can only make detached or clear signatures while in --pgp2 mode\n" -msgstr "Csak klnll s olvashatszveg-alrst kszthet --pgp2 mdban!\n" - -#: g10/gpg.c:2861 -msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n" -msgstr "Nem rhat al s titkosthat egyszerre --pgp2 mdban!\n" - -#: g10/gpg.c:2867 -msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n" -msgstr "Csak llomnyokat (pipe-ot nem) hasznlhat --pgp2 mdban!\n" - -#: g10/gpg.c:2880 -msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n" -msgstr "zenet titkostsa --pgp2 mdban IDEA rejtjelezt ignyel!\n" - -#: g10/gpg.c:2947 g10/gpg.c:2971 -msgid "selected cipher algorithm is invalid\n" -msgstr "A kivlasztott rejtjelez algoritmus rvnytelen!\n" - -#: g10/gpg.c:2953 g10/gpg.c:2977 -msgid "selected digest algorithm is invalid\n" -msgstr "A kivlasztott kivonatol algoritmus rvnytelen!\n" - -#: g10/gpg.c:2959 -#, fuzzy -msgid "selected compression algorithm is invalid\n" -msgstr "A kivlasztott rejtjelez algoritmus rvnytelen!\n" - -#: g10/gpg.c:2965 -msgid "selected certification digest algorithm is invalid\n" -msgstr "Az igazolshoz kivlasztott kivonatol algoritmus rvnytelen!\n" - -#: g10/gpg.c:2980 -msgid "completes-needed must be greater than 0\n" -msgstr "completes-needed nagyobb kell legyen 0-nl!\n" - -#: g10/gpg.c:2982 -msgid "marginals-needed must be greater than 1\n" -msgstr "marginals-needed nagyobb kell legyen 1-nl!\n" - -#: g10/gpg.c:2984 -#, fuzzy -msgid "max-cert-depth must be in the range from 1 to 255\n" -msgstr "max-cert-depth 1 s 255 kz kell essen!\n" - -#: g10/gpg.c:2986 -msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n" -msgstr "rvnytelen default-cert-level; 0, 1, 2 vagy 3 lehet.\n" - -#: g10/gpg.c:2988 -msgid "invalid min-cert-level; must be 1, 2, or 3\n" -msgstr "rvnytelen min-cert-level; 0, 1, 2 vagy 3 lehet.\n" - -#: g10/gpg.c:2991 -msgid "NOTE: simple S2K mode (0) is strongly discouraged\n" -msgstr "MEGJEGYZS: Egyszer S2K md (0) ersen ellenjavallt!\n" - -#: g10/gpg.c:2995 -msgid "invalid S2K mode; must be 0, 1 or 3\n" -msgstr "rvnytelen S2K md; 0, 1 vagy 3 lehet.\n" - -#: g10/gpg.c:3002 -msgid "invalid default preferences\n" -msgstr "rvnytelen alaprtelmezett preferencik!\n" - -#: g10/gpg.c:3011 -msgid "invalid personal cipher preferences\n" -msgstr "rvnytelen szemlyes rejtjelez-preferencik!\n" - -#: g10/gpg.c:3015 -msgid "invalid personal digest preferences\n" -msgstr "rvnytelen szemlyes kivonatolpreferencik!\n" - -#: g10/gpg.c:3019 -msgid "invalid personal compress preferences\n" -msgstr "rvnytelen szemlyes tmrtpreferencik!\n" - -#: g10/gpg.c:3052 -#, c-format -msgid "%s does not yet work with %s\n" -msgstr "%s s %s egyelre nem hasznlhat egytt!\n" - -#: g10/gpg.c:3099 -#, fuzzy, c-format -msgid "you may not use cipher algorithm `%s' while in %s mode\n" -msgstr "" -"Lehet, hogy nem hasznlhatja \"%s\" rejtjelez algoritmust %s mdban!\n" - -#: g10/gpg.c:3104 -#, fuzzy, c-format -msgid "you may not use digest algorithm `%s' while in %s mode\n" -msgstr "" -"Lehet, hogy nem hasznlhatja \"%s\" kivonatol algoritmust %s mdban!\n" - -#: g10/gpg.c:3109 -#, fuzzy, c-format -msgid "you may not use compression algorithm `%s' while in %s mode\n" -msgstr "Lehet, hogy nem hasznlhatja \"%s\" tmrt algoritmust %s mdban!\n" - -#: g10/gpg.c:3208 -#, c-format -msgid "failed to initialize the TrustDB: %s\n" -msgstr "Bizalmi adatbzis (%s) inicializlsa sikertelen!\n" - -#: g10/gpg.c:3219 -msgid "WARNING: recipients (-r) given without using public key encryption\n" -msgstr "" -"FIGYELEM: Cmzett megadva (-r), de nincs nyilvnos kulcs titkosts!\n" - -#: g10/gpg.c:3230 -msgid "--store [filename]" -msgstr "--store [fjlnv]" - -#: g10/gpg.c:3237 -msgid "--symmetric [filename]" -msgstr "--symmetric [fjlnv]" - -#: g10/gpg.c:3239 -#, fuzzy, c-format -msgid "symmetric encryption of `%s' failed: %s\n" -msgstr "Visszafejts sikertelen: %s.\n" - -#: g10/gpg.c:3249 -msgid "--encrypt [filename]" -msgstr "--encrypt [fjlnv]" - -#: g10/gpg.c:3262 -#, fuzzy -msgid "--symmetric --encrypt [filename]" -msgstr "--sign --encrypt [fjlnv]" - -#: g10/gpg.c:3264 -msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n" -msgstr "" - -#: g10/gpg.c:3267 -#, fuzzy, c-format -msgid "you cannot use --symmetric --encrypt while in %s mode\n" -msgstr "Lehet, hogy nem hasznlhatja %s-t %s mdban!\n" - -#: g10/gpg.c:3285 -msgid "--sign [filename]" -msgstr "--sign [fjlnv]" - -#: g10/gpg.c:3298 -msgid "--sign --encrypt [filename]" -msgstr "--sign --encrypt [fjlnv]" - -#: g10/gpg.c:3313 -#, fuzzy -msgid "--symmetric --sign --encrypt [filename]" -msgstr "--sign --encrypt [fjlnv]" - -#: g10/gpg.c:3315 -msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n" -msgstr "" - -#: g10/gpg.c:3318 -#, fuzzy, c-format -msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n" -msgstr "Lehet, hogy nem hasznlhatja %s-t %s mdban!\n" - -#: g10/gpg.c:3338 -msgid "--sign --symmetric [filename]" -msgstr "--sign --symmetric [fjlnv]" - -#: g10/gpg.c:3347 -msgid "--clearsign [filename]" -msgstr "--clearsign [fjlnv]" - -#: g10/gpg.c:3372 -msgid "--decrypt [filename]" -msgstr "--decrypt [fjlnv]" - -#: g10/gpg.c:3380 -msgid "--sign-key user-id" -msgstr "--sign-key felh-azonost" - -#: g10/gpg.c:3384 -msgid "--lsign-key user-id" -msgstr "--lsign-key felh-azonost" - -#: g10/gpg.c:3405 -msgid "--edit-key user-id [commands]" -msgstr "--edit-key felh-azonost [parancsok]" - -#: g10/gpg.c:3476 -msgid "-k[v][v][v][c] [user-id] [keyring]" -msgstr "-k[v][v][v][c] [felh-azonost] [kulcskarika]" - -#: g10/gpg.c:3518 -#, c-format -msgid "keyserver send failed: %s\n" -msgstr "Klds a kulcsszerverre sikertelen: %s\n" - -#: g10/gpg.c:3520 -#, c-format -msgid "keyserver receive failed: %s\n" -msgstr "Vtel a kulcsszerverrl sikertelen: %s\n" - -#: g10/gpg.c:3522 -#, c-format -msgid "key export failed: %s\n" -msgstr "Kulcsexportls sikertelen: %s\n" - -#: g10/gpg.c:3533 -#, c-format -msgid "keyserver search failed: %s\n" -msgstr "Keress a kulcsszerveren sikertelen: %s\n" - -#: g10/gpg.c:3543 -#, c-format -msgid "keyserver refresh failed: %s\n" -msgstr "Frissts a kulcsszerverrl sikertelen: %s\n" - -#: g10/gpg.c:3594 -#, c-format -msgid "dearmoring failed: %s\n" -msgstr "Pncl eltvoltsa nem sikerlt: %s\n" - -#: g10/gpg.c:3602 -#, c-format -msgid "enarmoring failed: %s\n" -msgstr "Pnclozs nem sikerlt: %s\n" - -#: g10/gpg.c:3689 -#, c-format -msgid "invalid hash algorithm `%s'\n" -msgstr "rvnytelen kivonatol algoritmus: %s\n" - -#: g10/gpg.c:3812 -msgid "[filename]" -msgstr "[fjlnv]" - -#: g10/gpg.c:3816 -msgid "Go ahead and type your message ...\n" -msgstr "Kezdheti gpelni az zenetet...\n" - -#: g10/gpg.c:4120 -msgid "the given certification policy URL is invalid\n" -msgstr "A megadott igazolsi eljrsmd URL-je rvnytelen!\n" - -#: g10/gpg.c:4122 -msgid "the given signature policy URL is invalid\n" -msgstr "A megadott alrsi eljrsmd URL-je rvnytelen!\n" - -#: g10/gpg.c:4155 -#, fuzzy -msgid "the given preferred keyserver URL is invalid\n" -msgstr "A megadott alrsi eljrsmd URL-je rvnytelen!\n" - -#: g10/getkey.c:152 -msgid "too many entries in pk cache - disabled\n" -msgstr "Tl sok bejegyzs van a nyilvnoskulcs-gyorsttrban - 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 rvnytelen kulcsot rvnyestettk az\n" -"--allow-non-selfsigned-uid opcival.\n" - -#: g10/getkey.c:2380 g10/keyedit.c:3707 -#, fuzzy, c-format -msgid "no secret subkey for public subkey %s - ignoring\n" -msgstr "" -"Nincs titkos alkulcs a %08lX nyilvnos alkulcshoz - figyelmen kvl hagyom.\n" - -#: g10/getkey.c:2611 -#, fuzzy, c-format -msgid "using subkey %s instead of primary key %s\n" -msgstr "A %08lX msodlagos kulcsot hasznljuk a %08lX elsdleges helyett.\n" - -#: g10/getkey.c:2658 -#, fuzzy, c-format -msgid "key %s: secret key without public key - skipped\n" -msgstr "%08lX kulcs: titkos kulcs nyilvnos kulcs nlkl - kihagytam.\n" - -#: g10/gpgv.c:74 -msgid "be somewhat more quiet" -msgstr "mg szkszavbb md" - -#: g10/gpgv.c:75 -msgid "take the keys from this keyring" -msgstr "a megadott kulcskarikrl vegye a kulcsokat" - -#: g10/gpgv.c:77 -msgid "make timestamp conflicts only a warning" -msgstr "idblyeg-konfliktus esetn csak figyelmeztessen" - -#: g10/gpgv.c:78 -msgid "|FD|write status info to this FD" -msgstr "|L|llapotinformcik rsa L llomnylerra" - -#: g10/gpgv.c:102 -msgid "Usage: gpgv [options] [files] (-h for help)" -msgstr "Hasznlat: gpgv [opcik] [fjlok] (-h a sghoz)" - -#: g10/gpgv.c:105 -msgid "" -"Syntax: gpg [options] [files]\n" -"Check signatures against known trusted keys\n" -msgstr "" -"Szintaxis: gpg [opcik] [fjlok]\n" -"Ellenrzi az alrsokat az ismert, megbzhat kulcsok segtsgvel.\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 dntsn mlik, hogy milyen rtket ad meg itt. Ezt az rtket soha\n" -"nem exportljuk msok rszre. Ez a bizalmak hlzathoz (web-of-trust)\n" -"szksges, semmi kze az igazolsok hlzathoz (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 hlzatt felptsk, a GnuPG-nek tudnia kell, hogy\n" -"mely kulcsok alapveten megbzhatak - ltalban ezek azok a kulcsok,\n" -"melyek titkos kulcshoz hozzfr. Vlaszoljon \"igen\"-nel, ha kulcsot\n" -"alapveten megbzhatnak jelli!\n" - -#: g10/helptext.c:62 -msgid "If you want to use this untrusted key anyway, answer \"yes\"." -msgstr "" -"Ha mgis hasznlni akarja ezt a kulcsot, melyben nem bzunk,\n" -"vlaszoljon \"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 cmzett felhasznli azonostjt!" - -#: 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 "" -"ltalban nem j tlet ugyanazt a kulcsot hasznlni alrshoz s\n" -"titkostshoz. Ezt az algoritmust csak bizonyos terleteken ajnlatos\n" -"hasznlni. Krem, elszr konzultljon a biztonsgi szakrtjvel!" - -#: g10/helptext.c:91 -msgid "Enter the size of the key" -msgstr "Adja meg a kulcs mrett!" - -#: 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 "Krem, adjon \"igen\" vagy \"nem\" vlaszt!" - -#: 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 szksges rtket, ahogy a prompt mutatja!\n" -"Lehetsges ISO dtumot is berni (-HH-NN), de nem fog rendes\n" -"hibazenetet kapni, hanem a rendszer megprblja az rtket\n" -"intervallumknt rtelmezni." - -#: g10/helptext.c:117 -msgid "Enter the name of the key holder" -msgstr "Adja meg a kulcs tulajdonosnak a nevt!" - -#: g10/helptext.c:122 -msgid "please enter an optional but highly suggested email address" -msgstr "Krem, adjon meg egy opcionlis, de nagyon ajnlott e-mail cmet!" - -#: g10/helptext.c:126 -msgid "Please enter an optional comment" -msgstr "Krem, adjon meg egy opcionlis megjegyzst!" - -#: 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 nv vltoztatsa\n" -"M megjegyzs vltoztatsa\n" -"E e-mail vltoztatsa\n" -"R kulcsgenerls folytatsa\n" -"Q kilps a kulcsgenerlsbl" - -#: g10/helptext.c:140 -msgid "Answer \"yes\" (or just \"y\") if it is okay to generate the sub key." -msgstr "" -"Vlaszoljon \"igen\"-nel (vagy csak \"i\"-vel), ha kezdhetjk az alkulcs\n" -"ltrehozst!" - -#: 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 "" -"Mieltt alr egy felhasznli azonostt egy kulcson, ellenriznie kell,\n" -"hogy a kulcs a felhasznli azonostban megnevezett szemlyhez tartozik.\n" -"Msok szmra hasznos lehet, ha tudjk, hogy milyen gondosan ellenrizte\n" -"n ezt.\n" -"\n" -"\"0\" azt jelenti, hogy nem tesz az ellenrzs gondossgra vonatkoz\n" -" kijelentst.\n" -"\n" -"\"1\" azt jelenti, hogy n hiszi, hogy a kulcs annak a szemlynek a\n" -" tulajdona, aki azt lltja, hogy az v, de n nem tudta ezt\n" -" ellenrizni, vagy egyszeren nem ellenrizte ezt. Ez hasznos egy\n" -" \"persona\" tpus ellenrzshez, mikor n egy pszeudonim felhasznl\n" -" kulcst rja al.\n" -"\n" -"\"2\" azt jelenti, hogy n a kulcsot htkznapi alapossggal ellenrizte.\n" -" Pldul ez azt jelentheti, hogy ellenrizte a kulcs ujjlenyomatt, s\n" -" sszevetette a kulcson szerepl felhasznlazonostt egy fnykpes\n" -" igazolvnnyal.\n" -"\n" -"\"3\" azt jelenti, hogy alaposan ellenrizte a kulcsot. Pldul ez azt\n" -" jelentheti, hogy a kulcs ujjlenyomatt a tulajdonossal szemlyesen\n" -" tallkozva ellenrizte, egy nehezen hamisthat, fnykpes " -"igazolvnnyal\n" -" (mint az tlevl) meggyzdtt arrl, hogy a szemly neve egyezik a\n" -" kulcson levvel, s vgl (e-mail vltssal) ellenrizte, hogy a " -"kulcson\n" -" szerepl e-mail cm a kulcs tulajdonoshoz tartozik.\n" -"\n" -"A 2-es s 3-as szintekhez adott pldk *csak* pldk. Vgs soron n dnti\n" -"el, hogy mit jelentenek nnek a \"htkznapi\" s \"alapos\" kifejezsek,\n" -"amikor msok kulcst alrja.\n" -"\n" -"Ha nem tudja, hogy mit vlaszoljon, rjon \"0\"-t!" - -#: g10/helptext.c:186 -#, fuzzy -msgid "Answer \"yes\" if you want to sign ALL the user IDs" -msgstr "" -"Vlaszoljon \"igen\"-nel, ha az SSZES felhasznlazonostt 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 "" -"Vlaszoljon \"igen\"-nel, ha valban trlni akarja ezt a " -"felhasznlazonostt!\n" -"Minden igazols trldik vele egytt!" - -#: g10/helptext.c:195 -msgid "Answer \"yes\" if it is okay to delete the subkey" -msgstr "Vlaszoljon \"igen\"-nel, ha az alkulcs trlhet." - -#: 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 rvnyes alrs a kulcson. Norml esetben nincs rtelme\n" -"trlni, mert fontos lehet ahhoz, hogy rvnyestse ezt a kulcsot,\n" -"vagy egy msikat, 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 alrst nem tudom ellenrizni, mert nincs meg a hozz tartoz\n" -"kulcs. Ajnlatos lenne elhalasztani a trlst addig, amg meg nem tudja,\n" -"hogy melyik kulcsot hasznltk, mert ez az alr kulcs bizalmi\n" -"kapcsolatot hozhat ltre egy mr hitelestett kulcson keresztl." - -#: g10/helptext.c:211 -msgid "" -"The signature is not valid. It does make sense to remove it from\n" -"your keyring." -msgstr "Ez az alrs nem rvnyes. rtelmetlen eltvoltani a kulcskarikrl." - -#: 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 alrs, amely sszekti a felhasznlazonostt\n" -"a kulccsal. ltalban nem j tlet egy ilyen alrst eltvoltani.\n" -"Az is lehetsges, hogy a GnuPG tbb nem tudja hasznlni ezt\n" -"a kulcsot. Csak akkor tegye ezt, ha valami okbl ez az nalrs nem\n" -"rvnyes, s rendelkezsre ll egy msik!" - -#: 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 "" -"Lecserli az sszes felhasznlazonosthoz (vagy csak a kijelltekhez)\n" -"tartoz preferencikat az aktulis preferencikra. Minden rintett\n" -"nalrs idpontjt egy msodperccel nveli.\n" - -#: g10/helptext.c:230 -msgid "Please enter the passhrase; this is a secret sentence \n" -msgstr "Krem, adja meg a jelszt! Ezt egy titkos mondat. \n" - -#: g10/helptext.c:236 -msgid "Please repeat the last passphrase, so you are sure what you typed in." -msgstr "Krem, ismtelje meg az elz jelszt ellenrzskppen!" - -#: g10/helptext.c:240 -msgid "Give the name of the file to which the signature applies" -msgstr "Adja meg az llomny nevt, melyhez az alrs tartozik!" - -#: g10/helptext.c:245 -msgid "Answer \"yes\" if it is okay to overwrite the file" -msgstr "Vlaszoljon \"igen\"-nel, ha fellrhat az llomny!" - -#: 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 "" -"Krem, adjon meg egy j fjlnevet! Ha RETURN-t/ENTER-t nyom, akkor\n" -"a szgletes zrjelben lev alaprtelmezett nevet hasznlom." - -#: 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 "" -"Ajnlatos megadni a visszavons okt. A helyzettl fggen vlasszon\n" -"a kvetkez listbl:\n" -" \"A kulcs kompromittldott.\"\n" -" Hasznlja ezt akkor, ha oka van azt hinni, hogy titkos kulcsa\n" -" illetktelen kezekbe kerlt!\n" -" \"A kulcsot lecserltk.\"\n" -" Hasznlja ezt akkor, ha a kulcsot lecserlte egy jabbra!\n" -" \"A kulcs mr nem hasznlatos.\"\n" -" Hasznlja ezt akkor, ha mr nem hasznlja a kulcsot!\n" -" \"A felhasznlazonost mr nem rvnyes.\"\n" -" Hasznlja ezt akkor, ha azt lltja, hogy a felhasznlazonost\n" -" mr nem hasznlatos! ltalban rvnytelen e-mail cmet 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 szveget, melyben megindokolja, hogy mirt\n" -"adta ki ezt a visszavon igazolst. Krem, fogalmazzon tmren!\n" -"Egy res sor jelzi a szveg vgt.\n" - -#: g10/helptext.c:287 -msgid "No help available" -msgstr "Nem ll rendelkezsre segtsg." - -#: g10/helptext.c:295 -#, c-format -msgid "No help available for `%s'" -msgstr "Nem ll rendelkezsre segtsg \"%s\" tmhoz." - -#: 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 adatbzis frisstse" - -#: g10/import.c:102 -#, fuzzy -msgid "create a public key when importing a secret key" -msgstr "A nyilvnos 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 "hasznlhatatlan titkos kulcs" - -#: g10/import.c:108 -msgid "remove as much as possible from key after import" -msgstr "" - -#: g10/import.c:266 -#, c-format -msgid "skipping block of type %d\n" -msgstr "%d tpus blokkot kihagyom.\n" - -#: g10/import.c:275 -#, fuzzy, c-format -msgid "%lu keys processed so far\n" -msgstr "Eddig %lu kulcsot dolgoztam fel.\n" - -#: g10/import.c:292 -#, c-format -msgid "Total number processed: %lu\n" -msgstr " sszesen feldolgoztam: %lu\n" - -#: g10/import.c:294 -#, c-format -msgid " skipped new keys: %lu\n" -msgstr " j kulcsok kihagyva: %lu\n" - -#: g10/import.c:297 -#, c-format -msgid " w/o user IDs: %lu\n" -msgstr " felh. azonost nlkl: %lu\n" - -#: g10/import.c:299 -#, c-format -msgid " imported: %lu" -msgstr " importlva: %lu" - -#: g10/import.c:305 -#, c-format -msgid " unchanged: %lu\n" -msgstr " vltozatlan: %lu\n" - -#: g10/import.c:307 -#, c-format -msgid " new user IDs: %lu\n" -msgstr " j felh. azonostk: %lu\n" - -#: g10/import.c:309 -#, c-format -msgid " new subkeys: %lu\n" -msgstr " j alkulcsok: %lu\n" - -#: g10/import.c:311 -#, c-format -msgid " new signatures: %lu\n" -msgstr " j alrsok: %lu\n" - -#: g10/import.c:313 -#, c-format -msgid " new key revocations: %lu\n" -msgstr " j kulcsvisszavonsok: %lu\n" - -#: g10/import.c:315 -#, c-format -msgid " secret keys read: %lu\n" -msgstr " olvasott titkos kulcsok: %lu\n" - -#: g10/import.c:317 -#, c-format -msgid " secret keys imported: %lu\n" -msgstr " importlt titkos kulcsok: %lu\n" - -#: g10/import.c:319 -#, c-format -msgid " secret keys unchanged: %lu\n" -msgstr "vltozatlan titkos kulcsok: %lu\n" - -#: g10/import.c:321 -#, c-format -msgid " not imported: %lu\n" -msgstr " nem importlt: %lu\n" - -#: g10/import.c:323 -#, fuzzy, c-format -msgid " signatures cleaned: %lu\n" -msgstr " j alrsok: %lu\n" - -#: g10/import.c:325 -#, fuzzy, c-format -msgid " user IDs cleaned: %lu\n" -msgstr " olvasott titkos kulcsok: %lu\n" - -#: g10/import.c:566 -#, 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:570 -#, fuzzy -msgid " algorithms on these user IDs:\n" -msgstr "n alrta a kvetkez felhasznlazonostkat:\n" - -#: g10/import.c:607 -#, c-format -msgid " \"%s\": preference for cipher algorithm %s\n" -msgstr "" - -#: g10/import.c:619 -#, fuzzy, c-format -msgid " \"%s\": preference for digest algorithm %s\n" -msgstr "%s alrs, %s kivonatol algoritmus.\n" - -#: g10/import.c:631 -#, c-format -msgid " \"%s\": preference for compression algorithm %s\n" -msgstr "" - -#: g10/import.c:644 -msgid "it is strongly suggested that you update your preferences and\n" -msgstr "" - -#: g10/import.c:646 -msgid "re-distribute this key to avoid potential algorithm mismatch problems\n" -msgstr "" - -#: g10/import.c:670 -#, c-format -msgid "you can update your preferences with: gpg --edit-key %s updpref save\n" -msgstr "" - -#: g10/import.c:720 g10/import.c:1118 -#, fuzzy, c-format -msgid "key %s: no user ID\n" -msgstr "%08lX kulcs: Nincs felhasznli azonost.\n" - -#: g10/import.c:749 -#, fuzzy, c-format -msgid "key %s: PKS subkey corruption repaired\n" -msgstr "%08lX kulcs: HKP alkulcssrls kijavtva.\n" - -#: g10/import.c:764 -#, fuzzy, c-format -msgid "key %s: accepted non self-signed user ID \"%s\"\n" -msgstr "%08lX kulcs: Nem nalrt felh. azonost (\"%s\") elfogadva.\n" - -#: g10/import.c:770 -#, fuzzy, c-format -msgid "key %s: no valid user IDs\n" -msgstr "%08lX kulcs: Nincs rvnyes felhasznli azonost.\n" - -#: g10/import.c:772 -msgid "this may be caused by a missing self-signature\n" -msgstr "Ezt okozhatja egy hinyz nalrs.\n" - -#: g10/import.c:782 g10/import.c:1240 -#, fuzzy, c-format -msgid "key %s: public key not found: %s\n" -msgstr "%08lX kulcs: Nyilvnos kulcs nem tallhat: %s\n" - -#: g10/import.c:788 -#, fuzzy, c-format -msgid "key %s: new key - skipped\n" -msgstr "%08lX kulcs: j kulcs - kihagytam.\n" - -#: g10/import.c:797 -#, c-format -msgid "no writable keyring found: %s\n" -msgstr "Nem rhat kulcskarikt talltam: %s\n" - -#: g10/import.c:802 g10/openfile.c:267 g10/sign.c:831 g10/sign.c:1135 -#, c-format -msgid "writing to `%s'\n" -msgstr "rok a \"%s\" llomnyba.\n" - -#: g10/import.c:806 g10/import.c:901 g10/import.c:1158 g10/import.c:1301 -#: g10/import.c:2363 g10/import.c:2385 -#, c-format -msgid "error writing keyring `%s': %s\n" -msgstr "Hiba a \"%s\" kulcskarika rsakor: %s\n" - -#: g10/import.c:825 -#, fuzzy, c-format -msgid "key %s: public key \"%s\" imported\n" -msgstr "%08lX kulcs: \"%s\" nyilvnos kulcs importlva.\n" - -#: g10/import.c:849 -#, fuzzy, c-format -msgid "key %s: doesn't match our copy\n" -msgstr "%08lX kulcs: Nem egyezik a mi msolatunkkal!\n" - -#: g10/import.c:866 g10/import.c:1258 -#, fuzzy, c-format -msgid "key %s: can't locate original keyblock: %s\n" -msgstr "%08lX kulcs: Nem tallom az eredeti kulcsblokkot: %s\n" - -#: g10/import.c:874 g10/import.c:1265 -#, 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:911 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new user ID\n" -msgstr "%08lX kulcs: \"%s\" 1 j felhasznli azonost.\n" - -#: g10/import.c:914 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new user IDs\n" -msgstr "%08lX kulcs: \"%s\" %d j felhasznli azonost.\n" - -#: g10/import.c:917 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new signature\n" -msgstr "%08lX kulcs: \"%s\" 1 j alrs.\n" - -#: g10/import.c:920 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new signatures\n" -msgstr "%08lX kulcs: \"%s\" %d j alrs.\n" - -#: g10/import.c:923 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new subkey\n" -msgstr "%08lX kulcs: \"%s\" 1 j alkulcs.\n" - -#: g10/import.c:926 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new subkeys\n" -msgstr "%08lX kulcs: \"%s\" %d j alkulcs.\n" - -#: g10/import.c:929 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signature cleaned\n" -msgstr "%08lX kulcs: \"%s\" %d j alrs.\n" - -#: g10/import.c:932 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signatures cleaned\n" -msgstr "%08lX kulcs: \"%s\" %d j alrs.\n" - -#: g10/import.c:935 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d user ID cleaned\n" -msgstr "%08lX kulcs: \"%s\" %d j felhasznli azonost.\n" - -#: g10/import.c:938 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d user IDs cleaned\n" -msgstr "%08lX kulcs: \"%s\" %d j felhasznli azonost.\n" - -#: g10/import.c:961 -#, fuzzy, c-format -msgid "key %s: \"%s\" not changed\n" -msgstr "%08lX kulcs: \"%s\" nem vltozott.\n" - -#: g10/import.c:1124 -#, fuzzy, c-format -msgid "key %s: secret key with invalid cipher %d - skipped\n" -msgstr "" -"%08lX kulcs: Titkos kulcs rvnytelen (%d) rejtjelezvel - kihagytam.\n" - -#: g10/import.c:1135 -#, fuzzy -msgid "importing secret keys not allowed\n" -msgstr "rom a titkos kulcsot a %s llomnyba.\n" - -#: g10/import.c:1152 g10/import.c:2378 -#, c-format -msgid "no default secret keyring: %s\n" -msgstr "Nincs alaprtelmezett titkoskulcs-karika: %s\n" - -#: g10/import.c:1163 -#, fuzzy, c-format -msgid "key %s: secret key imported\n" -msgstr "%08lX kulcs: Titkos kulcs importlva.\n" - -#: g10/import.c:1193 -#, fuzzy, c-format -msgid "key %s: already in secret keyring\n" -msgstr "%08lX kulcs: Mr szerepel a titkoskulcs-karikn.\n" - -#: g10/import.c:1203 -#, fuzzy, c-format -msgid "key %s: secret key not found: %s\n" -msgstr "%08lX kulcs: Titkos kulcs nem tallhat: %s\n" - -#: g10/import.c:1233 -#, fuzzy, c-format -msgid "key %s: no public key - can't apply revocation certificate\n" -msgstr "%08lX kulcs: Nincs nyilvnos kulcs - nem tudok visszavonni.\n" - -#: g10/import.c:1276 -#, fuzzy, c-format -msgid "key %s: invalid revocation certificate: %s - rejected\n" -msgstr "%08lX kulcs: rvnytelen visszavon igazols: %s - visszautastva.\n" - -#: g10/import.c:1308 -#, fuzzy, c-format -msgid "key %s: \"%s\" revocation certificate imported\n" -msgstr "%08lX kulcs: \"%s\" visszavon igazolst importltam.\n" - -#: g10/import.c:1374 -#, fuzzy, c-format -msgid "key %s: no user ID for signature\n" -msgstr "%08lX kulcs: Nincs felhasznli azonost ehhez az alrshoz!\n" - -#: g10/import.c:1389 -#, fuzzy, c-format -msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n" -msgstr "" -"%08lX kulcs: Nem tmogatott nyilvnos kulcs alg. a \"%s\" felh. " -"azonostn!\n" - -#: g10/import.c:1391 -#, fuzzy, c-format -msgid "key %s: invalid self-signature on user ID \"%s\"\n" -msgstr "%08lX kulcs: rvnytelen nalrs a \"%s\" felh. azonostn!\n" - -#: g10/import.c:1409 -#, fuzzy, c-format -msgid "key %s: no subkey for key binding\n" -msgstr "%08lX kulcs: Nincs alkulcs a kulcsktshez!\n" - -#: g10/import.c:1420 g10/import.c:1470 -#, fuzzy, c-format -msgid "key %s: unsupported public key algorithm\n" -msgstr "%08lX kulcs: Nem tmogatott nyilvnos kulcs algoritmus!\n" - -#: g10/import.c:1422 -#, fuzzy, c-format -msgid "key %s: invalid subkey binding\n" -msgstr "%08lX kulcs: rvnytelen alkulcskts!\n" - -#: g10/import.c:1437 -#, fuzzy, c-format -msgid "key %s: removed multiple subkey binding\n" -msgstr "%08lX kulcs: Eltvoltottam a tbbszrs alkulcsktst.\n" - -#: g10/import.c:1459 -#, fuzzy, c-format -msgid "key %s: no subkey for key revocation\n" -msgstr "%08lX kulcs: Nincs alkulcs a kulcsvisszavonshoz.\n" - -#: g10/import.c:1472 -#, fuzzy, c-format -msgid "key %s: invalid subkey revocation\n" -msgstr "%08lX kulcs: rvnytelen alkulcsvisszavons.\n" - -#: g10/import.c:1487 -#, fuzzy, c-format -msgid "key %s: removed multiple subkey revocation\n" -msgstr "%08lX kulcs: Eltvoltottam a tbbszrs alkulcsvisszavonst.\n" - -#: g10/import.c:1529 -#, fuzzy, c-format -msgid "key %s: skipped user ID \"%s\"\n" -msgstr "%08lX kulcs: Kihagytam a felh. azonostt: '" - -#: g10/import.c:1550 -#, fuzzy, c-format -msgid "key %s: skipped subkey\n" -msgstr "%08lX kulcs: Alkulcsot kihagytam.\n" - -#: g10/import.c:1577 -#, fuzzy, c-format -msgid "key %s: non exportable signature (class 0x%02X) - skipped\n" -msgstr "%08lX kulcs: Nem exportlhat alrs (%02x. osztly) - kihagytam.\n" - -#: g10/import.c:1587 -#, fuzzy, c-format -msgid "key %s: revocation certificate at wrong place - skipped\n" -msgstr "%08lX kulcs: Visszavon igazols rossz helyen - kihagytam.\n" - -#: g10/import.c:1604 -#, fuzzy, c-format -msgid "key %s: invalid revocation certificate: %s - skipped\n" -msgstr "%08lX kulcs: rvnytelen visszavon igazols: %s - kihagytam.\n" - -#: g10/import.c:1618 -#, fuzzy, c-format -msgid "key %s: subkey signature in wrong place - skipped\n" -msgstr "%08lX kulcs: Alkulcsalrs rossz helyen - kihagytam.\n" - -#: g10/import.c:1626 -#, fuzzy, c-format -msgid "key %s: unexpected signature class (0x%02X) - skipped\n" -msgstr "%08lX kulcs: Vratlan alrsosztly (0x%02X) - kihagytam.\n" - -#: g10/import.c:1726 -#, fuzzy, c-format -msgid "key %s: duplicated user ID detected - merged\n" -msgstr "%08lX kulcs: Duplzott felh. azonostt talltam - sszefztem.\n" - -#: g10/import.c:1788 -#, fuzzy, c-format -msgid "WARNING: key %s may be revoked: fetching revocation key %s\n" -msgstr "" -"FIGYELEM: %08lX kulcsot visszavonhattk:\n" -"lehvom a %08lX visszavon kulcsot.\n" - -#: g10/import.c:1802 -#, fuzzy, c-format -msgid "WARNING: key %s may be revoked: revocation key %s not present.\n" -msgstr "" -"FIGYELEM: %08lX kulcsot visszavonhattk:\n" -"visszavon kulcs (%08lX) nincs jelen.\n" - -#: g10/import.c:1861 -#, fuzzy, c-format -msgid "key %s: \"%s\" revocation certificate added\n" -msgstr "%08lX kulcs: \"%s\" visszavon igazolst hozzadtam.\n" - -#: g10/import.c:1895 -#, fuzzy, c-format -msgid "key %s: direct key signature added\n" -msgstr "%08lX kulcs: Kulcsalrst hozzadtam.\n" - -#: g10/import.c:2284 -#, fuzzy -msgid "NOTE: a key's S/N does not match the card's one\n" -msgstr "A nyilvnos kulcs nem passzol a titkos kulcshoz!\n" - -#: g10/import.c:2292 -#, fuzzy -msgid "NOTE: primary key is online and stored on card\n" -msgstr "Kihagytam: titkos kulcs mr jelen van.\n" - -#: g10/import.c:2294 -#, fuzzy -msgid "NOTE: secondary key is online and stored on card\n" -msgstr "Kihagytam: titkos kulcs mr jelen van.\n" - -#: g10/keydb.c:168 -#, c-format -msgid "error creating keyring `%s': %s\n" -msgstr "Hiba a(z) \"%s\" kulcskarika ltrehozsakor: %s\n" - -#: g10/keydb.c:175 -#, c-format -msgid "keyring `%s' created\n" -msgstr "\"%s\" kulcskarikt ltrehoztam.\n" - -#: g10/keydb.c:316 g10/keydb.c:319 -#, fuzzy, c-format -msgid "keyblock resource `%s': %s\n" -msgstr "Hiba \"%s\" ltrehozsakor: %s\n" - -#: g10/keydb.c:698 -#, c-format -msgid "failed to rebuild keyring cache: %s\n" -msgstr "Nem tudtam jrapteni a kulcskarika cache-t: %s\n" - -#: g10/keyedit.c:266 -msgid "[revocation]" -msgstr "[visszavons]" - -#: g10/keyedit.c:267 -msgid "[self-signature]" -msgstr "[nalrs]" - -#: g10/keyedit.c:345 g10/keylist.c:390 -msgid "1 bad signature\n" -msgstr "1 rossz alrs.\n" - -#: g10/keyedit.c:347 g10/keylist.c:392 -#, c-format -msgid "%d bad signatures\n" -msgstr "%d rossz alrs.\n" - -#: g10/keyedit.c:349 g10/keylist.c:394 -msgid "1 signature not checked due to a missing key\n" -msgstr "1 alrst nem ellenriztem hinyz 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 alrst nem ellenriztem hinyz kulcs miatt.\n" - -#: g10/keyedit.c:353 g10/keylist.c:398 -msgid "1 signature not checked due to an error\n" -msgstr "1 alrst nem ellenriztem hiba miatt.\n" - -#: g10/keyedit.c:355 g10/keylist.c:400 -#, c-format -msgid "%d signatures not checked due to errors\n" -msgstr "%d alrst nem ellenriztem hiba miatt.\n" - -#: g10/keyedit.c:357 -msgid "1 user ID without valid self-signature detected\n" -msgstr "1 felhasznlazonostt talltam rvnyes nalrs nlkl.\n" - -#: g10/keyedit.c:359 -#, c-format -msgid "%d user IDs without valid self-signatures detected\n" -msgstr "%d felhasznlazonostt talltam rvnyes nalrs nlkl.\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 "" -"Krem, dntse el, hogy mennyire bzik meg ebben a felhasznlban,\n" -"hogy megfelelen ellenrzi msok kulcsait (tlevelek ellenrzsvel,\n" -"klnbz forrsbl szrmaz digitlis ujjlenyomatokkal...)!\n" -"\n" - -#: g10/keyedit.c:419 g10/pkclist.c:275 -#, fuzzy, c-format -msgid " %d = I trust marginally\n" -msgstr " %d = rszlegesen megbzom benne\n" - -#: g10/keyedit.c:420 g10/pkclist.c:277 -#, fuzzy, c-format -msgid " %d = I trust fully\n" -msgstr " %d = teljesen megbzom 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\" felhasznli azonostt visszavontk." - -#: 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 tovbbra 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 alrni.\n" - -#: g10/keyedit.c:627 -#, c-format -msgid "User ID \"%s\" is expired." -msgstr "\"%s\" felhasznli azonost lejrt." - -#: g10/keyedit.c:655 -#, c-format -msgid "User ID \"%s\" is not self-signed." -msgstr "\"%s\" felhasznlazonostn nincs nalrs." - -#: g10/keyedit.c:683 -#, fuzzy, c-format -msgid "User ID \"%s\" is signable. " -msgstr "\"%s\" felhasznlazonostn nincs nalrs." - -#: g10/keyedit.c:685 -#, fuzzy -msgid "Sign it? (y/N) " -msgstr "Valban alrja? " - -#: g10/keyedit.c:707 -#, c-format -msgid "" -"The self-signature on \"%s\"\n" -"is a PGP 2.x-style signature.\n" -msgstr "" -"\"%s\" nalrsa\n" -"PGP 2.x stlus.\n" - -#: g10/keyedit.c:716 -msgid "Do you want to promote it to an OpenPGP self-signature? (y/N) " -msgstr "Szeretn talaktani OpenPGP nalrss? (i/N) " - -#: g10/keyedit.c:730 -#, c-format -msgid "" -"Your current signature on \"%s\"\n" -"has expired.\n" -msgstr "" -"Az n jelenlegi alrsa a(z) \"%s\"\n" -"kulcson lejrt.\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 alrst, amellyel lecserli a lejrtat? (i/N) " - -#: g10/keyedit.c:755 -#, c-format -msgid "" -"Your current signature on \"%s\"\n" -"is a local signature.\n" -msgstr "" -"Az n jelenlegi alrsa a(z) \"%s\"\n" -"kulcson helyi alrs.\n" - -#: g10/keyedit.c:759 -msgid "Do you want to promote it to a full exportable signature? (y/N) " -msgstr "Szeretn talaktani teljes, exportlhat alrss? (i/N) " - -#: g10/keyedit.c:780 -#, fuzzy, c-format -msgid "\"%s\" was already locally signed by key %s\n" -msgstr "\"%s\" mr 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\" mr al lett rva a %08lX kulccsal!\n" - -#: g10/keyedit.c:788 -msgid "Do you want to sign it again anyway? (y/N) " -msgstr "Mg egyszer al akarja rni? (i/N) " - -#: g10/keyedit.c:810 -#, fuzzy, c-format -msgid "Nothing to sign with key %s\n" -msgstr "Nincs mit alrni a %08lX kulccsal!\n" - -#: g10/keyedit.c:825 -msgid "This key has expired!" -msgstr "Ez a kulcs lejrt!" - -#: g10/keyedit.c:843 -#, c-format -msgid "This key is due to expire on %s.\n" -msgstr "Ez a kulcs lejr: %s.\n" - -#: g10/keyedit.c:849 -msgid "Do you want your signature to expire at the same time? (Y/n) " -msgstr "Szeretn, ha az alrsa ugyanekkor jrna 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 alrst egy PGP 2.x kulcsra --pgp2 mdban.\n" - -#: g10/keyedit.c:891 -msgid "This would make the key unusable in PGP 2.x.\n" -msgstr "Ez hasznlhatatlann 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 ellenrizte, hogy a kulcs, melyet alrni kszl, valban\n" -"a fent nevezett szemlyhez tartozik? Ha nem tudja a vlaszt, rjon \"0\"-t!\n" - -#: g10/keyedit.c:921 -#, c-format -msgid " (0) I will not answer.%s\n" -msgstr " (0) Nem vlaszolok.%s\n" - -#: g10/keyedit.c:923 -#, c-format -msgid " (1) I have not checked at all.%s\n" -msgstr " (1) Egyltaln nem ellenriztem.%s\n" - -#: g10/keyedit.c:925 -#, c-format -msgid " (2) I have done casual checking.%s\n" -msgstr " (2) A szoksos ellenrzseket vgeztem.%s\n" - -#: g10/keyedit.c:927 -#, c-format -msgid " (3) I have done very careful checking.%s\n" -msgstr " (3) Nagyon alaposan ellenriztem.%s\n" - -#: g10/keyedit.c:933 -#, fuzzy -msgid "Your selection? (enter `?' for more information): " -msgstr "Mi a vlasza? (Adjon meg \"?\"-et magyarzathoz!): " - -#: 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 kulcsval: \"" - -#: g10/keyedit.c:964 -#, fuzzy -msgid "This will be a self-signature.\n" -msgstr "" -"\n" -"Ez egy nalrs lesz.\n" - -#: g10/keyedit.c:970 -#, fuzzy -msgid "WARNING: the signature will not be marked as non-exportable.\n" -msgstr "" -"\n" -"FIGYELEM: Az alrs nem lesz \"nem exportlhatknt\" megjellve.\n" - -#: g10/keyedit.c:978 -#, fuzzy -msgid "WARNING: the signature will not be marked as non-revocable.\n" -msgstr "" -"\n" -"FIGYELEM: Az alrs nem lesz \"nem visszavonhatknt\" megjellve.\n" - -#: g10/keyedit.c:988 -#, fuzzy -msgid "The signature will be marked as non-exportable.\n" -msgstr "" -"\n" -"Az alrst \"nem exportlhatnak\" jelljk.\n" - -#: g10/keyedit.c:995 -#, fuzzy -msgid "The signature will be marked as non-revocable.\n" -msgstr "" -"\n" -"Az alrst \"nem visszavonhatnak\" jelljk.\n" - -#: g10/keyedit.c:1002 -#, fuzzy -msgid "I have not checked this key at all.\n" -msgstr "" -"\n" -"Egyltaln nem ellenriztem ezt a kulcsot.\n" - -#: g10/keyedit.c:1007 -#, fuzzy -msgid "I have checked this key casually.\n" -msgstr "" -"\n" -"A szoksos mdon ellenriztem ezt a kulcsot.\n" - -#: g10/keyedit.c:1012 -#, fuzzy -msgid "I have checked this key very carefully.\n" -msgstr "" -"\n" -"Nagyon gondosan ellenriztem ezt a kulcsot.\n" - -#: g10/keyedit.c:1022 -#, fuzzy -msgid "Really sign? (y/N) " -msgstr "Valban alrja? " - -#: g10/keyedit.c:1067 g10/keyedit.c:4783 g10/keyedit.c:4874 g10/keyedit.c:4938 -#: g10/keyedit.c:4999 g10/sign.c:352 -#, c-format -msgid "signing failed: %s\n" -msgstr "Alrs 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 vdett.\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 elsdleges kulcs titkos rszei nem elrhetk.\n" - -#: g10/keyedit.c:1151 g10/keygen.c:3202 -#, fuzzy -msgid "Secret parts of primary key are stored on-card.\n" -msgstr "Az elsdleges kulcs titkos rszei nem elrhetk.\n" - -#: g10/keyedit.c:1155 g10/keygen.c:3206 -msgid "Key is protected.\n" -msgstr "A kulcs vdett.\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 jelszt ehhez a titkos kulcshoz!\n" -"\n" - -#: g10/keyedit.c:1194 g10/keygen.c:1897 -msgid "passphrase not correctly repeated; try again" -msgstr "Nem ismtelte meg helyesen a jelszt! Prblja jra!" - -#: g10/keyedit.c:1199 -msgid "" -"You don't want a passphrase - this is probably a *bad* idea!\n" -"\n" -msgstr "" -"n nem akar jelszt. Ez valsznleg *rossz* tlet!\n" -"\n" - -#: g10/keyedit.c:1202 -#, fuzzy -msgid "Do you really want to do this? (y/N) " -msgstr "Valban ezt akarja? " - -#: g10/keyedit.c:1273 -msgid "moving a key signature to the correct place\n" -msgstr "trakom a kulcsalrst a megfelel helyre.\n" - -#: g10/keyedit.c:1359 -msgid "save and quit" -msgstr "ments s kilps" - -#: g10/keyedit.c:1362 -#, fuzzy -msgid "show key fingerprint" -msgstr "megmutatja az ujjlenyomatot" - -#: g10/keyedit.c:1363 -msgid "list key and user IDs" -msgstr "kilistzza a kulcs- s felhasznlazonostkat" - -#: g10/keyedit.c:1365 -msgid "select user ID N" -msgstr "N. felhasznli azonost kivlasztsa" - -#: g10/keyedit.c:1366 -#, fuzzy -msgid "select subkey N" -msgstr "N. felhasznli azonost kivlasztsa" - -#: g10/keyedit.c:1367 -#, fuzzy -msgid "check signatures" -msgstr "alrsok visszavonsa" - -#: 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 alrsa" - -#: g10/keyedit.c:1379 -#, fuzzy -msgid "sign selected user IDs with a trust signature" -msgstr "Javaslat: Vlassza ki az alrni kvnt felhasznlazonostkat!\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 "felhasznli azonost hozzadsa" - -#: g10/keyedit.c:1387 -msgid "add a photo ID" -msgstr "fotazonost hozzadsa" - -#: g10/keyedit.c:1389 -#, fuzzy -msgid "delete selected user IDs" -msgstr "felhasznli azonost trlse" - -#: 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 "msodlagos kulcs trlse" - -#: g10/keyedit.c:1408 -msgid "add a revocation key" -msgstr "visszavon kulcs hozzadsa" - -#: g10/keyedit.c:1410 -#, fuzzy -msgid "delete signatures from the selected user IDs" -msgstr "Valban frissti a kijellt felhasznlazonostk preferenciit? " - -#: g10/keyedit.c:1412 -#, fuzzy -msgid "change the expiration date for the key or selected subkeys" -msgstr "Nem vltoztathatja meg egy v3 kulcs lejrati dtumt!\n" - -#: g10/keyedit.c:1414 -#, fuzzy -msgid "flag the selected user ID as primary" -msgstr "felhasznlazonost megjellse elsdlegesknt" - -#: g10/keyedit.c:1416 -#, fuzzy -msgid "toggle between the secret and public key listings" -msgstr "vlts a titkos s a nyilvnos kulcs listzsa kztt" - -#: g10/keyedit.c:1419 -msgid "list preferences (expert)" -msgstr "preferencik listzsa (szakrt)" - -#: g10/keyedit.c:1421 -msgid "list preferences (verbose)" -msgstr "preferencik listzsa (rszletes)" - -#: g10/keyedit.c:1423 -#, fuzzy -msgid "set preference list for the selected user IDs" -msgstr "Valban frissti a kijellt felhasznlazonostk preferenciit? " - -#: 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 "Valban frissti a kijellt felhasznlazonostk preferenciit? " - -#: g10/keyedit.c:1432 -msgid "change the passphrase" -msgstr "jelszvltoztats" - -#: g10/keyedit.c:1436 -msgid "change the ownertrust" -msgstr "kulcstulajdonos megbzhatsgnak belltsa" - -#: g10/keyedit.c:1438 -#, fuzzy -msgid "revoke signatures on the selected user IDs" -msgstr "Valban visszavonja az sszes kijellt felhasznlazonostt? " - -#: g10/keyedit.c:1440 -#, fuzzy -msgid "revoke selected user IDs" -msgstr "felhasznli azonost visszavonsa" - -#: g10/keyedit.c:1445 -#, fuzzy -msgid "revoke key or selected subkeys" -msgstr "msodlagos kulcs visszavonsa" - -#: g10/keyedit.c:1446 -#, fuzzy -msgid "enable key" -msgstr "kulcs engedlyezse" - -#: g10/keyedit.c:1447 -#, fuzzy -msgid "disable key" -msgstr "kulcs tiltsa" - -#: g10/keyedit.c:1448 -#, fuzzy -msgid "show selected photo IDs" -msgstr "fotazonost megmutatsa" - -#: 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 olvassakor: %s.\n" - -#: g10/keyedit.c:1588 -msgid "Secret key is available.\n" -msgstr "Titkos kulcs rendelkezsre ll.\n" - -#: g10/keyedit.c:1669 -msgid "Need the secret key to do this.\n" -msgstr "Ehhez szksg van a titkos kulcsra.\n" - -#: g10/keyedit.c:1677 -msgid "Please use the command \"toggle\" first.\n" -msgstr "Krem, hasznlja elbb 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 visszavontk." - -#: g10/keyedit.c:1755 -#, fuzzy -msgid "Really sign all user IDs? (y/N) " -msgstr "Valban alrja az sszes felhasznlazonostt? " - -#: g10/keyedit.c:1762 -msgid "Hint: Select the user IDs to sign\n" -msgstr "Javaslat: Vlassza ki az alrni kvnt felhasznlazonostkat!\n" - -#: g10/keyedit.c:1771 -#, fuzzy, c-format -msgid "Unknown signature type `%s'\n" -msgstr "ismeretlen alrsosztly" - -#: g10/keyedit.c:1794 -#, c-format -msgid "This command is not allowed while in %s mode.\n" -msgstr "Ez a parancs %s mdban nem engedlyezett.\n" - -#: g10/keyedit.c:1816 g10/keyedit.c:1836 g10/keyedit.c:2002 -msgid "You must select at least one user ID.\n" -msgstr "Legalbb egy felhasznlazonostt ki kell vlasztania!\n" - -#: g10/keyedit.c:1818 -msgid "You can't delete the last user ID!\n" -msgstr "Nem trlheti az utols felhasznlazonostt!\n" - -#: g10/keyedit.c:1820 -#, fuzzy -msgid "Really remove all selected user IDs? (y/N) " -msgstr "Valban eltvoltja az sszes kijellt felhasznlazonostt? " - -#: g10/keyedit.c:1821 -#, fuzzy -msgid "Really remove this user ID? (y/N) " -msgstr "Valban eltvoltja ezt a felhasznlazonostt? " - -#: g10/keyedit.c:1871 -#, fuzzy -msgid "Really move the primary key? (y/N) " -msgstr "Valban eltvoltja ezt a felhasznlazonostt? " - -#: g10/keyedit.c:1883 -#, fuzzy -msgid "You must select exactly one key.\n" -msgstr "Legalbb egy kulcsot ki kell vlasztania!\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\" llomnyt: %s.\n" - -#: g10/keyedit.c:1942 -#, fuzzy, c-format -msgid "Error reading backup key from `%s': %s\n" -msgstr "Hiba a(z) \"%s\" kulcskarika ltrehozsakor: %s\n" - -#: g10/keyedit.c:1966 -msgid "You must select at least one key.\n" -msgstr "Legalbb egy kulcsot ki kell vlasztania!\n" - -#: g10/keyedit.c:1969 -#, fuzzy -msgid "Do you really want to delete the selected keys? (y/N) " -msgstr "Valban trli a kivlasztott kulcsokat? " - -#: g10/keyedit.c:1970 -#, fuzzy -msgid "Do you really want to delete this key? (y/N) " -msgstr "Valban trli ezt a kulcsot? " - -#: g10/keyedit.c:2005 -#, fuzzy -msgid "Really revoke all selected user IDs? (y/N) " -msgstr "Valban visszavonja az sszes kijellt felhasznlazonostt? " - -#: g10/keyedit.c:2006 -#, fuzzy -msgid "Really revoke this user ID? (y/N) " -msgstr "Valban visszavonja ezt a felhasznlazonostt? " - -#: g10/keyedit.c:2024 -#, fuzzy -msgid "Do you really want to revoke the entire key? (y/N) " -msgstr "Valban visszavonja ezt a kulcsot? " - -#: g10/keyedit.c:2035 -#, fuzzy -msgid "Do you really want to revoke the selected subkeys? (y/N) " -msgstr "Valban visszavonja a kijellt kulcsokat? " - -#: g10/keyedit.c:2037 -#, fuzzy -msgid "Do you really want to revoke this subkey? (y/N) " -msgstr "Valban 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 belltsa" - -#: g10/keyedit.c:2135 -#, fuzzy -msgid "Really update the preferences for the selected user IDs? (y/N) " -msgstr "Valban frissti a kijellt felhasznlazonostk preferenciit? " - -#: g10/keyedit.c:2137 -#, fuzzy -msgid "Really update the preferences? (y/N) " -msgstr "Valban frisstsem a preferencikat? " - -#: g10/keyedit.c:2205 -#, fuzzy -msgid "Save changes? (y/N) " -msgstr "Mentsem a vltoztatsokat? " - -#: g10/keyedit.c:2208 -#, fuzzy -msgid "Quit without saving? (y/N) " -msgstr "Kilpjek ments nlkl? " - -#: g10/keyedit.c:2218 -#, c-format -msgid "update failed: %s\n" -msgstr "Frissts sikertelen: %s.\n" - -#: g10/keyedit.c:2225 -#, c-format -msgid "update secret failed: %s\n" -msgstr "Titkoskulcs-blokk frisstse sikertelen: %s\n" - -#: g10/keyedit.c:2232 -msgid "Key not changed so no update needed.\n" -msgstr "A kulcs nem vltozott, nincs szksg frisstsre.\n" - -#: g10/keyedit.c:2333 -msgid "Digest: " -msgstr "Kivonat: " - -#: g10/keyedit.c:2385 -msgid "Features: " -msgstr "Jellemzk: " - -#: 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 "Jells: " - -#: g10/keyedit.c:2630 -msgid "There are no preferences on a PGP 2.x-style user ID.\n" -msgstr "Nincsenek preferencik egy PGP 2.x felhasznlazonostn!\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 kvetkez %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 kvetkez %s kulcs visszavonhatja: " - -#: g10/keyedit.c:2716 -#, fuzzy -msgid "(sensitive)" -msgstr " (rzkeny)" - -#: 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 ltre: %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 " [lejr: %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 " [lejr: %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 "" -"Krem, vegye figyelembe, hogy az itt lthat kulcs rvnyessge nem\n" -"felttlenl helyes, amg jra nem indtja 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 kijellt elsdleges felhasznlazonost. Ez a parancs\n" -" azt okozhatja, hogy egy msik azonost lesz elsdlegesknt hasznlva.\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 stlus kulcs. Fotazonost hozzadsa azt " -"okozhatja,\n" -" hogy a PGP egyes verzii visszautastjk ezt a kulcsot.\n" - -#: g10/keyedit.c:3016 g10/keyedit.c:3346 -msgid "Are you sure you still want to add it? (y/N) " -msgstr "Tovbbra 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 fotazonostt egy PGP2 stlus kulcshoz!\n" - -#: g10/keyedit.c:3162 -msgid "Delete this good signature? (y/N/q)" -msgstr "Trli ezt a j alrst? (i/N/k)" - -#: g10/keyedit.c:3172 -msgid "Delete this invalid signature? (y/N/q)" -msgstr "Trli ezt az rvnytelen alrst? (i/N/k)" - -#: g10/keyedit.c:3176 -msgid "Delete this unknown signature? (y/N/q)" -msgstr "Trli ezt az ismeretlen alrst? (i/N/k)" - -#: g10/keyedit.c:3182 -msgid "Really delete this self-signature? (y/N)" -msgstr "Valban trli ezt az nalrst? (i/N)" - -#: g10/keyedit.c:3196 -#, c-format -msgid "Deleted %d signature.\n" -msgstr "Trltem %d alrst.\n" - -#: g10/keyedit.c:3197 -#, c-format -msgid "Deleted %d signatures.\n" -msgstr "Trltem %d alrst.\n" - -#: g10/keyedit.c:3200 -msgid "Nothing deleted.\n" -msgstr "Nem trltem semmit.\n" - -#: g10/keyedit.c:3233 g10/trustdb.c:1703 -#, fuzzy -msgid "invalid" -msgstr "rvnytelen pncl" - -#: g10/keyedit.c:3249 -#, fuzzy, c-format -msgid "User ID \"%s\": already clean\n" -msgstr "\"%s\" felhasznli azonostt mr visszavontk.\n" - -#: g10/keyedit.c:3341 -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 stlus kulcs. Kijellt visszavon hozzadsa\n" -" azt okozhatja, hogy egyes PGP verzik visszautastjk ezt a " -"kulcsot!\n" - -#: g10/keyedit.c:3352 -msgid "You may not add a designated revoker to a PGP 2.x-style key.\n" -msgstr "" -"Lehet, hogy nem adhat kijellt visszavont egy PGP 2.x-stlus kulcshoz.\n" - -#: g10/keyedit.c:3372 -msgid "Enter the user ID of the designated revoker: " -msgstr "rja be a kijellt visszavon felhasznlazonostjt: " - -#: g10/keyedit.c:3397 -msgid "cannot appoint a PGP 2.x style key as a designated revoker\n" -msgstr "Nem adhat meg PGP 2.x stlus kulcsot kijellt visszavonnak!\n" - -#: g10/keyedit.c:3412 -msgid "you cannot appoint a key as its own designated revoker\n" -msgstr "Nem adhat meg egy kulcsot sajt kijellt visszavonjnak!\n" - -#: g10/keyedit.c:3434 -#, fuzzy -msgid "this key has already been designated as a revoker\n" -msgstr "FIGYELEM: Ezt a kulcsot a kijellt visszavon visszavonta!\n" - -#: g10/keyedit.c:3453 -msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n" -msgstr "" -"FIGYELEM: A kijellt visszavon kulcs megadsa nem csinlhat vissza!\n" - -#: g10/keyedit.c:3459 -#, fuzzy -msgid "" -"Are you sure you want to appoint this key as a designated revoker? (y/N) " -msgstr "Biztosan ez a kulcs legyen a kijellt visszavon? (i/N): " - -#: g10/keyedit.c:3520 -msgid "Please remove selections from the secret keys.\n" -msgstr "Krem, tvoltsa el a kijellseket a titkos kulcsokrl!\n" - -#: g10/keyedit.c:3526 -#, fuzzy -msgid "Please select at most one subkey.\n" -msgstr "Maximum egy msodlagos kulcsot jelljn ki, krem!\n" - -#: g10/keyedit.c:3530 -#, fuzzy -msgid "Changing expiration time for a subkey.\n" -msgstr "Msodlagos kulcs lejrati idejnek vltoztatsa.\n" - -#: g10/keyedit.c:3533 -msgid "Changing expiration time for the primary key.\n" -msgstr "Elsdleges kulcs lejrati idejnek vltoztatsa.\n" - -#: g10/keyedit.c:3579 -msgid "You can't change the expiration date of a v3 key\n" -msgstr "Nem vltoztathatja meg egy v3 kulcs lejrati dtumt!\n" - -#: g10/keyedit.c:3595 -msgid "No corresponding signature in secret ring\n" -msgstr "Nincs megfelel alrs a titkoskulcs-karikn.\n" - -#: g10/keyedit.c:3668 -#, fuzzy, c-format -msgid "signing subkey %s is already cross-certified\n" -msgstr "FIGYELEM: %08lX alr alkulcs nem kereszthitelestett.\n" - -#: g10/keyedit.c:3674 -#, c-format -msgid "subkey %s does not sign and so does not need to be cross-certified\n" -msgstr "" - -#: g10/keyedit.c:3836 -msgid "Please select exactly one user ID.\n" -msgstr "Krem, vlasszon ki pontosan egy felhasznlazonostt!\n" - -#: g10/keyedit.c:3875 g10/keyedit.c:3985 g10/keyedit.c:4105 g10/keyedit.c:4246 -#, fuzzy, c-format -msgid "skipping v3 self-signature on user ID \"%s\"\n" -msgstr "Kihagyom a v3 nalrst a \"%s\" felhasznlazonostn.\n" - -#: g10/keyedit.c:4046 -msgid "Enter your preferred keyserver URL: " -msgstr "" - -#: g10/keyedit.c:4126 -#, fuzzy -msgid "Are you sure you want to replace it? (y/N) " -msgstr "Biztos abban, hogy hasznlni akarja (i/N)? " - -#: g10/keyedit.c:4127 -#, fuzzy -msgid "Are you sure you want to delete it? (y/N) " -msgstr "Biztos abban, hogy hasznlni akarja (i/N)? " - -#: g10/keyedit.c:4189 -#, fuzzy -msgid "Enter the notation: " -msgstr "Alrs-jells: " - -#: g10/keyedit.c:4338 -#, fuzzy -msgid "Proceed? (y/N) " -msgstr "Fellrjam (i/N)? " - -#: g10/keyedit.c:4402 -#, c-format -msgid "No user ID with index %d\n" -msgstr "Nincs %d index felhasznlazonost!\n" - -#: g10/keyedit.c:4460 -#, fuzzy, c-format -msgid "No user ID with hash %s\n" -msgstr "Nincs %d index felhasznlazonost!\n" - -#: g10/keyedit.c:4487 -#, fuzzy, c-format -msgid "No subkey with index %d\n" -msgstr "Nincs %d index felhasznlazonost!\n" - -#: g10/keyedit.c:4622 -#, fuzzy, c-format -msgid "user ID: \"%s\"\n" -msgstr "Felhasznlazonost: \"" - -#: g10/keyedit.c:4625 g10/keyedit.c:4689 g10/keyedit.c:4732 -#, fuzzy, c-format -msgid "signed by your key %s on %s%s%s\n" -msgstr " alrva %08lX ltal %s%s%s idpontban.\n" - -#: g10/keyedit.c:4627 g10/keyedit.c:4691 g10/keyedit.c:4734 -msgid " (non-exportable)" -msgstr " (nem exportlhat)" - -#: g10/keyedit.c:4631 -#, c-format -msgid "This signature expired on %s.\n" -msgstr "Ez az alrs lejrt %s idpontban.\n" - -#: g10/keyedit.c:4635 -msgid "Are you sure you still want to revoke it? (y/N) " -msgstr "Biztos benne, hogy mgis visszavonja? (i/N) " - -#: g10/keyedit.c:4639 -msgid "Create a revocation certificate for this signature? (y/N) " -msgstr "Csinljunk egy visszavon igazolst ehhez az alrshoz? (i/N) " - -#: g10/keyedit.c:4666 -#, fuzzy, c-format -msgid "You have signed these user IDs on key %s:\n" -msgstr "n alrta a kvetkez felhasznlazonostkat:\n" - -#: g10/keyedit.c:4692 -#, fuzzy -msgid " (non-revocable)" -msgstr " (nem exportlhat)" - -#: g10/keyedit.c:4699 -#, fuzzy, c-format -msgid "revoked by your key %s on %s\n" -msgstr " visszavonva %08lX ltal %s idpontban.\n" - -#: g10/keyedit.c:4721 -msgid "You are about to revoke these signatures:\n" -msgstr "A kvetkez alrsokat fogja visszavonni:\n" - -#: g10/keyedit.c:4741 -msgid "Really create the revocation certificates? (y/N) " -msgstr "Valban ltrehozzam a visszavon igazolst? (i/N) " - -#: g10/keyedit.c:4771 -msgid "no secret key\n" -msgstr "Nincs titkos kulcs.\n" - -#: g10/keyedit.c:4841 -#, c-format -msgid "user ID \"%s\" is already revoked\n" -msgstr "\"%s\" felhasznli azonostt mr visszavontk.\n" - -#: g10/keyedit.c:4858 -#, c-format -msgid "WARNING: a user ID signature is dated %d seconds in the future\n" -msgstr "" -"FIGYELEM: A felhasznlazonostt %d msodperccel a jvben rtk al.\n" - -#: g10/keyedit.c:4922 -#, fuzzy, c-format -msgid "Key %s is already revoked.\n" -msgstr "\"%s\" felhasznli azonostt mr visszavontk.\n" - -#: g10/keyedit.c:4984 -#, fuzzy, c-format -msgid "Subkey %s is already revoked.\n" -msgstr "\"%s\" felhasznli azonostt mr visszavontk.\n" - -#: g10/keyedit.c:5079 -#, fuzzy, c-format -msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n" -msgstr "%s fotazonost (mret: %ld, kulcs: 0x%08lX, felh: %d) mutatsa.\n" - -#: g10/keygen.c:262 -#, fuzzy, c-format -msgid "preference `%s' duplicated\n" -msgstr "%c%lu preferencia ktszer szerepel!\n" - -#: g10/keygen.c:269 -#, fuzzy -msgid "too many cipher preferences\n" -msgstr "Tl sok \"%c\" preferencia.\n" - -#: g10/keygen.c:271 -#, fuzzy -msgid "too many digest preferences\n" -msgstr "Tl sok \"%c\" preferencia.\n" - -#: g10/keygen.c:273 -#, fuzzy -msgid "too many compression preferences\n" -msgstr "Tl sok \"%c\" preferencia.\n" - -#: g10/keygen.c:398 -#, fuzzy, c-format -msgid "invalid item `%s' in preference string\n" -msgstr "rvnytelen karakter a preferencik kztt!\n" - -#: g10/keygen.c:872 -msgid "writing direct signature\n" -msgstr "Sima alrst rok.\n" - -#: g10/keygen.c:911 -msgid "writing self signature\n" -msgstr "nalrst rok.\n" - -#: g10/keygen.c:961 -msgid "writing key binding signature\n" -msgstr "sszefz alrst 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 "Kulcsmret rvnytelen; %u bitet hasznlok.\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 "Kulcsmretet felkerektettem %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 titkostsa" - -#: 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 titkosts)\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 "Krem, adja meg, milyen kulcsot kvn:\n" - -#: g10/keygen.c:1435 -#, fuzzy, c-format -msgid " (%d) DSA and Elgamal (default)\n" -msgstr " (%d) DSA s ElGamal (alaprtelmezs)\n" - -#: g10/keygen.c:1436 -#, c-format -msgid " (%d) DSA (sign only)\n" -msgstr " (%d) DSA (csak alrs)\n" - -#: g10/keygen.c:1438 -#, fuzzy, c-format -msgid " (%d) DSA (set your own capabilities)\n" -msgstr " (%d) RSA (csak titkosts)\n" - -#: g10/keygen.c:1440 -#, fuzzy, c-format -msgid " (%d) Elgamal (encrypt only)\n" -msgstr " (%d) ElGamal (csak titkosts)\n" - -#: g10/keygen.c:1441 -#, c-format -msgid " (%d) RSA (sign only)\n" -msgstr " (%d) RSA (csak alrs)\n" - -#: g10/keygen.c:1443 -#, c-format -msgid " (%d) RSA (encrypt only)\n" -msgstr " (%d) RSA (csak titkosts)\n" - -#: g10/keygen.c:1445 -#, fuzzy, c-format -msgid " (%d) RSA (set your own capabilities)\n" -msgstr " (%d) RSA (csak titkosts)\n" - -#: g10/keygen.c:1514 -#, fuzzy, c-format -msgid "DSA keypair will have %u bits.\n" -msgstr "A DSA kulcspr 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 kulcsmretet 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 kvnt kulcsmret %u bit.\n" - -#: g10/keygen.c:1556 g10/keygen.c:1561 -#, c-format -msgid "rounded up to %u bits\n" -msgstr "Felkerektve %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 "" -"Krem, adja meg, meddig legyen rvnyes a kulcs!\n" -" 0 = a kulcs soha nem jr le\n" -" <n> = a kulcs n napig rvnyes\n" -" <n>w = a kulcs n htig rvnyes\n" -" <n>m = a kulcs n hnapig rvnyes\n" -" <n>y = a kulcs n vig rvnyes\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 "" -"Krem, adja meg, meddig legyen rvnyes az alrs!\n" -" 0 = az alrs soha nem jr le\n" -" <n> = az alrs n napig rvnyes\n" -" <n>w = az alrs n htig rvnyes\n" -" <n>m = az alrs n hnapig rvnyes\n" -" <n>y = az alrs n vig rvnyes\n" - -#: g10/keygen.c:1644 -msgid "Key is valid for? (0) " -msgstr "Meddig rvnyes a kulcs? (0) " - -#: g10/keygen.c:1649 -#, fuzzy, c-format -msgid "Signature is valid for? (%s) " -msgstr "Meddig rvnyes az alrs? (0) " - -#: g10/keygen.c:1667 -msgid "invalid value\n" -msgstr "rvnytelen rtk!\n" - -#: g10/keygen.c:1674 -#, fuzzy -msgid "Key does not expire at all\n" -msgstr "%s soha nem jr le.\n" - -#: g10/keygen.c:1675 -#, fuzzy -msgid "Signature does not expire at all\n" -msgstr "%s soha nem jr le.\n" - -#: g10/keygen.c:1680 -#, fuzzy, c-format -msgid "Key expires at %s\n" -msgstr "%s lejr: %s\n" - -#: g10/keygen.c:1681 -#, fuzzy, c-format -msgid "Signature expires at %s\n" -msgstr "Az alrs lejr: %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 megjelenteni 2038 utni dtumokat.\n" -"Azonban kezelni helyesen tudja ket egszen 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" -"Szksge lesz egy felhasznli azonostra a kulcsa azonostshoz;\n" -"a szoftver ezt a teljes nvbl, megjegyzsbl s e-mail cmbl lltja\n" -"el a kvetkez formban:\n" -" \"Heinrich Heine (a klt) <heinrichh@duesseldorf.de>\"\n" -"\n" - -#: g10/keygen.c:1728 -msgid "Real name: " -msgstr "Teljes nv: " - -#: g10/keygen.c:1736 -msgid "Invalid character in name\n" -msgstr "rvnytelen karakter a nvben!\n" - -#: g10/keygen.c:1738 -msgid "Name may not start with a digit\n" -msgstr "A nv lehet, hogy nem kezddhet szmmal!\n" - -#: g10/keygen.c:1740 -msgid "Name must be at least 5 characters long\n" -msgstr "A nv legalbb 5 karakter kell legyen!\n" - -#: g10/keygen.c:1748 -msgid "Email address: " -msgstr "E-mail cm: " - -#: g10/keygen.c:1754 -msgid "Not a valid email address\n" -msgstr "Ez nem rvnyes e-mail cm.\n" - -#: g10/keygen.c:1762 -msgid "Comment: " -msgstr "Megjegyzs: " - -#: g10/keygen.c:1768 -msgid "Invalid character in comment\n" -msgstr "rvnytelen karakter a megjegyzsben!\n" - -#: g10/keygen.c:1791 -#, c-format -msgid "You are using the `%s' character set.\n" -msgstr "n a(z) %s karakterkdolst hasznlja.\n" - -#: g10/keygen.c:1797 -#, c-format -msgid "" -"You selected this USER-ID:\n" -" \"%s\"\n" -"\n" -msgstr "" -"n a kvetkez felhasznli azonostt vlasztotta:\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 "Krem, ne rakja az e-mail cmet a teljes nvbe vagy a megjegyzsbe!\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)egjegyzs, (E)-mail megvltoztatsa vagy (K)ilps? " - -#: g10/keygen.c:1829 -msgid "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? " -msgstr "" -"(N)v, (M)egjegyzs, (E)-mail megvltoztatsa vagy (R)endben/(K)ilps? " - -#: g10/keygen.c:1848 -msgid "Please correct the error first\n" -msgstr "Krem, elbb javtsa ki a hibt!\n" - -#: g10/keygen.c:1888 -msgid "" -"You need a Passphrase to protect your secret key.\n" -"\n" -msgstr "" -"Most szksg van egy jelszra (vagy mondatra), amely a titkos kulcst vdi.\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 jelszt. Ez valsznleg egy *rossz* tlet!\n" -"De azrt megcsinlom. Brmikor megvltoztathatja a jelszavt\n" -"az \"--edit-key\" opcival.\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 vletlen bjtra van szksgnk. J tlet, ha csinl valami\n" -"egyb mveletet (gpel a billentyzeten, mozgatja az egeret, hasznlja\n" -"a lemezeket) a prmszm generlsa alatt. Ez segti a vletlenszm-\n" -"genertort, hogy entrpit tudjon gyjteni.\n" - -#: g10/keygen.c:2708 -msgid "Key generation canceled.\n" -msgstr "Kulcs ltrehozsa megszaktva.\n" - -#: g10/keygen.c:2907 g10/keygen.c:3052 -#, c-format -msgid "writing public key to `%s'\n" -msgstr "rom a kulcsot a %s llomnyba.\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 llomnyba.\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 llomnyba.\n" - -#: g10/keygen.c:3041 -#, c-format -msgid "no writable public keyring found: %s\n" -msgstr "Nem rhat nyilvnoskulcs-karikt talltam: %s\n" - -#: g10/keygen.c:3047 -#, c-format -msgid "no writable secret keyring found: %s\n" -msgstr "Nem rhat titkoskulcs-karikt talltam: %s\n" - -#: g10/keygen.c:3065 -#, c-format -msgid "error writing public keyring `%s': %s\n" -msgstr "Hiba a(z) \"%s\" nyilvnoskulcs-karika rsakor: %s.\n" - -#: g10/keygen.c:3072 -#, c-format -msgid "error writing secret keyring `%s': %s\n" -msgstr "Hiba a(z) \"%s\" titkoskulcs-karika rsakor: %s.\n" - -#: g10/keygen.c:3095 -msgid "public and secret key created and signed.\n" -msgstr "A nyilvnos s titkos kulcsokat ltrehoztam s alrtam.\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 hasznlhat titkostsra. Ha egy msodlagos kulcsot\n" -"kvn ilyen clra ltrehozni, azt az \"--edit-key\" parancs segtsgvel\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 "Kulcsgenerls 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 msodperccel a jvben kszlt. (Idugrs vagy raproblma.)\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 msodperccel a jvben kszlt. (Idugrs vagy raproblma.)\n" - -#: g10/keygen.c:3181 g10/keygen.c:3311 -msgid "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n" -msgstr "" -"MEGJEGYZS: Alkulcsok ltrehozsa v3 kulcsokhoz nem OpenPGP-megfelel.\n" - -#: g10/keygen.c:3220 g10/keygen.c:3344 -#, fuzzy -msgid "Really create? (y/N) " -msgstr "Valban ltrehozzam? " - -#: g10/keygen.c:3509 -#, fuzzy, c-format -msgid "storing key onto card failed: %s\n" -msgstr "A kulcsblokk trlse sikertelen: %s.\n" - -#: g10/keygen.c:3556 -#, fuzzy, c-format -msgid "can't create backup file `%s': %s\n" -msgstr "Nem tudom ltrehozni a(z) \"%s\" llomnyt: %s.\n" - -#: g10/keygen.c:3582 -#, fuzzy, c-format -msgid "NOTE: backup of card key saved to `%s'\n" -msgstr "MEGJEGYZS: %08lX titkos kulcs %s-kor lejrt.\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 alrsi eljrsmd: " - -#: g10/keylist.c:267 -msgid "Signature policy: " -msgstr "Alrsi eljrsmd: " - -#: g10/keylist.c:306 -msgid "Critical preferred keyserver: " -msgstr "" - -#: g10/keylist.c:359 -msgid "Critical signature notation: " -msgstr "Kritikus alrs-jells: " - -#: g10/keylist.c:361 -msgid "Signature notation: " -msgstr "Alrs-jells: " - -#: g10/keylist.c:471 -msgid "Keyring" -msgstr "Kulcskarika" - -#: g10/keylist.c:1505 -msgid "Primary key fingerprint:" -msgstr "Elsdlegeskulcs-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 "Elsdlegeskulcs-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 "Pnclozs nem sikerlt: %s\n" - -#: g10/keyring.c:1252 -msgid "WARNING: 2 files with confidential information exists.\n" -msgstr "FIGYELEM: 2 bizalmas informcikat tartalmaz llomny van!\n" - -#: g10/keyring.c:1254 -#, c-format -msgid "%s is the unchanged one\n" -msgstr "%s az eredeti pldny.\n" - -#: g10/keyring.c:1255 -#, c-format -msgid "%s is the new one\n" -msgstr "%s az j pldny.\n" - -#: g10/keyring.c:1256 -msgid "Please fix this possible security flaw\n" -msgstr "Krem, oldja meg ezt a lehetsges biztonsgi problmt!\n" - -#: g10/keyring.c:1376 -#, fuzzy, c-format -msgid "caching keyring `%s'\n" -msgstr "Ellenrzm a(z) \"%s\" kulcskarikt.\n" - -#: g10/keyring.c:1422 -#, fuzzy, c-format -msgid "%lu keys cached so far (%lu signatures)\n" -msgstr "%lu kulcsot ellenriztem (%lu alrssal).\n" - -#: g10/keyring.c:1434 -#, fuzzy, c-format -msgid "%lu keys cached (%lu signatures)\n" -msgstr "%lu kulcsot ellenriztem (%lu alrssal).\n" - -#: g10/keyring.c:1505 -#, c-format -msgid "%s: keyring created\n" -msgstr "%s: Kulcskarikt ltrehoztam.\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 alrsi eljrsmd URL-je rvnytelen!\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\" opcii csak a kvetkez futskor lesznek rvnyesek!\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:1421 -#, fuzzy, c-format -msgid "invalid keyserver protocol (us %d!=handler %d)\n" -msgstr "rvnytelen export opcik!\n" - -#: g10/keyserver.c:906 -#, fuzzy, c-format -msgid "key \"%s\" not found on keyserver\n" -msgstr "\"%s\" kulcs nem tallhat: %s\n" - -#: g10/keyserver.c:908 -#, fuzzy -msgid "key not found on keyserver\n" -msgstr "\"%s\" kulcs nem tallhat: %s\n" - -#: g10/keyserver.c:1145 -#, fuzzy, c-format -msgid "requesting key %s from %s server %s\n" -msgstr "Lekrem a %08lX kulcsot a %s kulcsszerverrl.\n" - -#: g10/keyserver.c:1149 -#, fuzzy, c-format -msgid "requesting key %s from %s\n" -msgstr "Lekrem a %08lX kulcsot a %s kulcsszerverrl.\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:1324 -#, fuzzy, c-format -msgid "sending key %s to %s server %s\n" -msgstr "Keresem \"%s\"-t a %s HKP szerveren.\n" - -#: g10/keyserver.c:1328 -#, fuzzy, c-format -msgid "sending key %s to %s\n" -msgstr "" -"\"\n" -"Alrva az n %08lX kulcsval %s idpontban.\n" - -#: g10/keyserver.c:1371 -#, fuzzy, c-format -msgid "searching for \"%s\" from %s server %s\n" -msgstr "Keresem \"%s\"-t a %s HKP szerveren.\n" - -#: g10/keyserver.c:1374 -#, fuzzy, c-format -msgid "searching for \"%s\" from %s\n" -msgstr "Keresem \"%s\"-t a %s HKP szerveren.\n" - -#: g10/keyserver.c:1381 g10/keyserver.c:1477 -#, fuzzy -msgid "no keyserver action!\n" -msgstr "rvnytelen export opcik!\n" - -#: g10/keyserver.c:1429 -#, c-format -msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n" -msgstr "" - -#: g10/keyserver.c:1438 -msgid "keyserver did not send VERSION\n" -msgstr "" - -#: g10/keyserver.c:1500 g10/keyserver.c:2028 -msgid "no keyserver known (use option --keyserver)\n" -msgstr "" - -#: g10/keyserver.c:1506 -msgid "external keyserver calls are not supported in this build\n" -msgstr "" - -#: g10/keyserver.c:1518 -#, c-format -msgid "no handler for keyserver scheme `%s'\n" -msgstr "" - -#: g10/keyserver.c:1523 -#, c-format -msgid "action `%s' not supported with keyserver scheme `%s'\n" -msgstr "" - -#: g10/keyserver.c:1531 -#, c-format -msgid "%s does not support handler version %d\n" -msgstr "" - -#: g10/keyserver.c:1538 -#, fuzzy -msgid "keyserver timed out\n" -msgstr "kulcsszerverhiba" - -#: g10/keyserver.c:1543 -#, fuzzy -msgid "keyserver internal error\n" -msgstr "kulcsszerverhiba" - -#: g10/keyserver.c:1552 -#, fuzzy, c-format -msgid "keyserver communications error: %s\n" -msgstr "Vtel a kulcsszerverrl sikertelen: %s\n" - -#: g10/keyserver.c:1577 g10/keyserver.c:1611 -#, c-format -msgid "\"%s\" not a key ID: skipping\n" -msgstr "" - -#: g10/keyserver.c:1870 -#, fuzzy, c-format -msgid "WARNING: unable to refresh key %s via %s: %s\n" -msgstr "" -"FIGYELEM: Nem tudom trlni az (\"%s\") tmeneti llomnyt: \"%s\": %s.\n" - -#: g10/keyserver.c:1892 -#, fuzzy, c-format -msgid "refreshing 1 key from %s\n" -msgstr "Lekrem a %08lX kulcsot a %s kulcsszerverrl.\n" - -#: g10/keyserver.c:1894 -#, fuzzy, c-format -msgid "refreshing %d keys from %s\n" -msgstr "Lekrem a %08lX kulcsot a %s kulcsszerverrl.\n" - -#: g10/keyserver.c:1950 -#, fuzzy, c-format -msgid "WARNING: unable to fetch URI %s: %s\n" -msgstr "" -"FIGYELEM: Nem tudom trlni az (\"%s\") tmeneti llomnyt: \"%s\": %s.\n" - -#: g10/keyserver.c:1956 -#, fuzzy, c-format -msgid "WARNING: unable to parse URI %s\n" -msgstr "" -"FIGYELEM: Nem tudom trlni az (\"%s\") tmeneti llomnyt: \"%s\": %s.\n" - -#: g10/mainproc.c:240 -#, c-format -msgid "weird size for an encrypted session key (%d)\n" -msgstr "Furcsa mret (%d) titkostott munkafolyamatkulcs.\n" - -#: g10/mainproc.c:291 -#, c-format -msgid "%s encrypted session key\n" -msgstr "%s titkostott munkafolyamatkulcs\n" - -#: g10/mainproc.c:301 -#, fuzzy, c-format -msgid "passphrase generated with unknown digest algorithm %d\n" -msgstr "Ismeretlen algoritmussal (%d) titkostva.\n" - -#: g10/mainproc.c:382 -#, fuzzy, c-format -msgid "public key is %s\n" -msgstr "Nyilvnos kulcs: %08lX\n" - -#: g10/mainproc.c:439 -msgid "public key encrypted data: good DEK\n" -msgstr "Nyilvnos kulccsal titkostott adat: j DEK.\n" - -#: g10/mainproc.c:472 -#, fuzzy, c-format -msgid "encrypted with %u-bit %s key, ID %s, created %s\n" -msgstr "Titkostva %u bites %s kulccsal, azonost: %08lX, ltrehozva: %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 "Titkostva %s kulccsal, azonost: %08lX\n" - -#: g10/mainproc.c:494 -#, c-format -msgid "public key decryption failed: %s\n" -msgstr "Nyilvnos kulcs visszafejts sikertelen: %s\n" - -#: g10/mainproc.c:508 -#, c-format -msgid "encrypted with %lu passphrases\n" -msgstr "%lu jelszval rejtjelezve\n" - -#: g10/mainproc.c:510 -msgid "encrypted with 1 passphrase\n" -msgstr "1 jelszval rejtjelezve\n" - -#: g10/mainproc.c:541 g10/mainproc.c:563 -#, c-format -msgid "assuming %s encrypted data\n" -msgstr "%s titkostott adatot felttelezek.\n" - -#: g10/mainproc.c:549 -#, c-format -msgid "IDEA cipher unavailable, optimistically attempting to use %s instead\n" -msgstr "" -"IDEA rejtjelez nem ll rendelkezsre, optimista mdon megprblok\n" -"%s-t hasznlni helyette.\n" - -#: g10/mainproc.c:581 -msgid "decryption okay\n" -msgstr "Visszafejts rendben.\n" - -#: g10/mainproc.c:585 -msgid "WARNING: message was not integrity protected\n" -msgstr "FIGYELEM: Az zenetet nem lttk el integritsvdelemmel.\n" - -#: g10/mainproc.c:598 -msgid "WARNING: encrypted message has been manipulated!\n" -msgstr "FIGYELEM: A titkostott zenetet manipulltk!\n" - -#: g10/mainproc.c:604 -#, c-format -msgid "decryption failed: %s\n" -msgstr "Visszafejts sikertelen: %s.\n" - -#: g10/mainproc.c:623 -msgid "NOTE: sender requested \"for-your-eyes-only\"\n" -msgstr "MEGJEGYZS: A felad krse: \"csak az n szemeinek\".\n" - -#: g10/mainproc.c:625 -#, c-format -msgid "original file name='%.*s'\n" -msgstr "Eredeti fjlnv: '%.*s'.\n" - -#: g10/mainproc.c:817 -msgid "standalone revocation - use \"gpg --import\" to apply\n" -msgstr "" -"Klnll visszavons. Hasznlja a \"gpg --import\"-ot az alkalmazshoz!\n" - -#: g10/mainproc.c:1165 -#, fuzzy -msgid "no signature found\n" -msgstr "J alrs a kvetkeztl: \"" - -#: g10/mainproc.c:1408 -msgid "signature verification suppressed\n" -msgstr "Alrs-ellenrzs elnyomva.\n" - -#: g10/mainproc.c:1508 -#, fuzzy -msgid "can't handle this ambiguous signature data\n" -msgstr "Nem tudom kezelni ezeket a tbbszrs alrsokat!\n" - -#: g10/mainproc.c:1519 -#, fuzzy, c-format -msgid "Signature made %s\n" -msgstr "Az alrs lejrt: %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 "Alrva: %.*s; kulcs: %s, %08lX.\n" - -#: g10/mainproc.c:1544 -msgid "Key available at: " -msgstr "Kulcs tallhat: " - -#: g10/mainproc.c:1677 g10/mainproc.c:1725 -#, fuzzy, c-format -msgid "BAD signature from \"%s\"" -msgstr "ROSSZ alrs a kvetkeztl: \"" - -#: g10/mainproc.c:1679 g10/mainproc.c:1727 -#, fuzzy, c-format -msgid "Expired signature from \"%s\"" -msgstr "Lejrt alrs a kvetkeztl: \"" - -#: g10/mainproc.c:1681 g10/mainproc.c:1729 -#, fuzzy, c-format -msgid "Good signature from \"%s\"" -msgstr "J alrs a kvetkeztl: \"" - -#: 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 alrs lejrt: %s.\n" - -#: g10/mainproc.c:1868 -#, c-format -msgid "Signature expires %s\n" -msgstr "Az alrs lejr: %s.\n" - -#: g10/mainproc.c:1871 -#, c-format -msgid "%s signature, digest algorithm %s\n" -msgstr "%s alrs, %s kivonatol algoritmus.\n" - -#: g10/mainproc.c:1872 -msgid "binary" -msgstr "Binris" - -#: g10/mainproc.c:1873 -msgid "textmode" -msgstr "Szvegmd" - -#: g10/mainproc.c:1873 g10/trustdb.c:531 -msgid "unknown" -msgstr "Ismeretlen md" - -#: g10/mainproc.c:1893 -#, c-format -msgid "Can't check signature: %s\n" -msgstr "Nem tudom ellenrizni az alrst: %s.\n" - -#: g10/mainproc.c:1962 g10/mainproc.c:1978 g10/mainproc.c:2064 -msgid "not a detached signature\n" -msgstr "Nem klnll alrs.\n" - -#: g10/mainproc.c:2005 -msgid "" -"WARNING: multiple signatures detected. Only the first will be checked.\n" -msgstr "FIGYELEM: Tbbszrs alrst rzkeltem. Csak az elst ellenrzm.\n" - -#: g10/mainproc.c:2013 -#, c-format -msgid "standalone signature of class 0x%02x\n" -msgstr "0x%02x osztly klnll alrs.\n" - -#: g10/mainproc.c:2070 -msgid "old style (PGP 2.x) signature\n" -msgstr "Rgi stlus (PGP 2.x) alrs.\n" - -#: g10/mainproc.c:2080 -msgid "invalid root packet detected in proc_tree()\n" -msgstr "rvnytelen gykrcsomagot talltam a proc_tree() fggvnyben!\n" - -#: g10/misc.c:122 -#, c-format -msgid "can't disable core dumps: %s\n" -msgstr "Nem tudom letiltani a core fjlokat: %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 llomnyt: %s.\n" - -#: g10/misc.c:207 -#, fuzzy, c-format -msgid "fstat(%d) failed in %s: %s\n" -msgstr "Bizalmi adatbzis: olvass 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. szm nyilvnos kulcs algoritmust!\n" - -#: g10/misc.c:331 -#, fuzzy, c-format -msgid "WARNING: using experimental cipher algorithm %s\n" -msgstr "nem megvalstott rejtjelez algoritmus" - -#: g10/misc.c:346 -#, fuzzy, c-format -msgid "WARNING: using experimental digest algorithm %s\n" -msgstr "%s alrs, %s kivonatol algoritmus.\n" - -#: g10/misc.c:351 -#, fuzzy, c-format -msgid "WARNING: digest algorithm %s is deprecated\n" -msgstr "" -"%s (%d) kivonatol algoritmus hasznlatnak erltetse ellenttes\n" -"a cmzett preferenciival.\n" - -#: g10/misc.c:447 -msgid "the IDEA cipher plugin is not present\n" -msgstr "Az IDEA rejtjelez bvts 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 = tovbbi informcikat krek\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 "Krem, ezt hasznlja 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 "tmrtetlen" - -#: g10/misc.c:732 -#, fuzzy -msgid "uncompressed|none" -msgstr "tmrtetlen" - -#: g10/misc.c:842 -#, c-format -msgid "this message may not be usable by %s\n" -msgstr "Lehet, hogy ez az zenet hasznlhatatlan a %s szmra!\n" - -#: g10/misc.c:1017 -#, fuzzy, c-format -msgid "ambiguous option `%s'\n" -msgstr "Az opcikat a \"%s\" llomnybl olvasom.\n" - -#: g10/misc.c:1042 -#, fuzzy, c-format -msgid "unknown option `%s'\n" -msgstr "Ismeretlen alaprtelmezett cmzett: \"%s\"\n" - -#: g10/openfile.c:86 -#, c-format -msgid "File `%s' exists. " -msgstr "\"%s\" llomny ltezik. " - -#: g10/openfile.c:90 -#, fuzzy -msgid "Overwrite? (y/N) " -msgstr "Fellrjam (i/N)? " - -#: g10/openfile.c:123 -#, c-format -msgid "%s: unknown suffix\n" -msgstr "%s: ismeretlen vgzds.\n" - -#: g10/openfile.c:145 -msgid "Enter new filename" -msgstr "rja be az j llomnynevet" - -#: g10/openfile.c:190 -msgid "writing to stdout\n" -msgstr "rok a szabvnyos kimenetre.\n" - -#: g10/openfile.c:305 -#, c-format -msgid "assuming signed data in `%s'\n" -msgstr "Azt felttelezem, hogy az alrt adat a %s llomnyban van.\n" - -#: g10/openfile.c:384 -#, c-format -msgid "new configuration file `%s' created\n" -msgstr "\"%s\" j konfigurcis llomnyt ltrehoztam.\n" - -#: g10/openfile.c:386 -#, c-format -msgid "WARNING: options in `%s' are not yet active during this run\n" -msgstr "" -"FIGYELEM: \"%s\" opcii csak a kvetkez futskor lesznek rvnyesek!\n" - -#: g10/openfile.c:418 -#, fuzzy, c-format -msgid "directory `%s' created\n" -msgstr "%s: Knyvtrat ltrehoztam.\n" - -#: g10/parse-packet.c:138 -#, c-format -msgid "can't handle public key algorithm %d\n" -msgstr "Nem tudom kezelni a(z) %d. szm nyilvnos 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 biztonsgos!\n" - -#: g10/parse-packet.c:1157 -#, c-format -msgid "subpacket of type %d has critical bit set\n" -msgstr "A %d tpus alcsomag kritikus bitje belltott.\n" - -#: g10/passphrase.c:310 -msgid "gpg-agent is not available in this session\n" -msgstr "GPG gynk nem elrhet ebben a munkafolyamatban.\n" - -#: g10/passphrase.c:326 -msgid "malformed GPG_AGENT_INFO environment variable\n" -msgstr "Nem megfelel formj GPG_AGENT_INFO krnyezeti vltoz!\n" - -#: g10/passphrase.c:345 -#, c-format -msgid "gpg-agent protocol version %d is not supported\n" -msgstr "%d gpg-agent protokollverzi nem tmogatott!\n" - -#: g10/passphrase.c:362 -#, c-format -msgid "can't connect to `%s': %s\n" -msgstr "Nem tudok kapcsoldni \"%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 "Problma van az gynkkel. Letiltom a hasznlatt.\n" - -#: g10/passphrase.c:532 g10/passphrase.c:914 -#, fuzzy, c-format -msgid " (main key ID %s)" -msgstr "" -" \n" -" (f kulcsazonost: %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 jelszt, mellyel a kvetkez felhasznl\n" -"titkos kulcsa hasznlatba vehet:\n" -"\"%.*s\"\n" -"%u bites %s key, azonost: %08lX, ltrehozva: %s%s\n" - -#: g10/passphrase.c:571 -msgid "Repeat passphrase\n" -msgstr "Ismtelje meg a jelszt!\n" - -#: g10/passphrase.c:573 -msgid "Enter passphrase\n" -msgstr "rja be a jelszt!\n" - -#: g10/passphrase.c:649 -msgid "cancelled by user\n" -msgstr "A felhasznl megszaktotta a mveletet.\n" - -#: g10/passphrase.c:805 g10/passphrase.c:968 -#, fuzzy -msgid "can't query passphrase in batch mode\n" -msgstr "Nem tudok jelszt bekrni ktegelt mdban!\n" - -#: g10/passphrase.c:812 g10/passphrase.c:973 -msgid "Enter passphrase: " -msgstr "rja be a jelszt: " - -#: g10/passphrase.c:895 -#, fuzzy, c-format -msgid "" -"You need a passphrase to unlock the secret key for\n" -"user: \"%s\"\n" -msgstr "" -"\n" -"Jelszra van szksge a kvetkez felhasznl titkos kulcsnak " -"hasznlathoz:\n" -"\"" - -#: g10/passphrase.c:901 -#, fuzzy, c-format -msgid "%u-bit %s key, ID %s, created %s" -msgstr "%u bites %s kulcs, azonost: %08lX, ltrehozva: %s." - -#: g10/passphrase.c:910 -#, c-format -msgid " (subkey on main key ID %s)" -msgstr "" - -#: g10/passphrase.c:977 -msgid "Repeat passphrase: " -msgstr "Ismtelje meg a jelszt: " - -#: 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" -"Vlasszon egy kpet a fotazonostjhoz! A kp JPEG formtum legyen!\n" -"Emlkeztetjk, hogy a kp a nyilvnos kulcsban troldik. Ha nagyon nagy\n" -"kpet hasznl, a kulcsa is nagyon nagy lesz!\n" -"A 240x288 krli kpmret jl hasznlhat.\n" - -#: g10/photoid.c:95 -msgid "Enter JPEG filename for photo ID: " -msgstr "Adja meg egy JPEG fjl nevt a fotazonosthoz: " - -#: g10/photoid.c:116 -#, fuzzy, c-format -msgid "unable to open JPEG file `%s': %s\n" -msgstr "Nem tudom megnyitni az llomnyt: %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 hasznlni akarja (i/N)? " - -#: g10/photoid.c:146 -#, fuzzy, c-format -msgid "`%s' is not a JPEG file\n" -msgstr "\"%s\" nem JPEG llomny.\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 megjelenteni a fotazonostt!\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 lecserltk." - -#: g10/pkclist.c:66 g10/revoke.c:624 -msgid "Key has been compromised" -msgstr "A kulcs kompromittldott." - -#: g10/pkclist.c:68 g10/revoke.c:626 -msgid "Key is no longer used" -msgstr "A kulcs mr nem hasznlatos." - -#: g10/pkclist.c:70 g10/revoke.c:627 -msgid "User ID is no longer valid" -msgstr "A felhasznli azonost mr nem rvnyes." - -#: g10/pkclist.c:74 -msgid "reason for revocation: " -msgstr "Visszavons oka: " - -#: g10/pkclist.c:91 -msgid "revocation comment: " -msgstr "Megjegyzs a visszavonshoz: " - -#: g10/pkclist.c:206 -msgid "iImMqQsS" -msgstr "iIfFkKhH" - -#: g10/pkclist.c:214 -#, fuzzy -msgid "No trust value assigned to:\n" -msgstr "" -"Nincs megbzhatsgi rtk 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 valsznleg 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 bzom benne\n" - -#: g10/pkclist.c:279 -#, fuzzy, c-format -msgid " %d = I trust ultimately\n" -msgstr " %d = alapveten megbzom benne\n" - -#: g10/pkclist.c:285 -#, fuzzy -msgid " m = back to the main menu\n" -msgstr " f = visszatrs a fmenbe\n" - -#: g10/pkclist.c:288 -#, fuzzy -msgid " s = skip this key\n" -msgstr " h = kulcs kihagysa\n" - -#: g10/pkclist.c:289 -#, fuzzy -msgid " q = quit\n" -msgstr " k = kilps\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 vlaszt? " - -#: g10/pkclist.c:320 -#, fuzzy -msgid "Do you really want to set this key to ultimate trust? (y/N) " -msgstr "Tnyleg be akarja lltani ezt a kulcsot alapveten megbzhatra? " - -#: g10/pkclist.c:334 -msgid "Certificates leading to an ultimately trusted key:\n" -msgstr "Alapveten megbzhat kulcshoz vezet igazolsok:\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 valsznleg a jelzett tulajdonoshoz tartozik.\n" - -#: g10/pkclist.c:435 -msgid "This key belongs to us\n" -msgstr "Ez a kulcs hozznk 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 felhasznli azonostban szerepl\n" -"szemlyhez tartozik. Ha n *valban* tudja, hogy mit csinl,\n" -"a kvetkez krdsre vlaszolhat igennel.\n" -"\n" - -#: g10/pkclist.c:468 -#, fuzzy -msgid "Use this key anyway? (y/N) " -msgstr "Mgis hasznljuk ezt a kulcsot? " - -#: g10/pkclist.c:502 -msgid "WARNING: Using untrusted key!\n" -msgstr "FIGYELEM: Nem bzunk a kulcsban, amit hasznlunk!\n" - -#: g10/pkclist.c:509 -msgid "WARNING: this key might be revoked (revocation key not present)\n" -msgstr "FIGYELEM: a kulcsot visszavonhattk (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 kijellt 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 alrs 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 "Megjegyzs: 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 "Megjegyzs: Ez a kulcs lejrt!\n" - -#: g10/pkclist.c:602 -msgid "WARNING: This key is not certified with a trusted signature!\n" -msgstr "FIGYELEM: Ez a kulcs nincs hitelestve megbzhat alrssal!\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 bzunk ebben a kulcsban!\n" - -#: g10/pkclist.c:613 -msgid " The signature is probably a FORGERY.\n" -msgstr " Az alrs valsznleg 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 kellkppen megbzhat alrssal!\n" - -#: g10/pkclist.c:623 -msgid " It is not certain that the signature belongs to the owner.\n" -msgstr " Nem biztos, hogy az alrs 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: nyilvnos kulcs mr szerepel\n" - -#: g10/pkclist.c:885 -msgid "You did not specify a user ID. (you may use \"-r\")\n" -msgstr "" -"Nem adott meg felhasznli azonostt! (Hasznlhatja a \"-r\" opcit.)\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 felhasznli azonostt! res sorral fejezze be: " - -#: g10/pkclist.c:960 -msgid "No such user ID.\n" -msgstr "Nincs ilyen felhasznli azonost.\n" - -#: g10/pkclist.c:969 g10/pkclist.c:1043 -msgid "skipped: public key already set as default recipient\n" -msgstr "" -"Kihagyva: Nyilvnos kulcs mr be lett lltva alaprtelmezett cmzettnek.\n" - -#: g10/pkclist.c:990 -msgid "Public key is disabled.\n" -msgstr "Nyilvnos kulcs nincs engedlyezve.\n" - -#: g10/pkclist.c:999 -msgid "skipped: public key already set\n" -msgstr "Kihagyva: Nyilvnos kulcs mr be lett lltva.\n" - -#: g10/pkclist.c:1034 -#, fuzzy, c-format -msgid "unknown default recipient \"%s\"\n" -msgstr "Ismeretlen alaprtelmezett cmzett: \"%s\"\n" - -#: g10/pkclist.c:1092 -#, c-format -msgid "%s: skipped: public key is disabled\n" -msgstr "%s: Kihagyva: Nyilvnos kulcs nincs engedlyezve.\n" - -#: g10/pkclist.c:1154 -msgid "no valid addressees\n" -msgstr "Nincsenek rvnyes cmzettek!\n" - -#: g10/plaintext.c:91 -msgid "data not saved; use option \"--output\" to save it\n" -msgstr "" -"Az adatot nem mentettem el. Hasznlja az \"--output\" opcit a mentshez!\n" - -#: g10/plaintext.c:135 g10/plaintext.c:140 g10/plaintext.c:158 -#, c-format -msgid "error creating `%s': %s\n" -msgstr "Hiba \"%s\" ltrehozsakor: %s\n" - -#: g10/plaintext.c:452 -msgid "Detached signature.\n" -msgstr "Klnll alrs.\n" - -#: g10/plaintext.c:458 -msgid "Please enter name of data file: " -msgstr "Krem, adja meg az adatllomny nevt: " - -#: g10/plaintext.c:490 -msgid "reading stdin ...\n" -msgstr "Olvasom a szabvnyos bemenetet...\n" - -#: g10/plaintext.c:524 -msgid "no signed data\n" -msgstr "Nincs alrt adat.\n" - -#: g10/plaintext.c:538 -#, c-format -msgid "can't open signed data `%s'\n" -msgstr "Nem tudom megnyitni a(z) \"%s\" alrt adatot!\n" - -#: g10/pubkey-enc.c:104 -#, fuzzy, c-format -msgid "anonymous recipient; trying secret key %s ...\n" -msgstr "Anonim cmzett. A %08lX titkos kulcsot prblom...\n" - -#: g10/pubkey-enc.c:135 -msgid "okay, we are the anonymous recipient.\n" -msgstr "Rendben, mi vagyunk az anonim cmzett.\n" - -#: g10/pubkey-enc.c:223 -msgid "old encoding of the DEK is not supported\n" -msgstr "A DEK rgi kdolsa nem tmogatott.\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 "MEGJEGYZS: %d rejtjelez algoritmus nincs a preferencik kztt.\n" - -#: g10/pubkey-enc.c:302 -#, fuzzy, c-format -msgid "NOTE: secret key %s expired at %s\n" -msgstr "MEGJEGYZS: %08lX titkos kulcs %s-kor lejrt.\n" - -#: g10/pubkey-enc.c:308 -msgid "NOTE: key has been revoked" -msgstr "MEGJEGYZS: A kulcsot visszavontk." - -#: 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 felhasznli azonost.\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 rzkeny visszavon kulcs.)\n" - -#: g10/revoke.c:316 -#, fuzzy -msgid "Create a designated revocation certificate for this key? (y/N) " -msgstr "Csinljunk egy visszavon igazolst ehhez a kulcshoz? " - -#: g10/revoke.c:329 g10/revoke.c:554 -msgid "ASCII armored output forced.\n" -msgstr "ASCII-pnclozott kimenet kivlasztva.\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 igazols ltrehozva.\n" - -#: g10/revoke.c:413 -#, fuzzy, c-format -msgid "no revocation keys found for \"%s\"\n" -msgstr "Nem talltam visszavon kulcsot a kvetkezhz: \"%s\".\n" - -#: g10/revoke.c:471 -#, fuzzy, c-format -msgid "secret key \"%s\" not found: %s\n" -msgstr "\"%s\" titkos kulcs nem tallhat: %s\n" - -#: g10/revoke.c:500 -#, c-format -msgid "no corresponding public key: %s\n" -msgstr "Nincs hozz tartoz nyilvnos kulcs: %s\n" - -#: g10/revoke.c:511 -msgid "public key does not match secret key!\n" -msgstr "A nyilvnos kulcs nem passzol a titkos kulcshoz!\n" - -#: g10/revoke.c:518 -#, fuzzy -msgid "Create a revocation certificate for this key? (y/N) " -msgstr "Csinljunk egy visszavon igazolst ehhez a kulcshoz? " - -#: g10/revoke.c:535 -msgid "unknown protection algorithm\n" -msgstr "Ismeretlen vdelmi algoritmus!\n" - -#: g10/revoke.c:543 -msgid "NOTE: This key is not protected!\n" -msgstr "MEGJEGYZS: Ez a kulcs nem vdett.\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 igazolst ltrehoztam.\n" -"\n" -"Krem, tegye olyan helyre, ahol ms nem fr hozz! Ha valaki megszerzi\n" -"ezt az igazolst, hasznlhatatlann teheti vele az n kulcst. Okos dolog\n" -"kinyomtatni s megrizni ezt az igazolst, arra az esetre, ha az\n" -"adathordoz olvashatatlann vlik. De vigyzat: az n gpnek nyomtatsi\n" -"rendszere is trolhatja az adatot, s msok esetleg hozzfrhetnek ehhez!\n" - -#: g10/revoke.c:635 -msgid "Please select the reason for the revocation:\n" -msgstr "Krem, vlassza ki a visszavons okt:\n" - -#: g10/revoke.c:645 -msgid "Cancel" -msgstr "Mgsem" - -#: g10/revoke.c:647 -#, c-format -msgid "(Probably you want to select %d here)\n" -msgstr "(Valsznleg a(z) %d. lehetsget akarja vlasztani.)\n" - -#: g10/revoke.c:688 -msgid "Enter an optional description; end it with an empty line:\n" -msgstr "Adjon meg egy nem ktelez lerst! res sorral fejezze be:\n" - -#: g10/revoke.c:716 -#, c-format -msgid "Reason for revocation: %s\n" -msgstr "Visszavons oka: %s\n" - -#: g10/revoke.c:718 -msgid "(No description given)\n" -msgstr "(Nincs lers.)\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 kulcsrszek nem llnak rendelkezsre.\n" - -#: g10/seckey-cert.c:61 -#, c-format -msgid "protection algorithm %d%s is not supported\n" -msgstr "%d%s vd algoritmus nem tmogatott.\n" - -#: g10/seckey-cert.c:72 -#, fuzzy, c-format -msgid "protection digest %d is not supported\n" -msgstr "%d%s vd algoritmus nem tmogatott.\n" - -#: g10/seckey-cert.c:266 -msgid "Invalid passphrase; please try again" -msgstr "rvnytelen jelsz. Prblja 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 talltam. Krem, vltoztassa meg ismt a jelszt!\n" - -#: g10/seckey-cert.c:366 -msgid "generating the deprecated 16-bit checksum for secret key protection\n" -msgstr "" -"Elavult, 16 bites ellenrzsszeget hozok ltre titkos kulcs vdelmhez.\n" - -#: g10/seskey.c:54 -msgid "weak key created - retrying\n" -msgstr "Gyenge kulcs jtt ltre. jraprblom.\n" - -#: g10/seskey.c:59 -#, c-format -msgid "cannot avoid weak key for symmetric cipher; tried %d times!\n" -msgstr "" -"Nem tudom elkerlni a gyenge kulcsot a szimmetrikus titkosthoz.\n" -"%d alkalommal prbltam!\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: Alrskivonat-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 alr alkulcs nem kereszthitelestett.\n" - -#: g10/sig-check.c:113 -#, fuzzy, c-format -msgid "WARNING: signing subkey %s has an invalid cross-certification\n" -msgstr "FIGYELEM: %08lX alr alkulcson rvnytelen kereszthitelests 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 nyilvnos kulcs %lu msodperccel jabb az alrsnl!\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 nyilvnos kulcs %lu msodperccel jabb az alrsnl!\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 msodperccel a jvben kszlt. (Idugrs vagy raproblma.)\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 msodperccel a jvben kszlt. (Idugrs vagy raproblma.)\n" - -#: g10/sig-check.c:205 -#, fuzzy, c-format -msgid "NOTE: signature key %s expired %s\n" -msgstr "MEGJEGYZS: Alr kulcs (%08lX) lejrt: %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 alrst felttelezek a %08lX kulcstl 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 alkulcskt alrshoz!\n" - -#: g10/sign.c:85 -msgid "can't put notation data into v3 (PGP 2.x style) signatures\n" -msgstr "Nem tehet jelladatot a v3-as (PGP 2.x stlus) alrsokba!\n" - -#: g10/sign.c:93 -msgid "can't put notation data into v3 (PGP 2.x style) key signatures\n" -msgstr "Nem tehet jelladatot a v3-as (PGP 2.x stlus) kulcsalrsokba!\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 jellsben (tl hossz).\n" -"Kifejts nlkl hasznlom.\n" - -#: g10/sign.c:124 -msgid "can't put a policy URL into v3 (PGP 2.x style) signatures\n" -msgstr "Nem tehet eljrsmd-URL-t a v3-as (PGP 2.x stlus) alrsokba!\n" - -#: g10/sign.c:132 -msgid "can't put a policy URL into v3 key (PGP 2.x style) signatures\n" -msgstr "" -"Nem tehet eljrsmd-URL-t a v3-as (PGP 2.x stlus) kulcsalrsokba!\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 eljrsmd URL-ben (tl " -"hossz).\n" -"Kifejts nlkl hasznlom.\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 eljrsmd URL-ben (tl " -"hossz).\n" -"Kifejts nlkl hasznlom.\n" - -#: g10/sign.c:347 -#, c-format -msgid "checking created signature failed: %s\n" -msgstr "A ltrehozott alrs ellenrzse sikertelen: %s.\n" - -#: g10/sign.c:356 -#, fuzzy, c-format -msgid "%s/%s signature from: \"%s\"\n" -msgstr "%s alrs a kvetkeztl: \"%s\"\n" - -#: g10/sign.c:788 -msgid "you can only detach-sign with PGP 2.x style keys while in --pgp2 mode\n" -msgstr "" -"Klnll alrst PGP 2.x stlus kulcsokkal csak --pgp2 mdban kszthet!\n" - -#: g10/sign.c:862 -#, fuzzy, c-format -msgid "" -"WARNING: forcing digest algorithm %s (%d) violates recipient preferences\n" -msgstr "" -"%s (%d) kivonatol algoritmus hasznlatnak erltetse ellenttes\n" -"a cmzett preferenciival.\n" - -#: g10/sign.c:988 -msgid "signing:" -msgstr "Alrom:" - -#: g10/sign.c:1100 -msgid "you can only clearsign with PGP 2.x style keys while in --pgp2 mode\n" -msgstr "" -"Olvashat szveget PGP 2.x stlus kulccsal csak --pgp2 mdban rhat al!\n" - -#: g10/sign.c:1278 -#, c-format -msgid "%s encryption will be used\n" -msgstr "%s titkostst fogok hasznlni.\n" - -#: g10/skclist.c:127 g10/skclist.c:191 -msgid "key is not flagged as insecure - can't use it with the faked RNG!\n" -msgstr "" -"A kulcs nincs \"nem biztonsgosnak\" jellve,\n" -"nem tudom a ptl vletlenszm-genertorral hasznlni!\n" - -#: g10/skclist.c:158 -#, fuzzy, c-format -msgid "skipped \"%s\": duplicated\n" -msgstr "\"%s\"-t kihagytam: msodpldny.\n" - -#: g10/skclist.c:166 g10/skclist.c:176 g10/skclist.c:185 -#, fuzzy, c-format -msgid "skipped \"%s\": %s\n" -msgstr "Kihagytam \"%s\"-t: %s.\n" - -#: g10/skclist.c:171 -msgid "skipped: secret key already present\n" -msgstr "Kihagytam: titkos kulcs mr jelen van.\n" - -#: g10/skclist.c:186 -#, fuzzy -msgid "this is a PGP generated Elgamal key which is not secure for signatures!" -msgstr "" -"Kihagytam \"%s\"-t: ez egy PGP ltal ltrehozott ElGamal kulcs, amely nem\n" -"biztonsgos alrsokhoz!\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 tpus: rs 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 "" -"# Meghatrozott bizalmi rtkek listja, %s.\n" -"# (Hasznlja a \"gpg --import-ownertrust\" parancsot a visszalltshoz!)\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\" olvassakor: %s\n" - -#: g10/tdbdump.c:160 -#, fuzzy -msgid "line too long" -msgstr "A sor tl hossz!\n" - -#: g10/tdbdump.c:168 -msgid "colon missing" -msgstr "" - -#: g10/tdbdump.c:174 -#, fuzzy -msgid "invalid fingerprint" -msgstr "Hiba: rvnytelen ujjlenyomat.\n" - -#: g10/tdbdump.c:179 -#, fuzzy -msgid "ownertrust value missing" -msgstr "bizalmi rtkek importja" - -#: g10/tdbdump.c:215 -#, fuzzy, c-format -msgid "error finding trust record in `%s': %s\n" -msgstr "Hiba bizalmi rekord keressekor: %s.\n" - -#: g10/tdbdump.c:219 -#, fuzzy, c-format -msgid "read error in `%s': %s\n" -msgstr "Olvassi hiba: %s.\n" - -#: g10/tdbdump.c:228 g10/trustdb.c:381 -#, c-format -msgid "trustdb: sync failed: %s\n" -msgstr "Bizalmi adatbzis: szinkronizci sikertelen: %s.\n" - -#: g10/tdbio.c:129 g10/tdbio.c:1445 -#, c-format -msgid "trustdb rec %lu: lseek failed: %s\n" -msgstr "Bizalmi adatbzis %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 adatbzis %lu. rekord: rs sikertelen (n=%d): %s.\n" - -#: g10/tdbio.c:245 -msgid "trustdb transaction too large\n" -msgstr "Bizalmi adatbzis tranzakcija tl nagy.\n" - -#: g10/tdbio.c:498 -#, fuzzy, c-format -msgid "can't access `%s': %s\n" -msgstr "Nem tudom bezrni a(z) \"%s\" llomnyt: %s.\n" - -#: g10/tdbio.c:513 -#, c-format -msgid "%s: directory does not exist!\n" -msgstr "%s: Knyvtr nem ltezik!\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 ltrehozni a(z) \"%s\" llomnyt: %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 sikerlt verzirekordot ltrehoznom: %s" - -#: g10/tdbio.c:555 -#, c-format -msgid "%s: invalid trustdb created\n" -msgstr "%s: rvnytelen bizalmi adatbzis jtt ltre.\n" - -#: g10/tdbio.c:558 -#, c-format -msgid "%s: trustdb created\n" -msgstr "%s: Bizalmi adatbzis ltrejtt.\n" - -#: g10/tdbio.c:602 -msgid "NOTE: trustdb not writable\n" -msgstr "MEGJEGYZS: Bizalmi adatbzis nem rhat.\n" - -#: g10/tdbio.c:619 -#, c-format -msgid "%s: invalid trustdb\n" -msgstr "%s: rvnytelen bizalmi adatbzis.\n" - -#: g10/tdbio.c:651 -#, c-format -msgid "%s: failed to create hashtable: %s\n" -msgstr "%s: Hashtbla ltrehozsa sikertelen: %s.\n" - -#: g10/tdbio.c:659 -#, c-format -msgid "%s: error updating version record: %s\n" -msgstr "%s: Hiba a verzirekord frisstsekor: %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 verzirekord olvassakor: %s.\n" - -#: g10/tdbio.c:735 -#, c-format -msgid "%s: error writing version record: %s\n" -msgstr "%s: Hiba a verzirekord rsakor: %s.\n" - -#: g10/tdbio.c:1174 -#, c-format -msgid "trustdb: lseek failed: %s\n" -msgstr "Bizalmi adatbzis: lseek sikertelen: %s.\n" - -#: g10/tdbio.c:1182 -#, c-format -msgid "trustdb: read failed (n=%d): %s\n" -msgstr "Bizalmi adatbzis: olvass sikertelen (n=%d): %s.\n" - -#: g10/tdbio.c:1203 -#, c-format -msgid "%s: not a trustdb file\n" -msgstr "%s: Nem bizalmi adatbzis.\n" - -#: g10/tdbio.c:1221 -#, c-format -msgid "%s: version record with recnum %lu\n" -msgstr "%s: Verzirekord, rekordszm: %lu.\n" - -#: g10/tdbio.c:1226 -#, c-format -msgid "%s: invalid file version %d\n" -msgstr "%s: rvnytelen llomnyverzi (%d).\n" - -#: g10/tdbio.c:1411 -#, c-format -msgid "%s: error reading free record: %s\n" -msgstr "%s: Hiba szabad rekord olvassakor: %s.\n" - -#: g10/tdbio.c:1419 -#, c-format -msgid "%s: error writing dir record: %s\n" -msgstr "%s: Hiba knyvtrrekord rsakor: %s.\n" - -#: g10/tdbio.c:1429 -#, c-format -msgid "%s: failed to zero a record: %s\n" -msgstr "%s: Nem sikerlt egy rekord nullzsa: %s.\n" - -#: g10/tdbio.c:1459 -#, c-format -msgid "%s: failed to append a record: %s\n" -msgstr "%s: Nem sikerlt egy rekord hozzadsa: %s.\n" - -#: g10/tdbio.c:1504 -msgid "the trustdb is corrupted; please run \"gpg --fix-trustdb\".\n" -msgstr "Bizalmi adatbzis srlt. Krem, 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 karakternl hosszabb szvegsorokat 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 rvnyes hossz kulcsazonost.\n" - -#: g10/trustdb.c:258 -#, fuzzy, c-format -msgid "key %s: accepted as trusted key\n" -msgstr "%08lX kulcs: Elfogadva megbzhat kulcsknt.\n" - -#: g10/trustdb.c:296 -#, fuzzy, c-format -msgid "key %s occurs more than once in the trustdb\n" -msgstr "A(z) %08lX kulcs egynl tbbszr szerepel a bizalmi adatbzisban.\n" - -#: g10/trustdb.c:311 -#, fuzzy, c-format -msgid "key %s: no public key for trusted key - skipped\n" -msgstr "" -"%08lX kulcs: Nincs nyilvnos kulcs a megbzhat kulcshoz - kihagytam.\n" - -#: g10/trustdb.c:321 -#, fuzzy, c-format -msgid "key %s marked as ultimately trusted\n" -msgstr "A kulcsot alapveten megbzhatnak jelltem.\n" - -#: g10/trustdb.c:345 -#, c-format -msgid "trust record %lu, req type %d: read failed: %s\n" -msgstr "%lu bizalmi rekord, %d krstpus: olvass 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 krt tpus (%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 "[lejrt] " - -#: g10/trustdb.c:513 -#, fuzzy -msgid "[ unknown]" -msgstr "Ismeretlen md" - -#: 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 szksg a bizalmi adatbzis ellenrzsre.\n" - -#: g10/trustdb.c:583 g10/trustdb.c:2352 -#, c-format -msgid "next trustdb check due at %s\n" -msgstr "A bizalmi adatbzis kvetkez ellenrzse: %s.\n" - -#: g10/trustdb.c:592 -#, fuzzy, c-format -msgid "no need for a trustdb check with `%s' trust model\n" -msgstr "Nincs szksg a bizalmi adatbzis ellenrzsre.\n" - -#: g10/trustdb.c:607 -#, fuzzy, c-format -msgid "no need for a trustdb update with `%s' trust model\n" -msgstr "Nincs szksg a bizalmi adatbzis ellenrzsre.\n" - -#: g10/trustdb.c:839 g10/trustdb.c:1277 -#, fuzzy, c-format -msgid "public key %s not found: %s\n" -msgstr "A(z) %08lX nyilvnos kulcsot nem tallom: %s.\n" - -#: g10/trustdb.c:1034 -msgid "please do a --check-trustdb\n" -msgstr "Krem, hajtson vgre egy --check-trustdb parancsot!\n" - -#: g10/trustdb.c:1038 -msgid "checking the trustdb\n" -msgstr "Ellenrzm a bizalmi adatbzist.\n" - -#: g10/trustdb.c:2095 -#, c-format -msgid "%d keys processed (%d validity counts cleared)\n" -msgstr "%d kulcsot feldolgoztam (%d rvnyessgszmllt trltem)\n" - -#: g10/trustdb.c:2160 -msgid "no ultimately trusted keys found\n" -msgstr "Nem talltam alapveten megbzhat kulcsot.\n" - -#: g10/trustdb.c:2174 -#, fuzzy, c-format -msgid "public key of ultimately trusted key %s not found\n" -msgstr "Nem tallom az alapveten megbzhat %08lX kulcs nyilvnos kulcst!\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 tpus: rs 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 ellenrizni az alrst.\n" -"Ne felejtse el, hogy az alrst tartalmaz llomnyt (.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) tl hossz, vagy hinyzik a soremels.\n" - -#: util/errors.c:55 -msgid "general error" -msgstr "ltalnos hiba" - -#: util/errors.c:56 -msgid "unknown packet type" -msgstr "ismeretlen csomagtpus" - -#: util/errors.c:57 -msgid "unknown version" -msgstr "ismeretlen verzi" - -#: util/errors.c:58 -msgid "unknown pubkey algorithm" -msgstr "ismeretlen nyilvnos kulcs algoritmus" - -#: util/errors.c:59 -msgid "unknown digest algorithm" -msgstr "ismeretlen kivonatol algoritmus" - -#: util/errors.c:60 -msgid "bad public key" -msgstr "rossz nyilvnos kulcs" - -#: util/errors.c:61 -msgid "bad secret key" -msgstr "rossz titkos kulcs" - -#: util/errors.c:62 -msgid "bad signature" -msgstr "rossz alrs" - -#: util/errors.c:63 -msgid "checksum error" -msgstr "hibs ellenrzsszeg" - -#: util/errors.c:64 -msgid "bad passphrase" -msgstr "rossz jelsz" - -#: util/errors.c:65 -msgid "public key not found" -msgstr "nyilvnos kulcs nem tallhat" - -#: 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 kulcskarikt" - -#: util/errors.c:68 -msgid "invalid packet" -msgstr "rvnytelen csomag" - -#: util/errors.c:69 -msgid "invalid armor" -msgstr "rvnytelen pncl" - -#: util/errors.c:70 -msgid "no such user id" -msgstr "nincs ilyen felhasznli azonost" - -#: util/errors.c:71 -msgid "secret key not available" -msgstr "titkos kulcs nem ll rendelkezsre" - -#: util/errors.c:72 -msgid "wrong secret key used" -msgstr "rossz titkos kulcs hasznlata" - -#: util/errors.c:73 -msgid "not supported" -msgstr "nem tmogatott" - -#: util/errors.c:74 -msgid "bad key" -msgstr "rossz kulcs" - -#: util/errors.c:75 -msgid "file read error" -msgstr "llomnyolvassi hiba" - -#: util/errors.c:76 -msgid "file write error" -msgstr "llomnyrsi hiba" - -#: util/errors.c:77 -msgid "unknown compress algorithm" -msgstr "ismeretlen tmrt algoritmus" - -#: util/errors.c:78 -msgid "file open error" -msgstr "llomnymegnyitsi hiba" - -#: util/errors.c:79 -msgid "file create error" -msgstr "llomnyltrehozsi hiba" - -#: util/errors.c:80 -msgid "invalid passphrase" -msgstr "rvnytelen jelsz" - -#: util/errors.c:81 -msgid "unimplemented pubkey algorithm" -msgstr "nem megvalstott nyilvnos kulcs algoritmus" - -#: util/errors.c:82 -msgid "unimplemented cipher algorithm" -msgstr "nem megvalstott rejtjelez algoritmus" - -#: util/errors.c:83 -msgid "unknown signature class" -msgstr "ismeretlen alrsosztly" - -#: util/errors.c:84 -msgid "trust database error" -msgstr "hibs bizalmi adatbzis" - -#: util/errors.c:85 -msgid "bad MPI" -msgstr "hibs MPI" - -#: util/errors.c:86 -msgid "resource limit" -msgstr "erforrshatr" - -#: util/errors.c:87 -msgid "invalid keyring" -msgstr "rvnytelen kulcskarika" - -#: util/errors.c:88 -msgid "bad certificate" -msgstr "rossz igazols" - -#: util/errors.c:89 -msgid "malformed user id" -msgstr "rossz formj felhasznli azonost" - -#: util/errors.c:90 -msgid "file close error" -msgstr "llomnyzrsi hiba" - -#: util/errors.c:91 -msgid "file rename error" -msgstr "llomnytnevezsi hiba" - -#: util/errors.c:92 -msgid "file delete error" -msgstr "llomnytrlsi hiba" - -#: util/errors.c:93 -msgid "unexpected data" -msgstr "nem vrt adat" - -#: util/errors.c:94 -msgid "timestamp conflict" -msgstr "idblyeg-konfliktus" - -#: util/errors.c:95 -msgid "unusable pubkey algorithm" -msgstr "hasznlhatatlan nyilvnos kulcs algoritmus" - -#: util/errors.c:96 -msgid "file exists" -msgstr "llomny ltezik" - -#: util/errors.c:97 -msgid "weak key" -msgstr "gyenge kulcs" - -#: util/errors.c:98 -msgid "invalid argument" -msgstr "rvnytelen argumentum" - -#: util/errors.c:99 -msgid "bad URI" -msgstr "rossz URI" - -#: util/errors.c:100 -msgid "unsupported URI" -msgstr "nem tmogatott URI" - -#: util/errors.c:101 -msgid "network error" -msgstr "hlzati hiba" - -#: util/errors.c:103 -msgid "not encrypted" -msgstr "nem titkostott" - -#: util/errors.c:104 -msgid "not processed" -msgstr "nem feldolgozott" - -#: util/errors.c:106 -msgid "unusable public key" -msgstr "hasznlhatatlan nyilvnos kulcs" - -#: util/errors.c:107 -msgid "unusable secret key" -msgstr "hasznlhatatlan titkos kulcs" - -#: util/errors.c:108 -msgid "keyserver error" -msgstr "kulcsszerverhiba" - -#: util/errors.c:109 -#, fuzzy -msgid "canceled" -msgstr "Mgsem" - -#: util/errors.c:110 -#, fuzzy -msgid "no card" -msgstr "nem titkostott" - -#: util/errors.c:111 -#, fuzzy -msgid "no data" -msgstr "Nincs alrt 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 "Tallt egy programhibt... (%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 "kilps|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 biztonsgos memrit hasznlunk!\n" - -#: util/secmem.c:98 -msgid "please see http://www.gnupg.org/faq.html for more information\n" -msgstr "Tovbbi informci a http://www.gnupg.org/faq.html cmen tallhat.\n" - -#: util/secmem.c:350 -msgid "operation is not possible without initialized secure memory\n" -msgstr "A mvelet nem lehetsges biztonsgos memria nlkl.\n" - -#: util/secmem.c:351 -msgid "(you may have used the wrong program for this task)\n" -msgstr "(Lehet, hogy nem a megfelel programot hasznlja a feladatra.)\n" - -#~ msgid "DSA requires the use of a 160 bit hash algorithm\n" -#~ msgstr "A DSA 160 bites hash (kivonatol) algoritmust ignyel.\n" - -#~ msgid "" -#~ "please see http://www.gnupg.org/why-not-idea.html for more information\n" -#~ msgstr "" -#~ "Tovbbi informcit a http://www.gnupg.org/why-not-idea.html oldalon " -#~ "tall.\n" - -#~ msgid "" -#~ "a notation name must have only printable characters or spaces, and end " -#~ "with an '='\n" -#~ msgstr "" -#~ "Egy jells neve csak nyomtathat karaktereket s szkzt tartalmazhat, " -#~ "s = jellel kell befejezdjn.\n" - -#~ msgid "a user notation name must contain the '@' character\n" -#~ msgstr "Egy felhasznljellsnek tartalmaznia kell a \"@\" karaktert!\n" - -#, fuzzy -#~ msgid "a notation name must not contain more than one '@' character\n" -#~ msgstr "Egy felhasznljellsnek tartalmaznia kell a \"@\" karaktert!\n" - -#~ msgid "a notation value must not use any control characters\n" -#~ msgstr "Egy jells rtkben nem szerepelhet vezrlkarakter!\n" - -#~ msgid "WARNING: invalid notation data found\n" -#~ msgstr "FIGYELEM: rvnytelen jell adatot talltam.\n" - -#~ msgid "not human readable" -#~ msgstr "nem olvashat forma" - -#, fuzzy -#~ msgid "all export-clean-* options from above" -#~ msgstr "opcik beolvassa llomnybl" - -#, fuzzy -#~ msgid "all import-clean-* options from above" -#~ msgstr "opcik beolvassa llomnybl" - -#, fuzzy -#~ msgid "expired: %s)" -#~ msgstr " [lejr: %s]" - -#, fuzzy -#~ msgid "key %s: expired signature from key %s - skipped\n" -#~ msgstr "%08lX kulcs: Vratlan alrsosztly (0x%02X) - kihagytam.\n" - -#, fuzzy -#~ msgid "Unable to clean `%s'\n" -#~ msgstr "Nem tudom vgrehajtani a kvetkez \"%s\"-t: \"%s\": %s.\n" - -#, fuzzy -#~ msgid "User ID \"%s\": %d signature removed.\n" -#~ msgstr "\"%s\" felhasznli azonostt visszavontk." - -#, fuzzy -#~ msgid "User ID \"%s\": %d signatures removed.\n" -#~ msgstr "\"%s\" felhasznli azonostt visszavontk." - -#, fuzzy -#~ msgid "User ID \"%s\" removed: %s\n" -#~ msgstr "\"%s\" felhasznli azonostt visszavontk." - -#, fuzzy -#~ msgid "No user IDs are removable.\n" -#~ msgstr "\"%s\" felhasznli azonostt mr visszavontk.\n" - -#, fuzzy -#~ msgid "error getting serial number: %s\n" -#~ msgstr "Hiba a jelsz ltrehozsakor: %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 belltani a kliens pid-et az gynknek.\n" - -#~ msgid "can't get server read FD for the agent\n" -#~ msgstr "" -#~ "Nem tudom lekrni a szerver olvassi llomnylerjt az gynknek.\n" - -#~ msgid "can't get server write FD for the agent\n" -#~ msgstr "Nem tudom lekrni a szerver rsi llomnylerjt az gynknek.\n" - -#~ msgid "communication problem with gpg-agent\n" -#~ msgstr "Kommunikcis problma a gpg gynkkel!\n" - -#~ msgid "passphrase too long\n" -#~ msgstr "A jelsz tl hossz!\n" - -#~ msgid "invalid response from agent\n" -#~ msgstr "rvnytelen vlasz az gynktl!\n" - -#~ msgid "problem with the agent: agent returns 0x%lx\n" -#~ msgstr "Problma az gynkkel: gynk vlasza: 0x%lx\n" - -#~ msgid "select secondary key N" -#~ msgstr "N. msodlagos kulcs kivlasztsa" - -#~ msgid "list signatures" -#~ msgstr "alrsok kilistzsa" - -#~ msgid "sign the key" -#~ msgstr "kulcs alrsa" - -#~ msgid "add a secondary key" -#~ msgstr "msodlagos kulcs (alkulcs) hozzadsa" - -#~ msgid "delete signatures" -#~ msgstr "alrsok trlse" - -#~ msgid "change the expire date" -#~ msgstr "lejrat megvltoztatsa" - -#~ msgid "set preference list" -#~ msgstr "preferencialista belltsa" - -#~ msgid "updated preferences" -#~ msgstr "preferencik frisstse" - -#~ msgid "No secondary key with index %d\n" -#~ msgstr "Nincs %d index msodlagos kulcs!\n" - -#~ msgid "--nrsign-key user-id" -#~ msgstr "--nrsign-key felh-azonost" - -#~ msgid "--nrlsign-key user-id" -#~ msgstr "--nrlsign-key felh-azonost" - -#, fuzzy -#~ msgid "make a trust signature" -#~ msgstr "klnll alrs ksztse" - -#~ msgid "sign the key non-revocably" -#~ msgstr "kulcs nem visszavonhat alrsa" - -#~ msgid "sign the key locally and non-revocably" -#~ msgstr "kulcs nem visszavonhat helyi alrsa" - -#~ 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 "ltalnos 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 kiadsban\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 kulcsprt hozunk ltre.\n" -#~ " minimlis kulcsmret: 768 bit\n" -#~ " alaprtelmezett kulcsmret: 1024 bit\n" -#~ " legnagyobb ajnlott kulcsmret: 2048 bit\n" - -#~ msgid "DSA only allows keysizes from 512 to 1024\n" -#~ msgstr "A DSA csak 512 s 1024 kztti kulcsmretet tmogat.\n" - -#~ msgid "keysize too small; 1024 is smallest value allowed for RSA.\n" -#~ msgstr "Kulcsmret tl kicsi; 1024 a legkisebb megengedett rtk RSA-hoz.\n" - -#~ msgid "keysize too small; 768 is smallest value allowed.\n" -#~ msgstr "Kulcsmret tl kicsi; 768 a legkisebb megengedett rtk.\n" - -#~ msgid "keysize too large; %d is largest value allowed.\n" -#~ msgstr "Kulcsmret tl nagy; %d a legnagyobb megengedett rtk.\n" - -#~ msgid "" -#~ "Keysizes larger than 2048 are not suggested because\n" -#~ "computations take REALLY long!\n" -#~ msgstr "" -#~ "2048-nl nagyobb kulcsmret nem ajnlott, mert a szmtsok\n" -#~ "NAGYON sokig fognak tartani!\n" - -#, fuzzy -#~ msgid "Are you sure that you want this keysize? (y/N) " -#~ msgstr "Biztos benne, hogy akarja ezt a kulcsmretet? " - -#~ 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 tmadk a monitornak vagy\n" -#~ "a billentyzetnek a sugrzst is felhasznlhatjk!\n" - -#~ msgid "Experimental algorithms should not be used!\n" -#~ msgstr "Nem szabadna ksrleti algoritmusokat hasznlni!\n" - -#~ msgid "" -#~ "this cipher algorithm is deprecated; please use a more standard one!\n" -#~ msgstr "" -#~ "Ez a rejtjelez algoritmus nem ajnlott. Krem, hasznljon " -#~ "szabvnyosabbat!\n" - -#, fuzzy -#~ msgid "writing to file `%s'\n" -#~ msgstr "rok a \"%s\" llomnyba.\n" - -#~ msgid "sorry, can't do this in batch mode\n" -#~ msgstr "Sajnlom, ezt nem tudom megcsinlni ktegelt mdban!\n" - -#~ msgid "key `%s' not found: %s\n" -#~ msgstr "\"%s\" kulcs nem tallhat: %s\n" - -#, fuzzy -#~ msgid "can't create file `%s': %s\n" -#~ msgstr "Nem tudom ltrehozni a(z) \"%s\" llomnyt: %s.\n" - -#, fuzzy -#~ msgid "can't open file `%s': %s\n" -#~ msgstr "Nem tudom megnyitni az llomnyt: %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 lejrt!\n" - -#~ msgid "%08lX: We do NOT trust this key\n" -#~ msgstr "%08lX: Ebben a kulcsban NEM bzunk.\n" - -#~ msgid " (%d) RSA (sign and encrypt)\n" -#~ msgstr " (%d) RSA (alrs s titkosts)\n" - -#, fuzzy -#~ msgid " (%d) RSA (auth only)\n" -#~ msgstr " (%d) RSA (csak alrs)\n" - -#, fuzzy -#~ msgid " (%d) RSA (sign and auth)\n" -#~ msgstr " (%d) RSA (alrs s titkosts)\n" - -#, fuzzy -#~ msgid " (%d) RSA (encrypt and auth)\n" -#~ msgstr " (%d) RSA (csak titkosts)\n" - -#, fuzzy -#~ msgid " (%d) RSA (sign, encrypt and auth)\n" -#~ msgstr " (%d) RSA (alrs s titkosts)\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 llomny.\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 = rszlegesen megbzom benne\n" - -#, fuzzy -#~ msgid " (%d) I trust fully\n" -#~ msgstr " %d = teljesen megbzom benne\n" - -#, fuzzy -#~ msgid "expires" -#~ msgstr "expire" - -#, fuzzy -#~ msgid "" -#~ "\"\n" -#~ "locally signed with your key %s at %s\n" -#~ msgstr "" -#~ "\"\n" -#~ "Helyileg alrva az n %08lX kulcsval %s idpontban.\n" - -#, fuzzy -#~ msgid " signed by %s on %s%s\n" -#~ msgstr " alrva %08lX ltal %s%s idpontban.\n" - -#~ msgid "%s: can't access: %s\n" -#~ msgstr "%s: Nem tudom elrni: %s.\n" - -#~ msgid "%s: can't create lock\n" -#~ msgstr "%s: Nem tudok lock-ot ltrehozni.\n" - -#~ msgid "%s: can't make lock\n" -#~ msgstr "%s: Nem tudok lock-ot csinlni.\n" - -#~ msgid "%s: can't create: %s\n" -#~ msgstr "%s: Nem tudom ltrehozni: %s.\n" - -#~ msgid "%s: can't create directory: %s\n" -#~ msgstr "%s: Nem tudom a knyvtrat ltrehozni: %s.\n" - -#~ msgid "If you want to use this revoked key anyway, answer \"yes\"." -#~ msgstr "" -#~ "Ha mgis hasznlni akarja ezt a visszavont kulcsot,\n" -#~ "vlaszoljon \"igen\"-nel!" - -#~ msgid "Unable to open photo \"%s\": %s\n" -#~ msgstr "Nem tudom megnyitni a \"%s\" fott: %s.\n" - -#~ msgid "can't open file: %s\n" -#~ msgstr "Nem tudom megnyitni az llomnyt: %s.\n" - -#~ msgid "error: missing colon\n" -#~ msgstr "Hiba: Hinyz kettspont.\n" - -#~ msgid "error: no ownertrust value\n" -#~ msgstr "Hiba: Nincs tulajdonosmegbzhatsgi rtk.\n" - -#~ msgid " (main key ID %08lX)" -#~ msgstr "" -#~ " \n" -#~ " (f kulcsazonost: %08lX)" - -#~ msgid "rev! subkey has been revoked: %s\n" -#~ msgstr "rev! Alkulcsot visszavontk: %s.\n" - -#~ msgid "rev- faked revocation found\n" -#~ msgstr "rev- Hamis visszavonst talltam!\n" - -#~ msgid "rev? problem checking revocation: %s\n" -#~ msgstr "rev? Nem tudom ellenrizni a visszavonst: %s.\n" - -#, fuzzy -#~ msgid " [expired: %s]" -#~ msgstr " [lejr: %s]" - -#~ msgid " [expires: %s]" -#~ msgstr " [lejr: %s]" - -#, fuzzy -#~ msgid " [revoked: %s]" -#~ msgstr "[visszavont] " - -#~ msgid "can't create %s: %s\n" -#~ msgstr "%s nem hozhat ltre: %s\n" - -#~ msgid "" -#~ "WARNING: digest `%s' is not part of OpenPGP. Use at your own risk!\n" -#~ msgstr "" -#~ "FIGYELEM: \"%s\" kivonatol algoritmus nem rsze az OpenPGP-nek. Csak " -#~ "sajt felelssgre hasznlja!\n" - -#~ msgid "|[files]|encrypt files" -#~ msgstr "|[fjlok]|llomnyok titkostsa" - -#~ msgid "store only" -#~ msgstr "csak trols" - -#~ msgid "|[files]|decrypt files" -#~ msgstr "|[fjlok]|llomnyok visszafejtse" - -#~ msgid "sign a key non-revocably" -#~ msgstr "kulcs alrsa visszavonhatatlanul" - -#~ msgid "sign a key locally and non-revocably" -#~ msgstr "kulcs alrsa helyileg s visszavonhatatlanul" - -#~ msgid "list only the sequence of packets" -#~ msgstr "csak a csomagok listzsa" - -#~ msgid "export the ownertrust values" -#~ msgstr "bizalmi rtkek exportja" - -#~ msgid "unattended trust database update" -#~ msgstr "bizalmi adatbzis frisstse felgyelet nlkl" - -#~ msgid "fix a corrupted trust database" -#~ msgstr "srlt bizalmi adatbzis kijavtsa" - -#~ msgid "De-Armor a file or stdin" -#~ msgstr "pncl eltvoltsa llomnyrl vagy bemenetrl" - -#~ msgid "En-Armor a file or stdin" -#~ msgstr "llomny vagy bemenet pnclozsa" - -#~ msgid "|NAME|use NAME as default recipient" -#~ msgstr "|NV|NV hasznlata alaprtelmezett cmzettknt" - -#~ msgid "use the default key as default recipient" -#~ msgstr "alaprt. kulcs haszn. alaprt. cmzettknt" - -#~ msgid "don't use the terminal at all" -#~ msgstr "ne hasznlja a terminlt egyltaln" - -#~ msgid "force v3 signatures" -#~ msgstr "3-as verzij alrsok erltetse" - -#~ msgid "do not force v3 signatures" -#~ msgstr "ne erltesse a 3-as verzij alrsokat" - -#~ msgid "force v4 key signatures" -#~ msgstr "4-es verzij alrsok erltetse" - -#~ msgid "do not force v4 key signatures" -#~ msgstr "ne erltesse a 4-es verzij alrsokat" - -#~ msgid "always use a MDC for encryption" -#~ msgstr "mindig hasznljon MDC-t titkostskor" - -#~ msgid "never use a MDC for encryption" -#~ msgstr "soha ne hasznljon MDC-t titkostskor" - -#~ msgid "use the gpg-agent" -#~ msgstr "gpg gynk hasznlata" - -#~ msgid "batch mode: never ask" -#~ msgstr "ktegelt md: soha nem krdez" - -#~ msgid "assume yes on most questions" -#~ msgstr "igen vlasz felttelezse a legtbb krdsre" - -#~ msgid "assume no on most questions" -#~ msgstr "nem vlasz felttelezse a legtbb krdsre" - -#~ msgid "add this keyring to the list of keyrings" -#~ msgstr "kulcskarika hozzadsa a kulcskarikalisthoz" - -#~ msgid "add this secret keyring to the list" -#~ msgstr "titkoskulcs-karika hozzadsa a listhoz" - -#~ msgid "|NAME|use NAME as default secret key" -#~ msgstr "|NV|NV hasznlata alaprtelmezett titkos kulcsknt" - -#~ msgid "|HOST|use this keyserver to lookup keys" -#~ msgstr "|GPNV|kulcsszerver belltsa kulcsok keresshez" - -#~ msgid "|NAME|set terminal charset to NAME" -#~ msgstr "|NV|terminl karakterkdolsnak megadsa" - -#~ msgid "|[file]|write status info to file" -#~ msgstr "|[fjl]|llapotinformcik llomnyba rsa" - -#~ msgid "|KEYID|ultimately trust this key" -#~ msgstr "|KULCS|alapveten megbzunk ebben a kulcsban" - -#~ msgid "|FILE|load extension module FILE" -#~ msgstr "|fjl|bvt modul betltse" - -#~ msgid "emulate the mode described in RFC1991" -#~ msgstr "RFC1991-ben lert md emulcija" - -#~ msgid "set all packet, cipher and digest options to OpenPGP behavior" -#~ msgstr "opcik OpenPGP mdra lltsa" - -#~ msgid "set all packet, cipher and digest options to PGP 2.x behavior" -#~ msgstr "opcik PGP 2.x mdra lltsa" - -#~ msgid "|N|use passphrase mode N" -#~ msgstr "|N|N. sorszm jelszmd hasznlata" - -#~ msgid "|NAME|use message digest algorithm NAME for passphrases" -#~ msgstr "|NV|NV kivonatol algoritmus haszn. jelszavakhoz" - -#~ msgid "|NAME|use cipher algorithm NAME for passphrases" -#~ msgstr "|NV|NV rejtjelez algoritmus haszn. jelszavakhoz" - -#~ msgid "|NAME|use cipher algorithm NAME" -#~ msgstr "|NV|NV rejtjelez algoritmus hasznlata" - -#~ msgid "|NAME|use message digest algorithm NAME" -#~ msgstr "|NV|NV kivonatol algoritmus hasznlata" - -#~ msgid "|N|use compress algorithm N" -#~ msgstr "|N|N. sorszm tmrt algoritmus hasznlata" - -#~ msgid "throw keyid field of encrypted packets" -#~ msgstr "titkostott csomagok keyid mezjnek eldobsa" - -#~ msgid "Show Photo IDs" -#~ msgstr "fotazonostk mutatsa" - -#~ msgid "Don't show Photo IDs" -#~ msgstr "ne mutassa a fotazonostkat" - -#~ msgid "Set command line to view Photo IDs" -#~ msgstr "parancssor lltsa fotazonostk megnzshez" - -#~ msgid "compress algorithm `%s' is read-only in this release\n" -#~ msgstr "\"%s\" tmrtalgoritmus csak olvashat ebben a kiadsban.\n" - -#~ msgid "compress algorithm must be in range %d..%d\n" -#~ msgstr "A tmrtalgoritmus szma %d s %d kz 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 valban a jelzett tulajdonoshoz\n" -#~ "tartozik, ennek ellenre elfogadtuk.\n" - -#~ msgid "preference %c%lu is not valid\n" -#~ msgstr "%c%lu preferencia rvnytelen!\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 "" -#~ "MEGJEGYZS: Elgamal elsdleges kulcsot rzkeltem.\n" -#~ "Eltarthat egy ideig az importlsa.\n" - -#~ msgid " (default)" -#~ msgstr " (alaprtelmezs)" - -#~ msgid "%s%c %4u%c/%08lX created: %s expires: %s" -#~ msgstr "%s%c %4u%c/%08lX ltrehozva: %s lejr: %s" - -#~ msgid "Policy: " -#~ msgstr "Eljrsmd: " - -#~ msgid "can't get key from keyserver: %s\n" -#~ msgstr "Nem tudom lehvni a kulcsot a %s kulcsszerverrl.\n" - -#~ msgid "error sending to `%s': %s\n" -#~ msgstr "Hiba %s-ra/-re kldskor: %s\n" - -#~ msgid "success sending to `%s' (status=%u)\n" -#~ msgstr "Sikeresen felkldtem %s kulcsszerverre. (Sttusz: %u.)\n" - -#~ msgid "failed sending to `%s': status=%u\n" -#~ msgstr "Nem tudtam felkldeni %s kulcsszerverre. Sttusz: %u.\n" - -#~ msgid "this keyserver does not support --search-keys\n" -#~ msgstr "Ez a kulcsszerver nem tmogatja a --search-keys kapcsolt.\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 ltrehozott ElGamal kulcs, mely\n" -#~ "NEM biztonsgos alrsokhoz!\n" - -#~ msgid "" -#~ "key %08lX has been created %lu second in future (time warp or clock " -#~ "problem)\n" -#~ msgstr "" -#~ "%08lX kulcs %lu msodperccel a jvben kszlt. (Idugrs vagy " -#~ "raproblma.)\n" - -#~ msgid "" -#~ "key %08lX has been created %lu seconds in future (time warp or clock " -#~ "problem)\n" -#~ msgstr "" -#~ "%08lX kulcs %lu msodperccel a jvben kszlt. (Idugrs vagy " -#~ "raproblma.)\n" - -#~ msgid "key %08lX marked as ultimately trusted\n" -#~ msgstr "A(z) %08lX kulcs alapveten megbzhatnak lett jellve.\n" - -#~ msgid "signature from Elgamal signing key %08lX to %08lX skipped\n" -#~ msgstr "" -#~ "%08lX Elgamal alrkulccsal %08lX kulcshoz kszlt alrst kihagytam.\n" - -#~ msgid "signature from %08lX to Elgamal signing key %08lX skipped\n" -#~ msgstr "" -#~ "%08lX kulccsal %08lX Elgamal alrkulcshoz kszlt alrst kihagytam.\n" - -#~ msgid "checking at depth %d signed=%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/%d/%d\n" -#~ msgstr "" -#~ "Vizsglok a(z) %d. szinten, alrt=%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 "" -#~ "Vlassza ki a hasznlni kvnt algoritmust!\n" -#~ "\n" -#~ "A DSA (ms nven DSS) egy digitlis alrsi algoritmus, mely kizrlag\n" -#~ "alrsokhoz hasznlhat. Ez az ajnlott algoritmus, mivel a DSA " -#~ "alrsok\n" -#~ "ellenrzse jval gyorsabb az ElGamal alrsoknl.\n" -#~ "\n" -#~ "Az ElGamal egy algoritmus, mely alrsokhoz s titkostshoz is\n" -#~ "hasznlhat. Az OpenPGP az algoritmus kt fajtjt klnbzteti meg:\n" -#~ "egy csak titkostt, s egy alrt s titkostt. Tulajdonkppen ez\n" -#~ "a kett ugyanaz, de nhny paramtert specilisan kell megvlasztani\n" -#~ "ahhoz, hogy a kulcs biztonsgos legyen alrs-ksztshez. Ez a program\n" -#~ "megteszi ezt, de ms OpenPGP megvalstsoknak nem ktelez rteni a\n" -#~ "az alr+titkost fajtt.\n" -#~ "\n" -#~ "Az elsdleges kulcsnak mindig olyannak kell lenni, amely kpes alrni.\n" -#~ "Ez az oka annak, hogy a csak titkost ElGamal kulcs nem szerepel ebben\n" -#~ "a menben." - -#~ 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 "" -#~ "Habr ezek a kulcsok definiltak az RFC2440-ben, mgsem ajnljuk ket,\n" -#~ "mert nem tmogatottak minden programban, s az ezekkel kszlt alrsok\n" -#~ "nagyon hosszak, s nagyon lass az ellenrzsk." - -#~ msgid "%lu keys so far checked (%lu signatures)\n" -#~ msgstr "%lu kulcsot ellenriztem eddig (%lu alrssal).\n" - -#~ msgid "key incomplete\n" -#~ msgstr "hinyos kulcs\n" - -#~ msgid "key %08lX incomplete\n" -#~ msgstr "A(z) %08lX kulcs hinyos.\n" - -#~ msgid "quit|quit" -#~ msgstr "kilps" - -#~ msgid " (%d) ElGamal (sign and encrypt)\n" -#~ msgstr " (%d) ElGamal (alrs s titkosts)\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 hasznlatt csak a GnuPG tmogatja. Ezzel\n" -#~ "a kulccsal n nem fog tudni kommuniklni a PGP-t hasznlkkal. Tovbb\n" -#~ "ez az algoritmus nagyon lass, s taln nem is olyan biztonsgos, mint\n" -#~ "a tbbi vlaszthat.\n" - -#~ msgid "Create anyway? " -#~ msgstr "Mgis ltrehozzam? " - -#~ msgid "invalid symkey algorithm detected (%d)\n" -#~ msgstr "rvnytelen szimmetrikus kulcs algoritmust talltam (%d).\n" - -#~ msgid "this keyserver is not fully HKP compatible\n" -#~ msgstr "Ez a kulcsszerver nem teljesen HKP kompatbilis.\n" diff --git a/po/id.po b/po/id.po deleted file mode 100644 index 0337b71d1..000000000 --- a/po/id.po +++ /dev/null @@ -1,7201 +0,0 @@ -# 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-07-28 11:12+0200\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:1003 g10/gpg.c:3461 g10/import.c:195 g10/keygen.c:2385 -#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:342 -#: 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:1002 g10/keygen.c:2864 -#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:263 -#: g10/openfile.c:357 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:320 -#, c-format -msgid "armor: %s\n" -msgstr "armor: %s\n" - -#: g10/armor.c:359 -msgid "invalid armor header: " -msgstr "header armor tidak valid: " - -#: g10/armor.c:370 -msgid "armor header: " -msgstr "header armor: " - -#: g10/armor.c:381 -msgid "invalid clearsig header\n" -msgstr "header clearsig tidak valid\n" - -#: g10/armor.c:433 -msgid "nested clear text signatures\n" -msgstr "signature teks bersarang\n" - -#: g10/armor.c:568 -#, fuzzy -msgid "unexpected armor: " -msgstr "armor tidak terduga:" - -#: g10/armor.c:580 -msgid "invalid dash escaped line: " -msgstr "dash escaped line tidak valid: " - -#: g10/armor.c:734 g10/armor.c:1343 -#, fuzzy, c-format -msgid "invalid radix64 character %02X skipped\n" -msgstr "karakter radix64 tidak valid %02x dilewati\n" - -#: g10/armor.c:777 -msgid "premature eof (no CRC)\n" -msgstr "eof prematur (tanpa CRC)\n" - -#: g10/armor.c:811 -msgid "premature eof (in CRC)\n" -msgstr "eof prematur (dalam CRC)\n" - -#: g10/armor.c:819 -msgid "malformed CRC\n" -msgstr "CRC tidak tepat\n" - -#: g10/armor.c:823 g10/armor.c:1380 -#, fuzzy, c-format -msgid "CRC error; %06lX - %06lX\n" -msgstr "kesalahan CRC; %06lx - %06lx\n" - -#: g10/armor.c:843 -#, fuzzy -msgid "premature eof (in trailer)\n" -msgstr "eof prematur (dalam Trailer)\n" - -#: g10/armor.c:847 -msgid "error in trailer line\n" -msgstr "kesalahan dalam garis trailer\n" - -#: g10/armor.c:1158 -msgid "no valid OpenPGP data found.\n" -msgstr "tidak ditemukan data OpenPGP yang valid.\n" - -#: g10/armor.c:1163 -#, c-format -msgid "invalid armor: line longer than %d characters\n" -msgstr "armor tidak valid: baris melebihi %d karakter\n" - -#: g10/armor.c:1167 -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:280 -#, 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:3826 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:3387 g10/keyserver.c:1700 -#: 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:2349 g10/keyserver.c:1714 -#: 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:67 g10/mainproc.c:293 -#, c-format -msgid "%s encrypted data\n" -msgstr "%s data terenkripsi\n" - -#: g10/encr-data.c:69 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:93 -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:104 -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:415 -#, 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:375 -msgid "" -"@Commands:\n" -" " -msgstr "" -"@Perintah:\n" -" " - -#: g10/gpg.c:377 -msgid "|[file]|make a signature" -msgstr "|[file]|buat signature" - -#: g10/gpg.c:378 -msgid "|[file]|make a clear text signature" -msgstr "|[file]|buat signature teks" - -#: g10/gpg.c:379 -msgid "make a detached signature" -msgstr "buat detached signature" - -#: g10/gpg.c:380 -msgid "encrypt data" -msgstr "enkripsi data" - -#: g10/gpg.c:382 -msgid "encryption only with symmetric cipher" -msgstr "enkripsi hanya dengan symmetric cipher" - -#: g10/gpg.c:384 -msgid "decrypt data (default)" -msgstr "dekripsi data (default)" - -#: g10/gpg.c:386 -msgid "verify a signature" -msgstr "verifikasi signature" - -#: g10/gpg.c:388 -msgid "list keys" -msgstr "tampilkan kunci" - -#: g10/gpg.c:390 -msgid "list keys and signatures" -msgstr "tampilkan kunci dan signature" - -#: g10/gpg.c:391 -#, fuzzy -msgid "list and check key signatures" -msgstr "periksa signature kunci" - -#: g10/gpg.c:392 -msgid "list keys and fingerprints" -msgstr "tampilkan kunci dan fingerprint" - -#: g10/gpg.c:393 -msgid "list secret keys" -msgstr "tampilkan kunci rahasia" - -#: g10/gpg.c:394 -msgid "generate a new key pair" -msgstr "buat sepasang kunci baru" - -#: g10/gpg.c:395 -msgid "remove keys from the public keyring" -msgstr "hapus kunci dari keyring publik" - -#: g10/gpg.c:397 -msgid "remove keys from the secret keyring" -msgstr "hapus kunci dari keyring pribadi" - -#: g10/gpg.c:398 -msgid "sign a key" -msgstr "tandai kunci" - -#: g10/gpg.c:399 -msgid "sign a key locally" -msgstr "tandai kunci secara lokal" - -#: g10/gpg.c:400 -msgid "sign or edit a key" -msgstr "tandai atau edit kunci" - -#: g10/gpg.c:401 -msgid "generate a revocation certificate" -msgstr "buat sertifikat revokasi" - -#: g10/gpg.c:403 -msgid "export keys" -msgstr "ekspor kunci" - -#: g10/gpg.c:404 -msgid "export keys to a key server" -msgstr "ekspor kunci ke key server" - -#: g10/gpg.c:405 -msgid "import keys from a key server" -msgstr "impor kunci dari key server" - -#: g10/gpg.c:407 -msgid "search for keys on a key server" -msgstr "cari kunci di key server" - -#: g10/gpg.c:409 -msgid "update all keys from a keyserver" -msgstr "update semua kunci dari keyserver" - -#: g10/gpg.c:413 -msgid "import/merge keys" -msgstr "impor/gabung kunci" - -#: g10/gpg.c:416 -msgid "print the card status" -msgstr "" - -#: g10/gpg.c:417 -msgid "change data on a card" -msgstr "" - -#: g10/gpg.c:418 -msgid "change a card's PIN" -msgstr "" - -#: g10/gpg.c:426 -msgid "update the trust database" -msgstr "perbarui database trust" - -#: g10/gpg.c:433 -msgid "|algo [files]|print message digests" -msgstr "|algo [file]|cetak digest pesan" - -#: g10/gpg.c:437 g10/gpgv.c:71 -msgid "" -"@\n" -"Options:\n" -" " -msgstr "" -"@\n" -"Pilihan:\n" -" " - -#: g10/gpg.c:439 -msgid "create ascii armored output" -msgstr "ciptakan output ascii" - -#: g10/gpg.c:441 -msgid "|NAME|encrypt for NAME" -msgstr "|NAMA|enkripsi untuk NAMA" - -#: g10/gpg.c:452 -msgid "use this user-id to sign or decrypt" -msgstr "gunakan id-user ini untuk menandai/dekripsi" - -#: g10/gpg.c:453 -msgid "|N|set compress level N (0 disables)" -msgstr "|N|set tingkat kompresi N (0 tidak ada)" - -#: g10/gpg.c:458 -msgid "use canonical text mode" -msgstr "gunakan mode teks kanonikal" - -#: g10/gpg.c:472 -msgid "use as output file" -msgstr "gunakan sebagai file output" - -#: g10/gpg.c:474 g10/gpgv.c:73 -msgid "verbose" -msgstr "detil" - -#: g10/gpg.c:485 -msgid "do not make any changes" -msgstr "jangan buat perubahan" - -#: g10/gpg.c:486 -msgid "prompt before overwriting" -msgstr "tanya sebelum menimpa" - -#: g10/gpg.c:527 -msgid "use strict OpenPGP behavior" -msgstr "" - -#: g10/gpg.c:528 -msgid "generate PGP 2.x compatible messages" -msgstr "" - -#: g10/gpg.c:556 -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:559 -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:757 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:774 -msgid "Usage: gpg [options] [files] (-h for help)" -msgstr "Pemakaian: gpg [pilihan] [file] (-h untuk bantuan)" - -#: g10/gpg.c:777 -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:788 -msgid "" -"\n" -"Supported algorithms:\n" -msgstr "" -"\n" -"Algoritma yang didukung:\n" - -#: g10/gpg.c:791 -msgid "Pubkey: " -msgstr "Pubkey: " - -#: g10/gpg.c:797 g10/keyedit.c:2310 -msgid "Cipher: " -msgstr "Cipher: " - -#: g10/gpg.c:803 -msgid "Hash: " -msgstr "Hash: " - -#: g10/gpg.c:809 g10/keyedit.c:2356 -msgid "Compression: " -msgstr "Kompresi: " - -#: g10/gpg.c:892 -msgid "usage: gpg [options] " -msgstr "pemakaian: gpg [pilihan] " - -#: g10/gpg.c:1040 -msgid "conflicting commands\n" -msgstr "perintah saling konflik\n" - -#: g10/gpg.c:1058 -#, fuzzy, c-format -msgid "no = sign found in group definition `%s'\n" -msgstr "tanda = tidak ditemukan dalam definisi grup \"%s\"\n" - -#: g10/gpg.c:1255 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on homedir `%s'\n" -msgstr "Peringatan: kepemilikan tidak aman pada %s \"%s\"\n" - -#: g10/gpg.c:1258 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on configuration file `%s'\n" -msgstr "Peringatan: kepemilikan tidak aman pada %s \"%s\"\n" - -#: g10/gpg.c:1261 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on extension `%s'\n" -msgstr "Peringatan: kepemilikan tidak aman pada %s \"%s\"\n" - -#: g10/gpg.c:1267 -#, fuzzy, c-format -msgid "WARNING: unsafe permissions on homedir `%s'\n" -msgstr "Peringatan: permisi tidak aman pada %s \"%s\"\n" - -#: g10/gpg.c:1270 -#, fuzzy, c-format -msgid "WARNING: unsafe permissions on configuration file `%s'\n" -msgstr "Peringatan: permisi tidak aman pada %s \"%s\"\n" - -#: g10/gpg.c:1273 -#, fuzzy, c-format -msgid "WARNING: unsafe permissions on extension `%s'\n" -msgstr "Peringatan: permisi tidak aman pada %s \"%s\"\n" - -#: g10/gpg.c:1279 -#, 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:1282 -#, 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:1285 -#, 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:1291 -#, 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:1294 -#, 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:1297 -#, 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:1438 -#, fuzzy, c-format -msgid "unknown configuration item `%s'\n" -msgstr "Item Konfigurasi tidak dikenal \"%s\"\n" - -#: g10/gpg.c:1531 -msgid "display photo IDs during key listings" -msgstr "" - -#: g10/gpg.c:1533 -msgid "show policy URLs during signature listings" -msgstr "" - -#: g10/gpg.c:1535 -#, fuzzy -msgid "show all notations during signature listings" -msgstr "Tidak ada signature koresponden di ring rahasia\n" - -#: g10/gpg.c:1537 -msgid "show IETF standard notations during signature listings" -msgstr "" - -#: g10/gpg.c:1541 -msgid "show user-supplied notations during signature listings" -msgstr "" - -#: g10/gpg.c:1543 -#, fuzzy -msgid "show preferred keyserver URLs during signature listings" -msgstr "URL signature kebijakan yang diberikan tidak valid\n" - -#: g10/gpg.c:1545 -msgid "show user ID validity during key listings" -msgstr "" - -#: g10/gpg.c:1547 -msgid "show revoked and expired user IDs in key listings" -msgstr "" - -#: g10/gpg.c:1549 -msgid "show revoked and expired subkeys in key listings" -msgstr "" - -#: g10/gpg.c:1551 -#, fuzzy -msgid "show the keyring name in key listings" -msgstr "tampilkan keyring tempat kunci yang dipilih berada" - -#: g10/gpg.c:1553 -#, fuzzy -msgid "show expiration dates during signature listings" -msgstr "Tidak ada signature koresponden di ring rahasia\n" - -#: g10/gpg.c:1920 -#, c-format -msgid "NOTE: old default options file `%s' ignored\n" -msgstr "CATATAN: file pilihan baku lama `%s' diabaikan\n" - -#: g10/gpg.c:1962 -#, c-format -msgid "NOTE: no default option file `%s'\n" -msgstr "CATATAN: tidak ada file pilihan baku `%s'\n" - -#: g10/gpg.c:1966 -#, c-format -msgid "option file `%s': %s\n" -msgstr "file pilihan `%s': %s\n" - -#: g10/gpg.c:1973 -#, c-format -msgid "reading options from `%s'\n" -msgstr "membaca pilihan dari `%s'\n" - -#: g10/gpg.c:2188 g10/gpg.c:2814 g10/gpg.c:2833 -#, c-format -msgid "NOTE: %s is not for normal use!\n" -msgstr "CATATAN: %s tidak untuk pemakaian normal!\n" - -#: g10/gpg.c:2201 -#, 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:2364 g10/gpg.c:2376 -#, fuzzy, c-format -msgid "`%s' is not a valid signature expiration\n" -msgstr "%s bukanlah set karakter yang valid\n" - -#: g10/gpg.c:2452 -#, fuzzy, c-format -msgid "`%s' is not a valid character set\n" -msgstr "%s bukanlah set karakter yang valid\n" - -#: g10/gpg.c:2476 g10/gpg.c:2663 g10/keyedit.c:4064 -#, fuzzy -msgid "could not parse keyserver URL\n" -msgstr "tidak dapat memparsing URI keyserver\n" - -#: g10/gpg.c:2488 -#, fuzzy, c-format -msgid "%s:%d: invalid keyserver options\n" -msgstr "%s:%d: opsi ekspor tidak valid\n" - -#: g10/gpg.c:2491 -#, fuzzy -msgid "invalid keyserver options\n" -msgstr "opsi ekspor tidak valid\n" - -#: g10/gpg.c:2498 -#, c-format -msgid "%s:%d: invalid import options\n" -msgstr "%s:%d: opsi impor tidak valid\n" - -#: g10/gpg.c:2501 -msgid "invalid import options\n" -msgstr "opsi impor tidak valid\n" - -#: g10/gpg.c:2508 -#, c-format -msgid "%s:%d: invalid export options\n" -msgstr "%s:%d: opsi ekspor tidak valid\n" - -#: g10/gpg.c:2511 -msgid "invalid export options\n" -msgstr "opsi ekspor tidak valid\n" - -#: g10/gpg.c:2518 -#, fuzzy, c-format -msgid "%s:%d: invalid list options\n" -msgstr "%s:%d: opsi impor tidak valid\n" - -#: g10/gpg.c:2521 -#, fuzzy -msgid "invalid list options\n" -msgstr "opsi impor tidak valid\n" - -#: g10/gpg.c:2529 -msgid "display photo IDs during signature verification" -msgstr "" - -#: g10/gpg.c:2531 -msgid "show policy URLs during signature verification" -msgstr "" - -#: g10/gpg.c:2533 -#, fuzzy -msgid "show all notations during signature verification" -msgstr "%s bukanlah set karakter yang valid\n" - -#: g10/gpg.c:2535 -msgid "show IETF standard notations during signature verification" -msgstr "" - -#: g10/gpg.c:2539 -msgid "show user-supplied notations during signature verification" -msgstr "" - -#: g10/gpg.c:2541 -#, fuzzy -msgid "show preferred keyserver URLs during signature verification" -msgstr "URL signature kebijakan yang diberikan tidak valid\n" - -#: g10/gpg.c:2543 -#, fuzzy -msgid "show user ID validity during signature verification" -msgstr "%s bukanlah set karakter yang valid\n" - -#: g10/gpg.c:2545 -msgid "show revoked and expired user IDs in signature verification" -msgstr "" - -#: g10/gpg.c:2547 -msgid "validate signatures with PKA data" -msgstr "" - -#: g10/gpg.c:2549 -msgid "elevate the trust of signatures with valid PKA data" -msgstr "" - -#: g10/gpg.c:2556 -#, fuzzy, c-format -msgid "%s:%d: invalid verify options\n" -msgstr "%s:%d: opsi ekspor tidak valid\n" - -#: g10/gpg.c:2559 -#, fuzzy -msgid "invalid verify options\n" -msgstr "opsi ekspor tidak valid\n" - -#: g10/gpg.c:2566 -#, c-format -msgid "unable to set exec-path to %s\n" -msgstr "tidak dapat menset path exec ke %s\n" - -#: g10/gpg.c:2729 -#, fuzzy, c-format -msgid "%s:%d: invalid auto-key-locate list\n" -msgstr "%s:%d: opsi ekspor tidak valid\n" - -#: g10/gpg.c:2732 -msgid "invalid auto-key-locate list\n" -msgstr "" - -#: g10/gpg.c:2803 -msgid "WARNING: program may create a core file!\n" -msgstr "PERINGATAN: program mungkin membuat file core!\n" - -#: g10/gpg.c:2807 -#, c-format -msgid "WARNING: %s overrides %s\n" -msgstr "PERINGATAN: %s menimpa %s\n" - -#: g10/gpg.c:2816 -#, c-format -msgid "%s not allowed with %s!\n" -msgstr "%s tidak dibolehkan dengan %s!\n" - -#: g10/gpg.c:2819 -#, c-format -msgid "%s makes no sense with %s!\n" -msgstr "%s tidak masuk akal dengan %s!\n" - -#: g10/gpg.c:2826 -#, 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:2841 -#, fuzzy, c-format -msgid "will not run with insecure memory due to %s\n" -msgstr "menulis kunci rahasia ke `%s'\n" - -#: g10/gpg.c:2855 -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:2861 -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:2867 -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:2880 -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:2947 g10/gpg.c:2971 -msgid "selected cipher algorithm is invalid\n" -msgstr "algoritma cipher yang dipilih tidak valid\n" - -#: g10/gpg.c:2953 g10/gpg.c:2977 -msgid "selected digest algorithm is invalid\n" -msgstr "algoritma digest yang dipilih tidak valid\n" - -#: g10/gpg.c:2959 -#, fuzzy -msgid "selected compression algorithm is invalid\n" -msgstr "algoritma cipher yang dipilih tidak valid\n" - -#: g10/gpg.c:2965 -msgid "selected certification digest algorithm is invalid\n" -msgstr "algoritma sertifikasi digest yang dipilih tidak valid\n" - -#: g10/gpg.c:2980 -msgid "completes-needed must be greater than 0\n" -msgstr "completes-needed harus lebih dari 0\n" - -#: g10/gpg.c:2982 -msgid "marginals-needed must be greater than 1\n" -msgstr "marginals-needed harus lebih dari 1\n" - -#: g10/gpg.c:2984 -#, 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:2986 -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:2988 -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:2991 -msgid "NOTE: simple S2K mode (0) is strongly discouraged\n" -msgstr "CATATAN: mode S2K sederhana (0) tidak dianjurkan\n" - -#: g10/gpg.c:2995 -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:3002 -msgid "invalid default preferences\n" -msgstr "preferensi baku tidak valid\n" - -#: g10/gpg.c:3011 -msgid "invalid personal cipher preferences\n" -msgstr "preferensi cipher personal tidak valid\n" - -#: g10/gpg.c:3015 -msgid "invalid personal digest preferences\n" -msgstr "preferensi digest personal tidak valid\n" - -#: g10/gpg.c:3019 -msgid "invalid personal compress preferences\n" -msgstr "preferensi kompresi personal tidak valid\n" - -#: g10/gpg.c:3052 -#, c-format -msgid "%s does not yet work with %s\n" -msgstr "%s belum dapat dipakai dengan %s\n" - -#: g10/gpg.c:3099 -#, 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:3104 -#, 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:3109 -#, 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:3208 -#, c-format -msgid "failed to initialize the TrustDB: %s\n" -msgstr "gagal inisialisasi TrustDB: %s\n" - -#: g10/gpg.c:3219 -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:3230 -msgid "--store [filename]" -msgstr "--store [namafile]" - -#: g10/gpg.c:3237 -msgid "--symmetric [filename]" -msgstr "--symmetric [namafile]" - -#: g10/gpg.c:3239 -#, fuzzy, c-format -msgid "symmetric encryption of `%s' failed: %s\n" -msgstr "dekripsi gagal: %s\n" - -#: g10/gpg.c:3249 -msgid "--encrypt [filename]" -msgstr "--encrypt [namafile]" - -#: g10/gpg.c:3262 -#, fuzzy -msgid "--symmetric --encrypt [filename]" -msgstr "--sign --encrypt [namafile]" - -#: g10/gpg.c:3264 -msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n" -msgstr "" - -#: g10/gpg.c:3267 -#, 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:3285 -msgid "--sign [filename]" -msgstr "--sign [namafile]" - -#: g10/gpg.c:3298 -msgid "--sign --encrypt [filename]" -msgstr "--sign --encrypt [namafile]" - -#: g10/gpg.c:3313 -#, fuzzy -msgid "--symmetric --sign --encrypt [filename]" -msgstr "--sign --encrypt [namafile]" - -#: g10/gpg.c:3315 -msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n" -msgstr "" - -#: g10/gpg.c:3318 -#, 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:3338 -msgid "--sign --symmetric [filename]" -msgstr "--sign --symmetric [namafile]" - -#: g10/gpg.c:3347 -msgid "--clearsign [filename]" -msgstr "--clearsign [namafile]" - -#: g10/gpg.c:3372 -msgid "--decrypt [filename]" -msgstr "--decrypt [namafile]" - -#: g10/gpg.c:3380 -msgid "--sign-key user-id" -msgstr "--sign-key id-user" - -#: g10/gpg.c:3384 -msgid "--lsign-key user-id" -msgstr "--lsign-key id-user" - -#: g10/gpg.c:3405 -msgid "--edit-key user-id [commands]" -msgstr "--edit-key id-user [perintah]" - -#: g10/gpg.c:3476 -msgid "-k[v][v][v][c] [user-id] [keyring]" -msgstr "-k[v][v][v][c] [id-user] [keyring]" - -#: g10/gpg.c:3518 -#, c-format -msgid "keyserver send failed: %s\n" -msgstr "Pengiriman keyserver gagal: %s\n" - -#: g10/gpg.c:3520 -#, c-format -msgid "keyserver receive failed: %s\n" -msgstr "Penerimaan keyserver gagal: %s\n" - -#: g10/gpg.c:3522 -#, c-format -msgid "key export failed: %s\n" -msgstr "Ekspor kunci gagal: %s\n" - -#: g10/gpg.c:3533 -#, c-format -msgid "keyserver search failed: %s\n" -msgstr "Pencarian keyserver gagal: %s\n" - -#: g10/gpg.c:3543 -#, c-format -msgid "keyserver refresh failed: %s\n" -msgstr "Refresh keyserver gagal: %s\n" - -#: g10/gpg.c:3594 -#, c-format -msgid "dearmoring failed: %s\n" -msgstr "gagal dearmoring: %s\n" - -#: g10/gpg.c:3602 -#, c-format -msgid "enarmoring failed: %s\n" -msgstr "gagal enarmoring: %s\n" - -#: g10/gpg.c:3689 -#, c-format -msgid "invalid hash algorithm `%s'\n" -msgstr "algoritma hash tidak valid `%s'\n" - -#: g10/gpg.c:3812 -msgid "[filename]" -msgstr "[namafile]" - -#: g10/gpg.c:3816 -msgid "Go ahead and type your message ...\n" -msgstr "Teruskan dan ketikkan pesan anda ....\n" - -#: g10/gpg.c:4120 -msgid "the given certification policy URL is invalid\n" -msgstr "URL sertifikasi kebijakan yang diberikan tidak valid\n" - -#: g10/gpg.c:4122 -msgid "the given signature policy URL is invalid\n" -msgstr "URL signature kebijakan yang diberikan tidak valid\n" - -#: g10/gpg.c:4155 -#, 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:3707 -#, 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:266 -#, c-format -msgid "skipping block of type %d\n" -msgstr "melewati blok tipe %d\n" - -#: g10/import.c:275 -#, fuzzy, c-format -msgid "%lu keys processed so far\n" -msgstr "%lu kunci telah diproses\n" - -#: g10/import.c:292 -#, c-format -msgid "Total number processed: %lu\n" -msgstr "Jumlah yang telah diproses: %lu\n" - -#: g10/import.c:294 -#, c-format -msgid " skipped new keys: %lu\n" -msgstr " lewati kunci baru: %lu\n" - -#: g10/import.c:297 -#, c-format -msgid " w/o user IDs: %lu\n" -msgstr " tanpa ID user: %lu\n" - -#: g10/import.c:299 -#, c-format -msgid " imported: %lu" -msgstr " diimpor: %lu" - -#: g10/import.c:305 -#, c-format -msgid " unchanged: %lu\n" -msgstr " tidak berubah: %lu\n" - -#: g10/import.c:307 -#, c-format -msgid " new user IDs: %lu\n" -msgstr " ID user baru: %lu\n" - -#: g10/import.c:309 -#, c-format -msgid " new subkeys: %lu\n" -msgstr " subkey baru: %lu\n" - -#: g10/import.c:311 -#, c-format -msgid " new signatures: %lu\n" -msgstr " signature baru: %lu\n" - -#: g10/import.c:313 -#, c-format -msgid " new key revocations: %lu\n" -msgstr " pembatalan kunci baru: %lu\n" - -#: g10/import.c:315 -#, c-format -msgid " secret keys read: %lu\n" -msgstr " kunci rahasia dibaca: %lu\n" - -#: g10/import.c:317 -#, c-format -msgid " secret keys imported: %lu\n" -msgstr " kunci rahasia diimpor: %lu\n" - -#: g10/import.c:319 -#, c-format -msgid " secret keys unchanged: %lu\n" -msgstr " kunci rahasia tidak berubah: %lu\n" - -#: g10/import.c:321 -#, c-format -msgid " not imported: %lu\n" -msgstr " tidak diimpor: %lu\n" - -#: g10/import.c:323 -#, fuzzy, c-format -msgid " signatures cleaned: %lu\n" -msgstr " signature baru: %lu\n" - -#: g10/import.c:325 -#, fuzzy, c-format -msgid " user IDs cleaned: %lu\n" -msgstr " kunci rahasia dibaca: %lu\n" - -#: g10/import.c:566 -#, 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:570 -#, fuzzy -msgid " algorithms on these user IDs:\n" -msgstr "Anda telah menandai ID user ini:\n" - -#: g10/import.c:607 -#, c-format -msgid " \"%s\": preference for cipher algorithm %s\n" -msgstr "" - -#: g10/import.c:619 -#, fuzzy, c-format -msgid " \"%s\": preference for digest algorithm %s\n" -msgstr "%s signature, algoritma digest %s\n" - -#: g10/import.c:631 -#, c-format -msgid " \"%s\": preference for compression algorithm %s\n" -msgstr "" - -#: g10/import.c:644 -msgid "it is strongly suggested that you update your preferences and\n" -msgstr "" - -#: g10/import.c:646 -msgid "re-distribute this key to avoid potential algorithm mismatch problems\n" -msgstr "" - -#: g10/import.c:670 -#, c-format -msgid "you can update your preferences with: gpg --edit-key %s updpref save\n" -msgstr "" - -#: g10/import.c:720 g10/import.c:1118 -#, fuzzy, c-format -msgid "key %s: no user ID\n" -msgstr "kunci %08lX: tidak ada ID user\n" - -#: g10/import.c:749 -#, fuzzy, c-format -msgid "key %s: PKS subkey corruption repaired\n" -msgstr "kunci %08lX: subkey HKP yang rusak diperbaiki\n" - -#: g10/import.c:764 -#, 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:770 -#, fuzzy, c-format -msgid "key %s: no valid user IDs\n" -msgstr "kunci %08lX: tidak ada ID user yang valid\n" - -#: g10/import.c:772 -msgid "this may be caused by a missing self-signature\n" -msgstr "mungkin disebabkan oleh self-signature yang tidak ada\n" - -#: g10/import.c:782 g10/import.c:1240 -#, fuzzy, c-format -msgid "key %s: public key not found: %s\n" -msgstr "kunci %08lX: kunci publik tidak ditemukan: %s\n" - -#: g10/import.c:788 -#, fuzzy, c-format -msgid "key %s: new key - skipped\n" -msgstr "kunci %08lX: kunci baru - dilewati\n" - -#: g10/import.c:797 -#, c-format -msgid "no writable keyring found: %s\n" -msgstr "tidak ditemukan keyring yang dapat ditulisi: %s\n" - -#: g10/import.c:802 g10/openfile.c:267 g10/sign.c:831 g10/sign.c:1135 -#, c-format -msgid "writing to `%s'\n" -msgstr "menulis ke `%s'\n" - -#: g10/import.c:806 g10/import.c:901 g10/import.c:1158 g10/import.c:1301 -#: g10/import.c:2363 g10/import.c:2385 -#, c-format -msgid "error writing keyring `%s': %s\n" -msgstr "kesalahan menulis keyring `%s': %s\n" - -#: g10/import.c:825 -#, fuzzy, c-format -msgid "key %s: public key \"%s\" imported\n" -msgstr "kunci %08lX: kunci publik \"%s\" diimpor\n" - -#: g10/import.c:849 -#, fuzzy, c-format -msgid "key %s: doesn't match our copy\n" -msgstr "kunci %08lX: tidak cocok dengan duplikat kami\n" - -#: g10/import.c:866 g10/import.c:1258 -#, 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:874 g10/import.c:1265 -#, 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:911 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new user ID\n" -msgstr "kunci %08lX: 1 user ID baru \"%s\"\n" - -#: g10/import.c:914 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new user IDs\n" -msgstr "kunci %08lX: \"%s\" %d user ID baru\n" - -#: g10/import.c:917 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new signature\n" -msgstr "kunci %08lX: \"%s\" 1 signature baru\n" - -#: g10/import.c:920 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new signatures\n" -msgstr "kunci %08lX: \"%s\" %d signature baru\n" - -#: g10/import.c:923 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new subkey\n" -msgstr "kunci %08lX: \"%s\" 1 subkey baru\n" - -#: g10/import.c:926 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new subkeys\n" -msgstr "kunci %08lX: \"%s\" %d subkey baru\n" - -#: g10/import.c:929 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signature cleaned\n" -msgstr "kunci %08lX: \"%s\" %d signature baru\n" - -#: g10/import.c:932 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signatures cleaned\n" -msgstr "kunci %08lX: \"%s\" %d signature baru\n" - -#: g10/import.c:935 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d user ID cleaned\n" -msgstr "kunci %08lX: \"%s\" %d user ID baru\n" - -#: g10/import.c:938 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d user IDs cleaned\n" -msgstr "kunci %08lX: \"%s\" %d user ID baru\n" - -#: g10/import.c:961 -#, fuzzy, c-format -msgid "key %s: \"%s\" not changed\n" -msgstr "kunci %08lX: \"%s\" tidak berubah\n" - -#: g10/import.c:1124 -#, 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:1135 -#, fuzzy -msgid "importing secret keys not allowed\n" -msgstr "menulis kunci rahasia ke `%s'\n" - -#: g10/import.c:1152 g10/import.c:2378 -#, c-format -msgid "no default secret keyring: %s\n" -msgstr "tidak ada keyring rahasia baku: %s\n" - -#: g10/import.c:1163 -#, fuzzy, c-format -msgid "key %s: secret key imported\n" -msgstr "kunci %08lX: kunci rahasia diimpor\n" - -#: g10/import.c:1193 -#, fuzzy, c-format -msgid "key %s: already in secret keyring\n" -msgstr "kunci %08lX: sudah ada di keyring rahasia\n" - -#: g10/import.c:1203 -#, fuzzy, c-format -msgid "key %s: secret key not found: %s\n" -msgstr "kunci %08lX: kunci rahasia tidak ditemukan: %s\n" - -#: g10/import.c:1233 -#, 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:1276 -#, 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:1308 -#, fuzzy, c-format -msgid "key %s: \"%s\" revocation certificate imported\n" -msgstr "kunci %08lX: \"%s\" sertifikat pembatalan diimpor\n" - -#: g10/import.c:1374 -#, 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:1389 -#, 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:1391 -#, 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:1409 -#, 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:1420 g10/import.c:1470 -#, fuzzy, c-format -msgid "key %s: unsupported public key algorithm\n" -msgstr "kunci %08lX: algoritma publik key tidak didukung\n" - -#: g10/import.c:1422 -#, fuzzy, c-format -msgid "key %s: invalid subkey binding\n" -msgstr "kunci %08lX: subkey binding tidak valid\n" - -#: g10/import.c:1437 -#, fuzzy, c-format -msgid "key %s: removed multiple subkey binding\n" -msgstr "kunci %08lX: hapus subkey binding ganda\n" - -#: g10/import.c:1459 -#, 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:1472 -#, fuzzy, c-format -msgid "key %s: invalid subkey revocation\n" -msgstr "kunci %08lX: pembatalan subkey tidak valid\n" - -#: g10/import.c:1487 -#, fuzzy, c-format -msgid "key %s: removed multiple subkey revocation\n" -msgstr "kunci %08lX: hapus pembatalan subkey ganda\n" - -#: g10/import.c:1529 -#, fuzzy, c-format -msgid "key %s: skipped user ID \"%s\"\n" -msgstr "kunci %08lX: melewati ID user " - -#: g10/import.c:1550 -#, fuzzy, c-format -msgid "key %s: skipped subkey\n" -msgstr "kunci %08lX: melewati subkey\n" - -#: g10/import.c:1577 -#, 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:1587 -#, 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:1604 -#, 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:1618 -#, 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:1626 -#, 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:1726 -#, fuzzy, c-format -msgid "key %s: duplicated user ID detected - merged\n" -msgstr "kunci %08lX: terdeteksi ID user duplikat - digabungkan\n" - -#: g10/import.c:1788 -#, 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:1802 -#, 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:1861 -#, fuzzy, c-format -msgid "key %s: \"%s\" revocation certificate added\n" -msgstr "kunci %08lX: \"%s\" penambahan sertifikat pembatalan\n" - -#: g10/import.c:1895 -#, fuzzy, c-format -msgid "key %s: direct key signature added\n" -msgstr "kunci %08lX: signature kunci langsung ditambahkan\n" - -#: g10/import.c:2284 -#, 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:2292 -#, fuzzy -msgid "NOTE: primary key is online and stored on card\n" -msgstr "dilewati: kunci pribadi telah ada\n" - -#: g10/import.c:2294 -#, 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:4783 g10/keyedit.c:4874 g10/keyedit.c:4938 -#: g10/keyedit.c:4999 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:3346 -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:3249 -#, fuzzy, c-format -msgid "User ID \"%s\": already clean\n" -msgstr "User ID \"%s\" telah dibatalkan\n" - -#: g10/keyedit.c:3341 -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:3352 -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:3372 -msgid "Enter the user ID of the designated revoker: " -msgstr "Masukkan user ID pihak yang ingin dibatalkan: " - -#: g10/keyedit.c:3397 -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:3412 -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:3434 -#, 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:3453 -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:3459 -#, 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:3520 -msgid "Please remove selections from the secret keys.\n" -msgstr "Silakan hapus pilihan dari kunci rahasia.\n" - -#: g10/keyedit.c:3526 -#, fuzzy -msgid "Please select at most one subkey.\n" -msgstr "Silakan pilih maksimum satu kunci sekunder.\n" - -#: g10/keyedit.c:3530 -#, fuzzy -msgid "Changing expiration time for a subkey.\n" -msgstr "Merubah batas waktu untuk kunci sekunder.\n" - -#: g10/keyedit.c:3533 -msgid "Changing expiration time for the primary key.\n" -msgstr "Merubah batas waktu untuk kunci primer.\n" - -#: g10/keyedit.c:3579 -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:3595 -msgid "No corresponding signature in secret ring\n" -msgstr "Tidak ada signature koresponden di ring rahasia\n" - -#: g10/keyedit.c:3668 -#, fuzzy, c-format -msgid "signing subkey %s is already cross-certified\n" -msgstr "PERINGATAN: subkey penandatangan %08lX tidak tersertifikasi silang\n" - -#: g10/keyedit.c:3674 -#, c-format -msgid "subkey %s does not sign and so does not need to be cross-certified\n" -msgstr "" - -#: g10/keyedit.c:3836 -msgid "Please select exactly one user ID.\n" -msgstr "Anda harus memilih minimum satu ID user.\n" - -#: g10/keyedit.c:3875 g10/keyedit.c:3985 g10/keyedit.c:4105 g10/keyedit.c:4246 -#, 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:4046 -msgid "Enter your preferred keyserver URL: " -msgstr "" - -#: g10/keyedit.c:4126 -#, fuzzy -msgid "Are you sure you want to replace it? (y/N) " -msgstr "Apakah anda yakin ingin menggunakannya? (y/N) " - -#: g10/keyedit.c:4127 -#, fuzzy -msgid "Are you sure you want to delete it? (y/N) " -msgstr "Apakah anda yakin ingin menggunakannya? (y/N) " - -#: g10/keyedit.c:4189 -#, fuzzy -msgid "Enter the notation: " -msgstr "Notasi signature: " - -#: g10/keyedit.c:4338 -#, fuzzy -msgid "Proceed? (y/N) " -msgstr "Ditimpa (y/T)? " - -#: g10/keyedit.c:4402 -#, c-format -msgid "No user ID with index %d\n" -msgstr "Tidak ada ID user dengan index %d\n" - -#: g10/keyedit.c:4460 -#, fuzzy, c-format -msgid "No user ID with hash %s\n" -msgstr "Tidak ada ID user dengan index %d\n" - -#: g10/keyedit.c:4487 -#, fuzzy, c-format -msgid "No subkey with index %d\n" -msgstr "Tidak ada ID user dengan index %d\n" - -#: g10/keyedit.c:4622 -#, fuzzy, c-format -msgid "user ID: \"%s\"\n" -msgstr "ID user: " - -#: g10/keyedit.c:4625 g10/keyedit.c:4689 g10/keyedit.c:4732 -#, 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:4627 g10/keyedit.c:4691 g10/keyedit.c:4734 -msgid " (non-exportable)" -msgstr " (tidak dapat diekspor)" - -#: g10/keyedit.c:4631 -#, c-format -msgid "This signature expired on %s.\n" -msgstr "Kunci ini akan kadaluarsa pada %s \n" - -#: g10/keyedit.c:4635 -msgid "Are you sure you still want to revoke it? (y/N) " -msgstr "Anda tetap ingin membatalkannya? (y/n) " - -#: g10/keyedit.c:4639 -msgid "Create a revocation certificate for this signature? (y/N) " -msgstr "Membuat sertifikat pembatalan untuk signature ini? (y/N)" - -#: g10/keyedit.c:4666 -#, 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:4692 -#, fuzzy -msgid " (non-revocable)" -msgstr " (tidak dapat diekspor)" - -#: g10/keyedit.c:4699 -#, fuzzy, c-format -msgid "revoked by your key %s on %s\n" -msgstr " dibatalkan oleh %08lX pada %s\n" - -#: g10/keyedit.c:4721 -msgid "You are about to revoke these signatures:\n" -msgstr "Anda akan membatalkan signature ini:\n" - -#: g10/keyedit.c:4741 -msgid "Really create the revocation certificates? (y/N) " -msgstr "Ingin membuat sertifikat pembatalan? (y/T)" - -#: g10/keyedit.c:4771 -msgid "no secret key\n" -msgstr "tidak ada kunci rahasia\n" - -#: g10/keyedit.c:4841 -#, c-format -msgid "user ID \"%s\" is already revoked\n" -msgstr "User ID \"%s\" telah dibatalkan\n" - -#: g10/keyedit.c:4858 -#, 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:4922 -#, fuzzy, c-format -msgid "Key %s is already revoked.\n" -msgstr "User ID \"%s\" telah dibatalkan\n" - -#: g10/keyedit.c:4984 -#, fuzzy, c-format -msgid "Subkey %s is already revoked.\n" -msgstr "User ID \"%s\" telah dibatalkan\n" - -#: g10/keyedit.c:5079 -#, 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:1421 -#, 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:1324 -#, fuzzy, c-format -msgid "sending key %s to %s server %s\n" -msgstr "mencari \"%s\" dari server HKP %s\n" - -#: g10/keyserver.c:1328 -#, fuzzy, c-format -msgid "sending key %s to %s\n" -msgstr "" -"\"\n" -"ditandai dengan kunci anda %08lX pada %s\n" - -#: g10/keyserver.c:1371 -#, fuzzy, c-format -msgid "searching for \"%s\" from %s server %s\n" -msgstr "mencari \"%s\" dari server HKP %s\n" - -#: g10/keyserver.c:1374 -#, fuzzy, c-format -msgid "searching for \"%s\" from %s\n" -msgstr "mencari \"%s\" dari server HKP %s\n" - -#: g10/keyserver.c:1381 g10/keyserver.c:1477 -#, fuzzy -msgid "no keyserver action!\n" -msgstr "opsi ekspor tidak valid\n" - -#: g10/keyserver.c:1429 -#, c-format -msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n" -msgstr "" - -#: g10/keyserver.c:1438 -msgid "keyserver did not send VERSION\n" -msgstr "" - -#: g10/keyserver.c:1500 g10/keyserver.c:2028 -msgid "no keyserver known (use option --keyserver)\n" -msgstr "" - -#: g10/keyserver.c:1506 -msgid "external keyserver calls are not supported in this build\n" -msgstr "" - -#: g10/keyserver.c:1518 -#, c-format -msgid "no handler for keyserver scheme `%s'\n" -msgstr "" - -#: g10/keyserver.c:1523 -#, c-format -msgid "action `%s' not supported with keyserver scheme `%s'\n" -msgstr "" - -#: g10/keyserver.c:1531 -#, c-format -msgid "%s does not support handler version %d\n" -msgstr "" - -#: g10/keyserver.c:1538 -#, fuzzy -msgid "keyserver timed out\n" -msgstr "kesalahan keyserver" - -#: g10/keyserver.c:1543 -#, fuzzy -msgid "keyserver internal error\n" -msgstr "kesalahan keyserver" - -#: g10/keyserver.c:1552 -#, fuzzy, c-format -msgid "keyserver communications error: %s\n" -msgstr "Penerimaan keyserver gagal: %s\n" - -#: g10/keyserver.c:1577 g10/keyserver.c:1611 -#, c-format -msgid "\"%s\" not a key ID: skipping\n" -msgstr "" - -#: g10/keyserver.c:1870 -#, 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:1892 -#, fuzzy, c-format -msgid "refreshing 1 key from %s\n" -msgstr "meminta kunci %08lX dari %s\n" - -#: g10/keyserver.c:1894 -#, fuzzy, c-format -msgid "refreshing %d keys from %s\n" -msgstr "meminta kunci %08lX dari %s\n" - -#: g10/keyserver.c:1950 -#, 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:1956 -#, 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:305 -#, c-format -msgid "assuming signed data in `%s'\n" -msgstr "mengasumsikan data bertanda dalam `%s'\n" - -#: g10/openfile.c:384 -#, c-format -msgid "new configuration file `%s' created\n" -msgstr "file konfigurasi baru `%s' tercipta\n" - -#: g10/openfile.c:386 -#, 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:418 -#, 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:1157 -#, 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:968 -#, 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:973 -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:977 -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:127 g10/skclist.c:191 -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:158 -#, fuzzy, c-format -msgid "skipped \"%s\": duplicated\n" -msgstr "lewati `%s': terduplikasi\n" - -#: g10/skclist.c:166 g10/skclist.c:176 g10/skclist.c:185 -#, fuzzy, c-format -msgid "skipped \"%s\": %s\n" -msgstr "melewati `%s': %s\n" - -#: g10/skclist.c:171 -msgid "skipped: secret key already present\n" -msgstr "dilewati: kunci pribadi telah ada\n" - -#: g10/skclist.c:186 -#, 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:350 -msgid "operation is not possible without initialized secure memory\n" -msgstr "operasi tidak mungkin tanpa menginisialisasi memori yang aman\n" - -#: util/secmem.c:351 -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 "User ID \"%s\": %d signature removed.\n" -#~ msgstr "User ID \"%s\" dibatalkan." - -#, fuzzy -#~ msgid "User ID \"%s\": %d signatures removed.\n" -#~ msgstr "User ID \"%s\" dibatalkan." - -#, fuzzy -#~ msgid "User ID \"%s\" removed: %s\n" -#~ msgstr "User ID \"%s\" dibatalkan." - -#, 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/it.po b/po/it.po deleted file mode 100644 index c5703bd17..000000000 --- a/po/it.po +++ /dev/null @@ -1,7228 +0,0 @@ -# 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-07-28 11:12+0200\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:1003 g10/gpg.c:3461 g10/import.c:195 g10/keygen.c:2385 -#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:342 -#: 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:1002 g10/keygen.c:2864 -#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:263 -#: g10/openfile.c:357 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:320 -#, c-format -msgid "armor: %s\n" -msgstr "armatura: %s\n" - -#: g10/armor.c:359 -msgid "invalid armor header: " -msgstr "header dell'armatura non valido: " - -#: g10/armor.c:370 -msgid "armor header: " -msgstr "header dell'armatura: " - -#: g10/armor.c:381 -msgid "invalid clearsig header\n" -msgstr "header della firma in chiaro non valido\n" - -#: g10/armor.c:433 -msgid "nested clear text signatures\n" -msgstr "firme in chiaro annidate\n" - -#: g10/armor.c:568 -#, fuzzy -msgid "unexpected armor: " -msgstr "armatura inaspettata:" - -#: g10/armor.c:580 -msgid "invalid dash escaped line: " -msgstr "riga protetta con il trattino non valida: " - -#: g10/armor.c:734 g10/armor.c:1343 -#, fuzzy, c-format -msgid "invalid radix64 character %02X skipped\n" -msgstr "Carattere radix64 non valido %02x saltato\n" - -#: g10/armor.c:777 -msgid "premature eof (no CRC)\n" -msgstr "eof prematura (nessun CRC)\n" - -#: g10/armor.c:811 -msgid "premature eof (in CRC)\n" -msgstr "eof prematura (nel CRC)\n" - -#: g10/armor.c:819 -msgid "malformed CRC\n" -msgstr "CRC malformato\n" - -#: g10/armor.c:823 g10/armor.c:1380 -#, fuzzy, c-format -msgid "CRC error; %06lX - %06lX\n" -msgstr "errore nel CRC; %06lx - %06lx\n" - -#: g10/armor.c:843 -#, fuzzy -msgid "premature eof (in trailer)\n" -msgstr "eof prematura (nella coda)\n" - -#: g10/armor.c:847 -msgid "error in trailer line\n" -msgstr "errore nella riga della coda\n" - -#: g10/armor.c:1158 -msgid "no valid OpenPGP data found.\n" -msgstr "Non sono stati trovati dati OpenPGP validi.\n" - -#: g10/armor.c:1163 -#, 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:1167 -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:280 -#, 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:3826 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:3387 g10/keyserver.c:1700 -#: 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:2349 g10/keyserver.c:1714 -#: 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:67 g10/mainproc.c:293 -#, c-format -msgid "%s encrypted data\n" -msgstr "dati cifrati con %s\n" - -#: g10/encr-data.c:69 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:93 -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:104 -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:415 -#, 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:375 -msgid "" -"@Commands:\n" -" " -msgstr "" -"@Comandi:\n" -" " - -#: g10/gpg.c:377 -msgid "|[file]|make a signature" -msgstr "|[file]|fai una firma" - -#: g10/gpg.c:378 -msgid "|[file]|make a clear text signature" -msgstr "|[file]|fai una firma mantenendo il testo in chiaro" - -#: g10/gpg.c:379 -msgid "make a detached signature" -msgstr "fai una firma separata" - -#: g10/gpg.c:380 -msgid "encrypt data" -msgstr "cifra dati" - -#: g10/gpg.c:382 -msgid "encryption only with symmetric cipher" -msgstr "cifra solo con un cifrario simmetrico" - -#: g10/gpg.c:384 -msgid "decrypt data (default)" -msgstr "decifra dati (predefinito)" - -#: g10/gpg.c:386 -msgid "verify a signature" -msgstr "verifica una firma" - -#: g10/gpg.c:388 -msgid "list keys" -msgstr "elenca le chiavi" - -#: g10/gpg.c:390 -msgid "list keys and signatures" -msgstr "elenca le chiavi e le firme" - -#: g10/gpg.c:391 -#, fuzzy -msgid "list and check key signatures" -msgstr "controlla le firme delle chiavi" - -#: g10/gpg.c:392 -msgid "list keys and fingerprints" -msgstr "elenca le chiavi e le impronte digitali" - -#: g10/gpg.c:393 -msgid "list secret keys" -msgstr "elenca le chiavi segrete" - -#: g10/gpg.c:394 -msgid "generate a new key pair" -msgstr "genera una nuova coppia di chiavi" - -#: g10/gpg.c:395 -msgid "remove keys from the public keyring" -msgstr "rimuove le chiavi dal portachiavi pubblico" - -#: g10/gpg.c:397 -msgid "remove keys from the secret keyring" -msgstr "rimuove le chiavi dal portachiavi privato" - -#: g10/gpg.c:398 -msgid "sign a key" -msgstr "firma una chiave" - -#: g10/gpg.c:399 -msgid "sign a key locally" -msgstr "firma una chiave localmente" - -#: g10/gpg.c:400 -msgid "sign or edit a key" -msgstr "firma o modifica una chiave" - -#: g10/gpg.c:401 -msgid "generate a revocation certificate" -msgstr "genera un certificato di revoca" - -#: g10/gpg.c:403 -msgid "export keys" -msgstr "esporta delle chiavi" - -#: g10/gpg.c:404 -msgid "export keys to a key server" -msgstr "esporta le chiavi a un key server" - -#: g10/gpg.c:405 -msgid "import keys from a key server" -msgstr "importa le chiavi da un key server" - -#: g10/gpg.c:407 -msgid "search for keys on a key server" -msgstr "cerca delle chiavi su un key server" - -#: g10/gpg.c:409 -msgid "update all keys from a keyserver" -msgstr "aggiorna tutte le chiavi da un key server" - -#: g10/gpg.c:413 -msgid "import/merge keys" -msgstr "importa/aggiungi delle chiavi" - -#: g10/gpg.c:416 -msgid "print the card status" -msgstr "" - -#: g10/gpg.c:417 -msgid "change data on a card" -msgstr "" - -#: g10/gpg.c:418 -msgid "change a card's PIN" -msgstr "" - -#: g10/gpg.c:426 -msgid "update the trust database" -msgstr "aggiorna il database della fiducia" - -#: g10/gpg.c:433 -msgid "|algo [files]|print message digests" -msgstr "|algo [files]|stampa tutti i message digests" - -#: g10/gpg.c:437 g10/gpgv.c:71 -msgid "" -"@\n" -"Options:\n" -" " -msgstr "" -"@\n" -"Opzioni:\n" -" " - -#: g10/gpg.c:439 -msgid "create ascii armored output" -msgstr "crea un output ascii con armatura" - -#: g10/gpg.c:441 -msgid "|NAME|encrypt for NAME" -msgstr "|NOME|cifra per NOME" - -#: g10/gpg.c:452 -msgid "use this user-id to sign or decrypt" -msgstr "usa questo user-id per firmare o decifrare" - -#: g10/gpg.c:453 -msgid "|N|set compress level N (0 disables)" -msgstr "|N|imposta il livello di compressione (0 disab.)" - -#: g10/gpg.c:458 -msgid "use canonical text mode" -msgstr "usa il modo testo canonico" - -#: g10/gpg.c:472 -msgid "use as output file" -msgstr "usa come file di output" - -#: g10/gpg.c:474 g10/gpgv.c:73 -msgid "verbose" -msgstr "prolisso" - -#: g10/gpg.c:485 -msgid "do not make any changes" -msgstr "non fa cambiamenti" - -#: g10/gpg.c:486 -msgid "prompt before overwriting" -msgstr "chiede prima di sovrascrivere" - -#: g10/gpg.c:527 -msgid "use strict OpenPGP behavior" -msgstr "" - -#: g10/gpg.c:528 -msgid "generate PGP 2.x compatible messages" -msgstr "" - -#: g10/gpg.c:556 -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:559 -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:757 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:774 -msgid "Usage: gpg [options] [files] (-h for help)" -msgstr "Uso: gpg [opzioni] [files] (-h per l'aiuto)" - -#: g10/gpg.c:777 -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:788 -msgid "" -"\n" -"Supported algorithms:\n" -msgstr "" -"\n" -"Algoritmi gestiti:\n" - -#: g10/gpg.c:791 -msgid "Pubkey: " -msgstr "A chiave pubblica: " - -#: g10/gpg.c:797 g10/keyedit.c:2310 -msgid "Cipher: " -msgstr "Cifrari: " - -#: g10/gpg.c:803 -msgid "Hash: " -msgstr "Hash: " - -#: g10/gpg.c:809 g10/keyedit.c:2356 -msgid "Compression: " -msgstr "Compressione: " - -#: g10/gpg.c:892 -msgid "usage: gpg [options] " -msgstr "uso: gpg [opzioni] " - -#: g10/gpg.c:1040 -msgid "conflicting commands\n" -msgstr "comandi in conflitto\n" - -#: g10/gpg.c:1058 -#, 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:1255 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on homedir `%s'\n" -msgstr "ATTENZIONE: il proprietario \"%s\" di %s insicuro\n" - -#: g10/gpg.c:1258 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on configuration file `%s'\n" -msgstr "ATTENZIONE: il proprietario \"%s\" di %s insicuro\n" - -#: g10/gpg.c:1261 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on extension `%s'\n" -msgstr "ATTENZIONE: il proprietario \"%s\" di %s insicuro\n" - -#: g10/gpg.c:1267 -#, fuzzy, c-format -msgid "WARNING: unsafe permissions on homedir `%s'\n" -msgstr "ATTENZIONE: i permessi \"%s\" di %s sono insicuri\n" - -#: g10/gpg.c:1270 -#, 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:1273 -#, fuzzy, c-format -msgid "WARNING: unsafe permissions on extension `%s'\n" -msgstr "ATTENZIONE: i permessi \"%s\" di %s sono insicuri\n" - -#: g10/gpg.c:1279 -#, 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:1282 -#, 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:1285 -#, 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:1291 -#, 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:1294 -#, 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:1297 -#, 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:1438 -#, fuzzy, c-format -msgid "unknown configuration item `%s'\n" -msgstr "elemento della configurazione sconosciuto \"%s\"\n" - -#: g10/gpg.c:1531 -msgid "display photo IDs during key listings" -msgstr "" - -#: g10/gpg.c:1533 -msgid "show policy URLs during signature listings" -msgstr "" - -#: g10/gpg.c:1535 -#, fuzzy -msgid "show all notations during signature listings" -msgstr "Manca la firma corrispondente nel portachiavi segreto\n" - -#: g10/gpg.c:1537 -msgid "show IETF standard notations during signature listings" -msgstr "" - -#: g10/gpg.c:1541 -msgid "show user-supplied notations during signature listings" -msgstr "" - -#: g10/gpg.c:1543 -#, fuzzy -msgid "show preferred keyserver URLs during signature listings" -msgstr "l'URL della politica di firma indicato non valido\n" - -#: g10/gpg.c:1545 -msgid "show user ID validity during key listings" -msgstr "" - -#: g10/gpg.c:1547 -msgid "show revoked and expired user IDs in key listings" -msgstr "" - -#: g10/gpg.c:1549 -msgid "show revoked and expired subkeys in key listings" -msgstr "" - -#: g10/gpg.c:1551 -#, fuzzy -msgid "show the keyring name in key listings" -msgstr "mostra in quali portachiavi sono contenute le chiavi elencate" - -#: g10/gpg.c:1553 -#, fuzzy -msgid "show expiration dates during signature listings" -msgstr "Manca la firma corrispondente nel portachiavi segreto\n" - -#: g10/gpg.c:1920 -#, 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:1962 -#, c-format -msgid "NOTE: no default option file `%s'\n" -msgstr "NOTA: manca il file `%s' con le opzioni predefinite\n" - -#: g10/gpg.c:1966 -#, c-format -msgid "option file `%s': %s\n" -msgstr "file con le opzioni `%s': %s\n" - -#: g10/gpg.c:1973 -#, c-format -msgid "reading options from `%s'\n" -msgstr "lettura delle opzioni da `%s'\n" - -#: g10/gpg.c:2188 g10/gpg.c:2814 g10/gpg.c:2833 -#, c-format -msgid "NOTE: %s is not for normal use!\n" -msgstr "NOTA: %s normalmente non deve essere usato!\n" - -#: g10/gpg.c:2201 -#, 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:2364 g10/gpg.c:2376 -#, fuzzy, c-format -msgid "`%s' is not a valid signature expiration\n" -msgstr "%s non un set di caratteri valido\n" - -#: g10/gpg.c:2452 -#, fuzzy, c-format -msgid "`%s' is not a valid character set\n" -msgstr "%s non un set di caratteri valido\n" - -#: g10/gpg.c:2476 g10/gpg.c:2663 g10/keyedit.c:4064 -#, fuzzy -msgid "could not parse keyserver URL\n" -msgstr "impossibile fare il parsing dell'URI del keyserver\n" - -#: g10/gpg.c:2488 -#, fuzzy, c-format -msgid "%s:%d: invalid keyserver options\n" -msgstr "%s:%d: opzioni di esportazione non valide\n" - -#: g10/gpg.c:2491 -#, fuzzy -msgid "invalid keyserver options\n" -msgstr "opzioni di esportazione non valide\n" - -#: g10/gpg.c:2498 -#, c-format -msgid "%s:%d: invalid import options\n" -msgstr "%s:%d: opzioni di importazione non valide\n" - -#: g10/gpg.c:2501 -msgid "invalid import options\n" -msgstr "opzioni di importazione non valide\n" - -#: g10/gpg.c:2508 -#, c-format -msgid "%s:%d: invalid export options\n" -msgstr "%s:%d: opzioni di esportazione non valide\n" - -#: g10/gpg.c:2511 -msgid "invalid export options\n" -msgstr "opzioni di esportazione non valide\n" - -#: g10/gpg.c:2518 -#, fuzzy, c-format -msgid "%s:%d: invalid list options\n" -msgstr "%s:%d: opzioni di importazione non valide\n" - -#: g10/gpg.c:2521 -#, fuzzy -msgid "invalid list options\n" -msgstr "opzioni di importazione non valide\n" - -#: g10/gpg.c:2529 -msgid "display photo IDs during signature verification" -msgstr "" - -#: g10/gpg.c:2531 -msgid "show policy URLs during signature verification" -msgstr "" - -#: g10/gpg.c:2533 -#, fuzzy -msgid "show all notations during signature verification" -msgstr "%s non un set di caratteri valido\n" - -#: g10/gpg.c:2535 -msgid "show IETF standard notations during signature verification" -msgstr "" - -#: g10/gpg.c:2539 -msgid "show user-supplied notations during signature verification" -msgstr "" - -#: g10/gpg.c:2541 -#, fuzzy -msgid "show preferred keyserver URLs during signature verification" -msgstr "l'URL della politica di firma indicato non valido\n" - -#: g10/gpg.c:2543 -#, fuzzy -msgid "show user ID validity during signature verification" -msgstr "%s non un set di caratteri valido\n" - -#: g10/gpg.c:2545 -msgid "show revoked and expired user IDs in signature verification" -msgstr "" - -#: g10/gpg.c:2547 -msgid "validate signatures with PKA data" -msgstr "" - -#: g10/gpg.c:2549 -msgid "elevate the trust of signatures with valid PKA data" -msgstr "" - -#: g10/gpg.c:2556 -#, fuzzy, c-format -msgid "%s:%d: invalid verify options\n" -msgstr "%s:%d: opzioni di esportazione non valide\n" - -#: g10/gpg.c:2559 -#, fuzzy -msgid "invalid verify options\n" -msgstr "opzioni di esportazione non valide\n" - -#: g10/gpg.c:2566 -#, c-format -msgid "unable to set exec-path to %s\n" -msgstr "impossibile impostare exec-path a %s\n" - -#: g10/gpg.c:2729 -#, fuzzy, c-format -msgid "%s:%d: invalid auto-key-locate list\n" -msgstr "%s:%d: opzioni di esportazione non valide\n" - -#: g10/gpg.c:2732 -msgid "invalid auto-key-locate list\n" -msgstr "" - -#: g10/gpg.c:2803 -msgid "WARNING: program may create a core file!\n" -msgstr "ATTENZIONE: il programma potrebbe creare un file core!\n" - -#: g10/gpg.c:2807 -#, c-format -msgid "WARNING: %s overrides %s\n" -msgstr "ATTENZIONE: %s ha la precedenza su %s\n" - -#: g10/gpg.c:2816 -#, c-format -msgid "%s not allowed with %s!\n" -msgstr "Non permesso usare %s con %s!\n" - -#: g10/gpg.c:2819 -#, c-format -msgid "%s makes no sense with %s!\n" -msgstr "Non ha senso usare %s con %s!\n" - -#: g10/gpg.c:2826 -#, 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:2841 -#, 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:2855 -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:2861 -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:2867 -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:2880 -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:2947 g10/gpg.c:2971 -msgid "selected cipher algorithm is invalid\n" -msgstr "l'algoritmo di cifratura selezionato non valido\n" - -#: g10/gpg.c:2953 g10/gpg.c:2977 -msgid "selected digest algorithm is invalid\n" -msgstr "l'algoritmo di digest selezionato non valido\n" - -#: g10/gpg.c:2959 -#, fuzzy -msgid "selected compression algorithm is invalid\n" -msgstr "l'algoritmo di cifratura selezionato non valido\n" - -#: g10/gpg.c:2965 -msgid "selected certification digest algorithm is invalid\n" -msgstr "l'algoritmo di digest selezionato non valido\n" - -#: g10/gpg.c:2980 -msgid "completes-needed must be greater than 0\n" -msgstr "completes-needed deve essere maggiore di 0\n" - -#: g10/gpg.c:2982 -msgid "marginals-needed must be greater than 1\n" -msgstr "marginals-needed deve essere maggiore di 1\n" - -#: g10/gpg.c:2984 -#, 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:2986 -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:2988 -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:2991 -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:2995 -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:3002 -msgid "invalid default preferences\n" -msgstr "preferenze predefinite non valide\n" - -#: g10/gpg.c:3011 -msgid "invalid personal cipher preferences\n" -msgstr "preferenze personali del cifrario non valide\n" - -#: g10/gpg.c:3015 -msgid "invalid personal digest preferences\n" -msgstr "preferenze personali del digest non valide\n" - -#: g10/gpg.c:3019 -msgid "invalid personal compress preferences\n" -msgstr "preferenze personali di compressione non valide\n" - -#: g10/gpg.c:3052 -#, c-format -msgid "%s does not yet work with %s\n" -msgstr "%s non funziona ancora con %s\n" - -#: g10/gpg.c:3099 -#, 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:3104 -#, 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:3109 -#, 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:3208 -#, c-format -msgid "failed to initialize the TrustDB: %s\n" -msgstr "inizializzazione del trustdb fallita: %s\n" - -#: g10/gpg.c:3219 -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:3230 -msgid "--store [filename]" -msgstr "--store [nomefile]" - -#: g10/gpg.c:3237 -msgid "--symmetric [filename]" -msgstr "--symmetric [nomefile]" - -#: g10/gpg.c:3239 -#, fuzzy, c-format -msgid "symmetric encryption of `%s' failed: %s\n" -msgstr "decifratura fallita: %s\n" - -#: g10/gpg.c:3249 -msgid "--encrypt [filename]" -msgstr "--encrypt [nomefile]" - -#: g10/gpg.c:3262 -#, fuzzy -msgid "--symmetric --encrypt [filename]" -msgstr "--sign --encrypt [nomefile]" - -#: g10/gpg.c:3264 -msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n" -msgstr "" - -#: g10/gpg.c:3267 -#, 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:3285 -msgid "--sign [filename]" -msgstr "--sign [nomefile]" - -#: g10/gpg.c:3298 -msgid "--sign --encrypt [filename]" -msgstr "--sign --encrypt [nomefile]" - -#: g10/gpg.c:3313 -#, fuzzy -msgid "--symmetric --sign --encrypt [filename]" -msgstr "--sign --encrypt [nomefile]" - -#: g10/gpg.c:3315 -msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n" -msgstr "" - -#: g10/gpg.c:3318 -#, 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:3338 -msgid "--sign --symmetric [filename]" -msgstr "--sign --symmetric [nomefile]" - -#: g10/gpg.c:3347 -msgid "--clearsign [filename]" -msgstr "--clearsign [nomefile]" - -#: g10/gpg.c:3372 -msgid "--decrypt [filename]" -msgstr "--decrypt [nomefile]" - -#: g10/gpg.c:3380 -msgid "--sign-key user-id" -msgstr "--sign-key user-id" - -#: g10/gpg.c:3384 -msgid "--lsign-key user-id" -msgstr "--lsign-key user-id" - -#: g10/gpg.c:3405 -msgid "--edit-key user-id [commands]" -msgstr "--edit-key user-id [comandi]" - -#: g10/gpg.c:3476 -msgid "-k[v][v][v][c] [user-id] [keyring]" -msgstr "-k[v][v][v][c] [user-id] [portachiavi]" - -#: g10/gpg.c:3518 -#, c-format -msgid "keyserver send failed: %s\n" -msgstr "invio al keyserver fallito: %s\n" - -#: g10/gpg.c:3520 -#, c-format -msgid "keyserver receive failed: %s\n" -msgstr "ricezione dal keyserver fallita: %s\n" - -#: g10/gpg.c:3522 -#, c-format -msgid "key export failed: %s\n" -msgstr "esportazione della chiave fallita: %s\n" - -#: g10/gpg.c:3533 -#, c-format -msgid "keyserver search failed: %s\n" -msgstr "ricerca nel keyserver fallita: %s\n" - -#: g10/gpg.c:3543 -#, c-format -msgid "keyserver refresh failed: %s\n" -msgstr "aggiornamento del keyserver fallito: %s\n" - -#: g10/gpg.c:3594 -#, c-format -msgid "dearmoring failed: %s\n" -msgstr "rimozione dell'armatura fallita: %s\n" - -#: g10/gpg.c:3602 -#, c-format -msgid "enarmoring failed: %s\n" -msgstr "creazione dell'armatura fallita: %s\n" - -#: g10/gpg.c:3689 -#, c-format -msgid "invalid hash algorithm `%s'\n" -msgstr "algoritmo di hash non valido `%s'\n" - -#: g10/gpg.c:3812 -msgid "[filename]" -msgstr "[nomefile]" - -#: g10/gpg.c:3816 -msgid "Go ahead and type your message ...\n" -msgstr "Vai avanti e scrivi il messaggio...\n" - -#: g10/gpg.c:4120 -msgid "the given certification policy URL is invalid\n" -msgstr "l'URL della politica di certificazione indicato non valido\n" - -#: g10/gpg.c:4122 -msgid "the given signature policy URL is invalid\n" -msgstr "l'URL della politica di firma indicato non valido\n" - -#: g10/gpg.c:4155 -#, 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:3707 -#, 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:266 -#, c-format -msgid "skipping block of type %d\n" -msgstr "salto un blocco di tipo %d\n" - -#: g10/import.c:275 -#, fuzzy, c-format -msgid "%lu keys processed so far\n" -msgstr "Per ora sono state esaminate %lu chiavi\n" - -#: g10/import.c:292 -#, c-format -msgid "Total number processed: %lu\n" -msgstr "Numero totale esaminato: %lu\n" - -#: g10/import.c:294 -#, c-format -msgid " skipped new keys: %lu\n" -msgstr " nuove chiavi saltate: %lu\n" - -#: g10/import.c:297 -#, c-format -msgid " w/o user IDs: %lu\n" -msgstr " senza user ID: %lu\n" - -#: g10/import.c:299 -#, c-format -msgid " imported: %lu" -msgstr " importate: %lu" - -#: g10/import.c:305 -#, c-format -msgid " unchanged: %lu\n" -msgstr " non modificate: %lu\n" - -#: g10/import.c:307 -#, c-format -msgid " new user IDs: %lu\n" -msgstr " nuovi user ID: %lu\n" - -#: g10/import.c:309 -#, c-format -msgid " new subkeys: %lu\n" -msgstr " nuove subchiavi: %lu\n" - -#: g10/import.c:311 -#, c-format -msgid " new signatures: %lu\n" -msgstr " nuove firme: %lu\n" - -#: g10/import.c:313 -#, c-format -msgid " new key revocations: %lu\n" -msgstr "nuove revoche di chiavi: %lu\n" - -#: g10/import.c:315 -#, c-format -msgid " secret keys read: %lu\n" -msgstr " chiavi segrete lette: %lu\n" - -#: g10/import.c:317 -#, c-format -msgid " secret keys imported: %lu\n" -msgstr "chiavi segrete importate: %lu\n" - -#: g10/import.c:319 -#, c-format -msgid " secret keys unchanged: %lu\n" -msgstr "chiavi segrete non cambiate: %lu\n" - -#: g10/import.c:321 -#, c-format -msgid " not imported: %lu\n" -msgstr " importate: %lu\n" - -#: g10/import.c:323 -#, fuzzy, c-format -msgid " signatures cleaned: %lu\n" -msgstr " nuove firme: %lu\n" - -#: g10/import.c:325 -#, fuzzy, c-format -msgid " user IDs cleaned: %lu\n" -msgstr " chiavi segrete lette: %lu\n" - -#: g10/import.c:566 -#, 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:570 -#, fuzzy -msgid " algorithms on these user IDs:\n" -msgstr "Non puoi cancellare l'ultimo user ID!\n" - -#: g10/import.c:607 -#, c-format -msgid " \"%s\": preference for cipher algorithm %s\n" -msgstr "" - -#: g10/import.c:619 -#, fuzzy, c-format -msgid " \"%s\": preference for digest algorithm %s\n" -msgstr "Firma %s, algoritmo di digest %s\n" - -#: g10/import.c:631 -#, c-format -msgid " \"%s\": preference for compression algorithm %s\n" -msgstr "" - -#: g10/import.c:644 -msgid "it is strongly suggested that you update your preferences and\n" -msgstr "" - -#: g10/import.c:646 -msgid "re-distribute this key to avoid potential algorithm mismatch problems\n" -msgstr "" - -#: g10/import.c:670 -#, c-format -msgid "you can update your preferences with: gpg --edit-key %s updpref save\n" -msgstr "" - -#: g10/import.c:720 g10/import.c:1118 -#, fuzzy, c-format -msgid "key %s: no user ID\n" -msgstr "chiave %08lX: nessun user ID\n" - -#: g10/import.c:749 -#, 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:764 -#, 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:770 -#, fuzzy, c-format -msgid "key %s: no valid user IDs\n" -msgstr "chiave %08lX: nessun user ID valido\n" - -#: g10/import.c:772 -msgid "this may be caused by a missing self-signature\n" -msgstr "questo pu essere causato da una autofirma mancante\n" - -#: g10/import.c:782 g10/import.c:1240 -#, fuzzy, c-format -msgid "key %s: public key not found: %s\n" -msgstr "chiave %08lX: chiave pubblica non trovata: %s\n" - -#: g10/import.c:788 -#, fuzzy, c-format -msgid "key %s: new key - skipped\n" -msgstr "chiave %08lX: nuova chiave - saltata\n" - -#: g10/import.c:797 -#, c-format -msgid "no writable keyring found: %s\n" -msgstr "non stato trovato un portachiavi scrivibile: %s\n" - -#: g10/import.c:802 g10/openfile.c:267 g10/sign.c:831 g10/sign.c:1135 -#, c-format -msgid "writing to `%s'\n" -msgstr "scrittura in `%s'\n" - -#: g10/import.c:806 g10/import.c:901 g10/import.c:1158 g10/import.c:1301 -#: g10/import.c:2363 g10/import.c:2385 -#, c-format -msgid "error writing keyring `%s': %s\n" -msgstr "errore scrivendo il portachiavi `%s': %s\n" - -#: g10/import.c:825 -#, fuzzy, c-format -msgid "key %s: public key \"%s\" imported\n" -msgstr "chiave %08lX: importata la chiave pubblica \"%s\"\n" - -#: g10/import.c:849 -#, fuzzy, c-format -msgid "key %s: doesn't match our copy\n" -msgstr "chiave %08lX: non corrisponde alla nostra copia\n" - -#: g10/import.c:866 g10/import.c:1258 -#, 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:874 g10/import.c:1265 -#, 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:911 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new user ID\n" -msgstr "chiave %08lX: \"%s\" 1 nuovo user ID\n" - -#: g10/import.c:914 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new user IDs\n" -msgstr "chiave %08lX: \"%s\" %d nuovi user ID\n" - -#: g10/import.c:917 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new signature\n" -msgstr "chiave %08lX: \"%s\" una nuova firma\n" - -#: g10/import.c:920 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new signatures\n" -msgstr "chiave %08lX: \"%s\" %d nuove firme\n" - -#: g10/import.c:923 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new subkey\n" -msgstr "chiave %08lX: \"%s\" una nuova subchiave\n" - -#: g10/import.c:926 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new subkeys\n" -msgstr "chiave %08lX: \"%s\" %d nuove subchiavi\n" - -#: g10/import.c:929 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signature cleaned\n" -msgstr "chiave %08lX: \"%s\" %d nuove firme\n" - -#: g10/import.c:932 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signatures cleaned\n" -msgstr "chiave %08lX: \"%s\" %d nuove firme\n" - -#: g10/import.c:935 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d user ID cleaned\n" -msgstr "chiave %08lX: \"%s\" %d nuovi user ID\n" - -#: g10/import.c:938 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d user IDs cleaned\n" -msgstr "chiave %08lX: \"%s\" %d nuovi user ID\n" - -#: g10/import.c:961 -#, fuzzy, c-format -msgid "key %s: \"%s\" not changed\n" -msgstr "chiave %08lX: \"%s\" non cambiata\n" - -#: g10/import.c:1124 -#, 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:1135 -#, fuzzy -msgid "importing secret keys not allowed\n" -msgstr "scrittura della chiave segreta in `%s'\n" - -#: g10/import.c:1152 g10/import.c:2378 -#, c-format -msgid "no default secret keyring: %s\n" -msgstr "nessun portachiavi segreto predefinito: %s\n" - -#: g10/import.c:1163 -#, fuzzy, c-format -msgid "key %s: secret key imported\n" -msgstr "chiave %08lX: chiave segreta importata\n" - -#: g10/import.c:1193 -#, fuzzy, c-format -msgid "key %s: already in secret keyring\n" -msgstr "chiave %08lX: gi nel portachiavi segreto\n" - -#: g10/import.c:1203 -#, fuzzy, c-format -msgid "key %s: secret key not found: %s\n" -msgstr "chiave %08lX: chiave segreta non trovata: %s\n" - -#: g10/import.c:1233 -#, 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:1276 -#, 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:1308 -#, fuzzy, c-format -msgid "key %s: \"%s\" revocation certificate imported\n" -msgstr "chiave %08lX: \"%s\" certificato di revoca importato\n" - -#: g10/import.c:1374 -#, 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:1389 -#, 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:1391 -#, 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:1409 -#, 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:1420 g10/import.c:1470 -#, fuzzy, c-format -msgid "key %s: unsupported public key algorithm\n" -msgstr "chiave %08lX: algoritmo a chiave pubblica non gestito\n" - -#: g10/import.c:1422 -#, fuzzy, c-format -msgid "key %s: invalid subkey binding\n" -msgstr "chiave %08lX: legame con la subchiave non valido:\n" - -#: g10/import.c:1437 -#, fuzzy, c-format -msgid "key %s: removed multiple subkey binding\n" -msgstr "chiave %08lX: rimossi i legami con subochiavi multiple\n" - -#: g10/import.c:1459 -#, 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:1472 -#, fuzzy, c-format -msgid "key %s: invalid subkey revocation\n" -msgstr "chiave %08lX: revoca della subchiave non valida\n" - -#: g10/import.c:1487 -#, fuzzy, c-format -msgid "key %s: removed multiple subkey revocation\n" -msgstr "chiave %08lX: rimosse le revoche di subchiavi multiple\n" - -#: g10/import.c:1529 -#, fuzzy, c-format -msgid "key %s: skipped user ID \"%s\"\n" -msgstr "chiave %08lX: saltato l'user ID '" - -#: g10/import.c:1550 -#, fuzzy, c-format -msgid "key %s: skipped subkey\n" -msgstr "chiave %08lX: saltata la subchiave\n" - -#: g10/import.c:1577 -#, 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:1587 -#, 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:1604 -#, 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:1618 -#, 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:1626 -#, 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:1726 -#, 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:1788 -#, 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:1802 -#, 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:1861 -#, fuzzy, c-format -msgid "key %s: \"%s\" revocation certificate added\n" -msgstr "chiave %08lX: certificato di revoca \"%s\" aggiunto\n" - -#: g10/import.c:1895 -#, fuzzy, c-format -msgid "key %s: direct key signature added\n" -msgstr "chiave %08lX: aggiunta una firma alla chiave diretta\n" - -#: g10/import.c:2284 -#, 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:2292 -#, fuzzy -msgid "NOTE: primary key is online and stored on card\n" -msgstr "saltata: chiave pubblica gi presente\n" - -#: g10/import.c:2294 -#, 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:4783 g10/keyedit.c:4874 g10/keyedit.c:4938 -#: g10/keyedit.c:4999 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:3346 -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:3249 -#, fuzzy, c-format -msgid "User ID \"%s\": already clean\n" -msgstr "l'user ID \"%s\" gi stato revocato\n" - -#: g10/keyedit.c:3341 -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:3352 -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:3372 -msgid "Enter the user ID of the designated revoker: " -msgstr "Inserisci l'user ID del revocatore designato: " - -#: g10/keyedit.c:3397 -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:3412 -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:3434 -#, 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:3453 -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:3459 -#, 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:3520 -msgid "Please remove selections from the secret keys.\n" -msgstr "Togli le selezioni dalle chiavi segrete.\n" - -#: g10/keyedit.c:3526 -#, fuzzy -msgid "Please select at most one subkey.\n" -msgstr "Seleziona al massimo una chiave secondaria.\n" - -#: g10/keyedit.c:3530 -#, fuzzy -msgid "Changing expiration time for a subkey.\n" -msgstr "Cambio la data di scadenza per una chiave secondaria.\n" - -#: g10/keyedit.c:3533 -msgid "Changing expiration time for the primary key.\n" -msgstr "Cambio la data di scadenza per la chiave primaria.\n" - -#: g10/keyedit.c:3579 -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:3595 -msgid "No corresponding signature in secret ring\n" -msgstr "Manca la firma corrispondente nel portachiavi segreto\n" - -#: g10/keyedit.c:3668 -#, 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:3674 -#, c-format -msgid "subkey %s does not sign and so does not need to be cross-certified\n" -msgstr "" - -#: g10/keyedit.c:3836 -msgid "Please select exactly one user ID.\n" -msgstr "Devi selezionare esattamente un user ID.\n" - -#: g10/keyedit.c:3875 g10/keyedit.c:3985 g10/keyedit.c:4105 g10/keyedit.c:4246 -#, 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:4046 -msgid "Enter your preferred keyserver URL: " -msgstr "" - -#: g10/keyedit.c:4126 -#, fuzzy -msgid "Are you sure you want to replace it? (y/N) " -msgstr "Sei sicuro di volerla usare? (s/N) " - -#: g10/keyedit.c:4127 -#, fuzzy -msgid "Are you sure you want to delete it? (y/N) " -msgstr "Sei sicuro di volerla usare? (s/N) " - -#: g10/keyedit.c:4189 -#, fuzzy -msgid "Enter the notation: " -msgstr "Annotazione della firma: " - -#: g10/keyedit.c:4338 -#, fuzzy -msgid "Proceed? (y/N) " -msgstr "Sovrascrivo (s/N)? " - -#: g10/keyedit.c:4402 -#, c-format -msgid "No user ID with index %d\n" -msgstr "Nessun user ID con l'indice %d\n" - -#: g10/keyedit.c:4460 -#, fuzzy, c-format -msgid "No user ID with hash %s\n" -msgstr "Nessun user ID con l'indice %d\n" - -#: g10/keyedit.c:4487 -#, fuzzy, c-format -msgid "No subkey with index %d\n" -msgstr "Nessun user ID con l'indice %d\n" - -#: g10/keyedit.c:4622 -#, fuzzy, c-format -msgid "user ID: \"%s\"\n" -msgstr "user ID: \"" - -#: g10/keyedit.c:4625 g10/keyedit.c:4689 g10/keyedit.c:4732 -#, 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:4627 g10/keyedit.c:4691 g10/keyedit.c:4734 -msgid " (non-exportable)" -msgstr " (non esportabile)" - -#: g10/keyedit.c:4631 -#, c-format -msgid "This signature expired on %s.\n" -msgstr "Questa chiave scaduta il %s.\n" - -#: g10/keyedit.c:4635 -msgid "Are you sure you still want to revoke it? (y/N) " -msgstr "Sei ancora sicuro di volerlo aggiungere? (s/N) " - -#: g10/keyedit.c:4639 -msgid "Create a revocation certificate for this signature? (y/N) " -msgstr "Creare un certificato di revoca per questa firma? (s/N) " - -#: g10/keyedit.c:4666 -#, 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:4692 -#, fuzzy -msgid " (non-revocable)" -msgstr " (non esportabile)" - -#: g10/keyedit.c:4699 -#, fuzzy, c-format -msgid "revoked by your key %s on %s\n" -msgstr " revocata da %08lX il %s\n" - -#: g10/keyedit.c:4721 -msgid "You are about to revoke these signatures:\n" -msgstr "Stai per revocare queste firme:\n" - -#: g10/keyedit.c:4741 -msgid "Really create the revocation certificates? (y/N) " -msgstr "Creare davvero i certificati di revoca? (s/N) " - -#: g10/keyedit.c:4771 -msgid "no secret key\n" -msgstr "manca la chiave segreta\n" - -#: g10/keyedit.c:4841 -#, c-format -msgid "user ID \"%s\" is already revoked\n" -msgstr "l'user ID \"%s\" gi stato revocato\n" - -#: g10/keyedit.c:4858 -#, 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:4922 -#, fuzzy, c-format -msgid "Key %s is already revoked.\n" -msgstr "l'user ID \"%s\" gi stato revocato\n" - -#: g10/keyedit.c:4984 -#, fuzzy, c-format -msgid "Subkey %s is already revoked.\n" -msgstr "l'user ID \"%s\" gi stato revocato\n" - -#: g10/keyedit.c:5079 -#, 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:1421 -#, 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:1324 -#, fuzzy, c-format -msgid "sending key %s to %s server %s\n" -msgstr "cerco \"%s\" sul server HKP %s\n" - -#: g10/keyserver.c:1328 -#, 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:1371 -#, fuzzy, c-format -msgid "searching for \"%s\" from %s server %s\n" -msgstr "cerco \"%s\" sul server HKP %s\n" - -#: g10/keyserver.c:1374 -#, fuzzy, c-format -msgid "searching for \"%s\" from %s\n" -msgstr "cerco \"%s\" sul server HKP %s\n" - -#: g10/keyserver.c:1381 g10/keyserver.c:1477 -#, fuzzy -msgid "no keyserver action!\n" -msgstr "opzioni di esportazione non valide\n" - -#: g10/keyserver.c:1429 -#, c-format -msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n" -msgstr "" - -#: g10/keyserver.c:1438 -msgid "keyserver did not send VERSION\n" -msgstr "" - -#: g10/keyserver.c:1500 g10/keyserver.c:2028 -msgid "no keyserver known (use option --keyserver)\n" -msgstr "" - -#: g10/keyserver.c:1506 -msgid "external keyserver calls are not supported in this build\n" -msgstr "" - -#: g10/keyserver.c:1518 -#, c-format -msgid "no handler for keyserver scheme `%s'\n" -msgstr "" - -#: g10/keyserver.c:1523 -#, c-format -msgid "action `%s' not supported with keyserver scheme `%s'\n" -msgstr "" - -#: g10/keyserver.c:1531 -#, c-format -msgid "%s does not support handler version %d\n" -msgstr "" - -#: g10/keyserver.c:1538 -#, fuzzy -msgid "keyserver timed out\n" -msgstr "errore del keyserver" - -#: g10/keyserver.c:1543 -#, fuzzy -msgid "keyserver internal error\n" -msgstr "errore del keyserver" - -#: g10/keyserver.c:1552 -#, fuzzy, c-format -msgid "keyserver communications error: %s\n" -msgstr "ricezione dal keyserver fallita: %s\n" - -#: g10/keyserver.c:1577 g10/keyserver.c:1611 -#, c-format -msgid "\"%s\" not a key ID: skipping\n" -msgstr "" - -#: g10/keyserver.c:1870 -#, 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:1892 -#, fuzzy, c-format -msgid "refreshing 1 key from %s\n" -msgstr "richiedo la chiave %08lX a %s\n" - -#: g10/keyserver.c:1894 -#, fuzzy, c-format -msgid "refreshing %d keys from %s\n" -msgstr "richiedo la chiave %08lX a %s\n" - -#: g10/keyserver.c:1950 -#, 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:1956 -#, 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:305 -#, c-format -msgid "assuming signed data in `%s'\n" -msgstr "suppongo che i dati firmati siano in `%s'\n" - -#: g10/openfile.c:384 -#, c-format -msgid "new configuration file `%s' created\n" -msgstr "creato un nuovo file di configurazione `%s'\n" - -#: g10/openfile.c:386 -#, 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:418 -#, 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:1157 -#, 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:968 -#, 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:973 -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:977 -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:127 g10/skclist.c:191 -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:158 -#, fuzzy, c-format -msgid "skipped \"%s\": duplicated\n" -msgstr "saltata `%s': doppia\n" - -#: g10/skclist.c:166 g10/skclist.c:176 g10/skclist.c:185 -#, fuzzy, c-format -msgid "skipped \"%s\": %s\n" -msgstr "saltata `%s': %s\n" - -#: g10/skclist.c:171 -msgid "skipped: secret key already present\n" -msgstr "saltata: chiave pubblica gi presente\n" - -#: g10/skclist.c:186 -#, 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:350 -msgid "operation is not possible without initialized secure memory\n" -msgstr "l'operazione non possibile senza memoria sicura inizializzata\n" - -#: util/secmem.c:351 -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 "User ID \"%s\": %d signature removed.\n" -#~ msgstr "L'user ID \"%s\" stato revocato." - -#, fuzzy -#~ msgid "User ID \"%s\": %d signatures removed.\n" -#~ msgstr "L'user ID \"%s\" stato revocato." - -#, fuzzy -#~ msgid "User ID \"%s\" removed: %s\n" -#~ msgstr "L'user ID \"%s\" stato revocato." - -#, 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.po b/po/ja.po deleted file mode 100644 index f0461318c..000000000 --- a/po/ja.po +++ /dev/null @@ -1,6549 +0,0 @@ -# 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-07-28 11:12+0200\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:1003 g10/gpg.c:3461 g10/import.c:195 g10/keygen.c:2385 -#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:342 -#: 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:1002 g10/keygen.c:2864 -#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:263 -#: g10/openfile.c:357 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%dPINûޤû%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 "ɤαʵץå%dAdmin 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:320 -#, c-format -msgid "armor: %s\n" -msgstr ": %s\n" - -#: g10/armor.c:359 -msgid "invalid armor header: " -msgstr "̵إå: " - -#: g10/armor.c:370 -msgid "armor header: " -msgstr "إå: " - -#: g10/armor.c:381 -msgid "invalid clearsig header\n" -msgstr "̵ʥꥢ̾إå\n" - -#: g10/armor.c:433 -msgid "nested clear text signatures\n" -msgstr "ҤΥꥢ̾\n" - -#: g10/armor.c:568 -msgid "unexpected armor: " -msgstr "ͽ: " - -#: g10/armor.c:580 -msgid "invalid dash escaped line: " -msgstr "̵ʥåǥפ줿: " - -#: g10/armor.c:734 g10/armor.c:1343 -#, c-format -msgid "invalid radix64 character %02X skipped\n" -msgstr "̵64ʸ%02XȤФޤ\n" - -#: g10/armor.c:777 -msgid "premature eof (no CRC)\n" -msgstr "ե᤹ޤ (CRCޤ)\n" - -#: g10/armor.c:811 -msgid "premature eof (in CRC)\n" -msgstr "ե᤹ޤ (CRC)\n" - -#: g10/armor.c:819 -msgid "malformed CRC\n" -msgstr "CRCν񼰤ޤ\n" - -#: g10/armor.c:823 g10/armor.c:1380 -#, c-format -msgid "CRC error; %06lX - %06lX\n" -msgstr "CRC顼%06lX - %06lX\n" - -#: g10/armor.c:843 -msgid "premature eof (in trailer)\n" -msgstr "ե᤹ޤ (ˤޤ)\n" - -#: g10/armor.c:847 -msgid "error in trailer line\n" -msgstr "ιԤ˥顼ޤ\n" - -#: g10/armor.c:1158 -msgid "no valid OpenPGP data found.\n" -msgstr "ͭOpenPGPǡĤޤ\n" - -#: g10/armor.c:1163 -#, c-format -msgid "invalid armor: line longer than %d characters\n" -msgstr "̵: ԤĹ%dʸĶƤޤ\n" - -#: g10/armor.c:1167 -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 "OpenPGPno. %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:280 -#, 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:3826 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:3387 g10/keyserver.c:1700 -#: 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:2349 g10/keyserver.c:1714 -#: 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:67 g10/mainproc.c:293 -#, c-format -msgid "%s encrypted data\n" -msgstr "%sŹ沽Ѥߥǡ\n" - -#: g10/encr-data.c:69 g10/mainproc.c:297 -#, c-format -msgid "encrypted with unknown algorithm %d\n" -msgstr "̤ΤΥ르ꥺ%dˤŹ沽\n" - -#: g10/encr-data.c:93 -msgid "" -"WARNING: message was encrypted with a weak key in the symmetric cipher.\n" -msgstr "ٹ: åоΰŹˡμ夤ǰŹ沽Ƥޤ\n" - -#: g10/encr-data.c:104 -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:415 -#, 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:375 -msgid "" -"@Commands:\n" -" " -msgstr "" -"@ޥ:\n" -" " - -#: g10/gpg.c:377 -msgid "|[file]|make a signature" -msgstr "|[ե]|̾" - -#: g10/gpg.c:378 -msgid "|[file]|make a clear text signature" -msgstr "|[ե]|ꥢ̾" - -#: g10/gpg.c:379 -msgid "make a detached signature" -msgstr "ʬΥ̾" - -#: g10/gpg.c:380 -msgid "encrypt data" -msgstr "ǡŹ沽" - -#: g10/gpg.c:382 -msgid "encryption only with symmetric cipher" -msgstr "Ź沽ˤоΰŹˡΤߤ" - -#: g10/gpg.c:384 -msgid "decrypt data (default)" -msgstr "ǡ ()" - -#: g10/gpg.c:386 -msgid "verify a signature" -msgstr "̾򸡾" - -#: g10/gpg.c:388 -msgid "list keys" -msgstr "ΰ" - -#: g10/gpg.c:390 -msgid "list keys and signatures" -msgstr "Ƚ̾ΰ" - -#: g10/gpg.c:391 -msgid "list and check key signatures" -msgstr "̾θȰ" - -#: g10/gpg.c:392 -msgid "list keys and fingerprints" -msgstr "Ȼΰ" - -#: g10/gpg.c:393 -msgid "list secret keys" -msgstr "̩ΰ" - -#: g10/gpg.c:394 -msgid "generate a new key pair" -msgstr "Ф" - -#: g10/gpg.c:395 -msgid "remove keys from the public keyring" -msgstr "ؤ鸰" - -#: g10/gpg.c:397 -msgid "remove keys from the secret keyring" -msgstr "̩ؤ鸰" - -#: g10/gpg.c:398 -msgid "sign a key" -msgstr "˽̾" - -#: g10/gpg.c:399 -msgid "sign a key locally" -msgstr "Ū˽̾" - -#: g10/gpg.c:400 -msgid "sign or edit a key" -msgstr "ؤν̾Խ" - -#: g10/gpg.c:401 -msgid "generate a revocation certificate" -msgstr "" - -#: g10/gpg.c:403 -msgid "export keys" -msgstr "񤭽Ф" - -#: g10/gpg.c:404 -msgid "export keys to a key server" -msgstr "С˸񤭽Ф" - -#: g10/gpg.c:405 -msgid "import keys from a key server" -msgstr "С鸰ɤ߹" - -#: g10/gpg.c:407 -msgid "search for keys on a key server" -msgstr "Сθ򸡺" - -#: g10/gpg.c:409 -msgid "update all keys from a keyserver" -msgstr "С鸰" - -#: g10/gpg.c:413 -msgid "import/merge keys" -msgstr "ɹ/ʻ" - -#: g10/gpg.c:416 -msgid "print the card status" -msgstr "ɾ֤ɽ" - -#: g10/gpg.c:417 -msgid "change data on a card" -msgstr "ɤΥǡѹ" - -#: g10/gpg.c:418 -msgid "change a card's PIN" -msgstr "ɤPINѹ" - -#: g10/gpg.c:426 -msgid "update the trust database" -msgstr "ѥǡ١򹹿" - -#: g10/gpg.c:433 -msgid "|algo [files]|print message digests" -msgstr "|르ꥺ [ե]|åɽ" - -#: g10/gpg.c:437 g10/gpgv.c:71 -msgid "" -"@\n" -"Options:\n" -" " -msgstr "" -"@\n" -"ץ:\n" -" " - -#: g10/gpg.c:439 -msgid "create ascii armored output" -msgstr "ASCII" - -#: g10/gpg.c:441 -msgid "|NAME|encrypt for NAME" -msgstr "|̾|̾Ѥ˰Ź沽" - -#: g10/gpg.c:452 -msgid "use this user-id to sign or decrypt" -msgstr "" -"̾ˤΥ桼id\n" -"" - -#: g10/gpg.c:453 -msgid "|N|set compress level N (0 disables)" -msgstr "" -"|N|̥٥N\n" -"(0󰵽)" - -#: g10/gpg.c:458 -msgid "use canonical text mode" -msgstr "ƥȡ⡼ɤ" - -#: g10/gpg.c:472 -msgid "use as output file" -msgstr "ϥեȤƻ" - -#: g10/gpg.c:474 g10/gpgv.c:73 -msgid "verbose" -msgstr "Ĺ" - -#: g10/gpg.c:485 -msgid "do not make any changes" -msgstr "̵ѹ" - -#: g10/gpg.c:486 -msgid "prompt before overwriting" -msgstr "˳ǧ" - -#: g10/gpg.c:527 -msgid "use strict OpenPGP behavior" -msgstr "̩OpenPGPο" - -#: g10/gpg.c:528 -msgid "generate PGP 2.x compatible messages" -msgstr "PGP 2.xߴΥå" - -#: g10/gpg.c:556 -msgid "" -"@\n" -"(See the man page for a complete listing of all commands and options)\n" -msgstr "" -"@\n" -"(ޥɤȥץΰϡ\n" -"ޥ˥奢롦ڡ)\n" - -#: g10/gpg.c:559 -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:757 g10/gpgv.c:98 -msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n" -msgstr "Х򸫤Ĥ <gnupg-bugs@gnu.org> ޤǤ𤯤\n" - -#: g10/gpg.c:774 -msgid "Usage: gpg [options] [files] (-h for help)" -msgstr "Ȥ: gpg [ץ] [ե] (إפ -h)" - -#: g10/gpg.c:777 -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:788 -msgid "" -"\n" -"Supported algorithms:\n" -msgstr "" -"\n" -"ݡȤƤ륢르ꥺ:\n" - -#: g10/gpg.c:791 -msgid "Pubkey: " -msgstr ": " - -#: g10/gpg.c:797 g10/keyedit.c:2310 -msgid "Cipher: " -msgstr "Źˡ: " - -#: g10/gpg.c:803 -msgid "Hash: " -msgstr "ϥå: " - -#: g10/gpg.c:809 g10/keyedit.c:2356 -msgid "Compression: " -msgstr ": " - -#: g10/gpg.c:892 -msgid "usage: gpg [options] " -msgstr "Ȥ: gpg [ץ] " - -#: g10/gpg.c:1040 -msgid "conflicting commands\n" -msgstr "Ω륳ޥ\n" - -#: g10/gpg.c:1058 -#, c-format -msgid "no = sign found in group definition `%s'\n" -msgstr "=椬롼%s˸Ĥޤ\n" - -#: g10/gpg.c:1255 -#, c-format -msgid "WARNING: unsafe ownership on homedir `%s'\n" -msgstr "ٹ: homedir %sפΰǤʤͭ\n" - -#: g10/gpg.c:1258 -#, c-format -msgid "WARNING: unsafe ownership on configuration file `%s'\n" -msgstr "ٹ: ե%sפΰǤʤͭ\n" - -#: g10/gpg.c:1261 -#, c-format -msgid "WARNING: unsafe ownership on extension `%s'\n" -msgstr "ٹ: ĥ%sפΰǤʤͭ\n" - -#: g10/gpg.c:1267 -#, c-format -msgid "WARNING: unsafe permissions on homedir `%s'\n" -msgstr "ٹ: homedir %sפΰǤʤ\n" - -#: g10/gpg.c:1270 -#, c-format -msgid "WARNING: unsafe permissions on configuration file `%s'\n" -msgstr "ٹ: ե%sפΰǤʤ\n" - -#: g10/gpg.c:1273 -#, c-format -msgid "WARNING: unsafe permissions on extension `%s'\n" -msgstr "ٹ: ĥ%sפΰǤʤ\n" - -#: g10/gpg.c:1279 -#, c-format -msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n" -msgstr "ٹ: homedir %sפΰǤʤ̥ǥ쥯ȥ꡼ͭ\n" - -#: g10/gpg.c:1282 -#, c-format -msgid "" -"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n" -msgstr "ٹ: ե%sפΰǤʤ̥ǥ쥯ȥ꡼ͭ\n" - -#: g10/gpg.c:1285 -#, c-format -msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n" -msgstr "ٹ: ĥ%sפΰǤʤ̥ǥ쥯ȥ꡼ͭ\n" - -#: g10/gpg.c:1291 -#, c-format -msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n" -msgstr "ٹ: homedir %sפΰǤʤ̥ǥ쥯ȥ꡼\n" - -#: g10/gpg.c:1294 -#, c-format -msgid "" -"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n" -msgstr "ٹ: ե%sפΰǤʤ̥ǥ쥯ȥ꡼\n" - -#: g10/gpg.c:1297 -#, c-format -msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n" -msgstr "ٹ: ĥ%sפΰǤʤ̥ǥ쥯ȥ꡼\n" - -#: g10/gpg.c:1438 -#, c-format -msgid "unknown configuration item `%s'\n" -msgstr "̤Τιܡ%s\n" - -#: g10/gpg.c:1531 -msgid "display photo IDs during key listings" -msgstr "" - -#: g10/gpg.c:1533 -msgid "show policy URLs during signature listings" -msgstr "" - -#: g10/gpg.c:1535 -#, fuzzy -msgid "show all notations during signature listings" -msgstr "̩ؤб̾ޤ\n" - -#: g10/gpg.c:1537 -msgid "show IETF standard notations during signature listings" -msgstr "" - -#: g10/gpg.c:1541 -msgid "show user-supplied notations during signature listings" -msgstr "" - -#: g10/gpg.c:1543 -#, fuzzy -msgid "show preferred keyserver URLs during signature listings" -msgstr "ꤵ줿СURL̵Ǥ\n" - -#: g10/gpg.c:1545 -msgid "show user ID validity during key listings" -msgstr "" - -#: g10/gpg.c:1547 -msgid "show revoked and expired user IDs in key listings" -msgstr "" - -#: g10/gpg.c:1549 -msgid "show revoked and expired subkeys in key listings" -msgstr "" - -#: g10/gpg.c:1551 -#, fuzzy -msgid "show the keyring name in key listings" -msgstr "̩ȸΰȿž" - -#: g10/gpg.c:1553 -#, fuzzy -msgid "show expiration dates during signature listings" -msgstr "̩ؤб̾ޤ\n" - -#: g10/gpg.c:1920 -#, c-format -msgid "NOTE: old default options file `%s' ignored\n" -msgstr ": Ρäץ󡦥ե%sפϡ̵뤵ޤ\n" - -#: g10/gpg.c:1962 -#, c-format -msgid "NOTE: no default option file `%s'\n" -msgstr ": Υץ󡦥ե%sפޤ\n" - -#: g10/gpg.c:1966 -#, c-format -msgid "option file `%s': %s\n" -msgstr "ץ󡦥ե%s: %s\n" - -#: g10/gpg.c:1973 -#, c-format -msgid "reading options from `%s'\n" -msgstr "%sפ饪ץɤ߽Фޤ\n" - -#: g10/gpg.c:2188 g10/gpg.c:2814 g10/gpg.c:2833 -#, c-format -msgid "NOTE: %s is not for normal use!\n" -msgstr ": %sϻȤޤ!\n" - -#: g10/gpg.c:2201 -#, c-format -msgid "cipher extension `%s' not loaded due to unsafe permissions\n" -msgstr "ǤʤĤΤᡢŹˡĥ%sפɤޤ\n" - -#: g10/gpg.c:2364 g10/gpg.c:2376 -#, fuzzy, c-format -msgid "`%s' is not a valid signature expiration\n" -msgstr "%sפϡͭʸǤϤޤ\n" - -#: g10/gpg.c:2452 -#, c-format -msgid "`%s' is not a valid character set\n" -msgstr "%sפϡͭʸǤϤޤ\n" - -#: g10/gpg.c:2476 g10/gpg.c:2663 g10/keyedit.c:4064 -msgid "could not parse keyserver URL\n" -msgstr "СURLǽ\n" - -#: g10/gpg.c:2488 -#, c-format -msgid "%s:%d: invalid keyserver options\n" -msgstr "%s:%d: ̵ʸСץǤ\n" - -#: g10/gpg.c:2491 -msgid "invalid keyserver options\n" -msgstr "̵ʸСץǤ\n" - -#: g10/gpg.c:2498 -#, c-format -msgid "%s:%d: invalid import options\n" -msgstr "%s:%d: ̵ɹߥץǤ\n" - -#: g10/gpg.c:2501 -msgid "invalid import options\n" -msgstr "̵ɹߥץǤ\n" - -#: g10/gpg.c:2508 -#, c-format -msgid "%s:%d: invalid export options\n" -msgstr "%s:%d: ̵ʽФץǤ\n" - -#: g10/gpg.c:2511 -msgid "invalid export options\n" -msgstr "̵ʽФץǤ\n" - -#: g10/gpg.c:2518 -#, c-format -msgid "%s:%d: invalid list options\n" -msgstr "%s:%d: ̵ʰץǤ\n" - -#: g10/gpg.c:2521 -msgid "invalid list options\n" -msgstr "̵ʰץǤ\n" - -#: g10/gpg.c:2529 -msgid "display photo IDs during signature verification" -msgstr "" - -#: g10/gpg.c:2531 -msgid "show policy URLs during signature verification" -msgstr "" - -#: g10/gpg.c:2533 -#, fuzzy -msgid "show all notations during signature verification" -msgstr "%sפϡͭʸǤϤޤ\n" - -#: g10/gpg.c:2535 -msgid "show IETF standard notations during signature verification" -msgstr "" - -#: g10/gpg.c:2539 -msgid "show user-supplied notations during signature verification" -msgstr "" - -#: g10/gpg.c:2541 -#, fuzzy -msgid "show preferred keyserver URLs during signature verification" -msgstr "ꤵ줿СURL̵Ǥ\n" - -#: g10/gpg.c:2543 -#, fuzzy -msgid "show user ID validity during signature verification" -msgstr "%sפϡͭʸǤϤޤ\n" - -#: g10/gpg.c:2545 -msgid "show revoked and expired user IDs in signature verification" -msgstr "" - -#: g10/gpg.c:2547 -msgid "validate signatures with PKA data" -msgstr "" - -#: g10/gpg.c:2549 -msgid "elevate the trust of signatures with valid PKA data" -msgstr "" - -#: g10/gpg.c:2556 -#, c-format -msgid "%s:%d: invalid verify options\n" -msgstr "%s:%d: ̵ʸڥץǤ\n" - -#: g10/gpg.c:2559 -msgid "invalid verify options\n" -msgstr "̵ʸڥץǤ\n" - -#: g10/gpg.c:2566 -#, c-format -msgid "unable to set exec-path to %s\n" -msgstr "exec-path%sǽ\n" - -#: g10/gpg.c:2729 -#, fuzzy, c-format -msgid "%s:%d: invalid auto-key-locate list\n" -msgstr "%s:%d: ̵ʸڥץǤ\n" - -#: g10/gpg.c:2732 -msgid "invalid auto-key-locate list\n" -msgstr "" - -#: g10/gpg.c:2803 -msgid "WARNING: program may create a core file!\n" -msgstr "ٹ: ץΥե뤬Ǥ뤳Ȥޤ!\n" - -#: g10/gpg.c:2807 -#, c-format -msgid "WARNING: %s overrides %s\n" -msgstr "ٹ: %s%sͥ\n" - -#: g10/gpg.c:2816 -#, c-format -msgid "%s not allowed with %s!\n" -msgstr "%s%sȤȤ˻ȤȤϤǤޤ!\n" - -#: g10/gpg.c:2819 -#, c-format -msgid "%s makes no sense with %s!\n" -msgstr "%s%sȤȤ˻ȤäƤ̵̣Ǥ!\n" - -#: g10/gpg.c:2826 -#, fuzzy, c-format -msgid "NOTE: %s is not available in this version\n" -msgstr "Υågpg-agent̵Ǥ\n" - -#: g10/gpg.c:2841 -#, fuzzy, c-format -msgid "will not run with insecure memory due to %s\n" -msgstr "%sפ̩֤񤭹ߤޤ\n" - -#: g10/gpg.c:2855 -msgid "you can only make detached or clear signatures while in --pgp2 mode\n" -msgstr "--pgp2⡼ɤǤʬΥ̾ꥢ̾Ǥޤ\n" - -#: g10/gpg.c:2861 -msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n" -msgstr "--pgp2⡼ɤǤϽ̾ȰŹ沽ƱˤǤޤ\n" - -#: g10/gpg.c:2867 -msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n" -msgstr "--pgp2ꤷ顢(ѥפǤʤ) եꤻͤФʤޤ\n" - -#: g10/gpg.c:2880 -msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n" -msgstr "--pgp2⡼ɤΥåŹ沽ǤϡIDEAŹˡɬפǤ\n" - -#: g10/gpg.c:2947 g10/gpg.c:2971 -msgid "selected cipher algorithm is invalid\n" -msgstr "򤵤줿Ź楢르ꥺϡ̵Ǥ\n" - -#: g10/gpg.c:2953 g10/gpg.c:2977 -msgid "selected digest algorithm is invalid\n" -msgstr "򤵤줿󥢥르ꥺϡ̵Ǥ\n" - -#: g10/gpg.c:2959 -msgid "selected compression algorithm is invalid\n" -msgstr "򤵤줿̥르ꥺϡ̵Ǥ\n" - -#: g10/gpg.c:2965 -msgid "selected certification digest algorithm is invalid\n" -msgstr "򤵤줿󥢥르ꥺϡ̵Ǥ\n" - -#: g10/gpg.c:2980 -msgid "completes-needed must be greater than 0\n" -msgstr "completes-neededͤɬפǤ\n" - -#: g10/gpg.c:2982 -msgid "marginals-needed must be greater than 1\n" -msgstr "marginals-needed1礭ͤɬפǤ\n" - -#: g10/gpg.c:2984 -msgid "max-cert-depth must be in the range from 1 to 255\n" -msgstr "max-cert-depth1255ϰϤǤʤФʤޤ\n" - -#: g10/gpg.c:2986 -msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n" -msgstr "̵default-cert-level0123ǤʤФʤޤ\n" - -#: g10/gpg.c:2988 -msgid "invalid min-cert-level; must be 1, 2, or 3\n" -msgstr "̵min-cert-level0123ǤʤФʤޤ\n" - -#: g10/gpg.c:2991 -msgid "NOTE: simple S2K mode (0) is strongly discouraged\n" -msgstr ": ñS2K⡼(0)λѤˤ϶ȿФޤ\n" - -#: g10/gpg.c:2995 -msgid "invalid S2K mode; must be 0, 1 or 3\n" -msgstr "̵S2K⡼ɡ013ǤʤФʤޤ\n" - -#: g10/gpg.c:3002 -msgid "invalid default preferences\n" -msgstr "̵ʴ\n" - -#: g10/gpg.c:3011 -msgid "invalid personal cipher preferences\n" -msgstr "̵ʸĿѰŹˡ\n" - -#: g10/gpg.c:3015 -msgid "invalid personal digest preferences\n" -msgstr "̵ʸĿ\n" - -#: g10/gpg.c:3019 -msgid "invalid personal compress preferences\n" -msgstr "̵ʸĿѰ̤\n" - -#: g10/gpg.c:3052 -#, c-format -msgid "%s does not yet work with %s\n" -msgstr "%s%sǵǽޤ\n" - -#: g10/gpg.c:3099 -#, c-format -msgid "you may not use cipher algorithm `%s' while in %s mode\n" -msgstr "Ź楢르ꥺ%sפ%s⡼ɤǻȤȤϤǤޤ\n" - -#: g10/gpg.c:3104 -#, c-format -msgid "you may not use digest algorithm `%s' while in %s mode\n" -msgstr "󥢥르ꥺ%sפ%s⡼ɤǻȤȤϤǤޤ\n" - -#: g10/gpg.c:3109 -#, c-format -msgid "you may not use compression algorithm `%s' while in %s mode\n" -msgstr "̥르ꥺ%sפ%s⡼ɤǻȤȤϤǤޤ\n" - -#: g10/gpg.c:3208 -#, c-format -msgid "failed to initialize the TrustDB: %s\n" -msgstr "ѥǡ١ν˼Ԥޤ: %s\n" - -#: g10/gpg.c:3219 -msgid "WARNING: recipients (-r) given without using public key encryption\n" -msgstr "ٹ: ŹȤ鷺ˡ (-r) ꤷƤޤ\n" - -#: g10/gpg.c:3230 -msgid "--store [filename]" -msgstr "--store [ե̾]" - -#: g10/gpg.c:3237 -msgid "--symmetric [filename]" -msgstr "--symmetric [ե̾]" - -#: g10/gpg.c:3239 -#, c-format -msgid "symmetric encryption of `%s' failed: %s\n" -msgstr "%sפоΰŹ˼Ԥޤ: %s\n" - -#: g10/gpg.c:3249 -msgid "--encrypt [filename]" -msgstr "--encrypt [ե̾]" - -#: g10/gpg.c:3262 -msgid "--symmetric --encrypt [filename]" -msgstr "--symmetric --encrypt [ե̾]" - -#: g10/gpg.c:3264 -msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n" -msgstr "--symmetric --encrypt--s2k-mode 0ǻȤȤϤǤޤ\n" - -#: g10/gpg.c:3267 -#, c-format -msgid "you cannot use --symmetric --encrypt while in %s mode\n" -msgstr "--symmetric --encrypt%s⡼ɤǻȤȤϤǤޤ\n" - -#: g10/gpg.c:3285 -msgid "--sign [filename]" -msgstr "--sign [ե̾]" - -#: g10/gpg.c:3298 -msgid "--sign --encrypt [filename]" -msgstr "--sign --encrypt [ե̾]" - -#: g10/gpg.c:3313 -msgid "--symmetric --sign --encrypt [filename]" -msgstr "--symmetric --sign --encrypt [ե̾]" - -#: g10/gpg.c:3315 -msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n" -msgstr "--symmetric --sign --encrypt--s2k-mode 0ǻȤȤϤǤޤ\n" - -#: g10/gpg.c:3318 -#, c-format -msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n" -msgstr "--symmetric --sign --encrypt%s⡼ɤǻȤȤϤǤޤ\n" - -#: g10/gpg.c:3338 -msgid "--sign --symmetric [filename]" -msgstr "--sign --symmetric [ե̾]" - -#: g10/gpg.c:3347 -msgid "--clearsign [filename]" -msgstr "--clearsign [ե̾]" - -#: g10/gpg.c:3372 -msgid "--decrypt [filename]" -msgstr "--decrypt [ե̾]" - -#: g10/gpg.c:3380 -msgid "--sign-key user-id" -msgstr "--sign-key 桼id" - -#: g10/gpg.c:3384 -msgid "--lsign-key user-id" -msgstr "--lsign-key 桼id" - -#: g10/gpg.c:3405 -msgid "--edit-key user-id [commands]" -msgstr "--edit-key 桼id [ޥ]" - -#: g10/gpg.c:3476 -msgid "-k[v][v][v][c] [user-id] [keyring]" -msgstr "-k[v][v][v][c] [桼id] []" - -#: g10/gpg.c:3518 -#, c-format -msgid "keyserver send failed: %s\n" -msgstr "Сؤ˼Ԥޤ: %s\n" - -#: g10/gpg.c:3520 -#, c-format -msgid "keyserver receive failed: %s\n" -msgstr "Сμ˼Ԥޤ: %s\n" - -#: g10/gpg.c:3522 -#, c-format -msgid "key export failed: %s\n" -msgstr "νФ˼Ԥޤ: %s\n" - -#: g10/gpg.c:3533 -#, c-format -msgid "keyserver search failed: %s\n" -msgstr "Сθ˼Ԥޤ: %s\n" - -#: g10/gpg.c:3543 -#, c-format -msgid "keyserver refresh failed: %s\n" -msgstr "Сβ˼Ԥޤ: %s\n" - -#: g10/gpg.c:3594 -#, c-format -msgid "dearmoring failed: %s\n" -msgstr "˼Ԥޤ: %s\n" - -#: g10/gpg.c:3602 -#, c-format -msgid "enarmoring failed: %s\n" -msgstr "˼Ԥޤ: %s\n" - -#: g10/gpg.c:3689 -#, c-format -msgid "invalid hash algorithm `%s'\n" -msgstr "̵ʥϥå塦르ꥺ%sפǤ\n" - -#: g10/gpg.c:3812 -msgid "[filename]" -msgstr "[ե̾]" - -#: g10/gpg.c:3816 -msgid "Go ahead and type your message ...\n" -msgstr "ϤޤåǤäƤ ...\n" - -#: g10/gpg.c:4120 -msgid "the given certification policy URL is invalid\n" -msgstr "줿ݥꥷURL̵Ǥ\n" - -#: g10/gpg.c:4122 -msgid "the given signature policy URL is invalid\n" -msgstr "줿̾ݥꥷURL̵Ǥ\n" - -#: g10/gpg.c:4155 -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:3707 -#, 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" -"嵭23ϡ*ñʤ*ˤʤȤȤǰƬˤ\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:266 -#, c-format -msgid "skipping block of type %d\n" -msgstr "%dΥ֥åȤФޤ\n" - -#: g10/import.c:275 -#, c-format -msgid "%lu keys processed so far\n" -msgstr "%luޤǽ\n" - -#: g10/import.c:292 -#, c-format -msgid "Total number processed: %lu\n" -msgstr " ι: %lu\n" - -#: g10/import.c:294 -#, c-format -msgid " skipped new keys: %lu\n" -msgstr "ȤФ: %lu\n" - -#: g10/import.c:297 -#, c-format -msgid " w/o user IDs: %lu\n" -msgstr " 桼IDʤ: %lu\n" - -#: g10/import.c:299 -#, c-format -msgid " imported: %lu" -msgstr " ɹ: %lu" - -#: g10/import.c:305 -#, c-format -msgid " unchanged: %lu\n" -msgstr " ѹʤ: %lu\n" - -#: g10/import.c:307 -#, c-format -msgid " new user IDs: %lu\n" -msgstr "桼ID: %lu\n" - -#: g10/import.c:309 -#, c-format -msgid " new subkeys: %lu\n" -msgstr " : %lu\n" - -#: g10/import.c:311 -#, c-format -msgid " new signatures: %lu\n" -msgstr " ̾: %lu\n" - -#: g10/import.c:313 -#, c-format -msgid " new key revocations: %lu\n" -msgstr " μ: %lu\n" - -#: g10/import.c:315 -#, c-format -msgid " secret keys read: %lu\n" -msgstr " ̩ɽФ: %lu\n" - -#: g10/import.c:317 -#, c-format -msgid " secret keys imported: %lu\n" -msgstr " ̩ɹ: %lu\n" - -#: g10/import.c:319 -#, c-format -msgid " secret keys unchanged: %lu\n" -msgstr " ̵ѹ̩: %lu\n" - -#: g10/import.c:321 -#, c-format -msgid " not imported: %lu\n" -msgstr " ̤ɹ: %lu\n" - -#: g10/import.c:323 -#, fuzzy, c-format -msgid " signatures cleaned: %lu\n" -msgstr "ޤǤ˺줿̾: %lu\n" - -#: g10/import.c:325 -#, fuzzy, c-format -msgid " user IDs cleaned: %lu\n" -msgstr " ̩ɽФ: %lu\n" - -#: g10/import.c:566 -#, 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:570 -#, fuzzy -msgid " algorithms on these user IDs:\n" -msgstr "Υ桼IDΥ르ꥺ:\n" - -#: g10/import.c:607 -#, c-format -msgid " \"%s\": preference for cipher algorithm %s\n" -msgstr " \"%s\": Ź楢르ꥺ %s\n" - -#: g10/import.c:619 -#, c-format -msgid " \"%s\": preference for digest algorithm %s\n" -msgstr " \"%s\": 󥢥르ꥺ %s\n" - -#: g10/import.c:631 -#, c-format -msgid " \"%s\": preference for compression algorithm %s\n" -msgstr " \"%s\": ̥르ꥺ %s\n" - -#: g10/import.c:644 -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:646 -msgid "re-distribute this key to avoid potential algorithm mismatch problems\n" -msgstr "" -"Ūʥ르ꥺ԰򤱤뤿ᡢθۤƤ\n" - -#: g10/import.c:670 -#, 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:720 g10/import.c:1118 -#, c-format -msgid "key %s: no user ID\n" -msgstr "%s: 桼IDޤ\n" - -#: g10/import.c:749 -#, c-format -msgid "key %s: PKS subkey corruption repaired\n" -msgstr "%s: PKS¤\n" - -#: g10/import.c:764 -#, c-format -msgid "key %s: accepted non self-signed user ID \"%s\"\n" -msgstr "%s: ̤ʽ̾Υ桼ID%s\n" - -#: g10/import.c:770 -#, c-format -msgid "key %s: no valid user IDs\n" -msgstr "%s: ͭʥ桼IDޤ\n" - -#: g10/import.c:772 -msgid "this may be caused by a missing self-signature\n" -msgstr "ʽ̾ΤʤǤ礦\n" - -#: g10/import.c:782 g10/import.c:1240 -#, c-format -msgid "key %s: public key not found: %s\n" -msgstr "%s: Ĥޤ: %s\n" - -#: g10/import.c:788 -#, c-format -msgid "key %s: new key - skipped\n" -msgstr "%s: Ǥ - ȤФޤ\n" - -#: g10/import.c:797 -#, c-format -msgid "no writable keyring found: %s\n" -msgstr "߲ǽʸؤĤޤ: %s\n" - -#: g10/import.c:802 g10/openfile.c:267 g10/sign.c:831 g10/sign.c:1135 -#, c-format -msgid "writing to `%s'\n" -msgstr "%sפؤν\n" - -#: g10/import.c:806 g10/import.c:901 g10/import.c:1158 g10/import.c:1301 -#: g10/import.c:2363 g10/import.c:2385 -#, c-format -msgid "error writing keyring `%s': %s\n" -msgstr "ء%sפνߥ顼: %s\n" - -#: g10/import.c:825 -#, c-format -msgid "key %s: public key \"%s\" imported\n" -msgstr "%s: %sɤɤ߹ߤޤ\n" - -#: g10/import.c:849 -#, c-format -msgid "key %s: doesn't match our copy\n" -msgstr "%s: ʣȹ礤ޤ\n" - -#: g10/import.c:866 g10/import.c:1258 -#, c-format -msgid "key %s: can't locate original keyblock: %s\n" -msgstr "%s: θ֥å˰֤ŤǤޤ: %s\n" - -#: g10/import.c:874 g10/import.c:1265 -#, c-format -msgid "key %s: can't read original keyblock: %s\n" -msgstr "%s: θ֥åɤ߽Фޤ: %s\n" - -#: g10/import.c:911 -#, c-format -msgid "key %s: \"%s\" 1 new user ID\n" -msgstr "%s:%sɿ桼ID1\n" - -#: g10/import.c:914 -#, c-format -msgid "key %s: \"%s\" %d new user IDs\n" -msgstr "%s:%sɿ桼ID%d\n" - -#: g10/import.c:917 -#, c-format -msgid "key %s: \"%s\" 1 new signature\n" -msgstr "%s:%sɿ̾1\n" - -#: g10/import.c:920 -#, c-format -msgid "key %s: \"%s\" %d new signatures\n" -msgstr "%s:%sɿ̾%d\n" - -#: g10/import.c:923 -#, c-format -msgid "key %s: \"%s\" 1 new subkey\n" -msgstr "%s:%sɿ1\n" - -#: g10/import.c:926 -#, c-format -msgid "key %s: \"%s\" %d new subkeys\n" -msgstr "%s:%sɿ%d\n" - -#: g10/import.c:929 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signature cleaned\n" -msgstr "%s:%sɿ̾%d\n" - -#: g10/import.c:932 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signatures cleaned\n" -msgstr "%s:%sɿ̾%d\n" - -#: g10/import.c:935 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d user ID cleaned\n" -msgstr "%s:%sɿ桼ID%d\n" - -#: g10/import.c:938 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d user IDs cleaned\n" -msgstr "%s:%sɿ桼ID%d\n" - -#: g10/import.c:961 -#, c-format -msgid "key %s: \"%s\" not changed\n" -msgstr "%s:%sѹʤ\n" - -#: g10/import.c:1124 -#, c-format -msgid "key %s: secret key with invalid cipher %d - skipped\n" -msgstr "%s: ̵ʰŹˡ%d̩Ǥ - ȤФޤ\n" - -#: g10/import.c:1135 -msgid "importing secret keys not allowed\n" -msgstr "̩ɹߤ϶ػߤǤ\n" - -#: g10/import.c:1152 g10/import.c:2378 -#, c-format -msgid "no default secret keyring: %s\n" -msgstr "̩ؤޤ: %s\n" - -#: g10/import.c:1163 -#, c-format -msgid "key %s: secret key imported\n" -msgstr "%s: ̩ɤ߹ߤޤ\n" - -#: g10/import.c:1193 -#, c-format -msgid "key %s: already in secret keyring\n" -msgstr "%s: ⤦̩ؤˤޤ\n" - -#: g10/import.c:1203 -#, c-format -msgid "key %s: secret key not found: %s\n" -msgstr "%s: ̩Ĥޤ: %s\n" - -#: g10/import.c:1233 -#, c-format -msgid "key %s: no public key - can't apply revocation certificate\n" -msgstr "%s: ޤ - ŬѤǤޤ\n" - -#: g10/import.c:1276 -#, c-format -msgid "key %s: invalid revocation certificate: %s - rejected\n" -msgstr "%s: ̵ʼ: %s - \n" - -#: g10/import.c:1308 -#, c-format -msgid "key %s: \"%s\" revocation certificate imported\n" -msgstr "%s:%sɼɤ߹ߤޤ\n" - -#: g10/import.c:1374 -#, c-format -msgid "key %s: no user ID for signature\n" -msgstr "%s: ̾б桼IDޤ\n" - -#: g10/import.c:1389 -#, c-format -msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n" -msgstr "%s: 桼ID%sɤΥݡȤƤʤ르ꥺǤ\n" - -#: g10/import.c:1391 -#, c-format -msgid "key %s: invalid self-signature on user ID \"%s\"\n" -msgstr "%s: 桼ID%sɤμʽ̵̾Ǥ\n" - -#: g10/import.c:1409 -#, c-format -msgid "key %s: no subkey for key binding\n" -msgstr "%s: бޤ\n" - -#: g10/import.c:1420 g10/import.c:1470 -#, c-format -msgid "key %s: unsupported public key algorithm\n" -msgstr "%s: ݡȤƤʤ르ꥺǤ\n" - -#: g10/import.c:1422 -#, c-format -msgid "key %s: invalid subkey binding\n" -msgstr "%s: ̵бǤ\n" - -#: g10/import.c:1437 -#, c-format -msgid "key %s: removed multiple subkey binding\n" -msgstr "%s: ¿бޤ\n" - -#: g10/import.c:1459 -#, c-format -msgid "key %s: no subkey for key revocation\n" -msgstr "%s: ˤޤ\n" - -#: g10/import.c:1472 -#, c-format -msgid "key %s: invalid subkey revocation\n" -msgstr "%s: ̵Ǥ\n" - -#: g10/import.c:1487 -#, c-format -msgid "key %s: removed multiple subkey revocation\n" -msgstr "%s: ̵¿żޤ\n" - -#: g10/import.c:1529 -#, c-format -msgid "key %s: skipped user ID \"%s\"\n" -msgstr "%s: ȤФ桼ID%s\n" - -#: g10/import.c:1550 -#, c-format -msgid "key %s: skipped subkey\n" -msgstr "%s: ȤФ\n" - -#: g10/import.c:1577 -#, c-format -msgid "key %s: non exportable signature (class 0x%02X) - skipped\n" -msgstr "%s: ФԲĤʽ̾ (饹%02X) - ȤФޤ\n" - -#: g10/import.c:1587 -#, c-format -msgid "key %s: revocation certificate at wrong place - skipped\n" -msgstr "%s: 񤬸äꤵƤޤ - ȤФޤ\n" - -#: g10/import.c:1604 -#, c-format -msgid "key %s: invalid revocation certificate: %s - skipped\n" -msgstr "%s: ̵ʼ: %s - ȤФޤ\n" - -#: g10/import.c:1618 -#, c-format -msgid "key %s: subkey signature in wrong place - skipped\n" -msgstr "%s: ̾ξ꤬äƤޤ - ȤФޤ\n" - -#: g10/import.c:1626 -#, c-format -msgid "key %s: unexpected signature class (0x%02X) - skipped\n" -msgstr "%s: ͽ̽̾饹 (0x%02X) - ȤФޤ\n" - -#: g10/import.c:1726 -#, c-format -msgid "key %s: duplicated user ID detected - merged\n" -msgstr "%s: ʣ桼IDθ - ʻ\n" - -#: g10/import.c:1788 -#, c-format -msgid "WARNING: key %s may be revoked: fetching revocation key %s\n" -msgstr "ٹ: %sϼ줿褦Ǥ: %sΰФ\n" - -#: g10/import.c:1802 -#, c-format -msgid "WARNING: key %s may be revoked: revocation key %s not present.\n" -msgstr "ٹ: %sϼ줿褦Ǥ: %sԺߡ\n" - -#: g10/import.c:1861 -#, c-format -msgid "key %s: \"%s\" revocation certificate added\n" -msgstr "%s:%sɼɲ\n" - -#: g10/import.c:1895 -#, c-format -msgid "key %s: direct key signature added\n" -msgstr "%s: ľܸ̾ɲ\n" - -#: g10/import.c:2284 -#, fuzzy -msgid "NOTE: a key's S/N does not match the card's one\n" -msgstr "̩ȹ礷ޤ!\n" - -#: g10/import.c:2292 -#, fuzzy -msgid "NOTE: primary key is online and stored on card\n" -msgstr "̩Ϥ⤦ɤݴɤƤޤ\n" - -#: g10/import.c:2294 -#, 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 "ͭʼʽ̾Τʤ桼ID1ĸ\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.xOpenPGP̾Ǥޤ\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:4783 g10/keyedit.c:4874 g10/keyedit.c:4938 -#: g10/keyedit.c:4999 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:3346 -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:3249 -#, fuzzy, c-format -msgid "User ID \"%s\": already clean\n" -msgstr "桼ID%sɤϡ⤦Ƥޤ\n" - -#: g10/keyedit.c:3341 -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:3352 -msgid "You may not add a designated revoker to a PGP 2.x-style key.\n" -msgstr "PGP 2.xθˤϻ̾ԤɲäǤޤ\n" - -#: g10/keyedit.c:3372 -msgid "Enter the user ID of the designated revoker: " -msgstr "̾ԤΥ桼IDϤƤ: " - -#: g10/keyedit.c:3397 -msgid "cannot appoint a PGP 2.x style key as a designated revoker\n" -msgstr "PGP 2.xθϡ̾ԤǤ̿Ǥޤ\n" - -#: g10/keyedit.c:3412 -msgid "you cannot appoint a key as its own designated revoker\n" -msgstr "̾ԤˤϡθΤǤ̿Ǥޤ\n" - -#: g10/keyedit.c:3434 -msgid "this key has already been designated as a revoker\n" -msgstr "θϼԤȤƤ⤦̾Ƥޤ\n" - -#: g10/keyedit.c:3453 -msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n" -msgstr "ٹ: 븰̾Ԥꤹȡ᤻ޤ!\n" - -#: g10/keyedit.c:3459 -msgid "" -"Are you sure you want to appoint this key as a designated revoker? (y/N) " -msgstr "ˤθ̾ԤǤ̿ޤ? (y/N) " - -#: g10/keyedit.c:3520 -msgid "Please remove selections from the secret keys.\n" -msgstr "̩ȤƤ\n" - -#: g10/keyedit.c:3526 -#, fuzzy -msgid "Please select at most one subkey.\n" -msgstr "⡹1Ĥ򤷤Ƥ\n" - -#: g10/keyedit.c:3530 -#, fuzzy -msgid "Changing expiration time for a subkey.\n" -msgstr "ͭ¤ѹޤ\n" - -#: g10/keyedit.c:3533 -msgid "Changing expiration time for the primary key.\n" -msgstr "縰ͭ¤ѹޤ\n" - -#: g10/keyedit.c:3579 -msgid "You can't change the expiration date of a v3 key\n" -msgstr "v3ͭ¤ѹǤޤ\n" - -#: g10/keyedit.c:3595 -msgid "No corresponding signature in secret ring\n" -msgstr "̩ؤб̾ޤ\n" - -#: g10/keyedit.c:3668 -#, fuzzy, c-format -msgid "signing subkey %s is already cross-certified\n" -msgstr "ٹ: ̾%sϡ߾Ǥޤ\n" - -#: g10/keyedit.c:3674 -#, c-format -msgid "subkey %s does not sign and so does not need to be cross-certified\n" -msgstr "" - -#: g10/keyedit.c:3836 -msgid "Please select exactly one user ID.\n" -msgstr "桼ID򤭤äҤȤ򤷤Ƥ\n" - -#: g10/keyedit.c:3875 g10/keyedit.c:3985 g10/keyedit.c:4105 g10/keyedit.c:4246 -#, c-format -msgid "skipping v3 self-signature on user ID \"%s\"\n" -msgstr "桼ID%sɤv3ʽ̾ȤФޤ\n" - -#: g10/keyedit.c:4046 -msgid "Enter your preferred keyserver URL: " -msgstr "СURLϤƤ: " - -#: g10/keyedit.c:4126 -msgid "Are you sure you want to replace it? (y/N) " -msgstr "˸򴹤Ǥ? (y/N) " - -#: g10/keyedit.c:4127 -msgid "Are you sure you want to delete it? (y/N) " -msgstr "˺Ǥ? (y/N) " - -#: g10/keyedit.c:4189 -#, fuzzy -msgid "Enter the notation: " -msgstr "̾: " - -#: g10/keyedit.c:4338 -#, fuzzy -msgid "Proceed? (y/N) " -msgstr "񤭤ޤ? (y/N) " - -#: g10/keyedit.c:4402 -#, c-format -msgid "No user ID with index %d\n" -msgstr "%d֤Υ桼IDϤޤ\n" - -#: g10/keyedit.c:4460 -#, fuzzy, c-format -msgid "No user ID with hash %s\n" -msgstr "%d֤Υ桼IDϤޤ\n" - -#: g10/keyedit.c:4487 -#, fuzzy, c-format -msgid "No subkey with index %d\n" -msgstr "%d֤Υ桼IDϤޤ\n" - -#: g10/keyedit.c:4622 -#, c-format -msgid "user ID: \"%s\"\n" -msgstr "桼ID:%s\n" - -#: g10/keyedit.c:4625 g10/keyedit.c:4689 g10/keyedit.c:4732 -#, c-format -msgid "signed by your key %s on %s%s%s\n" -msgstr "%s%s%s%s˽̾Ƥޤ\n" - -#: g10/keyedit.c:4627 g10/keyedit.c:4691 g10/keyedit.c:4734 -msgid " (non-exportable)" -msgstr " (ФԲ)" - -#: g10/keyedit.c:4631 -#, c-format -msgid "This signature expired on %s.\n" -msgstr "ν̾%sλǤ\n" - -#: g10/keyedit.c:4635 -msgid "Are you sure you still want to revoke it? (y/N) " -msgstr "Ǥ˼Ǥ? (y/N) " - -#: g10/keyedit.c:4639 -msgid "Create a revocation certificate for this signature? (y/N) " -msgstr "ν̾ˤ뼺ޤ? (y/N) " - -#: g10/keyedit.c:4666 -#, c-format -msgid "You have signed these user IDs on key %s:\n" -msgstr "Υ桼ID˸%sǽ̾ޤ:\n" - -#: g10/keyedit.c:4692 -msgid " (non-revocable)" -msgstr " (Բ)" - -#: g10/keyedit.c:4699 -#, c-format -msgid "revoked by your key %s on %s\n" -msgstr "ʤθ%s%s˼Ƥޤ\n" - -#: g10/keyedit.c:4721 -msgid "You are about to revoke these signatures:\n" -msgstr "ν̾򼺸褦ȤƤޤ:\n" - -#: g10/keyedit.c:4741 -msgid "Really create the revocation certificates? (y/N) " -msgstr "˺ޤ? (y/N) " - -#: g10/keyedit.c:4771 -msgid "no secret key\n" -msgstr "̩ޤ\n" - -#: g10/keyedit.c:4841 -#, c-format -msgid "user ID \"%s\" is already revoked\n" -msgstr "桼ID%sɤϡ⤦Ƥޤ\n" - -#: g10/keyedit.c:4858 -#, c-format -msgid "WARNING: a user ID signature is dated %d seconds in the future\n" -msgstr "ٹ: 桼ID̾%d̤Ǥ\n" - -#: g10/keyedit.c:4922 -#, fuzzy, c-format -msgid "Key %s is already revoked.\n" -msgstr "桼ID%sɤϡ⤦Ƥޤ\n" - -#: g10/keyedit.c:4984 -#, fuzzy, c-format -msgid "Subkey %s is already revoked.\n" -msgstr "桼ID%sɤϡ⤦Ƥޤ\n" - -#: g10/keyedit.c:5079 -#, 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) DSAElgamal ()\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 "%lṳˤǤޤ (ιԤפξ㳲Ǥ礦)\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 "%lṳˤǤޤ (ιԤפξ㳲Ǥ礦)\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:1421 -#, 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:1324 -#, c-format -msgid "sending key %s to %s server %s\n" -msgstr "%s%sС%s\n" - -#: g10/keyserver.c:1328 -#, c-format -msgid "sending key %s to %s\n" -msgstr "%s%s\n" - -#: g10/keyserver.c:1371 -#, c-format -msgid "searching for \"%s\" from %s server %s\n" -msgstr "%sɤ%sС%s鸡\n" - -#: g10/keyserver.c:1374 -#, c-format -msgid "searching for \"%s\" from %s\n" -msgstr "%sɤ򥵡С%s鸡\n" - -#: g10/keyserver.c:1381 g10/keyserver.c:1477 -msgid "no keyserver action!\n" -msgstr "С󤬤ޤ!\n" - -#: g10/keyserver.c:1429 -#, c-format -msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n" -msgstr "ٹ: (%s) GnuPGθСϥɥ\n" - -#: g10/keyserver.c:1438 -msgid "keyserver did not send VERSION\n" -msgstr "СVERSIONޤǤ\n" - -#: g10/keyserver.c:1500 g10/keyserver.c:2028 -msgid "no keyserver known (use option --keyserver)\n" -msgstr "ΤθСޤ (ץ--keyserverȤޤ礦)\n" - -#: g10/keyserver.c:1506 -msgid "external keyserver calls are not supported in this build\n" -msgstr "ιۤǤϡСθƽФϥݡȤƤޤ\n" - -#: g10/keyserver.c:1518 -#, c-format -msgid "no handler for keyserver scheme `%s'\n" -msgstr "С%sѤΥϥɥ餬ޤ\n" - -#: g10/keyserver.c:1523 -#, c-format -msgid "action `%s' not supported with keyserver scheme `%s'\n" -msgstr "%sפϡС%sפǥݡȤƤޤ\n" - -#: g10/keyserver.c:1531 -#, fuzzy, c-format -msgid "%s does not support handler version %d\n" -msgstr "gpgkeys_%sϡϥɥ%dǤ򥵥ݡȤޤ\n" - -#: g10/keyserver.c:1538 -msgid "keyserver timed out\n" -msgstr "СΥॢ\n" - -#: g10/keyserver.c:1543 -msgid "keyserver internal error\n" -msgstr "С顼\n" - -#: g10/keyserver.c:1552 -#, c-format -msgid "keyserver communications error: %s\n" -msgstr "С̿顼: %s\n" - -#: g10/keyserver.c:1577 g10/keyserver.c:1611 -#, c-format -msgid "\"%s\" not a key ID: skipping\n" -msgstr "%sɸIDǤϤޤ: ȤФޤ\n" - -#: g10/keyserver.c:1870 -#, c-format -msgid "WARNING: unable to refresh key %s via %s: %s\n" -msgstr "ٹ: %s%sͳDzǤޤ: %s\n" - -#: g10/keyserver.c:1892 -#, c-format -msgid "refreshing 1 key from %s\n" -msgstr "1ܤθ%s\n" - -#: g10/keyserver.c:1894 -#, c-format -msgid "refreshing %d keys from %s\n" -msgstr "%dܤθ%s\n" - -#: g10/keyserver.c:1950 -#, fuzzy, c-format -msgid "WARNING: unable to fetch URI %s: %s\n" -msgstr "ٹ: %s%sͳDzǤޤ: %s\n" - -#: g10/keyserver.c:1956 -#, fuzzy, c-format -msgid "WARNING: unable to parse URI %s\n" -msgstr "ٹ: %s%sͳDzǤޤ: %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%sID %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:305 -#, c-format -msgid "assuming signed data in `%s'\n" -msgstr "̾줿ǡ%sפˤꤷޤ\n" - -#: g10/openfile.c:384 -#, c-format -msgid "new configuration file `%s' created\n" -msgstr "ե%sפǤޤ\n" - -#: g10/openfile.c:386 -#, c-format -msgid "WARNING: options in `%s' are not yet active during this run\n" -msgstr "ٹ: %sפΥץϵưƤ֡ͭˤʤޤ\n" - -#: g10/openfile.c:418 -#, 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:1157 -#, 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:968 -msgid "can't query passphrase in batch mode\n" -msgstr "Хå⡼ɤǥѥե졼礻Ǥޤ\n" - -#: g10/passphrase.c:812 g10/passphrase.c:973 -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:977 -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%lṳˤǤޤ (ιԤפξ㳲Ǥ礦)\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%lṳˤǤޤ (ιԤפξ㳲Ǥ礦)\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:127 g10/skclist.c:191 -msgid "key is not flagged as insecure - can't use it with the faked RNG!\n" -msgstr "" -"ݤǤȤե饰ˤꤵƤޤ\n" -"ʪҤȤϤä˻Ȥޤ!\n" - -#: g10/skclist.c:158 -#, c-format -msgid "skipped \"%s\": duplicated\n" -msgstr "%sɤȤФޤ: ʣ\n" - -#: g10/skclist.c:166 g10/skclist.c:176 g10/skclist.c:185 -#, c-format -msgid "skipped \"%s\": %s\n" -msgstr "%sɤȤФޤ: %s\n" - -#: g10/skclist.c:171 -msgid "skipped: secret key already present\n" -msgstr "å: ̩Ϥ⤦ޤ\n" - -#: g10/skclist.c:186 -msgid "this is a PGP generated Elgamal key which is not secure for signatures!" -msgstr "PGPElgamalǡ̾ѤˤϰǤϤޤ!" - -#: 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:350 -msgid "operation is not possible without initialized secure memory\n" -msgstr "Ѥߤΰʥ꡼ʤˤǤޤ\n" - -#: util/secmem.c:351 -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 "User ID \"%s\": %d signature removed.\n" -#~ msgstr "桼ID%sɤϡƤޤ" - -#, fuzzy -#~ msgid "User ID \"%s\": %d signatures removed.\n" -#~ msgstr "桼ID%sɤϡƤޤ" - -#, fuzzy -#~ msgid "User ID \"%s\" removed: %s\n" -#~ msgstr "桼ID%sɤϡƤޤ" - -#, 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θĹ5121024ޤǤǤ\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.po b/po/nb.po deleted file mode 100644 index 515db7b2c..000000000 --- a/po/nb.po +++ /dev/null @@ -1,6093 +0,0 @@ -# Norwegian translation (bokml dialect) of GnuPG. -# Copyright (C) 2004 Free Software Foundation, Inc. -# This file is distributed under the same license as the GnuPG package. -# Trond Endrestl <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-07-28 11:12+0200\n" -"PO-Revision-Date: 2006-06-13 20:31+0200\n" -"Last-Translator: Trond Endrestl <Trond.Endrestol@fagskolen.gjovik.no>\n" -"Language-Team: Norwegian Bokml <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 lse %s: %s\n" - -#: cipher/random.c:408 -#, c-format -msgid "waiting for lock on `%s'...\n" -msgstr "venter p lsing 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:1003 g10/gpg.c:3461 g10/import.c:195 g10/keygen.c:2385 -#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:342 -#: 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 strrelse 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:1002 g10/keygen.c:2864 -#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:263 -#: g10/openfile.c:357 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 kjre - den er p ingen mte 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. Gjr 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 gjr 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 nkkel 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 nkkel\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 lst!\n" - -#: g10/app-openpgp.c:1336 -#, c-format -msgid "%d Admin PIN attempts remaining before card is permanently locked\n" -msgstr "%d Admin PIN-forsk fr kortet blir lst 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 "nkkel finnes allerede\n" - -#: g10/app-openpgp.c:1566 -msgid "existing key will be replaced\n" -msgstr "eksisterende nkkel vil bli erstattet\n" - -#: g10/app-openpgp.c:1568 -msgid "generating new key\n" -msgstr "generere en ny nkkel\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 strrelse 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 strre 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 strrelse p %d bits\n" - -#: g10/app-openpgp.c:1827 -#, c-format -msgid "failed to store the key: %s\n" -msgstr "klarte ikke lagre nkkelen: %s\n" - -#: g10/app-openpgp.c:1886 -msgid "please wait while key is being generated ...\n" -msgstr "vennligst vent mens nkkel blir generert ...\n" - -#: g10/app-openpgp.c:1901 -msgid "generating key failed\n" -msgstr "nkkelgenerering mislyktes\n" - -#: g10/app-openpgp.c:1904 -#, c-format -msgid "key generation completed (%d seconds)\n" -msgstr "nkkelgenerering fullfrt (%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 sttter 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 utfrt: %lu]" - -#: g10/app-openpgp.c:2403 -msgid "" -"verification of Admin PIN is currently prohibited through this command\n" -msgstr "bekrefting av Admin PIN er forelpig 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:320 -#, c-format -msgid "armor: %s\n" -msgstr "armor: %s\n" - -#: g10/armor.c:359 -msgid "invalid armor header: " -msgstr "ugyldig armorheader: " - -#: g10/armor.c:370 -msgid "armor header: " -msgstr "armorheader: " - -#: g10/armor.c:381 -msgid "invalid clearsig header\n" -msgstr "ugyldig clearsigheader\n" - -#: g10/armor.c:433 -msgid "nested clear text signatures\n" -msgstr "nstede klartekstsignaturer\n" - -#: g10/armor.c:568 -msgid "unexpected armor: " -msgstr "uforventet armering:" - -#: g10/armor.c:580 -msgid "invalid dash escaped line: " -msgstr "ugyldig bindestrekbeskyttet linje: " - -#: g10/armor.c:734 g10/armor.c:1343 -#, c-format -msgid "invalid radix64 character %02X skipped\n" -msgstr "hoppet over ugyldig radix64-tegn %02x\n" - -#: g10/armor.c:777 -msgid "premature eof (no CRC)\n" -msgstr "for tidlig eof (ingen CRC)\n" - -#: g10/armor.c:811 -msgid "premature eof (in CRC)\n" -msgstr "for tidlig eof (i CRC)\n" - -#: g10/armor.c:819 -msgid "malformed CRC\n" -msgstr "misdannet CRC\n" - -#: g10/armor.c:823 g10/armor.c:1380 -#, c-format -msgid "CRC error; %06lX - %06lX\n" -msgstr "CRC-feil; %06lX - %06lX\n" - -#: g10/armor.c:843 -msgid "premature eof (in trailer)\n" -msgstr "for tidlig eof (i trailer)\n" - -#: g10/armor.c:847 -msgid "error in trailer line\n" -msgstr "feil i trailerlinje\n" - -#: g10/armor.c:1158 -msgid "no valid OpenPGP data found.\n" -msgstr "ingen gyldig OpenPGP-data funnet.\n" - -#: g10/armor.c:1163 -#, c-format -msgid "invalid armor: line longer than %d characters\n" -msgstr "ugyldig armor: linje lengre enn %d tegn\n" - -#: g10/armor.c:1167 -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 gjre 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 forelpig 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 gr ved %d tegn).\n" - -#: g10/card-util.c:581 -msgid "URL to retrieve public key: " -msgstr "URL for hente offentlig nkkel: " - -#: g10/card-util.c:589 -#, c-format -msgid "Error: URL too long (limit is %d characters).\n" -msgstr "Feil: URL er for lang (grensa gr ved %d tegn).\n" - -#: g10/card-util.c:687 g10/card-util.c:756 g10/import.c:280 -#, 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 gr 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 gr ved %d tegn).\n" - -#: g10/card-util.c:794 -msgid "Language preferences: " -msgstr "Sprkpreferanser:" - -#: 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 "Kjnn ((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 "nkkeloperasjonen 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 nvrende nkkelinfo: %s\n" - -#: g10/card-util.c:1033 -msgid "Replace existing key? (y/N) " -msgstr "Erstatte eksisterende nkkel? (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 krypteringsnkler utenfor kortet? (J/n) " - -#: g10/card-util.c:1075 -msgid "Replace existing keys? (y/N) " -msgstr "Erstatte eksisterende nkler? (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 "" -"Vr obs p at fabrikkinnstilingene for PIN-kodene er\n" -" PIN = %s Admin PIN = %s\n" -"Du br 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 nkkel du vil generere:\n" - -#: g10/card-util.c:1125 g10/card-util.c:1206 -msgid " (1) Signature key\n" -msgstr " (1) Signaturnkkel\n" - -#: g10/card-util.c:1126 g10/card-util.c:1208 -msgid " (2) Encryption key\n" -msgstr " (2) Krypteringsnkkel\n" - -#: g10/card-util.c:1127 g10/card-util.c:1210 -msgid " (3) Authentication key\n" -msgstr " (3) Autentiseringsnkkel\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 nkkelen skal lagres:\n" - -#: g10/card-util.c:1238 -msgid "unknown key protection algorithm\n" -msgstr "ukjent nkkelbeskyttelsesalgoritme\n" - -#: g10/card-util.c:1243 -msgid "secret parts of key are not available\n" -msgstr "hemmelige deler av nkkelen er ikke tilgjengelig.\n" - -#: g10/card-util.c:1248 -msgid "secret key already stored on a card\n" -msgstr "hemmelig nkkel 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 nkkel" - -#: g10/card-util.c:1329 -msgid "fetch the key specified in the card URL" -msgstr "hente nkkelen 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 sprkpreferansene" - -#: g10/card-util.c:1332 -msgid "change card holder's sex" -msgstr "endre kortholders kjnn" - -#: 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 nkler" - -#: 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 (prv help)\n" - -#: g10/cardglue.c:416 -#, fuzzy -msgid "card reader not available\n" -msgstr "hemmelig nkkel 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 nkkelblokk 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 nvrende 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 nr 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; prv igjen" - -#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3826 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:3387 g10/keyserver.c:1700 -#: g10/revoke.c:228 -#, c-format -msgid "key \"%s\" not found: %s\n" -msgstr "nkkelen %s ble ikke funnet: %s\n" - -#: g10/delkey.c:83 g10/export.c:341 g10/import.c:2349 g10/keyserver.c:1714 -#: g10/revoke.c:234 g10/revoke.c:478 -#, c-format -msgid "error reading keyblock: %s\n" -msgstr "feil ved lesing av nkkelblokk: %s\n" - -#: g10/delkey.c:129 g10/delkey.c:136 -msgid "(unless you specify the key by fingerprint)\n" -msgstr "(med mindre du angir nkkelen ved hjelp av fingeravtrykk)\n" - -#: g10/delkey.c:135 -msgid "can't do this in batch mode without \"--yes\"\n" -msgstr "kan ikke gjre dette i batchmode uten --yes\n" - -#: g10/delkey.c:147 -msgid "Delete this key from the keyring? (y/N) " -msgstr "Slette denne nkkelen fra nkkelknippet? (j/N)" - -#: g10/delkey.c:155 -msgid "This is a secret key! - really delete? (y/N) " -msgstr "Dette er en hemmelig nkkel! - virkelig slette den? (j/N)" - -#: g10/delkey.c:165 -#, c-format -msgid "deleting keyblock failed: %s\n" -msgstr "sleting av nkkelblokk 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 nkkel for offentlig nkkel %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 frst.\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-nkler 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 nklene du krypterer til.\n" - -#: g10/encode.c:518 -#, c-format -msgid "" -"WARNING: forcing symmetric cipher %s (%d) violates recipient preferences\n" -msgstr "" -"ADVARSEL: ptvinging 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 "" -"ptvinging 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:67 g10/mainproc.c:293 -#, c-format -msgid "%s encrypted data\n" -msgstr "%s krypterte data\n" - -#: g10/encr-data.c:69 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:93 -msgid "" -"WARNING: message was encrypted with a weak key in the symmetric cipher.\n" -msgstr "" -"ADVARSEL: meldingen er kryptert med en svak nkkel for den symmetriske " -"cipher.\n" - -#: g10/encr-data.c:104 -msgid "problem handling encrypted packet\n" -msgstr "problem ved hndtering av kryptert pakke\n" - -#: g10/exec.c:49 -msgid "no remote program execution supported\n" -msgstr "fjernutfring av programmer er ikke stttet\n" - -#: g10/exec.c:176 g10/openfile.c:415 -#, 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 utfre program %s: %s\n" - -#: g10/exec.c:428 -#, c-format -msgid "unable to execute shell `%s': %s\n" -msgstr "kunne ikke utfre 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 kjre 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 nkler er ikke tillatt\n" - -#: g10/export.c:354 -#, c-format -msgid "key %s: not protected - skipped\n" -msgstr "nkkel %s: ikke beskyttet - hoppet over\n" - -#: g10/export.c:362 -#, c-format -msgid "key %s: PGP 2.x style key - skipped\n" -msgstr "nkkel %s: PGP 2.x-aktig nkkel - hoppet over\n" - -#: g10/export.c:373 -#, c-format -msgid "key %s: key material on-card - skipped\n" -msgstr "nkkel %s: nkkelmateriell 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 undernkkelen: %s\n" - -#: g10/export.c:565 -#, c-format -msgid "WARNING: secret key %s does not have a simple SK checksum\n" -msgstr "ADVARSEL: hemmelig nkkel %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:375 -msgid "" -"@Commands:\n" -" " -msgstr "" -"@Kommandoer:\n" -" " - -#: g10/gpg.c:377 -msgid "|[file]|make a signature" -msgstr "|[fil]|lage en signatur" - -#: g10/gpg.c:378 -msgid "|[file]|make a clear text signature" -msgstr "|[fil]|lage en klartekstsignatur" - -#: g10/gpg.c:379 -msgid "make a detached signature" -msgstr "lage en adskilt signatur" - -#: g10/gpg.c:380 -msgid "encrypt data" -msgstr "kryptere data" - -#: g10/gpg.c:382 -msgid "encryption only with symmetric cipher" -msgstr "kryptering med bare symmetrisk cipher" - -#: g10/gpg.c:384 -msgid "decrypt data (default)" -msgstr "dekryptere data (standard)" - -#: g10/gpg.c:386 -msgid "verify a signature" -msgstr "bekrefte en signatur" - -#: g10/gpg.c:388 -msgid "list keys" -msgstr "liste nkler" - -#: g10/gpg.c:390 -msgid "list keys and signatures" -msgstr "liste nkler og signaturer" - -#: g10/gpg.c:391 -msgid "list and check key signatures" -msgstr "vise og sjekke nkkelsignaturer" - -#: g10/gpg.c:392 -msgid "list keys and fingerprints" -msgstr "liste nkler og fingeravtrykk" - -#: g10/gpg.c:393 -msgid "list secret keys" -msgstr "liste hemmelige nkler" - -#: g10/gpg.c:394 -msgid "generate a new key pair" -msgstr "generere et nytt nkkelpar" - -#: g10/gpg.c:395 -msgid "remove keys from the public keyring" -msgstr "fjerne nkler fra det offentlige nkkelknippet" - -#: g10/gpg.c:397 -msgid "remove keys from the secret keyring" -msgstr "fjerne nkler fra det hemmelige nkkelknippet" - -#: g10/gpg.c:398 -msgid "sign a key" -msgstr "signere en nkkel" - -#: g10/gpg.c:399 -msgid "sign a key locally" -msgstr "signere en nkkel lokalt" - -#: g10/gpg.c:400 -msgid "sign or edit a key" -msgstr "signere eller redigere en nkkel" - -#: g10/gpg.c:401 -msgid "generate a revocation certificate" -msgstr "generere et opphevingssertifikat" - -#: g10/gpg.c:403 -msgid "export keys" -msgstr "eksportere nkler" - -#: g10/gpg.c:404 -msgid "export keys to a key server" -msgstr "eksportere nkler til en nkkelserver" - -#: g10/gpg.c:405 -msgid "import keys from a key server" -msgstr "importere nkler fra en nkkelserver" - -#: g10/gpg.c:407 -msgid "search for keys on a key server" -msgstr "ske etter nkler p en nkkelserver" - -#: g10/gpg.c:409 -msgid "update all keys from a keyserver" -msgstr "oppdatere alle nklene fra en nkkelserver" - -#: g10/gpg.c:413 -msgid "import/merge keys" -msgstr "importere/flette nkler" - -#: g10/gpg.c:416 -msgid "print the card status" -msgstr "vis kortets status" - -#: g10/gpg.c:417 -msgid "change data on a card" -msgstr "endre data p et kort" - -#: g10/gpg.c:418 -msgid "change a card's PIN" -msgstr "endre PIN p et kort" - -#: g10/gpg.c:426 -msgid "update the trust database" -msgstr "oppdatere tillitsdatabasen" - -#: g10/gpg.c:433 -msgid "|algo [files]|print message digests" -msgstr "|algo [filer]|skrive meldingsdigester" - -#: g10/gpg.c:437 g10/gpgv.c:71 -msgid "" -"@\n" -"Options:\n" -" " -msgstr "" -"@\n" -"Valg:\n" -" " - -#: g10/gpg.c:439 -msgid "create ascii armored output" -msgstr "lage ASCII-beskyttet output" - -#: g10/gpg.c:441 -msgid "|NAME|encrypt for NAME" -msgstr "|NAVN|kryptere for NAVN" - -#: g10/gpg.c:452 -msgid "use this user-id to sign or decrypt" -msgstr "bruke denne brukeriden for signering eller dekryptering" - -#: g10/gpg.c:453 -msgid "|N|set compress level N (0 disables)" -msgstr "|N|sette kompresjonsniv til N (0 slr av kompresjon)" - -#: g10/gpg.c:458 -msgid "use canonical text mode" -msgstr "bruk kanonisk tekstmodus" - -#: g10/gpg.c:472 -msgid "use as output file" -msgstr "bruk som outputfil" - -#: g10/gpg.c:474 g10/gpgv.c:73 -msgid "verbose" -msgstr "fyldig output" - -#: g10/gpg.c:485 -msgid "do not make any changes" -msgstr "ikke gjr noen endringer" - -#: g10/gpg.c:486 -msgid "prompt before overwriting" -msgstr "spr fr overskriving" - -#: g10/gpg.c:527 -msgid "use strict OpenPGP behavior" -msgstr "bruk streng OpenPGP-oppfrsel" - -#: g10/gpg.c:528 -msgid "generate PGP 2.x compatible messages" -msgstr "generere PGP 2.x-kompatible meldinger" - -#: g10/gpg.c:556 -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:559 -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 nkler\n" -" --fingerprint [navn] vise fingeravtrykk\n" - -#: g10/gpg.c:757 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:774 -msgid "Usage: gpg [options] [files] (-h for help)" -msgstr "Bruksmte: gpg [valg] [filer] (-h for hjelp)" - -#: g10/gpg.c:777 -msgid "" -"Syntax: gpg [options] [files]\n" -"sign, check, encrypt or decrypt\n" -"default operation depends on the input data\n" -msgstr "" -"Bruksmte: gpg [valg] [filer]\n" -"signere, sjekke, kryptere eller dekryptere\n" -"standard operasjon avhenger av inputdata\n" - -#: g10/gpg.c:788 -msgid "" -"\n" -"Supported algorithms:\n" -msgstr "" -"\n" -"Stttede algoritmer:\n" - -#: g10/gpg.c:791 -msgid "Pubkey: " -msgstr "Offentlig nkkel: " - -#: g10/gpg.c:797 g10/keyedit.c:2310 -msgid "Cipher: " -msgstr "Cipher: " - -#: g10/gpg.c:803 -msgid "Hash: " -msgstr "Hash: " - -#: g10/gpg.c:809 g10/keyedit.c:2356 -msgid "Compression: " -msgstr "Kompresjon: " - -#: g10/gpg.c:892 -msgid "usage: gpg [options] " -msgstr "bruksmte: gpg [valg] " - -#: g10/gpg.c:1040 -msgid "conflicting commands\n" -msgstr "motstridende kommandoer\n" - -#: g10/gpg.c:1058 -#, c-format -msgid "no = sign found in group definition `%s'\n" -msgstr "fant ingen =-tegn i gruppedefinisjonen %s\n" - -#: g10/gpg.c:1255 -#, c-format -msgid "WARNING: unsafe ownership on homedir `%s'\n" -msgstr "ADVARSEL: utrygt eierskap p hjemmekatalogen %s\n" - -#: g10/gpg.c:1258 -#, c-format -msgid "WARNING: unsafe ownership on configuration file `%s'\n" -msgstr "ADVARSEL: utrygt eierskap p konfigurasjonsfilen %s\n" - -#: g10/gpg.c:1261 -#, c-format -msgid "WARNING: unsafe ownership on extension `%s'\n" -msgstr "ADVARSEL: utrygt eierskap p utvidelsen %s\n" - -#: g10/gpg.c:1267 -#, c-format -msgid "WARNING: unsafe permissions on homedir `%s'\n" -msgstr "ADVARSEL: utrygge rettigheter p hjemmekatalogen %s\n" - -#: g10/gpg.c:1270 -#, c-format -msgid "WARNING: unsafe permissions on configuration file `%s'\n" -msgstr "ADVARSEL: utrygge rettigheter p konfigurasjonsfilen %s\n" - -#: g10/gpg.c:1273 -#, c-format -msgid "WARNING: unsafe permissions on extension `%s'\n" -msgstr "ADVARSEL: utrygge rettigheter p utvidelsen %s\n" - -#: g10/gpg.c:1279 -#, c-format -msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n" -msgstr "" -"ADVARSEL: utrygt eierskap p katalogene p nivene over hjemmekatalogen %" -"s\n" - -#: g10/gpg.c:1282 -#, c-format -msgid "" -"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n" -msgstr "" -"ADVARSEL: utrygt eierskap p katalogene p nivene over konfigurasjonsfilen " -"%s\n" - -#: g10/gpg.c:1285 -#, c-format -msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n" -msgstr "" -"ADVARSEL: utrygt eierskap p katalogene p nivene over utvidelsen %s\n" - -#: g10/gpg.c:1291 -#, c-format -msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n" -msgstr "" -"ADVARSEL: utrygge rettigheter p katalogene p nivene over hjemmekatalogen " -"%s\n" - -#: g10/gpg.c:1294 -#, c-format -msgid "" -"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n" -msgstr "" -"ADVARSEL: utrygge rettigheter p katalogene p nivene over " -"konfigurasjonsfilen %s\n" - -#: g10/gpg.c:1297 -#, c-format -msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n" -msgstr "" -"ADVARSEL: utrygge rettigheter p katalogene p nivene over utvidelsen %s\n" - -#: g10/gpg.c:1438 -#, c-format -msgid "unknown configuration item `%s'\n" -msgstr "ukjent konfigurasjonspunkt %s\n" - -#: g10/gpg.c:1531 -msgid "display photo IDs during key listings" -msgstr "" - -#: g10/gpg.c:1533 -msgid "show policy URLs during signature listings" -msgstr "" - -#: g10/gpg.c:1535 -msgid "show all notations during signature listings" -msgstr "" - -#: g10/gpg.c:1537 -msgid "show IETF standard notations during signature listings" -msgstr "" - -#: g10/gpg.c:1541 -msgid "show user-supplied notations during signature listings" -msgstr "" - -#: g10/gpg.c:1543 -msgid "show preferred keyserver URLs during signature listings" -msgstr "" - -#: g10/gpg.c:1545 -msgid "show user ID validity during key listings" -msgstr "" - -#: g10/gpg.c:1547 -msgid "show revoked and expired user IDs in key listings" -msgstr "" - -#: g10/gpg.c:1549 -msgid "show revoked and expired subkeys in key listings" -msgstr "" - -#: g10/gpg.c:1551 -msgid "show the keyring name in key listings" -msgstr "vise navnet til nkkelknippene i nkkellister" - -#: g10/gpg.c:1553 -msgid "show expiration dates during signature listings" -msgstr "" - -#: g10/gpg.c:1920 -#, c-format -msgid "NOTE: old default options file `%s' ignored\n" -msgstr "MERK: den gamle valgfila %s ble ignorert\n" - -#: g10/gpg.c:1962 -#, c-format -msgid "NOTE: no default option file `%s'\n" -msgstr "MERK: ingen standard valgfil %s\n" - -#: g10/gpg.c:1966 -#, c-format -msgid "option file `%s': %s\n" -msgstr "valgfil %s: %s\n" - -#: g10/gpg.c:1973 -#, c-format -msgid "reading options from `%s'\n" -msgstr "leser valg fra %s\n" - -#: g10/gpg.c:2188 g10/gpg.c:2814 g10/gpg.c:2833 -#, c-format -msgid "NOTE: %s is not for normal use!\n" -msgstr "MERK: %s er ikke for vanlig bruk!\n" - -#: g10/gpg.c:2201 -#, 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:2364 g10/gpg.c:2376 -#, c-format -msgid "`%s' is not a valid signature expiration\n" -msgstr "%s er ikke en gyldig signaturutgelse\n" - -#: g10/gpg.c:2452 -#, c-format -msgid "`%s' is not a valid character set\n" -msgstr "%s er ikke et gyldig tegnsett\n" - -#: g10/gpg.c:2476 g10/gpg.c:2663 g10/keyedit.c:4064 -msgid "could not parse keyserver URL\n" -msgstr "kunne ikke parse nkkelserverens URL\n" - -#: g10/gpg.c:2488 -#, c-format -msgid "%s:%d: invalid keyserver options\n" -msgstr "%s:%d: ugyldige valg for nkkelserver\n" - -#: g10/gpg.c:2491 -msgid "invalid keyserver options\n" -msgstr "ugyldige valg for nkkelserver\n" - -#: g10/gpg.c:2498 -#, c-format -msgid "%s:%d: invalid import options\n" -msgstr "%s:%d: ugyldige importvalg\n" - -#: g10/gpg.c:2501 -msgid "invalid import options\n" -msgstr "ugyldige importvalg\n" - -#: g10/gpg.c:2508 -#, c-format -msgid "%s:%d: invalid export options\n" -msgstr "%s:%d: ugyldige eksportvalg\n" - -#: g10/gpg.c:2511 -msgid "invalid export options\n" -msgstr "ugyldige eksportvalg\n" - -#: g10/gpg.c:2518 -#, c-format -msgid "%s:%d: invalid list options\n" -msgstr "%s:%d: ugyldige listevalg\n" - -#: g10/gpg.c:2521 -msgid "invalid list options\n" -msgstr "ugyldige listevalg\n" - -#: g10/gpg.c:2529 -msgid "display photo IDs during signature verification" -msgstr "" - -#: g10/gpg.c:2531 -msgid "show policy URLs during signature verification" -msgstr "" - -#: g10/gpg.c:2533 -msgid "show all notations during signature verification" -msgstr "" - -#: g10/gpg.c:2535 -msgid "show IETF standard notations during signature verification" -msgstr "" - -#: g10/gpg.c:2539 -msgid "show user-supplied notations during signature verification" -msgstr "" - -#: g10/gpg.c:2541 -msgid "show preferred keyserver URLs during signature verification" -msgstr "" - -#: g10/gpg.c:2543 -msgid "show user ID validity during signature verification" -msgstr "" - -#: g10/gpg.c:2545 -msgid "show revoked and expired user IDs in signature verification" -msgstr "" - -#: g10/gpg.c:2547 -msgid "validate signatures with PKA data" -msgstr "" - -#: g10/gpg.c:2549 -msgid "elevate the trust of signatures with valid PKA data" -msgstr "" - -#: g10/gpg.c:2556 -#, c-format -msgid "%s:%d: invalid verify options\n" -msgstr "%s:%d: ugyldige valg for bekreftelse\n" - -#: g10/gpg.c:2559 -msgid "invalid verify options\n" -msgstr "ugyldige valg for bekreftelse\n" - -#: g10/gpg.c:2566 -#, c-format -msgid "unable to set exec-path to %s\n" -msgstr "kunne ikke sette exec-path til %s\n" - -#: g10/gpg.c:2729 -#, c-format -msgid "%s:%d: invalid auto-key-locate list\n" -msgstr "%s:%d: ugyldig auto-key-locate-liste\n" - -#: g10/gpg.c:2732 -msgid "invalid auto-key-locate list\n" -msgstr "" - -#: g10/gpg.c:2803 -msgid "WARNING: program may create a core file!\n" -msgstr "ADVARSEL: programmet kan opprette en corefil!\n" - -#: g10/gpg.c:2807 -#, c-format -msgid "WARNING: %s overrides %s\n" -msgstr "ADVARSEL: %s overstyrere %s\n" - -#: g10/gpg.c:2816 -#, c-format -msgid "%s not allowed with %s!\n" -msgstr "%s er ikke tillatt sammen med %s!\n" - -#: g10/gpg.c:2819 -#, c-format -msgid "%s makes no sense with %s!\n" -msgstr "%s er ikke fornuftig med %s!\n" - -#: g10/gpg.c:2826 -#, c-format -msgid "NOTE: %s is not available in this version\n" -msgstr "" - -#: g10/gpg.c:2841 -#, c-format -msgid "will not run with insecure memory due to %s\n" -msgstr "" - -#: g10/gpg.c:2855 -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:2861 -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:2867 -msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n" -msgstr "du m bruke filer (og ikke en pipe) nr --pgp2 er psltt\n" - -#: g10/gpg.c:2880 -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:2947 g10/gpg.c:2971 -msgid "selected cipher algorithm is invalid\n" -msgstr "valgt krypteringsalgoritme er ugyldig\n" - -#: g10/gpg.c:2953 g10/gpg.c:2977 -msgid "selected digest algorithm is invalid\n" -msgstr "valg digestalgoritme er ugyldig\n" - -#: g10/gpg.c:2959 -msgid "selected compression algorithm is invalid\n" -msgstr "valgt kompresjonsalgoritme er ugyldig\n" - -#: g10/gpg.c:2965 -msgid "selected certification digest algorithm is invalid\n" -msgstr "valgt sertifikasjondigestalgoritme er ugyldig\n" - -#: g10/gpg.c:2980 -msgid "completes-needed must be greater than 0\n" -msgstr "completes-needed m vre strre enn 0\n" - -#: g10/gpg.c:2982 -msgid "marginals-needed must be greater than 1\n" -msgstr "marginals-neede m vre strre enn 1\n" - -#: g10/gpg.c:2984 -msgid "max-cert-depth must be in the range from 1 to 255\n" -msgstr "max-cert-depth m vre i intervallet fra 1 til 255\n" - -#: g10/gpg.c:2986 -msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n" -msgstr "ugyldig default-cert-level; m vre 0, 1, 2 eller 3\n" - -#: g10/gpg.c:2988 -msgid "invalid min-cert-level; must be 1, 2, or 3\n" -msgstr "ugyldig min-cert-level; m vre 0, 1, 2 eller 3\n" - -#: g10/gpg.c:2991 -msgid "NOTE: simple S2K mode (0) is strongly discouraged\n" -msgstr "MERK: enkel S2K-modus (0) er sterkt frardet\n" - -#: g10/gpg.c:2995 -msgid "invalid S2K mode; must be 0, 1 or 3\n" -msgstr "ugyldig S2K-modus; m vre 0, 1 eller 3\n" - -#: g10/gpg.c:3002 -msgid "invalid default preferences\n" -msgstr "ugyldig standard preferanser\n" - -#: g10/gpg.c:3011 -msgid "invalid personal cipher preferences\n" -msgstr "ugyldig personlig cipherpreferanser\n" - -#: g10/gpg.c:3015 -msgid "invalid personal digest preferences\n" -msgstr "ugyldig personlig digestpreferanser\n" - -#: g10/gpg.c:3019 -msgid "invalid personal compress preferences\n" -msgstr "ugyldig personlig kompresjonspreferanser\n" - -#: g10/gpg.c:3052 -#, c-format -msgid "%s does not yet work with %s\n" -msgstr "%s virker ikke enn med %s\n" - -#: g10/gpg.c:3099 -#, 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:3104 -#, 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:3109 -#, 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:3208 -#, c-format -msgid "failed to initialize the TrustDB: %s\n" -msgstr "klarte ikke initialisere tillitsdatabasen: %s\n" - -#: g10/gpg.c:3219 -msgid "WARNING: recipients (-r) given without using public key encryption\n" -msgstr "" -"ADVARSEL: mottakere (-r) angitt uten bruke offentlig nkkelkryptering\n" - -#: g10/gpg.c:3230 -msgid "--store [filename]" -msgstr "--store [filnavn]" - -#: g10/gpg.c:3237 -msgid "--symmetric [filename]" -msgstr "--symmetric [filnavn]" - -#: g10/gpg.c:3239 -#, c-format -msgid "symmetric encryption of `%s' failed: %s\n" -msgstr "symmetrisk kryptering av %s mislyktes: %s\n" - -#: g10/gpg.c:3249 -msgid "--encrypt [filename]" -msgstr "--encrypt [filnavn]" - -#: g10/gpg.c:3262 -msgid "--symmetric --encrypt [filename]" -msgstr "--symmetric --encrypt [filnavn]" - -#: g10/gpg.c:3264 -msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n" -msgstr "" - -#: g10/gpg.c:3267 -#, 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:3285 -msgid "--sign [filename]" -msgstr "--sign [filnavn]" - -#: g10/gpg.c:3298 -msgid "--sign --encrypt [filename]" -msgstr "--sign --encrypt [filnavn]" - -#: g10/gpg.c:3313 -msgid "--symmetric --sign --encrypt [filename]" -msgstr "--symmetric --sign --encrypt [filnavn]" - -#: g10/gpg.c:3315 -msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n" -msgstr "" - -#: g10/gpg.c:3318 -#, 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:3338 -msgid "--sign --symmetric [filename]" -msgstr "--sign --symmetric [filnavn]" - -#: g10/gpg.c:3347 -msgid "--clearsign [filename]" -msgstr "--clearsign [filnavn]" - -#: g10/gpg.c:3372 -msgid "--decrypt [filename]" -msgstr "--decrypt [filnavn]" - -#: g10/gpg.c:3380 -msgid "--sign-key user-id" -msgstr "--sign-key brukerid" - -#: g10/gpg.c:3384 -msgid "--lsign-key user-id" -msgstr "--lsign-key brukerid" - -#: g10/gpg.c:3405 -msgid "--edit-key user-id [commands]" -msgstr "--edit-key brukerid [kommandoer]" - -#: g10/gpg.c:3476 -msgid "-k[v][v][v][c] [user-id] [keyring]" -msgstr "-k[v][v][v][c] [brukerid] [nkkelknippe]" - -#: g10/gpg.c:3518 -#, c-format -msgid "keyserver send failed: %s\n" -msgstr "sending til nkkelserver mislyktes: %s\n" - -#: g10/gpg.c:3520 -#, c-format -msgid "keyserver receive failed: %s\n" -msgstr "mottak fra nkkelserver mislyktes: %s\n" - -#: g10/gpg.c:3522 -#, c-format -msgid "key export failed: %s\n" -msgstr "nkkeleksport mislyktes: %s\n" - -#: g10/gpg.c:3533 -#, c-format -msgid "keyserver search failed: %s\n" -msgstr "sk p nkkelserver mislyktes: %s\n" - -#: g10/gpg.c:3543 -#, c-format -msgid "keyserver refresh failed: %s\n" -msgstr "refresh p nkkelserver mislyktes: %s\n" - -#: g10/gpg.c:3594 -#, c-format -msgid "dearmoring failed: %s\n" -msgstr "dearmoring failed: %s\n" - -#: g10/gpg.c:3602 -#, c-format -msgid "enarmoring failed: %s\n" -msgstr "enarmoring failed: %s\n" - -#: g10/gpg.c:3689 -#, c-format -msgid "invalid hash algorithm `%s'\n" -msgstr "ugyldig hashalgoritme %s\n" - -#: g10/gpg.c:3812 -msgid "[filename]" -msgstr "[filnavn]" - -#: g10/gpg.c:3816 -msgid "Go ahead and type your message ...\n" -msgstr "Sett i gang og tast inn meldingen din ...\n" - -#: g10/gpg.c:4120 -msgid "the given certification policy URL is invalid\n" -msgstr "den angitte URLen for sertifikasjonspolicyen er ugyldig\n" - -#: g10/gpg.c:4122 -msgid "the given signature policy URL is invalid\n" -msgstr "den angitte URLen for signaturpolicy er ugyldig\n" - -#: g10/gpg.c:4155 -msgid "the given preferred keyserver URL is invalid\n" -msgstr "den angitte URLen for den foretrukkede nkkelserveren 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 nkkel %s gjort gyldig av --allow-non-selfsigned-uid\n" - -#: g10/getkey.c:2380 g10/keyedit.c:3707 -#, c-format -msgid "no secret subkey for public subkey %s - ignoring\n" -msgstr "ingen hemmelig undernkkel for offentlig undernkkel %s - ignorerer\n" - -#: g10/getkey.c:2611 -#, c-format -msgid "using subkey %s instead of primary key %s\n" -msgstr "bruker undernkkel %s i stedet for primrnkkel %s\n" - -#: g10/getkey.c:2658 -#, c-format -msgid "key %s: secret key without public key - skipped\n" -msgstr "nkkel %s: hemmelig nkkel uten offentlig nkkel - hoppet over\n" - -#: g10/gpgv.c:74 -msgid "be somewhat more quiet" -msgstr "vre noenlunde stille" - -#: g10/gpgv.c:75 -msgid "take the keys from this keyring" -msgstr "hent nklene fra dette nkkelknippet" - -#: g10/gpgv.c:77 -msgid "make timestamp conflicts only a warning" -msgstr "la konflikter mellom tidsstempler bare vre 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 "Bruksmte: gpgv [valg] [filer] (-h for hjelp)" - -#: g10/gpgv.c:105 -msgid "" -"Syntax: gpg [options] [files]\n" -"Check signatures against known trusted keys\n" -msgstr "" -"Bruksmte: gpgv [valg] [filer]\n" -"Sjekke signaturer mot kjente betrodde nkler\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 "" -"Nr du signerer en brukerid p en nkkel, br du frst bekrefte at\n" -"nkkelen tilhrer den personen som er angitt i brukeriden. Det er\n" -"nyttig for andre vite hvor nyaktig du bekreftet dette.\n" -"\n" -"\"0\" betyr at du forteller hvor nye du bekreftet nkkelen.\n" -"\n" -"\"1\" betyr at du tror at nkkelen eies av den personen som pstr eie\n" -" nkkelen, men du kunne ikke eller bekreftet ikke nkkelen i det hele\n" -" tatt. Dette er nyttig for en identitetskontroll hvor du signerer\n" -" nkkelen til et pseudonym.\n" -"\n" -"\"2\" betyr at du gjorde en vanlig bekreftelse av nkkelen. For eksempel,\n" -" dette kunne bety at du bekreftet nkkelens fingeravtrykk og sjekket\n" -" brukeriden mot et fotografisk id.\n" -"\n" -"\"3\" betyr at du gjorde en utfyllende bekreftelse av nkkelen. For\n" -" eksempel, dette kunne bety at du og eieren av nkkelen bekreftet\n" -" personlig nkkelens fingeravtrykk og at du sjekket ved hjelp av et\n" -" dokument med fotografi som er vanskelig forfalske at navnet p\n" -" nkkeleieren stemmer med navnet i brukeriden til nkkelen og til slutt\n" -" at du bekreftet at epostadressen i nkkelen tilhrer nkkelens eier.\n" -"\n" -"Vr obs p at eksemplene gitt over for nivene 2 og 3 *bare* er\n" -"eksempler. Alt i alt er det opp til deg bestemme hva vanlig og\n" -"utfyllende betyr nr du signerer andres nkler.\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 oppdatr 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:266 -#, c-format -msgid "skipping block of type %d\n" -msgstr "hopper over blokk av typen %d\n" - -#: g10/import.c:275 -#, c-format -msgid "%lu keys processed so far\n" -msgstr "%lu nkler behandlet hittil\n" - -#: g10/import.c:292 -#, c-format -msgid "Total number processed: %lu\n" -msgstr "Totalt antall behandlet: %lu\n" - -#: g10/import.c:294 -#, c-format -msgid " skipped new keys: %lu\n" -msgstr "nye nkler som ble hoppet over: %lu\n" - -#: g10/import.c:297 -#, c-format -msgid " w/o user IDs: %lu\n" -msgstr " uten brukerider: %lu\n" - -#: g10/import.c:299 -#, c-format -msgid " imported: %lu" -msgstr " importert: %lu" - -#: g10/import.c:305 -#, c-format -msgid " unchanged: %lu\n" -msgstr " uendret: %lu\n" - -#: g10/import.c:307 -#, c-format -msgid " new user IDs: %lu\n" -msgstr " nye brukerider: %lu\n" - -#: g10/import.c:309 -#, c-format -msgid " new subkeys: %lu\n" -msgstr " nye undernkler: %lu\n" - -#: g10/import.c:311 -#, c-format -msgid " new signatures: %lu\n" -msgstr " nye signaturer: %lu\n" - -#: g10/import.c:313 -#, c-format -msgid " new key revocations: %lu\n" -msgstr " nye nkkelopphevinger: %lu\n" - -#: g10/import.c:315 -#, c-format -msgid " secret keys read: %lu\n" -msgstr " leste hemmelige nkler: %lu\n" - -#: g10/import.c:317 -#, c-format -msgid " secret keys imported: %lu\n" -msgstr " importerte hemmelige nkler: %lu\n" - -#: g10/import.c:319 -#, c-format -msgid " secret keys unchanged: %lu\n" -msgstr " uforandrede hemmelige nkler: %lu\n" - -#: g10/import.c:321 -#, c-format -msgid " not imported: %lu\n" -msgstr " ikke importert: %lu\n" - -#: g10/import.c:323 -#, c-format -msgid " signatures cleaned: %lu\n" -msgstr " oppryddete signaturer: %lu\n" - -#: g10/import.c:325 -#, c-format -msgid " user IDs cleaned: %lu\n" -msgstr " oppryddete brukerider: %lu\n" - -#: g10/import.c:566 -#, 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:570 -#, fuzzy -msgid " algorithms on these user IDs:\n" -msgstr " nye brukerider: %lu\n" - -#: g10/import.c:607 -#, c-format -msgid " \"%s\": preference for cipher algorithm %s\n" -msgstr "" - -#: g10/import.c:619 -#, c-format -msgid " \"%s\": preference for digest algorithm %s\n" -msgstr " %s preferanse for digestalgoritme %s\n" - -#: g10/import.c:631 -#, c-format -msgid " \"%s\": preference for compression algorithm %s\n" -msgstr "" - -#: g10/import.c:644 -msgid "it is strongly suggested that you update your preferences and\n" -msgstr "" - -#: g10/import.c:646 -msgid "re-distribute this key to avoid potential algorithm mismatch problems\n" -msgstr "" - -#: g10/import.c:670 -#, c-format -msgid "you can update your preferences with: gpg --edit-key %s updpref save\n" -msgstr "" - -#: g10/import.c:720 g10/import.c:1118 -#, c-format -msgid "key %s: no user ID\n" -msgstr "nkkel %s: ingen brukerid\n" - -#: g10/import.c:749 -#, c-format -msgid "key %s: PKS subkey corruption repaired\n" -msgstr "nkkel %s: PKS-undernkkel reparert\n" - -#: g10/import.c:764 -#, c-format -msgid "key %s: accepted non self-signed user ID \"%s\"\n" -msgstr "nkkel %s: akseptert ikke-selvsignert brukerid %s\n" - -#: g10/import.c:770 -#, c-format -msgid "key %s: no valid user IDs\n" -msgstr "nkkel %s: ingen gyldig brukerid\n" - -#: g10/import.c:772 -msgid "this may be caused by a missing self-signature\n" -msgstr "dette kan skyldes en manglende selvsignatur\n" - -#: g10/import.c:782 g10/import.c:1240 -#, c-format -msgid "key %s: public key not found: %s\n" -msgstr "nkkel %s: offentlig nkkel ikke funnet: %s\n" - -#: g10/import.c:788 -#, c-format -msgid "key %s: new key - skipped\n" -msgstr "nkkel %s: ny nkkel - hoppet over\n" - -#: g10/import.c:797 -#, c-format -msgid "no writable keyring found: %s\n" -msgstr "ingen skrivbart nkkelknippe funnet: %s\n" - -#: g10/import.c:802 g10/openfile.c:267 g10/sign.c:831 g10/sign.c:1135 -#, c-format -msgid "writing to `%s'\n" -msgstr "skriver til %s\n" - -#: g10/import.c:806 g10/import.c:901 g10/import.c:1158 g10/import.c:1301 -#: g10/import.c:2363 g10/import.c:2385 -#, c-format -msgid "error writing keyring `%s': %s\n" -msgstr "feil ved skriving av nkkelknippet %s: %s\n" - -#: g10/import.c:825 -#, c-format -msgid "key %s: public key \"%s\" imported\n" -msgstr "nkkel %s: offentlig nkkel %s importert\n" - -#: g10/import.c:849 -#, c-format -msgid "key %s: doesn't match our copy\n" -msgstr "nkkel %s: stemmer ikke med vr kopi\n" - -#: g10/import.c:866 g10/import.c:1258 -#, c-format -msgid "key %s: can't locate original keyblock: %s\n" -msgstr "nkkel %s: kan ikke finne original nkkelblokk: %s\n" - -#: g10/import.c:874 g10/import.c:1265 -#, c-format -msgid "key %s: can't read original keyblock: %s\n" -msgstr "nkkel %s: kan ikke lese original nkkelblokk: %s\n" - -#: g10/import.c:911 -#, c-format -msgid "key %s: \"%s\" 1 new user ID\n" -msgstr "nkkel %s: %s 1 ny brukerid\n" - -#: g10/import.c:914 -#, c-format -msgid "key %s: \"%s\" %d new user IDs\n" -msgstr "nkkel %s: %s %d nye brukerider\n" - -#: g10/import.c:917 -#, c-format -msgid "key %s: \"%s\" 1 new signature\n" -msgstr "nkkel %s: %s 1 ny signatur\n" - -#: g10/import.c:920 -#, c-format -msgid "key %s: \"%s\" %d new signatures\n" -msgstr "nkkel: %s: %s %d nye signaturer\n" - -#: g10/import.c:923 -#, c-format -msgid "key %s: \"%s\" 1 new subkey\n" -msgstr "nkkel %s: %s 1 ny undernkkel\n" - -#: g10/import.c:926 -#, c-format -msgid "key %s: \"%s\" %d new subkeys\n" -msgstr "nkkel %s: %s %d nye undernkler\n" - -#: g10/import.c:929 -#, c-format -msgid "key %s: \"%s\" %d signature cleaned\n" -msgstr "nkkel: %s: %s %d nye signaturer\n" - -#: g10/import.c:932 -#, c-format -msgid "key %s: \"%s\" %d signatures cleaned\n" -msgstr "nkkel: %s: %s %d nye signaturer\n" - -#: g10/import.c:935 -#, c-format -msgid "key %s: \"%s\" %d user ID cleaned\n" -msgstr "nkkel %s: %s %d nye brukerider\n" - -#: g10/import.c:938 -#, c-format -msgid "key %s: \"%s\" %d user IDs cleaned\n" -msgstr "nkkel %s: %s %d nye brukerider\n" - -#: g10/import.c:961 -#, c-format -msgid "key %s: \"%s\" not changed\n" -msgstr "nkkel %s: %s ikke endret\n" - -#: g10/import.c:1124 -#, c-format -msgid "key %s: secret key with invalid cipher %d - skipped\n" -msgstr "nkkel %s: hemmelig nkkel med ugyldig cipher %d - hoppet over\n" - -#: g10/import.c:1135 -msgid "importing secret keys not allowed\n" -msgstr "import av hemmelig nkkel er ikke tillatt\n" - -#: g10/import.c:1152 g10/import.c:2378 -#, c-format -msgid "no default secret keyring: %s\n" -msgstr "ingen standard hemmelig nkkelknippe: %s\n" - -#: g10/import.c:1163 -#, c-format -msgid "key %s: secret key imported\n" -msgstr "nkkel %s: hemmelig nkkel importert\n" - -#: g10/import.c:1193 -#, c-format -msgid "key %s: already in secret keyring\n" -msgstr "nkkel %s: finnes allerede i hemmelig nkkelknippe\n" - -#: g10/import.c:1203 -#, c-format -msgid "key %s: secret key not found: %s\n" -msgstr "nkkel %s: hemmelig nkkel ikke funnet: %s\n" - -#: g10/import.c:1233 -#, c-format -msgid "key %s: no public key - can't apply revocation certificate\n" -msgstr "" -"nkkel %s: ingen offentlig nkkel - kan ikke anvende opphevingssertifikat\n" - -#: g10/import.c:1276 -#, c-format -msgid "key %s: invalid revocation certificate: %s - rejected\n" -msgstr "nkkel %s: ugyldig opphevingssertifikat: %s - avvist\n" - -#: g10/import.c:1308 -#, c-format -msgid "key %s: \"%s\" revocation certificate imported\n" -msgstr "nkkel %s: %s opphevingssertifikat importert\n" - -#: g10/import.c:1374 -#, c-format -msgid "key %s: no user ID for signature\n" -msgstr "nkkel %s: ingen brukerid for signatur\n" - -#: g10/import.c:1389 -#, c-format -msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n" -msgstr "nkkel %s: ustttet offentlig nkkelalgoritme for brukerid %s\n" - -#: g10/import.c:1391 -#, c-format -msgid "key %s: invalid self-signature on user ID \"%s\"\n" -msgstr "nkkel %s: ugyldig selvsignatur for brukerid %s\n" - -#: g10/import.c:1409 -#, c-format -msgid "key %s: no subkey for key binding\n" -msgstr "nkkel %s: ingen undernkkel for nkkelbinding\n" - -#: g10/import.c:1420 g10/import.c:1470 -#, c-format -msgid "key %s: unsupported public key algorithm\n" -msgstr "nkkel %s: ustttet offentlig nkkelalgoritme\n" - -#: g10/import.c:1422 -#, c-format -msgid "key %s: invalid subkey binding\n" -msgstr "nkkel %s: ugyldig undernkkelbinding\n" - -#: g10/import.c:1437 -#, c-format -msgid "key %s: removed multiple subkey binding\n" -msgstr "nkkel %s: fjernet flere undernkkelbindinger\n" - -#: g10/import.c:1459 -#, c-format -msgid "key %s: no subkey for key revocation\n" -msgstr "nkkel %s: ingen undernkkel for nkkeloppheving\n" - -#: g10/import.c:1472 -#, c-format -msgid "key %s: invalid subkey revocation\n" -msgstr "nkkel %s: ugyldig undernkkeloppheving\n" - -#: g10/import.c:1487 -#, c-format -msgid "key %s: removed multiple subkey revocation\n" -msgstr "nkkel %s: fjernet flere undernkkelopphevinger\n" - -#: g10/import.c:1529 -#, c-format -msgid "key %s: skipped user ID \"%s\"\n" -msgstr "nkkel %s: hoppet over brukerid %s\n" - -#: g10/import.c:1550 -#, c-format -msgid "key %s: skipped subkey\n" -msgstr "nkkel %s: hoppet over undernkkel\n" - -#: g10/import.c:1577 -#, c-format -msgid "key %s: non exportable signature (class 0x%02X) - skipped\n" -msgstr "nkkel %s: ikke-eksporterbar signatur (klasse 0x%02X) - hoppet over\n" - -#: g10/import.c:1587 -#, c-format -msgid "key %s: revocation certificate at wrong place - skipped\n" -msgstr "nkkel %s: opphevingssertifikat p feil plass - hoppet over\n" - -#: g10/import.c:1604 -#, c-format -msgid "key %s: invalid revocation certificate: %s - skipped\n" -msgstr "nkkel %s: ugyldig opphevingssertifikat: %s - hoppet over\n" - -#: g10/import.c:1618 -#, c-format -msgid "key %s: subkey signature in wrong place - skipped\n" -msgstr "nkkel %s: undernkkelsignatur p feil plass - hoppet over\n" - -#: g10/import.c:1626 -#, c-format -msgid "key %s: unexpected signature class (0x%02X) - skipped\n" -msgstr "nkkel %s: uforventet signaturklasse (0x%02X) - hoppet over\n" - -#: g10/import.c:1726 -#, c-format -msgid "key %s: duplicated user ID detected - merged\n" -msgstr "nkkel %s: duplikert brukerid oppdaget - flettet sammen\n" - -#: g10/import.c:1788 -#, c-format -msgid "WARNING: key %s may be revoked: fetching revocation key %s\n" -msgstr "ADVARSEL: nkkel %s kan vre opphevet: henter opphevingsnkkel %s\n" - -#: g10/import.c:1802 -#, c-format -msgid "WARNING: key %s may be revoked: revocation key %s not present.\n" -msgstr "" -"ADVARSEL: nkkel %s kan vre opphevet: opphevingsnkkel %s ikke tilstede.\n" - -#: g10/import.c:1861 -#, c-format -msgid "key %s: \"%s\" revocation certificate added\n" -msgstr "nkkel %s: %s opphevingssertifikat lagt til\n" - -#: g10/import.c:1895 -#, c-format -msgid "key %s: direct key signature added\n" -msgstr "nkkel %s: direkte nkkelsignatur lagt til\n" - -#: g10/import.c:2284 -msgid "NOTE: a key's S/N does not match the card's one\n" -msgstr "" - -#: g10/import.c:2292 -msgid "NOTE: primary key is online and stored on card\n" -msgstr "" - -#: g10/import.c:2294 -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 nkkelknippet %s: %s\n" - -#: g10/keydb.c:175 -#, c-format -msgid "keyring `%s' created\n" -msgstr "nkkelknippet %s ble opprettet\n" - -#: g10/keydb.c:316 g10/keydb.c:319 -#, c-format -msgid "keyblock resource `%s': %s\n" -msgstr "nkkelblokkressurs %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 nkkel\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 nkler\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 nkler (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 utgtt." - -#: 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 nvrende signatur p %s\n" -"er utgtt.\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 utgtt? (j/N) " - -#: g10/keyedit.c:755 -#, c-format -msgid "" -"Your current signature on \"%s\"\n" -"is a local signature.\n" -msgstr "" -"Din nvrede 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 nkkelen %s\n" - -#: g10/keyedit.c:783 -#, c-format -msgid "\"%s\" was already signed by key %s\n" -msgstr "%s var allerede signert av nkkelen %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 nkkelen %s\n" - -#: g10/keyedit.c:825 -msgid "This key has expired!" -msgstr "Denne nkkelen er utgtt!" - -#: g10/keyedit.c:843 -#, c-format -msgid "This key is due to expire on %s.\n" -msgstr "Denne nkkelen utgr 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-nkkel i --pgp2-modus.\n" - -#: g10/keyedit.c:891 -msgid "This would make the key unusable in PGP 2.x.\n" -msgstr "Dette ville gjre nkkelen 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 nyaktig har du bekreftet at nkkelen du skal signere faktisk\n" -"tilhrer 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 nye.%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 nkkelen med din\n" -"nkkel %s (%s)\n" - -#: g10/keyedit.c:964 -msgid "This will be a self-signature.\n" -msgstr "Dette vil vre 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 nkkelen i det hele tatt.\n" - -#: g10/keyedit.c:1007 -msgid "I have checked this key casually.\n" -msgstr "Jeg har sjekket denne nkkelen p vanlig mte.\n" - -#: g10/keyedit.c:1012 -msgid "I have checked this key very carefully.\n" -msgstr "Jeg har sjekket denne nkkelen veldig nye.\n" - -#: g10/keyedit.c:1022 -msgid "Really sign? (y/N) " -msgstr "Virkelig signere? (j/N) " - -#: g10/keyedit.c:1067 g10/keyedit.c:4783 g10/keyedit.c:4874 g10/keyedit.c:4938 -#: g10/keyedit.c:4999 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 nkkelen 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 primrnkkelen 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 primrnkkelen er lagret p kort.\n" - -#: g10/keyedit.c:1155 g10/keygen.c:3206 -msgid "Key is protected.\n" -msgstr "Nkkelen er beskyttet.\n" - -#: g10/keyedit.c:1179 -#, c-format -msgid "Can't edit this key: %s\n" -msgstr "Kan ikke redigere denne nkkelen: %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 nkklen.\n" - -#: g10/keyedit.c:1194 g10/keygen.c:1897 -msgid "passphrase not correctly repeated; try again" -msgstr "passfrasen ble ikke gjentatt korrekt; prv 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 gjre dette? (j/N) " - -#: g10/keyedit.c:1273 -msgid "moving a key signature to the correct place\n" -msgstr "flytter en nkkelsignatur 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 nkkelens fingeravtrykk" - -#: g10/keyedit.c:1363 -msgid "list key and user IDs" -msgstr "liste nkler 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 undernkkel" - -#: 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 undernkler" - -#: g10/keyedit.c:1408 -msgid "add a revocation key" -msgstr "legge til en opphevingsnkkel" - -#: 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 primre" - -#: g10/keyedit.c:1416 -msgid "toggle between the secret and public key listings" -msgstr "veksle mellom hemmelig og offentlig nkkellisting" - -#: 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 nkkelserver 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 nkkel eller utvalgte undernkler" - -#: g10/keyedit.c:1446 -msgid "enable key" -msgstr "innkoble en nkkel" - -#: g10/keyedit.c:1447 -msgid "disable key" -msgstr "utkoble en nkkel" - -#: 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 nkkelblokk %s: %s\n" - -#: g10/keyedit.c:1588 -msgid "Secret key is available.\n" -msgstr "Hemmelig nkkel er tilgjengelig\n" - -#: g10/keyedit.c:1669 -msgid "Need the secret key to do this.\n" -msgstr "Trenger den hemmelige nkkelen for gjre dette.\n" - -#: g10/keyedit.c:1677 -msgid "Please use the command \"toggle\" first.\n" -msgstr "Vennligst bruk kommandoen toggle frst.\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 "Nkkelen 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 primrnkkelen? (j/N) " - -#: g10/keyedit.c:1883 -msgid "You must select exactly one key.\n" -msgstr "Du m velge minst en nkkel.\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 nkkel %s: %s\n" - -#: g10/keyedit.c:1966 -msgid "You must select at least one key.\n" -msgstr "Du m velge minst en nkkel.\n" - -#: g10/keyedit.c:1969 -msgid "Do you really want to delete the selected keys? (y/N) " -msgstr "Vil du virkelig slette den valgte nkkelen? (j/N) " - -#: g10/keyedit.c:1970 -msgid "Do you really want to delete this key? (y/N) " -msgstr "Vil du virkelig slette denne nkkelen? (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 nkkelen? (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 undernklene? (j/N) " - -#: g10/keyedit.c:2037 -msgid "Do you really want to revoke this subkey? (y/N) " -msgstr "Vil du virkelig oppheve denne undernkkelen? (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 "Nkkelen ble ikke endret, s ingen oppdatering er ndvendig.\n" - -#: g10/keyedit.c:2333 -msgid "Digest: " -msgstr "Digest: " - -#: g10/keyedit.c:2385 -msgid "Features: " -msgstr "Srtrekk: " - -#: 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 nkkelen ble opphevet den %s av %s med nkkelen %s\n" - -#: g10/keyedit.c:2710 -#, c-format -msgid "This key may be revoked by %s key %s" -msgstr "Denne nkkelen kan bli opphevet av %s med nkkelen %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 "utgr: %s" - -#: g10/keyedit.c:2741 -#, c-format -msgid "usage: %s" -msgstr "bruksmte: %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 nkkelen 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 "utgtt" - -#: 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:3346 -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:3249 -#, c-format -msgid "User ID \"%s\": already clean\n" -msgstr "brukerid %s: allerede renset\n" - -#: g10/keyedit.c:3341 -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:3352 -msgid "You may not add a designated revoker to a PGP 2.x-style key.\n" -msgstr "" - -#: g10/keyedit.c:3372 -msgid "Enter the user ID of the designated revoker: " -msgstr "" - -#: g10/keyedit.c:3397 -msgid "cannot appoint a PGP 2.x style key as a designated revoker\n" -msgstr "" - -#: g10/keyedit.c:3412 -msgid "you cannot appoint a key as its own designated revoker\n" -msgstr "" - -#: g10/keyedit.c:3434 -msgid "this key has already been designated as a revoker\n" -msgstr "" - -#: g10/keyedit.c:3453 -msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n" -msgstr "" - -#: g10/keyedit.c:3459 -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 gjre denne nkkelen til en opphever? (j/" -"N) " - -#: g10/keyedit.c:3520 -msgid "Please remove selections from the secret keys.\n" -msgstr "" - -#: g10/keyedit.c:3526 -msgid "Please select at most one subkey.\n" -msgstr "Vennligst velg minst en undernkkel.\n" - -#: g10/keyedit.c:3530 -msgid "Changing expiration time for a subkey.\n" -msgstr "" - -#: g10/keyedit.c:3533 -msgid "Changing expiration time for the primary key.\n" -msgstr "" - -#: g10/keyedit.c:3579 -msgid "You can't change the expiration date of a v3 key\n" -msgstr "" - -#: g10/keyedit.c:3595 -msgid "No corresponding signature in secret ring\n" -msgstr "" - -#: g10/keyedit.c:3668 -#, fuzzy, c-format -msgid "signing subkey %s is already cross-certified\n" -msgstr "Undernkkel %s er allerede opphevet.\n" - -#: g10/keyedit.c:3674 -#, c-format -msgid "subkey %s does not sign and so does not need to be cross-certified\n" -msgstr "" - -#: g10/keyedit.c:3836 -msgid "Please select exactly one user ID.\n" -msgstr "" - -#: g10/keyedit.c:3875 g10/keyedit.c:3985 g10/keyedit.c:4105 g10/keyedit.c:4246 -#, c-format -msgid "skipping v3 self-signature on user ID \"%s\"\n" -msgstr "hopper over v3 selvsignatur for brukerid %s\n" - -#: g10/keyedit.c:4046 -msgid "Enter your preferred keyserver URL: " -msgstr "" - -#: g10/keyedit.c:4126 -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:4127 -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:4189 -msgid "Enter the notation: " -msgstr "" - -#: g10/keyedit.c:4338 -msgid "Proceed? (y/N) " -msgstr "" - -#: g10/keyedit.c:4402 -#, c-format -msgid "No user ID with index %d\n" -msgstr "" - -#: g10/keyedit.c:4460 -#, c-format -msgid "No user ID with hash %s\n" -msgstr "" - -#: g10/keyedit.c:4487 -#, c-format -msgid "No subkey with index %d\n" -msgstr "" - -#: g10/keyedit.c:4622 -#, c-format -msgid "user ID: \"%s\"\n" -msgstr "" - -#: g10/keyedit.c:4625 g10/keyedit.c:4689 g10/keyedit.c:4732 -#, c-format -msgid "signed by your key %s on %s%s%s\n" -msgstr "" - -#: g10/keyedit.c:4627 g10/keyedit.c:4691 g10/keyedit.c:4734 -msgid " (non-exportable)" -msgstr " (ikke-eksporterbar)" - -#: g10/keyedit.c:4631 -#, c-format -msgid "This signature expired on %s.\n" -msgstr "Denne signaturen utgikk den %s.\n" - -#: g10/keyedit.c:4635 -msgid "Are you sure you still want to revoke it? (y/N) " -msgstr "" - -#: g10/keyedit.c:4639 -msgid "Create a revocation certificate for this signature? (y/N) " -msgstr "" - -#: g10/keyedit.c:4666 -#, c-format -msgid "You have signed these user IDs on key %s:\n" -msgstr "" - -#: g10/keyedit.c:4692 -msgid " (non-revocable)" -msgstr " (ikke-opphevbar)" - -#: g10/keyedit.c:4699 -#, c-format -msgid "revoked by your key %s on %s\n" -msgstr "" - -#: g10/keyedit.c:4721 -msgid "You are about to revoke these signatures:\n" -msgstr "" - -#: g10/keyedit.c:4741 -msgid "Really create the revocation certificates? (y/N) " -msgstr "" - -#: g10/keyedit.c:4771 -msgid "no secret key\n" -msgstr "ingen hemmelig nkkel\n" - -#: g10/keyedit.c:4841 -#, c-format -msgid "user ID \"%s\" is already revoked\n" -msgstr "brukerid %s er allerede opphevet\n" - -#: g10/keyedit.c:4858 -#, 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:4922 -#, c-format -msgid "Key %s is already revoked.\n" -msgstr "Nkkelen %s er allerede opphevet.\n" - -#: g10/keyedit.c:4984 -#, c-format -msgid "Subkey %s is already revoked.\n" -msgstr "Undernkkel %s er allerede opphevet.\n" - -#: g10/keyedit.c:5079 -#, 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 oppfring %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 nkkelbindende 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 "nkkelstrrelsen 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 "nkkelstrrelsen 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 nkkel 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-nkkelpar 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 nkkelstrrelse 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 nkkelstrrelse 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 nkkelen skal vre gyldig.\n" -" 0 = nkkelen utgr ikke\n" -" <n> = nkkelen utgr om n days\n" -" <n>w = nkkelen utgr om n weeks\n" -" <n>m = nkkelen utgr om n months\n" -" <n>y = nkkelen utgr 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 vre gyldig.\n" -" 0 = signaturen utgr ikke\n" -" <n> = signaturen utgr om n days\n" -" <n>w = signaturen utgr om n weeks\n" -" <n>m = signaturen utgr om n months\n" -" <n>y = signaturen utgr om n years\n" - -#: g10/keygen.c:1644 -msgid "Key is valid for? (0) " -msgstr "Nkkelen 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 "Nkkel utgr ikke i det hele tatt\n" - -#: g10/keygen.c:1675 -msgid "Signature does not expire at all\n" -msgstr "Signaturen utgr ikke i det hele tatt\n" - -#: g10/keygen.c:1680 -#, c-format -msgid "Key expires at %s\n" -msgstr "Nkkel utgr den %s\n" - -#: g10/keygen.c:1681 -#, c-format -msgid "Signature expires at %s\n" -msgstr "Signaturen utgr 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 hndtert 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 nkkelen 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 vre 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 frst\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 nkkel.\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 nr 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" -" utfre 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 "Nkkelgenereringen ble avbrutt.\n" - -#: g10/keygen.c:2907 g10/keygen.c:3052 -#, c-format -msgid "writing public key to `%s'\n" -msgstr "skriver offentlig nkkel til %s\n" - -#: g10/keygen.c:2909 g10/keygen.c:3055 -#, c-format -msgid "writing secret key stub to `%s'\n" -msgstr "skriver forelpig hemmelig nkkel til %s\n" - -#: g10/keygen.c:2912 g10/keygen.c:3058 -#, c-format -msgid "writing secret key to `%s'\n" -msgstr "skriver hemmelig nkkel til %s\n" - -#: g10/keygen.c:3041 -#, c-format -msgid "no writable public keyring found: %s\n" -msgstr "ingen skrivbart offentlig nkkelknippe ble funnet: %s\n" - -#: g10/keygen.c:3047 -#, c-format -msgid "no writable secret keyring found: %s\n" -msgstr "ingen skrivbart hemmelig nkkelknippe ble funnet: %s\n" - -#: g10/keygen.c:3065 -#, c-format -msgid "error writing public keyring `%s': %s\n" -msgstr "feil ved skriving av offentlig nkkelknippe %s: %s\n" - -#: g10/keygen.c:3072 -#, c-format -msgid "error writing secret keyring `%s': %s\n" -msgstr "feil ved skriving av hemmelig nkkelknippe %s: %s\n" - -#: g10/keygen.c:3095 -msgid "public and secret key created and signed.\n" -msgstr "offentlig og hemmelig nkkel 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 nkkelen ikke kan brukes for kryptering. Du nsker\n" -"kanskje bruke kommandoen --edit-key for generere en\n" -"sekundrnkkel for dette formlet.\n" - -#: g10/keygen.c:3118 g10/keygen.c:3247 g10/keygen.c:3363 -#, c-format -msgid "Key generation failed: %s\n" -msgstr "Nkkelgenerering 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 "" -"nkkel 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 "" -"nkkel 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 undernkler for v3-nkler 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 nkkel 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 "Nkkelknippe" - -#: g10/keylist.c:1505 -msgid "Primary key fingerprint:" -msgstr "Fingeravtrykk for primrnkkel:" - -#: g10/keylist.c:1507 -msgid " Subkey fingerprint:" -msgstr " Fingeravtrykk for undernkkel:" - -#. 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 primrnkkel:" - -#: g10/keylist.c:1516 -msgid " Subkey fingerprint:" -msgstr " Fingeravstrykk for undernkkel:" - -#: g10/keylist.c:1520 g10/keylist.c:1524 -msgid " Key fingerprint =" -msgstr " Nkkelfingeravtrykk =" - -#: 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 "omdping 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 nkkelknippet %s\n" - -#: g10/keyring.c:1422 -#, c-format -msgid "%lu keys cached so far (%lu signatures)\n" -msgstr "%lu nkler cachet s langt (%lu signaturer)\n" - -#: g10/keyring.c:1434 -#, c-format -msgid "%lu keys cached (%lu signatures)\n" -msgstr "%lu nkler 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: nkkelserver-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:1421 -#, 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 "nkkelen %s ble ikke funnet p nkkelserveren\n" - -#: g10/keyserver.c:908 -msgid "key not found on keyserver\n" -msgstr "nkkelen ble ikke funnet p nkkelserver\n" - -#: g10/keyserver.c:1145 -#, c-format -msgid "requesting key %s from %s server %s\n" -msgstr "ber om nkkelen %s fra %s server %s\n" - -#: g10/keyserver.c:1149 -#, c-format -msgid "requesting key %s from %s\n" -msgstr "ber om nkkel %s fra %s\n" - -#: g10/keyserver.c:1173 -#, c-format -msgid "searching for names from %s server %s\n" -msgstr "ske etter navn fra %s server %s\n" - -#: g10/keyserver.c:1176 -#, c-format -msgid "searching for names from %s\n" -msgstr "sker etter navn fra %s\n" - -#: g10/keyserver.c:1324 -#, c-format -msgid "sending key %s to %s server %s\n" -msgstr "" - -#: g10/keyserver.c:1328 -#, c-format -msgid "sending key %s to %s\n" -msgstr "" - -#: g10/keyserver.c:1371 -#, c-format -msgid "searching for \"%s\" from %s server %s\n" -msgstr "ske etter %s fra %s server %s\n" - -#: g10/keyserver.c:1374 -#, c-format -msgid "searching for \"%s\" from %s\n" -msgstr "sker etter %s fra %s\n" - -#: g10/keyserver.c:1381 g10/keyserver.c:1477 -msgid "no keyserver action!\n" -msgstr "ingen handling for nkkelserver!\n" - -#: g10/keyserver.c:1429 -#, c-format -msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n" -msgstr "" - -#: g10/keyserver.c:1438 -msgid "keyserver did not send VERSION\n" -msgstr "nkkelserver sendte ikke VERSION\n" - -#: g10/keyserver.c:1500 g10/keyserver.c:2028 -msgid "no keyserver known (use option --keyserver)\n" -msgstr "" - -#: g10/keyserver.c:1506 -msgid "external keyserver calls are not supported in this build\n" -msgstr "" - -#: g10/keyserver.c:1518 -#, c-format -msgid "no handler for keyserver scheme `%s'\n" -msgstr "" - -#: g10/keyserver.c:1523 -#, c-format -msgid "action `%s' not supported with keyserver scheme `%s'\n" -msgstr "" - -#: g10/keyserver.c:1531 -#, c-format -msgid "%s does not support handler version %d\n" -msgstr "" - -#: g10/keyserver.c:1538 -msgid "keyserver timed out\n" -msgstr "nkkelserver svarte ikke tidsnok\n" - -#: g10/keyserver.c:1543 -msgid "keyserver internal error\n" -msgstr "intern feil ved nkkelserver\n" - -#: g10/keyserver.c:1552 -#, c-format -msgid "keyserver communications error: %s\n" -msgstr "kommunikasjonsfeil med nkkelserver: %s\n" - -#: g10/keyserver.c:1577 g10/keyserver.c:1611 -#, c-format -msgid "\"%s\" not a key ID: skipping\n" -msgstr "" - -#: g10/keyserver.c:1870 -#, c-format -msgid "WARNING: unable to refresh key %s via %s: %s\n" -msgstr "ADVARSEL: klarte ikke oppfriske nkkel %s via %s: %s\n" - -#: g10/keyserver.c:1892 -#, c-format -msgid "refreshing 1 key from %s\n" -msgstr "oppfrisker 1 nkkel fra %s\n" - -#: g10/keyserver.c:1894 -#, c-format -msgid "refreshing %d keys from %s\n" -msgstr "oppfrisker %d nkler fra %s\n" - -#: g10/keyserver.c:1950 -#, c-format -msgid "WARNING: unable to fetch URI %s: %s\n" -msgstr "ADVARSEL: klarte ikke fange URI %s: %s\n" - -#: g10/keyserver.c:1956 -#, 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 strrelse for en kryptert sesjonsnkkel (%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 nkkel er %s\n" - -#: g10/mainproc.c:439 -msgid "public key encrypted data: good DEK\n" -msgstr "offentlig nkkel-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-nkkel, 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-nkkel, ID %s\n" - -#: g10/mainproc.c:494 -#, c-format -msgid "public key decryption failed: %s\n" -msgstr "offentlig nkkel-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 nkkel %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-nkkel ID %s\n" - -#: g10/mainproc.c:1544 -msgid "Key available at: " -msgstr "Nkkel tilgjengelig ved: " - -#: g10/mainproc.c:1677 g10/mainproc.c:1725 -#, c-format -msgid "BAD signature from \"%s\"" -msgstr "DRLIG signatur fra %s" - -#: g10/mainproc.c:1679 g10/mainproc.c:1727 -#, c-format -msgid "Expired signature from \"%s\"" -msgstr "Utgtt 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 utgtt %s\n" - -#: g10/mainproc.c:1868 -#, c-format -msgid "Signature expires %s\n" -msgstr "Signatur utgr %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 "binr" - -#: 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 nkkel-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:305 -#, c-format -msgid "assuming signed data in `%s'\n" -msgstr "antar at signert data er i %s\n" - -#: g10/openfile.c:384 -#, c-format -msgid "new configuration file `%s' created\n" -msgstr "ny konfigurasjonsfil %s ble opprettet\n" - -#: g10/openfile.c:386 -#, 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 kjringen\n" - -#: g10/openfile.c:418 -#, 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:1157 -#, 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 " (hovednkkelid %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 lse opp den hemmelige nkkelen for brukeren:\n" -"%.*s\n" -"%u-bit %s nkkel, 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:968 -msgid "can't query passphrase in batch mode\n" -msgstr "kan ikke sprre om passfrase i batchmodus\n" - -#: g10/passphrase.c:812 g10/passphrase.c:973 -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 lse opp den hemmelige nkkelen for\n" -"brukeren: %s\n" - -#: g10/passphrase.c:901 -#, c-format -msgid "%u-bit %s key, ID %s, created %s" -msgstr "%u-bit %s-nkkel, ID %s, opprettet %s" - -#: g10/passphrase.c:910 -#, c-format -msgid " (subkey on main key ID %s)" -msgstr "" - -#: g10/passphrase.c:977 -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 "Nkkelen er overgtt" - -#: g10/pkclist.c:66 g10/revoke.c:624 -msgid "Key has been compromised" -msgstr "Nkkelen har blitt kompromittert" - -#: g10/pkclist.c:68 g10/revoke.c:626 -msgid "Key is no longer used" -msgstr "Nkkelen 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 nkkelen faktisk tilhrer 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 nkkelen\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 nkkelen til fullstendig tillit? (j/N) " - -#: g10/pkclist.c:334 -msgid "Certificates leading to an ultimately trusted key:\n" -msgstr "Sertifikater som frer til en fullstendig betrodd nkkel:\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 nkkelen faktisk tilhrer 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 nkkelen faktisk tilhrer den " -"angitte eieren\n" - -#: g10/pkclist.c:430 -msgid "This key probably belongs to the named user\n" -msgstr "Denne nkkelen tilhrer sannsynligvis den angitte eieren\n" - -#: g10/pkclist.c:435 -msgid "This key belongs to us\n" -msgstr "denne nkkelen tilhrer 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 nkkelen tilhrer personen som er angitt i\n" -"brukeriden. Dersom du *virkelig* vet hva du gjr, kan du besvare det\n" -"neste sprsmlet med ja.\n" - -#: g10/pkclist.c:468 -msgid "Use this key anyway? (y/N) " -msgstr "Bruke denne nkkelen likevel? (j/N) " - -#: g10/pkclist.c:502 -msgid "WARNING: Using untrusted key!\n" -msgstr "ADVARSEL: Bruker ubetrodd nkkel!\n" - -#: g10/pkclist.c:509 -msgid "WARNING: this key might be revoked (revocation key not present)\n" -msgstr "" -"ADVARSEL: nkkel %s kan vre opphevet: opphevingsnkkel %s ikke tilstede.\n" - -#: g10/pkclist.c:518 -msgid "WARNING: This key has been revoked by its designated revoker!\n" -msgstr "" -"ADVARSEL: Denne nkkelen 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 nkkelen 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 undernkkelen har blitt opphevet av eieren!\n" - -#: g10/pkclist.c:533 -msgid "Note: This key has been disabled.\n" -msgstr "Merk: Denne nkkelen 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 nkkelen er utgtt!\n" - -#: g10/pkclist.c:602 -msgid "WARNING: This key is not certified with a trusted signature!\n" -msgstr "" -"ADVARSEL: Denne nkkelen 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 tilhrer eieren.\n" - -#: g10/pkclist.c:612 -msgid "WARNING: We do NOT trust this key!\n" -msgstr "ADVARSEL: Vi stoler IKKE p denne nkkelen!\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 nkkelen 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 tilhrer 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 nkkel 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 nkkel allerede satt som standard mottaker\n" - -#: g10/pkclist.c:990 -msgid "Public key is disabled.\n" -msgstr "Offentlig nkkel er utkoblet.\n" - -#: g10/pkclist.c:999 -msgid "skipped: public key already set\n" -msgstr "hoppet over: offentlig nkkel 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 nkkel 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 "" -"ptvinging 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 nkkel %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 "nkkel %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 nkkelen? (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 nkkel %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 nkkelen? (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 prv 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 nkkel ble opprettet - prver 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 nkkel for symmetrisk krypteringsalgorime; prvde %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 "" -"nkkel %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 "" -"nkkel %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: signaturnkkelen %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 "nkkel %s: ingen undernkkel for undernkkelopphevingssignatur\n" - -#: g10/sig-check.c:570 -#, c-format -msgid "key %s: no subkey for subkey binding signature\n" -msgstr "nkkel %s: ingen undernkkel for undernkkelbindingssignatur\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: ptvinging 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:127 g10/skclist.c:191 -msgid "key is not flagged as insecure - can't use it with the faked RNG!\n" -msgstr "" - -#: g10/skclist.c:158 -#, c-format -msgid "skipped \"%s\": duplicated\n" -msgstr "hoppet over %s: er duplikat\n" - -#: g10/skclist.c:166 g10/skclist.c:176 g10/skclist.c:185 -#, c-format -msgid "skipped \"%s\": %s\n" -msgstr "hoppet over %s: %s\n" - -#: g10/skclist.c:171 -msgid "skipped: secret key already present\n" -msgstr "" - -#: g10/skclist.c:186 -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 sking 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 ls for %s\n" - -#: g10/tdbio.c:525 g10/tdbio.c:592 -#, c-format -msgid "can't lock `%s'\n" -msgstr "kan ikke lse %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 "nkkel %s: godtatt som betrodd nkkel\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 "nkkel %s: ingen offentlig nkkel for betrodd nkkel - hoppet over\n" - -#: g10/trustdb.c:321 -#, c-format -msgid "key %s marked as ultimately trusted\n" -msgstr "nkkel %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 "[ utgtt]" - -#: 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 nkkel %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 nkkel" - -#: util/errors.c:61 -msgid "bad secret key" -msgstr "ugyldig hemmelig nkkel" - -#: 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 nkkel" - -#: 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 nkkelknippet" - -#: 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 nkkel er ikke tilgjengelig" - -#: util/errors.c:72 -msgid "wrong secret key used" -msgstr "feil hemmelig nkkel ble brukt" - -#: util/errors.c:73 -msgid "not supported" -msgstr "ikke stttet" - -#: util/errors.c:74 -msgid "bad key" -msgstr "ugyldig nkkel" - -#: 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 nkkelknippe" - -#: 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 omdping 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 fr av" - -#: util/errors.c:97 -msgid "weak key" -msgstr "svak nkkel" - -#: 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 "ustttet 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 nkkel" - -#: util/errors.c:107 -msgid "unusable secret key" -msgstr "ubrukelig hemmelig nkkel" - -#: util/errors.c:108 -msgid "keyserver error" -msgstr "feil med nkkelserver" - -#: 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:350 -msgid "operation is not possible without initialized secure memory\n" -msgstr "operasjonen er ikke mulig uten initialisert sikkert minne\n" - -#: util/secmem.c:351 -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/nl.po b/po/nl.po deleted file mode 100644 index 6e0be3e76..000000000 --- a/po/nl.po +++ /dev/null @@ -1,6575 +0,0 @@ -# Dutch translation of gnupg. -# Copyright (C) 2004 Free Software Foundation, Inc. -# This file is distributed under the same license as the gnupg package. -# Elros Cyriatan <cyriatan@fastmail.fm>, 2004. -# -# -msgid "" -msgstr "" -"Project-Id-Version: gnupg 1.2.2\n" -"Report-Msgid-Bugs-To: gnupg-i18n@gnupg.org\n" -"POT-Creation-Date: 2004-11-03 17:37+0100\n" -"PO-Revision-Date: 2004-05-10 19:23+0200\n" -"Last-Translator: Elros Cyriatan <cyriatan@fastmail.fm>\n" -"Language-Team: Dutch <vertaling@nl.linux.org>\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: cipher/md.c:137 -#, c-format -msgid "digest algorithm `%s' is read-only in this release\n" -msgstr "digest-algoritme `%s' is alleen-lezen in deze uitgave\n" - -#: cipher/primegen.c:120 -#, c-format -msgid "can't gen prime with pbits=%u qbits=%u\n" -msgstr "" - -#: cipher/primegen.c:311 -#, c-format -msgid "can't generate a prime with less than %d bits\n" -msgstr "" - -#: cipher/random.c:163 -msgid "no entropy gathering module detected\n" -msgstr "geen entropie verzamelende module gevonden\n" - -#: cipher/random.c:387 g10/card-util.c:594 g10/dearmor.c:60 g10/dearmor.c:109 -#: g10/encode.c:181 g10/encode.c:488 g10/g10.c:3194 g10/import.c:175 -#: g10/keygen.c:2236 g10/keyring.c:1524 g10/openfile.c:180 g10/openfile.c:333 -#: g10/plaintext.c:468 g10/sign.c:761 g10/sign.c:913 g10/sign.c:1021 -#: g10/sign.c:1166 g10/tdbdump.c:140 g10/tdbdump.c:148 g10/tdbio.c:539 -#: g10/tdbio.c:600 -#, c-format -msgid "can't open `%s': %s\n" -msgstr "kan `%s' niet openen: %s\n" - -#: cipher/random.c:391 -#, c-format -msgid "can't stat `%s': %s\n" -msgstr "kan `%s' niet vinden: %s\n" - -#: cipher/random.c:396 -#, c-format -msgid "`%s' is not a regular file - ignored\n" -msgstr "`%s' is geen gewoon bestand - genegeerd\n" - -#: cipher/random.c:401 -msgid "note: random_seed file is empty\n" -msgstr "let op: random_seed bestand is leeg\n" - -#: cipher/random.c:407 -msgid "WARNING: invalid size of random_seed file - not used\n" -msgstr "" -"WAARSCHUWING: ongeldige grootte van random_seed bestand - niet gebruikt\n" - -#: cipher/random.c:415 -#, c-format -msgid "can't read `%s': %s\n" -msgstr "kan `%s' niet lezen: %s\n" - -#: cipher/random.c:453 -msgid "note: random_seed file not updated\n" -msgstr "let op: random_seed bestand niet bijgewerkt\n" - -#: cipher/random.c:473 g10/exec.c:489 g10/keygen.c:2704 g10/keygen.c:2734 -#: g10/keyring.c:1200 g10/keyring.c:1500 g10/openfile.c:257 g10/openfile.c:348 -#: g10/sign.c:779 g10/sign.c:1037 g10/tdbio.c:535 -#, c-format -msgid "can't create `%s': %s\n" -msgstr "kan `%s' niet aanmaken: %s\n" - -#: cipher/random.c:480 -#, c-format -msgid "can't write `%s': %s\n" -msgstr "kan `%s' niet schrijven: %s\n" - -#: cipher/random.c:483 -#, c-format -msgid "can't close `%s': %s\n" -msgstr "kan `%s' niet sluiten: %s\n" - -#: cipher/random.c:728 -msgid "WARNING: using insecure random number generator!!\n" -msgstr "" -"WAARSCHUWING: er wordt een onveilige willekeurige getallen generator " -"gebruikt!!\n" - -#: cipher/random.c:729 -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 "" -"De willekeurige getallen generator is slechts profisorisch bedoeld om het\n" -"programma te laten werken - hij is zeker niet goed!\n" -"\n" -"GEBRUIK GEEN GEGEVENS DIE GEGENEREERD ZIJN DOOR DIT PROGRAMMA!!\n" -"\n" - -#: cipher/rndegd.c:204 -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 "" -"Even geduld alstublieft, er wordt entropie verzameld. Doe wat werk\n" -"als u dan niet verveeld raakt, want het verbeterd de kwaliteit van de\n" -"entropie.\n" - -#: cipher/rndlinux.c:134 -#, 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" -"Onvoldoende willekeurige bytes beschikbaar. Doe alstublieft wat ander werk\n" -"om het besturingssysteem de kans te geven om meer entropie te verzamelen!\n" -"(Er zijn nog %d bytes nodig)\n" - -#: g10/app-openpgp.c:534 -#, fuzzy, c-format -msgid "failed to store the fingerprint: %s\n" -msgstr "initialiseren van vertrouwensgegevensbank mislukt: %s\n" - -#: g10/app-openpgp.c:547 -#, fuzzy, c-format -msgid "failed to store the creation date: %s\n" -msgstr "opnieuw opbouwen sleutelbos buffer mislukt: %s\n" - -#: g10/app-openpgp.c:732 g10/app-openpgp.c:821 g10/app-openpgp.c:1313 -#, c-format -msgid "PIN callback returned error: %s\n" -msgstr "" - -#: g10/app-openpgp.c:738 g10/app-openpgp.c:827 g10/app-openpgp.c:1319 -#, c-format -msgid "PIN for CHV%d is too short; minimum length is %d\n" -msgstr "" - -#: g10/app-openpgp.c:747 g10/app-openpgp.c:761 g10/app-openpgp.c:837 -#: g10/app-openpgp.c:1328 g10/app-openpgp.c:1342 -#, fuzzy, c-format -msgid "verify CHV%d failed: %s\n" -msgstr "Sleutelaanmaak mislukt: %s\n" - -#: g10/app-openpgp.c:784 -msgid "access to admin commands is not configured\n" -msgstr "" - -#: g10/app-openpgp.c:801 -msgid "error retrieving CHV status from card\n" -msgstr "" - -#: g10/app-openpgp.c:807 -msgid "card is permanently locked!\n" -msgstr "" - -#: g10/app-openpgp.c:814 -#, c-format -msgid "%d Admin PIN attempts remaining before card is permanently locked\n" -msgstr "" - -#: g10/app-openpgp.c:818 -msgid "Admin PIN" -msgstr "" - -#: g10/app-openpgp.c:1301 -#, c-format -msgid "PIN [sigs done: %lu]" -msgstr "" - -#: g10/app-openpgp.c:1587 g10/app-openpgp.c:1597 -#, fuzzy, c-format -msgid "can't access %s - invalid OpenPGP card?\n" -msgstr "geen geldige OpenPGP-gegevens gevonden.\n" - -#: g10/app-openpgp.c:1668 -#, fuzzy, c-format -msgid "error getting serial number: %s\n" -msgstr "fout bij maken wachtwoord: %s\n" - -#: g10/app-openpgp.c:1763 -#, fuzzy, c-format -msgid "failed to store the key: %s\n" -msgstr "initialiseren van vertrouwensgegevensbank mislukt: %s\n" - -#: g10/app-openpgp.c:1805 -#, fuzzy -msgid "reading the key failed\n" -msgstr "verwijderen sleutelblok mislukt: %s\n" - -#: g10/app-openpgp.c:1812 -msgid "response does not contain the public key data\n" -msgstr "" - -#: g10/app-openpgp.c:1820 -msgid "response does not contain the RSA modulus\n" -msgstr "" - -#: g10/app-openpgp.c:1831 -msgid "response does not contain the RSA public exponent\n" -msgstr "" - -#: g10/armor.c:317 -#, c-format -msgid "armor: %s\n" -msgstr "bepantsering: %s\n" - -#: g10/armor.c:346 -msgid "invalid armor header: " -msgstr "ongeldige bepantseringskop: " - -#: g10/armor.c:353 -msgid "armor header: " -msgstr "bepantseringskop: " - -#: g10/armor.c:364 -msgid "invalid clearsig header\n" -msgstr "ongeldige kop niet-gecodeerde ondertekening\n" - -#: g10/armor.c:416 -msgid "nested clear text signatures\n" -msgstr "geneste niet-gecodeerde ondertekeningen\n" - -#: g10/armor.c:551 -#, fuzzy -msgid "unexpected armor: " -msgstr "onverwachte bepantsering:" - -#: g10/armor.c:563 -msgid "invalid dash escaped line: " -msgstr "" - -#: g10/armor.c:715 g10/armor.c:1300 -#, fuzzy, c-format -msgid "invalid radix64 character %02X skipped\n" -msgstr "ongeldig grondtal64-teken %02x overgeslagen\n" - -#: g10/armor.c:758 -msgid "premature eof (no CRC)\n" -msgstr "vroegtijdig einde bestand (geen CRC)\n" - -#: g10/armor.c:792 -msgid "premature eof (in CRC)\n" -msgstr "vroegtijdig einde bestand (in CRC)\n" - -#: g10/armor.c:800 -msgid "malformed CRC\n" -msgstr "misvormde CRC\n" - -#: g10/armor.c:804 g10/armor.c:1337 -#, fuzzy, c-format -msgid "CRC error; %06lX - %06lX\n" -msgstr "CRC-fout; %06lx - %06lx\n" - -#: g10/armor.c:824 -#, fuzzy -msgid "premature eof (in trailer)\n" -msgstr "vroegtijdig einde bestand (in afsluitend deel)\n" - -#: g10/armor.c:828 -msgid "error in trailer line\n" -msgstr "fout in afsluitende regel\n" - -#: g10/armor.c:1115 -msgid "no valid OpenPGP data found.\n" -msgstr "geen geldige OpenPGP-gegevens gevonden.\n" - -#: g10/armor.c:1120 -#, c-format -msgid "invalid armor: line longer than %d characters\n" -msgstr "ongeldige bepantsering: regel langer dan %d tekens\n" - -#: g10/armor.c:1124 -msgid "" -"quoted printable character in armor - probably a buggy MTA has been used\n" -msgstr "" - -#: g10/card-util.c:58 g10/card-util.c:282 -#, fuzzy, c-format -msgid "OpenPGP card not available: %s\n" -msgstr "geheime sleutel niet beschikbaar" - -#: g10/card-util.c:63 -#, c-format -msgid "OpenPGP card no. %s detected\n" -msgstr "" - -#: g10/card-util.c:70 g10/card-util.c:1198 g10/delkey.c:120 g10/keyedit.c:1314 -#: g10/keygen.c:2420 g10/revoke.c:216 g10/revoke.c:417 -#, fuzzy -msgid "can't do this in batch mode\n" -msgstr "dat kan niet in batch-modus\n" - -#: g10/card-util.c:94 g10/card-util.c:977 g10/card-util.c:1059 -#: g10/keyedit.c:412 g10/keyedit.c:433 g10/keyedit.c:447 g10/keygen.c:1298 -#: g10/keygen.c:1361 -msgid "Your selection? " -msgstr "Uw keuze? " - -#: g10/card-util.c:194 g10/card-util.c:244 -msgid "[not set]" -msgstr "" - -#: g10/card-util.c:376 -#, fuzzy -msgid "male" -msgstr "enable" - -#: g10/card-util.c:377 -#, fuzzy -msgid "female" -msgstr "enable" - -#: g10/card-util.c:377 -#, fuzzy -msgid "unspecified" -msgstr "Geen reden opgegeven" - -#: g10/card-util.c:396 -#, fuzzy -msgid "not forced" -msgstr "niet verwerkt" - -#: g10/card-util.c:396 -msgid "forced" -msgstr "" - -#: g10/card-util.c:439 -msgid "Error: Only plain ASCII is currently allowed.\n" -msgstr "" - -#: g10/card-util.c:441 -msgid "Error: The \"<\" character may not be used.\n" -msgstr "" - -#: g10/card-util.c:443 -msgid "Error: Double spaces are not allowed.\n" -msgstr "" - -#: g10/card-util.c:460 -msgid "Cardholder's surname: " -msgstr "" - -#: g10/card-util.c:462 -msgid "Cardholder's given name: " -msgstr "" - -#: g10/card-util.c:480 -#, c-format -msgid "Error: Combined name too long (limit is %d characters).\n" -msgstr "" - -#: g10/card-util.c:502 -#, fuzzy -msgid "URL to retrieve public key: " -msgstr "geen geassocieerde openbare sleutel: %s\n" - -#: g10/card-util.c:510 -#, c-format -msgid "Error: URL too long (limit is %d characters).\n" -msgstr "" - -#: g10/card-util.c:603 g10/import.c:261 -#, c-format -msgid "error reading `%s': %s\n" -msgstr "fout bij lezen `%s': %s\n" - -#: g10/card-util.c:611 -msgid "Login data (account name): " -msgstr "" - -#: g10/card-util.c:621 -#, c-format -msgid "Error: Login data too long (limit is %d characters).\n" -msgstr "" - -#: g10/card-util.c:641 -#, fuzzy -msgid "Language preferences: " -msgstr "voorkeuren bijgewerkt" - -#: g10/card-util.c:649 -#, fuzzy -msgid "Error: invalid length of preference string.\n" -msgstr "ongeldig teken in voorkeurtekenreeks\n" - -#: g10/card-util.c:658 -#, fuzzy -msgid "Error: invalid characters in preference string.\n" -msgstr "ongeldig teken in voorkeurtekenreeks\n" - -#: g10/card-util.c:679 -msgid "Sex ((M)ale, (F)emale or space): " -msgstr "" - -#: g10/card-util.c:693 -#, fuzzy -msgid "Error: invalid response.\n" -msgstr "fout: ongeldige vingerafdruk\n" - -#: g10/card-util.c:714 -#, fuzzy -msgid "CA fingerprint: " -msgstr "vingerafdruk weergeven" - -#: g10/card-util.c:737 -#, fuzzy -msgid "Error: invalid formatted fingerprint.\n" -msgstr "fout: ongeldige vingerafdruk\n" - -#: g10/card-util.c:785 -#, fuzzy, c-format -msgid "key operation not possible: %s\n" -msgstr "Sleutelaanmaak mislukt: %s\n" - -#: g10/card-util.c:786 -#, fuzzy -msgid "not an OpenPGP card" -msgstr "geen geldige OpenPGP-gegevens gevonden.\n" - -#: g10/card-util.c:795 -#, fuzzy, c-format -msgid "error getting current key info: %s\n" -msgstr "fout bij schrijven geheime sleutelbos `%s': %s\n" - -#: g10/card-util.c:878 -msgid "Replace existing key? (y/N) " -msgstr "" - -#: g10/card-util.c:899 g10/card-util.c:908 -msgid "Make off-card backup of encryption key? (Y/n) " -msgstr "" - -#: g10/card-util.c:920 -msgid "Replace existing keys? (y/N) " -msgstr "" - -#: g10/card-util.c:929 -#, 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:968 -#, fuzzy -msgid "Please select the type of key to generate:\n" -msgstr "Kies alstublieft wat voor sleutel u wilt hebben:\n" - -#: g10/card-util.c:970 g10/card-util.c:1050 -#, fuzzy -msgid " (1) Signature key\n" -msgstr "Ondertekening verlopen %s\n" - -#: g10/card-util.c:971 g10/card-util.c:1052 -#, fuzzy -msgid " (2) Encryption key\n" -msgstr " (%d) RSA (alleen coderen)\n" - -#: g10/card-util.c:972 g10/card-util.c:1054 -msgid " (3) Authentication key\n" -msgstr "" - -#: g10/card-util.c:988 g10/card-util.c:1070 g10/keyedit.c:907 -#: g10/keygen.c:1395 g10/revoke.c:642 -msgid "Invalid selection.\n" -msgstr "Ongeldige keuze.\n" - -#: g10/card-util.c:1047 -#, fuzzy -msgid "Please select where to store the key:\n" -msgstr "Kies alstublieft een reden voor de herroeping:\n" - -#: g10/card-util.c:1082 -#, fuzzy -msgid "unknown key protection algorithm\n" -msgstr "onbekend beschermingsalgoritme\n" - -#: g10/card-util.c:1087 -#, fuzzy -msgid "secret parts of key are not available\n" -msgstr "Geheime delen van primaire sleutel zijn niet beschikbaar.\n" - -#: g10/card-util.c:1092 -#, fuzzy -msgid "secret key already stored on a card\n" -msgstr "overgeslagen: geheime sleutel reeds aanwezig\n" - -#: g10/card-util.c:1162 g10/keyedit.c:1245 util/miscutil.c:348 -msgid "quit" -msgstr "afsluiten" - -#: g10/card-util.c:1162 g10/keyedit.c:1245 -msgid "quit this menu" -msgstr "dit menu verlaten" - -#: g10/card-util.c:1163 g10/keyedit.c:1246 -msgid "q" -msgstr "q" - -#: g10/card-util.c:1164 -msgid "admin" -msgstr "" - -#: g10/card-util.c:1164 -#, fuzzy -msgid "show admin commands" -msgstr "conflicterende opdrachten\n" - -#: g10/card-util.c:1165 g10/keyedit.c:1248 -msgid "help" -msgstr "help" - -#: g10/card-util.c:1165 g10/keyedit.c:1248 -msgid "show this help" -msgstr "deze hulp weergeven" - -#: g10/card-util.c:1167 g10/keyedit.c:1251 -msgid "list" -msgstr "list" - -#: g10/card-util.c:1167 -#, fuzzy -msgid "list all available data" -msgstr "Geen hulp beschikbaar" - -#: g10/card-util.c:1168 g10/keyedit.c:1252 -msgid "l" -msgstr "l" - -#: g10/card-util.c:1169 g10/keyedit.c:1263 -msgid "debug" -msgstr "debug" - -#: g10/card-util.c:1170 -#, fuzzy -msgid "name" -msgstr "enable" - -#: g10/card-util.c:1170 -msgid "change card holder's name" -msgstr "" - -#: g10/card-util.c:1171 -msgid "url" -msgstr "" - -#: g10/card-util.c:1171 -msgid "change URL to retrieve key" -msgstr "" - -#: g10/card-util.c:1172 -msgid "fetch" -msgstr "" - -#: g10/card-util.c:1173 -msgid "fetch the key specified in the card URL" -msgstr "" - -#: g10/card-util.c:1174 -#, fuzzy -msgid "login" -msgstr "lsign" - -#: g10/card-util.c:1174 -#, fuzzy -msgid "change the login name" -msgstr "de verloopdatum wijzigen" - -#: g10/card-util.c:1175 -msgid "lang" -msgstr "" - -#: g10/card-util.c:1175 -#, fuzzy -msgid "change the language preferences" -msgstr "het eigenaarsvertrouwen wijzigen" - -#: g10/card-util.c:1176 -msgid "sex" -msgstr "" - -#: g10/card-util.c:1176 -msgid "change card holder's sex" -msgstr "" - -#: g10/card-util.c:1177 -#, fuzzy -msgid "cafpr" -msgstr "fpr" - -#: g10/card-util.c:1177 -#, fuzzy -msgid "change a CA fingerprint" -msgstr "vingerafdruk weergeven" - -#: g10/card-util.c:1178 -#, fuzzy -msgid "forcesig" -msgstr "revsig" - -#: g10/card-util.c:1179 -msgid "toggle the signature force PIN flag" -msgstr "" - -#: g10/card-util.c:1180 -#, fuzzy -msgid "generate" -msgstr "algemene fout" - -#: g10/card-util.c:1181 -#, fuzzy -msgid "generate new keys" -msgstr "een nieuw sleutelpaar genereren" - -#: g10/card-util.c:1182 g10/keyedit.c:1287 -msgid "passwd" -msgstr "passwd" - -#: g10/card-util.c:1182 -msgid "menu to change or unblock the PIN" -msgstr "" - -#: g10/card-util.c:1246 g10/keyedit.c:1397 -msgid "Command> " -msgstr "Opdracht> " - -#: g10/card-util.c:1281 -#, fuzzy -msgid "Admin-only command\n" -msgstr "conflicterende opdrachten\n" - -#: g10/card-util.c:1297 -#, fuzzy -msgid "Admin commands are allowed\n" -msgstr "conflicterende opdrachten\n" - -#: g10/card-util.c:1299 -#, fuzzy -msgid "Admin commands are not allowed\n" -msgstr "bezig met schrijven geheime sleutel naar `%s'\n" - -#: g10/card-util.c:1360 g10/keyedit.c:1864 -msgid "Invalid command (try \"help\")\n" -msgstr "Ongeldige opdracht (probeer \"hulp\")\n" - -#: g10/cardglue.c:280 -msgid "Please insert the card and hit return or enter 'c' to cancel: " -msgstr "" - -#: g10/cardglue.c:364 -#, c-format -msgid "" -"Please remove the current card and insert the one with serial number:\n" -" %.*s\n" -msgstr "" - -#: g10/cardglue.c:372 -msgid "Hit return when ready or enter 'c' to cancel: " -msgstr "" - -#: g10/cardglue.c:638 -msgid "Enter Admin PIN: " -msgstr "" - -#: g10/cardglue.c:638 -msgid "Enter PIN: " -msgstr "" - -#: g10/decrypt.c:68 g10/decrypt.c:157 g10/g10.c:3544 g10/keyring.c:376 -#: g10/keyring.c:662 g10/verify.c:101 g10/verify.c:154 -#, c-format -msgid "can't open `%s'\n" -msgstr "kan `%s' niet openen\n" - -#: g10/decrypt.c:104 g10/encode.c:859 -msgid "--output doesn't work for this command\n" -msgstr "--uitvoer werkt niet voor deze opdracht\n" - -#: g10/delkey.c:74 g10/export.c:162 g10/keyedit.c:2927 g10/keyserver.c:1414 -#: g10/revoke.c:226 -#, fuzzy, c-format -msgid "key \"%s\" not found: %s\n" -msgstr "sleutel `%s' niet gevonden: %s\n" - -#: g10/delkey.c:82 g10/export.c:192 g10/keyserver.c:1428 g10/revoke.c:232 -#: g10/revoke.c:439 -#, c-format -msgid "error reading keyblock: %s\n" -msgstr "fout bij lezen sleutelblok: %s\n" - -#: g10/delkey.c:121 g10/delkey.c:128 -msgid "(unless you specify the key by fingerprint)\n" -msgstr "(tenzij u de sleutel aangeeft met de vingerafdruk)\n" - -#: g10/delkey.c:127 -#, fuzzy -msgid "can't do this in batch mode without \"--yes\"\n" -msgstr "dat kan niet in batch-modus zonder \"--yes\"\n" - -#: g10/delkey.c:139 -#, fuzzy -msgid "Delete this key from the keyring? (y/N) " -msgstr "Deze sleutel verwijderen uit de sleutelbos? " - -#: g10/delkey.c:147 -#, fuzzy -msgid "This is a secret key! - really delete? (y/N) " -msgstr "Dit is een geheime sleutel! - echt verwijderen? " - -#: g10/delkey.c:157 -#, c-format -msgid "deleting keyblock failed: %s\n" -msgstr "verwijderen sleutelblok mislukt: %s\n" - -#: g10/delkey.c:167 -msgid "ownertrust information cleared\n" -msgstr "eigenaarsvertrouwen informatie gewist\n" - -#: g10/delkey.c:195 -#, c-format -msgid "there is a secret key for public key \"%s\"!\n" -msgstr "er is een geheime sleutel voor openbare sleutel \"%s\"!\n" - -#: g10/delkey.c:197 -msgid "use option \"--delete-secret-keys\" to delete it first.\n" -msgstr "" -"gebruik de optie \"--delete-secret-keys\" om deze eerst te verwijderen.\n" - -#: g10/encode.c:210 g10/sign.c:1186 -#, c-format -msgid "error creating passphrase: %s\n" -msgstr "fout bij maken wachtwoord: %s\n" - -#: g10/encode.c:215 -msgid "can't use a symmetric ESK packet due to the S2K mode\n" -msgstr "kan geen symmetrisch ESK-pakket gebruiken vanwege de S2K-modus\n" - -#: g10/encode.c:228 -#, fuzzy, c-format -msgid "using cipher %s\n" -msgstr "ondertekenen mislukt: %s\n" - -#: g10/encode.c:238 g10/encode.c:558 -#, c-format -msgid "`%s' already compressed\n" -msgstr "`%s' is al ingepakt\n" - -#: g10/encode.c:308 g10/encode.c:604 g10/sign.c:550 -#, c-format -msgid "WARNING: `%s' is an empty file\n" -msgstr "WAARSCHUWING: `%s' is een leeg bestand\n" - -#: g10/encode.c:472 -msgid "you can only encrypt to RSA keys of 2048 bits or less in --pgp2 mode\n" -msgstr "" -"u kunt slechts coderen naar RSA-sleutels van 2048 bits of minder in --pgp2 " -"modus\n" - -#: g10/encode.c:494 -#, c-format -msgid "reading from `%s'\n" -msgstr "bezig met lezen uit `%s'\n" - -#: g10/encode.c:530 -msgid "" -"unable to use the IDEA cipher for all of the keys you are encrypting to.\n" -msgstr "" -"kan de IDEA-codering niet gebruiken voor alle sleutels waarnaar u codeert.\n" - -#: g10/encode.c:540 -#, fuzzy, c-format -msgid "" -"WARNING: forcing symmetric cipher %s (%d) violates recipient preferences\n" -msgstr "" -"het afdwingen van symmetrische codering %s (%d) gaat tegen de voorkeuren van " -"de ontvanger in\n" - -#: g10/encode.c:648 g10/sign.c:877 -#, fuzzy, c-format -msgid "" -"WARNING: forcing compression algorithm %s (%d) violates recipient " -"preferences\n" -msgstr "" -"het afdwingen van inpakalgoritme %s (%d) gaat tegen de voorkeuren van de " -"ontvanger in\n" - -#: g10/encode.c:735 -#, c-format -msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n" -msgstr "" -"het afdwingen van symmetrische codering %s (%d) gaat tegen de voorkeuren van " -"de ontvanger in\n" - -#: g10/encode.c:805 g10/pkclist.c:721 g10/pkclist.c:757 -#, c-format -msgid "you may not use %s while in %s mode\n" -msgstr "u kunt %s niet gebruiken in %s modus\n" - -#: g10/encode.c:832 -#, c-format -msgid "%s/%s encrypted for: \"%s\"\n" -msgstr "%s/%s gecodeerd voor: \"%s\"\n" - -#: g10/encr-data.c:66 g10/mainproc.c:301 -#, c-format -msgid "%s encrypted data\n" -msgstr "%s gecodeerde gegevens\n" - -#: g10/encr-data.c:68 g10/mainproc.c:305 -#, c-format -msgid "encrypted with unknown algorithm %d\n" -msgstr "gecodeerd met onbekend algoritme %d\n" - -#: g10/encr-data.c:92 -msgid "" -"WARNING: message was encrypted with a weak key in the symmetric cipher.\n" -msgstr "" -"WAARSCHUWING: bericht was gecodeerd met een zwakke sleutel in de " -"symmetrische codering.\n" - -#: g10/encr-data.c:103 -msgid "problem handling encrypted packet\n" -msgstr "probleem bij verwerken gecodeerd pakket\n" - -#: g10/exec.c:48 -msgid "no remote program execution supported\n" -msgstr "uitvoeren van andere programma's niet ondersteund\n" - -#: g10/exec.c:184 g10/openfile.c:406 -#, c-format -msgid "can't create directory `%s': %s\n" -msgstr "kan map `%s' niet aanmaken: %s\n" - -#: g10/exec.c:325 -msgid "" -"external program calls are disabled due to unsafe options file permissions\n" -msgstr "" -"aanroepen van externe programma's zijn uit gezet vanwege onveilige opties-" -"bestandstoegangsrechten\n" - -#: g10/exec.c:355 -#, fuzzy -msgid "this platform requires temporary files when calling external programs\n" -msgstr "" -"dit platform vereist het maken van tijdelijke bestanden bij het aanroepen " -"van externe programma's\n" - -#: g10/exec.c:433 -#, fuzzy, c-format -msgid "unable to execute program `%s': %s\n" -msgstr "kan %s \"%s\" niet uitvoeren: %s\n" - -#: g10/exec.c:436 -#, fuzzy, c-format -msgid "unable to execute shell `%s': %s\n" -msgstr "kan %s \"%s\" niet uitvoeren: %s\n" - -#: g10/exec.c:521 -#, c-format -msgid "system error while calling external program: %s\n" -msgstr "systeemfout bij aanroepen van extern programma: %s\n" - -#: g10/exec.c:532 g10/exec.c:598 -msgid "unnatural exit of external program\n" -msgstr "ongewone afsluiting van extern programma\n" - -#: g10/exec.c:547 -msgid "unable to execute external program\n" -msgstr "kan extern programma niet uitvoeren\n" - -#: g10/exec.c:563 -#, c-format -msgid "unable to read external program response: %s\n" -msgstr "kan antwoord van extern programma niet lezen: %s\n" - -#: g10/exec.c:609 g10/exec.c:616 -#, c-format -msgid "WARNING: unable to remove tempfile (%s) `%s': %s\n" -msgstr "WAARSCHUWING: kan tijdelijke bestand (%s) `%s' niet verwijderen: %s\n" - -#: g10/exec.c:621 -#, c-format -msgid "WARNING: unable to remove temp directory `%s': %s\n" -msgstr "WAARSCHUWING: kan tijdelijke map `%s' niet verwijderen: %s\n" - -#: g10/export.c:176 -#, fuzzy -msgid "exporting secret keys not allowed\n" -msgstr "bezig met schrijven geheime sleutel naar `%s'\n" - -#: g10/export.c:206 -#, fuzzy, c-format -msgid "key %s: not protected - skipped\n" -msgstr "sleutel %08lX: niet beschermd - overgeslagen\n" - -#: g10/export.c:214 -#, fuzzy, c-format -msgid "key %s: PGP 2.x style key - skipped\n" -msgstr "sleutel %08lX: PGP 2.x stijl sleutel - overgeslagen\n" - -#: g10/export.c:361 -#, fuzzy, c-format -msgid "WARNING: secret key %s does not have a simple SK checksum\n" -msgstr "" -"WAARSCHUWING: geheime sleutel %08lX heeft geen eenvoudige SK controlesom\n" - -#: g10/export.c:393 -msgid "WARNING: nothing exported\n" -msgstr "WAARSCHUWING: niets uitgevoerd\n" - -#: g10/g10.c:358 -msgid "" -"@Commands:\n" -" " -msgstr "" -"@Opdrachten:\n" -" " - -#: g10/g10.c:360 -msgid "|[file]|make a signature" -msgstr "|[bestand]|een ondertekening maken" - -#: g10/g10.c:361 -msgid "|[file]|make a clear text signature" -msgstr "|[bestand]|een niet-gecodeerde ondertekening maken" - -#: g10/g10.c:362 -msgid "make a detached signature" -msgstr "een losse ondertekening maken" - -#: g10/g10.c:363 -msgid "encrypt data" -msgstr "gegevens coderen" - -#: g10/g10.c:365 -msgid "encryption only with symmetric cipher" -msgstr "slechts met symmetrische codering coderen" - -#: g10/g10.c:367 -msgid "decrypt data (default)" -msgstr "gegevens decoderen (standaard)" - -#: g10/g10.c:369 -msgid "verify a signature" -msgstr "een ondertekening controleren" - -#: g10/g10.c:371 -msgid "list keys" -msgstr "sleutels opsommen" - -#: g10/g10.c:373 -msgid "list keys and signatures" -msgstr "sleutels en ondertekeningen opsommen" - -#: g10/g10.c:374 -#, fuzzy -msgid "list and check key signatures" -msgstr "sleutelondertekeningen controleren" - -#: g10/g10.c:375 -msgid "list keys and fingerprints" -msgstr "sleutels en vingerafdrukken opsommen" - -#: g10/g10.c:376 -msgid "list secret keys" -msgstr "geheime sleutels opsommen" - -#: g10/g10.c:377 -msgid "generate a new key pair" -msgstr "een nieuw sleutelpaar genereren" - -#: g10/g10.c:378 -msgid "remove keys from the public keyring" -msgstr "sleutels uit de openbare sleutelbos verwijderen" - -#: g10/g10.c:380 -msgid "remove keys from the secret keyring" -msgstr "sleutels uit de geheime sleutelbos verwijderen" - -#: g10/g10.c:381 -msgid "sign a key" -msgstr "een sleutel ondertekenen" - -#: g10/g10.c:382 -msgid "sign a key locally" -msgstr "een sleutel lokaal ondertekenen" - -#: g10/g10.c:385 -msgid "sign or edit a key" -msgstr "een sleutel ondertekenen of bewerken" - -#: g10/g10.c:386 -msgid "generate a revocation certificate" -msgstr "een herroepingscertificaat genereren" - -#: g10/g10.c:388 -msgid "export keys" -msgstr "sleutels uitvoeren" - -#: g10/g10.c:389 -msgid "export keys to a key server" -msgstr "sleutels uitvoeren naar een sleutelserver" - -#: g10/g10.c:390 -msgid "import keys from a key server" -msgstr "sleutels invoeren van een sleutelserver" - -#: g10/g10.c:392 -msgid "search for keys on a key server" -msgstr "zoeken naar sleutels op een sleutelserver" - -#: g10/g10.c:394 -msgid "update all keys from a keyserver" -msgstr "alle sleutels bijwerken vanaf een sleutelserver" - -#: g10/g10.c:397 -msgid "import/merge keys" -msgstr "sleutels invoeren/samenvoegen" - -#: g10/g10.c:400 -msgid "print the card status" -msgstr "" - -#: g10/g10.c:401 -msgid "change data on a card" -msgstr "" - -#: g10/g10.c:402 -msgid "change a card's PIN" -msgstr "" - -#: g10/g10.c:410 -msgid "update the trust database" -msgstr "de vertrouwensgegevensbank bijwerken" - -#: g10/g10.c:417 -msgid "|algo [files]|print message digests" -msgstr "|algoritme [bestanden]|berichtdigest weergeven" - -#: g10/g10.c:421 g10/gpgv.c:65 -msgid "" -"@\n" -"Options:\n" -" " -msgstr "" -"@\n" -"Opties:\n" -" " - -#: g10/g10.c:423 -msgid "create ascii armored output" -msgstr "ASCII-bepantserde uitvoer maken" - -#: g10/g10.c:425 -msgid "|NAME|encrypt for NAME" -msgstr "|NAAM|coderen voor NAAM" - -#: g10/g10.c:436 -msgid "use this user-id to sign or decrypt" -msgstr "deze gebruikerscode gebruiken om te ondertekenen of decoderen" - -#: g10/g10.c:437 -msgid "|N|set compress level N (0 disables)" -msgstr "|N|inpakniveau N instellen (0 zet dit uit)" - -#: g10/g10.c:442 -msgid "use canonical text mode" -msgstr "kanonieke tekstmodus gebruiken" - -#: g10/g10.c:452 -msgid "use as output file" -msgstr "gebruiken als uitvoerbestand" - -#: g10/g10.c:454 g10/gpgv.c:67 -msgid "verbose" -msgstr "breedsprakig" - -#: g10/g10.c:465 -msgid "do not make any changes" -msgstr "geen wijzigingen maken" - -#: g10/g10.c:466 -msgid "prompt before overwriting" -msgstr "vragen alvorens te overschrijven" - -#: g10/g10.c:511 -msgid "use strict OpenPGP behavior" -msgstr "" - -#: g10/g10.c:512 -msgid "generate PGP 2.x compatible messages" -msgstr "" - -#: g10/g10.c:537 -msgid "" -"@\n" -"(See the man page for a complete listing of all commands and options)\n" -msgstr "" -"@\n" -"(Zie de man-handleiding voor een volledige lijst met alle opdrachten en " -"opties)\n" - -#: g10/g10.c:540 -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" -"Voorbeelden:\n" -"\n" -" -se -r Bob [bestand] ondertekenen en coderen voor gebruiker Bob\n" -" --clearsign [bestand] een niet-gecodeerde ondertekening maken\n" -" --detach-sign [bestand] een losse ondertekening maken\n" -" --list-keys [namen] sleutels weergeven\n" -" --fingerprint [namen] vingerafdrukken weergeven\n" - -#: g10/g10.c:726 g10/gpgv.c:92 -msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n" -msgstr "" -"Rapporteer softwarefouten alstublieft aan <gnupg-bugs@gnu.org>.\n" -"Rapporteer fouten in de vertaling alstublieft aan <vertaling@nl.linux.org>.\n" - -#: g10/g10.c:743 -msgid "Usage: gpg [options] [files] (-h for help)" -msgstr "Gebruik: gpg [opties] [bestanden] (-h voor hulp)" - -#: g10/g10.c:746 -msgid "" -"Syntax: gpg [options] [files]\n" -"sign, check, encrypt or decrypt\n" -"default operation depends on the input data\n" -msgstr "" -"Syntaxis: gpg [opties] [bestanden]\n" -"ondertekenen, controleren, coderen of decoderen\n" -"standaardbewerking hangt af van invoergegevens\n" - -#: g10/g10.c:757 -msgid "" -"\n" -"Supported algorithms:\n" -msgstr "" -"\n" -"Ondersteunde algoritmes:\n" - -#: g10/g10.c:760 -msgid "Pubkey: " -msgstr "Openbare sleutel: " - -#: g10/g10.c:766 g10/keyedit.c:1901 -msgid "Cipher: " -msgstr "Codering: " - -#: g10/g10.c:772 -msgid "Hash: " -msgstr "Hash: " - -#: g10/g10.c:778 g10/keyedit.c:1947 -msgid "Compression: " -msgstr "Compressie: " - -#: g10/g10.c:861 -msgid "usage: gpg [options] " -msgstr "gebruik: gpg [opties] " - -#: g10/g10.c:964 -msgid "conflicting commands\n" -msgstr "conflicterende opdrachten\n" - -#: g10/g10.c:982 -#, fuzzy, c-format -msgid "no = sign found in group definition `%s'\n" -msgstr "geen =-teken gevonden in groepdefinitie \"%s\"\n" - -#: g10/g10.c:1179 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on homedir `%s'\n" -msgstr "WAARSCHUWING: onveilig eigendom op %s \"%s\"\n" - -#: g10/g10.c:1182 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on configuration file `%s'\n" -msgstr "WAARSCHUWING: onveilig eigendom op %s \"%s\"\n" - -#: g10/g10.c:1185 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on extension `%s'\n" -msgstr "WAARSCHUWING: onveilig eigendom op %s \"%s\"\n" - -#: g10/g10.c:1191 -#, fuzzy, c-format -msgid "WARNING: unsafe permissions on homedir `%s'\n" -msgstr "WAARSCHUWING: onveilige toegangsrechten op %s \"%s\"\n" - -#: g10/g10.c:1194 -#, fuzzy, c-format -msgid "WARNING: unsafe permissions on configuration file `%s'\n" -msgstr "WAARSCHUWING: onveilige toegangsrechten op %s \"%s\"\n" - -#: g10/g10.c:1197 -#, fuzzy, c-format -msgid "WARNING: unsafe permissions on extension `%s'\n" -msgstr "WAARSCHUWING: onveilige toegangsrechten op %s \"%s\"\n" - -#: g10/g10.c:1203 -#, fuzzy, c-format -msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n" -msgstr "WAARSCHUWING: onveilig omsluitend mapeigendom op %s \"%s\"\n" - -#: g10/g10.c:1206 -#, fuzzy, c-format -msgid "" -"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n" -msgstr "WAARSCHUWING: onveilig omsluitend mapeigendom op %s \"%s\"\n" - -#: g10/g10.c:1209 -#, fuzzy, c-format -msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n" -msgstr "WAARSCHUWING: onveilig omsluitend mapeigendom op %s \"%s\"\n" - -#: g10/g10.c:1215 -#, fuzzy, c-format -msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n" -msgstr "WAARSCHUWING: onveilige omsluitende maptoegangsrechten op %s \"%s\"\n" - -#: g10/g10.c:1218 -#, fuzzy, c-format -msgid "" -"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n" -msgstr "WAARSCHUWING: onveilige omsluitende maptoegangsrechten op %s \"%s\"\n" - -#: g10/g10.c:1221 -#, fuzzy, c-format -msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n" -msgstr "WAARSCHUWING: onveilige omsluitende maptoegangsrechten op %s \"%s\"\n" - -#: g10/g10.c:1362 -#, fuzzy, c-format -msgid "unknown configuration item `%s'\n" -msgstr "nieuw configuratiebestand `%s' aangemaakt\n" - -#: g10/g10.c:1762 -#, c-format -msgid "NOTE: old default options file `%s' ignored\n" -msgstr "LET OP: oude bestand voor standaard opties `%s' genegeerd\n" - -#: g10/g10.c:1804 -#, c-format -msgid "NOTE: no default option file `%s'\n" -msgstr "LET OP: geen bestand voor standaard opties `%s'\n" - -#: g10/g10.c:1808 -#, c-format -msgid "option file `%s': %s\n" -msgstr "optiebestand `%s': %s\n" - -#: g10/g10.c:1815 -#, c-format -msgid "reading options from `%s'\n" -msgstr "bezig met lezen opties uit `%s'\n" - -#: g10/g10.c:2035 g10/g10.c:2551 g10/g10.c:2562 -#, c-format -msgid "NOTE: %s is not for normal use!\n" -msgstr "LET OP: %s is niet voor normaal gebruik!\n" - -#: g10/g10.c:2048 -#, fuzzy, c-format -msgid "cipher extension `%s' not loaded due to unsafe permissions\n" -msgstr "" -"coderingsuitbreiding \"%s\" niet geladen vanwege onveilige toegangsrechten\n" - -#: g10/g10.c:2260 -#, fuzzy, c-format -msgid "`%s' is not a valid character set\n" -msgstr "%s is geen geldige tekenset\n" - -#: g10/g10.c:2279 g10/keyedit.c:3443 -#, fuzzy -msgid "could not parse keyserver URL\n" -msgstr "kon sleutelserver URI niet inlezen\n" - -#: g10/g10.c:2285 -#, fuzzy, c-format -msgid "%s:%d: invalid keyserver options\n" -msgstr "%s:%d: ongeldige uitvoeropties\n" - -#: g10/g10.c:2288 -#, fuzzy -msgid "invalid keyserver options\n" -msgstr "ongeldige uitvoeropties\n" - -#: g10/g10.c:2295 -#, c-format -msgid "%s:%d: invalid import options\n" -msgstr "%s:%d: ongeldige invoeropties\n" - -#: g10/g10.c:2298 -msgid "invalid import options\n" -msgstr "ongeldige invoeropties\n" - -#: g10/g10.c:2305 -#, c-format -msgid "%s:%d: invalid export options\n" -msgstr "%s:%d: ongeldige uitvoeropties\n" - -#: g10/g10.c:2308 -msgid "invalid export options\n" -msgstr "ongeldige uitvoeropties\n" - -#: g10/g10.c:2315 -#, fuzzy, c-format -msgid "%s:%d: invalid list options\n" -msgstr "%s:%d: ongeldige invoeropties\n" - -#: g10/g10.c:2318 -#, fuzzy -msgid "invalid list options\n" -msgstr "ongeldige invoeropties\n" - -#: g10/g10.c:2340 -#, fuzzy, c-format -msgid "%s:%d: invalid verify options\n" -msgstr "%s:%d: ongeldige uitvoeropties\n" - -#: g10/g10.c:2343 -#, fuzzy -msgid "invalid verify options\n" -msgstr "ongeldige uitvoeropties\n" - -#: g10/g10.c:2350 -#, c-format -msgid "unable to set exec-path to %s\n" -msgstr "kan exec-path niet instellen op %s\n" - -#: g10/g10.c:2540 -msgid "WARNING: program may create a core file!\n" -msgstr "WAARSCHUWING: programma maakt mogelijk een core-bestand aan!\n" - -#: g10/g10.c:2544 -#, c-format -msgid "WARNING: %s overrides %s\n" -msgstr "WAARSCHUWING: %s gaat boven %s\n" - -#: g10/g10.c:2553 -#, c-format -msgid "%s not allowed with %s!\n" -msgstr "%s niet toegestaan met %s!\n" - -#: g10/g10.c:2556 -#, c-format -msgid "%s makes no sense with %s!\n" -msgstr "%s slaat nergens op met %s!\n" - -#: g10/g10.c:2577 -msgid "you can only make detached or clear signatures while in --pgp2 mode\n" -msgstr "" -"u kunt alleen losse of ongecodeerde ondertekeningen maken in --pgp2 modus\n" - -#: g10/g10.c:2583 -msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n" -msgstr "u kunt niet tegelijkertijd ondertekenen en coderen in --pgp2 modus\n" - -#: g10/g10.c:2589 -msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n" -msgstr "u dient bestanden te gebruiken (en niet een pijp) in --pgp2 modus.\n" - -#: g10/g10.c:2602 -msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n" -msgstr "het coderen van een bericht in --pgp2 modus vereist de IDEA-codering\n" - -#: g10/g10.c:2672 g10/g10.c:2696 -msgid "selected cipher algorithm is invalid\n" -msgstr "het gekozen coderingsalgoritme is ongeldig\n" - -#: g10/g10.c:2678 g10/g10.c:2702 -msgid "selected digest algorithm is invalid\n" -msgstr "het gekozen digest-algoritme is ongeldig\n" - -#: g10/g10.c:2684 -#, fuzzy -msgid "selected compression algorithm is invalid\n" -msgstr "het gekozen coderingsalgoritme is ongeldig\n" - -#: g10/g10.c:2690 -msgid "selected certification digest algorithm is invalid\n" -msgstr "het gekozen certificaat-digest-algoritme is ongeldig\n" - -#: g10/g10.c:2705 -msgid "completes-needed must be greater than 0\n" -msgstr "completes-needed moet groter zijn dan 0\n" - -#: g10/g10.c:2707 -msgid "marginals-needed must be greater than 1\n" -msgstr "marginals-needed moet groter zijn dan 1\n" - -#: g10/g10.c:2709 -#, fuzzy -msgid "max-cert-depth must be in the range from 1 to 255\n" -msgstr "max-cert-depth moet binnen het bereik 1 tot 255 vallen\n" - -#: g10/g10.c:2711 -#, fuzzy -msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n" -msgstr "ongeldig standaard controleniveau; moet 0, 1, 2 of 3 zijn\n" - -#: g10/g10.c:2713 -#, fuzzy -msgid "invalid min-cert-level; must be 1, 2, or 3\n" -msgstr "ongeldig standaard controleniveau; moet 0, 1, 2 of 3 zijn\n" - -#: g10/g10.c:2716 -msgid "NOTE: simple S2K mode (0) is strongly discouraged\n" -msgstr "LET OP: eenvoudige S2K-modus (0) wordt sterk ontraden\n" - -#: g10/g10.c:2720 -msgid "invalid S2K mode; must be 0, 1 or 3\n" -msgstr "ongeldige S2K-modus; moet 0, 1 of 3 zijn\n" - -#: g10/g10.c:2727 -msgid "invalid default preferences\n" -msgstr "ongeldige standaardvoorkeuren\n" - -#: g10/g10.c:2736 -msgid "invalid personal cipher preferences\n" -msgstr "ongeldige persoonlijke coderingsvoorkeuren\n" - -#: g10/g10.c:2740 -msgid "invalid personal digest preferences\n" -msgstr "ongeldige persoonlijke digestvoorkeuren\n" - -#: g10/g10.c:2744 -msgid "invalid personal compress preferences\n" -msgstr "ongeldige persoonlijke inpakvoorkeuren\n" - -#: g10/g10.c:2777 -#, fuzzy, c-format -msgid "%s does not yet work with %s\n" -msgstr "%s slaat nergens op met %s!\n" - -#: g10/g10.c:2824 -#, fuzzy, c-format -msgid "you may not use cipher algorithm `%s' while in %s mode\n" -msgstr "u kunt %s niet gebruiken in %s modus\n" - -#: g10/g10.c:2829 -#, fuzzy, c-format -msgid "you may not use digest algorithm `%s' while in %s mode\n" -msgstr "u kunt %s niet gebruiken in %s modus\n" - -#: g10/g10.c:2834 -#, fuzzy, c-format -msgid "you may not use compression algorithm `%s' while in %s mode\n" -msgstr "u kunt %s niet gebruiken in %s modus\n" - -#: g10/g10.c:2930 -#, c-format -msgid "failed to initialize the TrustDB: %s\n" -msgstr "initialiseren van vertrouwensgegevensbank mislukt: %s\n" - -#: g10/g10.c:2941 -msgid "WARNING: recipients (-r) given without using public key encryption\n" -msgstr "" -"WAARSCHUWING: ontvangers (-r) gegeven zonder gebruik te maken van openbare " -"sleutel codering\n" - -#: g10/g10.c:2952 -msgid "--store [filename]" -msgstr "--store [bestandsnaam]" - -#: g10/g10.c:2959 -msgid "--symmetric [filename]" -msgstr "--symmetric [bestandsnaam]" - -#: g10/g10.c:2961 -#, fuzzy, c-format -msgid "symmetric encryption of `%s' failed: %s\n" -msgstr "decodering mislukt: %s\n" - -#: g10/g10.c:2971 -msgid "--encrypt [filename]" -msgstr "--encrypt [bestandsnaam]" - -#: g10/g10.c:2984 -#, fuzzy -msgid "--symmetric --encrypt [filename]" -msgstr "--sign --encrypt [bestandsnaam]" - -#: g10/g10.c:2986 -msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n" -msgstr "" - -#: g10/g10.c:2989 -#, fuzzy, c-format -msgid "you cannot use --symmetric --encrypt while in %s mode\n" -msgstr "u kunt %s niet gebruiken in %s modus\n" - -#: g10/g10.c:3007 -msgid "--sign [filename]" -msgstr "--sign [bestandsnaam]" - -#: g10/g10.c:3020 -msgid "--sign --encrypt [filename]" -msgstr "--sign --encrypt [bestandsnaam]" - -#: g10/g10.c:3035 -#, fuzzy -msgid "--symmetric --sign --encrypt [filename]" -msgstr "--sign --encrypt [bestandsnaam]" - -#: g10/g10.c:3037 -msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n" -msgstr "" - -#: g10/g10.c:3040 -#, fuzzy, c-format -msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n" -msgstr "u kunt %s niet gebruiken in %s modus\n" - -#: g10/g10.c:3060 -msgid "--sign --symmetric [filename]" -msgstr "--sign --symmetric [bestandsnaam]" - -#: g10/g10.c:3069 -msgid "--clearsign [filename]" -msgstr "--clearsign [bestandsnaam]" - -#: g10/g10.c:3094 -msgid "--decrypt [filename]" -msgstr "--decrypt [bestandsnaam]" - -#: g10/g10.c:3102 -msgid "--sign-key user-id" -msgstr "--sign-key gebruikerscode" - -#: g10/g10.c:3106 -msgid "--lsign-key user-id" -msgstr "--lsign-key gebruikerscode" - -#: g10/g10.c:3110 -msgid "--nrsign-key user-id" -msgstr "--nrsign-key gebruikerscode" - -#: g10/g10.c:3114 -msgid "--nrlsign-key user-id" -msgstr "--nrlsign-key gebruikerscode" - -#: g10/g10.c:3138 -msgid "--edit-key user-id [commands]" -msgstr "--edit-key gebruikerscode [opdrachten]" - -#: g10/g10.c:3209 -msgid "-k[v][v][v][c] [user-id] [keyring]" -msgstr "-k[v][v][v][c] [gebruikerscode] [sleutelbos]" - -#: g10/g10.c:3246 -#, fuzzy, c-format -msgid "keyserver send failed: %s\n" -msgstr "Sleutelaanmaak mislukt: %s\n" - -#: g10/g10.c:3248 -#, fuzzy, c-format -msgid "keyserver receive failed: %s\n" -msgstr "Sleutelaanmaak mislukt: %s\n" - -#: g10/g10.c:3250 -#, fuzzy, c-format -msgid "key export failed: %s\n" -msgstr "Sleutelaanmaak mislukt: %s\n" - -#: g10/g10.c:3261 -#, fuzzy, c-format -msgid "keyserver search failed: %s\n" -msgstr "Sleutelaanmaak mislukt: %s\n" - -#: g10/g10.c:3271 -#, fuzzy, c-format -msgid "keyserver refresh failed: %s\n" -msgstr "bijwerken geheim mislukt: %s\n" - -#: g10/g10.c:3312 -#, c-format -msgid "dearmoring failed: %s\n" -msgstr "ontpantseren mislukt: %s\n" - -#: g10/g10.c:3320 -#, c-format -msgid "enarmoring failed: %s\n" -msgstr "bepantseren mislukt: %s\n" - -#: g10/g10.c:3407 -#, c-format -msgid "invalid hash algorithm `%s'\n" -msgstr "ongeldig hash-algoritme `%s'\n" - -#: g10/g10.c:3530 -msgid "[filename]" -msgstr "[bestandsnaam]" - -#: g10/g10.c:3534 -msgid "Go ahead and type your message ...\n" -msgstr "Ga uw gang en typ uw bericht...\n" - -#: g10/g10.c:3824 -msgid "" -"a notation name must have only printable characters or spaces, and end with " -"an '='\n" -msgstr "" -"een notatienaam mag slechts afdrukbare tekens of spaties bevatten, en moet " -"eindigen met een '='\n" - -#: g10/g10.c:3832 -msgid "a user notation name must contain the '@' character\n" -msgstr "een gebruikersnotatienaam moet het '@'-teken bevatten\n" - -#: g10/g10.c:3842 -msgid "a notation value must not use any control characters\n" -msgstr "een notatiewaarde mag geen stuurtekens bevatten\n" - -#: g10/g10.c:3876 -msgid "the given certification policy URL is invalid\n" -msgstr "de gegeven certificatiebeleid URL is ongeldig\n" - -#: g10/g10.c:3878 -msgid "the given signature policy URL is invalid\n" -msgstr "de gegeven ondertekeningbeleid URL is ongeldig\n" - -#: g10/g10.c:3911 -#, fuzzy -msgid "the given preferred keyserver URL is invalid\n" -msgstr "de gegeven ondertekeningbeleid URL is ongeldig\n" - -#: g10/getkey.c:150 -msgid "too many entries in pk cache - disabled\n" -msgstr "teveel ingangen in pk buffer - uit gezet\n" - -#: g10/getkey.c:186 g10/getkey.c:2691 -#, fuzzy -msgid "[User ID not found]" -msgstr "[Gebruikerscode niet gevonden]" - -#: g10/getkey.c:1614 -#, fuzzy, c-format -msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n" -msgstr "" -"Ongeldige sleutel %08lX geldig gemaakt met --allow-non-selfsigned-uid\n" - -#: g10/getkey.c:2169 -#, fuzzy, c-format -msgid "no secret subkey for public subkey %s - ignoring\n" -msgstr "geen geheime deelsleutel voor openbare deelsleutel %08lX - genegeerd\n" - -#: g10/getkey.c:2400 -#, fuzzy, c-format -msgid "using secondary key %s instead of primary key %s\n" -msgstr "" -"de secundaire sleutel %08lX wordt gebruikt in plaats van primaire sleutel %" -"08lX\n" - -#: g10/getkey.c:2447 -#, fuzzy, c-format -msgid "key %s: secret key without public key - skipped\n" -msgstr "" -"sleutel %08lX: geheime sleutel zonder openbare sleutel - overgeslagen\n" - -#: g10/gpgv.c:68 -msgid "be somewhat more quiet" -msgstr "iets stiller zijn" - -#: g10/gpgv.c:69 -msgid "take the keys from this keyring" -msgstr "de sleutels uit deze sleutelbos nemen" - -#: g10/gpgv.c:71 -msgid "make timestamp conflicts only a warning" -msgstr "geeft alleen waarschuwing bij tijdsstempel conflicten" - -#: g10/gpgv.c:72 -msgid "|FD|write status info to this FD" -msgstr "" - -#: g10/gpgv.c:96 -msgid "Usage: gpgv [options] [files] (-h for help)" -msgstr "Gebruik: gpgv [opties] [bestanden] (-h voor hulp)" - -#: g10/gpgv.c:99 -msgid "" -"Syntax: gpg [options] [files]\n" -"Check signatures against known trusted keys\n" -msgstr "" -"Syntaxis: gpg [opties] [bestanden]\n" -"Ondertekeningen controleren met bekende, vertrouwde sleutels\n" - -#: g10/helptext.c:48 -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 "" -"Het is aan u om hier een waarde toe te wijzen; deze waarde wordt nooit\n" -"uitgevoerd naar een derde partij. We hebben het nodig om een web\n" -"van vertrouwen te maken; het heeft niets te maken met het (impliciet\n" -"gemaakte) web van certificaten." - -#: g10/helptext.c:54 -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 "" -"Om een Web van Vertrouwen te bouwen, moet GnuPG weten welke\n" -"sleutels maximaal vertrouwd moeten worden - dit zijn meestal de\n" -"sleutels waarvan u toegang heeft tot de geheime sleutel. Antwoord\n" -"\"ja\" om deze sleutel in te stellen als maximaal vertrouwd\n" - -#: g10/helptext.c:61 -msgid "If you want to use this untrusted key anyway, answer \"yes\"." -msgstr "" -"Antwoord \"ja\" als u toch deze niet-vertrouwde sleutel wilt gebruiken." - -#: g10/helptext.c:65 -msgid "" -"Enter the user ID of the addressee to whom you want to send the message." -msgstr "" -"Geef de gebruikerscode van de geadresseerde aan wie u het bericht wilt " -"sturen." - -#: g10/helptext.c:69 -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:83 -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 het algemeen is het geen goed idee om dezelfde sleutel te gebruiken\n" -"voor ondertekenen en coderen. Dit algoritme moet alleen in bepaalde\n" -"domeinen worden gebruikt.\n" -"Neem alstublieft eerst contact op met uw veiligheidsexpert." - -#: g10/helptext.c:90 -msgid "Enter the size of the key" -msgstr "Geef de grootte van de sleutel" - -#: g10/helptext.c:94 g10/helptext.c:99 g10/helptext.c:111 g10/helptext.c:143 -#: g10/helptext.c:171 g10/helptext.c:176 g10/helptext.c:181 -msgid "Answer \"yes\" or \"no\"" -msgstr "Beantwoord \"ja\" of \"nee\"" - -#: g10/helptext.c:104 -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 "" -"Geef de vereiste waarde zoals weergegeven in de opdrachtregel.\n" -"Het is mogelijk om een ISO-datum (JJJJ-MM-DD) in te geven, maar\n" -"u zal geen goede foutrespons krijgen - in plaats daarvan zal het\n" -"systeem de gegeven waarde proberen te interpreteren als een\n" -"interval." - -#: g10/helptext.c:116 -msgid "Enter the name of the key holder" -msgstr "Geef de naam van de sleutelhouder" - -#: g10/helptext.c:121 -msgid "please enter an optional but highly suggested email address" -msgstr "" -"geef alstublieft een niet-verplichte maar sterk aangeraden e-mail adres" - -#: g10/helptext.c:125 -msgid "Please enter an optional comment" -msgstr "Geef alstublieft een niet-verplichte opmerking" - -#: g10/helptext.c:130 -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 om de naam te wijzigen.\n" -"C om de opmerking te wijzigen.\n" -"E om het e-mail adres te wijzigen.\n" -"O om door te gaan met de aanmaak van de sleutel.\n" -"Q om te stoppen met de aanmaak van de sleutel." - -#: g10/helptext.c:139 -msgid "Answer \"yes\" (or just \"y\") if it is okay to generate the sub key." -msgstr "" -"Beantwoord \"ja\" (of \"j\") als het goed is om een deelsleutel aan te maken." - -#: g10/helptext.c:147 -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 "" -"Als u een gebruikerscode op een sleutel ondertekend, is het eerst nodig\n" -"dat u controleert dat de sleutel is van de persoon die genoemd wordt in\n" -"de gebruikerscode. Het is nuttig voor anderen om precies te weten hoe\n" -"nauwkeurig u dit gedaan heeft.\n" -"\n" -"\"0\" betekent dat u niets beweert over u precies u de sleutel geverifieerd\n" -"....heeft.\n" -"\n" -"\"1\" betekent dat u gelooft dat de sleutel is van de persoon die beweert " -"de\n" -" eigenaar te zijn, maar dat u de sleutel helemaal niet geverifieerd " -"heeft\n" -" Dit is nuttig voor een \"persona\" verificatie, waar u de sleutel van " -"een\n" -" pseudonieme gebruiker ondertekent.\n" -"\n" -"\"2\" betekent dat u de sleutel een beetje geverifieerd heeft. " -"Bijvoorbeeld\n" -" door de vingerafdruk van de sleutel te controleren en de gebruikerscode\n" -" t.o.v. een foto ID te vergelijken.\n" -"\n" -"\"3\" betekent dat u een uitgebreide verificatie van de sleutel heeft " -"gedaan.\n" -" Bijvoorbeeld door de vingerafdruk van de sleutel in persoon te " -"verifiëren\n" -" met de eigenaar van de sleutel, door de naam van de sleutel eigenaar\n" -" vast te stellen aan de hand van een betrouwbaar document met foto\n" -" (zoals een paspoort), en door met het versturen van e-mail te " -"controleren\n" -" dat het e-mail adres van de sleutel eigenaar is.\n" -"\n" -"Let op dat de voorbeelden bij niveau 2 en 3 *alleen* voorbeelden zijn.\n" -"Het is uiteindelijk aan u om te besluiten wat \"een beetje\" en \"uitgebreid" -"\"\n" -"voor u betekent bij het ondertekenen van sleutels.\n" -"\n" -"Als u niet weet wat te antwoorden, kunt u \"0\" antwoorden." - -#: g10/helptext.c:185 -#, fuzzy -msgid "Answer \"yes\" if you want to sign ALL the user IDs" -msgstr "Antwoord \"ja\" als u ALLE gebruikerscodes wilt ondertekenen" - -#: g10/helptext.c:189 -msgid "" -"Answer \"yes\" if you really want to delete this user ID.\n" -"All certificates are then also lost!" -msgstr "" -"Antwoord \"ja\" als u echt deze gebruikerscode wilt verwijderen.\n" -"Alle certificaten zullen ook verloren gaan!" - -#: g10/helptext.c:194 -msgid "Answer \"yes\" if it is okay to delete the subkey" -msgstr "Antwoord \"ja\" als het goed is om de deelsleutel te verwijderen" - -#: g10/helptext.c:199 -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 "" -"Dit is een geldige ondertekening op de sleutel; normaal\n" -"gesproken wilt u deze ondertekening niet verwijderen omdat\n" -"deze belangrijk kan zijn in het tot stand brengen van een\n" -"vertrouwensverbinding met de sleutel of een andere sleutel\n" -"die gecertificeerd wordt met deze sleutel." - -#: g10/helptext.c:204 -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 "" -"De ondertekening kan niet worden gecontroleerd omdat u de\n" -"geassocieerde sleutel niet heeft. U kunt beter wachten met de\n" -"verwijdering totdat u weet welke sleutel gebruikt is, omdat deze\n" -"ondertekensleutel mogelijk een vetrouwensverbinding tot stand\n" -"brengt via een andere gecertificeerde sleutel." - -#: g10/helptext.c:210 -msgid "" -"The signature is not valid. It does make sense to remove it from\n" -"your keyring." -msgstr "" -"De ondertekening is niet geldig. Het is logisch deze te verwijderen\n" -"uit uw sleutelbos." - -#: g10/helptext.c:214 -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 "" -"Dit is een ondertekening die de gebruikerscode aan de sleutel bindt.\n" -"Het is meestal geen goed idee om zo'n ondertekening te verwijderen.\n" -"GnuPG kan zelfs niet meer in staat zijn om deze sleutel te gebruiken.\n" -"Doe dit dus alleen als deze zelfondertekening om de een of andere\n" -"reden niet geldig is en er een tweede beschikbaar is." - -#: g10/helptext.c:222 -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 "" -"De voorkeuren van alle gebruikerscodes (of alleen bepaalde) veranderen\n" -"naar de huidige lijst van voorkeuren. De tijdsstempel van alle betrokken\n" -"zelfondertekeningen worden verhoogt met een seconde.\n" - -#: g10/helptext.c:229 -msgid "Please enter the passhrase; this is a secret sentence \n" -msgstr "Geef alstublieft het wachtwoord; dit is een geheime zin \n" - -#: g10/helptext.c:235 -msgid "Please repeat the last passphrase, so you are sure what you typed in." -msgstr "" -"Herhaal alstublieft het laatste wachtwoord, zodat u zeker weet wat u heeft " -"ingevoerd." - -#: g10/helptext.c:239 -msgid "Give the name of the file to which the signature applies" -msgstr "" -"Geef de naam van het bestand waarvoor de ondertekening van toepassing is" - -#: g10/helptext.c:244 -msgid "Answer \"yes\" if it is okay to overwrite the file" -msgstr "Antwoord \"ja\" als het goed is om het bestand te overschrijven" - -#: g10/helptext.c:249 -msgid "" -"Please enter a new filename. If you just hit RETURN the default\n" -"file (which is shown in brackets) will be used." -msgstr "" -"Geef alstublieft een nieuwe bestandsnaam. Als u alleen op enter\n" -"drukt wordt het (weergegeven) standaardbestand gebruikt." - -#: g10/helptext.c:255 -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 "" -"Het is nodig om een reden voor de certificatie op te geven. Afhankelijk " -"van\n" -"van context kunt u uit de volgende lijst kiezen:\n" -" \"Sleutel is in gevaar gebracht\"\n" -" Gebruik dit als u een reden heeft om te geloven dat personen toegang\n" -" tot uw geheime sleutel hebben gekregen die dat niet mochten hebben.\n" -" \"Sleutel is achterhaald\"\n" -" Gebruik dit als u deze sleutel heeft vervangen door een nieuwere.\n" -" \"Sleutel wordt niet meer gebruikt\"\n" -" Gebruik dit als u deze sleutel niet meer gebruikt.\n" -" \"Gebruikerscode is niet meer geldig\"\n" -" Gebruik dit om aan te geven dat de gebruikerscode niet langer moet\n" -" worden gebruikt; meestal wordt dit gebruikt om aan te geven dat een\n" -" e-mail adres niet meer geldig is.\n" - -#: g10/helptext.c:271 -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 "" -"Als u dat wilt, kunt u een tekst invoeren die beschrijft waarom\n" -"u dit herroepingscertificaat uitgeeft. Hou de tekst a.u.b. kort.\n" -"Een lege regel eindigt de tekst.\n" - -#: g10/helptext.c:286 -msgid "No help available" -msgstr "Geen hulp beschikbaar" - -#: g10/helptext.c:294 -#, c-format -msgid "No help available for `%s'" -msgstr "Geen hulp beschikbaar voor `%s'" - -#: g10/import.c:247 -#, c-format -msgid "skipping block of type %d\n" -msgstr "blok van soort %d wordt overgeslagen\n" - -#: g10/import.c:256 -#, fuzzy, c-format -msgid "%lu keys processed so far\n" -msgstr "tot nu toe %lu sleutels verwerkt\n" - -#: g10/import.c:273 -#, c-format -msgid "Total number processed: %lu\n" -msgstr "Totale aantal verwerkt: %lu\n" - -#: g10/import.c:275 -#, c-format -msgid " skipped new keys: %lu\n" -msgstr " overgeslagen nieuwe sleutels: %lu\n" - -#: g10/import.c:278 -#, c-format -msgid " w/o user IDs: %lu\n" -msgstr " zonder gebruikerscode: %lu\n" - -#: g10/import.c:280 -#, c-format -msgid " imported: %lu" -msgstr " ingevoerd: %lu" - -#: g10/import.c:286 -#, c-format -msgid " unchanged: %lu\n" -msgstr " ongewijzigd: %lu\n" - -#: g10/import.c:288 -#, c-format -msgid " new user IDs: %lu\n" -msgstr " nieuwe gebruikerscodes: %lu\n" - -#: g10/import.c:290 -#, c-format -msgid " new subkeys: %lu\n" -msgstr " nieuwe deelsleutels: %lu\n" - -#: g10/import.c:292 -#, c-format -msgid " new signatures: %lu\n" -msgstr " nieuwe ondertekeningen: %lu\n" - -#: g10/import.c:294 -#, c-format -msgid " new key revocations: %lu\n" -msgstr " nieuwe sleutelherroepingen: %lu\n" - -#: g10/import.c:296 -#, c-format -msgid " secret keys read: %lu\n" -msgstr " gelezen geheime sleutels: %lu\n" - -#: g10/import.c:298 -#, c-format -msgid " secret keys imported: %lu\n" -msgstr " ingevoerde geheime sleutels: %lu\n" - -#: g10/import.c:300 -#, c-format -msgid " secret keys unchanged: %lu\n" -msgstr " ongewijzigde geheime sleutels: %lu\n" - -#: g10/import.c:302 -#, c-format -msgid " not imported: %lu\n" -msgstr " niet ingevoerd: %lu\n" - -#: g10/import.c:543 -#, c-format -msgid "WARNING: key %s contains preferences for unavailable\n" -msgstr "" - -#: g10/import.c:545 -#, fuzzy -msgid "algorithms on these user IDs:\n" -msgstr "U heeft deze gebruikerscodes ondertekend:\n" - -#: g10/import.c:582 -#, c-format -msgid " \"%s\": preference for cipher algorithm %s\n" -msgstr "" - -#: g10/import.c:594 -#, fuzzy, c-format -msgid " \"%s\": preference for digest algorithm %s\n" -msgstr "%s ondertekeing, digest-algoritme %s\n" - -#: g10/import.c:606 -#, c-format -msgid " \"%s\": preference for compression algorithm %s\n" -msgstr "" - -#: g10/import.c:619 -msgid "it is strongly suggested that you update your preferences and\n" -msgstr "" - -#: g10/import.c:621 -msgid "re-distribute this key to avoid potential algorithm mismatch problems\n" -msgstr "" - -#: g10/import.c:645 -#, c-format -msgid "you can update your preferences with: gpg --edit-key %s updpref save\n" -msgstr "" - -#: g10/import.c:693 g10/import.c:1047 -#, fuzzy, c-format -msgid "key %s: no user ID\n" -msgstr "sleutel %08lX: gebruikerscode niet gevonden\n" - -#: g10/import.c:713 -#, fuzzy, c-format -msgid "key %s: PKS subkey corruption repaired\n" -msgstr "sleutel %08lX: HKP-deelsleutel beschadiging gerepareerd\n" - -#: g10/import.c:728 -#, fuzzy, c-format -msgid "key %s: accepted non self-signed user ID \"%s\"\n" -msgstr "" -"sleutel %08lX: niet-zelfondertekende gebruikerscode '%s' geaccepteerd\n" - -#: g10/import.c:734 -#, fuzzy, c-format -msgid "key %s: no valid user IDs\n" -msgstr "sleutel %08lX: geen geldige gebruikerscodes\n" - -#: g10/import.c:736 -msgid "this may be caused by a missing self-signature\n" -msgstr "dit is mogelijk veroorzaakt door een ontbrekende zelfondertekening\n" - -#: g10/import.c:746 g10/import.c:1168 -#, fuzzy, c-format -msgid "key %s: public key not found: %s\n" -msgstr "sleutel %08lX: openbare sleutel niet gevonden: %s\n" - -#: g10/import.c:752 -#, fuzzy, c-format -msgid "key %s: new key - skipped\n" -msgstr "sleutel %08lX: nieuwe sleutel - overgeslagen\n" - -#: g10/import.c:761 -#, c-format -msgid "no writable keyring found: %s\n" -msgstr "geen schrijfbare sleutelbos gevonden: %s\n" - -#: g10/import.c:766 g10/openfile.c:261 g10/sign.c:784 g10/sign.c:1042 -#, c-format -msgid "writing to `%s'\n" -msgstr "bezig met schrijven naar `%s'\n" - -#: g10/import.c:772 g10/import.c:862 g10/import.c:1087 g10/import.c:1229 -#, c-format -msgid "error writing keyring `%s': %s\n" -msgstr "fout bij schrijven sleutelbos `%s': %s\n" - -#: g10/import.c:791 -#, fuzzy, c-format -msgid "key %s: public key \"%s\" imported\n" -msgstr "sleutel %08lX: openbare sleutel \"%s\" geïmporteerd\n" - -#: g10/import.c:815 -#, fuzzy, c-format -msgid "key %s: doesn't match our copy\n" -msgstr "sleutel %08lX: komt niet overeen met onze versie\n" - -#: g10/import.c:832 g10/import.c:1186 -#, fuzzy, c-format -msgid "key %s: can't locate original keyblock: %s\n" -msgstr "sleutel %08lX: kan oorspronkelijk sleutelblok niet vinden: %s\n" - -#: g10/import.c:840 g10/import.c:1193 -#, fuzzy, c-format -msgid "key %s: can't read original keyblock: %s\n" -msgstr "sleutel %08lX: kan oorspronkelijk sleutelblok niet lezen: %s\n" - -#: g10/import.c:872 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new user ID\n" -msgstr "sleutel %08lX: \"%s\" 1 nieuwe gebruikerscode\n" - -#: g10/import.c:875 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new user IDs\n" -msgstr "sleutel %08lX: \"%s\" %d nieuwe gebruikerscodes\n" - -#: g10/import.c:878 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new signature\n" -msgstr "sleutel %08lX: \"%s\" 1 nieuwe ondertekening\n" - -#: g10/import.c:881 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new signatures\n" -msgstr "sleutel %08lX: \"%s\" %d nieuwe ondertekeningen\n" - -#: g10/import.c:884 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new subkey\n" -msgstr "sleutel %08lX: \"%s\" 1 nieuwe deelsleutel\n" - -#: g10/import.c:887 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new subkeys\n" -msgstr "sleutel %08lX: \"%s\" %d nieuwe deelsleutels\n" - -#: g10/import.c:908 -#, fuzzy, c-format -msgid "key %s: \"%s\" not changed\n" -msgstr "sleutel %08lX: \"%s\" niet gewijzigd\n" - -#: g10/import.c:1053 -#, fuzzy, c-format -msgid "key %s: secret key with invalid cipher %d - skipped\n" -msgstr "" -"sleutel %08lX: geheime sleutel met ongeldige codering %d - overgeslagen\n" - -#: g10/import.c:1064 -#, fuzzy -msgid "importing secret keys not allowed\n" -msgstr "bezig met schrijven geheime sleutel naar `%s'\n" - -#: g10/import.c:1081 -#, c-format -msgid "no default secret keyring: %s\n" -msgstr "geen standaard geheime sleutelbos: %s\n" - -#: g10/import.c:1092 -#, fuzzy, c-format -msgid "key %s: secret key imported\n" -msgstr "sleutel %08lX: geheime sleutel geïmporteerd\n" - -#: g10/import.c:1121 -#, fuzzy, c-format -msgid "key %s: already in secret keyring\n" -msgstr "sleutel %08lX: al in geheime sleutelbos\n" - -#: g10/import.c:1131 -#, fuzzy, c-format -msgid "key %s: secret key not found: %s\n" -msgstr "sleutel %08lX: geheime sleutel niet gevonden: %s\n" - -#: g10/import.c:1161 -#, fuzzy, c-format -msgid "key %s: no public key - can't apply revocation certificate\n" -msgstr "" -"sleutel %08lX: geen openbare sleutel - kan herroepingscertificaat niet " -"toepassen\n" - -#: g10/import.c:1204 -#, fuzzy, c-format -msgid "key %s: invalid revocation certificate: %s - rejected\n" -msgstr "sleutel %08lX: ongeldig herroepingscertificaat: %s - verworpen\n" - -#: g10/import.c:1236 -#, fuzzy, c-format -msgid "key %s: \"%s\" revocation certificate imported\n" -msgstr "sleutel %08lX: \"%s\" herroepingscertificaat geïmporteerd\n" - -#: g10/import.c:1301 -#, fuzzy, c-format -msgid "key %s: no user ID for signature\n" -msgstr "sleutel %08lX: geen gebruikerscode voor ondertekening\n" - -#: g10/import.c:1316 -#, fuzzy, c-format -msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n" -msgstr "" -"sleutel %08lX: niet-ondersteund openbare sleutel algoritme bij " -"gebruikerscode \"%s\"\n" - -#: g10/import.c:1318 -#, fuzzy, c-format -msgid "key %s: invalid self-signature on user ID \"%s\"\n" -msgstr "sleutel %08lX: ongeldige zelfondertekening bij gebruikerscode \"%s\"\n" - -#: g10/import.c:1336 -#, fuzzy, c-format -msgid "key %s: no subkey for key binding\n" -msgstr "sleutel %08lX: geen deelsleutel voor sleutelkoppeling\n" - -#: g10/import.c:1347 g10/import.c:1397 -#, fuzzy, c-format -msgid "key %s: unsupported public key algorithm\n" -msgstr "sleutel %08lX: niet-ondersteund openbare sleutel algoritme\n" - -#: g10/import.c:1349 -#, fuzzy, c-format -msgid "key %s: invalid subkey binding\n" -msgstr "sleutel %08lX: ongeldige deelsleutelkoppeling\n" - -#: g10/import.c:1364 -#, fuzzy, c-format -msgid "key %s: removed multiple subkey binding\n" -msgstr "sleutel %08lX: meervoudige deelsleutelkoppeling verwijderd\n" - -#: g10/import.c:1386 -#, fuzzy, c-format -msgid "key %s: no subkey for key revocation\n" -msgstr "sleutel %08lX: geen deelsleutel voor sleutelherroeping\n" - -#: g10/import.c:1399 -#, fuzzy, c-format -msgid "key %s: invalid subkey revocation\n" -msgstr "sleutel %08lX: ongeldige deelsleutel herroeping\n" - -#: g10/import.c:1414 -#, fuzzy, c-format -msgid "key %s: removed multiple subkey revocation\n" -msgstr "sleutel %08lX: meervoudige deelsleutel herroeping verwijderd\n" - -#: g10/import.c:1456 -#, fuzzy, c-format -msgid "key %s: skipped user ID \"%s\"\n" -msgstr "sleutel %08lX: gebruikerscode overgeslagen '" - -#: g10/import.c:1477 -#, fuzzy, c-format -msgid "key %s: skipped subkey\n" -msgstr "sleutel %08lX: deelsleutel overgeslagen\n" - -#: g10/import.c:1504 -#, fuzzy, c-format -msgid "key %s: non exportable signature (class 0x%02X) - skipped\n" -msgstr "" -"sleutel %08lX: niet-uitvoerbare ondertekening (klasse %02x) - overgeslagen\n" - -#: g10/import.c:1514 -#, fuzzy, c-format -msgid "key %s: revocation certificate at wrong place - skipped\n" -msgstr "" -"sleutel %08lX: herroepingscertificaat op verkeerde plek - overgeslagen\n" - -#: g10/import.c:1531 -#, fuzzy, c-format -msgid "key %s: invalid revocation certificate: %s - skipped\n" -msgstr "sleutel %08lX: ongeldig herroepingscertificaat: %s - overgeslagen\n" - -#: g10/import.c:1545 -#, fuzzy, c-format -msgid "key %s: subkey signature in wrong place - skipped\n" -msgstr "" -"sleutel %08lX: deelsleutel ondertekening op verkeerde plek - overgeslagen\n" - -#: g10/import.c:1553 -#, fuzzy, c-format -msgid "key %s: unexpected signature class (0x%02X) - skipped\n" -msgstr "" -"sleutel %08lX: onverwachte ondertekeningsklasse (0x%02X) - overgeslagen\n" - -#: g10/import.c:1653 -#, fuzzy, c-format -msgid "key %s: duplicated user ID detected - merged\n" -msgstr "sleutel %08lX: dubbele gebruikerscode gevonden - samengevoegd\n" - -#: g10/import.c:1715 -#, fuzzy, c-format -msgid "WARNING: key %s may be revoked: fetching revocation key %s\n" -msgstr "" -"WAARSCHUWING: sleutel %08lX kan herroepen zijn: herroepingssleutel %08lX " -"wordt opgehaald\n" - -#: g10/import.c:1729 -#, fuzzy, c-format -msgid "WARNING: key %s may be revoked: revocation key %s not present.\n" -msgstr "" -"WAARSCHUWING: sleutel %08lX kan herroepen zijn: herroepingssleutel %08lX " -"niet aanwezig.\n" - -#: g10/import.c:1788 -#, fuzzy, c-format -msgid "key %s: \"%s\" revocation certificate added\n" -msgstr "sleutel %08lX: \"%s\" herroepingscertificaat toegevoegd\n" - -#: g10/import.c:1822 -#, fuzzy, c-format -msgid "key %s: direct key signature added\n" -msgstr "sleutel %08lX: directe sleutelondertekening toegevoegd\n" - -#: g10/keydb.c:167 -#, c-format -msgid "error creating keyring `%s': %s\n" -msgstr "fout bij aanmaken sleutelbos `%s': %s\n" - -#: g10/keydb.c:174 -#, c-format -msgid "keyring `%s' created\n" -msgstr "sleutelbos `%s' aangemaakt\n" - -#: g10/keydb.c:685 -#, c-format -msgid "failed to rebuild keyring cache: %s\n" -msgstr "opnieuw opbouwen sleutelbos buffer mislukt: %s\n" - -#: g10/keyedit.c:253 -msgid "[revocation]" -msgstr "[herroeping]" - -#: g10/keyedit.c:254 -msgid "[self-signature]" -msgstr "[zelfondertekening]" - -#: g10/keyedit.c:332 g10/keylist.c:342 -msgid "1 bad signature\n" -msgstr "1 slechte ondertekening\n" - -#: g10/keyedit.c:334 g10/keylist.c:344 -#, c-format -msgid "%d bad signatures\n" -msgstr "%d slechte ondertekeningen\n" - -#: g10/keyedit.c:336 g10/keylist.c:346 -msgid "1 signature not checked due to a missing key\n" -msgstr "1 ondertekening niet gecontroleerd vanwege een ontbrekende sleutel\n" - -#: g10/keyedit.c:338 g10/keylist.c:348 -#, c-format -msgid "%d signatures not checked due to missing keys\n" -msgstr "%d ondertekeningen niet gecontroleerd vanwege ontbrekende sleutels\n" - -#: g10/keyedit.c:340 g10/keylist.c:350 -msgid "1 signature not checked due to an error\n" -msgstr "1 ondertekening niet gecontroleerd vanwege een fout\n" - -#: g10/keyedit.c:342 g10/keylist.c:352 -#, c-format -msgid "%d signatures not checked due to errors\n" -msgstr "%d ondertekeningen niet gecontroleerd vanwege fouten\n" - -#: g10/keyedit.c:344 -msgid "1 user ID without valid self-signature detected\n" -msgstr "1 gebruikerscode zonder geldige zelfondertekening gevonden\n" - -#: g10/keyedit.c:346 -#, c-format -msgid "%d user IDs without valid self-signatures detected\n" -msgstr "%d gebruikerscodes zonder geldige zelfondertekening gevonden\n" - -#: g10/keyedit.c:402 g10/pkclist.c:262 -#, 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 "" -"Besluit alstublieft in hoeverre u deze gebruiker erop\n" -"vertrouwt om sleutels van andere gebruikers te\n" -"controleren (door paspoorten te bekijken, vingerafdrukken\n" -"te controleren van verschillende bronnen...).\n" -"\n" - -#: g10/keyedit.c:406 g10/pkclist.c:274 -#, fuzzy, c-format -msgid " %d = I trust marginally\n" -msgstr " %d = Ik vertrouw een beetje\n" - -#: g10/keyedit.c:407 g10/pkclist.c:276 -#, fuzzy, c-format -msgid " %d = I trust fully\n" -msgstr " %d = Ik vertrouw volledig\n" - -#: g10/keyedit.c:426 -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:442 -msgid "Please enter a domain to restrict this signature, or enter for none.\n" -msgstr "" - -#: g10/keyedit.c:584 -#, c-format -msgid "User ID \"%s\" is revoked." -msgstr "Gebruikerscode \"%s\" is herroepen." - -#: g10/keyedit.c:593 g10/keyedit.c:619 g10/keyedit.c:644 g10/keyedit.c:799 -#: g10/keyedit.c:857 g10/keyedit.c:1486 -msgid "Are you sure you still want to sign it? (y/N) " -msgstr "Weet u zeker dat u deze toch wilt ondertekenen? (j/N) " - -#: g10/keyedit.c:605 g10/keyedit.c:631 g10/keyedit.c:656 g10/keyedit.c:805 -#: g10/keyedit.c:1492 -msgid " Unable to sign.\n" -msgstr " Kan niet ondertekenen.\n" - -#: g10/keyedit.c:610 -#, fuzzy, c-format -msgid "User ID \"%s\" is expired." -msgstr "Gebruikerscode \"%s\" is herroepen." - -#: g10/keyedit.c:636 -#, fuzzy, c-format -msgid "User ID \"%s\" is not self-signed." -msgstr "WAARSCHUWING: gebruikerscode \"%s\" is niet zelfondertekend.\n" - -#: g10/keyedit.c:675 -#, c-format -msgid "" -"The self-signature on \"%s\"\n" -"is a PGP 2.x-style signature.\n" -msgstr "" -"De zelfondertekening op \"%s\"\n" -"is een PGP 2.x-stijl ondertekening.\n" - -#: g10/keyedit.c:684 -msgid "Do you want to promote it to an OpenPGP self-signature? (y/N) " -msgstr "Wilt u deze promoveren tot een OpenPGP zelfondertekening? (j/N) " - -#: g10/keyedit.c:698 -#, c-format -msgid "" -"Your current signature on \"%s\"\n" -"has expired.\n" -msgstr "" -"Uw huidige ondertekening van \"%s\"\n" -"is verlopen.\n" - -#: g10/keyedit.c:702 -msgid "Do you want to issue a new signature to replace the expired one? (y/N) " -msgstr "" -"Wilt u een nieuwe ondertekening plaatsen om de oude te vervangen? (j/N) " - -#: g10/keyedit.c:723 -#, c-format -msgid "" -"Your current signature on \"%s\"\n" -"is a local signature.\n" -msgstr "" -"Uw huidige ondertekening van \"%s\"\n" -"is een lokale ondertekening.\n" - -#: g10/keyedit.c:727 -msgid "Do you want to promote it to a full exportable signature? (y/N) " -msgstr "" -"WIlt u deze promoveren tot een volledig uitvoerbare ondertekening? (j/N) " - -#: g10/keyedit.c:748 -#, fuzzy, c-format -msgid "\"%s\" was already locally signed by key %s\n" -msgstr "\"%s\" was al lokaal ondertekend met sleutel %08lX\n" - -#: g10/keyedit.c:751 -#, fuzzy, c-format -msgid "\"%s\" was already signed by key %s\n" -msgstr "\"%s\" was al ondertekend met sleutel %08lX\n" - -#: g10/keyedit.c:756 -msgid "Do you want to sign it again anyway? (y/N) " -msgstr "Wilt u deze toch ondertekenen? (j/N) " - -#: g10/keyedit.c:778 -#, fuzzy, c-format -msgid "Nothing to sign with key %s\n" -msgstr "Niets te ondertekenen bij sleutel %08lX\n" - -#: g10/keyedit.c:793 -msgid "This key has expired!" -msgstr "Deze sleutel is verlopen!" - -#: g10/keyedit.c:813 -#, c-format -msgid "This key is due to expire on %s.\n" -msgstr "Deze sleutel zal verlopen op %s.\n" - -#: g10/keyedit.c:817 -msgid "Do you want your signature to expire at the same time? (Y/n) " -msgstr "Wilt u dat uw ondertekening op hetzelfde moment verloopt? (J/n) " - -#: g10/keyedit.c:850 -msgid "" -"You may not make an OpenPGP signature on a PGP 2.x key while in --pgp2 " -"mode.\n" -msgstr "" -"U kunt geen OpenPGP-ondertekening maken van een PGP 2.x sleutel in --pgp2 " -"modus.\n" - -#: g10/keyedit.c:852 -msgid "This would make the key unusable in PGP 2.x.\n" -msgstr "Dit zou de sleutel onbruikbaar maken in PGP 2.x.\n" - -#: g10/keyedit.c:877 -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 "" -"Hoe nauwkeurig heeft u gecontroleerd dat de sleutel die u nu ondertekent " -"echt\n" -"is van de bovengenoemde persoon? Als u geen antwoord weet, kies \"0\".\n" - -#: g10/keyedit.c:882 -#, c-format -msgid " (0) I will not answer.%s\n" -msgstr " (0) Ik geef geen antwoord.%s\n" - -#: g10/keyedit.c:884 -#, c-format -msgid " (1) I have not checked at all.%s\n" -msgstr " (1) Ik heb helemaal niet gecontroleerd.%s\n" - -#: g10/keyedit.c:886 -#, c-format -msgid " (2) I have done casual checking.%s\n" -msgstr " (2) Ik heb nonchalant gecontroleerd.%s\n" - -#: g10/keyedit.c:888 -#, c-format -msgid " (3) I have done very careful checking.%s\n" -msgstr " (3) Ik heb heel nauwkeurig gecontroleerd.%s\n" - -#: g10/keyedit.c:894 -msgid "Your selection? (enter '?' for more information): " -msgstr "" - -#: g10/keyedit.c:918 -#, fuzzy, c-format -msgid "" -"Are you sure that you want to sign this key with your\n" -"key \"%s\" (%s)\n" -msgstr "" -"Weet u zeker dat u deze sleutel wilt ondertekenen\n" -"met uw sleutel: \"" - -#: g10/keyedit.c:925 -#, fuzzy -msgid "This will be a self-signature.\n" -msgstr "" -"\n" -"Dit zal een zelfondertekening zijn.\n" - -#: g10/keyedit.c:931 -#, fuzzy -msgid "WARNING: the signature will not be marked as non-exportable.\n" -msgstr "" -"\n" -"WAARSCHUWING: de ondertekening zal niet worden gemarkeerd als niet-" -"uitvoerbaar.\n" - -#: g10/keyedit.c:939 -#, fuzzy -msgid "WARNING: the signature will not be marked as non-revocable.\n" -msgstr "" -"\n" -"WAARSCHUWING: de ondertekening zal niet worden gemarkeerd als niet-" -"herroepbaar.\n" - -#: g10/keyedit.c:949 -#, fuzzy -msgid "The signature will be marked as non-exportable.\n" -msgstr "" -"\n" -"De ondertekening zal worden gemarkeerd als niet-uitvoerbaar.\n" - -#: g10/keyedit.c:956 -#, fuzzy -msgid "The signature will be marked as non-revocable.\n" -msgstr "" -"\n" -"De ondertekening zal worden gemarkeerd als niet-herroepbaar.\n" - -#: g10/keyedit.c:963 -#, fuzzy -msgid "I have not checked this key at all.\n" -msgstr "" -"\n" -"Ik heb deze sleutel helemaal niet gecontroleerd.\n" - -#: g10/keyedit.c:968 -#, fuzzy -msgid "I have checked this key casually.\n" -msgstr "" -"\n" -"Ik heb deze sleutel nonchalant gecontroleerd.\n" - -#: g10/keyedit.c:973 -#, fuzzy -msgid "I have checked this key very carefully.\n" -msgstr "" -"\n" -"Ik heb deze sleutel heel nauwkeurig gecontroleerd.\n" - -#: g10/keyedit.c:983 -#, fuzzy -msgid "Really sign? (y/N) " -msgstr "Echt ondertekenen? " - -#: g10/keyedit.c:1028 g10/keyedit.c:3891 g10/keyedit.c:3982 g10/keyedit.c:4055 -#: g10/sign.c:369 -#, c-format -msgid "signing failed: %s\n" -msgstr "ondertekenen mislukt: %s\n" - -#: g10/keyedit.c:1084 -msgid "This key is not protected.\n" -msgstr "Deze sleutel is niet beschermd.\n" - -#: g10/keyedit.c:1088 -msgid "Secret parts of primary key are not available.\n" -msgstr "Geheime delen van primaire sleutel zijn niet beschikbaar.\n" - -#: g10/keyedit.c:1092 -msgid "Key is protected.\n" -msgstr "Sleutel is beschermd.\n" - -#: g10/keyedit.c:1112 -#, c-format -msgid "Can't edit this key: %s\n" -msgstr "Kan deze sleutel niet bewerken: %s\n" - -#: g10/keyedit.c:1118 -msgid "" -"Enter the new passphrase for this secret key.\n" -"\n" -msgstr "" -"Geef het nieuwe wachtwoord voor deze geheime sleutel.\n" -"\n" - -#: g10/keyedit.c:1127 g10/keygen.c:1806 -msgid "passphrase not correctly repeated; try again" -msgstr "wachtwoord niet juist herhaald; probeer opnieuw" - -#: g10/keyedit.c:1132 -msgid "" -"You don't want a passphrase - this is probably a *bad* idea!\n" -"\n" -msgstr "" -"U wilt geen wachtwoord - dit is waarschijnlijk een *slecht* idee!\n" -"\n" - -#: g10/keyedit.c:1135 -#, fuzzy -msgid "Do you really want to do this? (y/N) " -msgstr "Wilt u dit echt doen? " - -#: g10/keyedit.c:1201 -msgid "moving a key signature to the correct place\n" -msgstr "een sleutelondertekening wordt naar de juiste plek verplaatst\n" - -#: g10/keyedit.c:1247 -msgid "save" -msgstr "save" - -#: g10/keyedit.c:1247 -msgid "save and quit" -msgstr "opslaan en afsluiten" - -#: g10/keyedit.c:1250 -msgid "fpr" -msgstr "fpr" - -#: g10/keyedit.c:1250 -msgid "show fingerprint" -msgstr "vingerafdruk weergeven" - -#: g10/keyedit.c:1251 -msgid "list key and user IDs" -msgstr "sleutel en gebruikerscodes opsommen" - -#: g10/keyedit.c:1253 -msgid "uid" -msgstr "uid" - -#: g10/keyedit.c:1253 -msgid "select user ID N" -msgstr "gebruikerscode N selecteren" - -#: g10/keyedit.c:1254 -msgid "key" -msgstr "key" - -#: g10/keyedit.c:1254 -msgid "select secondary key N" -msgstr "secundaire sleutel N kiezen" - -#: g10/keyedit.c:1255 -msgid "check" -msgstr "check" - -#: g10/keyedit.c:1255 -msgid "list signatures" -msgstr "ondertekeningen opsommen" - -#: g10/keyedit.c:1256 -msgid "c" -msgstr "c" - -#: g10/keyedit.c:1257 -msgid "sign" -msgstr "sign" - -#: g10/keyedit.c:1257 -msgid "sign the key" -msgstr "de sleutel ondertekenen" - -#: g10/keyedit.c:1258 -msgid "s" -msgstr "s" - -#: g10/keyedit.c:1259 -#, fuzzy -msgid "tsign" -msgstr "sign" - -#: g10/keyedit.c:1259 -#, fuzzy -msgid "make a trust signature" -msgstr "een losse ondertekening maken" - -#: g10/keyedit.c:1260 -msgid "lsign" -msgstr "lsign" - -#: g10/keyedit.c:1260 -msgid "sign the key locally" -msgstr "de sleutel lokaal ondertekenen" - -#: g10/keyedit.c:1261 -msgid "nrsign" -msgstr "nrsign" - -#: g10/keyedit.c:1261 -msgid "sign the key non-revocably" -msgstr "de sleutel niet-herroepbaar ondertekenen" - -#: g10/keyedit.c:1262 -msgid "nrlsign" -msgstr "nrlsign" - -#: g10/keyedit.c:1262 -msgid "sign the key locally and non-revocably" -msgstr "de sleutel lokaal en niet-herroepbaar ondertekenen" - -#: g10/keyedit.c:1264 -msgid "adduid" -msgstr "adduid" - -#: g10/keyedit.c:1264 -msgid "add a user ID" -msgstr "een gebruikerscode toevoegen" - -#: g10/keyedit.c:1265 -msgid "addphoto" -msgstr "addphoto" - -#: g10/keyedit.c:1265 -msgid "add a photo ID" -msgstr "een foto ID toevoegen" - -#: g10/keyedit.c:1266 -msgid "deluid" -msgstr "deluid" - -#: g10/keyedit.c:1266 -msgid "delete user ID" -msgstr "gebruikerscode verwijderen" - -#: g10/keyedit.c:1268 -msgid "delphoto" -msgstr "delphoto" - -#: g10/keyedit.c:1269 -msgid "addkey" -msgstr "addkey" - -#: g10/keyedit.c:1269 -msgid "add a secondary key" -msgstr "een secundaire sleutel toevoegen" - -#: g10/keyedit.c:1271 -#, fuzzy -msgid "addcardkey" -msgstr "addkey" - -#: g10/keyedit.c:1271 -msgid "add a key to a smartcard" -msgstr "" - -#: g10/keyedit.c:1272 -msgid "keytocard" -msgstr "" - -#: g10/keyedit.c:1272 -msgid "move a key to a smartcard" -msgstr "" - -#: g10/keyedit.c:1274 -msgid "delkey" -msgstr "delkey" - -#: g10/keyedit.c:1274 -msgid "delete a secondary key" -msgstr "een secundaire sleutel verwijderen" - -#: g10/keyedit.c:1275 -msgid "addrevoker" -msgstr "addrevoker" - -#: g10/keyedit.c:1275 -msgid "add a revocation key" -msgstr "een herroepingssleutel toevoegen" - -#: g10/keyedit.c:1276 -msgid "delsig" -msgstr "delsig" - -#: g10/keyedit.c:1276 -msgid "delete signatures" -msgstr "ondertekeningen verwijderen" - -#: g10/keyedit.c:1277 -msgid "expire" -msgstr "expire" - -#: g10/keyedit.c:1277 -msgid "change the expire date" -msgstr "de verloopdatum wijzigen" - -#: g10/keyedit.c:1278 -msgid "primary" -msgstr "primary" - -#: g10/keyedit.c:1278 -msgid "flag user ID as primary" -msgstr "gebruikerscode als primair markeren" - -#: g10/keyedit.c:1279 -msgid "toggle" -msgstr "toggle" - -#: g10/keyedit.c:1279 -msgid "toggle between secret and public key listing" -msgstr "overschakelen tussen geheime en openbare sleutellijst" - -#: g10/keyedit.c:1281 -msgid "t" -msgstr "t" - -#: g10/keyedit.c:1282 -msgid "pref" -msgstr "pref" - -#: g10/keyedit.c:1282 -msgid "list preferences (expert)" -msgstr "lijst voorkeuren (ervaren gebruiker)" - -#: g10/keyedit.c:1283 -msgid "showpref" -msgstr "showpref" - -#: g10/keyedit.c:1283 -msgid "list preferences (verbose)" -msgstr "lijst voorkeuren (breedsprakig)" - -#: g10/keyedit.c:1284 -msgid "setpref" -msgstr "setpref" - -#: g10/keyedit.c:1284 -msgid "set preference list" -msgstr "voorkeurenlijst instellen" - -#: g10/keyedit.c:1285 -msgid "updpref" -msgstr "updpref" - -#: g10/keyedit.c:1285 -msgid "updated preferences" -msgstr "voorkeuren bijgewerkt" - -#: g10/keyedit.c:1286 -#, fuzzy -msgid "keyserver" -msgstr "sleutelserverfout" - -#: g10/keyedit.c:1286 -#, fuzzy -msgid "set preferred keyserver URL" -msgstr "kon sleutelserver URI niet inlezen\n" - -#: g10/keyedit.c:1287 -msgid "change the passphrase" -msgstr "het wachtwoord wijzigen" - -#: g10/keyedit.c:1288 -msgid "trust" -msgstr "trust" - -#: g10/keyedit.c:1288 -msgid "change the ownertrust" -msgstr "het eigenaarsvertrouwen wijzigen" - -#: g10/keyedit.c:1289 -msgid "revsig" -msgstr "revsig" - -#: g10/keyedit.c:1289 -msgid "revoke signatures" -msgstr "ondertekeningen herroepen" - -#: g10/keyedit.c:1290 -msgid "revuid" -msgstr "revuid" - -#: g10/keyedit.c:1290 -msgid "revoke a user ID" -msgstr "een gebruikerscode herroepen" - -#: g10/keyedit.c:1291 -msgid "revkey" -msgstr "revkey" - -#: g10/keyedit.c:1291 -msgid "revoke a secondary key" -msgstr "een secundaire sleutel herroepen" - -#: g10/keyedit.c:1292 -msgid "disable" -msgstr "disable" - -#: g10/keyedit.c:1292 -msgid "disable a key" -msgstr "een sleutel uit zetten" - -#: g10/keyedit.c:1293 -msgid "enable" -msgstr "enable" - -#: g10/keyedit.c:1293 -msgid "enable a key" -msgstr "een sleutel aan zetten" - -#: g10/keyedit.c:1294 -msgid "showphoto" -msgstr "showphoto" - -#: g10/keyedit.c:1294 -msgid "show photo ID" -msgstr "foto ID weergeven" - -#: g10/keyedit.c:1347 -#, fuzzy, c-format -msgid "error reading secret keyblock \"%s\": %s\n" -msgstr "fout bij lezen geheim sleutelblok `%s': %s\n" - -#: g10/keyedit.c:1365 -msgid "Secret key is available.\n" -msgstr "Geheime sleutel is beschikbaar.\n" - -#: g10/keyedit.c:1427 -msgid "Need the secret key to do this.\n" -msgstr "De geheime sleutel is nodig om dit te doen.\n" - -#: g10/keyedit.c:1432 -msgid "Please use the command \"toggle\" first.\n" -msgstr "Gebruik alstublieft eerst de \"toggle\" opdracht.\n" - -#: g10/keyedit.c:1480 -msgid "Key is revoked." -msgstr "Sleutel is herroepen." - -#: g10/keyedit.c:1500 -#, fuzzy -msgid "Really sign all user IDs? (y/N) " -msgstr "Echt alle gebruikerscodes ondertekenen? " - -#: g10/keyedit.c:1502 -msgid "Hint: Select the user IDs to sign\n" -msgstr "Tip: Selecteer de gebruikerscodes om te ondertekenen\n" - -#: g10/keyedit.c:1527 -#, c-format -msgid "This command is not allowed while in %s mode.\n" -msgstr "Deze opdracht is niet toegestaan in %s modus.\n" - -#: g10/keyedit.c:1549 g10/keyedit.c:1569 g10/keyedit.c:1672 -msgid "You must select at least one user ID.\n" -msgstr "U dient tenminste één gebruikerscode te selecteren.\n" - -#: g10/keyedit.c:1551 -msgid "You can't delete the last user ID!\n" -msgstr "U kunt niet de laatste gebruikerscode verwijderen!\n" - -#: g10/keyedit.c:1553 -#, fuzzy -msgid "Really remove all selected user IDs? (y/N) " -msgstr "Echt alle geselecteerde gebruikerscodes verwijderen? " - -#: g10/keyedit.c:1554 -#, fuzzy -msgid "Really remove this user ID? (y/N) " -msgstr "Echt deze gebruikerscode verwijderen? " - -#: g10/keyedit.c:1604 -#, fuzzy -msgid "Really move the primary key? (y/N) " -msgstr "Echt deze gebruikerscode verwijderen? " - -#: g10/keyedit.c:1616 -#, fuzzy -msgid "You must select exactly one key.\n" -msgstr "U dient tenminste één sleutel te selecteren.\n" - -#: g10/keyedit.c:1636 g10/keyedit.c:1691 -msgid "You must select at least one key.\n" -msgstr "U dient tenminste één sleutel te selecteren.\n" - -#: g10/keyedit.c:1639 -#, fuzzy -msgid "Do you really want to delete the selected keys? (y/N) " -msgstr "Wilt u echt de geselecteerde sleutels verwijderen? " - -#: g10/keyedit.c:1640 -#, fuzzy -msgid "Do you really want to delete this key? (y/N) " -msgstr "Wilt u echt deze sleutel verwijderen? " - -#: g10/keyedit.c:1675 -#, fuzzy -msgid "Really revoke all selected user IDs? (y/N) " -msgstr "Echt alle geselecteerde gebruikerscodes herroepen? " - -#: g10/keyedit.c:1676 -#, fuzzy -msgid "Really revoke this user ID? (y/N) " -msgstr "Echt deze gebruikerscode herroepen? " - -#: g10/keyedit.c:1695 -#, fuzzy -msgid "Do you really want to revoke the selected keys? (y/N) " -msgstr "Wilt u echt de geselecteerde sleutels herroepen? " - -#: g10/keyedit.c:1696 -#, fuzzy -msgid "Do you really want to revoke this key? (y/N) " -msgstr "Wilt u echt deze sleutel herroepen? " - -#: g10/keyedit.c:1735 -msgid "" -"Owner trust may not be set while using an user provided trust database\n" -msgstr "" - -#: g10/keyedit.c:1767 -#, fuzzy -msgid "Set preference list to:\n" -msgstr "voorkeurenlijst instellen" - -#: g10/keyedit.c:1773 -#, fuzzy -msgid "Really update the preferences for the selected user IDs? (y/N) " -msgstr "Echt de voorkeuren bijwerken voor de geselecteerde gebruikerscodes? " - -#: g10/keyedit.c:1775 -#, fuzzy -msgid "Really update the preferences? (y/N) " -msgstr "Echt de voorkeuren bijwerken? " - -#: g10/keyedit.c:1825 -#, fuzzy -msgid "Save changes? (y/N) " -msgstr "Wijzigingen opslaan? " - -#: g10/keyedit.c:1828 -#, fuzzy -msgid "Quit without saving? (y/N) " -msgstr "Afsluiten zonder op te slaan? " - -#: g10/keyedit.c:1838 -#, c-format -msgid "update failed: %s\n" -msgstr "bijwerken mislukt: %s\n" - -#: g10/keyedit.c:1845 -#, c-format -msgid "update secret failed: %s\n" -msgstr "bijwerken geheim mislukt: %s\n" - -#: g10/keyedit.c:1852 -msgid "Key not changed so no update needed.\n" -msgstr "Sleutel niet gewijzigd dus bijwerken niet nodig.\n" - -#: g10/keyedit.c:1924 -msgid "Digest: " -msgstr "Samenvatting: " - -#: g10/keyedit.c:1976 -msgid "Features: " -msgstr "Mogelijkheden: " - -#: g10/keyedit.c:1987 -msgid "Keyserver no-modify" -msgstr "" - -#: g10/keyedit.c:2002 g10/keylist.c:244 -msgid "Preferred keyserver: " -msgstr "" - -#: g10/keyedit.c:2245 -#, fuzzy, c-format -msgid "This key may be revoked by %s key %s" -msgstr "Deze sleutel is mogelijk herroepen door sleutel %s " - -#: g10/keyedit.c:2251 -#, fuzzy -msgid "(sensitive)" -msgstr " (gevoelig)" - -#: g10/keyedit.c:2267 g10/keyedit.c:2323 g10/keyedit.c:2444 g10/keyedit.c:2459 -#: g10/keyserver.c:366 -#, fuzzy, c-format -msgid "created: %s" -msgstr "kan %s niet aanmaken: %s\n" - -#: g10/keyedit.c:2270 g10/keylist.c:723 g10/keylist.c:823 g10/mainproc.c:929 -#, fuzzy, c-format -msgid "revoked: %s" -msgstr "[herroepen] " - -#: g10/keyedit.c:2272 g10/keylist.c:694 g10/keylist.c:829 -#, fuzzy, c-format -msgid "expired: %s" -msgstr " [verloopt: %s]" - -#: g10/keyedit.c:2274 g10/keyedit.c:2325 g10/keyedit.c:2446 g10/keyedit.c:2461 -#: g10/keylist.c:700 g10/keylist.c:735 g10/keylist.c:835 g10/keylist.c:856 -#: g10/keyserver.c:372 g10/mainproc.c:935 -#, fuzzy, c-format -msgid "expires: %s" -msgstr " [verloopt: %s]" - -#: g10/keyedit.c:2276 -#, fuzzy, c-format -msgid "usage: %s" -msgstr " vertrouwen: %c/%c" - -#: g10/keyedit.c:2291 -#, fuzzy, c-format -msgid "trust: %s" -msgstr " vertrouwen: %c/%c" - -#: g10/keyedit.c:2295 -#, c-format -msgid "validity: %s" -msgstr "" - -#: g10/keyedit.c:2302 -msgid "This key has been disabled" -msgstr "Deze sleutel is uit gezet" - -#: g10/keyedit.c:2330 -msgid "card-no: " -msgstr "" - -#: g10/keyedit.c:2365 g10/keyedit.c:2367 g10/keyedit.c:2369 -#, c-format -msgid "[%8.8s] " -msgstr "" - -#: g10/keyedit.c:2365 g10/keyedit.c:2478 g10/keylist.c:782 g10/keyserver.c:376 -#: g10/mainproc.c:1575 g10/trustdb.c:1133 -#, fuzzy -msgid "revoked" -msgstr "[herroepen] " - -#: g10/keyedit.c:2367 g10/keyedit.c:2480 g10/keylist.c:784 g10/keyserver.c:380 -#: g10/mainproc.c:1577 g10/trustdb.c:500 -#, fuzzy -msgid "expired" -msgstr "expire" - -#: g10/keyedit.c:2406 -msgid "There are no preferences on a PGP 2.x-style user ID.\n" -msgstr "Er zijn geen voorkeuren op een PGP 2.x stijl gebruikerscode.\n" - -#: g10/keyedit.c:2414 -msgid "" -"Please note that the shown key validity is not necessarily correct\n" -"unless you restart the program.\n" -msgstr "" -"Let er alstublieft op dat de weergegeven sleutelgeldigheid niet per sé " -"juist\n" -"is tenzij u het programma opnieuw start.\n" - -#: g10/keyedit.c:2545 -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:2605 -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 "" -"WAARSCHUWING: Dit is een PGP2-stijl sleutel. Het toevoegen van een foto ID " -"kan\n" -" zorgen dat sommige versies van PGP deze sleutel verwerpen.\n" - -#: g10/keyedit.c:2610 g10/keyedit.c:2888 -msgid "Are you sure you still want to add it? (y/N) " -msgstr "Weet u zeker dat u deze toch wilt toevoegen? (j/N) " - -#: g10/keyedit.c:2616 -msgid "You may not add a photo ID to a PGP2-style key.\n" -msgstr "U kunt geen foto ID toevoegen aan een PGP2 stijl sleutel.\n" - -#: g10/keyedit.c:2756 -msgid "Delete this good signature? (y/N/q)" -msgstr "Deze goede ondertekening verwijderen? (j/N/q)" - -#: g10/keyedit.c:2766 -msgid "Delete this invalid signature? (y/N/q)" -msgstr "Deze ongeldige ondertekening verwijderen? (j/N/q)" - -#: g10/keyedit.c:2770 -msgid "Delete this unknown signature? (y/N/q)" -msgstr "Deze onbekende ondertekening verwijderen? (j/N/q)" - -#: g10/keyedit.c:2776 -msgid "Really delete this self-signature? (y/N)" -msgstr "Echt deze zelfondertekening verwijderen? (j/N)" - -#: g10/keyedit.c:2790 -#, c-format -msgid "Deleted %d signature.\n" -msgstr "%d ondertekening verwijderd.\n" - -#: g10/keyedit.c:2791 -#, c-format -msgid "Deleted %d signatures.\n" -msgstr "%d ondertekeningen verwijderd.\n" - -#: g10/keyedit.c:2794 -msgid "Nothing deleted.\n" -msgstr "Niets verwijderd.\n" - -#: g10/keyedit.c:2883 -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 "" -"WAARSCHUWING: Dit is een PGP 2.x-stijl sleutel. Een aangestelde herroeper\n" -" toevoegen kan zorgen dat sommige versies van PGP deze sleutel " -"verwerpen.\n" - -#: g10/keyedit.c:2894 -msgid "You may not add a designated revoker to a PGP 2.x-style key.\n" -msgstr "" -"U kunt geen aangestelde herroeper toevoegen aan een PGP 2.x stijl sleutel.\n" - -#: g10/keyedit.c:2914 -msgid "Enter the user ID of the designated revoker: " -msgstr "Geef de gebruikerscode van de aangestelde herroeper: " - -#: g10/keyedit.c:2937 -msgid "cannot appoint a PGP 2.x style key as a designated revoker\n" -msgstr "" -"kan een PGP 2.x stijl sleutel niet aanwijzen als een aangestelde herroeper\n" - -#: g10/keyedit.c:2952 -msgid "you cannot appoint a key as its own designated revoker\n" -msgstr "u kunt geen sleutel aanwijzen als zijn eigen aangestelde herroeper\n" - -#: g10/keyedit.c:2974 -#, fuzzy -msgid "this key has already been designated as a revoker\n" -msgstr "WAARSCHUWING: Deze sleutel is herroepen door zijn eigenaar!\n" - -#: g10/keyedit.c:2993 -msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n" -msgstr "" -"WAARSCHUWING: het aanwijzen van een sleutel als een aangestelde herroeper " -"kan niet ongedaan gemaakt worden!\n" - -#: g10/keyedit.c:2999 -#, fuzzy -msgid "" -"Are you sure you want to appoint this key as a designated revoker? (y/N) " -msgstr "" -"Wilt u echt deze sleutel aanwijzen als een aangestelde herroeper? (j/N): " - -#: g10/keyedit.c:3060 -msgid "Please remove selections from the secret keys.\n" -msgstr "Verwijder alstublieft selecties van de geheime sleutels.\n" - -#: g10/keyedit.c:3066 -msgid "Please select at most one secondary key.\n" -msgstr "Selecteer alstublieft ten hoogste één secundaire sleutel.\n" - -#: g10/keyedit.c:3070 -msgid "Changing expiration time for a secondary key.\n" -msgstr "De verlooptijd voor een secundaire sleutel wordt gewijzigd.\n" - -#: g10/keyedit.c:3073 -msgid "Changing expiration time for the primary key.\n" -msgstr "De verlooptijd voor de primaire sleutel wordt gewijzigd.\n" - -#: g10/keyedit.c:3119 -msgid "You can't change the expiration date of a v3 key\n" -msgstr "U kunt de verlooptijd van een v3-sleutel niet wijzigen\n" - -#: g10/keyedit.c:3135 -msgid "No corresponding signature in secret ring\n" -msgstr "Geen geassocieerde ondertekening in geheime sleutelbos\n" - -#: g10/keyedit.c:3215 -msgid "Please select exactly one user ID.\n" -msgstr "Selecteer alstublieft precies één gebruikerscode.\n" - -#: g10/keyedit.c:3254 g10/keyedit.c:3364 g10/keyedit.c:3483 -#, fuzzy, c-format -msgid "skipping v3 self-signature on user ID \"%s\"\n" -msgstr "v3-zelfondertekening op gebruikerscode \"%s\" wordt overgeslagen\n" - -#: g10/keyedit.c:3425 -msgid "Enter your preferred keyserver URL: " -msgstr "" - -#: g10/keyedit.c:3504 -#, fuzzy -msgid "Are you sure you want to replace it? (y/N) " -msgstr "Weet u zeker dat u deze wilt gebruiken (j/N)? " - -#: g10/keyedit.c:3505 -#, fuzzy -msgid "Are you sure you want to delete it? (y/N) " -msgstr "Weet u zeker dat u deze wilt gebruiken (j/N)? " - -#: g10/keyedit.c:3567 -#, c-format -msgid "No user ID with index %d\n" -msgstr "Geen gebruikerscode met index %d\n" - -#: g10/keyedit.c:3613 -#, c-format -msgid "No secondary key with index %d\n" -msgstr "Geen secundaire sleutel met index %d\n" - -#: g10/keyedit.c:3730 -#, fuzzy, c-format -msgid "user ID: \"%s\"\n" -msgstr "gebruikerscode: \"" - -#: g10/keyedit.c:3733 g10/keyedit.c:3797 g10/keyedit.c:3840 -#, fuzzy, c-format -msgid "signed by your key %s on %s%s%s\n" -msgstr " ondertekend door %08lX op %s%s%s\n" - -#: g10/keyedit.c:3735 g10/keyedit.c:3799 g10/keyedit.c:3842 -msgid " (non-exportable)" -msgstr " (niet-uitvoerbaar)" - -#: g10/keyedit.c:3739 -#, c-format -msgid "This signature expired on %s.\n" -msgstr "Deze ondertekening is verlopen op %s.\n" - -#: g10/keyedit.c:3743 -msgid "Are you sure you still want to revoke it? (y/N) " -msgstr "Weet u zeker dat u deze nog steeds wilt herroepen? (j/N) " - -#: g10/keyedit.c:3747 -msgid "Create a revocation certificate for this signature? (y/N) " -msgstr "Een herroepingscertificaat maken voor deze ondertekening? (j/N) " - -#: g10/keyedit.c:3774 -#, fuzzy, c-format -msgid "You have signed these user IDs on key %s:\n" -msgstr "U heeft deze gebruikerscodes ondertekend:\n" - -#: g10/keyedit.c:3800 -#, fuzzy -msgid " (non-revocable)" -msgstr " (niet-uitvoerbaar)" - -#: g10/keyedit.c:3807 -#, fuzzy, c-format -msgid "revoked by your key %s on %s\n" -msgstr " herroepen door %08lX op %s\n" - -#: g10/keyedit.c:3829 -msgid "You are about to revoke these signatures:\n" -msgstr "U staat op het punt deze ondertekeningen te herroepen:\n" - -#: g10/keyedit.c:3849 -msgid "Really create the revocation certificates? (y/N) " -msgstr "Echt de herroepingscertificaten maken? (j/N) " - -#: g10/keyedit.c:3879 -msgid "no secret key\n" -msgstr "geen geheime sleutel\n" - -#: g10/keyedit.c:3949 -#, c-format -msgid "user ID \"%s\" is already revoked\n" -msgstr "gebruikerscode \"%s\" is al herroepen\n" - -#: g10/keyedit.c:3966 -#, c-format -msgid "WARNING: a user ID signature is dated %d seconds in the future\n" -msgstr "" -"WAARSCHUWING: een gebruikerscode ondertekening is van %d seconden in de " -"toekomst\n" - -#: g10/keyedit.c:4135 -#, fuzzy, c-format -msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n" -msgstr "" -"Foto ID %s van grootte %ld voor sleutel 0x%08lX (gebruiker %d) wordt " -"weergegeven\n" - -#: g10/keygen.c:293 -#, fuzzy, c-format -msgid "preference `%s' duplicated\n" -msgstr "voorkeur %c%lu komt dubbel voor\n" - -#: g10/keygen.c:300 -#, fuzzy -msgid "too many cipher preferences\n" -msgstr "teveel `%c' voorkeuren\n" - -#: g10/keygen.c:302 -#, fuzzy -msgid "too many digest preferences\n" -msgstr "teveel `%c' voorkeuren\n" - -#: g10/keygen.c:304 -#, fuzzy -msgid "too many compression preferences\n" -msgstr "teveel `%c' voorkeuren\n" - -#: g10/keygen.c:401 -#, fuzzy, c-format -msgid "invalid item `%s' in preference string\n" -msgstr "ongeldig teken in voorkeurtekenreeks\n" - -#: g10/keygen.c:827 -msgid "writing direct signature\n" -msgstr "bezig met schrijven directe ondertekening\n" - -#: g10/keygen.c:866 -msgid "writing self signature\n" -msgstr "bezig met schrijven zelf-ondertekening\n" - -#: g10/keygen.c:912 -msgid "writing key binding signature\n" -msgstr "bezig met schrijven sleutelbindende ondertekening\n" - -#: g10/keygen.c:974 g10/keygen.c:1058 g10/keygen.c:1149 g10/keygen.c:2613 -#, c-format -msgid "keysize invalid; using %u bits\n" -msgstr "sleutelgrootte ongeldig; %u bits worden gebruikt\n" - -#: g10/keygen.c:979 g10/keygen.c:1063 g10/keygen.c:1154 g10/keygen.c:2619 -#, c-format -msgid "keysize rounded up to %u bits\n" -msgstr "sleutelgrootte naar boven afgerond tot %u bits\n" - -#: g10/keygen.c:1247 -#, fuzzy -msgid "Sign" -msgstr "sign" - -#: g10/keygen.c:1250 -#, fuzzy -msgid "Encrypt" -msgstr "gegevens coderen" - -#: g10/keygen.c:1253 -msgid "Authenticate" -msgstr "" - -#: g10/keygen.c:1261 -msgid "SsEeAaQq" -msgstr "" - -#: g10/keygen.c:1276 -#, c-format -msgid "Possible actions for a %s key: " -msgstr "" - -#: g10/keygen.c:1280 -msgid "Current allowed actions: " -msgstr "" - -#: g10/keygen.c:1285 -#, c-format -msgid " (%c) Toggle the sign capability\n" -msgstr "" - -#: g10/keygen.c:1288 -#, fuzzy, c-format -msgid " (%c) Toggle the encrypt capability\n" -msgstr " (%d) ElGamal (alleen coderen)\n" - -#: g10/keygen.c:1291 -#, c-format -msgid " (%c) Toggle the authenticate capability\n" -msgstr "" - -#: g10/keygen.c:1294 -#, c-format -msgid " (%c) Finished\n" -msgstr "" - -#: g10/keygen.c:1348 -msgid "Please select what kind of key you want:\n" -msgstr "Kies alstublieft wat voor sleutel u wilt hebben:\n" - -#: g10/keygen.c:1350 -#, fuzzy, c-format -msgid " (%d) DSA and Elgamal (default)\n" -msgstr " (%d) DSA en ElGamal (standaard)\n" - -#: g10/keygen.c:1351 -#, c-format -msgid " (%d) DSA (sign only)\n" -msgstr " (%d) DSA (alleen ondertekenen)\n" - -#: g10/keygen.c:1353 -#, fuzzy, c-format -msgid " (%d) Elgamal (encrypt only)\n" -msgstr " (%d) ElGamal (alleen coderen)\n" - -#: g10/keygen.c:1354 -#, c-format -msgid " (%d) RSA (sign only)\n" -msgstr " (%d) RSA (alleen ondertekenen)\n" - -#: g10/keygen.c:1356 -#, c-format -msgid " (%d) RSA (encrypt only)\n" -msgstr " (%d) RSA (alleen coderen)\n" - -#: g10/keygen.c:1358 -#, fuzzy, c-format -msgid " (%d) RSA (set your own capabilities)\n" -msgstr " (%d) RSA (alleen coderen)\n" - -#: g10/keygen.c:1409 -#, c-format -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 "" -"Er wordt een nieuw %s sleutelpaar aangemaakt.\n" -" minimale sleutelgrootte is 768 bits\n" -" standaard sleutelgrootte is 1024 bits\n" -" hoogst aangeraden sleutelgrootte is 2048 bits\n" - -#: g10/keygen.c:1418 -msgid "What keysize do you want? (1024) " -msgstr "Welke sleutelgrootte wilt u? (1024) " - -#: g10/keygen.c:1423 -msgid "DSA only allows keysizes from 512 to 1024\n" -msgstr "DSA staat alleen sleutelgroottes toe van 512 tot 1024\n" - -#: g10/keygen.c:1425 -msgid "keysize too small; 1024 is smallest value allowed for RSA.\n" -msgstr "" -"sleutelgrootte te klein; 1024 is de kleinste toegestane waarde voor RSA.\n" - -#: g10/keygen.c:1428 -msgid "keysize too small; 768 is smallest value allowed.\n" -msgstr "sleutelgrootte te klein; 768 is de kleinste toegestane waarde.\n" - -#: g10/keygen.c:1439 -#, c-format -msgid "keysize too large; %d is largest value allowed.\n" -msgstr "sleutelgrootte te groot; %d is de grootste toegestane waarde.\n" - -#: g10/keygen.c:1444 -msgid "" -"Keysizes larger than 2048 are not suggested because\n" -"computations take REALLY long!\n" -msgstr "" -"Sleutelgroottes boven de 2048 worden niet aangeraden\n" -"omdat berekeningen daarmee ERG lang duren!\n" - -#: g10/keygen.c:1447 -#, fuzzy -msgid "Are you sure that you want this keysize? (y/N) " -msgstr "Weet u zeker dat u deze sleutelgrootte wilt? " - -#: g10/keygen.c:1449 -msgid "" -"Okay, but keep in mind that your monitor and keyboard radiation is also very " -"vulnerable to attacks!\n" -msgstr "" -"Goed, maar houd er rekening mee dat de straling van uw beeldscherm en " -"toetsenbord ook erg gevoelig zijn voor aanvallen!\n" - -#: g10/keygen.c:1458 -#, c-format -msgid "Requested keysize is %u bits\n" -msgstr "Gevraagde sleutelgrootte is %u bits\n" - -#: g10/keygen.c:1461 g10/keygen.c:1465 -#, c-format -msgid "rounded up to %u bits\n" -msgstr "afgerond naar boven tot %u bits\n" - -#: g10/keygen.c:1516 -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 "" -"Geef alstublieft aan hoe lang de sleutel geldig moet zijn.\n" -" 0 = sleutel verloopt niet\n" -" <n> = sleutel verloopt na n dagen\n" -" <n>w = sleutel verloopt na n weken\n" -" <n>m = sleutel verloopt na n maanden\n" -" <n>y = sleutel verloopt na n jaren\n" - -#: g10/keygen.c:1525 -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 "" -"Geef alstublieft aan hoe lang de ondertekening geldig moet zijn.\n" -" 0 = ondertekening verloopt niet\n" -" <n> = ondertekening verloopt na n dagen\n" -" <n>w = ondertekening verloopt na n weken\n" -" <n>m = ondertekening verloopt na n maanden\n" -" <n>y = ondertekening verloopt na n jaren\n" - -#: g10/keygen.c:1547 -msgid "Key is valid for? (0) " -msgstr "Hoe lang is de sleutel geldig? (0) " - -#: g10/keygen.c:1549 -msgid "Signature is valid for? (0) " -msgstr "Hoe lang is de ondertekening geldig? (0) " - -#: g10/keygen.c:1554 -msgid "invalid value\n" -msgstr "ongeldige waarde\n" - -#: g10/keygen.c:1559 -#, c-format -msgid "%s does not expire at all\n" -msgstr "%s verloopt nooit\n" - -#: g10/keygen.c:1566 -#, c-format -msgid "%s expires at %s\n" -msgstr "%s verloopt op %s\n" - -#: g10/keygen.c:1572 -msgid "" -"Your system can't display dates beyond 2038.\n" -"However, it will be correctly handled up to 2106.\n" -msgstr "" -"Uw systeem kan geen data weergeven na 2038.\n" -"Het zal data echter correct verwerken tot 2106.\n" - -#: g10/keygen.c:1577 -#, fuzzy -msgid "Is this correct? (y/N) " -msgstr "Is dit juist (j/n)? " - -#: g10/keygen.c:1620 -#, 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" -"U heeft een gebruikerscode nodig om de sleutel mee te identificeren;\n" -"dit programma maakt een gebruikerscode van Echte naam, Opmerking\n" -"en E-mail adres op de volgende manier:\n" -" \"Heinrich Heine (De dichter) <heinrichh@duesseldorf.de>\"\n" -"\n" - -#: g10/keygen.c:1632 -msgid "Real name: " -msgstr "Echte naam: " - -#: g10/keygen.c:1640 -msgid "Invalid character in name\n" -msgstr "Ongeldig teken in naam\n" - -#: g10/keygen.c:1642 -msgid "Name may not start with a digit\n" -msgstr "Naam mag niet met een cijfer beginnen\n" - -#: g10/keygen.c:1644 -msgid "Name must be at least 5 characters long\n" -msgstr "Naam moet tenminste 5 tekens lang zijn\n" - -#: g10/keygen.c:1652 -msgid "Email address: " -msgstr "E-mail adres: " - -#: g10/keygen.c:1663 -msgid "Not a valid email address\n" -msgstr "Geen geldig e-mail adres\n" - -#: g10/keygen.c:1671 -msgid "Comment: " -msgstr "Opmerking: " - -#: g10/keygen.c:1677 -msgid "Invalid character in comment\n" -msgstr "Ongeldig teken in opmerking\n" - -#: g10/keygen.c:1700 -#, c-format -msgid "You are using the `%s' character set.\n" -msgstr "U gebruikt de `%s' tekenset.\n" - -#: g10/keygen.c:1706 -#, c-format -msgid "" -"You selected this USER-ID:\n" -" \"%s\"\n" -"\n" -msgstr "" -"U heeft deze gebruikerscode gekozen:\n" -" \"%s\"\n" -"\n" - -#: g10/keygen.c:1711 -msgid "Please don't put the email address into the real name or the comment\n" -msgstr "" -"Stop het e-mail adres alstublieft niet in de echte naam of de opmerking\n" - -#: g10/keygen.c:1727 -msgid "NnCcEeOoQq" -msgstr "NnOoEeAaFf" - -#: g10/keygen.c:1737 -msgid "Change (N)ame, (C)omment, (E)mail or (Q)uit? " -msgstr "(N)aam, (C) opmerking, (E)-mail wijzigen of (Q) afsluiten? " - -#: g10/keygen.c:1738 -msgid "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? " -msgstr "" -"(N)aam, (C) opmerking, (E)-mail wijzigen of (O) accepteren/(Q) afsluiten? " - -#: g10/keygen.c:1757 -msgid "Please correct the error first\n" -msgstr "Verbeter de fout alstublieft eerst\n" - -#: g10/keygen.c:1797 -msgid "" -"You need a Passphrase to protect your secret key.\n" -"\n" -msgstr "" -"U heeft een wachtwoord nodig om uw geheime sleutel mee te beschermen.\n" -"\n" - -#: g10/keygen.c:1807 -#, c-format -msgid "%s.\n" -msgstr "%s.\n" - -#: g10/keygen.c:1813 -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 "" -"U wilt geen wachtwoord - dit is waarschijnlijk een *slecht* idee!\n" -"Toch zal ik het doen. U kunt uw wachtwoord altijd veranderen,\n" -"met dit programma met de optie \"--edit-key\".\n" -"\n" - -#: g10/keygen.c:1835 -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 "" -"Voor het genereren hebben we veel willekeurige bytes nodig. Het is een\n" -"goed idee om wat te doen (iets typen met het toetsenbord, de muis\n" -"bewegen, schijven gebruiken) tijdens het genereren van priemgetallen;\n" -"dit geeft de willekeurige getallen generator een betere kans om genoeg\n" -"entropie te verzamelen.\n" - -#: g10/keygen.c:2490 -msgid "DSA keypair will have 1024 bits.\n" -msgstr "DSA sleutelpaar zal 1024 bits hebben.\n" - -#: g10/keygen.c:2559 -msgid "Key generation canceled.\n" -msgstr "Sleutelaanmaak geannuleerd.\n" - -#: g10/keygen.c:2747 g10/keygen.c:2884 -#, c-format -msgid "writing public key to `%s'\n" -msgstr "bezig met schrijven openbare sleutel naar `%s'\n" - -#: g10/keygen.c:2749 g10/keygen.c:2887 -#, fuzzy, c-format -msgid "writing secret key stub to `%s'\n" -msgstr "bezig met schrijven geheime sleutel naar `%s'\n" - -#: g10/keygen.c:2752 g10/keygen.c:2890 -#, c-format -msgid "writing secret key to `%s'\n" -msgstr "bezig met schrijven geheime sleutel naar `%s'\n" - -#: g10/keygen.c:2873 -#, c-format -msgid "no writable public keyring found: %s\n" -msgstr "geen schrijfbare openbare sleutelbos gevonden: %s\n" - -#: g10/keygen.c:2879 -#, c-format -msgid "no writable secret keyring found: %s\n" -msgstr "geen schrijfbare geheime sleutelbos gevonden: %s\n" - -#: g10/keygen.c:2897 -#, c-format -msgid "error writing public keyring `%s': %s\n" -msgstr "fout bij schrijven openbare sleutelbos `%s': %s\n" - -#: g10/keygen.c:2904 -#, c-format -msgid "error writing secret keyring `%s': %s\n" -msgstr "fout bij schrijven geheime sleutelbos `%s': %s\n" - -#: g10/keygen.c:2927 -msgid "public and secret key created and signed.\n" -msgstr "openbare en geheime sleutel aangemaakt en ondertekend.\n" - -#: g10/keygen.c:2938 -msgid "" -"Note that this key cannot be used for encryption. You may want to use\n" -"the command \"--edit-key\" to generate a secondary key for this purpose.\n" -msgstr "" -"Let op dat deze sleutel niet gebruikt kan worden voor coderen. Mogelijk\n" -"wilt u daarvoor met de opdracht \"--edit-key\" een tweede sleutel aanmaken.\n" - -#: g10/keygen.c:2950 g10/keygen.c:3065 g10/keygen.c:3180 -#, c-format -msgid "Key generation failed: %s\n" -msgstr "Sleutelaanmaak mislukt: %s\n" - -#: g10/keygen.c:3001 g10/keygen.c:3116 g10/sign.c:290 -#, c-format -msgid "" -"key has been created %lu second in future (time warp or clock problem)\n" -msgstr "" -"sleutel is %lu seconde in de toekomst aangemaakt (tijdsreis of " -"klokprobleem)\n" - -#: g10/keygen.c:3003 g10/keygen.c:3118 g10/sign.c:292 -#, c-format -msgid "" -"key has been created %lu seconds in future (time warp or clock problem)\n" -msgstr "" -"sleutel is %lu seconden in de toekomst aangemaakt (tijdsreis of " -"klokprobleem)\n" - -#: g10/keygen.c:3012 g10/keygen.c:3129 -msgid "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n" -msgstr "" -"LET OP: het aanmaken van deelsleutels voor v3-sleutels komt niet overeen met " -"OpenPGP\n" - -#: g10/keygen.c:3040 g10/keygen.c:3162 -#, fuzzy -msgid "Really create? (y/N) " -msgstr "Echt aanmaken? " - -#: g10/keygen.c:3315 -#, fuzzy, c-format -msgid "storing key onto card failed: %s\n" -msgstr "verwijderen sleutelblok mislukt: %s\n" - -#: g10/keygen.c:3362 -#, fuzzy, c-format -msgid "can't create backup file `%s': %s\n" -msgstr "kan `%s' niet aanmaken: %s\n" - -#: g10/keygen.c:3385 -#, fuzzy, c-format -msgid "NOTE: backup of card key saved to `%s'\n" -msgstr "LET OP: geheime sleutel %08lX verlopen op %s\n" - -#: g10/keygen.c:3452 -#, c-format -msgid "length of RSA modulus is not %d\n" -msgstr "" - -#: g10/keygen.c:3458 -msgid "public exponent too large (more than 32 bits)\n" -msgstr "" - -#: g10/keygen.c:3464 g10/keygen.c:3470 -#, c-format -msgid "length of an RSA prime is not %d\n" -msgstr "" - -#: g10/keyid.c:497 g10/keyid.c:509 g10/keyid.c:521 g10/keyid.c:533 -msgid "never " -msgstr "nooit" - -#: g10/keylist.c:201 -msgid "Critical signature policy: " -msgstr "Kritisch ondertekenbeleid: " - -#: g10/keylist.c:203 -msgid "Signature policy: " -msgstr "Ondertekenbeleid: " - -#: g10/keylist.c:242 -msgid "Critical preferred keyserver: " -msgstr "" - -#: g10/keylist.c:291 g10/keylist.c:335 -msgid "WARNING: invalid notation data found\n" -msgstr "WAARSCHUWING: ongeldige notatiegegevens gevonden\n" - -#: g10/keylist.c:309 -msgid "Critical signature notation: " -msgstr "Kritische ondertekennotatie: " - -#: g10/keylist.c:311 -msgid "Signature notation: " -msgstr "Ondertekennotatie: " - -#: g10/keylist.c:322 -msgid "not human readable" -msgstr "niet leesbaar voor mensen" - -#: g10/keylist.c:423 -msgid "Keyring" -msgstr "Sleutelbos" - -#: g10/keylist.c:729 -#, fuzzy, c-format -msgid "expired: %s)" -msgstr " [verloopt: %s]" - -#: g10/keylist.c:1431 -msgid "Primary key fingerprint:" -msgstr "Vingerafdruk primaire sleutel:" - -#: g10/keylist.c:1433 -msgid " Subkey fingerprint:" -msgstr " Vingerafdruk deelsleutel:" - -#: g10/keylist.c:1440 -msgid " Primary key fingerprint:" -msgstr " Vingerafdruk primaire sleutel:" - -#: g10/keylist.c:1442 -msgid " Subkey fingerprint:" -msgstr " Vingerafdruk deelsleutel:" - -#: g10/keylist.c:1446 g10/keylist.c:1450 -#, fuzzy -msgid " Key fingerprint =" -msgstr " Vingerafdruk sleutel =" - -#: g10/keylist.c:1517 -msgid " Card serial no. =" -msgstr "" - -#: g10/keyring.c:1245 -#, fuzzy, c-format -msgid "renaming `%s' to `%s' failed: %s\n" -msgstr "bepantseren mislukt: %s\n" - -#: g10/keyring.c:1251 -msgid "WARNING: 2 files with confidential information exists.\n" -msgstr "WAARSCHUWING: 2 bestanden met vertrouwelijke informatie bestaan.\n" - -#: g10/keyring.c:1253 -#, c-format -msgid "%s is the unchanged one\n" -msgstr "%s is de ongewijzigde\n" - -#: g10/keyring.c:1254 -#, c-format -msgid "%s is the new one\n" -msgstr "%s is de nieuwe\n" - -#: g10/keyring.c:1255 -msgid "Please fix this possible security flaw\n" -msgstr "Repareer alstublieft dit mogelijke veiligheidsrisico\n" - -#: g10/keyring.c:1375 -#, fuzzy, c-format -msgid "caching keyring `%s'\n" -msgstr "bezig met controleren sleutelbos `%s'\n" - -#: g10/keyring.c:1421 -#, fuzzy, c-format -msgid "%lu keys cached so far (%lu signatures)\n" -msgstr "%lu sleutels gecontroleerd (%lu ondertekeningen)\n" - -#: g10/keyring.c:1433 -#, fuzzy, c-format -msgid "%lu keys cached (%lu signatures)\n" -msgstr "%lu sleutels gecontroleerd (%lu ondertekeningen)\n" - -#: g10/keyring.c:1504 -#, c-format -msgid "%s: keyring created\n" -msgstr "%s: sleutelbos aangemaakt\n" - -#: g10/keyserver.c:98 -#, fuzzy, c-format -msgid "WARNING: keyserver option `%s' is not used on this platform\n" -msgstr "" -"WAARSCHUWING: opties in `%s' zijn tijdens deze sessie nog niet actief\n" - -#: g10/keyserver.c:378 -#, fuzzy -msgid "disabled" -msgstr "disable" - -#: g10/keyserver.c:579 -msgid "Enter number(s), N)ext, or Q)uit > " -msgstr "" - -#: g10/keyserver.c:662 g10/keyserver.c:1142 -#, fuzzy, c-format -msgid "invalid keyserver protocol (us %d!=handler %d)\n" -msgstr "ongeldige uitvoeropties\n" - -#: g10/keyserver.c:752 -#, fuzzy, c-format -msgid "key \"%s\" not found on keyserver\n" -msgstr "sleutel `%s' niet gevonden: %s\n" - -#: g10/keyserver.c:754 -#, fuzzy -msgid "key not found on keyserver\n" -msgstr "sleutel `%s' niet gevonden: %s\n" - -#: g10/keyserver.c:896 -#, fuzzy, c-format -msgid "requesting key %s from %s server %s\n" -msgstr "bezig met opvragen sleutel %08lX van %s\n" - -#: g10/keyserver.c:900 -#, fuzzy, c-format -msgid "requesting key %s from %s\n" -msgstr "bezig met opvragen sleutel %08lX van %s\n" - -#: g10/keyserver.c:1045 -#, fuzzy, c-format -msgid "sending key %s to %s server %s\n" -msgstr "bezig met zoeken naar \"%s\" bij HKP-server %s\n" - -#: g10/keyserver.c:1049 -#, fuzzy, c-format -msgid "sending key %s to %s\n" -msgstr "" -"\"\n" -"ondertekend met uw sleutel %08lX op %s\n" - -#: g10/keyserver.c:1092 -#, fuzzy, c-format -msgid "searching for \"%s\" from %s server %s\n" -msgstr "bezig met zoeken naar \"%s\" bij HKP-server %s\n" - -#: g10/keyserver.c:1095 -#, fuzzy, c-format -msgid "searching for \"%s\" from %s\n" -msgstr "bezig met zoeken naar \"%s\" bij HKP-server %s\n" - -#: g10/keyserver.c:1102 g10/keyserver.c:1197 -#, fuzzy -msgid "no keyserver action!\n" -msgstr "ongeldige uitvoeropties\n" - -#: g10/keyserver.c:1150 -#, c-format -msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n" -msgstr "" - -#: g10/keyserver.c:1159 -msgid "keyserver did not send VERSION\n" -msgstr "" - -#: g10/keyserver.c:1218 -msgid "no keyserver known (use option --keyserver)\n" -msgstr "" - -#: g10/keyserver.c:1224 -msgid "external keyserver calls are not supported in this build\n" -msgstr "" - -#: g10/keyserver.c:1236 -#, c-format -msgid "no handler for keyserver scheme `%s'\n" -msgstr "" - -#: g10/keyserver.c:1241 -#, c-format -msgid "action `%s' not supported with keyserver scheme `%s'\n" -msgstr "" - -#: g10/keyserver.c:1249 -#, c-format -msgid "gpgkeys_%s does not support handler version %d\n" -msgstr "" - -#: g10/keyserver.c:1254 -#, fuzzy -msgid "keyserver timed out\n" -msgstr "sleutelserverfout" - -#: g10/keyserver.c:1259 -#, fuzzy -msgid "keyserver internal error\n" -msgstr "sleutelserverfout" - -#: g10/keyserver.c:1268 -#, fuzzy, c-format -msgid "keyserver communications error: %s\n" -msgstr "Sleutelaanmaak mislukt: %s\n" - -#: g10/keyserver.c:1293 g10/keyserver.c:1327 -#, c-format -msgid "\"%s\" not a key ID: skipping\n" -msgstr "" - -#: g10/keyserver.c:1578 -#, fuzzy, c-format -msgid "WARNING: unable to refresh key %s via %s: %s\n" -msgstr "WAARSCHUWING: kan tijdelijke bestand (%s) `%s' niet verwijderen: %s\n" - -#: g10/keyserver.c:1600 -#, fuzzy, c-format -msgid "refreshing 1 key from %s\n" -msgstr "bezig met opvragen sleutel %08lX van %s\n" - -#: g10/keyserver.c:1602 -#, fuzzy, c-format -msgid "refreshing %d keys from %s\n" -msgstr "bezig met opvragen sleutel %08lX van %s\n" - -#: g10/mainproc.c:248 -#, c-format -msgid "weird size for an encrypted session key (%d)\n" -msgstr "vreemde grootte voor een gecodeerde sessiesleutel (%d)\n" - -#: g10/mainproc.c:262 -#, fuzzy, c-format -msgid "bad passphrase or unknown cipher algorithm (%d)\n" -msgstr "onbekend codeeralgoritme" - -#: g10/mainproc.c:299 -#, fuzzy, c-format -msgid "%s encrypted session key\n" -msgstr "vreemde grootte voor een gecodeerde sessiesleutel (%d)\n" - -#: g10/mainproc.c:309 -#, fuzzy, c-format -msgid "passphrase generated with unknown digest algorithm %d\n" -msgstr "gecodeerd met onbekend algoritme %d\n" - -#: g10/mainproc.c:373 -#, fuzzy, c-format -msgid "public key is %s\n" -msgstr "openbare sleutel is %08lX\n" - -#: g10/mainproc.c:428 -msgid "public key encrypted data: good DEK\n" -msgstr "openbare sleutel gecodeerde gegevens: goede DEK\n" - -#: g10/mainproc.c:461 -#, fuzzy, c-format -msgid "encrypted with %u-bit %s key, ID %s, created %s\n" -msgstr "gecodeerd met %u-bit %s sleutel, ID %08lX, aangemaakt op %s\n" - -#: g10/mainproc.c:465 g10/pkclist.c:218 -#, fuzzy, c-format -msgid " \"%s\"\n" -msgstr " alias \"" - -#: g10/mainproc.c:469 -#, fuzzy, c-format -msgid "encrypted with %s key, ID %s\n" -msgstr "gecodeerd met %s sleutel, ID %08lX\n" - -#: g10/mainproc.c:483 -#, c-format -msgid "public key decryption failed: %s\n" -msgstr "openbare sleutel decodering mislukt: %s\n" - -#: g10/mainproc.c:497 -#, fuzzy, c-format -msgid "encrypted with %lu passphrases\n" -msgstr "Herhaal wachtwoord\n" - -#: g10/mainproc.c:499 -#, fuzzy -msgid "encrypted with 1 passphrase\n" -msgstr "Herhaal wachtwoord\n" - -#: g10/mainproc.c:527 g10/mainproc.c:549 -#, c-format -msgid "assuming %s encrypted data\n" -msgstr "er wordt aangenomen dat het om %s-gecodeerde gegevens gaat\n" - -#: g10/mainproc.c:535 -#, c-format -msgid "IDEA cipher unavailable, optimistically attempting to use %s instead\n" -msgstr "" -"IDEA-codering niet beschikbaar; er wordt optimistisch in plaats daarvan %s " -"te gebruiken\n" - -#: g10/mainproc.c:567 -msgid "decryption okay\n" -msgstr "decodering goed\n" - -#: g10/mainproc.c:571 -msgid "WARNING: message was not integrity protected\n" -msgstr "WAARSCHUWING: bericht integriteit was niet beschermd\n" - -#: g10/mainproc.c:584 -msgid "WARNING: encrypted message has been manipulated!\n" -msgstr "WAARSCHUWING: het gecodeerde bericht is gemanipuleerd!\n" - -#: g10/mainproc.c:590 -#, c-format -msgid "decryption failed: %s\n" -msgstr "decodering mislukt: %s\n" - -#: g10/mainproc.c:610 -msgid "NOTE: sender requested \"for-your-eyes-only\"\n" -msgstr "LET OP: verzender heeft gevraagd om \"alleen-voor-uw-ogen\"\n" - -#: g10/mainproc.c:612 -#, c-format -msgid "original file name='%.*s'\n" -msgstr "oorspronkelijke bestandsnaam='%.*s'\n" - -#: g10/mainproc.c:784 -msgid "standalone revocation - use \"gpg --import\" to apply\n" -msgstr "losstaande herroeping - gebruik \"gpg --import\" om toe te passen\n" - -#: g10/mainproc.c:1288 -msgid "signature verification suppressed\n" -msgstr "verificatie van ondertekening onderdrukt\n" - -#: g10/mainproc.c:1330 g10/mainproc.c:1340 -msgid "can't handle these multiple signatures\n" -msgstr "kan deze meervoudige ondertekeningen niet verwerken\n" - -#: g10/mainproc.c:1350 -#, fuzzy, c-format -msgid "Signature made %s\n" -msgstr "Ondertekening verlopen %s\n" - -#: g10/mainproc.c:1351 -#, fuzzy, c-format -msgid " using %s key %s\n" -msgstr " alias \"" - -#: g10/mainproc.c:1355 -#, fuzzy, c-format -msgid "Signature made %s using %s key ID %s\n" -msgstr "Ondertekening gemaakt op %.*s met %s sleutel ID %08lX\n" - -#: g10/mainproc.c:1375 -#, fuzzy -msgid "Key available at: " -msgstr "Geen hulp beschikbaar" - -#: g10/mainproc.c:1480 g10/mainproc.c:1528 -#, fuzzy, c-format -msgid "BAD signature from \"%s\"" -msgstr "SLECHTE ondertekening van \"" - -#: g10/mainproc.c:1482 g10/mainproc.c:1530 -#, fuzzy, c-format -msgid "Expired signature from \"%s\"" -msgstr "Verlopen ondertekening van \"" - -#: g10/mainproc.c:1484 g10/mainproc.c:1532 -#, fuzzy, c-format -msgid "Good signature from \"%s\"" -msgstr "Goede ondertekening van \"" - -#: g10/mainproc.c:1536 -msgid "[uncertain]" -msgstr "[onzeker]" - -#: g10/mainproc.c:1568 -#, fuzzy, c-format -msgid " aka \"%s\"" -msgstr " alias \"" - -#: g10/mainproc.c:1662 -#, c-format -msgid "Signature expired %s\n" -msgstr "Ondertekening verlopen %s\n" - -#: g10/mainproc.c:1667 -#, c-format -msgid "Signature expires %s\n" -msgstr "Ondertekening verloopt %s\n" - -#: g10/mainproc.c:1670 -#, c-format -msgid "%s signature, digest algorithm %s\n" -msgstr "%s ondertekeing, digest-algoritme %s\n" - -#: g10/mainproc.c:1671 -msgid "binary" -msgstr "binair" - -#: g10/mainproc.c:1672 -msgid "textmode" -msgstr "tekstmodus" - -#: g10/mainproc.c:1672 g10/trustdb.c:499 -msgid "unknown" -msgstr "onbekend" - -#: g10/mainproc.c:1692 -#, c-format -msgid "Can't check signature: %s\n" -msgstr "Kan ondertekening niet controleren: %s\n" - -#: g10/mainproc.c:1760 g10/mainproc.c:1776 g10/mainproc.c:1862 -msgid "not a detached signature\n" -msgstr "geen losgekoppelde ondertekening\n" - -#: g10/mainproc.c:1803 -msgid "" -"WARNING: multiple signatures detected. Only the first will be checked.\n" -msgstr "" -"WAARSCHUWING: meerdere ondertekeningen gevonden. Alleen de eerste wordt " -"gecontroleerd.\n" - -#: g10/mainproc.c:1811 -#, c-format -msgid "standalone signature of class 0x%02x\n" -msgstr "losstaande ondertekening van klasse 0x%02x\n" - -#: g10/mainproc.c:1868 -msgid "old style (PGP 2.x) signature\n" -msgstr "oude stijl (PGP 2.x) ondertekening\n" - -#: g10/mainproc.c:1878 -msgid "invalid root packet detected in proc_tree()\n" -msgstr "ongeldig root-pakket gevonden in proc_tree()\n" - -#: g10/misc.c:101 -#, c-format -msgid "can't disable core dumps: %s\n" -msgstr "kan geheugendumps niet uit zetten: %s\n" - -#: g10/misc.c:121 g10/misc.c:149 g10/misc.c:221 -#, fuzzy, c-format -msgid "fstat of `%s' failed in %s: %s\n" -msgstr "kan bestand niet openen: %s\n" - -#: g10/misc.c:186 -#, fuzzy, c-format -msgid "fstat(%d) failed in %s: %s\n" -msgstr "trustdb: lezen mislukt (n=%d): %s\n" - -#: g10/misc.c:294 -msgid "Experimental algorithms should not be used!\n" -msgstr "Experimentele algoritme moeten niet worden gebruikt!\n" - -#: g10/misc.c:324 -msgid "this cipher algorithm is deprecated; please use a more standard one!\n" -msgstr "" -"dit coderingsalgoritme wordt afgeraden; gebruik alstublieft een wat " -"normalere!\n" - -#: g10/misc.c:430 -msgid "the IDEA cipher plugin is not present\n" -msgstr "de IDEA-coderingsplug-in is niet aanwezig\n" - -#: g10/misc.c:431 -msgid "" -"please see http://www.gnupg.org/why-not-idea.html for more information\n" -msgstr "" -"zie alstublieft http://www.gnupg.org/why-not-idea.html voor meer informatie\n" - -#: g10/misc.c:664 -#, c-format -msgid "%s:%d: deprecated option \"%s\"\n" -msgstr "%s:%d: afgeraden optie \"%s\"\n" - -#: g10/misc.c:668 -#, c-format -msgid "WARNING: \"%s\" is a deprecated option\n" -msgstr "WAARSCHUWING: \"%s\" is een afgeraden optie\n" - -#: g10/misc.c:670 -#, c-format -msgid "please use \"%s%s\" instead\n" -msgstr "gebruik alstublieft \"%s%s\"\n" - -#: g10/misc.c:681 -#, fuzzy -msgid "Uncompressed" -msgstr "niet verwerkt" - -#: g10/misc.c:706 -#, fuzzy -msgid "uncompressed|none" -msgstr "niet verwerkt" - -#: g10/misc.c:816 -#, c-format -msgid "this message may not be usable by %s\n" -msgstr "dit bericht is mogelijk niet bruikbaar voor %s\n" - -#: g10/misc.c:973 -#, fuzzy, c-format -msgid "ambiguous option `%s'\n" -msgstr "bezig met lezen opties uit `%s'\n" - -#: g10/misc.c:998 -#, fuzzy, c-format -msgid "unknown option `%s'\n" -msgstr "onbekende standaard ontvanger `%s'\n" - -#: g10/openfile.c:84 -#, c-format -msgid "File `%s' exists. " -msgstr "Bestand `%s' bestaat. " - -#: g10/openfile.c:86 -#, fuzzy -msgid "Overwrite? (y/N) " -msgstr "Overschrijven (j/N)? " - -#: g10/openfile.c:119 -#, c-format -msgid "%s: unknown suffix\n" -msgstr "%s: onbekend achtervoegsel\n" - -#: g10/openfile.c:141 -msgid "Enter new filename" -msgstr "Geef nieuwe bestandsnaam" - -#: g10/openfile.c:184 -msgid "writing to stdout\n" -msgstr "bezig met schrijven naar standaard uitvoer\n" - -#: g10/openfile.c:296 -#, c-format -msgid "assuming signed data in `%s'\n" -msgstr "er wordt aangenomen dat het in `%s' om ondertekende gegevens gaat\n" - -#: g10/openfile.c:375 -#, c-format -msgid "new configuration file `%s' created\n" -msgstr "nieuw configuratiebestand `%s' aangemaakt\n" - -#: g10/openfile.c:377 -#, c-format -msgid "WARNING: options in `%s' are not yet active during this run\n" -msgstr "" -"WAARSCHUWING: opties in `%s' zijn tijdens deze sessie nog niet actief\n" - -#: g10/openfile.c:409 -#, fuzzy, c-format -msgid "directory `%s' created\n" -msgstr "%s: map aangemaakt\n" - -#: g10/parse-packet.c:119 -#, c-format -msgid "can't handle public key algorithm %d\n" -msgstr "kan openbare sleutel algoritme %d niet behandelen\n" - -#: g10/parse-packet.c:688 -msgid "WARNING: potentially insecure symmetrically encrypted session key\n" -msgstr "" - -#: g10/parse-packet.c:1112 -#, c-format -msgid "subpacket of type %d has critical bit set\n" -msgstr "deelpakket van soort %d heeft kritische bit ingesteld\n" - -#: g10/passphrase.c:465 g10/passphrase.c:512 -msgid "gpg-agent is not available in this session\n" -msgstr "gpg-agent is niet beschikbaar in deze sessie\n" - -#: g10/passphrase.c:473 -msgid "can't set client pid for the agent\n" -msgstr "kan PID voor agent niet instellen\n" - -#: g10/passphrase.c:481 -msgid "can't get server read FD for the agent\n" -msgstr "" - -#: g10/passphrase.c:488 -msgid "can't get server write FD for the agent\n" -msgstr "" - -#: g10/passphrase.c:521 -msgid "malformed GPG_AGENT_INFO environment variable\n" -msgstr "misvormde GPG_AGENT_INFO omgevingsvariabele\n" - -#: g10/passphrase.c:534 -#, c-format -msgid "gpg-agent protocol version %d is not supported\n" -msgstr "gpg-agent protocol versie %d wordt niet ondersteund\n" - -#: g10/passphrase.c:555 -#, c-format -msgid "can't connect to `%s': %s\n" -msgstr "kan niet verbinden met `%s': %s\n" - -#: g10/passphrase.c:577 -msgid "communication problem with gpg-agent\n" -msgstr "communicatieprobleem met gpg-agent\n" - -#: g10/passphrase.c:584 g10/passphrase.c:892 g10/passphrase.c:1004 -msgid "problem with the agent - disabling agent use\n" -msgstr "probleem met de agent - gebruik van agent uit gezet\n" - -#: g10/passphrase.c:684 g10/passphrase.c:1160 -#, fuzzy, c-format -msgid " (main key ID %s)" -msgstr " (hoofdsleutel ID %08lX)" - -#: g10/passphrase.c:698 -#, 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 "" -"U heeft een wachtwoord nodig om de geheime sleutel te ontgrendelen voor " -"gebruiker:\n" -"\"%.*s\"\n" -"%u-bit %s sleutel, ID %08lX, gemaakt op %s%s\n" - -#: g10/passphrase.c:723 -msgid "Repeat passphrase\n" -msgstr "Herhaal wachtwoord\n" - -#: g10/passphrase.c:725 -msgid "Enter passphrase\n" -msgstr "Geef wachtwoord\n" - -#: g10/passphrase.c:763 -msgid "passphrase too long\n" -msgstr "wachtwoord te lang\n" - -#: g10/passphrase.c:776 -msgid "invalid response from agent\n" -msgstr "ongeldig antwoord van agent\n" - -#: g10/passphrase.c:791 g10/passphrase.c:886 -msgid "cancelled by user\n" -msgstr "geannuleerd door gebruiker\n" - -#: g10/passphrase.c:796 g10/passphrase.c:975 -#, c-format -msgid "problem with the agent: agent returns 0x%lx\n" -msgstr "probleem met agent: agent geeft 0x%lx terug\n" - -#: g10/passphrase.c:1053 g10/passphrase.c:1212 -#, fuzzy -msgid "can't query passphrase in batch mode\n" -msgstr "kan niet vragen om wachtwoord in batch-modus\n" - -#: g10/passphrase.c:1058 g10/passphrase.c:1217 -msgid "Enter passphrase: " -msgstr "Geef wachtwoord: " - -#: g10/passphrase.c:1141 -#, fuzzy, c-format -msgid "" -"You need a passphrase to unlock the secret key for\n" -"user: \"%s\"\n" -msgstr "" -"\n" -"U heeft een wachtwoord nodig om de geheime sleutel\n" -"voor de gebruiker te ontgrendelen: \"" - -#: g10/passphrase.c:1147 -#, fuzzy, c-format -msgid "%u-bit %s key, ID %s, created %s" -msgstr "%u-bit %s sleutel, ID %08lX, gemaakt op %s" - -#: g10/passphrase.c:1156 -#, c-format -msgid " (subkey on main key ID %s)" -msgstr "" - -#: g10/passphrase.c:1221 -msgid "Repeat passphrase: " -msgstr "Herhaal wachtwoord: " - -#: g10/photoid.c:66 -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" -"Kies een afbeelding om te gebruiken als uw foto ID. De afbeelding moet een\n" -"JPEG-bestand zijn. Bedenk dat deze afbeelding bewaard wordt in uw openbare\n" -"sleutel. Als u een hele grote afbeelding gebruikt, wordt uw sleutel ook " -"erg\n" -"groot! Een afbeeldingsgrootte dichtbij 240x288 is het best.\n" - -#: g10/photoid.c:80 -msgid "Enter JPEG filename for photo ID: " -msgstr "Geef JPEG-bestandsnaam voor foto ID: " - -#: g10/photoid.c:94 -#, fuzzy, c-format -msgid "unable to open JPEG file `%s': %s\n" -msgstr "kan bestand niet openen: %s\n" - -#: g10/photoid.c:102 -#, c-format -msgid "This JPEG is really large (%d bytes) !\n" -msgstr "" - -#: g10/photoid.c:104 -#, fuzzy -msgid "Are you sure you want to use it? (y/N) " -msgstr "Weet u zeker dat u deze wilt gebruiken (j/N)? " - -#: g10/photoid.c:119 -#, fuzzy, c-format -msgid "`%s' is not a JPEG file\n" -msgstr "\"%s\" is geen JPEG-bestand\n" - -#: g10/photoid.c:136 -msgid "Is this photo correct (y/N/q)? " -msgstr "Is deze foto goed (j/N/q)? " - -#: g10/photoid.c:338 -msgid "unable to display photo ID!\n" -msgstr "kan foto ID niet weergeven!\n" - -#: g10/pkclist.c:61 g10/revoke.c:580 -msgid "No reason specified" -msgstr "Geen reden opgegeven" - -#: g10/pkclist.c:63 g10/revoke.c:582 -msgid "Key is superseded" -msgstr "Sleutel is achterhaald" - -#: g10/pkclist.c:65 g10/revoke.c:581 -msgid "Key has been compromised" -msgstr "Sleutel is in gevaar gebracht" - -#: g10/pkclist.c:67 g10/revoke.c:583 -msgid "Key is no longer used" -msgstr "Sleutel wordt niet meer gebruikt" - -#: g10/pkclist.c:69 g10/revoke.c:584 -msgid "User ID is no longer valid" -msgstr "Gebruikerscode is niet langer geldig" - -#: g10/pkclist.c:73 -msgid "reason for revocation: " -msgstr "reden voor herroeping: " - -#: g10/pkclist.c:90 -msgid "revocation comment: " -msgstr "herroepingsopmerking: " - -#: g10/pkclist.c:205 -msgid "iImMqQsS" -msgstr "iImMqQsS" - -#: g10/pkclist.c:213 -#, fuzzy -msgid "No trust value assigned to:\n" -msgstr "" -"Geen vertrouwenswaarde toegewezen aan:\n" -"%4u%c/%08lX %s \"" - -#: g10/pkclist.c:245 -#, fuzzy, c-format -msgid " aka \"%s\"\n" -msgstr " alias \"" - -#: g10/pkclist.c:255 -#, fuzzy -msgid "" -"How much do you trust that this key actually belongs to the named user?\n" -msgstr "Deze sleutel is waarschijnlijk van de eigenaar\n" - -#: g10/pkclist.c:270 -#, fuzzy, c-format -msgid " %d = I don't know or won't say\n" -msgstr " %d = Weet niet\n" - -#: g10/pkclist.c:272 -#, fuzzy, c-format -msgid " %d = I do NOT trust\n" -msgstr " %d = Ik vertrouw NIET\n" - -#: g10/pkclist.c:278 -#, fuzzy, c-format -msgid " %d = I trust ultimately\n" -msgstr " %d = Ik vertrouw maximaal\n" - -#: g10/pkclist.c:284 -#, fuzzy -msgid " m = back to the main menu\n" -msgstr " m = terug naar het hoofdmenu\n" - -#: g10/pkclist.c:287 -#, fuzzy -msgid " s = skip this key\n" -msgstr " s = deze sleutel overslaan\n" - -#: g10/pkclist.c:288 -#, fuzzy -msgid " q = quit\n" -msgstr " q = afsluiten\n" - -#: g10/pkclist.c:292 -#, c-format -msgid "" -"The minimum trust level for this key is: %s\n" -"\n" -msgstr "" - -#: g10/pkclist.c:298 g10/revoke.c:609 -msgid "Your decision? " -msgstr "Uw beslissing? " - -#: g10/pkclist.c:319 -#, fuzzy -msgid "Do you really want to set this key to ultimate trust? (y/N) " -msgstr "Wilt u deze sleutel echt maximaal vertrouwen? " - -#: g10/pkclist.c:333 -msgid "Certificates leading to an ultimately trusted key:\n" -msgstr "Certificaten die leiden tot een maximaal vertrouwde sleutel:\n" - -#: g10/pkclist.c:418 -#, fuzzy, c-format -msgid "%s: There is no assurance this key belongs to the named user\n" -msgstr "" -"%08lX: Er is geen aanwijzing dat deze sleutel echt van de eigenaar is\n" - -#: g10/pkclist.c:423 -#, fuzzy, c-format -msgid "%s: There is limited assurance this key belongs to the named user\n" -msgstr "" -"%08lX: Er is geen aanwijzing dat deze sleutel echt van de eigenaar is\n" - -#: g10/pkclist.c:429 -#, fuzzy -msgid "This key probably belongs to the named user\n" -msgstr "Deze sleutel is waarschijnlijk van de eigenaar\n" - -#: g10/pkclist.c:434 -msgid "This key belongs to us\n" -msgstr "Deze sleutel is van ons\n" - -#: g10/pkclist.c:460 -#, 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 "" -"Het is NIET zeker dat deze sleutel echt van de persoon is die\n" -"in de gebruikerscode staat. Als u *echt* weet wat u doet, kunt\n" -"u de volgende vraag met ja beantwoorden\n" -"\n" - -#: g10/pkclist.c:467 -#, fuzzy -msgid "Use this key anyway? (y/N) " -msgstr "Toch deze sleutel gebruiken? " - -#: g10/pkclist.c:501 -msgid "WARNING: Using untrusted key!\n" -msgstr "WAARSCHUWING: Er wordt een niet-vertrouwde sleutel gebruikt!\n" - -#: g10/pkclist.c:508 -#, fuzzy -msgid "WARNING: this key might be revoked (revocation key not present)\n" -msgstr "" -"WAARSCHUWING: sleutel %08lX kan herroepen zijn: herroepingssleutel %08lX " -"niet aanwezig.\n" - -#: g10/pkclist.c:517 -#, fuzzy -msgid "WARNING: This key has been revoked by its designated revoker!\n" -msgstr "WAARSCHUWING: Deze sleutel is herroepen door zijn eigenaar!\n" - -#: g10/pkclist.c:520 -msgid "WARNING: This key has been revoked by its owner!\n" -msgstr "WAARSCHUWING: Deze sleutel is herroepen door zijn eigenaar!\n" - -#: g10/pkclist.c:521 -#, fuzzy -msgid " This could mean that the signature is forged.\n" -msgstr " Dit kan betekenen dat de ondertekening een vervalsing is.\n" - -#: g10/pkclist.c:527 -msgid "WARNING: This subkey has been revoked by its owner!\n" -msgstr "WAARSCHUWING: Deze deelsleutel is herroepen door zijn eigenaar!\n" - -#: g10/pkclist.c:532 -msgid "Note: This key has been disabled.\n" -msgstr "Let op: Deze sleutel is uit gezet.\n" - -#: g10/pkclist.c:537 -msgid "Note: This key has expired!\n" -msgstr "Let op: Deze sleutel is verlopen!\n" - -#: g10/pkclist.c:548 -msgid "WARNING: This key is not certified with a trusted signature!\n" -msgstr "" -"WAARSCHUWING: Deze sleutel is niet gecertificeerd met een vertrouwde " -"ondertekening!\n" - -#: g10/pkclist.c:550 -msgid "" -" There is no indication that the signature belongs to the owner.\n" -msgstr "" -" Er is geen aanwijzing dat de ondertekening is van de eigenaar.\n" - -#: g10/pkclist.c:558 -msgid "WARNING: We do NOT trust this key!\n" -msgstr "WAARSCHUWING: Vertrouw deze sleutel NIET!\n" - -#: g10/pkclist.c:559 -msgid " The signature is probably a FORGERY.\n" -msgstr " De ondertekening is waarschijnlijk VERVALST.\n" - -#: g10/pkclist.c:567 -msgid "" -"WARNING: This key is not certified with sufficiently trusted signatures!\n" -msgstr "" -"WAARSCHUWING: Deze sleutel is niet gecertificeerd met voldoende vertrouwde " -"ondertekeningen!\n" - -#: g10/pkclist.c:569 -msgid " It is not certain that the signature belongs to the owner.\n" -msgstr " Het is niet zeker dat de ondertekening is van de eigenaar.\n" - -#: g10/pkclist.c:734 g10/pkclist.c:767 g10/pkclist.c:936 g10/pkclist.c:996 -#, c-format -msgid "%s: skipped: %s\n" -msgstr "%s: overgeslagen: %s\n" - -#: g10/pkclist.c:744 g10/pkclist.c:968 -#, c-format -msgid "%s: skipped: public key already present\n" -msgstr "%s: overgeslagen: openbare sleutel reeds aanwezig\n" - -#: g10/pkclist.c:786 -msgid "You did not specify a user ID. (you may use \"-r\")\n" -msgstr "U heeft geen gebruikerscode opgegeven. (u kunt \"-r\" gebruiken)\n" - -#: g10/pkclist.c:802 -msgid "Current recipients:\n" -msgstr "" - -#: g10/pkclist.c:828 -msgid "" -"\n" -"Enter the user ID. End with an empty line: " -msgstr "" -"\n" -"Geef een gebruikerscode. Eindig met een lege regel: " - -#: g10/pkclist.c:844 -msgid "No such user ID.\n" -msgstr "Gebruikerscode niet gevonden.\n" - -#: g10/pkclist.c:849 g10/pkclist.c:911 -msgid "skipped: public key already set as default recipient\n" -msgstr "" -"overgeslagen: openbare sleutel reeds ingesteld als standaard ontvanger\n" - -#: g10/pkclist.c:867 -msgid "Public key is disabled.\n" -msgstr "Openbare sleutel is uit gezet.\n" - -#: g10/pkclist.c:874 -msgid "skipped: public key already set\n" -msgstr "overgeslagen: openbare sleutel reeds ingesteld\n" - -#: g10/pkclist.c:903 -#, fuzzy, c-format -msgid "unknown default recipient \"%s\"\n" -msgstr "onbekende standaard ontvanger `%s'\n" - -#: g10/pkclist.c:948 -#, c-format -msgid "%s: skipped: public key is disabled\n" -msgstr "%s: overgeslagen: openbare sleutel is uit gezet\n" - -#: g10/pkclist.c:1003 -msgid "no valid addressees\n" -msgstr "geen geldige geadresseerden\n" - -#: g10/plaintext.c:90 -msgid "data not saved; use option \"--output\" to save it\n" -msgstr "" -"gegevens niet opgeslagen; gebruik optie \"--output\" om gegevens op te " -"slaan\n" - -#: g10/plaintext.c:134 g10/plaintext.c:139 g10/plaintext.c:157 -#, c-format -msgid "error creating `%s': %s\n" -msgstr "fout bij maken `%s': %s\n" - -#: g10/plaintext.c:445 -msgid "Detached signature.\n" -msgstr "Losgekoppelde ondertekening.\n" - -#: g10/plaintext.c:449 -msgid "Please enter name of data file: " -msgstr "Geef bestandsnaam van gegevensbestand: " - -#: g10/plaintext.c:477 -msgid "reading stdin ...\n" -msgstr "bezig met lezen standaard invoer...\n" - -#: g10/plaintext.c:511 -msgid "no signed data\n" -msgstr "geen ondertekende gegevens\n" - -#: g10/plaintext.c:525 -#, c-format -msgid "can't open signed data `%s'\n" -msgstr "kan ondertekende gegevens `%s' niet openen\n" - -#: g10/pubkey-enc.c:103 -#, fuzzy, c-format -msgid "anonymous recipient; trying secret key %s ...\n" -msgstr "anonieme ontvanger; geheime sleutel %08lX wordt geprobeerd...\n" - -#: g10/pubkey-enc.c:119 -msgid "okay, we are the anonymous recipient.\n" -msgstr "goed, we zijn de anonieme ontvanger.\n" - -#: g10/pubkey-enc.c:207 -msgid "old encoding of the DEK is not supported\n" -msgstr "oude codering van DEK wordt niet ondersteund\n" - -#: g10/pubkey-enc.c:228 -#, c-format -msgid "cipher algorithm %d%s is unknown or disabled\n" -msgstr "coderingsalgoritme %d%s is onbekend of uit gezet\n" - -#: g10/pubkey-enc.c:266 -#, fuzzy, c-format -msgid "WARNING: cipher algorithm %s not found in recipient preferences\n" -msgstr "LET OP: coderingsalgoritme %d niet gevonden in voorkeuren\n" - -#: g10/pubkey-enc.c:286 -#, fuzzy, c-format -msgid "NOTE: secret key %s expired at %s\n" -msgstr "LET OP: geheime sleutel %08lX verlopen op %s\n" - -#: g10/pubkey-enc.c:292 -msgid "NOTE: key has been revoked" -msgstr "LET OP: sleutel is herroepen" - -#: g10/revoke.c:103 g10/revoke.c:117 g10/revoke.c:129 g10/revoke.c:175 -#: g10/revoke.c:187 g10/revoke.c:545 -#, c-format -msgid "build_packet failed: %s\n" -msgstr "build_packet mislukt: %s\n" - -#: g10/revoke.c:146 -#, fuzzy, c-format -msgid "key %s has no user IDs\n" -msgstr "sleutel %08lX: gebruikerscode niet gevonden\n" - -#: g10/revoke.c:272 -msgid "To be revoked by:\n" -msgstr "Zal worden herroepen door:\n" - -#: g10/revoke.c:276 -msgid "(This is a sensitive revocation key)\n" -msgstr "(Dit is een gevoelige herroepingssleutel)\n" - -#: g10/revoke.c:280 -#, fuzzy -msgid "Create a designated revocation certificate for this key? (y/N) " -msgstr "Wilt u een herroepingscertificaat aanmaken voor deze sleutel? " - -#: g10/revoke.c:293 g10/revoke.c:511 -msgid "ASCII armored output forced.\n" -msgstr "ASCII-bepantserde uitvoer afgedwongen.\n" - -#: g10/revoke.c:307 g10/revoke.c:525 -#, c-format -msgid "make_keysig_packet failed: %s\n" -msgstr "make_keysig_packet mislukt: %s\n" - -#: g10/revoke.c:370 -msgid "Revocation certificate created.\n" -msgstr "Herroepingscertificaat aangemaakt.\n" - -#: g10/revoke.c:376 -#, fuzzy, c-format -msgid "no revocation keys found for \"%s\"\n" -msgstr "geen herroepingssleutels gevonden voor `%s'\n" - -#: g10/revoke.c:432 -#, fuzzy, c-format -msgid "secret key \"%s\" not found: %s\n" -msgstr "geheime sleutel `%s' niet gevonden: %s\n" - -#: g10/revoke.c:461 -#, c-format -msgid "no corresponding public key: %s\n" -msgstr "geen geassocieerde openbare sleutel: %s\n" - -#: g10/revoke.c:472 -msgid "public key does not match secret key!\n" -msgstr "openbare sleutel komt niet overeen met geheime sleutel!\n" - -#: g10/revoke.c:479 -#, fuzzy -msgid "Create a revocation certificate for this key? (y/N) " -msgstr "Wilt u een herroepingscertificaat aanmaken voor deze sleutel? " - -#: g10/revoke.c:496 -msgid "unknown protection algorithm\n" -msgstr "onbekend beschermingsalgoritme\n" - -#: g10/revoke.c:500 -msgid "NOTE: This key is not protected!\n" -msgstr "LET OP: deze sleutel wordt niet beschermd!\n" - -#: g10/revoke.c:551 -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 "" -"Herroepingscertificaat aangemaakt.\n" -"\n" -"Bewaar het alstublieft op een medium dat u kunt verstoppen; als boze\n" -"Gijs er toegang toe krijgt, kan hij het gebruiken om uw sleutel onbruikbaar\n" -"te maken. Het is slim om dit certificaat af te drukken en te verstoppen, in\n" -"het geval dat het medium onleesbaar wordt. Maar pas wel op: uw afdruk-\n" -"systeem bewaart mogelijk de gegevens en maakt ze beschikbaar voor\n" -"anderen!\n" - -#: g10/revoke.c:592 -msgid "Please select the reason for the revocation:\n" -msgstr "Kies alstublieft een reden voor de herroeping:\n" - -#: g10/revoke.c:602 -msgid "Cancel" -msgstr "Annuleren" - -#: g10/revoke.c:604 -#, c-format -msgid "(Probably you want to select %d here)\n" -msgstr "(Waarschijnlijk wilt u hier %d kiezen)\n" - -#: g10/revoke.c:645 -msgid "Enter an optional description; end it with an empty line:\n" -msgstr "Geef een optionele beschrijving; eindig met een lege regel:\n" - -#: g10/revoke.c:673 -#, c-format -msgid "Reason for revocation: %s\n" -msgstr "Reden voor herroeping: %s\n" - -#: g10/revoke.c:675 -msgid "(No description given)\n" -msgstr "(Geen beschrijving gegeven)\n" - -#: g10/revoke.c:680 -#, fuzzy -msgid "Is this okay? (y/N) " -msgstr "Is dit goed? " - -#: g10/seckey-cert.c:54 -msgid "secret key parts are not available\n" -msgstr "delen geheime sleutel zijn niet beschikbaar\n" - -#: g10/seckey-cert.c:60 -#, c-format -msgid "protection algorithm %d%s is not supported\n" -msgstr "beschermingsalgoritme %d%s wordt niet ondersteund\n" - -#: g10/seckey-cert.c:71 -#, fuzzy, c-format -msgid "protection digest %d is not supported\n" -msgstr "beschermingsalgoritme %d%s wordt niet ondersteund\n" - -#: g10/seckey-cert.c:250 -msgid "Invalid passphrase; please try again" -msgstr "Ongeldig wachtwoord; probeer alstublieft opnieuw" - -#: g10/seckey-cert.c:251 -#, c-format -msgid "%s ...\n" -msgstr "%s...\n" - -#: g10/seckey-cert.c:311 -msgid "WARNING: Weak key detected - please change passphrase again.\n" -msgstr "" -"WAARSCHUWING: Zwakke sleutel gevonden - wijzig alstublieft het wachtwoord " -"opnieuw.\n" - -#: g10/seckey-cert.c:349 -msgid "generating the deprecated 16-bit checksum for secret key protection\n" -msgstr "" -"er wordt een afgeraden 16-bit controlesom gegenereerd om te geheime sleutel " -"te beschermen\n" - -#: g10/seskey.c:52 -msgid "weak key created - retrying\n" -msgstr "zwakke sleutel aangemaakt - bezig met opnieuw proberen\n" - -#: g10/seskey.c:57 -#, c-format -msgid "cannot avoid weak key for symmetric cipher; tried %d times!\n" -msgstr "" -"kan zwakke sleutel voor symmetrische codering niet vermijden; %d keer " -"geprobeerd!\n" - -#: g10/seskey.c:213 -msgid "DSA requires the use of a 160 bit hash algorithm\n" -msgstr "DSA vereist het gebruik van een 160-bits hash-algoritme\n" - -#: g10/sig-check.c:75 -msgid "WARNING: signature digest conflict in message\n" -msgstr "WAARSCHUWING: ondertekening en digest conflicteren in bericht\n" - -#: g10/sig-check.c:99 -#, c-format -msgid "WARNING: signing subkey %s is not cross-certified\n" -msgstr "" - -#: g10/sig-check.c:102 -#, fuzzy, c-format -msgid "WARNING: signing subkey %s has an invalid cross-certification\n" -msgstr "" -"WAARSCHUWING: het aanwijzen van een sleutel als een aangestelde herroeper " -"kan niet ongedaan gemaakt worden!\n" - -#: g10/sig-check.c:168 -#, fuzzy, c-format -msgid "public key %s is %lu second newer than the signature\n" -msgstr "openbare sleutel %08lX is %lu seconde nieuwer dan de ondertekening\n" - -#: g10/sig-check.c:169 -#, fuzzy, c-format -msgid "public key %s is %lu seconds newer than the signature\n" -msgstr "openbare sleutel %08lX is %lu seconden nieuwer dan de ondertekening\n" - -#: g10/sig-check.c:180 -#, fuzzy, c-format -msgid "" -"key %s was created %lu second in the future (time warp or clock problem)\n" -msgstr "" -"sleutel is %lu seconde in de toekomst aangemaakt (tijdsreis of " -"klokprobleem)\n" - -#: g10/sig-check.c:182 -#, fuzzy, c-format -msgid "" -"key %s was created %lu seconds in the future (time warp or clock problem)\n" -msgstr "" -"sleutel is %lu seconden in de toekomst aangemaakt (tijdsreis of " -"klokprobleem)\n" - -#: g10/sig-check.c:192 -#, fuzzy, c-format -msgid "NOTE: signature key %s expired %s\n" -msgstr "LET OP: ondertekening van sleutel %08lX verlopen op %s\n" - -#: g10/sig-check.c:275 -#, fuzzy, c-format -msgid "assuming bad signature from key %s due to an unknown critical bit\n" -msgstr "" -"er wordt aangenomen dat de ondertekening van sleutel %08lX slecht is, " -"vanwege een onbekende kritische bit\n" - -#: g10/sig-check.c:532 -#, fuzzy, c-format -msgid "key %s: no subkey for subkey revocation signature\n" -msgstr "sleutel %08lX: geen deelsleutel voor deelsleutel-herroepingspakket\n" - -#: g10/sig-check.c:558 -#, fuzzy, c-format -msgid "key %s: no subkey for subkey binding signature\n" -msgstr "sleutel %08lX: geen deelsleutel voor sleutelkoppeling\n" - -#: g10/sign.c:85 -msgid "can't put notation data into v3 (PGP 2.x style) signatures\n" -msgstr "" -"kan geen notatiegegevens in v3 (PGP 2.x stijl) ondertekeningen stoppen\n" - -#: g10/sign.c:93 -msgid "can't put notation data into v3 (PGP 2.x style) key signatures\n" -msgstr "" -"kan geen notatiegegevens in v3 (PGP 2.x stijl) sleutelondertekeningen " -"stoppen\n" - -#: g10/sign.c:112 -#, c-format -msgid "WARNING: unable to %%-expand notation (too large). Using unexpanded.\n" -msgstr "" -"WAARSCHUWING: kan notatie niet %%-uitbreiden (te groot). Niet uitgebreide " -"versie wordt gebruikt.\n" - -#: g10/sign.c:138 -msgid "can't put a policy URL into v3 (PGP 2.x style) signatures\n" -msgstr "kan geen beleid-URL in v3 (PGP 2.x stijl) ondertekeningen stoppen\n" - -#: g10/sign.c:146 -msgid "can't put a policy URL into v3 key (PGP 2.x style) signatures\n" -msgstr "kan geen beleid-URL in v3 (PGP 2.x stijl) ondertekeningen stoppen\n" - -#: g10/sign.c:159 -#, fuzzy, c-format -msgid "" -"WARNING: unable to %%-expand policy URL (too large). Using unexpanded.\n" -msgstr "" -"WAARSCHUWING: kan beleid-URL niet %%-uitbreiden (te groot). Niet " -"uitgebreide versie wordt gebruikt.\n" - -#: g10/sign.c:187 -#, fuzzy, c-format -msgid "" -"WARNING: unable to %%-expand preferred keyserver URL (too large). Using " -"unexpanded.\n" -msgstr "" -"WAARSCHUWING: kan beleid-URL niet %%-uitbreiden (te groot). Niet " -"uitgebreide versie wordt gebruikt.\n" - -#: g10/sign.c:364 -#, c-format -msgid "checking created signature failed: %s\n" -msgstr "het controleren van de aangemaakte ondertekening is mislukt: %s\n" - -#: g10/sign.c:373 -#, fuzzy, c-format -msgid "%s/%s signature from: \"%s\"\n" -msgstr "%s ondertekening van: \"%s\"\n" - -#: g10/sign.c:741 -msgid "you can only detach-sign with PGP 2.x style keys while in --pgp2 mode\n" -msgstr "" -"u kunt alleen losgekoppeld ondertekenen met PGP 2.x stijl sleutels in in --" -"pgp2 modus\n" - -#: g10/sign.c:808 -#, fuzzy, c-format -msgid "" -"WARNING: forcing digest algorithm %s (%d) violates recipient preferences\n" -msgstr "" -"afdwingen van digest-algoritme %s (%d) overtreedt voorkeuren ontvanger\n" - -#: g10/sign.c:900 -msgid "signing:" -msgstr "bezig met ondertekenen:" - -#: g10/sign.c:1007 -msgid "you can only clearsign with PGP 2.x style keys while in --pgp2 mode\n" -msgstr "" -"u kunt alleen niet-gecodeerde ondertekeningen maken met PGP 2.x stijl " -"sleutels in --pgp2 modus\n" - -#: g10/sign.c:1180 -#, c-format -msgid "%s encryption will be used\n" -msgstr "%s codering zal worden gebruikt\n" - -#: g10/skclist.c:126 g10/skclist.c:190 -msgid "key is not flagged as insecure - can't use it with the faked RNG!\n" -msgstr "" -"sleutel is niet gemarkeerd als onveilig - kan deze niet gebruiken met de nep " -"RNG!\n" - -#: g10/skclist.c:157 -#, fuzzy, c-format -msgid "skipped \"%s\": duplicated\n" -msgstr "`%s' overgeslagen: dubbel\n" - -#: g10/skclist.c:165 g10/skclist.c:175 g10/skclist.c:184 -#, fuzzy, c-format -msgid "skipped \"%s\": %s\n" -msgstr "`%s' overgeslagen: %s\n" - -#: g10/skclist.c:170 -msgid "skipped: secret key already present\n" -msgstr "overgeslagen: geheime sleutel reeds aanwezig\n" - -#: g10/skclist.c:185 -#, fuzzy -msgid "this is a PGP generated Elgamal key which is not secure for signatures!" -msgstr "" -"`%s' overgeslagen: dit is een met PGP aangemaakte ElGamal-sleutel die niet " -"veilig is voor ondertekeningen!\n" - -#: g10/tdbdump.c:59 g10/trustdb.c:365 -#, c-format -msgid "trust record %lu, type %d: write failed: %s\n" -msgstr "vertrouwensingang %lu, soort %d: schrijven mislukt: %s\n" - -#: g10/tdbdump.c:104 -#, c-format -msgid "" -"# List of assigned trustvalues, created %s\n" -"# (Use \"gpg --import-ownertrust\" to restore them)\n" -msgstr "" -"# Lijst van toegewezen vertrouwenswaarden, gemaakt op %s\n" -"# (Gebruik \"gpg --import-ownertrust\" om ze te herstellen)\n" - -#: g10/tdbdump.c:159 g10/tdbdump.c:167 g10/tdbdump.c:172 g10/tdbdump.c:177 -#, fuzzy, c-format -msgid "error in `%s': %s\n" -msgstr "fout bij lezen `%s': %s\n" - -#: g10/tdbdump.c:159 -#, fuzzy -msgid "line too long" -msgstr "regel te lang\n" - -#: g10/tdbdump.c:167 -msgid "colon missing" -msgstr "" - -#: g10/tdbdump.c:173 -#, fuzzy -msgid "invalid fingerprint" -msgstr "fout: ongeldige vingerafdruk\n" - -#: g10/tdbdump.c:178 -#, fuzzy -msgid "ownertrust value missing" -msgstr "eigenaarsvertrouwen-waarden invoeren" - -#: g10/tdbdump.c:214 -#, fuzzy, c-format -msgid "error finding trust record in `%s': %s\n" -msgstr "fout bij vinden vertrouwensgegevens: %s\n" - -#: g10/tdbdump.c:218 -#, fuzzy, c-format -msgid "read error in `%s': %s\n" -msgstr "leesfout: %s\n" - -#: g10/tdbdump.c:227 g10/trustdb.c:380 -#, c-format -msgid "trustdb: sync failed: %s\n" -msgstr "trustdb: synchronisatie mislukt: %s\n" - -#: g10/tdbio.c:128 g10/tdbio.c:1440 -#, c-format -msgid "trustdb rec %lu: lseek failed: %s\n" -msgstr "trustdb rec %lu: lseek mislukt: %s\n" - -#: g10/tdbio.c:134 g10/tdbio.c:1447 -#, c-format -msgid "trustdb rec %lu: write failed (n=%d): %s\n" -msgstr "trustdb rec %lu: schrijven mislukt (n=%d): %s\n" - -#: g10/tdbio.c:244 -msgid "trustdb transaction too large\n" -msgstr "trustdb transactie te groot\n" - -#: g10/tdbio.c:497 -#, fuzzy, c-format -msgid "can't access `%s': %s\n" -msgstr "kan `%s' niet sluiten: %s\n" - -#: g10/tdbio.c:512 -#, c-format -msgid "%s: directory does not exist!\n" -msgstr "%s: map bestaat niet!\n" - -#: g10/tdbio.c:522 g10/tdbio.c:545 g10/tdbio.c:588 -#, fuzzy, c-format -msgid "can't create lock for `%s'\n" -msgstr "kan `%s' niet aanmaken: %s\n" - -#: g10/tdbio.c:524 g10/tdbio.c:591 -#, fuzzy, c-format -msgid "can't lock `%s'\n" -msgstr "kan `%s' niet openen\n" - -#: g10/tdbio.c:550 -#, c-format -msgid "%s: failed to create version record: %s" -msgstr "%s: aanmaken versie-ingang mislukt: %s" - -#: g10/tdbio.c:554 -#, c-format -msgid "%s: invalid trustdb created\n" -msgstr "%s: ongeldige trustdb aangemaakt\n" - -#: g10/tdbio.c:557 -#, c-format -msgid "%s: trustdb created\n" -msgstr "%s: trustdb aangemaakt\n" - -#: g10/tdbio.c:597 -msgid "NOTE: trustdb not writable\n" -msgstr "LET OP: trustdb niet schrijfbaar\n" - -#: g10/tdbio.c:614 -#, c-format -msgid "%s: invalid trustdb\n" -msgstr "%s: ongeldige trustdb\n" - -#: g10/tdbio.c:646 -#, c-format -msgid "%s: failed to create hashtable: %s\n" -msgstr "%s: aanmaken hash-tabel mislukt: %s\n" - -#: g10/tdbio.c:654 -#, c-format -msgid "%s: error updating version record: %s\n" -msgstr "%s: fout bij bijwerken versie-ingang: %s\n" - -#: g10/tdbio.c:671 g10/tdbio.c:691 g10/tdbio.c:707 g10/tdbio.c:721 -#: g10/tdbio.c:751 g10/tdbio.c:1373 g10/tdbio.c:1400 -#, c-format -msgid "%s: error reading version record: %s\n" -msgstr "%s: fout bij lezen versie-ingang: %s\n" - -#: g10/tdbio.c:730 -#, c-format -msgid "%s: error writing version record: %s\n" -msgstr "%s: fout bij schrijven versie-ingang: %s\n" - -#: g10/tdbio.c:1169 -#, c-format -msgid "trustdb: lseek failed: %s\n" -msgstr "trustdb: lseek mislukt: %s\n" - -#: g10/tdbio.c:1177 -#, c-format -msgid "trustdb: read failed (n=%d): %s\n" -msgstr "trustdb: lezen mislukt (n=%d): %s\n" - -#: g10/tdbio.c:1198 -#, c-format -msgid "%s: not a trustdb file\n" -msgstr "%s: geen trustdb bestand\n" - -#: g10/tdbio.c:1216 -#, c-format -msgid "%s: version record with recnum %lu\n" -msgstr "%s: versie-ingang met recnum %lu\n" - -#: g10/tdbio.c:1221 -#, c-format -msgid "%s: invalid file version %d\n" -msgstr "%s: ongeldige bestandsversie %d\n" - -#: g10/tdbio.c:1406 -#, c-format -msgid "%s: error reading free record: %s\n" -msgstr "%s: fout bij lezen vrije ingang: %s\n" - -#: g10/tdbio.c:1414 -#, c-format -msgid "%s: error writing dir record: %s\n" -msgstr "%s: fout bij schrijven map ingang: %s\n" - -#: g10/tdbio.c:1424 -#, c-format -msgid "%s: failed to zero a record: %s\n" -msgstr "%s: op nul stellen van een ingang mislukt: %s\n" - -#: g10/tdbio.c:1454 -#, c-format -msgid "%s: failed to append a record: %s\n" -msgstr "%s: achtervoegen van een ingang mislukt: %s\n" - -#: g10/tdbio.c:1499 -msgid "the trustdb is corrupted; please run \"gpg --fix-trustdb\".\n" -msgstr "" -"de trustdb is beschadigd; voer alstublieft \"gpg --fix-trustdb\" uit.\n" - -#: g10/textfilter.c:134 -#, c-format -msgid "can't handle text lines longer than %d characters\n" -msgstr "kan tekstregels langer dan %d tekens niet verwerken\n" - -#: g10/textfilter.c:231 -#, c-format -msgid "input line longer than %d characters\n" -msgstr "invoerregel langer dan %d tekens\n" - -#: g10/trustdb.c:226 -#, c-format -msgid "`%s' is not a valid long keyID\n" -msgstr "`%s' is geen geldige lange keyID\n" - -#: g10/trustdb.c:257 -#, fuzzy, c-format -msgid "key %s: accepted as trusted key\n" -msgstr "sleutel %08lX: geaccepteerd als vertrouwde sleutel\n" - -#: g10/trustdb.c:295 -#, fuzzy, c-format -msgid "key %s occurs more than once in the trustdb\n" -msgstr "sleutel %08lX komt meerdere keren voor in de trustdb\n" - -#: g10/trustdb.c:310 -#, fuzzy, c-format -msgid "key %s: no public key for trusted key - skipped\n" -msgstr "" -"sleutel %08lX: geen openbare sleutel voor vertrouwde sleutel - overgeslagen\n" - -#: g10/trustdb.c:320 -#, fuzzy, c-format -msgid "key %s marked as ultimately trusted\n" -msgstr "sleutel gemarkeerd als maximaal vertrouwd.\n" - -#: g10/trustdb.c:344 -#, c-format -msgid "trust record %lu, req type %d: read failed: %s\n" -msgstr "vertrouwensingang %lu, req soort %d: lezen mislukt: %s\n" - -#: g10/trustdb.c:350 -#, c-format -msgid "trust record %lu is not of requested type %d\n" -msgstr "vertrouwensingang %lu is niet van gevraagde soort %d\n" - -#: g10/trustdb.c:446 -#, c-format -msgid "unable to use unknown trust model (%d) - assuming %s trust model\n" -msgstr "" - -#: g10/trustdb.c:452 -#, c-format -msgid "using %s trust model\n" -msgstr "" - -#: g10/trustdb.c:501 -msgid "undefined" -msgstr "" - -#: g10/trustdb.c:502 -#, fuzzy -msgid "never" -msgstr "nooit" - -#: g10/trustdb.c:503 -msgid "marginal" -msgstr "" - -#: g10/trustdb.c:504 -msgid "full" -msgstr "" - -#: g10/trustdb.c:505 -msgid "ultimate" -msgstr "" - -#: g10/trustdb.c:545 -msgid "no need for a trustdb check\n" -msgstr "trustdb controle niet nodig\n" - -#: g10/trustdb.c:551 g10/trustdb.c:2112 -#, c-format -msgid "next trustdb check due at %s\n" -msgstr "volgende trustdb controle op %s\n" - -#: g10/trustdb.c:560 -#, fuzzy, c-format -msgid "no need for a trustdb check with `%s' trust model\n" -msgstr "trustdb controle niet nodig\n" - -#: g10/trustdb.c:575 -#, fuzzy, c-format -msgid "no need for a trustdb update with `%s' trust model\n" -msgstr "trustdb controle niet nodig\n" - -#: g10/trustdb.c:793 g10/trustdb.c:1231 -#, fuzzy, c-format -msgid "public key %s not found: %s\n" -msgstr "openbare sleutel %08lX niet gevonden: %s\n" - -#: g10/trustdb.c:988 -msgid "please do a --check-trustdb\n" -msgstr "doe alstublieft een --check-trustdb\n" - -#: g10/trustdb.c:992 -msgid "checking the trustdb\n" -msgstr "bezig met controleren trustdb\n" - -#: g10/trustdb.c:1856 -#, c-format -msgid "%d keys processed (%d validity counts cleared)\n" -msgstr "%d sleutels verwerkt (%d geldigheidsgetallen gewist)\n" - -#: g10/trustdb.c:1920 -msgid "no ultimately trusted keys found\n" -msgstr "geen maximaal vertrouwde sleutels gevonden\n" - -#: g10/trustdb.c:1934 -#, fuzzy, c-format -msgid "public key of ultimately trusted key %s not found\n" -msgstr "openbare sleutel van maximaal vertrouwde sleutel %08lX niet gevonden\n" - -#: g10/trustdb.c:1957 -#, c-format -msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n" -msgstr "" - -#: g10/trustdb.c:2043 -#, c-format -msgid "" -"depth: %d valid: %3d signed: %3d trust: %d-, %dq, %dn, %dm, %df, %du\n" -msgstr "" - -#: g10/trustdb.c:2118 -#, fuzzy, c-format -msgid "unable to update trustdb version record: write failed: %s\n" -msgstr "vertrouwensingang %lu, soort %d: schrijven mislukt: %s\n" - -#: g10/verify.c:116 -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 "" -"de ondertekening kon niet worden geverifieerd.\n" -"Onthoud alstublieft dat het ondertekeningsbestand (.sig of .asc)\n" -"als eerste moet worden gegevens op de opdrachtregel.\n" - -#: g10/verify.c:189 -#, c-format -msgid "input line %u too long or missing LF\n" -msgstr "invoerregel %u te lang of mist LF (enter)\n" - -#: util/errors.c:54 -msgid "general error" -msgstr "algemene fout" - -#: util/errors.c:55 -msgid "unknown packet type" -msgstr "onbekende pakketsoort" - -#: util/errors.c:56 -msgid "unknown version" -msgstr "onbekende versie" - -#: util/errors.c:57 -msgid "unknown pubkey algorithm" -msgstr "onbekend openbare sleutel algoritme" - -#: util/errors.c:58 -msgid "unknown digest algorithm" -msgstr "onbekend digest-algoritme" - -#: util/errors.c:59 -msgid "bad public key" -msgstr "slechte openbare sleutel" - -#: util/errors.c:60 -msgid "bad secret key" -msgstr "slechte geheime sleutel" - -#: util/errors.c:61 -msgid "bad signature" -msgstr "slechte ondertekening" - -#: util/errors.c:62 -msgid "checksum error" -msgstr "controlesom fout" - -#: util/errors.c:63 -msgid "bad passphrase" -msgstr "slecht wachtwoord" - -#: util/errors.c:64 -msgid "public key not found" -msgstr "openbare sleutel niet gevonden" - -#: util/errors.c:65 -msgid "unknown cipher algorithm" -msgstr "onbekend codeeralgoritme" - -#: util/errors.c:66 -msgid "can't open the keyring" -msgstr "kan de sleutelbos niet openen" - -#: util/errors.c:67 -msgid "invalid packet" -msgstr "ongeldig pakket" - -#: util/errors.c:68 -msgid "invalid armor" -msgstr "ongeldige bepantsering" - -#: util/errors.c:69 -msgid "no such user id" -msgstr "onbekende gebruikerscode" - -#: util/errors.c:70 -msgid "secret key not available" -msgstr "geheime sleutel niet beschikbaar" - -#: util/errors.c:71 -msgid "wrong secret key used" -msgstr "verkeerde geheime sleutel gebruikt" - -#: util/errors.c:72 -msgid "not supported" -msgstr "niet ondersteund" - -#: util/errors.c:73 -msgid "bad key" -msgstr "slechte sleutel" - -#: util/errors.c:74 -msgid "file read error" -msgstr "bestandsleesfout" - -#: util/errors.c:75 -msgid "file write error" -msgstr "bestandsschrijffout" - -#: util/errors.c:76 -msgid "unknown compress algorithm" -msgstr "onbekend inpakalgoritme" - -#: util/errors.c:77 -msgid "file open error" -msgstr "bestandsopenfout" - -#: util/errors.c:78 -msgid "file create error" -msgstr "bestandsaanmaakfout" - -#: util/errors.c:79 -msgid "invalid passphrase" -msgstr "ongeldig wachtwoord" - -#: util/errors.c:80 -msgid "unimplemented pubkey algorithm" -msgstr "niet-geïmplementeerd openbare sleutel algoritme" - -#: util/errors.c:81 -msgid "unimplemented cipher algorithm" -msgstr "niet-geïmplementeerd codeeralgoritme" - -#: util/errors.c:82 -msgid "unknown signature class" -msgstr "onbekende ondertekeningsklasse" - -#: util/errors.c:83 -msgid "trust database error" -msgstr "vertrouwensgegevensbank fout" - -#: util/errors.c:84 -msgid "bad MPI" -msgstr "slechte MPI" - -#: util/errors.c:85 -msgid "resource limit" -msgstr "grens aan bronnen" - -#: util/errors.c:86 -msgid "invalid keyring" -msgstr "ongeldige sleutelbos" - -#: util/errors.c:87 -msgid "bad certificate" -msgstr "slecht certificaat" - -#: util/errors.c:88 -msgid "malformed user id" -msgstr "misvormde gebruikerscode" - -#: util/errors.c:89 -msgid "file close error" -msgstr "bestandssluitfout" - -#: util/errors.c:90 -msgid "file rename error" -msgstr "bestandshernoemfout" - -#: util/errors.c:91 -msgid "file delete error" -msgstr "bestandsverwijderfout" - -#: util/errors.c:92 -msgid "unexpected data" -msgstr "onverwachte gegevens" - -#: util/errors.c:93 -msgid "timestamp conflict" -msgstr "tijdsstempel conflict" - -#: util/errors.c:94 -msgid "unusable pubkey algorithm" -msgstr "onbruikbar openbare sleutel algoritme" - -#: util/errors.c:95 -msgid "file exists" -msgstr "bestand bestaat" - -#: util/errors.c:96 -msgid "weak key" -msgstr "zwakke sleutel" - -#: util/errors.c:97 -msgid "invalid argument" -msgstr "ongeldig argument" - -#: util/errors.c:98 -msgid "bad URI" -msgstr "slechte URI" - -#: util/errors.c:99 -msgid "unsupported URI" -msgstr "niet-ondersteunde URI" - -#: util/errors.c:100 -msgid "network error" -msgstr "netwerkfout" - -#: util/errors.c:102 -msgid "not encrypted" -msgstr "niet gecodeerd" - -#: util/errors.c:103 -msgid "not processed" -msgstr "niet verwerkt" - -#: util/errors.c:105 -msgid "unusable public key" -msgstr "onbruikbare openbare sleutel" - -#: util/errors.c:106 -msgid "unusable secret key" -msgstr "onbruikbare geheime sleutel" - -#: util/errors.c:107 -msgid "keyserver error" -msgstr "sleutelserverfout" - -#: util/errors.c:108 -#, fuzzy -msgid "canceled" -msgstr "Annuleren" - -#: util/errors.c:109 -#, fuzzy -msgid "no card" -msgstr "niet gecodeerd" - -#: util/logger.c:157 -msgid "ERROR: " -msgstr "" - -#: util/logger.c:160 -msgid "WARNING: " -msgstr "" - -#: util/logger.c:223 -#, c-format -msgid "... this is a bug (%s:%d:%s)\n" -msgstr "... dit is een softwarefout (%s:%d:%s)\n" - -#: util/logger.c:229 -#, c-format -msgid "you found a bug ... (%s:%d)\n" -msgstr "u heeft een softwarefout gevonden ... (%s:%d)\n" - -#: util/miscutil.c:307 util/miscutil.c:344 -msgid "yes" -msgstr "ja" - -#: util/miscutil.c:308 util/miscutil.c:349 -msgid "yY" -msgstr "jJ" - -#: util/miscutil.c:310 util/miscutil.c:346 -msgid "no" -msgstr "nee" - -#: util/miscutil.c:311 util/miscutil.c:350 -msgid "nN" -msgstr "nN" - -#: util/miscutil.c:351 -msgid "qQ" -msgstr "qQ" - -#: util/miscutil.c:384 -msgid "okay|okay" -msgstr "" - -#: util/miscutil.c:386 -msgid "cancel|cancel" -msgstr "" - -#: util/miscutil.c:387 -msgid "oO" -msgstr "" - -#: util/miscutil.c:388 -#, fuzzy -msgid "cC" -msgstr "c" - -#: util/secmem.c:90 -msgid "WARNING: using insecure memory!\n" -msgstr "WAARSCHUWING: er wordt onveilig geheugen gebruikt!\n" - -#: util/secmem.c:91 -msgid "please see http://www.gnupg.org/faq.html for more information\n" -msgstr "zie alstublieft http://www.gnupg.org/faq.html voor meer informatie\n" - -#: util/secmem.c:340 -msgid "operation is not possible without initialized secure memory\n" -msgstr "bewerking is niet mogelijk zonder geïnitialiseerd veilig geheugen\n" - -#: util/secmem.c:341 -msgid "(you may have used the wrong program for this task)\n" -msgstr "(mogelijk heeft u het verkeerde programma gebruikt voor deze taak)\n" - -#, fuzzy -#~ msgid "writing to file `%s'\n" -#~ msgstr "bezig met schrijven naar `%s'\n" - -#~ msgid "sorry, can't do this in batch mode\n" -#~ msgstr "sorry, dat kan niet in batch-modus\n" - -#~ msgid "key `%s' not found: %s\n" -#~ msgstr "sleutel `%s' niet gevonden: %s\n" - -#, fuzzy -#~ msgid "can't create file `%s': %s\n" -#~ msgstr "kan `%s' niet aanmaken: %s\n" - -#, fuzzy -#~ msgid "can't open file `%s': %s\n" -#~ msgstr "kan bestand niet openen: %s\n" - -#, fuzzy -#~ msgid " \"" -#~ msgstr " alias \"" - -#~ msgid " i = please show me more information\n" -#~ msgstr " i = meer informatie weergeven\n" - -#~ msgid "key %08lX: key has been revoked!\n" -#~ msgstr "sleutel %08lX: sleutel is herroepen!\n" - -#~ msgid "key %08lX: subkey has been revoked!\n" -#~ msgstr "sleutel %08lX: deelsleutel is herroepen!\n" - -#~ msgid "%08lX: key has expired\n" -#~ msgstr "%08lX: sleutel is verlopen\n" - -#~ msgid "%08lX: We do NOT trust this key\n" -#~ msgstr "%08lX: We vertrouwen deze sleutel NIET\n" - -#~ msgid " (%d) RSA (sign and encrypt)\n" -#~ msgstr " (%d) RSA (ondertekenen en coderen)\n" - -#, fuzzy -#~ msgid " (%d) RSA (auth only)\n" -#~ msgstr " (%d) RSA (alleen ondertekenen)\n" - -#, fuzzy -#~ msgid " (%d) RSA (sign and auth)\n" -#~ msgstr " (%d) RSA (ondertekenen en coderen)\n" - -#, fuzzy -#~ msgid " (%d) RSA (encrypt and auth)\n" -#~ msgstr " (%d) RSA (alleen coderen)\n" - -#, fuzzy -#~ msgid " (%d) RSA (sign, encrypt and auth)\n" -#~ msgstr " (%d) RSA (ondertekenen en coderen)\n" - -#~ msgid "%s: can't open: %s\n" -#~ msgstr "%s: kan niet openen: %s\n" - -#~ msgid "%s: WARNING: empty file\n" -#~ msgstr "%s: WAARSCHUWING: leeg bestand\n" - -#~ msgid "can't open %s: %s\n" -#~ msgstr "kan %s niet openen: %s\n" - -#, fuzzy -#~ msgid " (%d) I trust marginally\n" -#~ msgstr " %d = Ik vertrouw een beetje\n" - -#, fuzzy -#~ msgid " (%d) I trust fully\n" -#~ msgstr " %d = Ik vertrouw volledig\n" - -#, fuzzy -#~ msgid "expires" -#~ msgstr "expire" - -#, fuzzy -#~ msgid "" -#~ "\"\n" -#~ "locally signed with your key %s at %s\n" -#~ msgstr "" -#~ "\"\n" -#~ "lokaal ondertekend met uw sleutel %08lX op %s\n" - -#, fuzzy -#~ msgid " signed by %s on %s%s\n" -#~ msgstr " ondertekend door %08lX op %s%s\n" - -#~ msgid "%s: can't access: %s\n" -#~ msgstr "%s: kan niet benaderen: %s\n" - -#~ msgid "%s: can't create lock\n" -#~ msgstr "%s: kan geen blokkering aanmaken\n" - -#~ msgid "%s: can't make lock\n" -#~ msgstr "%s: kan geen blokkering maken\n" - -#~ msgid "%s: can't create: %s\n" -#~ msgstr "%s: kan niet aanmaken: %s\n" - -#~ msgid "%s: can't create directory: %s\n" -#~ msgstr "%s: kan map niet aanmaken: %s\n" - -#~ msgid "If you want to use this revoked key anyway, answer \"yes\"." -#~ msgstr "Antwoord \"ja\" als u toch deze herroepen sleutel wilt gebruiken." - -#~ msgid "Unable to open photo \"%s\": %s\n" -#~ msgstr "Kan foto \"%s\" niet openen: %s\n" - -#~ msgid "can't open file: %s\n" -#~ msgstr "kan bestand niet openen: %s\n" - -#~ msgid "error: missing colon\n" -#~ msgstr "fout: ontbrekende dubbele punt\n" - -#~ msgid "error: no ownertrust value\n" -#~ msgstr "fout: geen eigenaarsvertrouwen waarde\n" - -#~ msgid " (main key ID %08lX)" -#~ msgstr " (hoofdsleutel ID %08lX)" - -#~ msgid "rev! subkey has been revoked: %s\n" -#~ msgstr "herroepen! deelsleutel is herroepen: %s\n" - -#~ msgid "rev- faked revocation found\n" -#~ msgstr "herroepen- vervalste herroeping gevonden\n" - -#~ msgid "rev? problem checking revocation: %s\n" -#~ msgstr "herroepen? probleem bij controleren herroeping: %s\n" - -#~ msgid "[revoked] " -#~ msgstr "[herroepen] " - -#~ msgid "[expired] " -#~ msgstr "[verlopen] " - -#, fuzzy -#~ msgid " [expired: %s]" -#~ msgstr " [verloopt: %s]" - -#~ msgid " [expires: %s]" -#~ msgstr " [verloopt: %s]" - -#, fuzzy -#~ msgid " [revoked: %s]" -#~ msgstr "[herroepen] " - -#~ msgid "can't create %s: %s\n" -#~ msgstr "kan %s niet aanmaken: %s\n" - -#~ msgid "|[files]|encrypt files" -#~ msgstr "|[bestanden]|bestanden coderen" - -#~ msgid "store only" -#~ msgstr "alleen opslaan" - -#~ msgid "|[files]|decrypt files" -#~ msgstr "|[bestanden]|bestanden decoderen" - -#~ msgid "sign a key non-revocably" -#~ msgstr "een sleutel onherroepbaar ondertekenen" - -#~ msgid "sign a key locally and non-revocably" -#~ msgstr "een sleutel lokaal en onherroepbaar ondertekenen" - -#~ msgid "list only the sequence of packets" -#~ msgstr "slechts de reeks van pakketten opsommen" - -#~ msgid "export the ownertrust values" -#~ msgstr "de eigenaarsvertrouwen-waarden uitvoeren" - -#~ msgid "unattended trust database update" -#~ msgstr "automatische vertrouwensgegevensbank bijwerking" - -#~ msgid "fix a corrupted trust database" -#~ msgstr "een kapotte vertrouwensgegevensbank repareren" - -#~ msgid "De-Armor a file or stdin" -#~ msgstr "Een bestand of standaardinvoer ontpantseren" - -#~ msgid "En-Armor a file or stdin" -#~ msgstr "Een bestand of standaardinvoer bepantseren" - -#~ msgid "|NAME|use NAME as default recipient" -#~ msgstr "|NAAM|NAAM gebruiken als standaardontvanger" - -#~ msgid "use the default key as default recipient" -#~ msgstr "de standaardsleutel gebruiken als standaardontvanger" - -#~ msgid "don't use the terminal at all" -#~ msgstr "helemaal niet de terminal gebruiken" - -#~ msgid "force v3 signatures" -#~ msgstr "versie 3 ondertekeningen afdwingen" - -#~ msgid "do not force v3 signatures" -#~ msgstr "niet versie 3 ondertekeningen afdwingen" - -#~ msgid "force v4 key signatures" -#~ msgstr "versie 4 sleutelondertekeningen afdwingen" - -#~ msgid "do not force v4 key signatures" -#~ msgstr "niet versie 4 sleutelondertekeningen afdwingen" - -#~ msgid "always use a MDC for encryption" -#~ msgstr "altijd een MDC gebruiken voor codering" - -#~ msgid "never use a MDC for encryption" -#~ msgstr "nooit een MDC gebruiken voor codering" - -#~ msgid "use the gpg-agent" -#~ msgstr "de gpg-agent gebruiken" - -#~ msgid "batch mode: never ask" -#~ msgstr "batch-modus: nooit vragen" - -#~ msgid "assume yes on most questions" -#~ msgstr "ja aannemen bij de meeste vragen" - -#~ msgid "assume no on most questions" -#~ msgstr "nee aannemen bij de meeste vragen" - -#~ msgid "add this keyring to the list of keyrings" -#~ msgstr "deze sleutelbos toevoegen aan de lijst van sleutelbossen" - -#~ msgid "add this secret keyring to the list" -#~ msgstr "deze geheime sleutelbos toevoegen aan de lijst" - -#~ msgid "show which keyring a listed key is on" -#~ msgstr "weergeven op welke sleutelbos een opgesomde sleutel zit" - -#~ msgid "|NAME|use NAME as default secret key" -#~ msgstr "|NAAM|NAAM gebruiken als standaard geheime sleutel" - -#~ msgid "|HOST|use this keyserver to lookup keys" -#~ msgstr "|HOST|deze sleutelserver gebruiken om sleutels op te zoeken" - -#~ msgid "|NAME|set terminal charset to NAME" -#~ msgstr "|NAAM|terminal tekenset instellen op NAAM" - -#~ msgid "read options from file" -#~ msgstr "opties lezen uit een bestand" - -#~ msgid "|[file]|write status info to file" -#~ msgstr "|[bestand]|statusinfo naar dit bestand schrijven" - -#~ msgid "|KEYID|ultimately trust this key" -#~ msgstr "|SLEUTEL|deze sleutel maximaal vertrouwen" - -#~ msgid "|FILE|load extension module FILE" -#~ msgstr "|BESTAND|uitbreidingsmodule BESTAND laden" - -#~ msgid "emulate the mode described in RFC1991" -#~ msgstr "de modus beschreven in RFC1991 emuleren" - -#~ msgid "set all packet, cipher and digest options to OpenPGP behavior" -#~ msgstr "" -#~ "alles pakket-, codering- en digestopties instellen op OpenPGP gedrag" - -#~ msgid "set all packet, cipher and digest options to PGP 2.x behavior" -#~ msgstr "alle pakket-, codering- en digestopties instellen op PGP 2.x gedrag" - -#~ msgid "|N|use passphrase mode N" -#~ msgstr "|N|wachtwoordmodus N gebruiken" - -#~ msgid "|NAME|use message digest algorithm NAME for passphrases" -#~ msgstr "|NAAM|berichtdigest-algoritme NAAM gebruiken voor wachtwoorden" - -#~ msgid "|NAME|use cipher algorithm NAME for passphrases" -#~ msgstr "|NAAM|codeeralgoritme NAAM gebruiken voor wachtwoorden" - -#~ msgid "|NAME|use cipher algorithm NAME" -#~ msgstr "|NAAM|codeeralgoritme NAAM gebruiken" - -#~ msgid "|NAME|use message digest algorithm NAME" -#~ msgstr "|NAAM|berichtdigest-algoritme NAAM gebruiken" - -#~ msgid "|N|use compress algorithm N" -#~ msgstr "|N|inpakalgoritme N gebruiken" - -#~ msgid "throw keyid field of encrypted packets" -#~ msgstr "keyid-veld uit gecodeerde pakketten gooien" - -#~ msgid "Show Photo IDs" -#~ msgstr "Foto's weergeven" - -#~ msgid "Don't show Photo IDs" -#~ msgstr "Niet foto's weergeven" - -#~ msgid "Set command line to view Photo IDs" -#~ msgstr "Opdrachtregel instellen voor weergeven van foto's" - -#, fuzzy -#~ msgid "compress algorithm `%s' is read-only in this release\n" -#~ msgstr "digest-algoritme `%s' is alleen-lezen in deze uitgave\n" - -#~ msgid "compress algorithm must be in range %d..%d\n" -#~ msgstr "inpakalgoritme moet binnen bereik %d..%d liggen\n" - -#~ msgid "" -#~ "%08lX: It is not sure that this key really belongs to the owner\n" -#~ "but it is accepted anyway\n" -#~ msgstr "" -#~ "%08lX: Het is niet zeker dat deze sleutel echt van de eigenaar is,\n" -#~ "maar de sleutel is toch geaccepteerd\n" - -#~ msgid "preference %c%lu is not valid\n" -#~ msgstr "voorkeur %c%lu is niet geldig\n" - -#~ msgid "key %08lX: not a rfc2440 key - skipped\n" -#~ msgstr "sleutel %08lX: niet een rfc2440 sleutel - overgeslagen\n" - -#~ msgid "" -#~ "NOTE: Elgamal primary key detected - this may take some time to import\n" -#~ msgstr "" -#~ "LET OP: Elgamal primaire sleutel gevonden - het invoeren kan even duren\n" - -#~ msgid " (default)" -#~ msgstr " (standaard)" - -#~ msgid "%s%c %4u%c/%08lX created: %s expires: %s" -#~ msgstr "%s%c %4u%c/%08lX gemaakt: %s verloopt: %s" - -#~ msgid "Notation: " -#~ msgstr "Notatie: " - -#~ msgid "Policy: " -#~ msgstr "Beleid: " - -#~ msgid "can't get key from keyserver: %s\n" -#~ msgstr "kan sleutel niet ontvangen van sleutelserver: %s\n" - -#~ msgid "error sending to `%s': %s\n" -#~ msgstr "fout bij verzenden aan `%s': %s\n" - -#~ msgid "success sending to `%s' (status=%u)\n" -#~ msgstr "succes bij zenden aan `%s' (status=%u)\n" - -#~ msgid "failed sending to `%s': status=%u\n" -#~ msgstr "verzenden aan `%s' mislukt: status=%u\n" - -#~ msgid "can't search keyserver: %s\n" -#~ msgstr "kan niet zoeken op sleutelserver: %s\n" - -#~ msgid "" -#~ "key %08lX: this is a PGP generated ElGamal key which is NOT secure for " -#~ "signatures!\n" -#~ msgstr "" -#~ "sleutel %08lX: dit is een met PGP aangemaakte ElGamal-sleutel die NIET " -#~ "veilig is voor ondertekeningen!\n" - -#~ msgid "" -#~ "key %08lX has been created %lu second in future (time warp or clock " -#~ "problem)\n" -#~ msgstr "" -#~ "sleutel %08lX is %lu seconde in de toekomst gemaakt (tijdsreis of " -#~ "klokprobleem)\n" - -#~ msgid "" -#~ "key %08lX has been created %lu seconds in future (time warp or clock " -#~ "problem)\n" -#~ msgstr "" -#~ "sleutel %08lX is %lu seconden in de toekomst gemaakt (tijdsreis of " -#~ "klokprobleem)\n" - -#~ msgid "key %08lX marked as ultimately trusted\n" -#~ msgstr "sleutel %08lX gemarkeerd als maximaal vertrouwd\n" - -#~ msgid "checking at depth %d signed=%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/%d/%d\n" -#~ msgstr "" -#~ "bezig met controleren op diepte %d ondertekend=%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 "" -#~ "Kies het te gebruiken algoritme.\n" -#~ "\n" -#~ "DSA (ofwel DSS) is het digitale ondertekening algoritme dat alleen kan\n" -#~ "worden gebruikt voor ondertekeningen. Dit is het voorgestelde algoritme\n" -#~ "omdat verificatie van DSA-ondertekeningen veel sneller is dan van " -#~ "ElGamal.\n" -#~ "\n" -#~ "ElGamal is een algoritme dat kan worden gebruikt voor ondertekenen en\n" -#~ "coderen. OpenPGP onderscheidt twee smaken van dit algoritme: een alleen-\n" -#~ "coderen en een coderen+coderen versie; ze zijn eigenlijk hetzelfde, maar\n" -#~ "sommige parameters moeten op een speciale manier worden gekozen\n" -#~ "om veilige sleutels voor ondertekenen te maken: dit programma\n" -#~ "doet dit maar andere OpenPGP-implementaties hoeven de coderen+\n" -#~ "ondertekenen smaak niet te begrijpen.\n" -#~ "\n" -#~ "De eerste (primaire) sleutel moet altijd een sleutel zijn waarmee kan\n" -#~ "ondertekend kan worden; dit is de reden dat de alleen-coderen ElGamal-\n" -#~ "sleutel niet beschikbaar is in dit 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 "" -#~ "Ondanks dat deze sleutels gedefinieerd zijn in RFC2440 worden ze niet\n" -#~ "aangeraden omdat ze niet door alle programma's worden ondersteund\n" -#~ "en omdat de ondertekeningen die ermee worden gemaakt behoorlijk\n" -#~ "groot zijn en traag om te verifiëren." - -#~ msgid "%lu keys so far checked (%lu signatures)\n" -#~ msgstr "tot nu toe %lu sleutels gecontroleerd (%lu ondertekeningen)\n" - -#~ msgid "key incomplete\n" -#~ msgstr "sleutel onvolledig\n" - -#~ msgid "key %08lX incomplete\n" -#~ msgstr "sleutel %08lX onvolledig\n" - -#~ msgid " (%d) ElGamal (sign and encrypt)\n" -#~ msgstr " (%d) ElGamal (ondertekenen en coderen)\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 "" -#~ "Het gebruik van dit algoritme wordt alleen ondersteund door GnuPG. U " -#~ "zult met\n" -#~ "deze sleutel niet kunnen communiceren met PGP gebruikers. Dit algoritme " -#~ "is\n" -#~ "ook erg langzaam, en mogelijk niet zo veilig als de andere keuzes.\n" - -#~ msgid "Create anyway? " -#~ msgstr "Toch aanmaken? " - -#~ msgid "this keyserver is not fully HKP compatible\n" -#~ msgstr "deze sleutelserver is niet helemaal HKP-compatibel\n" diff --git a/po/pl.po b/po/pl.po deleted file mode 100644 index b8ead6cbd..000000000 --- a/po/pl.po +++ /dev/null @@ -1,7871 +0,0 @@ -# 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-07-28 11:12+0200\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 mona wygenerowa liczby pierwszej krtszej od %d bitw\n" - -#: cipher/primegen.c:312 -#, c-format -msgid "can't generate a prime with less than %d bits\n" -msgstr "nie mona wygenerowa liczby pierwszej krtszej od %d bitw\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 mona 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:1003 g10/gpg.c:3461 g10/import.c:195 g10/keygen.c:2385 -#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:342 -#: 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 mona otworzy ,,%s'': %s\n" - -#: cipher/random.c:458 -#, c-format -msgid "can't stat `%s': %s\n" -msgstr "nie mona sprawdzi ,,%s'': %s\n" - -#: cipher/random.c:463 -#, c-format -msgid "`%s' is not a regular file - ignored\n" -msgstr ",,%s'' nie jest zwykym plikiem - zostaje pominity\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 "" -"OSTRZEENIE: niewaciwy rozmiar pliku random_seed - nie zostanie uyty\n" - -#: cipher/random.c:482 -#, c-format -msgid "can't read `%s': %s\n" -msgstr "nie mona 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:1002 g10/keygen.c:2864 -#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:263 -#: g10/openfile.c:357 g10/sign.c:826 g10/sign.c:1130 g10/tdbio.c:536 -#, c-format -msgid "can't create `%s': %s\n" -msgstr "nie mona utworzy ,,%s'': %s\n" - -#: cipher/random.c:556 cipher/random.c:566 -#, c-format -msgid "can't write `%s': %s\n" -msgstr "nie mona zapisa ,,%s'': %s\n" - -#: cipher/random.c:569 -#, c-format -msgid "can't close `%s': %s\n" -msgstr "nie mona zamkn ,,%s'': %s\n" - -#: cipher/random.c:814 -msgid "WARNING: using insecure random number generator!!\n" -msgstr "" -"OSTRZEENIE: uywany 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 "" -"Uywany generator liczb losowych jest atrap wprowadzon dla umoliwienia\n" -"normalnej kompilacji - nie jest kryptograficznie bezpieczny!\n" -"\n" -"JAKIEKOLWIEK DANE GENEROWANE PRZEZ TEN PROGRAM NIE NADAJ SI DO \n" -"NORMALNEGO UYTKU I NIE ZAPEWNIAJ BEZPIECZESTWA!!\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 zbirka losowoci. eby si nie nudzi, " -"moesz\n" -"popracowa w systemie, przy okazji dostarczy to systemowi wicej 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 moliwoci wygenerowania odpowiedniej liczby losowych bajtw.\n" -"Prosz kontynuowa inne dziaania aby system mg zebra odpowiedni\n" -"ilo entropii do ich wygenerowania (brakuje %d bajtw).\n" - -#: g10/app-openpgp.c:596 -#, fuzzy, c-format -msgid "failed to store the fingerprint: %s\n" -msgstr "inicjowanie Bazy Zaufania nie powiodo si: %s\n" - -#: g10/app-openpgp.c:609 -#, fuzzy, c-format -msgid "failed to store the creation date: %s\n" -msgstr "nie powioda si odbudowa bufora bazy: %s\n" - -#: g10/app-openpgp.c:977 -#, fuzzy, c-format -msgid "reading public key failed: %s\n" -msgstr "usunicie bloku klucza nie powiodo 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 "wysyka do serwera kluczy nie powioda 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 "bd podczas tworzenia hasa: %s\n" - -#: g10/app-openpgp.c:1546 g10/app-openpgp.c:1996 -#, fuzzy -msgid "error reading application data\n" -msgstr "bd odczytu bloku kluczy: %s\n" - -#: g10/app-openpgp.c:1552 g10/app-openpgp.c:2003 -#, fuzzy -msgid "error reading fingerprint DO\n" -msgstr "%s: bd 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 powiodo 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 "usunicie bloku klucza nie powiodo si: %s\n" - -#: g10/app-openpgp.c:1904 -#, fuzzy, c-format -msgid "key generation completed (%d seconds)\n" -msgstr "Generacja klucza nie powioda 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, skrt %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:320 -#, c-format -msgid "armor: %s\n" -msgstr "opakowanie: %s\n" - -#: g10/armor.c:359 -msgid "invalid armor header: " -msgstr "niepoprawny nagwek opakowania: " - -#: g10/armor.c:370 -msgid "armor header: " -msgstr "nagwek opakowania: " - -#: g10/armor.c:381 -msgid "invalid clearsig header\n" -msgstr "niewaciwy nagwek dokumentu z podpisem na kocu\n" - -#: g10/armor.c:433 -msgid "nested clear text signatures\n" -msgstr "zagniedone podpisy na kocu dokumentu\n" - -#: g10/armor.c:568 -#, fuzzy -msgid "unexpected armor: " -msgstr "nieoczekiwane opakowanie:" - -#: g10/armor.c:580 -msgid "invalid dash escaped line: " -msgstr "niepoprawne oznaczenie linii minusami: " - -#: g10/armor.c:734 g10/armor.c:1343 -#, fuzzy, c-format -msgid "invalid radix64 character %02X skipped\n" -msgstr "niewaciwy znak formatu radix64: ,,%02x'', zosta pominity\n" - -#: g10/armor.c:777 -msgid "premature eof (no CRC)\n" -msgstr "przewczesny koniec pliku (brak CRC)\n" - -#: g10/armor.c:811 -msgid "premature eof (in CRC)\n" -msgstr "przedwczesny koniec pliku (w CRC)\n" - -#: g10/armor.c:819 -msgid "malformed CRC\n" -msgstr "bd formatu CRC\n" - -#: g10/armor.c:823 g10/armor.c:1380 -#, fuzzy, c-format -msgid "CRC error; %06lX - %06lX\n" -msgstr "Bd sumy CRC; %06lx - %06lx\n" - -#: g10/armor.c:843 -#, fuzzy -msgid "premature eof (in trailer)\n" -msgstr "przedwczesny koniec pliku (w linii koczcej)\n" - -#: g10/armor.c:847 -msgid "error in trailer line\n" -msgstr "bd w linii koczcej\n" - -#: g10/armor.c:1158 -msgid "no valid OpenPGP data found.\n" -msgstr "nie odnaleziono poprawnych danych w formacie OpenPGP.\n" - -#: g10/armor.c:1163 -#, c-format -msgid "invalid armor: line longer than %d characters\n" -msgstr "bd opakowania: linia dusza ni %d znakw\n" - -#: g10/armor.c:1167 -msgid "" -"quoted printable character in armor - probably a buggy MTA has been used\n" -msgstr "" -"znak kodowania quoted-printable w opakowaniu ASCII - prawdopodobnie\n" -"przekamanie 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 dziaa 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 "Twj wybr? " - -#: g10/card-util.c:216 g10/card-util.c:266 -msgid "[not set]" -msgstr "" - -#: g10/card-util.c:413 -#, fuzzy -msgid "male" -msgstr "wkl" - -#: g10/card-util.c:414 -#, fuzzy -msgid "female" -msgstr "wkl" - -#: 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 odpowiadajcego 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:280 -#, c-format -msgid "error reading `%s': %s\n" -msgstr "bd 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 "niewaciwy znak w tekcie ustawie\n" - -#: g10/card-util.c:811 -#, fuzzy -msgid "Error: invalid characters in preference string.\n" -msgstr "niewaciwy znak w tekcie 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 "bd: niewaciwy 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 "bd: niewaciwy odcisk klucza\n" - -#: g10/card-util.c:938 -#, fuzzy, c-format -msgid "key operation not possible: %s\n" -msgstr "Generacja klucza nie powioda 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 "bd 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 "Wano podpisu wygasa %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 "Niewaciwy wybr.\n" - -#: g10/card-util.c:1203 -#, fuzzy -msgid "Please select where to store the key:\n" -msgstr "Prosz wybra powd uniewanienia:\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 gwnego klucza jest niedostpna.\n" - -#: g10/card-util.c:1248 -#, fuzzy -msgid "secret key already stored on a card\n" -msgstr "pominity: klucz prywatny jest ju wpisany\n" - -#: g10/card-util.c:1319 g10/keyedit.c:1357 -msgid "quit this menu" -msgstr "wyjcie 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 dostpny 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 wanoci klucza" - -#: g10/card-util.c:1331 -#, fuzzy -msgid "change the language preferences" -msgstr "zmiana zaufania waciciela" - -#: 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 (sprbuj \"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 "usunicie bloku klucza nie powiodo 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 uytkownika (user ID): " - -#: g10/cardglue.c:918 -#, fuzzy -msgid "Enter New PIN: " -msgstr "Podaj identyfikator uytkownika (user ID): " - -#: g10/cardglue.c:919 -msgid "Enter Admin PIN: " -msgstr "" - -#: g10/cardglue.c:920 -#, fuzzy -msgid "Enter PIN: " -msgstr "Podaj identyfikator uytkownika (user ID): " - -#: g10/cardglue.c:937 -#, fuzzy -msgid "Repeat this PIN: " -msgstr "Powtrz haso: " - -#: g10/cardglue.c:952 -#, fuzzy -msgid "PIN not correctly repeated; try again" -msgstr "haso nie zostao poprawnie powtrzone; jeszcze jedna prba" - -#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3826 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 mona otworzy ,,%s''\n" - -#: g10/decrypt.c:105 g10/encode.c:839 -msgid "--output doesn't work for this command\n" -msgstr "opcja --output nie dziaa z tym poleceniem\n" - -#: g10/delkey.c:75 g10/export.c:311 g10/keyedit.c:3387 g10/keyserver.c:1700 -#: 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:2349 g10/keyserver.c:1714 -#: g10/revoke.c:234 g10/revoke.c:478 -#, c-format -msgid "error reading keyblock: %s\n" -msgstr "bd 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 dziaa 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 "usunicie bloku klucza nie powiodo si: %s\n" - -#: g10/delkey.c:175 -msgid "ownertrust information cleared\n" -msgstr "informacja o zaufaniu dla waciciela klucza zostaa 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 uy opcji \"--delete-secret-key\".\n" - -#: g10/encode.c:213 g10/sign.c:1284 -#, c-format -msgid "error creating passphrase: %s\n" -msgstr "bd podczas tworzenia hasa: %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 uy 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 "OSTRZEENIE: 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 mona szyfrowa dla kluczy RSA krtszych od 2048 bitw\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 mona uy szyfru IDEA z wszystkimi kluczami dla ktrych szyfrujesz.\n" - -#: g10/encode.c:518 -#, fuzzy, c-format -msgid "" -"WARNING: forcing symmetric cipher %s (%d) violates recipient preferences\n" -msgstr "wymuszone uycie szyfru %s (%d) kci 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 uycie kompresji %s (%d) kci si z ustawieniami adresata\n" - -#: g10/encode.c:715 -#, c-format -msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n" -msgstr "wymuszone uycie szyfru %s (%d) kci 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 dostpne 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:67 g10/mainproc.c:293 -#, c-format -msgid "%s encrypted data\n" -msgstr "dane zaszyfrowano za pomoc %s\n" - -#: g10/encr-data.c:69 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:93 -msgid "" -"WARNING: message was encrypted with a weak key in the symmetric cipher.\n" -msgstr "" -"OSTRZEENIE: wiadomo bya szyfrowana kluczem sabym szyfru symetrycznego.\n" - -#: g10/encr-data.c:104 -msgid "problem handling encrypted packet\n" -msgstr "problem podczas obrbki pakietu szyfrowego\n" - -#: g10/exec.c:49 -msgid "no remote program execution supported\n" -msgstr "odwoania do zewntrznych programw s wyczone\n" - -#: g10/exec.c:176 g10/openfile.c:415 -#, c-format -msgid "can't create directory `%s': %s\n" -msgstr "nie mona 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 - woanie zewntrznych programw wyczone\n" - -#: g10/exec.c:347 -#, fuzzy -msgid "this platform requires temporary files when calling external programs\n" -msgstr "" -"platforma wymaga uycia plikw tymczasowych do woania zewntrznych " -"programw\n" - -#: g10/exec.c:425 -#, fuzzy, c-format -msgid "unable to execute program `%s': %s\n" -msgstr "nie mona wykona %s ,,%s'': %s\n" - -#: g10/exec.c:428 -#, fuzzy, c-format -msgid "unable to execute shell `%s': %s\n" -msgstr "nie mona wykona %s ,,%s'': %s\n" - -#: g10/exec.c:513 -#, c-format -msgid "system error while calling external program: %s\n" -msgstr "bd systemu podczas woania programu zewntrznego: %s\n" - -#: g10/exec.c:524 g10/exec.c:590 -msgid "unnatural exit of external program\n" -msgstr "nienaturalne zakoczenie pracy zewntrznego programu\n" - -#: g10/exec.c:539 -msgid "unable to execute external program\n" -msgstr "nie mona uruchomi zewntrznego programu\n" - -#: g10/exec.c:555 -#, c-format -msgid "unable to read external program response: %s\n" -msgstr "nie mona odczyta odpowiedzi programu zewntrznego: %s\n" - -#: g10/exec.c:601 g10/exec.c:608 -#, c-format -msgid "WARNING: unable to remove tempfile (%s) `%s': %s\n" -msgstr "OSTRZEENIE: nie mona skasowa pliku tymczasowego (%s) ,,%s'': %s.\n" - -#: g10/exec.c:613 -#, c-format -msgid "WARNING: unable to remove temp directory `%s': %s\n" -msgstr "OSTRZEENIE: nie mona 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 podlegajcy uniewanieniu.\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 uniewaniajcych dla ,,%s''\n" - -#: g10/export.c:67 -#, fuzzy -msgid "remove the passphrase from exported subkeys" -msgstr "uniewanienie podklucza" - -#: g10/export.c:69 -#, fuzzy -msgid "remove unusable parts from key during export" -msgstr "bezuyteczny 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 - pominity\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 - pominity\n" - -#: g10/export.c:373 -#, fuzzy, c-format -msgid "key %s: key material on-card - skipped\n" -msgstr "klucz %08lX: pominito - podpis na podkluczu w niewaciwym 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 powiodo si: %s\n" - -#: g10/export.c:565 -#, fuzzy, c-format -msgid "WARNING: secret key %s does not have a simple SK checksum\n" -msgstr "OSTRZEENIE: klucz prywatny %08lX nie ma prostej sumy kontrolnej SK.\n" - -#: g10/export.c:598 -msgid "WARNING: nothing exported\n" -msgstr "OSTRZEENIE: nic nie zostao wyeksportowane!\n" - -#: g10/gpg.c:375 -msgid "" -"@Commands:\n" -" " -msgstr "" -"@Polecenia:\n" -" " - -#: g10/gpg.c:377 -msgid "|[file]|make a signature" -msgstr "|[plik]|zoenie podpisu" - -#: g10/gpg.c:378 -msgid "|[file]|make a clear text signature" -msgstr "|[plik]|zoenie podpisu pod dokumentem" - -#: g10/gpg.c:379 -msgid "make a detached signature" -msgstr "zoenie podpisu oddzielonego od dokumentu" - -#: g10/gpg.c:380 -msgid "encrypt data" -msgstr "szyfrowanie danych" - -#: g10/gpg.c:382 -msgid "encryption only with symmetric cipher" -msgstr "szyfrowanie tylko szyfrem symetrycznym" - -#: g10/gpg.c:384 -msgid "decrypt data (default)" -msgstr "odszyfrowywanie danych (domylne)" - -#: g10/gpg.c:386 -msgid "verify a signature" -msgstr "sprawdzenie podpisu" - -#: g10/gpg.c:388 -msgid "list keys" -msgstr "lista kluczy" - -#: g10/gpg.c:390 -msgid "list keys and signatures" -msgstr "lista kluczy i podpisw" - -#: g10/gpg.c:391 -#, fuzzy -msgid "list and check key signatures" -msgstr "sprawdzenie podpisw kluczy" - -#: g10/gpg.c:392 -msgid "list keys and fingerprints" -msgstr "lista kluczy i ich odciskw" - -#: g10/gpg.c:393 -msgid "list secret keys" -msgstr "lista kluczy prywatnych" - -#: g10/gpg.c:394 -msgid "generate a new key pair" -msgstr "generacja nowej pary kluczy" - -#: g10/gpg.c:395 -msgid "remove keys from the public keyring" -msgstr "usunicie klucza ze zbioru kluczy publicznych" - -#: g10/gpg.c:397 -msgid "remove keys from the secret keyring" -msgstr "usunicie klucza ze zbioru kluczy prywatnych" - -#: g10/gpg.c:398 -msgid "sign a key" -msgstr "zoenie podpisu na kluczu" - -#: g10/gpg.c:399 -msgid "sign a key locally" -msgstr "zoenie prywatnego podpisu na kluczu" - -#: g10/gpg.c:400 -msgid "sign or edit a key" -msgstr "podpisanie lub modyfikacja klucza" - -#: g10/gpg.c:401 -msgid "generate a revocation certificate" -msgstr "tworzenie certyfikatu uniewanienia klucza" - -#: g10/gpg.c:403 -msgid "export keys" -msgstr "eksport kluczy do pliku" - -#: g10/gpg.c:404 -msgid "export keys to a key server" -msgstr "eksport kluczy do serwera kluczy" - -#: g10/gpg.c:405 -msgid "import keys from a key server" -msgstr "import kluczy z serwera kluczy" - -#: g10/gpg.c:407 -msgid "search for keys on a key server" -msgstr "szukanie kluczy na serwerze" - -#: g10/gpg.c:409 -msgid "update all keys from a keyserver" -msgstr "odwieenie wszystkich kluczy z serwera" - -#: g10/gpg.c:413 -msgid "import/merge keys" -msgstr "import/doczenie kluczy" - -#: g10/gpg.c:416 -msgid "print the card status" -msgstr "" - -#: g10/gpg.c:417 -msgid "change data on a card" -msgstr "" - -#: g10/gpg.c:418 -msgid "change a card's PIN" -msgstr "" - -#: g10/gpg.c:426 -msgid "update the trust database" -msgstr "uaktualnienie bazy zaufania" - -#: g10/gpg.c:433 -msgid "|algo [files]|print message digests" -msgstr "|algo [pliki]|skrty wiadomoci" - -#: g10/gpg.c:437 g10/gpgv.c:71 -msgid "" -"@\n" -"Options:\n" -" " -msgstr "" -"@\n" -"Opcje:\n" -" " - -#: g10/gpg.c:439 -msgid "create ascii armored output" -msgstr "opakowanie ASCII pliku wynikowego" - -#: g10/gpg.c:441 -msgid "|NAME|encrypt for NAME" -msgstr "|NAZWA|szyfrowanie dla odbiorcy NAZWA" - -#: g10/gpg.c:452 -msgid "use this user-id to sign or decrypt" -msgstr "identyfikator do podpisania lub odszyfrowania" - -#: g10/gpg.c:453 -msgid "|N|set compress level N (0 disables)" -msgstr "|N|poziom kompresji N (0 - bez)" - -#: g10/gpg.c:458 -msgid "use canonical text mode" -msgstr "kanoniczny format tekstowy" - -#: g10/gpg.c:472 -msgid "use as output file" -msgstr "plik wyjciowy" - -#: g10/gpg.c:474 g10/gpgv.c:73 -msgid "verbose" -msgstr "z dodatkowymi informacjami" - -#: g10/gpg.c:485 -msgid "do not make any changes" -msgstr "pozostawienie bez zmian" - -#: g10/gpg.c:486 -msgid "prompt before overwriting" -msgstr "pytanie przed nadpisaniem plikw" - -#: g10/gpg.c:527 -msgid "use strict OpenPGP behavior" -msgstr "" - -#: g10/gpg.c:528 -msgid "generate PGP 2.x compatible messages" -msgstr "" - -#: g10/gpg.c:556 -msgid "" -"@\n" -"(See the man page for a complete listing of all commands and options)\n" -msgstr "" -"@\n" -"(Pen list polece i opcji mona znale w podrczniku systemowym.)\n" - -#: g10/gpg.c:559 -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" -"Przykady:\n" -"\n" -" -se -r Bob [plik] podpisa i zaszyfrowa kluczem Boba\n" -" --clearsign [plik] podpisa z pozostawieniem czytelnoci 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:757 g10/gpgv.c:98 -msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n" -msgstr "Bdy prosimy zgasza na adres <gnupg-bugs@gnu.org>.\n" - -#: g10/gpg.c:774 -msgid "Usage: gpg [options] [files] (-h for help)" -msgstr "Wywoanie: gpg [opcje] [pliki] (-h podaje pomoc)" - -#: g10/gpg.c:777 -msgid "" -"Syntax: gpg [options] [files]\n" -"sign, check, encrypt or decrypt\n" -"default operation depends on the input data\n" -msgstr "" -"Skadnia: gpg [opcje] [pliki]\n" -"podpisywanie, sprawdzanie podpisw, szyfrowanie, deszyfrowanie\n" -"domylnie wykonywana operacja zaley od danych wejciowych\n" - -#: g10/gpg.c:788 -msgid "" -"\n" -"Supported algorithms:\n" -msgstr "" -"\n" -"Obsugiwane algorytmy:\n" - -#: g10/gpg.c:791 -msgid "Pubkey: " -msgstr "Asymetryczne: " - -#: g10/gpg.c:797 g10/keyedit.c:2310 -msgid "Cipher: " -msgstr "Symetryczne: " - -#: g10/gpg.c:803 -msgid "Hash: " -msgstr "Skrtw: " - -#: g10/gpg.c:809 g10/keyedit.c:2356 -msgid "Compression: " -msgstr "Kompresji: " - -#: g10/gpg.c:892 -msgid "usage: gpg [options] " -msgstr "wywoanie: gpg [opcje]" - -#: g10/gpg.c:1040 -msgid "conflicting commands\n" -msgstr "sprzeczne polecenia\n" - -#: g10/gpg.c:1058 -#, fuzzy, c-format -msgid "no = sign found in group definition `%s'\n" -msgstr "w definicji grupy ,,%s'' brak znaku ,,=''\n" - -#: g10/gpg.c:1255 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on homedir `%s'\n" -msgstr "OSTRZEENIE: niebezpieczne prawa wasnoci do %s ,,%s''.\n" - -#: g10/gpg.c:1258 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on configuration file `%s'\n" -msgstr "OSTRZEENIE: niebezpieczne prawa wasnoci do %s ,,%s''.\n" - -#: g10/gpg.c:1261 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on extension `%s'\n" -msgstr "OSTRZEENIE: niebezpieczne prawa wasnoci do %s ,,%s''.\n" - -#: g10/gpg.c:1267 -#, fuzzy, c-format -msgid "WARNING: unsafe permissions on homedir `%s'\n" -msgstr "OSTRZEENIE: niebezpieczne prawa dostpu do %s ,,%s''.\n" - -#: g10/gpg.c:1270 -#, fuzzy, c-format -msgid "WARNING: unsafe permissions on configuration file `%s'\n" -msgstr "OSTRZEENIE: niebezpieczne prawa dostpu do %s ,,%s''.\n" - -#: g10/gpg.c:1273 -#, fuzzy, c-format -msgid "WARNING: unsafe permissions on extension `%s'\n" -msgstr "OSTRZEENIE: niebezpieczne prawa dostpu do %s ,,%s''.\n" - -#: g10/gpg.c:1279 -#, fuzzy, c-format -msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n" -msgstr "" -"OSTRZEENIE: niebezpieczne prawa wasnoci do katalogu\n" -" zawierajcego %s ,,%s''\n" - -#: g10/gpg.c:1282 -#, fuzzy, c-format -msgid "" -"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n" -msgstr "" -"OSTRZEENIE: niebezpieczne prawa wasnoci do katalogu\n" -" zawierajcego %s ,,%s''\n" - -#: g10/gpg.c:1285 -#, fuzzy, c-format -msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n" -msgstr "" -"OSTRZEENIE: niebezpieczne prawa wasnoci do katalogu\n" -" zawierajcego %s ,,%s''\n" - -#: g10/gpg.c:1291 -#, fuzzy, c-format -msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n" -msgstr "" -"OSTRZEENIE: niebezpieczne prawa dostpu do katalogu \n" -" zawierajcego %s ,,%s''\n" - -#: g10/gpg.c:1294 -#, fuzzy, c-format -msgid "" -"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n" -msgstr "" -"OSTRZEENIE: niebezpieczne prawa dostpu do katalogu \n" -" zawierajcego %s ,,%s''\n" - -#: g10/gpg.c:1297 -#, fuzzy, c-format -msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n" -msgstr "" -"OSTRZEENIE: niebezpieczne prawa dostpu do katalogu \n" -" zawierajcego %s ,,%s''\n" - -#: g10/gpg.c:1438 -#, fuzzy, c-format -msgid "unknown configuration item `%s'\n" -msgstr "nieznana opcja ,,%s''\n" - -#: g10/gpg.c:1531 -msgid "display photo IDs during key listings" -msgstr "" - -#: g10/gpg.c:1533 -msgid "show policy URLs during signature listings" -msgstr "" - -#: g10/gpg.c:1535 -#, fuzzy -msgid "show all notations during signature listings" -msgstr "Brak odpowiadajcego podpisu w zbiorze kluczy prywatnych\n" - -#: g10/gpg.c:1537 -msgid "show IETF standard notations during signature listings" -msgstr "" - -#: g10/gpg.c:1541 -msgid "show user-supplied notations during signature listings" -msgstr "" - -#: g10/gpg.c:1543 -#, fuzzy -msgid "show preferred keyserver URLs during signature listings" -msgstr "podany URL regulaminu podpisw jest niepoprawny\n" - -#: g10/gpg.c:1545 -msgid "show user ID validity during key listings" -msgstr "" - -#: g10/gpg.c:1547 -msgid "show revoked and expired user IDs in key listings" -msgstr "" - -#: g10/gpg.c:1549 -msgid "show revoked and expired subkeys in key listings" -msgstr "" - -#: g10/gpg.c:1551 -#, fuzzy -msgid "show the keyring name in key listings" -msgstr "okazanie, w ktrym zbiorze znajduje si dany klucz" - -#: g10/gpg.c:1553 -#, fuzzy -msgid "show expiration dates during signature listings" -msgstr "Brak odpowiadajcego podpisu w zbiorze kluczy prywatnych\n" - -#: g10/gpg.c:1920 -#, c-format -msgid "NOTE: old default options file `%s' ignored\n" -msgstr "UWAGA: stary domylny plik opcji ,,%s'' zosta zignorowany\n" - -#: g10/gpg.c:1962 -#, c-format -msgid "NOTE: no default option file `%s'\n" -msgstr "UWAGA: brak domylnego pliku opcji ,,%s''\n" - -#: g10/gpg.c:1966 -#, c-format -msgid "option file `%s': %s\n" -msgstr "plik opcji ,,%s'': %s\n" - -#: g10/gpg.c:1973 -#, c-format -msgid "reading options from `%s'\n" -msgstr "odczyt opcji z ,,%s''\n" - -#: g10/gpg.c:2188 g10/gpg.c:2814 g10/gpg.c:2833 -#, c-format -msgid "NOTE: %s is not for normal use!\n" -msgstr "UWAGA: %s nie jest do normalnego uytku!\n" - -#: g10/gpg.c:2201 -#, fuzzy, c-format -msgid "cipher extension `%s' not loaded due to unsafe permissions\n" -msgstr "" -"modu szyfru ,,%s'' nie zosta zaadowany z powodu niebezpiecznych praw " -"dostpu\n" - -#: g10/gpg.c:2364 g10/gpg.c:2376 -#, fuzzy, c-format -msgid "`%s' is not a valid signature expiration\n" -msgstr "%s nie jest poprawn nazw zestawu znakw\n" - -#: g10/gpg.c:2452 -#, fuzzy, c-format -msgid "`%s' is not a valid character set\n" -msgstr "%s nie jest poprawn nazw zestawu znakw\n" - -#: g10/gpg.c:2476 g10/gpg.c:2663 g10/keyedit.c:4064 -#, fuzzy -msgid "could not parse keyserver URL\n" -msgstr "niezrozumay URI serwera kluczy\n" - -#: g10/gpg.c:2488 -#, fuzzy, c-format -msgid "%s:%d: invalid keyserver options\n" -msgstr "%s:%d niepoprawne opcje eksportu kluczy\n" - -#: g10/gpg.c:2491 -#, fuzzy -msgid "invalid keyserver options\n" -msgstr "niepoprawne opcje eksportu kluczy\n" - -#: g10/gpg.c:2498 -#, c-format -msgid "%s:%d: invalid import options\n" -msgstr "%s:%d: niepoprawne opcje wczytania kluczy\n" - -#: g10/gpg.c:2501 -msgid "invalid import options\n" -msgstr "niepoprawne opcje wczytania kluczy\n" - -#: g10/gpg.c:2508 -#, c-format -msgid "%s:%d: invalid export options\n" -msgstr "%s:%d niepoprawne opcje eksportu kluczy\n" - -#: g10/gpg.c:2511 -msgid "invalid export options\n" -msgstr "niepoprawne opcje eksportu kluczy\n" - -#: g10/gpg.c:2518 -#, fuzzy, c-format -msgid "%s:%d: invalid list options\n" -msgstr "%s:%d: niepoprawne opcje wczytania kluczy\n" - -#: g10/gpg.c:2521 -#, fuzzy -msgid "invalid list options\n" -msgstr "niepoprawne opcje wczytania kluczy\n" - -#: g10/gpg.c:2529 -msgid "display photo IDs during signature verification" -msgstr "" - -#: g10/gpg.c:2531 -msgid "show policy URLs during signature verification" -msgstr "" - -#: g10/gpg.c:2533 -#, fuzzy -msgid "show all notations during signature verification" -msgstr "%s nie jest poprawn nazw zestawu znakw\n" - -#: g10/gpg.c:2535 -msgid "show IETF standard notations during signature verification" -msgstr "" - -#: g10/gpg.c:2539 -msgid "show user-supplied notations during signature verification" -msgstr "" - -#: g10/gpg.c:2541 -#, fuzzy -msgid "show preferred keyserver URLs during signature verification" -msgstr "podany URL regulaminu podpisw jest niepoprawny\n" - -#: g10/gpg.c:2543 -#, fuzzy -msgid "show user ID validity during signature verification" -msgstr "%s nie jest poprawn nazw zestawu znakw\n" - -#: g10/gpg.c:2545 -msgid "show revoked and expired user IDs in signature verification" -msgstr "" - -#: g10/gpg.c:2547 -msgid "validate signatures with PKA data" -msgstr "" - -#: g10/gpg.c:2549 -msgid "elevate the trust of signatures with valid PKA data" -msgstr "" - -#: g10/gpg.c:2556 -#, fuzzy, c-format -msgid "%s:%d: invalid verify options\n" -msgstr "%s:%d niepoprawne opcje eksportu kluczy\n" - -#: g10/gpg.c:2559 -#, fuzzy -msgid "invalid verify options\n" -msgstr "niepoprawne opcje eksportu kluczy\n" - -#: g10/gpg.c:2566 -#, c-format -msgid "unable to set exec-path to %s\n" -msgstr "nie mona ustawi cieki programw wykonywalnych na %s\n" - -#: g10/gpg.c:2729 -#, fuzzy, c-format -msgid "%s:%d: invalid auto-key-locate list\n" -msgstr "%s:%d niepoprawne opcje eksportu kluczy\n" - -#: g10/gpg.c:2732 -msgid "invalid auto-key-locate list\n" -msgstr "" - -#: g10/gpg.c:2803 -msgid "WARNING: program may create a core file!\n" -msgstr "OSTRZEENIE: program moe stworzy plik zrzutu pamici!\n" - -#: g10/gpg.c:2807 -#, c-format -msgid "WARNING: %s overrides %s\n" -msgstr "OSTRZEENIE: %s powoduje obejcie %s\n" - -#: g10/gpg.c:2816 -#, c-format -msgid "%s not allowed with %s!\n" -msgstr "Nie wolno uywa %s z %s!\n" - -#: g10/gpg.c:2819 -#, c-format -msgid "%s makes no sense with %s!\n" -msgstr "%s nie ma sensu w poczeniu z %s!\n" - -#: g10/gpg.c:2826 -#, fuzzy, c-format -msgid "NOTE: %s is not available in this version\n" -msgstr "gpg-agent nie jest dostpny w tej sesji\n" - -#: g10/gpg.c:2841 -#, fuzzy, c-format -msgid "will not run with insecure memory due to %s\n" -msgstr "zapisuj klucz tajny w '%s'\n" - -#: g10/gpg.c:2855 -msgid "you can only make detached or clear signatures while in --pgp2 mode\n" -msgstr "" -"w trybie --pgp2 mona skada tylko podpisy oddzielne lub doczone do " -"tekstu\n" - -#: g10/gpg.c:2861 -msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n" -msgstr "w trybie --pgp2 nie mona jednoczenie szyfrowa i podpisywa\n" - -#: g10/gpg.c:2867 -msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n" -msgstr "w trybie --pgp2 trzeba uywa plikw a nie potokw.\n" - -#: g10/gpg.c:2880 -msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n" -msgstr "szyfrowanie wiadomoci w trybie --pgp2 wymaga moduu szyfru IDEA\n" - -#: g10/gpg.c:2947 g10/gpg.c:2971 -msgid "selected cipher algorithm is invalid\n" -msgstr "wybrany algorytm szyfrujcy jest niepoprawny\n" - -#: g10/gpg.c:2953 g10/gpg.c:2977 -msgid "selected digest algorithm is invalid\n" -msgstr "wybrany algorytm skrtw wiadomoci jest niepoprawny\n" - -#: g10/gpg.c:2959 -#, fuzzy -msgid "selected compression algorithm is invalid\n" -msgstr "wybrany algorytm szyfrujcy jest niepoprawny\n" - -#: g10/gpg.c:2965 -msgid "selected certification digest algorithm is invalid\n" -msgstr "wybrany algorytm skrtw powiadcze jest niepoprawny\n" - -#: g10/gpg.c:2980 -msgid "completes-needed must be greater than 0\n" -msgstr "warto completes-needed musi by wiksza od 0\n" - -#: g10/gpg.c:2982 -msgid "marginals-needed must be greater than 1\n" -msgstr "warto marginals-needed musi by wiksza od 1\n" - -#: g10/gpg.c:2984 -#, fuzzy -msgid "max-cert-depth must be in the range from 1 to 255\n" -msgstr "warto max-cert-depth musi mieci si w zakresie od 1 do 255\n" - -#: g10/gpg.c:2986 -msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n" -msgstr "" -"niewaciwy domylny poziom sprawdzania; musi mie warto 0, 1, 2 lub 3\n" - -#: g10/gpg.c:2988 -msgid "invalid min-cert-level; must be 1, 2, or 3\n" -msgstr "" -"niewaciwy minimalny poziom sprawdzania; musi mie warto 0, 1, 2 lub 3\n" - -#: g10/gpg.c:2991 -msgid "NOTE: simple S2K mode (0) is strongly discouraged\n" -msgstr "UWAGA: prosty tryb S2K (0) jest stanowczo odradzany\n" - -#: g10/gpg.c:2995 -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:3002 -msgid "invalid default preferences\n" -msgstr "niewaciwe domylne ustawienia\n" - -#: g10/gpg.c:3011 -msgid "invalid personal cipher preferences\n" -msgstr "niewaciwe ustawienia szyfrw\n" - -#: g10/gpg.c:3015 -msgid "invalid personal digest preferences\n" -msgstr "niewaciwe ustawienia skrtw\n" - -#: g10/gpg.c:3019 -msgid "invalid personal compress preferences\n" -msgstr "niewaciwe ustawienia algorytmw kompresji\n" - -#: g10/gpg.c:3052 -#, c-format -msgid "%s does not yet work with %s\n" -msgstr "%s jeszcze nie dziaa z %s!\n" - -#: g10/gpg.c:3099 -#, fuzzy, c-format -msgid "you may not use cipher algorithm `%s' while in %s mode\n" -msgstr "szyfr ,,%s'' nie jest dostpny w trybie %s\n" - -#: g10/gpg.c:3104 -#, fuzzy, c-format -msgid "you may not use digest algorithm `%s' while in %s mode\n" -msgstr "skrt ,,%s'' nie jest dostpny w trybie %s\n" - -#: g10/gpg.c:3109 -#, fuzzy, c-format -msgid "you may not use compression algorithm `%s' while in %s mode\n" -msgstr "kompresja ,,%s'' nie jest dostpna w trybie %s\n" - -#: g10/gpg.c:3208 -#, c-format -msgid "failed to initialize the TrustDB: %s\n" -msgstr "inicjowanie Bazy Zaufania nie powiodo si: %s\n" - -#: g10/gpg.c:3219 -msgid "WARNING: recipients (-r) given without using public key encryption\n" -msgstr "OSTRZEENIE: podano adresatw (-r) w dziaaniu ktre ich nie dotyczy\n" - -#: g10/gpg.c:3230 -msgid "--store [filename]" -msgstr "--store [plik]" - -#: g10/gpg.c:3237 -msgid "--symmetric [filename]" -msgstr "--symmetric [plik]" - -#: g10/gpg.c:3239 -#, fuzzy, c-format -msgid "symmetric encryption of `%s' failed: %s\n" -msgstr "bd odszyfrowywania: %s\n" - -#: g10/gpg.c:3249 -msgid "--encrypt [filename]" -msgstr "--encrypt [plik]" - -#: g10/gpg.c:3262 -#, fuzzy -msgid "--symmetric --encrypt [filename]" -msgstr "--sign --encrypt [plik]" - -#: g10/gpg.c:3264 -msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n" -msgstr "" - -#: g10/gpg.c:3267 -#, fuzzy, c-format -msgid "you cannot use --symmetric --encrypt while in %s mode\n" -msgstr "%s nie jest dostpne w trybie %s\n" - -#: g10/gpg.c:3285 -msgid "--sign [filename]" -msgstr "--sign [plik]" - -#: g10/gpg.c:3298 -msgid "--sign --encrypt [filename]" -msgstr "--sign --encrypt [plik]" - -#: g10/gpg.c:3313 -#, fuzzy -msgid "--symmetric --sign --encrypt [filename]" -msgstr "--sign --encrypt [plik]" - -#: g10/gpg.c:3315 -msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n" -msgstr "" - -#: g10/gpg.c:3318 -#, fuzzy, c-format -msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n" -msgstr "%s nie jest dostpne w trybie %s\n" - -#: g10/gpg.c:3338 -msgid "--sign --symmetric [filename]" -msgstr "--sign --symmetric [plik]" - -#: g10/gpg.c:3347 -msgid "--clearsign [filename]" -msgstr "--clearsign [plik]\"" - -#: g10/gpg.c:3372 -msgid "--decrypt [filename]" -msgstr "--decrypt [plik]" - -#: g10/gpg.c:3380 -msgid "--sign-key user-id" -msgstr "--sign-key nazwa uytkownika" - -#: g10/gpg.c:3384 -msgid "--lsign-key user-id" -msgstr "--lsign-key nazwa uytkownika" - -#: g10/gpg.c:3405 -msgid "--edit-key user-id [commands]" -msgstr "--edit-key nazwa uytkownika [polecenia]" - -#: g10/gpg.c:3476 -msgid "-k[v][v][v][c] [user-id] [keyring]" -msgstr "-k[v][v][v][c] [identyfikator] [zbir kluczy]" - -#: g10/gpg.c:3518 -#, c-format -msgid "keyserver send failed: %s\n" -msgstr "wysyka do serwera kluczy nie powioda si: %s\n" - -#: g10/gpg.c:3520 -#, c-format -msgid "keyserver receive failed: %s\n" -msgstr "odbir z serwera kluczy nie powid si: %s\n" - -#: g10/gpg.c:3522 -#, c-format -msgid "key export failed: %s\n" -msgstr "eksport kluczy nie powid si: %s\n" - -#: g10/gpg.c:3533 -#, c-format -msgid "keyserver search failed: %s\n" -msgstr "szukanie w serwerze kluczy nie powiodo si: %s\n" - -#: g10/gpg.c:3543 -#, c-format -msgid "keyserver refresh failed: %s\n" -msgstr "odwieenie kluczy z serwera nie powiodo si: %s\n" - -#: g10/gpg.c:3594 -#, c-format -msgid "dearmoring failed: %s\n" -msgstr "zdjcie opakowania ASCII nie powiodo si: %s\n" - -#: g10/gpg.c:3602 -#, c-format -msgid "enarmoring failed: %s\n" -msgstr "opakowywanie ASCII nie powiodo si: %s\n" - -#: g10/gpg.c:3689 -#, c-format -msgid "invalid hash algorithm `%s'\n" -msgstr "niewaciwy algorytm skrtu ,%s'\n" - -#: g10/gpg.c:3812 -msgid "[filename]" -msgstr "[nazwa pliku]" - -#: g10/gpg.c:3816 -msgid "Go ahead and type your message ...\n" -msgstr "Wpisz tutaj swoj wiadomo ...\n" - -#: g10/gpg.c:4120 -msgid "the given certification policy URL is invalid\n" -msgstr "podany URL regulaminu powiadczania jest niepoprawny\n" - -#: g10/gpg.c:4122 -msgid "the given signature policy URL is invalid\n" -msgstr "podany URL regulaminu podpisw jest niepoprawny\n" - -#: g10/gpg.c:4155 -#, fuzzy -msgid "the given preferred keyserver URL is invalid\n" -msgstr "podany URL regulaminu podpisw jest niepoprawny\n" - -#: g10/getkey.c:152 -msgid "too many entries in pk cache - disabled\n" -msgstr "zbyt wiele wpisw w buforze kluczy publicznych - wyczony\n" - -#: g10/getkey.c:175 -#, fuzzy -msgid "[User ID not found]" -msgstr "[brak identyfikatora uytkownika]" - -#: 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 wymusia uznanie za poprawny klucza %08lX.\n" - -#: g10/getkey.c:2380 g10/keyedit.c:3707 -#, fuzzy, c-format -msgid "no secret subkey for public subkey %s - ignoring\n" -msgstr "brak prywatnego odpowiednika podklucza publicznego %08lX - pominity\n" - -#: g10/getkey.c:2611 -#, fuzzy, c-format -msgid "using subkey %s instead of primary key %s\n" -msgstr "uywany jest podklucz %08lX zamiast klucza gwnego %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 - pominity\n" - -#: g10/gpgv.c:74 -msgid "be somewhat more quiet" -msgstr "mniej komunikatww" - -#: 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 datownikw jako bdu" - -#: 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 "Wywoanie: gpgv [opcje] [pliki] (-h podaje pomoc)" - -#: g10/gpgv.c:105 -msgid "" -"Syntax: gpg [options] [files]\n" -"Check signatures against known trusted keys\n" -msgstr "" -"Skadnia: gpgm [opcje] [pliki]\n" -"Sprawdzanie podpisw 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 uytkownik przydziela wg swojego uznania; nie bd nigdy\n" -"eksportowane poza ten system. Potrzebne s one do zbudowania sieci\n" -"zaufania, i nie ma to nic wsplnego z tworzon automatycznie sieci\n" -"certyfikatw." - -#: 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 ktrych\n" -"masz absolutne zaufanie. Zwykle s to klucze do ktrych masz klucze\n" -"tajne. Odpowiedz ,,tak'', jeli chcesz okreli ten klucz jako klucz\n" -"do ktrego masz absolutne zaufanie.\n" - -#: g10/helptext.c:62 -msgid "If you want to use this untrusted key anyway, answer \"yes\"." -msgstr "" -"Jeli mimo wszystko chcesz uy tego klucza, klucza, co do ktrego nie ma\n" -"adnej pewnoci do kogo naley, odpowiedz ,,tak''." - -#: g10/helptext.c:66 -msgid "" -"Enter the user ID of the addressee to whom you want to send the message." -msgstr "Podaj adresatw tej wiadomoci." - -#: 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 "" -"Uywanie tego samego klucza do podpisywania i szyfrowania nie jest dobrym\n" -"pomysem. Mona tak postpowa tylko w niektrych zastosowaniach. Prosz " -"si\n" -"najpierw skonsultowa z ekspertem od bezpieczestwa. " - -#: 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 zachty). \n" -"Mona tu poda dat w formacie ISO (RRRR-MM-DD) ale nie da to\n" -"waciwej obsugi bdw - system prbuje interpretowa podan warto\n" -"jako okres." - -#: g10/helptext.c:117 -msgid "Enter the name of the key holder" -msgstr "Nazwa waciciela 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" - -# OSTRZEENIE: nic nie zostao 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 "Jeli ma zosta wygenerowany podklucz, naley 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 uytkownika na kluczu naley sprawdzi, \n" -"czy tosamo uytkownika odpowiada temu, co jest wpisane w " -"identyfikatorze.\n" -"Innym uytkownikom przyda si informacja, jak dogbnie zostao to przez\n" -"Ciebie sprawdzone.\n" -"\n" -"\"0\" oznacza, e nie podajesz adnych informacji na temat tego jak " -"dogbnie\n" -" tosamo uytkownika zostaa przez Ciebie potwierdzona.\n" -"\n" -"\"1\" oznacza, e masz przekonanie, e tosamo uytkownka odpowiada\n" -" identyfikatorowi klucza, ale nie byo moliwoci sprawdzenia tego.\n" -" Taka sytuacja wystpuje te kiedy podpisujesz identyfikator bdcy\n" -" pseudonimem.\n" -"\n" -"\"2\" oznacza, e tosamo uytkownika zosta przez Ciebie potwierdzona\n" -" pobienie - sprawdzilicie odcisk klucza, sprawdzia/e tosamo\n" -" na okazanym dokumencie ze zdjciem.\n" -"\n" -"\"3\" to dogbna weryfikacja tosamoci. Na przykad sprawdzenie odcisku \n" -" klucza, sprawdzenie tosamoci z okazanego oficjalnego dokumentu ze\n" -" zdjciem (np paszportu) i weryfikacja poprawnoci adresu poczty\n" -" elektronicznej przez wymian poczty z tym adresem.\n" -"\n" -"Zauwa, e podane powyej przykady dla poziomw \"2\" i \"3\" to *tylko*\n" -"przykady. Do Ciebie naley decyzja co oznacza \"pobieny\" i \"dogbny\" " -"w\n" -"kontekcie powiadczania i podpisywania kluczy.\n" -"\n" -"Jeli 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 uytkownika." - -#: 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 uytkownika (co wie si ze utrat\n" -"wszystkich jego powiadcze!) naley odpowiedzie ,,tak''." - -#: g10/helptext.c:195 -msgid "Answer \"yes\" if it is okay to delete the subkey" -msgstr "Aby skasowa podklucz naley 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 naley go usuwa\n" -"poniewa moe by wany dla zestawienia poaczenia zaufania do klucza\n" -"ktrym go zoono lub do innego klucza nim powiadczonego." - -#: 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 moe zosta potwierdzony poniewa nie ma\n" -"odpowiadajcego mu klucza publicznego. Naley odoy usunicie tego\n" -"podpisu do czasu, kiedy okae si ktry klucz zosta uyty, poniewa\n" -"w momencie uzyskania tego klucza moe pojawi si cieka zaufania\n" -"pomidzy tym a innym, ju powiadczonym 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. Mona 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 wicy identyfikator uytkownika z kluczem. Nie naley\n" -"go usuwa - GnuPG moe nie mc posugiwa si dalej kluczem bez\n" -"takiego podpisu. Bezpiecznie mona go usun tylko jeli ten podpis\n" -"klucza nim samym z jakich przyczyn nie jest poprawny, i klucz jest\n" -"drugi raz podpisany w ten sam sposb." - -#: 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) identyfikatorw na aktualne\n" -"ustawienia. Data na odpowiednich podpisach zostane przesunita do przodu o\n" -"jedn sekund. \n" - -#: g10/helptext.c:230 -msgid "Please enter the passhrase; this is a secret sentence \n" -msgstr "Podaj dugie, skomplikowane haso, np. cae zdanie.\n" - -#: g10/helptext.c:236 -msgid "Please repeat the last passphrase, so you are sure what you typed in." -msgstr "Prosz powrtrzy haso, aby upewni si e nie byo pomyki." - -#: g10/helptext.c:240 -msgid "Give the name of the file to which the signature applies" -msgstr "Podaj nazw pliku ktrego dotyczy ten podpis" - -#: g10/helptext.c:245 -msgid "Answer \"yes\" if it is okay to overwrite the file" -msgstr "Jeli mona nadpisa ten plik, naley 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. Nacinicie ENTER potwierdzi nazw domyln (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 powd uniewanienia klucza. W zalenoci od kontekstu mona\n" -"go wybra z listy:\n" -" \"Klucz zosta skompromitowany\"\n" -" Masz powody uwaa e twj klucz tajny dosta si w niepowoane rce.\n" -" \"Klucz zosta zastpiony\"\n" -" Klucz zosta zastpiony nowym.\n" -" \"Klucz nie jest ju uywany\"\n" -" Klucz zosta wycofany z uycia.\n" -" \"Identyfikator uytkownika przesta by poprawny\"\n" -" Identyfikator uytkownika (najczciej 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 "" -"Jeli chcesz, moesz poda opis powodu wystawienia certyfikatu\n" -"uniewanienia. Opis powinien byc zwizy. \n" -"Pusta linia koczy wprowadzanie tekstu.\n" - -#: g10/helptext.c:287 -msgid "No help available" -msgstr "Pomoc niedostpna" - -#: 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 "bezuyteczny klucz prywatny" - -#: g10/import.c:108 -msgid "remove as much as possible from key after import" -msgstr "" - -#: g10/import.c:266 -#, c-format -msgid "skipping block of type %d\n" -msgstr "blok typu %d zostaje pominity\n" - -#: g10/import.c:275 -#, fuzzy, c-format -msgid "%lu keys processed so far\n" -msgstr "%lu kluczy przetworzonych do tej chwili\n" - -#: g10/import.c:292 -#, c-format -msgid "Total number processed: %lu\n" -msgstr "Ogem przetworzonych kluczy: %lu\n" - -#: g10/import.c:294 -#, c-format -msgid " skipped new keys: %lu\n" -msgstr " pominitych nowych kluczy: %lu\n" - -#: g10/import.c:297 -#, c-format -msgid " w/o user IDs: %lu\n" -msgstr " bez identyfikatora: %lu\n" - -#: g10/import.c:299 -#, c-format -msgid " imported: %lu" -msgstr " doczono do zbioru: %lu" - -#: g10/import.c:305 -#, c-format -msgid " unchanged: %lu\n" -msgstr " bez zmian: %lu\n" - -#: g10/import.c:307 -#, c-format -msgid " new user IDs: %lu\n" -msgstr " nowych identyfikatorw: %lu\n" - -#: g10/import.c:309 -#, c-format -msgid " new subkeys: %lu\n" -msgstr " nowych podkluczy: %lu\n" - -#: g10/import.c:311 -#, c-format -msgid " new signatures: %lu\n" -msgstr " nowych podpisw: %lu\n" - -#: g10/import.c:313 -#, c-format -msgid " new key revocations: %lu\n" -msgstr " nowych uniewanie kluczy: %lu\n" - -#: g10/import.c:315 -#, c-format -msgid " secret keys read: %lu\n" -msgstr " tajnych kluczy wczytanych: %lu\n" - -#: g10/import.c:317 -#, c-format -msgid " secret keys imported: %lu\n" -msgstr " tajnych kluczy dodanych: %lu\n" - -#: g10/import.c:319 -#, c-format -msgid " secret keys unchanged: %lu\n" -msgstr " tajnych kluczy bez zmian: %lu\n" - -#: g10/import.c:321 -#, c-format -msgid " not imported: %lu\n" -msgstr " nie wczono do zbioru: %lu\n" - -#: g10/import.c:323 -#, fuzzy, c-format -msgid " signatures cleaned: %lu\n" -msgstr " nowych podpisw: %lu\n" - -#: g10/import.c:325 -#, fuzzy, c-format -msgid " user IDs cleaned: %lu\n" -msgstr " tajnych kluczy wczytanych: %lu\n" - -#: g10/import.c:566 -#, 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:570 -#, fuzzy -msgid " algorithms on these user IDs:\n" -msgstr "Te identyfikatory s podpisane przez Ciebie:\n" - -#: g10/import.c:607 -#, c-format -msgid " \"%s\": preference for cipher algorithm %s\n" -msgstr "" - -#: g10/import.c:619 -#, fuzzy, c-format -msgid " \"%s\": preference for digest algorithm %s\n" -msgstr "podpis %s, skrt %s\n" - -#: g10/import.c:631 -#, c-format -msgid " \"%s\": preference for compression algorithm %s\n" -msgstr "" - -#: g10/import.c:644 -msgid "it is strongly suggested that you update your preferences and\n" -msgstr "" - -#: g10/import.c:646 -msgid "re-distribute this key to avoid potential algorithm mismatch problems\n" -msgstr "" - -#: g10/import.c:670 -#, c-format -msgid "you can update your preferences with: gpg --edit-key %s updpref save\n" -msgstr "" - -#: g10/import.c:720 g10/import.c:1118 -#, fuzzy, c-format -msgid "key %s: no user ID\n" -msgstr "klucz %08lX: brak identyfikatora uytkownika\n" - -#: g10/import.c:749 -#, fuzzy, c-format -msgid "key %s: PKS subkey corruption repaired\n" -msgstr "klucz %08lX: podklucz uszkodzony przez serwer zosta naprawiony\n" - -#: g10/import.c:764 -#, fuzzy, c-format -msgid "key %s: accepted non self-signed user ID \"%s\"\n" -msgstr "klucz %08lX: przyjto identyfikator nie podpisany nim samym ,,%s''\n" - -#: g10/import.c:770 -#, fuzzy, c-format -msgid "key %s: no valid user IDs\n" -msgstr "klucz %08lX: brak poprawnych identyfikatorw uytkownika\n" - -#: g10/import.c:772 -msgid "this may be caused by a missing self-signature\n" -msgstr "to moe by spowodowane brakiem podpisu klucza nim samym\n" - -#: g10/import.c:782 g10/import.c:1240 -#, fuzzy, c-format -msgid "key %s: public key not found: %s\n" -msgstr "klucz %08lX: brak klucza publicznego: %s\n" - -#: g10/import.c:788 -#, fuzzy, c-format -msgid "key %s: new key - skipped\n" -msgstr "klucz %08lX: nowy klucz - pominity\n" - -#: g10/import.c:797 -#, c-format -msgid "no writable keyring found: %s\n" -msgstr "brak zapisywalnego zbioru kluczy: %s\n" - -#: g10/import.c:802 g10/openfile.c:267 g10/sign.c:831 g10/sign.c:1135 -#, c-format -msgid "writing to `%s'\n" -msgstr "zapis do '%s'\n" - -#: g10/import.c:806 g10/import.c:901 g10/import.c:1158 g10/import.c:1301 -#: g10/import.c:2363 g10/import.c:2385 -#, c-format -msgid "error writing keyring `%s': %s\n" -msgstr "bd zapisu zbioru kluczy '%s': %s\n" - -#: g10/import.c:825 -#, fuzzy, c-format -msgid "key %s: public key \"%s\" imported\n" -msgstr "klucz %08lX: klucz publiczny ,,%s'' wczytano do zbioru\n" - -#: g10/import.c:849 -#, 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:866 g10/import.c:1258 -#, 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:874 g10/import.c:1265 -#, fuzzy, c-format -msgid "key %s: can't read original keyblock: %s\n" -msgstr "klucz %08lX: nie mona odczyta oryginalnego bloku klucza; %s\n" - -#: g10/import.c:911 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new user ID\n" -msgstr "klucz %08lX: ,,%s'' 1 nowy identyfikator uytkownika\n" - -#: g10/import.c:914 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new user IDs\n" -msgstr "klucz %08lX: ,,%s'' %d nowych identyfikatorw uytkownika\n" - -#: g10/import.c:917 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new signature\n" -msgstr "klucz %08lX: ,,%s'' 1 nowy podpis\n" - -#: g10/import.c:920 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new signatures\n" -msgstr "klucz %08lX: ,,%s'' %d nowych podpisw\n" - -#: g10/import.c:923 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new subkey\n" -msgstr "klucz %08lX: ,,%s'' 1 nowy podklucz\n" - -#: g10/import.c:926 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new subkeys\n" -msgstr "klucz %08lX: ,,%s'' %d nowych podkluczy\n" - -#: g10/import.c:929 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signature cleaned\n" -msgstr "klucz %08lX: ,,%s'' %d nowych podpisw\n" - -#: g10/import.c:932 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signatures cleaned\n" -msgstr "klucz %08lX: ,,%s'' %d nowych podpisw\n" - -#: g10/import.c:935 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d user ID cleaned\n" -msgstr "klucz %08lX: ,,%s'' %d nowych identyfikatorw uytkownika\n" - -#: g10/import.c:938 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d user IDs cleaned\n" -msgstr "klucz %08lX: ,,%s'' %d nowych identyfikatorw uytkownika\n" - -#: g10/import.c:961 -#, fuzzy, c-format -msgid "key %s: \"%s\" not changed\n" -msgstr "klucz %08lX: ,,%s'' bez zmian\n" - -#: g10/import.c:1124 -#, fuzzy, c-format -msgid "key %s: secret key with invalid cipher %d - skipped\n" -msgstr "klucz %08lX: klucz tajny z ustawionym szyfrem %d - pominity\n" - -#: g10/import.c:1135 -#, fuzzy -msgid "importing secret keys not allowed\n" -msgstr "zapisuj klucz tajny w '%s'\n" - -#: g10/import.c:1152 g10/import.c:2378 -#, c-format -msgid "no default secret keyring: %s\n" -msgstr "brak domylego zbioru kluczy tajnych: %s\n" - -#: g10/import.c:1163 -#, fuzzy, c-format -msgid "key %s: secret key imported\n" -msgstr "Klucz %08lX: klucz tajny wczytany do zbioru\n" - -#: g10/import.c:1193 -#, 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:1203 -#, fuzzy, c-format -msgid "key %s: secret key not found: %s\n" -msgstr "klucz %08lX: brak klucza tajnego: %s\n" - -#: g10/import.c:1233 -#, fuzzy, c-format -msgid "key %s: no public key - can't apply revocation certificate\n" -msgstr "" -"klucz %08lX: brak klucza publicznego ktrego dotyczy wczytany certyfikat\n" -" uniwanienia\n" - -#: g10/import.c:1276 -#, fuzzy, c-format -msgid "key %s: invalid revocation certificate: %s - rejected\n" -msgstr "klucz %08lX: niepoprawny certyfikat uniewanienia: %s - odrzucony\n" - -#: g10/import.c:1308 -#, fuzzy, c-format -msgid "key %s: \"%s\" revocation certificate imported\n" -msgstr "klucz %08lX: ,,%s'' certyfikat uniewanienia zosta ju wczytany\n" - -#: g10/import.c:1374 -#, fuzzy, c-format -msgid "key %s: no user ID for signature\n" -msgstr "klucz %08lX: brak identyfikatora uytkownika do podpisu\n" - -#: g10/import.c:1389 -#, fuzzy, c-format -msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n" -msgstr "klucz %08lX: algorytm asymetryczny \"%s\" nie jest obsugiwany\n" - -#: g10/import.c:1391 -#, 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:1409 -#, fuzzy, c-format -msgid "key %s: no subkey for key binding\n" -msgstr "klucz %08lX: brak podklucza do dowizania\n" - -#: g10/import.c:1420 g10/import.c:1470 -#, fuzzy, c-format -msgid "key %s: unsupported public key algorithm\n" -msgstr "klucz %08lX: nie obsugiwany algorytm asymetryczny\n" - -#: g10/import.c:1422 -#, fuzzy, c-format -msgid "key %s: invalid subkey binding\n" -msgstr "klucz %08lX: niepoprawne dowizanie podklucza\n" - -#: g10/import.c:1437 -#, fuzzy, c-format -msgid "key %s: removed multiple subkey binding\n" -msgstr "klucz %08lX: usunito wielokrotne dowizanie podklucza\n" - -#: g10/import.c:1459 -#, fuzzy, c-format -msgid "key %s: no subkey for key revocation\n" -msgstr "klucz %08lX: brak podklucza, ktrego dotyczy uniewanienie\n" - -#: g10/import.c:1472 -#, fuzzy, c-format -msgid "key %s: invalid subkey revocation\n" -msgstr "klucz %08lX: nieoprawne uniewanienie podklucza\n" - -#: g10/import.c:1487 -#, fuzzy, c-format -msgid "key %s: removed multiple subkey revocation\n" -msgstr "klucz %08lX: usunito wielokrotne uniewanienie podklucza\n" - -#: g10/import.c:1529 -#, fuzzy, c-format -msgid "key %s: skipped user ID \"%s\"\n" -msgstr "klucz %08lX: pominito identyfikator uytkownika '" - -#: g10/import.c:1550 -#, fuzzy, c-format -msgid "key %s: skipped subkey\n" -msgstr "klucz %08lX: podklucz pominity\n" - -#: g10/import.c:1577 -#, fuzzy, c-format -msgid "key %s: non exportable signature (class 0x%02X) - skipped\n" -msgstr "klucz %08lX: podpis nieeksportowalny (klasy %02x) - pominity\n" - -#: g10/import.c:1587 -#, fuzzy, c-format -msgid "key %s: revocation certificate at wrong place - skipped\n" -msgstr "" -"klucz %08lX: pominito certyfikat uniewanienia umieszczony \n" -" w niewaciwym miejscu\n" - -#: g10/import.c:1604 -#, fuzzy, c-format -msgid "key %s: invalid revocation certificate: %s - skipped\n" -msgstr "klucz %08lX: pominito - niepoprawny certyfikat uniewanienia: %s\n" - -#: g10/import.c:1618 -#, fuzzy, c-format -msgid "key %s: subkey signature in wrong place - skipped\n" -msgstr "klucz %08lX: pominito - podpis na podkluczu w niewaciwym miejscu\n" - -#: g10/import.c:1626 -#, fuzzy, c-format -msgid "key %s: unexpected signature class (0x%02X) - skipped\n" -msgstr "klucz %08lX: pominito - nieoczekiwana klasa podpisu (%02x)\n" - -#: g10/import.c:1726 -#, fuzzy, c-format -msgid "key %s: duplicated user ID detected - merged\n" -msgstr "key %08lX: doczono powtrzony identyfikator uytkownika\n" - -#: g10/import.c:1788 -#, fuzzy, c-format -msgid "WARNING: key %s may be revoked: fetching revocation key %s\n" -msgstr "" -"OSTRZEENIE: klucz %08lX mg zosta uniewazniony:\n" -" zapytanie o uniewaniajcy klucz %08lX w serwerze kluczy\n" - -#: g10/import.c:1802 -#, fuzzy, c-format -msgid "WARNING: key %s may be revoked: revocation key %s not present.\n" -msgstr "" -"OSTRZEENIE: klucz %08lX mg zosta uniewaniony:\n" -" brak uniewaniajcego klucza %08lX.\n" - -#: g10/import.c:1861 -#, fuzzy, c-format -msgid "key %s: \"%s\" revocation certificate added\n" -msgstr "klucz %08lX: ,,%s'' dodany certyfikat uniewanienia\n" - -#: g10/import.c:1895 -#, fuzzy, c-format -msgid "key %s: direct key signature added\n" -msgstr "klucz %08lX: dodano bezporedni podpis\n" - -#: g10/import.c:2284 -#, 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:2292 -#, fuzzy -msgid "NOTE: primary key is online and stored on card\n" -msgstr "pominity: klucz prywatny jest ju wpisany\n" - -#: g10/import.c:2294 -#, fuzzy -msgid "NOTE: secondary key is online and stored on card\n" -msgstr "pominity: klucz prywatny jest ju wpisany\n" - -#: g10/keydb.c:168 -#, c-format -msgid "error creating keyring `%s': %s\n" -msgstr "bd tworzenia zbioru kluczy `%s': %s\n" - -#: g10/keydb.c:175 -#, c-format -msgid "keyring `%s' created\n" -msgstr "zbir kluczy ,,%s'' zosta utworzony\n" - -#: g10/keydb.c:316 g10/keydb.c:319 -#, fuzzy, c-format -msgid "keyblock resource `%s': %s\n" -msgstr "bd tworzenia `%s': %s\n" - -#: g10/keydb.c:698 -#, c-format -msgid "failed to rebuild keyring cache: %s\n" -msgstr "nie powioda si odbudowa bufora bazy: %s\n" - -#: g10/keyedit.c:266 -msgid "[revocation]" -msgstr "[uniewanienie]" - -#: 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 podpisw\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 podpisw nie zostao 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 bdu\n" - -#: g10/keyedit.c:355 g10/keylist.c:400 -#, c-format -msgid "%d signatures not checked due to errors\n" -msgstr "%d podpisw nie sprawdzonych z powodu bdw\n" - -#: g10/keyedit.c:357 -msgid "1 user ID without valid self-signature detected\n" -msgstr "wykryto 1 identyfikator uytkownika niepodpisany tym samym kluczem\n" - -#: g10/keyedit.c:359 -#, c-format -msgid "%d user IDs without valid self-signatures detected\n" -msgstr "" -"wykryto %d identyfikatorw uytkownika 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 "" -"Zastanw si jak bardzo ufasz temu uytkownikowi w kwestii sprawdzania\n" -"tosamoci innych uytkownikw (czy sprawdzi on odciski kluczy pobrane\n" -"z rnych rde, dokumenty potwierdzajce tosamo, 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 pene 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 uytkownika ,,%s'' zosta uniewaniony." - -#: 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 zoy podpisu.\n" - -#: g10/keyedit.c:627 -#, c-format -msgid "User ID \"%s\" is expired." -msgstr "Identyfikator uytkownika ,,%s'' przekroczy swj termin wanoci." - -#: 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 zoonym 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 "" -"Twj podpis na \"%s\"\n" -"przekroczy dat wanoci.\n" - -#: g10/keyedit.c:734 -msgid "Do you want to issue a new signature to replace the expired one? (y/N) " -msgstr "Czy chcesz zastpi przeterminowany podpis nowym? (t/N) " - -#: g10/keyedit.c:755 -#, c-format -msgid "" -"Your current signature on \"%s\"\n" -"is a local signature.\n" -msgstr "" -"Twj 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 peny, 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 wanoci tego klucza upyna!" - -#: g10/keyedit.c:843 -#, c-format -msgid "This key is due to expire on %s.\n" -msgstr "Wano 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 wano Twojego podpisu wygasaa 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 mona 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 dokadnie zostaa przez Ciebie sprawdzona tosamo tej osoby?\n" -"Jeli 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 ogle nie.%s\n" - -#: g10/keyedit.c:925 -#, c-format -msgid " (2) I have done casual checking.%s\n" -msgstr " (2) Pobienie.%s\n" - -#: g10/keyedit.c:927 -#, c-format -msgid " (3) I have done very careful checking.%s\n" -msgstr " (3) Bardzo dokadnie.%s\n" - -#: g10/keyedit.c:933 -#, fuzzy -msgid "Your selection? (enter `?' for more information): " -msgstr "Twj wybr (,,?'' podaje wicej 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 bdzie podpis klucza nim samym.\n" - -#: g10/keyedit.c:970 -#, fuzzy -msgid "WARNING: the signature will not be marked as non-exportable.\n" -msgstr "" -"\n" -"OSTRZEENIE: 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" -"OSTRZEENIE: podpis zostanie oznaczony jako nie podlegajcy uniewanieniu.\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 podlegajcy uniewanieniu.\n" - -#: g10/keyedit.c:1002 -#, fuzzy -msgid "I have not checked this key at all.\n" -msgstr "" -"\n" -"Tosamo uytkownika nie zostaa w ogle sprawdzona.\n" - -#: g10/keyedit.c:1007 -#, fuzzy -msgid "I have checked this key casually.\n" -msgstr "" -"\n" -"Tosamo uytkownika zostaa sprawdzona pobienie.\n" - -#: g10/keyedit.c:1012 -#, fuzzy -msgid "I have checked this key very carefully.\n" -msgstr "" -"\n" -"Tosamo uytkownika zostaa dokadnie 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:4783 g10/keyedit.c:4874 g10/keyedit.c:4938 -#: g10/keyedit.c:4999 g10/sign.c:352 -#, c-format -msgid "signing failed: %s\n" -msgstr "zoenie podpisu nie powiodo 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 gwnego klucza jest niedostpna.\n" - -#: g10/keyedit.c:1151 g10/keygen.c:3202 -#, fuzzy -msgid "Secret parts of primary key are stored on-card.\n" -msgstr "Cz tajna gwnego klucza jest niedostpna.\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 mona edytowa: %s.\n" - -#: g10/keyedit.c:1185 -msgid "" -"Enter the new passphrase for this secret key.\n" -"\n" -msgstr "" -"Wprowad nowe dugie, skomplikowane haso dla tego klucza tajnego.\n" -"\n" - -#: g10/keyedit.c:1194 g10/keygen.c:1897 -msgid "passphrase not correctly repeated; try again" -msgstr "haso nie zostao poprawnie powtrzone; jeszcze jedna prba" - -#: g10/keyedit.c:1199 -msgid "" -"You don't want a passphrase - this is probably a *bad* idea!\n" -"\n" -msgstr "" -"Nie chcesz hasa - to *zy* 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 waciwe miejsce\n" - -#: g10/keyedit.c:1359 -msgid "save and quit" -msgstr "zapis zmian i wyjcie" - -#: 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 identyfikatorw uytkownikw" - -#: g10/keyedit.c:1365 -msgid "select user ID N" -msgstr "wybr identyfikatora uytkownika N" - -#: g10/keyedit.c:1366 -#, fuzzy -msgid "select subkey N" -msgstr "wybr identyfikatora uytkownika N" - -#: g10/keyedit.c:1367 -#, fuzzy -msgid "check signatures" -msgstr "uniewanienie 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 "zoenie prywatnego (lokalnego) podpisu na kluczu" - -#: g10/keyedit.c:1379 -#, fuzzy -msgid "sign selected user IDs with a trust signature" -msgstr "lid %lu: niepodpisany identyfikator uytkownika\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 uytkownika do klucza" - -#: g10/keyedit.c:1387 -msgid "add a photo ID" -msgstr "dodanie zdjcia uytkownika do klucza" - -#: g10/keyedit.c:1389 -#, fuzzy -msgid "delete selected user IDs" -msgstr "usunicie identyfikatora uytkownika 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 "usunicie podklucza" - -#: g10/keyedit.c:1408 -msgid "add a revocation key" -msgstr "wyznaczenie klucza uniewaniajcego" - -#: g10/keyedit.c:1410 -#, fuzzy -msgid "delete signatures from the selected user IDs" -msgstr "" -"Czy na pewno zaktualizowa ustawienia klucza dla wybranych identyfikatorw? " - -#: g10/keyedit.c:1412 -#, fuzzy -msgid "change the expiration date for the key or selected subkeys" -msgstr "Nie mona zmieni daty wanoci klucza w wersji 3.\n" - -#: g10/keyedit.c:1414 -#, fuzzy -msgid "flag the selected user ID as primary" -msgstr "oznaczenie identyfikatora uytkownika jako gwnego" - -#: g10/keyedit.c:1416 -#, fuzzy -msgid "toggle between the secret and public key listings" -msgstr "przeczenie pomidzy 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 identyfikatorw? " - -#: g10/keyedit.c:1428 -#, fuzzy -msgid "set the preferred keyserver URL for the selected user IDs" -msgstr "niezrozumay 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 identyfikatorw? " - -#: g10/keyedit.c:1432 -msgid "change the passphrase" -msgstr "zmiana hasa klucza" - -#: g10/keyedit.c:1436 -msgid "change the ownertrust" -msgstr "zmiana zaufania waciciela" - -#: g10/keyedit.c:1438 -#, fuzzy -msgid "revoke signatures on the selected user IDs" -msgstr "Czy na pewno uniewani wszystkie wybrane identyfikatory uytkownika? " - -#: g10/keyedit.c:1440 -#, fuzzy -msgid "revoke selected user IDs" -msgstr "uniewanienie identyfikatora uytkownika" - -#: g10/keyedit.c:1445 -#, fuzzy -msgid "revoke key or selected subkeys" -msgstr "uniewanienie podklucza" - -#: g10/keyedit.c:1446 -#, fuzzy -msgid "enable key" -msgstr "wczy klucz do uycia" - -#: g10/keyedit.c:1447 -#, fuzzy -msgid "disable key" -msgstr "wyczy klucz z uycia" - -#: g10/keyedit.c:1448 -#, fuzzy -msgid "show selected photo IDs" -msgstr "okazanie identyfikatora - zdjcia" - -#: 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 "bd odczytu bloku klucza tajnego '%s': %s\n" - -#: g10/keyedit.c:1588 -msgid "Secret key is available.\n" -msgstr "Dostpny 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 uy 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 uniewaniony." - -#: g10/keyedit.c:1755 -#, fuzzy -msgid "Really sign all user IDs? (y/N) " -msgstr "Podpisa wszystkie identyfikatory uytkownika na tym kluczu? " - -#: g10/keyedit.c:1762 -msgid "Hint: Select the user IDs to sign\n" -msgstr "Podpowied: wybierz identyfikatory uytkownika 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 dostpne 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 uytkownika.\n" - -#: g10/keyedit.c:1818 -msgid "You can't delete the last user ID!\n" -msgstr "Nie moesz usun ostatniego identyfikatora uytkownika!\n" - -#: g10/keyedit.c:1820 -#, fuzzy -msgid "Really remove all selected user IDs? (y/N) " -msgstr "Czy na pewno usun wszystkie wybrane identyfikatory uytkownika? " - -#: g10/keyedit.c:1821 -#, fuzzy -msgid "Really remove this user ID? (y/N) " -msgstr "Czy na pewno usun ten identyfikator uytkownika? " - -#: g10/keyedit.c:1871 -#, fuzzy -msgid "Really move the primary key? (y/N) " -msgstr "Czy na pewno usun ten identyfikator uytkownika? " - -#: 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 mona otworzy ,,%s'': %s\n" - -#: g10/keyedit.c:1942 -#, fuzzy, c-format -msgid "Error reading backup key from `%s': %s\n" -msgstr "bd 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 uniewani wszystkie wybrane identyfikatory uytkownika? " - -#: g10/keyedit.c:2006 -#, fuzzy -msgid "Really revoke this user ID? (y/N) " -msgstr "Czy na pewno uniewani ten identyfikator uytkownika? " - -#: g10/keyedit.c:2024 -#, fuzzy -msgid "Do you really want to revoke the entire key? (y/N) " -msgstr "Czy na pewno chcesz uniewani ten klucz? " - -#: g10/keyedit.c:2035 -#, fuzzy -msgid "Do you really want to revoke the selected subkeys? (y/N) " -msgstr "Czy na pewno chcesz uniewani wybrane klucze? " - -#: g10/keyedit.c:2037 -#, fuzzy -msgid "Do you really want to revoke this subkey? (y/N) " -msgstr "Czy na pewno chcesz uniewani 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 identyfikatorw? " - -#: 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 powid si: %s\n" - -#: g10/keyedit.c:2225 -#, c-format -msgid "update secret failed: %s\n" -msgstr "zapis zmian na kluczu prywatnym nie powid si: %s\n" - -#: g10/keyedit.c:2232 -msgid "Key not changed so no update needed.\n" -msgstr "Klucz nie zosta zmieniony wic zapis zmian nie jest konieczny.\n" - -#: g10/keyedit.c:2333 -msgid "Digest: " -msgstr "Skrt: " - -#: 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 moe zosta uniewaniony przez klucz %s " - -#: g10/keyedit.c:2710 -#, fuzzy, c-format -msgid "This key may be revoked by %s key %s" -msgstr "Klucz moe zosta uniewaniony 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 mona 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 "[uniewaniony]" - -#: 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 wyczony z uytku" - -#: 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 wiarygodnoci klucza moe by niepoprawna,\n" -"dopki 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 "[uniewaniony]" - -#: 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 "" -"OSTRZEENIE: aden identyfikator uytkownika nie zosta oznaczony explicite\n" -" jako gwny. Wykonanie tego polecenie moe wic spowodowa\n" -" wywietlanie innego identyfikatora jako domylnego gwnego.\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 "" -"OSTRZEENIE: To jest klucz PGP wersji 2. Dodanie zdjcia spowoduje, e\n" -" niektre wersje przestan go rozumie.\n" - -#: g10/keyedit.c:3016 g10/keyedit.c:3346 -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 mona doda zdjcia.\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 usunity.\n" - -#: g10/keyedit.c:3197 -#, c-format -msgid "Deleted %d signatures.\n" -msgstr "%d podpisw usunitych.\n" - -#: g10/keyedit.c:3200 -msgid "Nothing deleted.\n" -msgstr "Nic nie zostao usunite.\n" - -#: g10/keyedit.c:3233 g10/trustdb.c:1703 -msgid "invalid" -msgstr "niepoprawny" - -#: g10/keyedit.c:3249 -#, fuzzy, c-format -msgid "User ID \"%s\": already clean\n" -msgstr "identyfikator uytkownika ,,%s'' zosta ju uniewaniony\n" - -#: g10/keyedit.c:3341 -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 "" -"OSTRZEENIE: To jest klucz PGP wersji 2.x. Wyznaczenie mu klucza\n" -" uniewaniajcego, spowoduje, e niektre wersje PGP przestan\n" -" go rozumie.\n" - -#: g10/keyedit.c:3352 -msgid "You may not add a designated revoker to a PGP 2.x-style key.\n" -msgstr "Do klucza dla PGP 2.x nie mona wyznaczy klucza uniewaniajcego.\n" - -#: g10/keyedit.c:3372 -msgid "Enter the user ID of the designated revoker: " -msgstr "Podaj identyfikator klucza uniewaniajcego: " - -#: g10/keyedit.c:3397 -msgid "cannot appoint a PGP 2.x style key as a designated revoker\n" -msgstr "klucza PGP 2.x nie mona wyznaczy jako uniewaniajcego\n" - -#: g10/keyedit.c:3412 -msgid "you cannot appoint a key as its own designated revoker\n" -msgstr "nie mona wyznaczu klucza do uniewaniania jego samego\n" - -#: g10/keyedit.c:3434 -#, fuzzy -msgid "this key has already been designated as a revoker\n" -msgstr "OSTRZEENIE: Ten klucz zosta uniewaniony kluczem uniewaniajcym!\n" - -#: g10/keyedit.c:3453 -msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n" -msgstr "" -"OSTRZEENIE: nie mona cofn wyznaczenia klucza jako uniewaniajcego!\n" - -#: g10/keyedit.c:3459 -#, 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 uniewaniajcy? (t/N): " - -#: g10/keyedit.c:3520 -msgid "Please remove selections from the secret keys.\n" -msgstr "Prosz usun znacznik wyboru z kluczy prywatnych.\n" - -#: g10/keyedit.c:3526 -#, fuzzy -msgid "Please select at most one subkey.\n" -msgstr "Prosz wybra tylko jeden podklucz.\n" - -#: g10/keyedit.c:3530 -#, fuzzy -msgid "Changing expiration time for a subkey.\n" -msgstr "Zmiana daty wanoci podklucza.\n" - -#: g10/keyedit.c:3533 -msgid "Changing expiration time for the primary key.\n" -msgstr "Zmiana daty wanoci gwnego klucza.\n" - -#: g10/keyedit.c:3579 -msgid "You can't change the expiration date of a v3 key\n" -msgstr "Nie mona zmieni daty wanoci klucza w wersji 3.\n" - -#: g10/keyedit.c:3595 -msgid "No corresponding signature in secret ring\n" -msgstr "Brak odpowiadajcego podpisu w zbiorze kluczy prywatnych\n" - -#: g10/keyedit.c:3668 -#, fuzzy, c-format -msgid "signing subkey %s is already cross-certified\n" -msgstr "OSTRZEENIE: podklucz podpisujcy %08lX nie jest skronie podpisany\n" - -#: g10/keyedit.c:3674 -#, c-format -msgid "subkey %s does not sign and so does not need to be cross-certified\n" -msgstr "" - -#: g10/keyedit.c:3836 -msgid "Please select exactly one user ID.\n" -msgstr "Prosz wybra dokadnie jeden identyfikator uytkownika.\n" - -#: g10/keyedit.c:3875 g10/keyedit.c:3985 g10/keyedit.c:4105 g10/keyedit.c:4246 -#, fuzzy, c-format -msgid "skipping v3 self-signature on user ID \"%s\"\n" -msgstr "podpis w wersji 3 na identyfikatorze ,,%s'' zostaje pominity\n" - -#: g10/keyedit.c:4046 -msgid "Enter your preferred keyserver URL: " -msgstr "" - -#: g10/keyedit.c:4126 -#, fuzzy -msgid "Are you sure you want to replace it? (y/N) " -msgstr "Czy na pewno chcesz tego uy? (t/N) " - -#: g10/keyedit.c:4127 -#, fuzzy -msgid "Are you sure you want to delete it? (y/N) " -msgstr "Czy na pewno chcesz tego uy? (t/N) " - -#: g10/keyedit.c:4189 -#, fuzzy -msgid "Enter the notation: " -msgstr "Adnotacje podpisu: " - -#: g10/keyedit.c:4338 -#, fuzzy -msgid "Proceed? (y/N) " -msgstr "Nadpisa (t/N)? " - -#: g10/keyedit.c:4402 -#, c-format -msgid "No user ID with index %d\n" -msgstr "Brak identyfikatora uytkownika o numerze %d.\n" - -#: g10/keyedit.c:4460 -#, fuzzy, c-format -msgid "No user ID with hash %s\n" -msgstr "Brak identyfikatora uytkownika o numerze %d.\n" - -#: g10/keyedit.c:4487 -#, fuzzy, c-format -msgid "No subkey with index %d\n" -msgstr "Brak identyfikatora uytkownika o numerze %d.\n" - -#: g10/keyedit.c:4622 -#, fuzzy, c-format -msgid "user ID: \"%s\"\n" -msgstr "Identyfikator uytkownika: " - -#: g10/keyedit.c:4625 g10/keyedit.c:4689 g10/keyedit.c:4732 -#, 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:4627 g10/keyedit.c:4691 g10/keyedit.c:4734 -msgid " (non-exportable)" -msgstr " (podpis nieeksportowalny) " - -#: g10/keyedit.c:4631 -#, c-format -msgid "This signature expired on %s.\n" -msgstr "Wano tego klucza wygasa %s.\n" - -#: g10/keyedit.c:4635 -msgid "Are you sure you still want to revoke it? (y/N) " -msgstr "Czy dalej chcesz go uniewani? (t/N) " - -#: g10/keyedit.c:4639 -msgid "Create a revocation certificate for this signature? (y/N) " -msgstr "Stworzy certyfikat uniewanienia tego podpisu? (t/N) " - -#: g10/keyedit.c:4666 -#, 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:4692 -#, fuzzy -msgid " (non-revocable)" -msgstr " (podpis nieeksportowalny) " - -#: g10/keyedit.c:4699 -#, fuzzy, c-format -msgid "revoked by your key %s on %s\n" -msgstr "uniewaniony przez %08lX w %s\n" - -#: g10/keyedit.c:4721 -msgid "You are about to revoke these signatures:\n" -msgstr "Czy na pewno chcesz uniewani te podpisy:\n" - -#: g10/keyedit.c:4741 -msgid "Really create the revocation certificates? (y/N) " -msgstr "Na pewno utworzy certyfikaty uniewanienia ? (t/N) " - -#: g10/keyedit.c:4771 -msgid "no secret key\n" -msgstr "brak klucza tajnego\n" - -#: g10/keyedit.c:4841 -#, c-format -msgid "user ID \"%s\" is already revoked\n" -msgstr "identyfikator uytkownika ,,%s'' zosta ju uniewaniony\n" - -#: g10/keyedit.c:4858 -#, c-format -msgid "WARNING: a user ID signature is dated %d seconds in the future\n" -msgstr "" -"OSTRZEENIE: identyfikator uytkownika podpisany za %d sekund (w " -"przyszoci)\n" - -#: g10/keyedit.c:4922 -#, fuzzy, c-format -msgid "Key %s is already revoked.\n" -msgstr "identyfikator uytkownika ,,%s'' zosta ju uniewaniony\n" - -#: g10/keyedit.c:4984 -#, fuzzy, c-format -msgid "Subkey %s is already revoked.\n" -msgstr "identyfikator uytkownika ,,%s'' zosta ju uniewaniony\n" - -#: g10/keyedit.c:5079 -#, fuzzy, c-format -msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n" -msgstr "Zdjcie w formacie %s, rozmiar %ld bajtw, 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 "niewaciwy znak w tekcie ustawie\n" - -#: g10/keygen.c:872 -msgid "writing direct signature\n" -msgstr "zapis podpisu bezporedniego\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 wicego 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 "niewaciwa dugo klucza; wykorzystano %u bitw\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 zaokrglony do %u bitw\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 algorytmw DSA i ElGamala (domylne)\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 bdzie miaa 1024 bity dugoci.\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 dugoci 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 dugo klucza to %u bitw.\n" - -#: g10/keygen.c:1556 g10/keygen.c:1561 -#, c-format -msgid "rounded up to %u bits\n" -msgstr "zaokrglono do %u bitw\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 wanoi klucza.\n" -" 0 = klucz nie ma okrelonego terminu wanoci\n" -" <n> = termin wanoci klucza upywa za n dni\n" -" <n>w = termin wanoci klucza upywa za n tygodni\n" -" <n>m = termin wanoci klucza upywa za n miesicy\n" -" <n>y = termin wanoci klucza upywa 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 wanoi podpisu.\n" -" 0 = klucz nie ma okrelonego terminu wanoci\n" -" <n> = termin wanoci podpisu upywa za n dni\n" -" <n>w = termin wanoci podpisu upywa za n tygodni\n" -" <n>m = termin wanoci podpisu upywa za n miesicy\n" -" <n>y = termin wanoci podpisu upywa za n lat\n" - -#: g10/keygen.c:1644 -msgid "Key is valid for? (0) " -msgstr "Okres wanoci klucza ? (0) " - -#: g10/keygen.c:1649 -#, fuzzy, c-format -msgid "Signature is valid for? (%s) " -msgstr "Okres wanoci 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 wanoci\n" - -#: g10/keygen.c:1675 -#, fuzzy -msgid "Signature does not expire at all\n" -msgstr "%s nie ma daty wanoci\n" - -#: g10/keygen.c:1680 -#, fuzzy, c-format -msgid "Key expires at %s\n" -msgstr "%s traci wano: %s\n" - -#: g10/keygen.c:1681 -#, fuzzy, c-format -msgid "Signature expires at %s\n" -msgstr "Wano 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 "" -"Twj system nie potrafi pokaza daty po roku 2038.\n" -"Niemniej daty do roku 2106 bd poprawnie obsugiwane.\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 uytkownika aby mona byo rozpozna twj klucz;\n" -"program zoy go z twojego imienia i nazwiska, komentarza i adresu poczty\n" -"elektronicznej. Bdzie on mia, na przykad, tak posta:\n" -" \"Tadeusz eleski (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 "Niewaciwy znak w imieniu lub nazwisku\n" - -#: g10/keygen.c:1738 -msgid "Name may not start with a digit\n" -msgstr "Imi lub nazwisko nie moe 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 znakw dugoci.\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 "Niewaciwy znak w komentarzu\n" - -#: g10/keygen.c:1791 -#, c-format -msgid "You are using the `%s' character set.\n" -msgstr "Uywasz zestawu znakw %s.\n" - -#: g10/keygen.c:1797 -#, c-format -msgid "" -"You selected this USER-ID:\n" -" \"%s\"\n" -"\n" -msgstr "" -"Twj identyfikator uytkownika bdzie wyglda 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 bd\n" - -#: g10/keygen.c:1888 -msgid "" -"You need a Passphrase to protect your secret key.\n" -"\n" -msgstr "" -"Musisz poda dugie, skomplikowane haso aby ochroni swj 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 hasa - to *zy* pomys!\n" -"W kadej chwili moesz ustawi haso uywajc 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 duo losowych bajtw. Dobrym pomysem aby pomc " -"komputerowi\n" -"podczas generowania liczb pierszych jest wykonywanie w tym czasie innych\n" -"dziaa (pisanie na klawiaturze, poruszanie myszk, odwoanie si do " -"dyskw);\n" -"dziki temu generator liczb losowych ma moliwo zebrania odpowiedniej " -"iloci\n" -"entropii.\n" - -#: g10/keygen.c:2708 -msgid "Key generation canceled.\n" -msgstr "Procedura generacji klucza zostaa 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 "bd podczas zapisu zbioru kluczy publicznych ,,%s'': %s\n" - -#: g10/keygen.c:3072 -#, c-format -msgid "error writing secret keyring `%s': %s\n" -msgstr "bd 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) zostay 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 moe by wykorzystany do szyfrowania. Komend \"--edit-key\"\n" -"mona doda do niego podklucz szyfrujcy.\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 powioda 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 przyszoci (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 przyszoci (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 "usunicie bloku klucza nie powiodo si: %s\n" - -#: g10/keygen.c:3556 -#, fuzzy, c-format -msgid "can't create backup file `%s': %s\n" -msgstr "nie mona utworzy ,,%s'': %s\n" - -#: g10/keygen.c:3582 -#, fuzzy, c-format -msgid "NOTE: backup of card key saved to `%s'\n" -msgstr "UWAGA: wano klucza tajnego %08lX wygasa %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 "Zbir kluczy" - -#: g10/keylist.c:1505 -msgid "Primary key fingerprint:" -msgstr "Odcisk klucza gwnego:" - -#: 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 gwnego:" - -#: 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 powiodo si: %s\n" - -#: g10/keyring.c:1252 -msgid "WARNING: 2 files with confidential information exists.\n" -msgstr "OSTRZEENIE: 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 bezpieczestwa\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 podpisw)\n" - -#: g10/keyring.c:1434 -#, fuzzy, c-format -msgid "%lu keys cached (%lu signatures)\n" -msgstr "%lu kluczy (%lu podpisw)\n" - -#: g10/keyring.c:1505 -#, c-format -msgid "%s: keyring created\n" -msgstr "%s: zbir 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 podpisw 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 "OSTRZEENIE: opcje w ,,%s'' nie s jeszcze uwzgldnione.\n" - -#: g10/keyserver.c:523 -#, fuzzy -msgid "disabled" -msgstr "wykl" - -#: g10/keyserver.c:724 -msgid "Enter number(s), N)ext, or Q)uit > " -msgstr "" - -#: g10/keyserver.c:808 g10/keyserver.c:1421 -#, 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:1324 -#, fuzzy, c-format -msgid "sending key %s to %s server %s\n" -msgstr "zapytanie o ,,%s'' w serwerze HKP %s\n" - -#: g10/keyserver.c:1328 -#, fuzzy, c-format -msgid "sending key %s to %s\n" -msgstr "" -"\"\n" -"podpisano Twoim kluczem %08lX w %s\n" - -#: g10/keyserver.c:1371 -#, fuzzy, c-format -msgid "searching for \"%s\" from %s server %s\n" -msgstr "zapytanie o ,,%s'' w serwerze HKP %s\n" - -#: g10/keyserver.c:1374 -#, fuzzy, c-format -msgid "searching for \"%s\" from %s\n" -msgstr "zapytanie o ,,%s'' w serwerze HKP %s\n" - -#: g10/keyserver.c:1381 g10/keyserver.c:1477 -#, fuzzy -msgid "no keyserver action!\n" -msgstr "niepoprawne opcje eksportu kluczy\n" - -#: g10/keyserver.c:1429 -#, c-format -msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n" -msgstr "" - -#: g10/keyserver.c:1438 -msgid "keyserver did not send VERSION\n" -msgstr "" - -#: g10/keyserver.c:1500 g10/keyserver.c:2028 -msgid "no keyserver known (use option --keyserver)\n" -msgstr "brak znanyk serwerw kluczy (uyj opcji --keyserver)\n" - -#: g10/keyserver.c:1506 -msgid "external keyserver calls are not supported in this build\n" -msgstr "" - -#: g10/keyserver.c:1518 -#, c-format -msgid "no handler for keyserver scheme `%s'\n" -msgstr "" - -#: g10/keyserver.c:1523 -#, c-format -msgid "action `%s' not supported with keyserver scheme `%s'\n" -msgstr "" - -#: g10/keyserver.c:1531 -#, c-format -msgid "%s does not support handler version %d\n" -msgstr "" - -#: g10/keyserver.c:1538 -#, fuzzy -msgid "keyserver timed out\n" -msgstr "bd serwera kluczy" - -#: g10/keyserver.c:1543 -#, fuzzy -msgid "keyserver internal error\n" -msgstr "bd serwera kluczy" - -#: g10/keyserver.c:1552 -#, fuzzy, c-format -msgid "keyserver communications error: %s\n" -msgstr "odbir z serwera kluczy nie powid si: %s\n" - -#: g10/keyserver.c:1577 g10/keyserver.c:1611 -#, fuzzy, c-format -msgid "\"%s\" not a key ID: skipping\n" -msgstr "%s: nie jest poprawnym identyfikatorem klucza\n" - -#: g10/keyserver.c:1870 -#, fuzzy, c-format -msgid "WARNING: unable to refresh key %s via %s: %s\n" -msgstr "OSTRZEENIE: nie mona skasowa pliku tymczasowego (%s) ,,%s'': %s.\n" - -#: g10/keyserver.c:1892 -#, fuzzy, c-format -msgid "refreshing 1 key from %s\n" -msgstr "zapytanie o klucz %08lX w %s\n" - -#: g10/keyserver.c:1894 -#, fuzzy, c-format -msgid "refreshing %d keys from %s\n" -msgstr "zapytanie o klucz %08lX w %s\n" - -#: g10/keyserver.c:1950 -#, fuzzy, c-format -msgid "WARNING: unable to fetch URI %s: %s\n" -msgstr "OSTRZEENIE: nie mona skasowa pliku tymczasowego (%s) ,,%s'': %s.\n" - -#: g10/keyserver.c:1956 -#, fuzzy, c-format -msgid "WARNING: unable to parse URI %s\n" -msgstr "OSTRZEENIE: nie mona 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 "bd 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 hasem\n" - -#: g10/mainproc.c:541 g10/mainproc.c:563 -#, c-format -msgid "assuming %s encrypted data\n" -msgstr "przyjmujc e dane zostay 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 dostpny, prba uycia %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 "OSTRZEENIE: wiadomo nie bya zabezpieczona przed manipulacj\n" - -#: g10/mainproc.c:598 -msgid "WARNING: encrypted message has been manipulated!\n" -msgstr "OSTRZEENIE: zaszyfrowana wiadomo bya manipulowana!\n" - -#: g10/mainproc.c:604 -#, c-format -msgid "decryption failed: %s\n" -msgstr "bd 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 uniewanienia - uyj ,,gpg --import'' aby go wczyta\n" - -#: g10/mainproc.c:1165 -#, fuzzy -msgid "no signature found\n" -msgstr "Poprawny podpis zoony przez \"" - -#: g10/mainproc.c:1408 -msgid "signature verification suppressed\n" -msgstr "wymuszono pominicie sprawdzenia podpisu\n" - -#: g10/mainproc.c:1508 -#, fuzzy -msgid "can't handle this ambiguous signature data\n" -msgstr "nie mona obsuzy tych wielokrotnych podpisw\n" - -#: g10/mainproc.c:1519 -#, fuzzy, c-format -msgid "Signature made %s\n" -msgstr "Wano podpisu wygasa %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 dostpny w: " - -#: g10/mainproc.c:1677 g10/mainproc.c:1725 -#, fuzzy, c-format -msgid "BAD signature from \"%s\"" -msgstr "NIEPOPRAWNY podpis zoony przez \"" - -#: g10/mainproc.c:1679 g10/mainproc.c:1727 -#, fuzzy, c-format -msgid "Expired signature from \"%s\"" -msgstr "Przeterminowany podpis zoony przez \"" - -#: g10/mainproc.c:1681 g10/mainproc.c:1729 -#, fuzzy, c-format -msgid "Good signature from \"%s\"" -msgstr "Poprawny podpis zoony 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 "Wano podpisu wygasa %s.\n" - -#: g10/mainproc.c:1868 -#, c-format -msgid "Signature expires %s\n" -msgstr "Wano podpisu wygasa %s.\n" - -#: g10/mainproc.c:1871 -#, c-format -msgid "%s signature, digest algorithm %s\n" -msgstr "podpis %s, skrt %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 mona 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 "" -"OSTRZEENIE: 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 mona wyczy zrzutw pamici: %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 powiodo 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) zawioda: %s\n" - -#: g10/misc.c:316 -#, fuzzy, c-format -msgid "WARNING: using experimental public key algorithm %s\n" -msgstr "nie mona obsuy tego algorytmu klucza publicznego: %d\n" - -#: g10/misc.c:331 -#, fuzzy, c-format -msgid "WARNING: using experimental cipher algorithm %s\n" -msgstr "algorytm szyfrujcy nie jest zaimplementowany" - -#: g10/misc.c:346 -#, fuzzy, c-format -msgid "WARNING: using experimental digest algorithm %s\n" -msgstr "podpis %s, skrt %s\n" - -#: g10/misc.c:351 -#, fuzzy, c-format -msgid "WARNING: digest algorithm %s is deprecated\n" -msgstr "wymuszone uycie skrtu %s (%d) kci si z ustawieniami adresata\n" - -#: g10/misc.c:447 -msgid "the IDEA cipher plugin is not present\n" -msgstr "modu szyfru IDEA nie jest dostpny\n" - -#: g10/misc.c:448 g10/sig-check.c:103 -#, fuzzy, c-format -msgid "please see %s for more information\n" -msgstr " i = potrzebuj wicej 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 "OSTRZEENIE: ,,%s'' jest przestarza opcj.\n" - -#: g10/misc.c:687 -#, c-format -msgid "please use \"%s%s\" instead\n" -msgstr "w jej miejsce naley uy ,,%s%s''\"\n" - -#: g10/misc.c:694 -#, fuzzy, c-format -msgid "WARNING: \"%s\" is a deprecated command - do not use it\n" -msgstr "OSTRZEENIE: ,,%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 moe 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 domylny 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 kocwka 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 wyjcie standardowe\n" - -#: g10/openfile.c:305 -#, c-format -msgid "assuming signed data in `%s'\n" -msgstr "przyjto obecno podpisanych danych w '%s'\n" - -#: g10/openfile.c:384 -#, c-format -msgid "new configuration file `%s' created\n" -msgstr "nowy plik ustawie ,,%s'' zosta utworzony\n" - -#: g10/openfile.c:386 -#, c-format -msgid "WARNING: options in `%s' are not yet active during this run\n" -msgstr "OSTRZEENIE: opcje w ,,%s'' nie s jeszcze uwzgldnione.\n" - -#: g10/openfile.c:418 -#, 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 mona obsuy tego algorytmu klucza publicznego: %d\n" - -#: g10/parse-packet.c:708 -msgid "WARNING: potentially insecure symmetrically encrypted session key\n" -msgstr "" -"OSTRZEENIE: symetrycznie zaszyfrowany klucz sesyjny moe nie by " -"bezpieczny\n" - -#: g10/parse-packet.c:1157 -#, 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 dostpny w tej sesji\n" - -#: g10/passphrase.c:326 -msgid "malformed GPG_AGENT_INFO environment variable\n" -msgstr "zy 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 protokou agenta nie jest obsugiwana\n" - -#: g10/passphrase.c:362 -#, c-format -msgid "can't connect to `%s': %s\n" -msgstr "nie mona si poczy 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 wyczony\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 haso aby odbezpieczy klucz tajny uytkownika:\n" -"\"%.*s\".\n" -"Klucz o dugoci %u bitw, typ %s, numer %08lX, stworzony %s%s\n" - -#: g10/passphrase.c:571 -msgid "Repeat passphrase\n" -msgstr "Powtrzone haso\n" - -#: g10/passphrase.c:573 -msgid "Enter passphrase\n" -msgstr "Haso\n" - -#: g10/passphrase.c:649 -msgid "cancelled by user\n" -msgstr "anulowano przez uytkownika\n" - -#: g10/passphrase.c:805 g10/passphrase.c:968 -#, fuzzy -msgid "can't query passphrase in batch mode\n" -msgstr "pytanie o haso nie dziaa w trybie wsadowym\n" - -#: g10/passphrase.c:812 g10/passphrase.c:973 -msgid "Enter passphrase: " -msgstr "Podaj haso: " - -#: 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 haso aby odbezpieczy klucz prywatny uytkownika:\n" -"\"" - -#: g10/passphrase.c:901 -#, fuzzy, c-format -msgid "%u-bit %s key, ID %s, created %s" -msgstr "dugo %u bitw, typ %s, numer %08lX, stworzony %s" - -#: g10/passphrase.c:910 -#, c-format -msgid " (subkey on main key ID %s)" -msgstr "" - -#: g10/passphrase.c:977 -msgid "Repeat passphrase: " -msgstr "Powtrz haso: " - -#: 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 zdjcie ktre chcesz doczy do swojego klucza jako identyfikator.\n" -"Musi to by plik w formacie JPEG. Zostanie on zapisany w Twoim kluczu\n" -"publicznym. Jeli bdzie duy, powikszy to take rozmiar Twojego klucza!\n" -"Dobry rozmiar to okoo 240 na 288 pikseli.\n" - -#: g10/photoid.c:95 -msgid "Enter JPEG filename for photo ID: " -msgstr "Nazwa pliku ze zdjciem w formacie JPEG: " - -#: g10/photoid.c:116 -#, fuzzy, c-format -msgid "unable to open JPEG file `%s': %s\n" -msgstr "nie mona 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 uy? (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 zdjcie jest w porzdku? (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 mona wywietli zdjcia!\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 zastpiony" - -#: 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 uywany" - -#: g10/pkclist.c:70 g10/revoke.c:627 -msgid "User ID is no longer valid" -msgstr "identyfikator uytkownika przesta by poprawny" - -#: g10/pkclist.c:74 -msgid "reason for revocation: " -msgstr "powd uniewanienia: " - -#: g10/pkclist.c:91 -msgid "revocation comment: " -msgstr "komentarz do uniewanienia: " - -#: g10/pkclist.c:206 -msgid "iImMqQsS" -msgstr "iImMwWpP" - -#: g10/pkclist.c:214 -#, fuzzy -msgid "No trust value assigned to:\n" -msgstr "" -"Brak wartoci 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 naley 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 = powrt do gwnego menu\n" - -#: g10/pkclist.c:288 -#, fuzzy -msgid " s = skip this key\n" -msgstr " p = pominicie klucza\n" - -#: g10/pkclist.c:289 -#, fuzzy -msgid " q = quit\n" -msgstr " w = wyjcie\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 prowadzce 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 pewnoci co do tosamoci waciciela 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 pewnoci co do tosamoci waciciela klucza.\n" - -#: g10/pkclist.c:430 -#, fuzzy -msgid "This key probably belongs to the named user\n" -msgstr "Ten klucz prawdopodobnie naley do tej osoby.\n" - -#: g10/pkclist.c:435 -msgid "This key belongs to us\n" -msgstr "Ten klucz naley 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 pewnoci, czy klucz naley do osoby wymienionej w identyfikatorze.\n" -"Jeli nie masz co do tego adnych wtpliwoci i *naprawd* wiesz co robisz,\n" -"moesz odpowiedzie ,,tak'' na nastpne pytanie.\n" -"\n" - -#: g10/pkclist.c:468 -#, fuzzy -msgid "Use this key anyway? (y/N) " -msgstr "Uy tego klucza pomimo to? " - -#: g10/pkclist.c:502 -msgid "WARNING: Using untrusted key!\n" -msgstr "OSTRZEENIE: uywany jest klucz nie obdarzony zaufaniem!\n" - -#: g10/pkclist.c:509 -msgid "WARNING: this key might be revoked (revocation key not present)\n" -msgstr "" -"OSTRZEENIE: klucz %08lX mg zosta uniewaniony\n" -" (brak klucza uniewaniajcego aby to sprawdzi)\n" - -#: g10/pkclist.c:518 -msgid "WARNING: This key has been revoked by its designated revoker!\n" -msgstr "OSTRZEENIE: Ten klucz zosta uniewaniony kluczem uniewaniajcym!\n" - -#: g10/pkclist.c:521 -msgid "WARNING: This key has been revoked by its owner!\n" -msgstr "OSTRZEENIE: Ten klucz zosta uniewaniony przez waciciela!\n" - -#: g10/pkclist.c:522 -#, fuzzy -msgid " This could mean that the signature is forged.\n" -msgstr " To moe oznacza e podpis jest faszerstwem.\n" - -#: g10/pkclist.c:528 -msgid "WARNING: This subkey has been revoked by its owner!\n" -msgstr "OSTRZEENIE: Ten podklucz zosta uniewaniony przez waciciela!\n" - -#: g10/pkclist.c:533 -msgid "Note: This key has been disabled.\n" -msgstr "Uwaga: Ten klucz zosta wyczony z uytku\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 wanoci tego klucza upyna!\n" - -#: g10/pkclist.c:602 -msgid "WARNING: This key is not certified with a trusted signature!\n" -msgstr "OSTRZEENIE: Ten klucz nie jest powiadczony zaufanym podpisem!\n" - -#: g10/pkclist.c:604 -msgid "" -" There is no indication that the signature belongs to the owner.\n" -msgstr "" -" Nie ma pewnoci co do tosamoci osoby ktra zoya podpis.\n" - -#: g10/pkclist.c:612 -msgid "WARNING: We do NOT trust this key!\n" -msgstr "OSTRZEENIE: NIE UFAMY temu kluczowi!\n" - -#: g10/pkclist.c:613 -msgid " The signature is probably a FORGERY.\n" -msgstr " Ten podpis prawdopodobnie jest FASZYWY.\n" - -#: g10/pkclist.c:621 -msgid "" -"WARNING: This key is not certified with sufficiently trusted signatures!\n" -msgstr "" -"OSTRZEENIE: Tego klucza nie powiadczaj wystarczajco zaufane podpisy!\n" - -#: g10/pkclist.c:623 -msgid " It is not certain that the signature belongs to the owner.\n" -msgstr "" -" Nie ma pewnoci co do tosamoci osoby ktra zoya 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: pominity: %s\n" - -#: g10/pkclist.c:834 g10/pkclist.c:1114 -#, c-format -msgid "%s: skipped: public key already present\n" -msgstr "%s: pominity: 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 uytkownika (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 uytkownika (pusta linia oznacza koniec): " - -#: g10/pkclist.c:960 -msgid "No such user ID.\n" -msgstr "Brak takiego identyfikatora uytkownika.\n" - -#: g10/pkclist.c:969 g10/pkclist.c:1043 -msgid "skipped: public key already set as default recipient\n" -msgstr "pominity: klucz publiczny ju jest domylnym adresatem\n" - -#: g10/pkclist.c:990 -msgid "Public key is disabled.\n" -msgstr "Klucz publiczny wyczony z uycia.\n" - -#: g10/pkclist.c:999 -msgid "skipped: public key already set\n" -msgstr "pominity: zosta ju wybrany w innej opcji\n" - -#: g10/pkclist.c:1034 -#, fuzzy, c-format -msgid "unknown default recipient \"%s\"\n" -msgstr "nieznany domylny adresat ,,%s''\n" - -#: g10/pkclist.c:1092 -#, c-format -msgid "%s: skipped: public key is disabled\n" -msgstr "%s: pominity: klucz publiczny wyczony z uytku\n" - -#: g10/pkclist.c:1154 -msgid "no valid addressees\n" -msgstr "brak poprawnych adresatw\n" - -#: g10/plaintext.c:91 -msgid "data not saved; use option \"--output\" to save it\n" -msgstr "" -"dane nie zostay zapisane; aby to zrobi, naley uy opcji \"--output\"\n" - -#: g10/plaintext.c:135 g10/plaintext.c:140 g10/plaintext.c:158 -#, c-format -msgid "error creating `%s': %s\n" -msgstr "bd 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 wejcia\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 mona 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 jestemy adresatem anonimowym.\n" - -#: g10/pubkey-enc.c:223 -msgid "old encoding of the DEK is not supported\n" -msgstr "stary, nie obsugiwany algorytm szyfrowania klucza sesyjnego\n" - -#: g10/pubkey-enc.c:244 -#, c-format -msgid "cipher algorithm %d%s is unknown or disabled\n" -msgstr "algorytm szyfrujcy %d%s jest nieznany, lub zosta wyczony\n" - -#: g10/pubkey-enc.c:282 -#, fuzzy, c-format -msgid "WARNING: cipher algorithm %s not found in recipient preferences\n" -msgstr "UWAGA: brak algorytmu szyfrujcego %d w ustawieniach\n" - -#: g10/pubkey-enc.c:302 -#, fuzzy, c-format -msgid "NOTE: secret key %s expired at %s\n" -msgstr "UWAGA: wano klucza tajnego %08lX wygasa %s\n" - -#: g10/pubkey-enc.c:308 -msgid "NOTE: key has been revoked" -msgstr "UWAGA: klucz zosta uniewaniony" - -#: 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 "wywoanie funkcji build_packet nie powiodo si: %s\n" - -#: g10/revoke.c:147 -#, fuzzy, c-format -msgid "key %s has no user IDs\n" -msgstr "klucz %08lX: brak identyfikatora uytkownika\n" - -#: g10/revoke.c:308 -msgid "To be revoked by:\n" -msgstr "Zostanie uniewaniony przez:\n" - -#: g10/revoke.c:312 -msgid "(This is a sensitive revocation key)\n" -msgstr "(to jest czuy klucz uniewazniajcy)\n" - -#: g10/revoke.c:316 -#, fuzzy -msgid "Create a designated revocation certificate for this key? (y/N) " -msgstr "Stworzy certyfikat uniewanienia 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 "wywoanie funkcji make_keysig_packet nie powiodo si: %s\n" - -#: g10/revoke.c:407 -msgid "Revocation certificate created.\n" -msgstr "Certyfikat uniewanienia zosta utworzony.\n" - -#: g10/revoke.c:413 -#, fuzzy, c-format -msgid "no revocation keys found for \"%s\"\n" -msgstr "brak kluczy uniewaniajcych 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 odpowiadajcego 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 uniewanienia 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 uniewanienia zosta utworzony.\n" -"\n" -"Naley przenie go na nonik ktry mona bezpiecznie ukry; jeli li " -"ludzie\n" -"dostan ten certyfikat w swoje rce, mog uy go do uczynienia klucza\n" -"nieuytecznym.\n" -"\n" -"Niezym pomysem jest wydrukowanie certyfikatu uniewanienia i schowanie\n" -"wydruku w bezpiecznym miejscu, na wypadek gdyby nonik z certyfikatem sta " -"si\n" -"nieczytelny. Ale naley zachowa ostrono, systemy drukowania rnych\n" -"komputerw mog zachowa tre wydruku i udostpni j osobom " -"nieupowanionym.\n" - -#: g10/revoke.c:635 -msgid "Please select the reason for the revocation:\n" -msgstr "Prosz wybra powd uniewanienia:\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 (nieobowizkowy) i zakocz go pust lini:\n" - -#: g10/revoke.c:716 -#, c-format -msgid "Reason for revocation: %s\n" -msgstr "Powd uniewanienia: %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 czci klucza s niedostpne\n" - -#: g10/seckey-cert.c:61 -#, c-format -msgid "protection algorithm %d%s is not supported\n" -msgstr "algorytm ochrony %d%s nie jest obsugiwany\n" - -#: g10/seckey-cert.c:72 -#, fuzzy, c-format -msgid "protection digest %d is not supported\n" -msgstr "algorytm ochrony %d%s nie jest obsugiwany\n" - -#: g10/seckey-cert.c:266 -msgid "Invalid passphrase; please try again" -msgstr "Niepoprawne haso; prosz sprbowa 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 "" -"OSTRZEENIE: Wykryto klucz saby algorytmu - naley ponownie zmieni haso.\n" - -#: g10/seckey-cert.c:366 -msgid "generating the deprecated 16-bit checksum for secret key protection\n" -msgstr "" -"tworzenie przestarzaej 16-bitowej sumy kontrolnej dla ochrony klucza\n" - -#: g10/seskey.c:54 -msgid "weak key created - retrying\n" -msgstr "wygenerowano saby klucz - operacja zostaje powtrzona\n" - -#: g10/seskey.c:59 -#, c-format -msgid "cannot avoid weak key for symmetric cipher; tried %d times!\n" -msgstr "" -"brak moliwoci generacji dobrego klucza dla szyfru symetrycznego;\n" -"operacja bya 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 "OSTRZEENIE: konflikt skrtw podpisw w wiadomoci\n" - -#: g10/sig-check.c:101 -#, fuzzy, c-format -msgid "WARNING: signing subkey %s is not cross-certified\n" -msgstr "OSTRZEENIE: podklucz podpisujcy %08lX nie jest skronie podpisany\n" - -#: g10/sig-check.c:113 -#, fuzzy, c-format -msgid "WARNING: signing subkey %s has an invalid cross-certification\n" -msgstr "" -"OSTRZEENIE: podklucz podpisujcy %08lX jest niepoprawnie skronie " -"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 modszy 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) modszy 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 przyszoci (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 przyszoci (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 podpisujcy %08lX przekroczy dat wanoci %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 zoony kluczem %08lX uznany za niewany 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, ktrego dotyczy uniewanienie\n" - -#: g10/sig-check.c:570 -#, fuzzy, c-format -msgid "key %s: no subkey for subkey binding signature\n" -msgstr "klucz %08lX: brak podklucza dowizywanego podpisem\n" - -#: g10/sign.c:85 -msgid "can't put notation data into v3 (PGP 2.x style) signatures\n" -msgstr "nie mona umieci adnotacji w podpisach skadanych 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 mona umieci adnotacji w podpisach kluczy skadanych kluczami PGP 2.x\n" - -#: g10/sign.c:107 -#, c-format -msgid "WARNING: unable to %%-expand notation (too large). Using unexpanded.\n" -msgstr "" -"OSTRZEENIE: nie mona rozwin %% w URL adnotacji (jest zbyt dugi).\n" -" Uyty zostanie nie rozwinity.\n" - -#: g10/sign.c:124 -msgid "can't put a policy URL into v3 (PGP 2.x style) signatures\n" -msgstr "" -"nie mona umieci URL-a regulaminu w podpisach skadanych 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 mona umieci 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 "" -"OSTRZEENIE: nie mona rozwin znacznikw %% w URL regulaminu\n" -" (jest zbyt dugi). Uyty zostanie nie rozwinity.\n" - -#: g10/sign.c:173 -#, fuzzy, c-format -msgid "" -"WARNING: unable to %%-expand preferred keyserver URL (too large). Using " -"unexpanded.\n" -msgstr "" -"OSTRZEENIE: nie mona rozwin znacznikw %% w URL regulaminu\n" -" (jest zbyt dugi). Uyty zostanie nie rozwinity.\n" - -#: g10/sign.c:347 -#, c-format -msgid "checking created signature failed: %s\n" -msgstr "sprawdzenie zoonego podpisu nie powiodo si: %s\n" - -#: g10/sign.c:356 -#, fuzzy, c-format -msgid "%s/%s signature from: \"%s\"\n" -msgstr "%s podpis zoony 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 mona podpisywa tylko do oddzielonych " -"podpisw\n" - -#: g10/sign.c:862 -#, fuzzy, c-format -msgid "" -"WARNING: forcing digest algorithm %s (%d) violates recipient preferences\n" -msgstr "wymuszone uycie skrtu %s (%d) kci 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 mona 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 uyty szyfr %s\n" - -#: g10/skclist.c:127 g10/skclist.c:191 -msgid "key is not flagged as insecure - can't use it with the faked RNG!\n" -msgstr "" -"klucz nie jest oznaczony jako niepewny - nie mona go uy z atrap \n" -"generatora liczb losowych!\n" - -#: g10/skclist.c:158 -#, fuzzy, c-format -msgid "skipped \"%s\": duplicated\n" -msgstr "pominity ,,%s'': duplikat\n" - -#: g10/skclist.c:166 g10/skclist.c:176 g10/skclist.c:185 -#, fuzzy, c-format -msgid "skipped \"%s\": %s\n" -msgstr "pominity ,,%s'': %s\n" - -#: g10/skclist.c:171 -msgid "skipped: secret key already present\n" -msgstr "pominity: klucz prywatny jest ju wpisany\n" - -#: g10/skclist.c:186 -#, fuzzy -msgid "this is a PGP generated Elgamal key which is not secure for signatures!" -msgstr "" -"pominity ,,%s'': wygenerowany przez PGP klucz dla algorytmu ElGamala,\n" -"podpisy skadane tym kluczem nie zapewniaj bezpieczestwa!\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 powid 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 wartoci zaufania, stworzona %s\n" -"# (uyj \"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 "bd odczytu ,,%s'': %s\n" - -#: g10/tdbdump.c:160 -#, fuzzy -msgid "line too long" -msgstr "linia zbyt duga\n" - -#: g10/tdbdump.c:168 -msgid "colon missing" -msgstr "" - -#: g10/tdbdump.c:174 -#, fuzzy -msgid "invalid fingerprint" -msgstr "bd: niewaciwy odcisk klucza\n" - -#: g10/tdbdump.c:179 -#, fuzzy -msgid "ownertrust value missing" -msgstr "wczytanie wartoi zaufania" - -#: g10/tdbdump.c:215 -#, fuzzy, c-format -msgid "error finding trust record in `%s': %s\n" -msgstr "bd podczas odczytu zapisu wartoci zaufania: %s\n" - -#: g10/tdbdump.c:219 -#, fuzzy, c-format -msgid "read error in `%s': %s\n" -msgstr "bd odczytu: %s\n" - -#: g10/tdbdump.c:228 g10/trustdb.c:381 -#, c-format -msgid "trustdb: sync failed: %s\n" -msgstr "baza zaufania: synchronizacja nie powioda 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 powioda 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 powid si (n=%d): %s\n" - -#: g10/tdbio.c:245 -msgid "trustdb transaction too large\n" -msgstr "zbyt due zlecenie dla bazy zaufania\n" - -#: g10/tdbio.c:498 -#, fuzzy, c-format -msgid "can't access `%s': %s\n" -msgstr "nie mona 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 mona utworzy ,,%s'': %s\n" - -#: g10/tdbio.c:525 g10/tdbio.c:592 -#, fuzzy, c-format -msgid "can't lock `%s'\n" -msgstr "nie mona otworzy ,,%s''\n" - -#: g10/tdbio.c:551 -#, c-format -msgid "%s: failed to create version record: %s" -msgstr "%s: stworzenie zapisu o wersji nie powiodo 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 mona 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 skrtw nie powiodo si: %s\n" - -#: g10/tdbio.c:659 -#, c-format -msgid "%s: error updating version record: %s\n" -msgstr "%s: bd 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: bd odczytu numeru wersji: %s\n" - -#: g10/tdbio.c:735 -#, c-format -msgid "%s: error writing version record: %s\n" -msgstr "%s: bd zapisu numeru wersji: %s\n" - -#: g10/tdbio.c:1174 -#, c-format -msgid "trustdb: lseek failed: %s\n" -msgstr "baza zaufania: funkcja lseek() zawioda: %s\n" - -#: g10/tdbio.c:1182 -#, c-format -msgid "trustdb: read failed (n=%d): %s\n" -msgstr "baza zaufania: funkcja read() (n=%d) zawioda: %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: niewaciwa wersja pliku %d\n" - -#: g10/tdbio.c:1411 -#, c-format -msgid "%s: error reading free record: %s\n" -msgstr "%s: bd odczytu pustego wpisu: %s\n" - -#: g10/tdbio.c:1419 -#, c-format -msgid "%s: error writing dir record: %s\n" -msgstr "%s: bd 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 powiodo si: %s\n" - -#: g10/tdbio.c:1459 -#, c-format -msgid "%s: failed to append a record: %s\n" -msgstr "%s: dopisanie rekordu nie powiodo 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 mona obsuy linii tekstu duszej ni %d znakw\n" - -#: g10/textfilter.c:248 -#, c-format -msgid "input line longer than %d characters\n" -msgstr "linia dusza ni %d znakw\n" - -#: g10/trustdb.c:227 -#, c-format -msgid "`%s' is not a valid long keyID\n" -msgstr ",,%s'' nie jest poprawnym dugim 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 wicej 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 - pominity\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 powid 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 "[uniewaniony]" - -#: 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 "nastpne sprawdzanie bazy odbdzie 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 "naley 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 (rozwizano %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 powid 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 mona sprawdzi podpisu.\n" -"Naley pamita 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 wejcia %u zbyt duga lub brak znaku LF\n" - -#: util/errors.c:55 -msgid "general error" -msgstr "bd oglny" - -#: 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 skrtu" - -#: 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 "bd sumy kontrolnej" - -#: util/errors.c:64 -msgid "bad passphrase" -msgstr "niepoprawne haso" - -#: util/errors.c:65 -msgid "public key not found" -msgstr "brak klucza publicznego" - -#: util/errors.c:66 -msgid "unknown cipher algorithm" -msgstr "nieznany algorytm szyfrujcy" - -#: util/errors.c:67 -msgid "can't open the keyring" -msgstr "otwarcie zbioru kluczy jest niemoliwe" - -#: util/errors.c:68 -msgid "invalid packet" -msgstr "niepoprawny pakiet" - -#: util/errors.c:69 -msgid "invalid armor" -msgstr "bd w opakowaniu ASCII" - -#: util/errors.c:70 -msgid "no such user id" -msgstr "brak takiego identyfikatora uytkownika." - -#: util/errors.c:71 -msgid "secret key not available" -msgstr "brak klucza prywatnego" - -#: util/errors.c:72 -msgid "wrong secret key used" -msgstr "zosta uyty niewaciwy klucz prywatny" - -#: util/errors.c:73 -msgid "not supported" -msgstr "nie jest obsugiwany" - -#: util/errors.c:74 -msgid "bad key" -msgstr "niepoprawny klucz" - -#: util/errors.c:75 -msgid "file read error" -msgstr "bd przy odczycie pliku" - -#: util/errors.c:76 -msgid "file write error" -msgstr "bd przy zapisie pliku" - -#: util/errors.c:77 -msgid "unknown compress algorithm" -msgstr "nieznany algorytm kompresji" - -#: util/errors.c:78 -msgid "file open error" -msgstr "bd przy otwieraniu pliku." - -#: util/errors.c:79 -msgid "file create error" -msgstr "bd przy tworzeniu pliku" - -#: util/errors.c:80 -msgid "invalid passphrase" -msgstr "niepoprawne dugie haso" - -#: 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 szyfrujcy nie jest zaimplementowany" - -#: util/errors.c:83 -msgid "unknown signature class" -msgstr "nieznana klasa podpisu" - -#: util/errors.c:84 -msgid "trust database error" -msgstr "bd w bazie zaufania" - -#: util/errors.c:85 -msgid "bad MPI" -msgstr "bd MPI" - -#: util/errors.c:86 -msgid "resource limit" -msgstr "ograniczenie zasobw" - -#: util/errors.c:87 -msgid "invalid keyring" -msgstr "bd w zbiorze kluczy" - -#: util/errors.c:88 -msgid "bad certificate" -msgstr "niepoprawny certyfikat" - -#: util/errors.c:89 -msgid "malformed user id" -msgstr "bd formatu identyfikatora uytkownika" - -#: util/errors.c:90 -msgid "file close error" -msgstr "bd przy zamykaniu pliku" - -#: util/errors.c:91 -msgid "file rename error" -msgstr "bd przy zmianie nazwy pliku" - -#: util/errors.c:92 -msgid "file delete error" -msgstr "bd przy usuwaniu pliku" - -#: util/errors.c:93 -msgid "unexpected data" -msgstr "nieoczekiowane dane" - -#: util/errors.c:94 -msgid "timestamp conflict" -msgstr "konflikt datownikw" - -#: util/errors.c:95 -msgid "unusable pubkey algorithm" -msgstr "nieuyteczny algorytm asymetryczny" - -#: util/errors.c:96 -msgid "file exists" -msgstr "plik ju istnieje" - -#: util/errors.c:97 -msgid "weak key" -msgstr "klucz saby" - -#: util/errors.c:98 -msgid "invalid argument" -msgstr "bdny argument" - -#: util/errors.c:99 -msgid "bad URI" -msgstr "niepoprawny URI" - -#: util/errors.c:100 -msgid "unsupported URI" -msgstr "URI nie jest obsugiwany" - -#: util/errors.c:101 -msgid "network error" -msgstr "bd 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 "bezuyteczny klucz publiczny" - -#: util/errors.c:107 -msgid "unusable secret key" -msgstr "bezuyteczny klucz prywatny" - -#: util/errors.c:108 -msgid "keyserver error" -msgstr "bd 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 bd programu (%s:%d:%s)\n" - -#: util/logger.c:230 -#, c-format -msgid "you found a bug ... (%s:%d)\n" -msgstr "znalaze(a) bd 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 "wyjcie" - -#: 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 "OSTRZEENIE: nie mona zabezpieczy uywanej pamici!\n" - -#: util/secmem.c:98 -msgid "please see http://www.gnupg.org/faq.html for more information\n" -msgstr "objanienie mona przeczyta tutaj: http://www.gnupg.org/faq.html\n" - -#: util/secmem.c:350 -msgid "operation is not possible without initialized secure memory\n" -msgstr "bez zabezpieczenia pamici nie mona wykona tej operacji\n" - -#: util/secmem.c:351 -msgid "(you may have used the wrong program for this task)\n" -msgstr "(prawdopodobnie uywany program jest niewaciwy dlatego zadania)\n" - -#~ msgid "DSA requires the use of a 160 bit hash algorithm\n" -#~ msgstr "" -#~ "Algorytm DSA wymaga uycia algorytmu skrtu dajcego 160-bitowy wynik.\n" - -#~ msgid "" -#~ "please see http://www.gnupg.org/why-not-idea.html for more information\n" -#~ msgstr "" -#~ "wicej 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 moe zawiera tylko litery, cyfry, kropki i " -#~ "podkrelenia, \n" -#~ "i musi koczy si ,,=''\n" - -#~ msgid "a user notation name must contain the '@' character\n" -#~ msgstr "adnotacja uytkownika musi zawiera znak '@'\n" - -#, fuzzy -#~ msgid "a notation name must not contain more than one '@' character\n" -#~ msgstr "adnotacja uytkownika musi zawiera znak '@'\n" - -#~ msgid "a notation value must not use any control characters\n" -#~ msgstr "tre adnotacji nie moe zawiera znakw sterujcych\n" - -#~ msgid "WARNING: invalid notation data found\n" -#~ msgstr "OSTRZEENIE: niepoprawne dane w adnotacji\n" - -#~ msgid "not human readable" -#~ msgstr "nieczytelne dla czowieka" - -#, 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: pominito - nieoczekiwana klasa podpisu (%02x)\n" - -#, fuzzy -#~ msgid "Unable to clean `%s'\n" -#~ msgstr "nie mona wykona %s ,,%s'': %s\n" - -#, fuzzy -#~ msgid "User ID \"%s\": %d signature removed.\n" -#~ msgstr "Identyfikator uytkownika ,,%s'' zosta uniewaniony." - -#, fuzzy -#~ msgid "User ID \"%s\": %d signatures removed.\n" -#~ msgstr "Identyfikator uytkownika ,,%s'' zosta uniewaniony." - -#, fuzzy -#~ msgid "User ID \"%s\" removed: %s\n" -#~ msgstr "Identyfikator uytkownika ,,%s'' zosta uniewaniony." - -#, fuzzy -#~ msgid "No user IDs are removable.\n" -#~ msgstr "Brak identyfikatora uytkownika dla klucza.\n" - -#, fuzzy -#~ msgid "error getting serial number: %s\n" -#~ msgstr "bd podczas tworzenia hasa: %s\n" - -#~ msgid "bad passphrase or unknown cipher algorithm (%d)\n" -#~ msgstr "niepoprawne haso, lub nieznany algorytm szyfrujcy (%d)\n" - -#~ msgid "can't set client pid for the agent\n" -#~ msgstr "nie mona 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 "haso zbyt dugie\n" - -#~ msgid "invalid response from agent\n" -#~ msgstr "bdna odpowied agenta\n" - -#~ msgid "problem with the agent: agent returns 0x%lx\n" -#~ msgstr "problem agenta: zwrci 0x%lx\n" - -#~ msgid "select secondary key N" -#~ msgstr "wybr podklucza N" - -#~ msgid "list signatures" -#~ msgstr "lista podpisw" - -#~ msgid "sign the key" -#~ msgstr "zoenie podpisu na kluczu" - -#~ msgid "add a secondary key" -#~ msgstr "dodanie podklucza" - -#~ msgid "delete signatures" -#~ msgstr "usunicie podpisw" - -#~ msgid "change the expire date" -#~ msgstr "zmiana daty wanoci 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 uytkownika" - -#~ msgid "--nrlsign-key user-id" -#~ msgstr "--nrsign-key nazwa uytkownika" - -#, fuzzy -#~ msgid "make a trust signature" -#~ msgstr "zoenie podpisu oddzielonego od dokumentu" - -#~ msgid "sign the key non-revocably" -#~ msgstr "zoenie na kluczu podpisu nie podlegajcego uniewanieniu" - -#~ msgid "sign the key locally and non-revocably" -#~ msgstr "" -#~ "zoenie na kluczu prywatnego podpisu nie podlegajcego uniewanieniu" - -#~ msgid "q" -#~ msgstr "w" - -#~ msgid "help" -#~ msgstr "pomoc" - -#~ msgid "list" -#~ msgstr "lista" - -#~ msgid "l" -#~ msgstr "l" - -#~ msgid "debug" -#~ msgstr "ledzenia" - -#, fuzzy -#~ msgid "name" -#~ msgstr "wkl" - -#, fuzzy -#~ msgid "login" -#~ msgstr "lpodpis" - -#, fuzzy -#~ msgid "cafpr" -#~ msgstr "odc" - -#, fuzzy -#~ msgid "forcesig" -#~ msgstr "unpod" - -#, fuzzy -#~ msgid "generate" -#~ msgstr "bd oglny" - -#~ msgid "passwd" -#~ msgstr "haso" - -#~ 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 "gwny" - -#~ 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 "bd serwera kluczy" - -#~ msgid "trust" -#~ msgstr "zaufanie" - -#~ msgid "revsig" -#~ msgstr "unpod" - -#~ msgid "revuid" -#~ msgstr "unpod" - -#~ msgid "revkey" -#~ msgstr "unpkl" - -#~ msgid "disable" -#~ msgstr "wykl" - -#~ msgid "enable" -#~ msgstr "wkl" - -#~ msgid "showphoto" -#~ msgstr "foto" - -#~ msgid "digest algorithm `%s' is read-only in this release\n" -#~ msgstr "w tej wersji algorytm skrtu ,,%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 "" -#~ "Nastpi generacja nowej pary kluczy dla algorytmu(w) %s.\n" -#~ " minimalny rozmiar klucza wynosi 768 bitw\n" -#~ " domylny rozmiar klucza wynosi 1024 bity\n" -#~ " najwikszy sugerowany rozmiar klucza wynosi 2048 bitw\n" - -#~ msgid "DSA only allows keysizes from 512 to 1024\n" -#~ msgstr "Klucz dla DSA musi mie dugo pomidzy 512 i 1024 bitow.\n" - -#~ msgid "keysize too small; 1024 is smallest value allowed for RSA.\n" -#~ msgstr "" -#~ "Dugo klucza zbyt maa; minimalna dopuszczalna dla RSA wynosi 1024 " -#~ "bity.\n" - -#~ msgid "keysize too small; 768 is smallest value allowed.\n" -#~ msgstr "Dugo klucza zbyt maa; minimalna dopuszczona wynosi 768 bitw.\n" - -#~ msgid "keysize too large; %d is largest value allowed.\n" -#~ msgstr "zbyt duy rozmiar klucza, ograniczenie wynosi %d.\n" - -#~ msgid "" -#~ "Keysizes larger than 2048 are not suggested because\n" -#~ "computations take REALLY long!\n" -#~ msgstr "" -#~ "Klucze dusze ni 2048 bitw s odradzane, poniewa potrzebne\n" -#~ "obliczenia trwaj wtedy BARDZO dugo!\n" - -#, fuzzy -#~ msgid "Are you sure that you want this keysize? (y/N) " -#~ msgstr "Na pewno wygenerowa klucz takiej dugoci? " - -#~ msgid "" -#~ "Okay, but keep in mind that your monitor and keyboard radiation is also " -#~ "very vulnerable to attacks!\n" -#~ msgstr "" -#~ "Naley take pamita o tym, e informacje mog by te wykradzione z\n" -#~ "komputera przez podsuch emisji elektromagnetycznej klawiatury i " -#~ "monitora!\n" - -#~ msgid "Experimental algorithms should not be used!\n" -#~ msgstr "Nie naley uywa algorytmw dowiadczalnych!\n" - -#~ msgid "" -#~ "this cipher algorithm is deprecated; please use a more standard one!\n" -#~ msgstr "" -#~ "uywanie tego szyfru jest odradzane; naley uywa standardowych " -#~ "szyfrw!\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 dziaa 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 mona utworzy ,,%s'': %s\n" - -#, fuzzy -#~ msgid "can't open file `%s': %s\n" -#~ msgstr "nie mona otworzy pliku: %s\n" - -#, fuzzy -#~ msgid " \"" -#~ msgstr " alias \"" - -#~ msgid "key %08lX: key has been revoked!\n" -#~ msgstr "klucz %08lX: klucz zosta uniewaniony!\n" - -#~ msgid "key %08lX: subkey has been revoked!\n" -#~ msgstr "klucz %08lX: podklucz zosta uniewaniony!\n" - -#~ msgid "%08lX: key has expired\n" -#~ msgstr "%08lX: data wanoci klucza upyna\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 mona otworzy: %s\n" - -#~ msgid "%s: WARNING: empty file\n" -#~ msgstr "%s: OSTRZEENIE: plik jest pusty\n" - -#~ msgid "can't open %s: %s\n" -#~ msgstr "nie mona 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 pene 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: dostp niemoliwy: %s\n" - -#~ msgid "%s: can't create lock\n" -#~ msgstr "%s: nie mona utworzy blokady\n" - -#~ msgid "%s: can't make lock\n" -#~ msgstr "%s: nie mona utworzy blokady\n" - -#~ msgid "%s: can't create: %s\n" -#~ msgstr "%s: nie mona utworzy: %s\n" - -#~ msgid "%s: can't create directory: %s\n" -#~ msgstr "%s: nie mona utworzy katalogu: %s\n" - -#~ msgid "If you want to use this revoked key anyway, answer \"yes\"." -#~ msgstr "" -#~ "Jeli mimo wszystko chcesz uy tego uniewanionego klucza, odpowiedz ,," -#~ "tak''." - -#~ msgid "Unable to open photo \"%s\": %s\n" -#~ msgstr "Nie mona otworzy zdjcia ,,%s'': %s.\n" - -#~ msgid "can't open file: %s\n" -#~ msgstr "nie mona otworzy pliku: %s\n" - -#~ msgid "error: missing colon\n" -#~ msgstr "bd: brak dwukropka\n" - -#~ msgid "error: no ownertrust value\n" -#~ msgstr "bd: brak wartoi zaufania waciciela\n" - -#~ msgid " (main key ID %08lX)" -#~ msgstr " (podklucz %08lX)" - -#~ msgid "rev! subkey has been revoked: %s\n" -#~ msgstr "un! podklucz zosta uniewaniony: %s\n" - -#~ msgid "rev- faked revocation found\n" -#~ msgstr "un- faszywy certyfikat uniewanienia\n" - -#~ msgid "rev? problem checking revocation: %s\n" -#~ msgstr "un? problem przy sprawdzaniu uniewanienia: %s\n" - -#, fuzzy -#~ msgid " [expired: %s]" -#~ msgstr " [wygasa :%s]" - -#~ msgid " [expires: %s]" -#~ msgstr " [wygasa :%s]" - -#, fuzzy -#~ msgid " [revoked: %s]" -#~ msgstr "[uniewaniony]" - -#~ msgid "can't create %s: %s\n" -#~ msgstr "nie mona utworzy %s: %s\n" - -#~ msgid "" -#~ "WARNING: digest `%s' is not part of OpenPGP. Use at your own risk!\n" -#~ msgstr "" -#~ "OSTRZEENIE: algorytm skrtu ,,%s'' nie jest czci standardu OpenPGP.\n" -#~ " Uywasz go na wasn odpowiedzialno!\n" - -#~ msgid "|[files]|encrypt files" -#~ msgstr "|[pliki]|szyfrowanie plikw" - -#~ msgid "store only" -#~ msgstr "zapis danych w formacie OpenPGP" - -#~ msgid "|[files]|decrypt files" -#~ msgstr "|[pliki]|odszyfrowywanie plikw" - -#~ msgid "sign a key non-revocably" -#~ msgstr "" -#~ "zoenie na kluczu podpisu nie podlegajcego \n" -#~ "uniewanieniu" - -#~ msgid "sign a key locally and non-revocably" -#~ msgstr "" -#~ "zoenie na kluczu podpisu prywatnego,\n" -#~ "nie podlegajcego uniewanieniu" - -#~ msgid "list only the sequence of packets" -#~ msgstr "wypisane sekwencji pakietw" - -#~ msgid "export the ownertrust values" -#~ msgstr "eksport wartoci zaufania" - -#~ msgid "unattended trust database update" -#~ msgstr "bezobsugowe uaktualnienie bazy zaufania" - -#~ msgid "fix a corrupted trust database" -#~ msgstr "naprawa uszkodzonej bazy zaufania" - -#~ msgid "De-Armor a file or stdin" -#~ msgstr "zdjcie 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|uycie NAZWA jako domylnego adresata" - -#~ msgid "use the default key as default recipient" -#~ msgstr "domylny klucz jest domylnym adresatem" - -#~ msgid "don't use the terminal at all" -#~ msgstr "bez odwoa do terminala" - -#~ msgid "force v3 signatures" -#~ msgstr "wymuszenie trzeciej wersji formatu podpisw" - -#~ msgid "do not force v3 signatures" -#~ msgstr "bez wymuszania trzeciej wersji formatu podpisw" - -#~ msgid "force v4 key signatures" -#~ msgstr "wymuszenie czwartej wersji formatu podpisw" - -#~ msgid "do not force v4 key signatures" -#~ msgstr "bez wymuszania czwartej wersji formatu podpisw" - -#~ msgid "always use a MDC for encryption" -#~ msgstr "do szyfrowania bdzie uywany MDC" - -#~ msgid "never use a MDC for encryption" -#~ msgstr "do szyfrowania nie zostanie uyty MDC" - -#~ msgid "use the gpg-agent" -#~ msgstr "wykorzystanie agenta zarzdzania hasami" - -#~ msgid "batch mode: never ask" -#~ msgstr "tryb wsadowy: adnych pyta" - -#~ msgid "assume yes on most questions" -#~ msgstr "automatyczna odpowied tak na wikszo pyta" - -#~ msgid "assume no on most questions" -#~ msgstr "automatyczna odpowied nie na wikszo pyta" - -#~ msgid "add this keyring to the list of keyrings" -#~ msgstr "dodanie zbioru kluczy do uywanych" - -#~ msgid "add this secret keyring to the list" -#~ msgstr "dodanie zbioru kluczy tajnych do uywanych" - -#~ msgid "|NAME|use NAME as default secret key" -#~ msgstr "|NAZWA|ustawienie NAZWA jako domylnego klucza prywatnego" - -#~ msgid "|HOST|use this keyserver to lookup keys" -#~ msgstr "|HOST|serwer kluczy w ktrym bd poszukiwane" - -#~ msgid "|NAME|set terminal charset to NAME" -#~ msgstr "|NAZWA| strona kodowa wywietlanego 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 cakowicie zaufanego" - -#~ msgid "|FILE|load extension module FILE" -#~ msgstr "|PLIK|adowanie moduu 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 zgodnoci formatu pakietw, szyfrw i skrtw z OpenPGP" - -#~ msgid "set all packet, cipher and digest options to PGP 2.x behavior" -#~ msgstr "tryb zgodnoci formatw, szyfrw i skrtw z PGP 2.x" - -#~ msgid "|N|use passphrase mode N" -#~ msgstr "|N|N-ty tryb obliczania hasa" - -#~ msgid "|NAME|use message digest algorithm NAME for passphrases" -#~ msgstr "|ALG|wymuszenie algorytmu skrtu hasa ALG" - -#~ msgid "|NAME|use cipher algorithm NAME for passphrases" -#~ msgstr "|ALG|wymuszenie algorytmu szyfrujcego ALG dla hasa" - -#~ msgid "|NAME|use cipher algorithm NAME" -#~ msgstr "|NAZWA|wymuszenie algorytmu szyfrujcego NAZWA" - -#~ msgid "|NAME|use message digest algorithm NAME" -#~ msgstr "|NAZWA|wymuszenie algorytmu skrtu NAZWA" - -#~ msgid "|N|use compress algorithm N" -#~ msgstr "|N|wymuszenie algorytmu kompresji N" - -#~ msgid "throw keyid field of encrypted packets" -#~ msgstr "usunicie numerw kluczy adresatw z szyfrogramw" - -#~ msgid "Show Photo IDs" -#~ msgstr "okazywanie zdjcia - identyfikatora uytkownika" - -#~ msgid "Don't show Photo IDs" -#~ msgstr "bez pokazywania zdj" - -#~ msgid "Set command line to view Photo IDs" -#~ msgstr "polecenie wywoujce przegldark 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 naley 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 - pominity\n" - -#~ msgid "" -#~ "NOTE: Elgamal primary key detected - this may take some time to import\n" -#~ msgstr "" -#~ "UWAGA: Wykryto klucz gwny algorytmu ElGamala. Jego import potrwa jaki " -#~ "czas.\n" - -#~ msgid " (default)" -#~ msgstr "(domylnie)" - -#~ 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 mona pobra klucza z serwera: %s\n" - -#~ msgid "error sending to `%s': %s\n" -#~ msgstr "bd przy wysyaniu do ,,%s'': %s\n" - -#~ msgid "success sending to `%s' (status=%u)\n" -#~ msgstr "wysyanie do ,,%s'' powiodo si (status=%u)\n" - -#~ msgid "failed sending to `%s': status=%u\n" -#~ msgstr "wysyanie do ,,%s'' nie powiodo si (status=%u)\n" - -#~ msgid "this keyserver does not support --search-keys\n" -#~ msgstr "ten serwer kluczy nie umoliwia przeszukiwania\n" - -#~ msgid "can't search keyserver: %s\n" -#~ msgstr "nie mona 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 skadane nie zapewniaj bezpieczestwa!\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 przyszoci (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 przyszoci (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 podpisujcym ElGamala %08lX na %08lX zosta pominity\n" - -#~ msgid "signature from %08lX to Elgamal signing key %08lX skipped\n" -#~ msgstr "" -#~ "podpis kluczem %08lX na kluczu podpisujcym ElGamala %08lX zosta " -#~ "pominity\n" - -#~ msgid "checking at depth %d signed=%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/%d/%d\n" -#~ msgstr "" -#~ "sprawdzanie na gbokoci %d podpisw =%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 "" -#~ "Wybr algorytmu.\n" -#~ "\n" -#~ "DSA (zwany te DSS) to algorytm podpisu cyfrowego i tylko do skadania\n" -#~ "podpisw moe by uywany. Jest to algorytm preferowany, gdy\n" -#~ "skadane nim podpisy sprawdza si duo szybciej ni te skadane\n" -#~ "algorytmem ElGamala.\n" -#~ "\n" -#~ "Algorytm ElGamala moe by uywany zarwno do podpisw jak i do " -#~ "szyfrowania.\n" -#~ "Standard OpenPGP rozrnia 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 ktrym mona\n" -#~ "skada bezpieczne podpisy. Ten program obsuguje oba typy ale inne\n" -#~ "implementacje nnie musz rozumie kluczy do podpisw i szyfrowania\n" -#~ "\n" -#~ "Gwny klucz musi by kluczem podpisujcym, jest to powodem dla\n" -#~ "ktrego w tym menu nie ma monoci 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, jednake jest on odradzany, " -#~ "gdy\n" -#~ "nie jest obsugiwany przez wszystkie programy zgodne z OpenPGP, a podpisy " -#~ "nim\n" -#~ "skadane s due i ich sprawdzanie trwa dugo." - -#~ msgid "%lu keys so far checked (%lu signatures)\n" -#~ msgstr "%lu kluczy do tej chwili (%lu podpisw)\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 "wyjcie" - -#~ 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 szyfrujcy jest uywany tylko przez GnuPG. Tego klucza nie " -#~ "bdzie\n" -#~ "mona uy do cznoci z uytkownikami PGP. Wybrany algorytm jest take\n" -#~ "bardzo powolny, oraz moe nie by tak bezpieczny jak pozostae dostpne.\n" - -#~ msgid "Create anyway? " -#~ msgstr "Stworzy klucz pomimo to? " - -#~ msgid "invalid symkey algorithm detected (%d)\n" -#~ msgstr "odnaleziono odwoanie do niepoprawnego szyfru (%d)\n" - -#~ msgid "this keyserver is not fully HKP compatible\n" -#~ msgstr "serwer kluczy nie jest w peni zgodny z HKP\n" - -#~ msgid "The use of this algorithm is deprecated - create anyway? " -#~ msgstr "Uywanie 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 uy nowego pliku ustawie, naley od nowa uruchomi GnuPG\n" - -#~ msgid "changing permission of `%s' failed: %s\n" -#~ msgstr "zmiana uprawnie do `%s' nie powioda 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 podkrelenia lub litery\n" - -#~ msgid "dots in a notation name must be surrounded by other characters\n" -#~ msgstr "kropki w adnotacji musz znajdowa si pomidzy 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 "" -#~ "OSTRZEENIE: Do tego klucza dodano ju zdjcie uytkownika.\n" -#~ " Dodanie drugiego spowoduje, e niektre wersje PGP " -#~ "przestan\n" -#~ " rozumie ten klucz.\n" - -#~ msgid "You may only have one photo ID on a key.\n" -#~ msgstr "Do klucza mona doczy tylko jedno zdjcie.\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 dugiego klucza? " - -#~ msgid "key %08lX: our copy has no self-signature\n" -#~ msgstr "klucz %08lX: dostpna 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 uytkownika" - -#~ msgid "--delete-key user-id" -#~ msgstr "--delete-key nazwa uytkownika" - -#~ msgid "--delete-secret-and-public-key user-id" -#~ msgstr "--delete-secret-and-public-key key nazwa uytkownika" - -#~ msgid "skipped: public key already set with --encrypt-to\n" -#~ msgstr "pominity: klucz publiczny ju wybrany w --encrypt-to\n" - -#~ msgid "" -#~ "\n" -#~ "WARNING: This is a PGP2-style key\n" -#~ msgstr "" -#~ "\n" -#~ "OSTRZEENIE: Klucz z PGP wersji 2.\n" - -#~ msgid "sSmMqQ" -#~ msgstr "iIpPwW" - -#~ msgid "duplicate (short) key ID %08lX\n" -#~ msgstr "skrcony numer klucza si powtarza %08lX\n" - -#~ msgid "%lu key(s) to refresh\n" -#~ msgstr "%lu klucz(y) do odwieenia\n" - -#~ msgid "too many random bits requested; the limit is %d\n" -#~ msgstr "danie zbyt wielu losowych bitw; 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 "" -#~ "Niemoliwe jest znalezienie poprawnej scieki zaufania do tego klucza.\n" -#~ "Sprawdmy czy mona przypisa brakujce wartoci zaufania.\n" -#~ "\n" - -#~ msgid "" -#~ "No path leading to one of our keys found.\n" -#~ "\n" -#~ msgstr "" -#~ "Brak cieki prowadzcej do ktrego z naszych kluczy.\n" -#~ "\n" - -#~ msgid "" -#~ "No certificates with undefined trust found.\n" -#~ "\n" -#~ msgstr "" -#~ "Brak certyfikatw o niezdefiniowanym poziomie zaufania.\n" -#~ "\n" - -#~ msgid "" -#~ "No trust values changed.\n" -#~ "\n" -#~ msgstr "" -#~ "Parametry zaufania nie zostay zmienione.\n" -#~ "\n" - -#~ msgid "%08lX: no info to calculate a trust probability\n" -#~ msgstr "%08lX: brak informacji aby obliczy prawdopodobiestwo zaufania\n" - -#~ msgid "%s: error checking key: %s\n" -#~ msgstr "%s: bd 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 uytkownika %s\n" - -#~ msgid "certificate read problem: %s\n" -#~ msgstr "bd przy odczycie certyfikatu: %s\n" - -#~ msgid "too many entries in unk cache - disabled\n" -#~ msgstr "zbyt wiele wpisw w buforze nieznanych kluczy - wyczony\n" - -#~ msgid "no default public keyring\n" -#~ msgstr "brak domylnego 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 uyj %s)\n" - -#~ msgid "%s: user not found\n" -#~ msgstr "%s: nie znaleziono uytkownika\n" - -#~ msgid "assuming bad MDC due to an unknown critical bit\n" -#~ msgstr "" -#~ "przyjto niepoprawno MDC z powonu ustawienia nieznanego bitu " -#~ "krytycznego\n" - -#~ msgid "error reading dir record for LID %lu: %s\n" -#~ msgstr "bd 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 gwnego dla LID %lu\n" - -#~ msgid "error reading primary key for LID %lu: %s\n" -#~ msgstr "bd odczytu gwnego klucza dla LID %lu: %s\n" - -#~ msgid "key %08lX: query record failed\n" -#~ msgstr "klucz %08lX: wyszukanie zapisu nie powiodo 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 dowizanie podklucza\n" - -#~ msgid "key %08lX.%lu: Invalid subkey binding: %s\n" -#~ msgstr "klucz %08lX.%lu: Niepoprawne dowizanie podklucza %s\n" - -#~ msgid "key %08lX.%lu: Valid key revocation\n" -#~ msgstr "klucz %08lX.%lu: Poprawne uniewanienie klucza\n" - -#~ msgid "key %08lX.%lu: Invalid key revocation: %s\n" -#~ msgstr "klucz %08lX.%lu: Niewaciwe uniewanienie 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 uniewanienie identyfikatora uytkownika pominite z powodu\n" -#~ "nowszego podpisu tym samym kluczem" - -#~ msgid "Valid user ID revocation" -#~ msgstr "Poprawne uniewanienie identyfikatora uytkownika" - -#~ msgid "Invalid user ID revocation" -#~ msgstr "Niepoprawne uniewanienie identyfikatora uytkownika" - -#~ msgid "Valid certificate revocation" -#~ msgstr "Poprawne uniewanienie certyfikatu" - -#~ msgid "Good certificate" -#~ msgstr "Poprawny certyfikat" - -#~ msgid "Invalid certificate revocation" -#~ msgstr "Niepoprawne uniewanienie 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 zy wpis.\n" - -#~ msgid "duplicated certificate - deleted" -#~ msgstr "podwjny certyfikat - usunity" - -#~ msgid "tdbio_search_dir failed: %s\n" -#~ msgstr "Procedura tdbio_search_dir nie powioda si: %s\n" - -#~ msgid "lid ?: insert failed: %s\n" -#~ msgstr "lid ?: wpisanie nie powiodo si: %s\n" - -#~ msgid "lid %lu: insert failed: %s\n" -#~ msgstr "lid %lu: wpisanie nie powiodo 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 - pominity\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 pominitych\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 identyfikatorw uytkownikw\n" - -#~ msgid "check_trust: search dir record failed: %s\n" -#~ msgstr "check_trust: poszukiwanie wpisu katalogowego nie powiodo si: %s\n" - -#~ msgid "key %08lX: insert trust record failed: %s\n" -#~ msgstr "klucz %08lX: wprowadzenie wpisu zaufania nie powiodo 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 przyszoci (zaburzenia czasoprzestrzeni,\n" -#~ "lub le ustawiony zegar systemowy)\n" - -#~ msgid "key %08lX.%lu: expired at %s\n" -#~ msgstr "klucz %08lX.%lu: okres wanoci upyn %s\n" - -#~ msgid "key %08lX.%lu: trust check failed: %s\n" -#~ msgstr "klucz %08lX.%lu: bd 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 uytkownika '%s' w bazie zaufania - dodano\n" - -#~ msgid "failed to put '%s' into trustdb: %s\n" -#~ msgstr "umieszczenie '%s' w Bazie Zaufania nie powiodo si: %s\n" - -#~ msgid "WARNING: can't yet handle long pref records\n" -#~ msgstr "OSTRZEENIE: dugie wpisy ustawie jeszcze nie s obsugiwane.\n" - -#~ msgid "%s: can't create keyring: %s\n" -#~ msgstr "%s: stworzenie zbioru kluczy jest niemoliwe: %s\n" - -#~ msgid "RSA key cannot be used in this version\n" -#~ msgstr "W tej wersji nie mona uywa kluczy RSA\n" - -#~ msgid "No key for user ID\n" -#~ msgstr "Brak klucza z takim identyfikatorem uytkownika.\n" - -#~ msgid "no secret key for decryption available\n" -#~ msgstr "odszyfrowujcy klucz tajny do jest niedostpny\n" - -#~ msgid "set debugging flags" -#~ msgstr "ustawienie opcji ledzenia wykonania programu" - -#~ msgid "enable full debugging" -#~ msgstr "umoliwienie penego ledzenia programu" - -#~ msgid "do not write comment packets" -#~ msgstr "nie zapisywa pakietw z komentarzem" - -#~ msgid "(default is 3)" -#~ msgstr "(domylnie 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 mona 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 rozway przejcie na inne " -#~ "algorytmy\n" -#~ "po wygenerowaniu odpowiednich kluczy.\n" - -#~ msgid "print all message digests" -#~ msgstr "wszystkie skrty wiadomoci" - -#~ msgid "can't lock keyring `%': %s\n" -#~ msgstr "nie mona zablokowa zbioru kluczy publicznych: %s\n" - -#~ msgid "error writing keyring `%': %s\n" -#~ msgstr "bd 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 licie domylnej %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 licie domylnej %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 licie domylnej %lu nie wskazuje \n" -#~ "na wpis katalogowy\n" - -#~ msgid "lid %lu: no primary key\n" -#~ msgstr "lid %lu: brak klucza gwnego\n" - -#~ msgid "lid %lu: user id not found in keyblock\n" -#~ msgstr "" -#~ "lid %lu: identyfikator uytkownika nie zosta odnaleziony w bloku klucza\n" - -#~ msgid "lid %lu: self-signature in hintlist\n" -#~ msgstr "lid %lu: podpis klucza nim samym w licie domylnej\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 domylna %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 niemoliwe: %s\n" - -#~ msgid "Too many preference items" -#~ msgstr "Zbyt wiele pozycji w ustawieniach" - -#~ msgid "public key not anymore available" -#~ msgstr "klucz publiczny jest ju niedostpny" - -#~ 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 powiodo 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 wartoci naley do Ciebie, nie bd one udostpnione\n" -#~ "nikomu innemu. S one uywane do stworzenia sieci zaufania i nie ma\n" -#~ "to nic wsplnego z tworzon sieci certyfikatw." - -#~ msgid "revoked_key.override" -#~ msgstr "" -#~ "Jeli mimo wszystko chcesz uy tego uniewanionego klucza, odpowiedz " -#~ "\"tak\"." - -#~ msgid "untrusted_key.override" -#~ msgstr "" -#~ "Jeli mimo wszystko chcesz uy tego klucza, klucza do ktrego nie masz\n" -#~ "zaufania, odpowiedz \"tak\"." - -#~ msgid "pklist.user_id.enter" -#~ msgstr "Podaj identyfikator uytkownika adresata tych informacji." - -#~ msgid "keygen.algo" -#~ msgstr "" -#~ "Wybr algorytmu:\n" -#~ "DSA (znany te jako DSS) to Algorytm Podpisu Cyfrowego - uywa go mona " -#~ "tylko\n" -#~ "do tworzenia cyfrowych podpisw. Jego wybr jest sugerowany poniewa\n" -#~ "sprawdzanie podpisw zoonych algorytmem DSA jest duo szybsze ni tych\n" -#~ "zoonych algorytmem ElGamala.\n" -#~ "Algorytm ElGamala to algorytm klucza publicznego ktry nadaje mona " -#~ "stosowa\n" -#~ "zarwno do szyfrowania jak i do tworzenia podpisw cyfrowych\n" -#~ "W standardzie OpenPGP algorytm ElGamala wystpuje w dwch wersjach:\n" -#~ "obsugujcej podpisywanie, oraz obsugujcej podpisywanie i szyfrowanie; " -#~ "z\n" -#~ "technicznego punktu widzenia algorytm dziaa tak samo, ale pewne " -#~ "wspczynniki\n" -#~ "musz by dobrane tak aby klucz nadawa si do skadania bezpiecznych\n" -#~ "podpisw. Ten program obsuguje obie wersje, ale inne implementacje " -#~ "OpenPGP\n" -#~ "nie musz rozumie obsugiwa klucza przeznaczonego jednoczenie do\n" -#~ "podpisywania i szyfrowania.\n" -#~ "Gwny klucz musi by zawsze kluczem sucym umoliwiajcym " -#~ "podpisywanie,\n" -#~ "dlatego te ten program nie obsuguje osobnych kluczy ElGamala sucych " -#~ "tylko\n" -#~ "do szyfrowania." - -#~ msgid "keygen.algo.elg_se" -#~ msgstr "" -#~ "Mimo e ten rodzaj kluczy jest zdefiniowany w RFC 2440, wybr takiego " -#~ "klucza\n" -#~ "nie jest sugerowany. Nie wszystkie programy taki klucz s w stanie " -#~ "obsuy,\n" -#~ "a podpisy zoone za jego pomoc s due i ich sprawdzenie zajmuje duo " -#~ "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) waciciela 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 - przejcie do waciwej generacji klucza.\n" -#~ "W - wyjcie z procedury generacji i z programu." - -#~ msgid "keygen.sub.okay" -#~ msgstr "" -#~ "Odpowiedz \"tak\" (lub po prostu \"t\") jeli 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\" jeli chcesz podpisa wszystkie identyfikatory klucza" - -#~ msgid "keyedit.remove.uid.okay" -#~ msgstr "" -#~ "Odpowiedz \"tak\" jeli na pewno chcesz skasowa ten identyfikator " -#~ "klucza.\n" -#~ "Utracisz wszystkie podpisy innych uytkownikw zoone na tym " -#~ "identyfikatorze!" - -#~ msgid "keyedit.remove.subkey.okay" -#~ msgstr "Odpowiedz \"tak\" jeli na pewno chcesz skasowa ten podklucz" - -#~ msgid "passphrase.enter" -#~ msgstr "" -#~ "Prosz wprowadzi wyraenie przejciowe (tajne zdanie)\n" -#~ " Bla, bla, bla ..." - -#~ msgid "passphrase.repeat" -#~ msgstr "" -#~ "Prosz powtrzy podane wyraenie przejciowe dla wyeliminowania pomyek." - -#~ msgid "detached_signature.filename" -#~ msgstr "Nazwa pliku ktrego dotyczy ten podpis" - -#~ msgid "openfile.overwrite.okay" -#~ msgstr "Odpowiedz \"tak\" jeli 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 niemoliwe: %s\n" - -#~ msgid "Usage: gpgm [options] [files] (-h for help)" -#~ msgstr "Wywoanie: gpgm [opcje] [pliki] (-h podaje pomoc)" - -#~ msgid "usage: gpgm [options] " -#~ msgstr "sposb uycia: gpgm [opcje]" - -#~ msgid "chained sigrec %lu has a wrong owner\n" -#~ msgstr "powizany rekord podpisu %lu ma niewaciwego waciciela\n" - -#~ msgid "lid %lu: read dir record failed: %s\n" -#~ msgstr "lid %lu: odczyt wpisu katalogowego nie powid si: %s\n" - -#~ msgid "lid %lu: read key record failed: %s\n" -#~ msgstr "lid %lu: odczyt wpisu klucza nie powid si: %s\n" - -#~ msgid "lid %lu: read uid record failed: %s\n" -#~ msgstr "lid %lu: odczyt wpisu z identyfikatorem nie powid si; %s\n" - -#~ msgid "lid %lu: read pref record failed: %s\n" -#~ msgstr "lid %lu: odczyt wpisu ustawie nie powid si: %s\n" - -#~ msgid "user '%s' read problem: %s\n" -#~ msgstr "uytkownik '%s' bd przy odczycie: %s\n" - -#~ msgid "user '%s' list problem: %s\n" -#~ msgstr "uytkownik '%s' bd listy: %s\n" - -#~ msgid "user '%s' not in trustdb\n" -#~ msgstr "brak uytkownika '%s' w bazie zaufania\n" - -#~ msgid "directory record w/o primary key\n" -#~ msgstr "wpis katalogowy bez klucza gwnego\n" - -#~ msgid "key not in trustdb, searching ring.\n" -#~ msgstr "brak klucza w bazie zaufania, przeszukiwany jest zbir 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 "gowny klucz nie zosta uyty w procedurze insert_trust_record()\n" - -#~ msgid "second" -#~ msgstr "sekunda" - -#~ msgid "seconds" -#~ msgstr "sekund" - -#~ msgid "invalid clear text header: " -#~ msgstr "niepoprawny nagwek tekstu jawnego:" - -#~ msgid "This key belongs to us (we have the secret key)\n" -#~ msgstr "Ten klucz naley do nas (mamy odpowiadajcy mu klucz tajny).\n" - -# %d niepoprawnych podpisw -#~ msgid "You will see a list of signators etc. here\n" -#~ msgstr "Tu ukae si lista podpisw itd.\n" diff --git a/po/pt.po b/po/pt.po deleted file mode 100644 index 55e5046fc..000000000 --- a/po/pt.po +++ /dev/null @@ -1,7199 +0,0 @@ -# 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-07-28 11:12+0200\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 mdulo de recolha de entropia detectado\n" - -#: cipher/random.c:403 -#, fuzzy, c-format -msgid "can't lock `%s': %s\n" -msgstr "impossvel 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:1003 g10/gpg.c:3461 g10/import.c:195 g10/keygen.c:2385 -#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:342 -#: 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 "impossvel abrir `%s': %s\n" - -#: cipher/random.c:458 -#, c-format -msgid "can't stat `%s': %s\n" -msgstr "impossvel 'stat' a `%s': %s\n" - -#: cipher/random.c:463 -#, c-format -msgid "`%s' is not a regular file - ignored\n" -msgstr "`%s' no 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 invlido - no utilizado\n" - -#: cipher/random.c:482 -#, c-format -msgid "can't read `%s': %s\n" -msgstr "impossvel ler `%s': %s\n" - -#: cipher/random.c:520 -msgid "note: random_seed file not updated\n" -msgstr "nota: ficheiro random_seed no actualizado\n" - -#: cipher/random.c:544 g10/exec.c:481 g10/gpg.c:1002 g10/keygen.c:2864 -#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:263 -#: g10/openfile.c:357 g10/sign.c:826 g10/sign.c:1130 g10/tdbio.c:536 -#, c-format -msgid "can't create `%s': %s\n" -msgstr "impossvel criar `%s': %s\n" - -#: cipher/random.c:556 cipher/random.c:566 -#, c-format -msgid "can't write `%s': %s\n" -msgstr "impossvel escrever `%s': %s\n" - -#: cipher/random.c:569 -#, c-format -msgid "can't close `%s': %s\n" -msgstr "impossvel fechar `%s': %s\n" - -#: cipher/random.c:814 -msgid "WARNING: using insecure random number generator!!\n" -msgstr "AVISO: a utilizar gerador de nmeros aleatrios 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 nmeros aleatrios apenas um \"remendo\"\n" -"para poder funcionar - no de modo algum um bom gerador!\n" -"\n" -"NO 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" -"No h bytes aleatrios suficientes. Por favor, faa outro trabalho para\n" -"que o sistema possa recolher mais entropia! (So necessrios 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 confiana: %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 "remoo 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 gerao 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 criao 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 confiana: %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 "remoo do bloco de chave falhou: %s\n" - -#: g10/app-openpgp.c:1904 -#, fuzzy, c-format -msgid "key generation completed (%d seconds)\n" -msgstr "A gerao 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 vlido encontrado.\n" - -#: g10/armor.c:320 -#, c-format -msgid "armor: %s\n" -msgstr "armadura: %s\n" - -#: g10/armor.c:359 -msgid "invalid armor header: " -msgstr "cabealho de armadura invlido: " - -#: g10/armor.c:370 -msgid "armor header: " -msgstr "cabealho de armadura: " - -#: g10/armor.c:381 -msgid "invalid clearsig header\n" -msgstr "cabealho de assinatura em texto puro invlido\n" - -#: g10/armor.c:433 -msgid "nested clear text signatures\n" -msgstr "assinaturas em texto puro aninhadas\n" - -#: g10/armor.c:568 -#, fuzzy -msgid "unexpected armor: " -msgstr "armadura inesperada:" - -#: g10/armor.c:580 -msgid "invalid dash escaped line: " -msgstr "linha com hfen invlida: " - -#: g10/armor.c:734 g10/armor.c:1343 -#, fuzzy, c-format -msgid "invalid radix64 character %02X skipped\n" -msgstr "caracter radix64 invlido %02x ignorado\n" - -#: g10/armor.c:777 -msgid "premature eof (no CRC)\n" -msgstr "fim de ficheiro prematuro (sem CRC)\n" - -#: g10/armor.c:811 -msgid "premature eof (in CRC)\n" -msgstr "fim de ficheiro prematuro (no CRC)\n" - -#: g10/armor.c:819 -msgid "malformed CRC\n" -msgstr "CRC malformado\n" - -#: g10/armor.c:823 g10/armor.c:1380 -#, fuzzy, c-format -msgid "CRC error; %06lX - %06lX\n" -msgstr "erro de CRC; %06lx - %06lx\n" - -#: g10/armor.c:843 -#, fuzzy -msgid "premature eof (in trailer)\n" -msgstr "fim de ficheiro prematuro (no \"Trailer\")\n" - -#: g10/armor.c:847 -msgid "error in trailer line\n" -msgstr "erro na ltima linha\n" - -#: g10/armor.c:1158 -msgid "no valid OpenPGP data found.\n" -msgstr "nenhum dado OpenPGP vlido encontrado.\n" - -#: g10/armor.c:1163 -#, c-format -msgid "invalid armor: line longer than %d characters\n" -msgstr "armadura invlida: linha maior que %d caracteres\n" - -#: g10/armor.c:1167 -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 no disponvel" - -#: 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 "impossvel fazer isso em modo no-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 "Opo? " - -#: 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 "no 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 pblica 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:280 -#, 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 "preferncias actualizadas" - -#: g10/card-util.c:802 -#, fuzzy -msgid "Error: invalid length of preference string.\n" -msgstr "caracter invlido na cadeia de caractres da preferncia\n" - -#: g10/card-util.c:811 -#, fuzzy -msgid "Error: invalid characters in preference string.\n" -msgstr "caracter invlido na cadeia de caractres da preferncia\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: verso de ficheiro invlida %d\n" - -#: g10/card-util.c:867 -#, fuzzy -msgid "CA fingerprint: " -msgstr "mostra impresso digital" - -#: g10/card-util.c:890 -#, fuzzy -msgid "Error: invalid formatted fingerprint.\n" -msgstr "%s: verso de ficheiro invlida %d\n" - -#: g10/card-util.c:938 -#, fuzzy, c-format -msgid "key operation not possible: %s\n" -msgstr "A gerao de chaves falhou: %s\n" - -#: g10/card-util.c:939 -#, fuzzy -msgid "not an OpenPGP card" -msgstr "nenhum dado OpenPGP vlido 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 "Opo invlida.\n" - -#: g10/card-util.c:1203 -#, fuzzy -msgid "Please select where to store the key:\n" -msgstr "motivo da revocao: " - -#: g10/card-util.c:1238 -#, fuzzy -msgid "unknown key protection algorithm\n" -msgstr "algoritmo de compresso desconhecido" - -#: g10/card-util.c:1243 -#, fuzzy -msgid "secret parts of key are not available\n" -msgstr "Componentes secretas da chave primria no disponveis.\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 disponvel" - -#: 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 confiana" - -#: 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 impresso 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 invlido (tente \"help\")\n" - -#: g10/cardglue.c:416 -#, fuzzy -msgid "card reader not available\n" -msgstr "chave secreta no disponvel" - -#: 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 "remoo 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 no foi repetida corretamente; tente outra vez" - -#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3826 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 "impossvel abrir `%s'\n" - -#: g10/decrypt.c:105 g10/encode.c:839 -msgid "--output doesn't work for this command\n" -msgstr "--output no funciona para este comando\n" - -#: g10/delkey.c:75 g10/export.c:311 g10/keyedit.c:3387 g10/keyserver.c:1700 -#: g10/revoke.c:228 -#, fuzzy, c-format -msgid "key \"%s\" not found: %s\n" -msgstr "chave `%s' no encontrada: %s\n" - -#: g10/delkey.c:83 g10/export.c:341 g10/import.c:2349 g10/keyserver.c:1714 -#: 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 no ser que escolha a chave pela sua impresso digital)\n" - -#: g10/delkey.c:135 -#, fuzzy -msgid "can't do this in batch mode without \"--yes\"\n" -msgstr "impossvel fazer isso em modo no-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 "remoo do bloco de chave falhou: %s\n" - -#: g10/delkey.c:175 -msgid "ownertrust information cleared\n" -msgstr "informaes 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 pblica \"%s\"!\n" - -#: g10/delkey.c:208 -msgid "use option \"--delete-secret-keys\" to delete it first.\n" -msgstr "utilize a opo \"--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 criao da frase secreta: %s\n" - -#: g10/encode.c:218 -msgid "can't use a symmetric ESK packet due to the S2K mode\n" -msgstr "no possvel utilizar o pacote ESK simtrico 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 "" -"impossvel 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 forar a cifra simtrica %s (%d) viola as preferncias do destinatrio\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 forar o algoritmo de compresso %s (%d) viola as preferncias do " -"destinatrio\n" - -#: g10/encode.c:715 -#, c-format -msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n" -msgstr "" -"ao forar a cifra simtrica %s (%d) viola as preferncias do destinatrio\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 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:67 g10/mainproc.c:293 -#, c-format -msgid "%s encrypted data\n" -msgstr "dados cifrados com %s\n" - -#: g10/encr-data.c:69 g10/mainproc.c:297 -#, c-format -msgid "encrypted with unknown algorithm %d\n" -msgstr "cifrado com algoritmo desconhecido %d\n" - -#: g10/encr-data.c:93 -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 simtrica.\n" - -#: g10/encr-data.c:104 -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:415 -#, fuzzy, c-format -msgid "can't create directory `%s': %s\n" -msgstr "%s: impossvel 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 verso: %s\n" - -#: g10/exec.c:425 -#, fuzzy, c-format -msgid "unable to execute program `%s': %s\n" -msgstr "no foi possvel alterar o exec-path para %s\n" - -#: g10/exec.c:428 -#, fuzzy, c-format -msgid "unable to execute shell `%s': %s\n" -msgstr "no foi possvel 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 verso: %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 "no foi possvel alterar o exec-path para %s\n" - -#: g10/exec.c:555 -#, fuzzy, c-format -msgid "unable to read external program response: %s\n" -msgstr "no foi possvel 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 no-revocvel.\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 secundria" - -#: g10/export.c:69 -#, fuzzy -msgid "remove unusable parts from key during export" -msgstr "chave secreta no utilizvel" - -#: 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: no 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 confiana: %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:375 -msgid "" -"@Commands:\n" -" " -msgstr "" -"@Comandos:\n" -" " - -#: g10/gpg.c:377 -msgid "|[file]|make a signature" -msgstr "|[ficheiro]|fazer uma assinatura" - -#: g10/gpg.c:378 -msgid "|[file]|make a clear text signature" -msgstr "|[ficheiro]|fazer uma assinatura em texto puro" - -#: g10/gpg.c:379 -msgid "make a detached signature" -msgstr "fazer uma assinatura separada" - -#: g10/gpg.c:380 -msgid "encrypt data" -msgstr "cifrar dados" - -#: g10/gpg.c:382 -msgid "encryption only with symmetric cipher" -msgstr "cifrar apenas com cifra simtrica" - -#: g10/gpg.c:384 -msgid "decrypt data (default)" -msgstr "decifrar dados (aco por omisso)" - -#: g10/gpg.c:386 -msgid "verify a signature" -msgstr "verificar uma assinatura" - -#: g10/gpg.c:388 -msgid "list keys" -msgstr "listar as chaves" - -#: g10/gpg.c:390 -msgid "list keys and signatures" -msgstr "listar as chaves e as assinaturas" - -#: g10/gpg.c:391 -#, fuzzy -msgid "list and check key signatures" -msgstr "verificar as assinaturas das chaves" - -#: g10/gpg.c:392 -msgid "list keys and fingerprints" -msgstr "listar as chaves e as impresses digitais" - -#: g10/gpg.c:393 -msgid "list secret keys" -msgstr "listar as chaves secretas" - -#: g10/gpg.c:394 -msgid "generate a new key pair" -msgstr "gerar um novo par de chaves" - -#: g10/gpg.c:395 -msgid "remove keys from the public keyring" -msgstr "remover chaves do porta-chaves pblico" - -#: g10/gpg.c:397 -msgid "remove keys from the secret keyring" -msgstr "remover chaves do porta-chaves secreto" - -#: g10/gpg.c:398 -msgid "sign a key" -msgstr "assinar uma chave" - -#: g10/gpg.c:399 -msgid "sign a key locally" -msgstr "assinar uma chave localmente" - -#: g10/gpg.c:400 -msgid "sign or edit a key" -msgstr "assinar ou editar uma chave" - -#: g10/gpg.c:401 -msgid "generate a revocation certificate" -msgstr "gerar um certificado de revogao" - -#: g10/gpg.c:403 -msgid "export keys" -msgstr "exportar chaves" - -#: g10/gpg.c:404 -msgid "export keys to a key server" -msgstr "exportar chaves para um servidor de chaves" - -#: g10/gpg.c:405 -msgid "import keys from a key server" -msgstr "importar chaves de um servidor de chaves" - -#: g10/gpg.c:407 -msgid "search for keys on a key server" -msgstr "procurar chaves num servidor de chaves" - -#: g10/gpg.c:409 -msgid "update all keys from a keyserver" -msgstr "actualizar todas as chaves a partir de um servidor de chaves" - -#: g10/gpg.c:413 -msgid "import/merge keys" -msgstr "importar/fundir chaves" - -#: g10/gpg.c:416 -msgid "print the card status" -msgstr "" - -#: g10/gpg.c:417 -msgid "change data on a card" -msgstr "" - -#: g10/gpg.c:418 -msgid "change a card's PIN" -msgstr "" - -#: g10/gpg.c:426 -msgid "update the trust database" -msgstr "actualizar a base de dados de confiana" - -#: g10/gpg.c:433 -msgid "|algo [files]|print message digests" -msgstr "|algo [ficheiros]|imprimir \"digests\" de mensagens" - -#: g10/gpg.c:437 g10/gpgv.c:71 -msgid "" -"@\n" -"Options:\n" -" " -msgstr "" -"@\n" -"Opes:\n" -" " - -#: g10/gpg.c:439 -msgid "create ascii armored output" -msgstr "criar sada com armadura ascii" - -#: g10/gpg.c:441 -msgid "|NAME|encrypt for NAME" -msgstr "|NOME|cifrar para NOME" - -#: g10/gpg.c:452 -msgid "use this user-id to sign or decrypt" -msgstr "" -"usar este identificador de utilizador para\n" -"assinar ou decifrar" - -#: g10/gpg.c:453 -msgid "|N|set compress level N (0 disables)" -msgstr "" -"|N|estabelecer nvel de compresso N\n" -"(0 desactiva)" - -#: g10/gpg.c:458 -msgid "use canonical text mode" -msgstr "usar modo de texto cannico" - -#: g10/gpg.c:472 -msgid "use as output file" -msgstr "usar como ficheiro de sada" - -#: g10/gpg.c:474 g10/gpgv.c:73 -msgid "verbose" -msgstr "detalhado" - -#: g10/gpg.c:485 -msgid "do not make any changes" -msgstr "no fazer alteraes" - -#: g10/gpg.c:486 -msgid "prompt before overwriting" -msgstr "perguntar antes de sobrepr" - -#: g10/gpg.c:527 -msgid "use strict OpenPGP behavior" -msgstr "" - -#: g10/gpg.c:528 -msgid "generate PGP 2.x compatible messages" -msgstr "" - -#: g10/gpg.c:556 -msgid "" -"@\n" -"(See the man page for a complete listing of all commands and options)\n" -msgstr "" -"@\n" -"(Veja a pgina man para uma lista completa de comandos e opes)\n" - -#: g10/gpg.c:559 -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 impresses digitais\n" - -#: g10/gpg.c:757 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:774 -msgid "Usage: gpg [options] [files] (-h for help)" -msgstr "Uso: gpg [opes] [ficheiros] (-h para ajuda)" - -#: g10/gpg.c:777 -msgid "" -"Syntax: gpg [options] [files]\n" -"sign, check, encrypt or decrypt\n" -"default operation depends on the input data\n" -msgstr "" -"Sintaxe: gpg [opes] [ficheiros]\n" -"assina, verifica, cifra ou decifra\n" -"a operao por omisso depende dos dados de entrada\n" - -#: g10/gpg.c:788 -msgid "" -"\n" -"Supported algorithms:\n" -msgstr "" -"\n" -"Algoritmos suportados:\n" - -#: g10/gpg.c:791 -msgid "Pubkey: " -msgstr "Chave pblica: " - -#: g10/gpg.c:797 g10/keyedit.c:2310 -msgid "Cipher: " -msgstr "Cifra: " - -#: g10/gpg.c:803 -msgid "Hash: " -msgstr "Disperso: " - -#: g10/gpg.c:809 g10/keyedit.c:2356 -msgid "Compression: " -msgstr "Compresso: " - -#: g10/gpg.c:892 -msgid "usage: gpg [options] " -msgstr "uso: gpg [opes] " - -#: g10/gpg.c:1040 -msgid "conflicting commands\n" -msgstr "comandos em conflito\n" - -#: g10/gpg.c:1058 -#, fuzzy, c-format -msgid "no = sign found in group definition `%s'\n" -msgstr "nenhum sinal = encontrada na definio de grupo \"%s\"\n" - -#: g10/gpg.c:1255 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on homedir `%s'\n" -msgstr "AVISO: dono pouco seguro em %s \"%s\"\n" - -#: g10/gpg.c:1258 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on configuration file `%s'\n" -msgstr "AVISO: dono pouco seguro em %s \"%s\"\n" - -#: g10/gpg.c:1261 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on extension `%s'\n" -msgstr "AVISO: dono pouco seguro em %s \"%s\"\n" - -#: g10/gpg.c:1267 -#, fuzzy, c-format -msgid "WARNING: unsafe permissions on homedir `%s'\n" -msgstr "AVISO: permisses pouco seguras em %s \"%s\"\n" - -#: g10/gpg.c:1270 -#, fuzzy, c-format -msgid "WARNING: unsafe permissions on configuration file `%s'\n" -msgstr "AVISO: permisses pouco seguras em %s \"%s\"\n" - -#: g10/gpg.c:1273 -#, fuzzy, c-format -msgid "WARNING: unsafe permissions on extension `%s'\n" -msgstr "AVISO: permisses pouco seguras em %s \"%s\"\n" - -#: g10/gpg.c:1279 -#, 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:1282 -#, 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:1285 -#, 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:1291 -#, fuzzy, c-format -msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n" -msgstr "AVISO: permisses pouco seguras em %s \"%s\"\n" - -#: g10/gpg.c:1294 -#, fuzzy, c-format -msgid "" -"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n" -msgstr "AVISO: permisses pouco seguras em %s \"%s\"\n" - -#: g10/gpg.c:1297 -#, fuzzy, c-format -msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n" -msgstr "AVISO: permisses pouco seguras em %s \"%s\"\n" - -#: g10/gpg.c:1438 -#, fuzzy, c-format -msgid "unknown configuration item `%s'\n" -msgstr "criado um novo ficheiro de configurao `%s'\n" - -#: g10/gpg.c:1531 -msgid "display photo IDs during key listings" -msgstr "" - -#: g10/gpg.c:1533 -msgid "show policy URLs during signature listings" -msgstr "" - -#: g10/gpg.c:1535 -#, fuzzy -msgid "show all notations during signature listings" -msgstr "Nenhuma assinatura correspondente no porta-chaves secreto\n" - -#: g10/gpg.c:1537 -msgid "show IETF standard notations during signature listings" -msgstr "" - -#: g10/gpg.c:1541 -msgid "show user-supplied notations during signature listings" -msgstr "" - -#: g10/gpg.c:1543 -#, fuzzy -msgid "show preferred keyserver URLs during signature listings" -msgstr "a URL de poltica de assinatura dada invlida\n" - -#: g10/gpg.c:1545 -msgid "show user ID validity during key listings" -msgstr "" - -#: g10/gpg.c:1547 -msgid "show revoked and expired user IDs in key listings" -msgstr "" - -#: g10/gpg.c:1549 -msgid "show revoked and expired subkeys in key listings" -msgstr "" - -#: g10/gpg.c:1551 -#, fuzzy -msgid "show the keyring name in key listings" -msgstr "mostrar em que porta-chave a chave est" - -#: g10/gpg.c:1553 -#, fuzzy -msgid "show expiration dates during signature listings" -msgstr "Nenhuma assinatura correspondente no porta-chaves secreto\n" - -#: g10/gpg.c:1920 -#, c-format -msgid "NOTE: old default options file `%s' ignored\n" -msgstr "NOTA: o ficheiro antigo de opes por omisso `%s' foi ignorado\n" - -#: g10/gpg.c:1962 -#, c-format -msgid "NOTE: no default option file `%s'\n" -msgstr "NOTA: ficheiro de opes por omisso `%s' inexistente\n" - -#: g10/gpg.c:1966 -#, c-format -msgid "option file `%s': %s\n" -msgstr "ficheiro de opes `%s': %s\n" - -#: g10/gpg.c:1973 -#, c-format -msgid "reading options from `%s'\n" -msgstr "a ler opes de `%s'\n" - -#: g10/gpg.c:2188 g10/gpg.c:2814 g10/gpg.c:2833 -#, c-format -msgid "NOTE: %s is not for normal use!\n" -msgstr "NOTA: %s no para uso normal!\n" - -#: g10/gpg.c:2201 -#, fuzzy, c-format -msgid "cipher extension `%s' not loaded due to unsafe permissions\n" -msgstr "" -"a extenso de cifra \"%s\" no foi carregada devido s suas permisses " -"inseguras\n" - -#: g10/gpg.c:2364 g10/gpg.c:2376 -#, fuzzy, c-format -msgid "`%s' is not a valid signature expiration\n" -msgstr "%s no um conjunto de caracteres vlido\n" - -#: g10/gpg.c:2452 -#, fuzzy, c-format -msgid "`%s' is not a valid character set\n" -msgstr "%s no um conjunto de caracteres vlido\n" - -#: g10/gpg.c:2476 g10/gpg.c:2663 g10/keyedit.c:4064 -#, fuzzy -msgid "could not parse keyserver URL\n" -msgstr "no consegui processar a URI do servidor de chaves\n" - -#: g10/gpg.c:2488 -#, fuzzy, c-format -msgid "%s:%d: invalid keyserver options\n" -msgstr "%s:%d: opes de exportao invlidas\n" - -#: g10/gpg.c:2491 -#, fuzzy -msgid "invalid keyserver options\n" -msgstr "opes de exportao invlidas\n" - -#: g10/gpg.c:2498 -#, c-format -msgid "%s:%d: invalid import options\n" -msgstr "%s:%d: opes de importao invlidas\n" - -#: g10/gpg.c:2501 -msgid "invalid import options\n" -msgstr "opes de importao invlidas\n" - -#: g10/gpg.c:2508 -#, c-format -msgid "%s:%d: invalid export options\n" -msgstr "%s:%d: opes de exportao invlidas\n" - -#: g10/gpg.c:2511 -msgid "invalid export options\n" -msgstr "opes de exportao invlidas\n" - -#: g10/gpg.c:2518 -#, fuzzy, c-format -msgid "%s:%d: invalid list options\n" -msgstr "%s:%d: opes de importao invlidas\n" - -#: g10/gpg.c:2521 -#, fuzzy -msgid "invalid list options\n" -msgstr "opes de importao invlidas\n" - -#: g10/gpg.c:2529 -msgid "display photo IDs during signature verification" -msgstr "" - -#: g10/gpg.c:2531 -msgid "show policy URLs during signature verification" -msgstr "" - -#: g10/gpg.c:2533 -#, fuzzy -msgid "show all notations during signature verification" -msgstr "%s no um conjunto de caracteres vlido\n" - -#: g10/gpg.c:2535 -msgid "show IETF standard notations during signature verification" -msgstr "" - -#: g10/gpg.c:2539 -msgid "show user-supplied notations during signature verification" -msgstr "" - -#: g10/gpg.c:2541 -#, fuzzy -msgid "show preferred keyserver URLs during signature verification" -msgstr "a URL de poltica de assinatura dada invlida\n" - -#: g10/gpg.c:2543 -#, fuzzy -msgid "show user ID validity during signature verification" -msgstr "%s no um conjunto de caracteres vlido\n" - -#: g10/gpg.c:2545 -msgid "show revoked and expired user IDs in signature verification" -msgstr "" - -#: g10/gpg.c:2547 -msgid "validate signatures with PKA data" -msgstr "" - -#: g10/gpg.c:2549 -msgid "elevate the trust of signatures with valid PKA data" -msgstr "" - -#: g10/gpg.c:2556 -#, fuzzy, c-format -msgid "%s:%d: invalid verify options\n" -msgstr "%s:%d: opes de exportao invlidas\n" - -#: g10/gpg.c:2559 -#, fuzzy -msgid "invalid verify options\n" -msgstr "opes de exportao invlidas\n" - -#: g10/gpg.c:2566 -#, c-format -msgid "unable to set exec-path to %s\n" -msgstr "no foi possvel alterar o exec-path para %s\n" - -#: g10/gpg.c:2729 -#, fuzzy, c-format -msgid "%s:%d: invalid auto-key-locate list\n" -msgstr "%s:%d: opes de exportao invlidas\n" - -#: g10/gpg.c:2732 -msgid "invalid auto-key-locate list\n" -msgstr "" - -#: g10/gpg.c:2803 -msgid "WARNING: program may create a core file!\n" -msgstr "AVISO: O programa pode criar um ficheiro core!\n" - -#: g10/gpg.c:2807 -#, c-format -msgid "WARNING: %s overrides %s\n" -msgstr "AVISO: %s sobrepe %s\n" - -#: g10/gpg.c:2816 -#, c-format -msgid "%s not allowed with %s!\n" -msgstr "%s no permitido com %s!\n" - -#: g10/gpg.c:2819 -#, c-format -msgid "%s makes no sense with %s!\n" -msgstr "%s no faz sentido com %s!\n" - -#: g10/gpg.c:2826 -#, fuzzy, c-format -msgid "NOTE: %s is not available in this version\n" -msgstr "o gpg-agent no est disponvel nesta sesso\n" - -#: g10/gpg.c:2841 -#, 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:2855 -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:2861 -msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n" -msgstr "no pode assinar e cifrar ao mesmo tempo no modo --pgp2\n" - -#: g10/gpg.c:2867 -msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n" -msgstr "" -"deve utilizar ficheiros (e no um 'pipe') quando trabalho no modo --pgp2.\n" - -#: g10/gpg.c:2880 -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:2947 g10/gpg.c:2971 -msgid "selected cipher algorithm is invalid\n" -msgstr "o algoritmo de cifragem selecionado invlido\n" - -#: g10/gpg.c:2953 g10/gpg.c:2977 -msgid "selected digest algorithm is invalid\n" -msgstr "o algoritmo de \"digest\" selecionado invlido\n" - -#: g10/gpg.c:2959 -#, fuzzy -msgid "selected compression algorithm is invalid\n" -msgstr "o algoritmo de cifragem selecionado invlido\n" - -#: g10/gpg.c:2965 -msgid "selected certification digest algorithm is invalid\n" -msgstr "o algoritmo de \"digest\" de certificao selecionado invlido\n" - -#: g10/gpg.c:2980 -msgid "completes-needed must be greater than 0\n" -msgstr "completes-needed deve ser maior que 0\n" - -#: g10/gpg.c:2982 -msgid "marginals-needed must be greater than 1\n" -msgstr "marginals-needed deve ser maior que 1\n" - -#: g10/gpg.c:2984 -#, 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:2986 -#, fuzzy -msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n" -msgstr "nvel de verificao por omisso invlido: deve ser 0, 1, 2 ou 3\n" - -#: g10/gpg.c:2988 -#, fuzzy -msgid "invalid min-cert-level; must be 1, 2, or 3\n" -msgstr "nvel de verificao por omisso invlido: deve ser 0, 1, 2 ou 3\n" - -#: g10/gpg.c:2991 -msgid "NOTE: simple S2K mode (0) is strongly discouraged\n" -msgstr "NOTA: o modo S2K simples (0) no recomendvel\n" - -#: g10/gpg.c:2995 -msgid "invalid S2K mode; must be 0, 1 or 3\n" -msgstr "modo S2K invlido: deve ser 0, 1 ou 3\n" - -#: g10/gpg.c:3002 -msgid "invalid default preferences\n" -msgstr "preferncias por omisso invlidas\n" - -#: g10/gpg.c:3011 -msgid "invalid personal cipher preferences\n" -msgstr "preferncias pessoais de cifra invlidas\n" - -#: g10/gpg.c:3015 -msgid "invalid personal digest preferences\n" -msgstr "preferncias pessoais de 'digest' invlidas\n" - -#: g10/gpg.c:3019 -msgid "invalid personal compress preferences\n" -msgstr "preferncias pessoais de compresso invlidas\n" - -#: g10/gpg.c:3052 -#, fuzzy, c-format -msgid "%s does not yet work with %s\n" -msgstr "%s no faz sentido com %s!\n" - -#: g10/gpg.c:3099 -#, fuzzy, c-format -msgid "you may not use cipher algorithm `%s' while in %s mode\n" -msgstr "no pode utilizar %s enquanto estiver no modo %s\n" - -#: g10/gpg.c:3104 -#, fuzzy, c-format -msgid "you may not use digest algorithm `%s' while in %s mode\n" -msgstr "no pode utilizar %s enquanto estiver no modo %s\n" - -#: g10/gpg.c:3109 -#, fuzzy, c-format -msgid "you may not use compression algorithm `%s' while in %s mode\n" -msgstr "no pode utilizar %s enquanto estiver no modo %s\n" - -#: g10/gpg.c:3208 -#, c-format -msgid "failed to initialize the TrustDB: %s\n" -msgstr "falha ao inicializar a base de dados de confiana: %s\n" - -#: g10/gpg.c:3219 -msgid "WARNING: recipients (-r) given without using public key encryption\n" -msgstr "" -"AVISO: destinatrios (-r) dados sem utilizar uma cifra de chave pblica\n" - -#: g10/gpg.c:3230 -msgid "--store [filename]" -msgstr "--store [nome_do_ficheiro]" - -#: g10/gpg.c:3237 -msgid "--symmetric [filename]" -msgstr "--symmetric [nome_do_ficheiro]" - -#: g10/gpg.c:3239 -#, fuzzy, c-format -msgid "symmetric encryption of `%s' failed: %s\n" -msgstr "decifragem falhou: %s\n" - -#: g10/gpg.c:3249 -msgid "--encrypt [filename]" -msgstr "--encrypt [nome_do_ficheiro]" - -#: g10/gpg.c:3262 -#, fuzzy -msgid "--symmetric --encrypt [filename]" -msgstr "--sign --encrypt [nome_do_ficheiro]" - -#: g10/gpg.c:3264 -msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n" -msgstr "" - -#: g10/gpg.c:3267 -#, fuzzy, c-format -msgid "you cannot use --symmetric --encrypt while in %s mode\n" -msgstr "no pode utilizar %s enquanto estiver no modo %s\n" - -#: g10/gpg.c:3285 -msgid "--sign [filename]" -msgstr "--sign [nome_do_ficheiro]" - -#: g10/gpg.c:3298 -msgid "--sign --encrypt [filename]" -msgstr "--sign --encrypt [nome_do_ficheiro]" - -#: g10/gpg.c:3313 -#, fuzzy -msgid "--symmetric --sign --encrypt [filename]" -msgstr "--sign --encrypt [nome_do_ficheiro]" - -#: g10/gpg.c:3315 -msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n" -msgstr "" - -#: g10/gpg.c:3318 -#, fuzzy, c-format -msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n" -msgstr "no pode utilizar %s enquanto estiver no modo %s\n" - -#: g10/gpg.c:3338 -msgid "--sign --symmetric [filename]" -msgstr "--sign --symmetric [nome_do_ficheiro]" - -#: g10/gpg.c:3347 -msgid "--clearsign [filename]" -msgstr "--clearsign [nome_do_ficheiro]" - -#: g10/gpg.c:3372 -msgid "--decrypt [filename]" -msgstr "--decrypt [nome_do_ficheiro]" - -#: g10/gpg.c:3380 -msgid "--sign-key user-id" -msgstr "--sign-key id-utilizador" - -#: g10/gpg.c:3384 -msgid "--lsign-key user-id" -msgstr "--lsign-key id-utilizador" - -#: g10/gpg.c:3405 -msgid "--edit-key user-id [commands]" -msgstr "--edit-key id-utilizador [comandos]" - -#: g10/gpg.c:3476 -msgid "-k[v][v][v][c] [user-id] [keyring]" -msgstr "-k[v][v][v][c] [id-utilizador] [porta-chaves]" - -#: g10/gpg.c:3518 -#, fuzzy, c-format -msgid "keyserver send failed: %s\n" -msgstr "A gerao de chaves falhou: %s\n" - -#: g10/gpg.c:3520 -#, fuzzy, c-format -msgid "keyserver receive failed: %s\n" -msgstr "A gerao de chaves falhou: %s\n" - -#: g10/gpg.c:3522 -#, fuzzy, c-format -msgid "key export failed: %s\n" -msgstr "A gerao de chaves falhou: %s\n" - -#: g10/gpg.c:3533 -#, fuzzy, c-format -msgid "keyserver search failed: %s\n" -msgstr "A gerao de chaves falhou: %s\n" - -#: g10/gpg.c:3543 -#, fuzzy, c-format -msgid "keyserver refresh failed: %s\n" -msgstr "actualizao da chave secreta falhou: %s\n" - -#: g10/gpg.c:3594 -#, c-format -msgid "dearmoring failed: %s\n" -msgstr "retirada de armadura falhou: %s\n" - -#: g10/gpg.c:3602 -#, c-format -msgid "enarmoring failed: %s\n" -msgstr "criao de armadura falhou: %s\n" - -#: g10/gpg.c:3689 -#, c-format -msgid "invalid hash algorithm `%s'\n" -msgstr "algoritmo de disperso invlido `%s'\n" - -#: g10/gpg.c:3812 -msgid "[filename]" -msgstr "[nome_do_ficheiro]" - -#: g10/gpg.c:3816 -msgid "Go ahead and type your message ...\n" -msgstr "Digite a sua mensagem ...\n" - -#: g10/gpg.c:4120 -msgid "the given certification policy URL is invalid\n" -msgstr "a URL de poltica de certificao dada invlida\n" - -#: g10/gpg.c:4122 -msgid "the given signature policy URL is invalid\n" -msgstr "a URL de poltica de assinatura dada invlida\n" - -#: g10/gpg.c:4155 -#, fuzzy -msgid "the given preferred keyserver URL is invalid\n" -msgstr "a URL de poltica de assinatura dada invlida\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 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 -#, fuzzy, c-format -msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n" -msgstr "Chave invlida %08lX tornada vlida por --allow-non-selfsigned-uid\n" - -#: g10/getkey.c:2380 g10/keyedit.c:3707 -#, fuzzy, c-format -msgid "no secret subkey for public subkey %s - ignoring\n" -msgstr "h uma chave secreta para a chave pblica \"%s\"!\n" - -#: g10/getkey.c:2611 -#, fuzzy, c-format -msgid "using subkey %s instead of primary key %s\n" -msgstr "usando chave secundria %08lX ao invs de chave primria %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 pblica - 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 informaes 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 [opes] [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 confiana, que no 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-Confiana ('Web-of-Trust'), o GnuPG precisa de\n" -"saber quais so as chaves em que deposita confiana absoluta - normalmente\n" -"estas so as chaves a que tem acesso chave privada. Responda \"sim\" " -"para\n" -"que esta chave seja de confiana 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, no de confiana, 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 destinatrio 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 no uma boa ideia utilizar a mesma chave para assinar e para\n" -"cifrar. Este algoritmo s deve ser utilizado em alguns domnios.\n" -"Por favor consulte primeiro o seu perito em segurana." - -#: 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 \"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 "" -"Digite o valor necessrio conforme pedido.\n" -" possvel digitar uma data ISO (AAAA-MM-DD) mas voc no ter uma boa\n" -"reaco 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 endereo de email (opcional mas recomendado)" - -#: g10/helptext.c:126 -msgid "Please enter an optional comment" -msgstr "Por favor digite um comentrio (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 comentrio.\n" -"E para mudar o endereo de email\n" -"O para continuar a gerao da chave.\n" -"S para interromper a gerao 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 identificao de um utilizador, deve primeiro\n" -"verificar que a chave pertence realmente pessoa em questo. til para\n" -"terceiros saberem com que cuidado que efectuou esta verificao.\n" -"\n" -"\"0\" significa que no deseja declarar a forma com verificou a chave\n" -"\n" -"\"1\" significa que acredita que a chave pertence pessoa em questo, mas\n" -" no conseguiu ou no tentou verificar. Este grau til para quando\n" -" assina a chave de uma utilizador pseudo-annimo.\n" -"\n" -"\"2\" significa que efectuou uma verificao normal da chave. Por exemplo,\n" -" isto pode significar que verificou a impresso digital da chave e\n" -" verificou o identificador de utilizador da chave contra uma " -"identificao\n" -" fotogrfica.\n" -"\n" -"\"3\" significa que efectuou uma verificao exaustiva da chave. Por " -"exemplo,\n" -" isto pode significar que efectuou a verificao pessoalmente, e que \n" -" utilizou um documento, com fotografia, difcil 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" -" (atravs de troca de e-mail) que o endereo de email da chave pertence\n" -" ao done da chave.\n" -"\n" -"Ateno: os exemplos dados para os nveis 2 e 3 so *apenas* exemplos.\n" -"Compete-lhe a si decidir o que considera, ao assinar chaves, uma " -"verificao\n" -"\"normal\" e uma verificao \"exaustiva\".\n" -"\n" -"Se no 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 tambm sero 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 vlida na chave; normalmente no desejvel\n" -"remover esta assinatura porque ela pode ser importante para estabelecer\n" -"uma conexo de confiana 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 no pode ser verificada porque voc no tem a chave\n" -"correspondente. Voc deve adiar sua remoo at saber que chave foi usada\n" -"porque a chave desta assinatura pode estabelecer uma conexo de confiana\n" -"atravs 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 no vlida. 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" -"no uma boa idia remover tal assinatura. possvel que o GnuPG\n" -"no consiga mais usar esta chave. Faa isto apenas se por alguma\n" -"razo esta auto-assinatura no for vlida e h uma segunda disponvel." - -#: 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 preferncias de todos os identificadores de utilizadores\n" -"(ou apenas dos seleccionados) para a lista actual de preferncias.\n" -"O 'timestamp' de todas as auto-assinaturas afectuadas ser avanado\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 omisso (que mostrado entre parnteses) 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 razo para a emisso do certificado. Dependendo no\n" -"contexto, pode escolher as seguintes opes desta lista:\n" -" \"A chave foi comprometida\"\n" -" Utilize esta opo se tem razes para acreditar que indivduos no\n" -" autorizados obtiveram acesso sua chave secreta.\n" -" \"A chave foi substituida\"\n" -" Utilize esta opo se substituiu esta chave com uma mais recente.\n" -" \"A chave j no utilizada\"\n" -" Utilize esta opo se j no utiliza a chave.\n" -" \"O identificador do utilizador j no vlido\"\n" -" Utilize esta opo para comunicar que o identificador do utilizador\n" -" no deve ser mais utilizado; normalmente utilizada para indicar\n" -" que um endereo de email invlido.\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 razo pela qual criou\n" -"este certificado de revogao. 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 disponvel" - -#: g10/helptext.c:295 -#, c-format -msgid "No help available for `%s'" -msgstr "Nenhuma ajuda disponvel 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 confiana" - -#: 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 no utilizvel" - -#: g10/import.c:108 -msgid "remove as much as possible from key after import" -msgstr "" - -#: g10/import.c:266 -#, c-format -msgid "skipping block of type %d\n" -msgstr "ignorando bloco do tipo %d\n" - -#: g10/import.c:275 -#, fuzzy, c-format -msgid "%lu keys processed so far\n" -msgstr "%lu chaves processadas at agora\n" - -#: g10/import.c:292 -#, c-format -msgid "Total number processed: %lu\n" -msgstr "Nmero total processado: %lu\n" - -#: g10/import.c:294 -#, c-format -msgid " skipped new keys: %lu\n" -msgstr " ignorei novas chaves: %lu\n" - -#: g10/import.c:297 -#, c-format -msgid " w/o user IDs: %lu\n" -msgstr " sem IDs de utilizadores: %lu\n" - -#: g10/import.c:299 -#, c-format -msgid " imported: %lu" -msgstr " importados: %lu" - -#: g10/import.c:305 -#, c-format -msgid " unchanged: %lu\n" -msgstr " no modificados: %lu\n" - -#: g10/import.c:307 -#, c-format -msgid " new user IDs: %lu\n" -msgstr " novos IDs de utilizadores: %lu\n" - -#: g10/import.c:309 -#, c-format -msgid " new subkeys: %lu\n" -msgstr " novas subchaves: %lu\n" - -#: g10/import.c:311 -#, c-format -msgid " new signatures: %lu\n" -msgstr " novas assinaturas: %lu\n" - -#: g10/import.c:313 -#, c-format -msgid " new key revocations: %lu\n" -msgstr " novas revogaes de chaves: %lu\n" - -#: g10/import.c:315 -#, c-format -msgid " secret keys read: %lu\n" -msgstr " chaves secretas lidas: %lu\n" - -#: g10/import.c:317 -#, c-format -msgid " secret keys imported: %lu\n" -msgstr " chaves secretas importadas: %lu\n" - -#: g10/import.c:319 -#, c-format -msgid " secret keys unchanged: %lu\n" -msgstr " chaves secretas no modificadas: %lu\n" - -#: g10/import.c:321 -#, c-format -msgid " not imported: %lu\n" -msgstr " no importadas: %lu\n" - -#: g10/import.c:323 -#, fuzzy, c-format -msgid " signatures cleaned: %lu\n" -msgstr " novas assinaturas: %lu\n" - -#: g10/import.c:325 -#, fuzzy, c-format -msgid " user IDs cleaned: %lu\n" -msgstr " chaves secretas lidas: %lu\n" - -#: g10/import.c:566 -#, 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:570 -#, fuzzy -msgid " algorithms on these user IDs:\n" -msgstr "Assinou estes identificadores de utilizadores:\n" - -#: g10/import.c:607 -#, c-format -msgid " \"%s\": preference for cipher algorithm %s\n" -msgstr "" - -#: g10/import.c:619 -#, fuzzy, c-format -msgid " \"%s\": preference for digest algorithm %s\n" -msgstr "assinatura %s de: \"%s\"\n" - -#: g10/import.c:631 -#, c-format -msgid " \"%s\": preference for compression algorithm %s\n" -msgstr "" - -#: g10/import.c:644 -msgid "it is strongly suggested that you update your preferences and\n" -msgstr "" - -#: g10/import.c:646 -msgid "re-distribute this key to avoid potential algorithm mismatch problems\n" -msgstr "" - -#: g10/import.c:670 -#, c-format -msgid "you can update your preferences with: gpg --edit-key %s updpref save\n" -msgstr "" - -#: g10/import.c:720 g10/import.c:1118 -#, fuzzy, c-format -msgid "key %s: no user ID\n" -msgstr "chave %08lX: sem ID de utilizador\n" - -#: g10/import.c:749 -#, fuzzy, c-format -msgid "key %s: PKS subkey corruption repaired\n" -msgstr "chave %08lX: subchave HKP corrompida foi reparada\n" - -#: g10/import.c:764 -#, 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:770 -#, fuzzy, c-format -msgid "key %s: no valid user IDs\n" -msgstr "chave %08lX: sem IDs de utilizadores vlidos\n" - -#: g10/import.c:772 -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:782 g10/import.c:1240 -#, fuzzy, c-format -msgid "key %s: public key not found: %s\n" -msgstr "chave %08lX: chave pblica no encontrada: %s\n" - -#: g10/import.c:788 -#, fuzzy, c-format -msgid "key %s: new key - skipped\n" -msgstr "chave %08lX: chave nova - ignorada\n" - -#: g10/import.c:797 -#, c-format -msgid "no writable keyring found: %s\n" -msgstr "no foi encontrada nenhum porta-chaves onde escrever: %s\n" - -#: g10/import.c:802 g10/openfile.c:267 g10/sign.c:831 g10/sign.c:1135 -#, c-format -msgid "writing to `%s'\n" -msgstr "a escrever para `%s'\n" - -#: g10/import.c:806 g10/import.c:901 g10/import.c:1158 g10/import.c:1301 -#: g10/import.c:2363 g10/import.c:2385 -#, c-format -msgid "error writing keyring `%s': %s\n" -msgstr "erro na escrita do porta-chaves `%s': %s\n" - -#: g10/import.c:825 -#, fuzzy, c-format -msgid "key %s: public key \"%s\" imported\n" -msgstr "chave %08lX: chave pblica \"%s\" importada\n" - -#: g10/import.c:849 -#, fuzzy, c-format -msgid "key %s: doesn't match our copy\n" -msgstr "chave %08lX: no corresponde nossa cpia\n" - -#: g10/import.c:866 g10/import.c:1258 -#, fuzzy, c-format -msgid "key %s: can't locate original keyblock: %s\n" -msgstr "chave %08lX: impossvel localizar bloco de chaves original: %s\n" - -#: g10/import.c:874 g10/import.c:1265 -#, fuzzy, c-format -msgid "key %s: can't read original keyblock: %s\n" -msgstr "chave %08lX: impossvel ler bloco de chaves original: %s\n" - -#: g10/import.c:911 -#, 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:914 -#, 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:917 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new signature\n" -msgstr "chave %08lX: \"%s\" 1 nova assinatura\n" - -#: g10/import.c:920 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new signatures\n" -msgstr "chave %08lX: \"%s\" %d novas assinaturas\n" - -#: g10/import.c:923 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new subkey\n" -msgstr "chave %08lX: \"%s\" 1 nova subchave\n" - -#: g10/import.c:926 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new subkeys\n" -msgstr "chave %08lX: \"%s\" %d novas subchaves\n" - -#: g10/import.c:929 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signature cleaned\n" -msgstr "chave %08lX: \"%s\" %d novas assinaturas\n" - -#: g10/import.c:932 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signatures cleaned\n" -msgstr "chave %08lX: \"%s\" %d novas assinaturas\n" - -#: g10/import.c:935 -#, 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:938 -#, 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:961 -#, fuzzy, c-format -msgid "key %s: \"%s\" not changed\n" -msgstr "chave %08lX: \"%s\" no modificada\n" - -#: g10/import.c:1124 -#, fuzzy, c-format -msgid "key %s: secret key with invalid cipher %d - skipped\n" -msgstr "chave %08lX: chave secreta com cifra invlida %d - ignorada\n" - -#: g10/import.c:1135 -#, fuzzy -msgid "importing secret keys not allowed\n" -msgstr "a escrever chave privada para `%s'\n" - -#: g10/import.c:1152 g10/import.c:2378 -#, c-format -msgid "no default secret keyring: %s\n" -msgstr "sem porta-chaves pblico por omisso: %s\n" - -#: g10/import.c:1163 -#, fuzzy, c-format -msgid "key %s: secret key imported\n" -msgstr "chave %08lX: chave secreta importada\n" - -#: g10/import.c:1193 -#, fuzzy, c-format -msgid "key %s: already in secret keyring\n" -msgstr "chave %08lX: j est no porta-chaves secreto\n" - -#: g10/import.c:1203 -#, fuzzy, c-format -msgid "key %s: secret key not found: %s\n" -msgstr "chave %08lX: chave secreta no encontrada: %s\n" - -#: g10/import.c:1233 -#, fuzzy, c-format -msgid "key %s: no public key - can't apply revocation certificate\n" -msgstr "" -"chave %08lX: sem chave pblica - impossvel aplicar certificado\n" -"de revogao\n" - -#: g10/import.c:1276 -#, fuzzy, c-format -msgid "key %s: invalid revocation certificate: %s - rejected\n" -msgstr "chave %08lX: certificado de revogao invlido: %s - rejeitado\n" - -#: g10/import.c:1308 -#, fuzzy, c-format -msgid "key %s: \"%s\" revocation certificate imported\n" -msgstr "chave %08lX: \"%s\" certificado de revogao importado\n" - -#: g10/import.c:1374 -#, 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:1389 -#, fuzzy, c-format -msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n" -msgstr "" -"chave %08lX: algoritmo de chave pblica no suportado no utilizador \"%s\"\n" - -#: g10/import.c:1391 -#, fuzzy, c-format -msgid "key %s: invalid self-signature on user ID \"%s\"\n" -msgstr "chave %08lX: auto-assinatura invlida do utilizador \"%s\"\n" - -#: g10/import.c:1409 -#, fuzzy, c-format -msgid "key %s: no subkey for key binding\n" -msgstr "chave %08lX: sem subchave para ligao de chaves\n" - -#: g10/import.c:1420 g10/import.c:1470 -#, fuzzy, c-format -msgid "key %s: unsupported public key algorithm\n" -msgstr "chave %08lX: algoritmo de chave pblica no suportado\n" - -#: g10/import.c:1422 -#, fuzzy, c-format -msgid "key %s: invalid subkey binding\n" -msgstr "chave %08lX: ligao de subchave invlida\n" - -#: g10/import.c:1437 -#, fuzzy, c-format -msgid "key %s: removed multiple subkey binding\n" -msgstr "chave %08lX: apagada ligao mltipla de subchave \n" - -#: g10/import.c:1459 -#, fuzzy, c-format -msgid "key %s: no subkey for key revocation\n" -msgstr "chave %08lX: sem subchave para revocao de chave\n" - -#: g10/import.c:1472 -#, fuzzy, c-format -msgid "key %s: invalid subkey revocation\n" -msgstr "chave %08lX: revocao de subchave invlida\n" - -#: g10/import.c:1487 -#, fuzzy, c-format -msgid "key %s: removed multiple subkey revocation\n" -msgstr "chave %08lX: removida revogao mltiplace de subchaves\n" - -#: g10/import.c:1529 -#, fuzzy, c-format -msgid "key %s: skipped user ID \"%s\"\n" -msgstr "chave %08lX: ignorado ID de utilizador '" - -#: g10/import.c:1550 -#, fuzzy, c-format -msgid "key %s: skipped subkey\n" -msgstr "chave %08lX: subchave ignorada\n" - -#: g10/import.c:1577 -#, fuzzy, c-format -msgid "key %s: non exportable signature (class 0x%02X) - skipped\n" -msgstr "chave %08lX: assinatura no exportvel (classe %02x) - ignorada\n" - -#: g10/import.c:1587 -#, fuzzy, c-format -msgid "key %s: revocation certificate at wrong place - skipped\n" -msgstr "chave %08lX: certificado de revogao no local errado - ignorado\n" - -#: g10/import.c:1604 -#, fuzzy, c-format -msgid "key %s: invalid revocation certificate: %s - skipped\n" -msgstr "chave %08lX: certificado de revogao invlido: %s - ignorado\n" - -#: g10/import.c:1618 -#, 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:1626 -#, 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:1726 -#, 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:1788 -#, 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 revocao %" -"08lX\n" - -#: g10/import.c:1802 -#, 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 revocao %08lX no " -"presente.\n" - -#: g10/import.c:1861 -#, fuzzy, c-format -msgid "key %s: \"%s\" revocation certificate added\n" -msgstr "chave %08lX: certificado de revogao \"%s\" adicionado\n" - -#: g10/import.c:1895 -#, fuzzy, c-format -msgid "key %s: direct key signature added\n" -msgstr "chave %08lX: assinatura directa de chave adicionada\n" - -#: g10/import.c:2284 -msgid "NOTE: a key's S/N does not match the card's one\n" -msgstr "" - -#: g10/import.c:2292 -#, fuzzy -msgid "NOTE: primary key is online and stored on card\n" -msgstr "ignorado: a chave secreta j est presente\n" - -#: g10/import.c:2294 -#, 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 "[revogao]" - -#: 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 no 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 no 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 no 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 no 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 vlida 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 vlidas 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 impresses 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 " No foi possvel 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\" no auto-assinado.\n" - -#: g10/keyedit.c:683 -#, fuzzy, c-format -msgid "User ID \"%s\" is signable. " -msgstr "AVISO: o ID do utilizador \"%s\" no 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 exportvel? (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 "" -"No 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 inutilizvel 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 no sabe o que responder, escolha \"0\".\n" - -#: g10/keyedit.c:921 -#, c-format -msgid " (0) I will not answer.%s\n" -msgstr " (0) No vou responder.%s\n" - -#: g10/keyedit.c:923 -#, c-format -msgid " (1) I have not checked at all.%s\n" -msgstr " (1) No 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 no ser marcada como no-exportvel.\n" - -#: g10/keyedit.c:978 -#, fuzzy -msgid "WARNING: the signature will not be marked as non-revocable.\n" -msgstr "" -"\n" -"AVISO: a assinatura no ser marcada como no-revocvel.\n" - -#: g10/keyedit.c:988 -#, fuzzy -msgid "The signature will be marked as non-exportable.\n" -msgstr "" -"\n" -"A assinatura ser marcada como no-exportvel.\n" - -#: g10/keyedit.c:995 -#, fuzzy -msgid "The signature will be marked as non-revocable.\n" -msgstr "" -"\n" -"A assinatura ser marcada como no-revocvel.\n" - -#: g10/keyedit.c:1002 -#, fuzzy -msgid "I have not checked this key at all.\n" -msgstr "" -"\n" -"No 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:4783 g10/keyedit.c:4874 g10/keyedit.c:4938 -#: g10/keyedit.c:4999 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 no 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 primria no disponveis.\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 primria no disponveis.\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 "Impossvel 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 no 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 no quer uma frase secreta - provavelmente isto uma *m* idia!\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 impresso 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 "Sugesto: 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 fotogrfico" - -#: 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 secundria" - -#: g10/keyedit.c:1408 -msgid "add a revocation key" -msgstr "adiciona uma chave de revocao" - -#: g10/keyedit.c:1410 -#, fuzzy -msgid "delete signatures from the selected user IDs" -msgstr "" -"Realmente actualizar as preferncias para os utilizadores seleccionados?" - -#: g10/keyedit.c:1412 -#, fuzzy -msgid "change the expiration date for the key or selected subkeys" -msgstr "Voc no 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 primrio" - -#: g10/keyedit.c:1416 -#, fuzzy -msgid "toggle between the secret and public key listings" -msgstr "alterna entre listagem de chave secreta e pblica" - -#: g10/keyedit.c:1419 -msgid "list preferences (expert)" -msgstr "lista preferncias (perito)" - -#: g10/keyedit.c:1421 -msgid "list preferences (verbose)" -msgstr "lista preferncias (detalhadamente)" - -#: g10/keyedit.c:1423 -#, fuzzy -msgid "set preference list for the selected user IDs" -msgstr "" -"Realmente actualizar as preferncias para os utilizadores seleccionados?" - -#: g10/keyedit.c:1428 -#, fuzzy -msgid "set the preferred keyserver URL for the selected user IDs" -msgstr "no 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 preferncias 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 confiana" - -#: 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 secundria" - -#: 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 fotogrfico" - -#: 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 disponvel.\n" - -#: g10/keyedit.c:1669 -msgid "Need the secret key to do this.\n" -msgstr "A chave secreta necessria 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 "Sugesto: 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 no 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 no 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 "impossvel 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 preferncias" - -#: g10/keyedit.c:2135 -#, fuzzy -msgid "Really update the preferences for the selected user IDs? (y/N) " -msgstr "" -"Realmente actualizar as preferncias para os utilizadores seleccionados?" - -#: g10/keyedit.c:2137 -#, fuzzy -msgid "Really update the preferences? (y/N) " -msgstr "Realmente actualizar as preferncias?" - -#: g10/keyedit.c:2205 -#, fuzzy -msgid "Save changes? (y/N) " -msgstr "Gravar alteraes? " - -#: 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 "actualizao falhou: %s\n" - -#: g10/keyedit.c:2225 -#, c-format -msgid "update secret failed: %s\n" -msgstr "actualizao da chave secreta falhou: %s\n" - -#: g10/keyedit.c:2232 -msgid "Key not changed so no update needed.\n" -msgstr "Chave no alterada, nenhuma actualizao necessria.\n" - -#: g10/keyedit.c:2333 -msgid "Digest: " -msgstr "'Digest': " - -#: g10/keyedit.c:2385 -msgid "Features: " -msgstr "Caractersticas: " - -#: 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 "Notao: " - -#: g10/keyedit.c:2630 -msgid "There are no preferences on a PGP 2.x-style user ID.\n" -msgstr "No h preferncias 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 " (sensvel)" - -#: 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 "impossvel 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 " confiana: %c/%c" - -#: g10/keyedit.c:2756 -#, fuzzy, c-format -msgid "trust: %s" -msgstr " confiana: %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 "" -"No se esquea que a validade de chave mostrada no necessriamente a\n" -"correcta a no 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 fotogrfico\n" -" algumas verso do PGP podem rejeit-la.\n" - -#: g10/keyedit.c:3016 g10/keyedit.c:3346 -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 "" -"No pode adicionar um identificador fotogrfico a uma chave tipo PGP2.\n" - -#: g10/keyedit.c:3162 -msgid "Delete this good signature? (y/N/q)" -msgstr "Apagar esta assinatura vlida? (s/N/q)" - -#: g10/keyedit.c:3172 -msgid "Delete this invalid signature? (y/N/q)" -msgstr "Apagar esta assinatura invlida? (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 invlida" - -#: g10/keyedit.c:3249 -#, fuzzy, c-format -msgid "User ID \"%s\": already clean\n" -msgstr "o utilizador com o id \"%s\" j est revocado\n" - -#: g10/keyedit.c:3341 -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 verso do PGP podem rejeit-la.\n" - -#: g10/keyedit.c:3352 -msgid "You may not add a designated revoker to a PGP 2.x-style key.\n" -msgstr "No pode adicionar um revogador designado a uma chave tipo PGP 2.x.\n" - -#: g10/keyedit.c:3372 -msgid "Enter the user ID of the designated revoker: " -msgstr "Insira o ID de utilizador do revogador escolhido: " - -#: g10/keyedit.c:3397 -msgid "cannot appoint a PGP 2.x style key as a designated revoker\n" -msgstr "no pode escolher uma chave do tipo PGP 2.x como revogadora\n" - -#: g10/keyedit.c:3412 -msgid "you cannot appoint a key as its own designated revoker\n" -msgstr "no pode escolher uma chave como revogadora de si mesmo\n" - -#: g10/keyedit.c:3434 -#, 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:3453 -#, fuzzy -msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n" -msgstr "no pode escolher uma chave como revogadora de si mesmo\n" - -#: g10/keyedit.c:3459 -#, fuzzy -msgid "" -"Are you sure you want to appoint this key as a designated revoker? (y/N) " -msgstr "no pode escolher uma chave como revogadora de si mesmo\n" - -#: g10/keyedit.c:3520 -msgid "Please remove selections from the secret keys.\n" -msgstr "Por favor remova as seleces das chaves secretas.\n" - -#: g10/keyedit.c:3526 -#, fuzzy -msgid "Please select at most one subkey.\n" -msgstr "Por favor seleccione no mximo uma chave secundria.\n" - -#: g10/keyedit.c:3530 -#, fuzzy -msgid "Changing expiration time for a subkey.\n" -msgstr "A modificar a data de validade para uma chave secundria.\n" - -#: g10/keyedit.c:3533 -msgid "Changing expiration time for the primary key.\n" -msgstr "Modificar a data de validade para uma chave primria.\n" - -#: g10/keyedit.c:3579 -msgid "You can't change the expiration date of a v3 key\n" -msgstr "Voc no pode modificar a data de validade de uma chave v3\n" - -#: g10/keyedit.c:3595 -msgid "No corresponding signature in secret ring\n" -msgstr "Nenhuma assinatura correspondente no porta-chaves secreto\n" - -#: g10/keyedit.c:3668 -#, fuzzy, c-format -msgid "signing subkey %s is already cross-certified\n" -msgstr "no pode escolher uma chave como revogadora de si mesmo\n" - -#: g10/keyedit.c:3674 -#, c-format -msgid "subkey %s does not sign and so does not need to be cross-certified\n" -msgstr "" - -#: g10/keyedit.c:3836 -msgid "Please select exactly one user ID.\n" -msgstr "Seleccione exactamente um identificador de utilizador.\n" - -#: g10/keyedit.c:3875 g10/keyedit.c:3985 g10/keyedit.c:4105 g10/keyedit.c:4246 -#, 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:4046 -msgid "Enter your preferred keyserver URL: " -msgstr "" - -#: g10/keyedit.c:4126 -#, 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:4127 -#, 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:4189 -#, fuzzy -msgid "Enter the notation: " -msgstr "Notao de assinatura: " - -#: g10/keyedit.c:4338 -#, fuzzy -msgid "Proceed? (y/N) " -msgstr "Escrever por cima (s/N)? " - -#: g10/keyedit.c:4402 -#, c-format -msgid "No user ID with index %d\n" -msgstr "Nenhum ID de utilizador com ndice %d\n" - -#: g10/keyedit.c:4460 -#, fuzzy, c-format -msgid "No user ID with hash %s\n" -msgstr "Nenhum ID de utilizador com ndice %d\n" - -#: g10/keyedit.c:4487 -#, fuzzy, c-format -msgid "No subkey with index %d\n" -msgstr "Nenhum ID de utilizador com ndice %d\n" - -#: g10/keyedit.c:4622 -#, fuzzy, c-format -msgid "user ID: \"%s\"\n" -msgstr "ID de utilizador: \"" - -#: g10/keyedit.c:4625 g10/keyedit.c:4689 g10/keyedit.c:4732 -#, 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:4627 g10/keyedit.c:4691 g10/keyedit.c:4734 -msgid " (non-exportable)" -msgstr " (no-exportvel)" - -#: g10/keyedit.c:4631 -#, c-format -msgid "This signature expired on %s.\n" -msgstr "Esta assinatura expirou em %s.\n" - -#: g10/keyedit.c:4635 -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:4639 -msgid "Create a revocation certificate for this signature? (y/N) " -msgstr "Gerar um certificado de revogao para esta assinatura? (s/N)" - -#: g10/keyedit.c:4666 -#, fuzzy, c-format -msgid "You have signed these user IDs on key %s:\n" -msgstr "Assinou estes identificadores de utilizadores:\n" - -#: g10/keyedit.c:4692 -#, fuzzy -msgid " (non-revocable)" -msgstr " (no-exportvel)" - -#: g10/keyedit.c:4699 -#, fuzzy, c-format -msgid "revoked by your key %s on %s\n" -msgstr " revogado por %08lX em %s\n" - -#: g10/keyedit.c:4721 -msgid "You are about to revoke these signatures:\n" -msgstr "Est prestes a revogar estas assinaturas:\n" - -#: g10/keyedit.c:4741 -msgid "Really create the revocation certificates? (y/N) " -msgstr "Realmente criar os certificados de revogao? (s/N) " - -#: g10/keyedit.c:4771 -msgid "no secret key\n" -msgstr "nenhuma chave secreta\n" - -#: g10/keyedit.c:4841 -#, c-format -msgid "user ID \"%s\" is already revoked\n" -msgstr "o utilizador com o id \"%s\" j est revocado\n" - -#: g10/keyedit.c:4858 -#, 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:4922 -#, fuzzy, c-format -msgid "Key %s is already revoked.\n" -msgstr "o utilizador com o id \"%s\" j est revocado\n" - -#: g10/keyedit.c:4984 -#, fuzzy, c-format -msgid "Subkey %s is already revoked.\n" -msgstr "o utilizador com o id \"%s\" j est revocado\n" - -#: g10/keyedit.c:5079 -#, 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 "preferncia %c%lu duplicada\n" - -#: g10/keygen.c:269 -#, fuzzy -msgid "too many cipher preferences\n" -msgstr "demasiadas preferncias `%c'\n" - -#: g10/keygen.c:271 -#, fuzzy -msgid "too many digest preferences\n" -msgstr "demasiadas preferncias `%c'\n" - -#: g10/keygen.c:273 -#, fuzzy -msgid "too many compression preferences\n" -msgstr "demasiadas preferncias `%c'\n" - -#: g10/keygen.c:398 -#, fuzzy, c-format -msgid "invalid item `%s' in preference string\n" -msgstr "caracter invlido na cadeia de caractres da preferncia\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 invlido; 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 omisso)\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 vlida.\n" -" 0 = chave no 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 vlida.\n" -" 0 = assinatura no 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 invlido\n" - -#: g10/keygen.c:1674 -#, fuzzy -msgid "Key does not expire at all\n" -msgstr "A %s no expira nunca\n" - -#: g10/keygen.c:1675 -#, fuzzy -msgid "Signature does not expire at all\n" -msgstr "A %s no 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 no consegue mostrar datas para alm de 2038.\n" -"No entanto, estas vo 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 constri o identificador a partir do Nome Completo, Comentrio e\n" -"Endereo Eletrnico 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 invlido no nome\n" - -#: g10/keygen.c:1738 -msgid "Name may not start with a digit\n" -msgstr "O nome no pode comear com um dgito\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 "Endereo de correio eletrnico: " - -#: g10/keygen.c:1754 -msgid "Not a valid email address\n" -msgstr "Endereo eletrnico invlido\n" - -#: g10/keygen.c:1762 -msgid "Comment: " -msgstr "Comentrio: " - -#: g10/keygen.c:1768 -msgid "Invalid character in comment\n" -msgstr "Caracter invlido no comentrio\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 no coloque o endereo de email no nome verdadeiro ou no " -"comentrio\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)omentrio, (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)omentrio, (E)ndereo 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 no quer uma frase secreta - provavelmente isto uma *m* idia!\n" -"Vou continuar assim mesmo. Voc pode mudar sua frase secreta a\n" -"qualquer hora, usando este programa com a opo \"--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 aleatrios. uma boa ideia realizar outra\n" -"actividade (escrever no teclado, mover o rato, usar os discos) durante a\n" -"gerao dos nmeros primos; isso d ao gerador de nmeros aleatrios\n" -"uma hiptese maior de ganhar entropia suficiente.\n" - -#: g10/keygen.c:2708 -msgid "Key generation canceled.\n" -msgstr "Gerao 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 pblica 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 pblico com permisses 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 permisses 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 pblico `%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 pblica 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 no pode ser usada para cifragem. Voc pode usar\n" -"o comando \"--edit-key\" para gerar uma chave secundria 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 gerao 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 relgio)\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 relgio)\n" - -#: g10/keygen.c:3181 g10/keygen.c:3311 -msgid "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n" -msgstr "NOTA: a criao de sub-chave para chaves v3 no 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 "remoo do bloco de chave falhou: %s\n" - -#: g10/keygen.c:3556 -#, fuzzy, c-format -msgid "can't create backup file `%s': %s\n" -msgstr "impossvel 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 crtica: " - -#: 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 "Notao de assinatura crtica: " - -#: g10/keylist.c:361 -msgid "Signature notation: " -msgstr "Notao de assinatura: " - -#: g10/keylist.c:471 -msgid "Keyring" -msgstr "Porta-chaves" - -#: g10/keylist.c:1505 -msgid "Primary key fingerprint:" -msgstr "Impresso da chave primria:" - -#: g10/keylist.c:1507 -msgid " Subkey fingerprint:" -msgstr " Impresso 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 "Impresso da chave primria:" - -#: g10/keylist.c:1516 -msgid " Subkey fingerprint:" -msgstr " Impresso da subchave:" - -#: g10/keylist.c:1520 g10/keylist.c:1524 -#, fuzzy -msgid " Key fingerprint =" -msgstr " Impresso 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 "criao de armadura falhou: %s\n" - -#: g10/keyring.c:1252 -msgid "WARNING: 2 files with confidential information exists.\n" -msgstr "AVISO: existem 2 ficheiros com informaes confidenciais.\n" - -#: g10/keyring.c:1254 -#, c-format -msgid "%s is the unchanged one\n" -msgstr "%s o no 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 possvel falha de segurana\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 poltica de assinatura dada invlida\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: opes em `%s' ainda no esto activas nesta execuo\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:1421 -#, fuzzy, c-format -msgid "invalid keyserver protocol (us %d!=handler %d)\n" -msgstr "opes de exportao invlidas\n" - -#: g10/keyserver.c:906 -#, fuzzy, c-format -msgid "key \"%s\" not found on keyserver\n" -msgstr "chave `%s' no encontrada: %s\n" - -#: g10/keyserver.c:908 -#, fuzzy -msgid "key not found on keyserver\n" -msgstr "chave `%s' no 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:1324 -#, 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:1328 -#, fuzzy, c-format -msgid "sending key %s to %s\n" -msgstr "" -"\"\n" -"assinado com a sua chave %08lX em %s\n" - -#: g10/keyserver.c:1371 -#, 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:1374 -#, fuzzy, c-format -msgid "searching for \"%s\" from %s\n" -msgstr "a procurar por \"%s\" no servidor HKP %s\n" - -#: g10/keyserver.c:1381 g10/keyserver.c:1477 -#, fuzzy -msgid "no keyserver action!\n" -msgstr "opes de exportao invlidas\n" - -#: g10/keyserver.c:1429 -#, c-format -msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n" -msgstr "" - -#: g10/keyserver.c:1438 -msgid "keyserver did not send VERSION\n" -msgstr "" - -#: g10/keyserver.c:1500 g10/keyserver.c:2028 -msgid "no keyserver known (use option --keyserver)\n" -msgstr "" - -#: g10/keyserver.c:1506 -msgid "external keyserver calls are not supported in this build\n" -msgstr "" - -#: g10/keyserver.c:1518 -#, c-format -msgid "no handler for keyserver scheme `%s'\n" -msgstr "" - -#: g10/keyserver.c:1523 -#, c-format -msgid "action `%s' not supported with keyserver scheme `%s'\n" -msgstr "" - -#: g10/keyserver.c:1531 -#, c-format -msgid "%s does not support handler version %d\n" -msgstr "" - -#: g10/keyserver.c:1538 -#, fuzzy -msgid "keyserver timed out\n" -msgstr "erro do servidor de chaves" - -#: g10/keyserver.c:1543 -#, fuzzy -msgid "keyserver internal error\n" -msgstr "erro do servidor de chaves" - -#: g10/keyserver.c:1552 -#, fuzzy, c-format -msgid "keyserver communications error: %s\n" -msgstr "A gerao de chaves falhou: %s\n" - -#: g10/keyserver.c:1577 g10/keyserver.c:1611 -#, c-format -msgid "\"%s\" not a key ID: skipping\n" -msgstr "" - -#: g10/keyserver.c:1870 -#, 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:1892 -#, fuzzy, c-format -msgid "refreshing 1 key from %s\n" -msgstr "a pedir a chave %08lX de %s\n" - -#: g10/keyserver.c:1894 -#, fuzzy, c-format -msgid "refreshing %d keys from %s\n" -msgstr "a pedir a chave %08lX de %s\n" - -#: g10/keyserver.c:1950 -#, fuzzy, c-format -msgid "WARNING: unable to fetch URI %s: %s\n" -msgstr "AVISO: dono pouco seguro em %s \"%s\"\n" - -#: g10/keyserver.c:1956 -#, 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 sesso cifrada (%d)\n" - -#: g10/mainproc.c:291 -#, fuzzy, c-format -msgid "%s encrypted session key\n" -msgstr "tamanho estranho para uma chave de sesso 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 pblica %08lX\n" - -#: g10/mainproc.c:439 -msgid "public key encrypted data: good DEK\n" -msgstr "dados cifrados com chave pblica: DEK vlido\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 pblica 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 no disponvel, a tentar utilizar %s em substituio\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 no 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 "revocao solitria - 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 "verificao de assinatura suprimida\n" - -#: g10/mainproc.c:1508 -#, fuzzy -msgid "can't handle this ambiguous signature data\n" -msgstr "no consigo tratar estas assinaturas mltiplas\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 disponvel" - -#: 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 "verso desconhecida" - -#: g10/mainproc.c:1893 -#, c-format -msgid "Can't check signature: %s\n" -msgstr "Impossvel verificar assinatura: %s\n" - -#: g10/mainproc.c:1962 g10/mainproc.c:1978 g10/mainproc.c:2064 -msgid "not a detached signature\n" -msgstr "no uma assinatura separada\n" - -#: g10/mainproc.c:2005 -msgid "" -"WARNING: multiple signatures detected. Only the first will be checked.\n" -msgstr "" -"AVISO: vrias 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 invlido detectado em proc_tree()\n" - -#: g10/misc.c:122 -#, c-format -msgid "can't disable core dumps: %s\n" -msgstr "impossvel 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 "impossvel abrir %s: %s\n" - -#: g10/misc.c:207 -#, fuzzy, c-format -msgid "fstat(%d) failed in %s: %s\n" -msgstr "base de dados de confiana: leitura falhou (n=%d): %s\n" - -#: g10/misc.c:316 -#, fuzzy, c-format -msgid "WARNING: using experimental public key algorithm %s\n" -msgstr "impossvel manipular algoritmo de chave pblica %d\n" - -#: g10/misc.c:331 -#, fuzzy, c-format -msgid "WARNING: using experimental cipher algorithm %s\n" -msgstr "algoritmo de criptografia no 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 "" -"forar o algoritmo de 'digest' %s (%d) viola as preferncias do " -"destinatrio\n" - -#: g10/misc.c:447 -msgid "the IDEA cipher plugin is not present\n" -msgstr "o 'plugin' com a cifra 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 = mostrar mais informaes\n" - -#: g10/misc.c:681 -#, c-format -msgid "%s:%d: deprecated option \"%s\"\n" -msgstr "%s:%d: opo depreciada \"%s\"\n" - -#: g10/misc.c:685 -#, c-format -msgid "WARNING: \"%s\" is a deprecated option\n" -msgstr "AVISO: \"%s\" uma opo 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 opo depreciada\n" - -#: g10/misc.c:707 -#, fuzzy -msgid "Uncompressed" -msgstr "no processado" - -#: g10/misc.c:732 -#, fuzzy -msgid "uncompressed|none" -msgstr "no processado" - -#: g10/misc.c:842 -#, c-format -msgid "this message may not be usable by %s\n" -msgstr "esta mensagem poder no ser utilizvel pelo %s\n" - -#: g10/misc.c:1017 -#, fuzzy, c-format -msgid "ambiguous option `%s'\n" -msgstr "a ler opes de `%s'\n" - -#: g10/misc.c:1042 -#, fuzzy, c-format -msgid "unknown option `%s'\n" -msgstr "destinatrio por omisso 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:305 -#, c-format -msgid "assuming signed data in `%s'\n" -msgstr "a assumir dados assinados em `%s'\n" - -#: g10/openfile.c:384 -#, c-format -msgid "new configuration file `%s' created\n" -msgstr "criado um novo ficheiro de configurao `%s'\n" - -#: g10/openfile.c:386 -#, c-format -msgid "WARNING: options in `%s' are not yet active during this run\n" -msgstr "AVISO: opes em `%s' ainda no esto activas nesta execuo\n" - -#: g10/openfile.c:418 -#, 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 "impossvel manipular algoritmo de chave pblica %d\n" - -#: g10/parse-packet.c:708 -msgid "WARNING: potentially insecure symmetrically encrypted session key\n" -msgstr "" - -#: g10/parse-packet.c:1157 -#, c-format -msgid "subpacket of type %d has critical bit set\n" -msgstr "subpacote do tipo %d tem bit crtico ligado\n" - -#: g10/passphrase.c:310 -msgid "gpg-agent is not available in this session\n" -msgstr "o gpg-agent no est disponvel nesta sesso\n" - -#: g10/passphrase.c:326 -msgid "malformed GPG_AGENT_INFO environment variable\n" -msgstr "varivel de ambiente GPG_AGENT_INFO invlida\n" - -#: g10/passphrase.c:345 -#, c-format -msgid "gpg-agent protocol version %d is not supported\n" -msgstr "a verso %d do protocolo gpg-agent no suportada\n" - -#: g10/passphrase.c:362 -#, c-format -msgid "can't connect to `%s': %s\n" -msgstr "impossvel 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 utilizao 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:968 -#, fuzzy -msgid "can't query passphrase in batch mode\n" -msgstr "impossvel pedir senha em modo no-interactivo\n" - -#: g10/passphrase.c:812 g10/passphrase.c:973 -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:977 -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 "impossvel 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: no um base de dados de confiana\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 "no foi possvel 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 substituda" - -#: 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 no utilizada" - -#: g10/pkclist.c:70 g10/revoke.c:627 -msgid "User ID is no longer valid" -msgstr "O identificador do utilizador j no vlido" - -#: g10/pkclist.c:74 -msgid "reason for revocation: " -msgstr "motivo da revocao: " - -#: g10/pkclist.c:91 -msgid "revocation comment: " -msgstr "comentrio da revocao: " - -#: g10/pkclist.c:206 -msgid "iImMqQsS" -msgstr "iImMqQsS" - -#: g10/pkclist.c:214 -#, fuzzy -msgid "No trust value assigned to:\n" -msgstr "" -"Nenhum valor de confiana 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 = No sei\n" - -#: g10/pkclist.c:273 -#, fuzzy, c-format -msgid " %d = I do NOT trust\n" -msgstr " %d = Eu NO 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 "Deciso? " - -#: 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: No h indicao 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: No h indicao 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 "" -"NO 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 prxima 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 no de confiana!\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 revocao %08lX no " -"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 no est certificada com uma assinatura confivel!\n" - -#: g10/pkclist.c:604 -msgid "" -" There is no indication that the signature belongs to the owner.\n" -msgstr " No h indicao de que a assinatura pertence ao dono.\n" - -#: g10/pkclist.c:612 -msgid "WARNING: We do NOT trust this key!\n" -msgstr "AVISO: Ns NO confiamos nesta chave!\n" - -#: g10/pkclist.c:613 -msgid " The signature is probably a FORGERY.\n" -msgstr " A assinatura provavelmente uma FALSIFICAO.\n" - -#: g10/pkclist.c:621 -msgid "" -"WARNING: This key is not certified with sufficiently trusted signatures!\n" -msgstr "" -"AVISO: Esta chave no est certificada com assinaturas suficientemente\n" -" confiveis!\n" - -#: g10/pkclist.c:623 -msgid " It is not certain that the signature belongs to the owner.\n" -msgstr " No 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 pblica j est presente\n" - -#: g10/pkclist.c:885 -msgid "You did not specify a user ID. (you may use \"-r\")\n" -msgstr "No 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 pblica j colocada como destinatrio por omisso\n" - -#: g10/pkclist.c:990 -msgid "Public key is disabled.\n" -msgstr "A chave pblica est desativada.\n" - -#: g10/pkclist.c:999 -msgid "skipped: public key already set\n" -msgstr "ignorado: a chave pblica j est presente\n" - -#: g10/pkclist.c:1034 -#, fuzzy, c-format -msgid "unknown default recipient \"%s\"\n" -msgstr "destinatrio por omisso desconhecido `%s'\n" - -#: g10/pkclist.c:1092 -#, c-format -msgid "%s: skipped: public key is disabled\n" -msgstr "%s: ignorado: a chave pblica est desactivada\n" - -#: g10/pkclist.c:1154 -msgid "no valid addressees\n" -msgstr "nenhum endereo vlido\n" - -#: g10/plaintext.c:91 -msgid "data not saved; use option \"--output\" to save it\n" -msgstr "dados no gravados; use a opo \"--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 "no h dados assinados\n" - -#: g10/plaintext.c:538 -#, c-format -msgid "can't open signed data `%s'\n" -msgstr "impossvel abrir dados assinados `%s'\n" - -#: g10/pubkey-enc.c:104 -#, fuzzy, c-format -msgid "anonymous recipient; trying secret key %s ...\n" -msgstr "destinatrio annimo; a tentar chave secreta %08lX ...\n" - -#: g10/pubkey-enc.c:135 -msgid "okay, we are the anonymous recipient.\n" -msgstr "certo, ns somos o destinatrio annimo.\n" - -#: g10/pubkey-enc.c:223 -msgid "old encoding of the DEK is not supported\n" -msgstr "codificao antiga do DEK no 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 no encontrado nas preferncias\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 "actualizao 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 revogao 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 "actualizao da chave secreta falhou: %s\n" - -#: g10/revoke.c:407 -#, fuzzy -msgid "Revocation certificate created.\n" -msgstr "chave %08lX: certificado de revogao \"%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' no encontrada: %s\n" - -#: g10/revoke.c:500 -#, fuzzy, c-format -msgid "no corresponding public key: %s\n" -msgstr "a escrever chave pblica 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 revogao para esta assinatura? (s/N)" - -#: g10/revoke.c:535 -#, fuzzy -msgid "unknown protection algorithm\n" -msgstr "algoritmo de compresso desconhecido" - -#: g10/revoke.c:543 -#, fuzzy -msgid "NOTE: This key is not protected!\n" -msgstr "Esta chave no 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 revocao: " - -#: 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 revocao: " - -#: 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 no disponveis\n" - -#: g10/seckey-cert.c:61 -#, c-format -msgid "protection algorithm %d%s is not supported\n" -msgstr "algoritmo de proteco %d%s no suportado\n" - -#: g10/seckey-cert.c:72 -#, fuzzy, c-format -msgid "protection digest %d is not supported\n" -msgstr "algoritmo de proteco %d%s no suportado\n" - -#: g10/seckey-cert.c:266 -msgid "Invalid passphrase; please try again" -msgstr "Frase secreta invlida; 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 proteco 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 "" -"impossvel evitar chave fraca para criptografia simtrica;\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 "no 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 pblica %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 pblica %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 relgio)\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 relgio)\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 crtico " -"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 revocao 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 ligao de chaves\n" - -#: g10/sign.c:85 -#, fuzzy -msgid "can't put notation data into v3 (PGP 2.x style) signatures\n" -msgstr "no 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 "no 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: impossvel expandir-%% a url de poltica (demasiado grande). A " -"utilizar no expandida.\n" - -#: g10/sign.c:124 -#, fuzzy -msgid "can't put a policy URL into v3 (PGP 2.x style) signatures\n" -msgstr "no 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: impossvel expandir-%% a url de poltica (demasiado grande).\n" -"A utilizar no expandida.\n" - -#: g10/sign.c:173 -#, fuzzy, c-format -msgid "" -"WARNING: unable to %%-expand preferred keyserver URL (too large). Using " -"unexpanded.\n" -msgstr "" -"AVISO: impossvel expandir-%% a url de poltica (demasiado grande).\n" -"A utilizar no expandida.\n" - -#: g10/sign.c:347 -#, c-format -msgid "checking created signature failed: %s\n" -msgstr "verificao 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 "" -"forar o algoritmo de 'digest' %s (%d) viola as preferncias do " -"destinatrio\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:127 g10/skclist.c:191 -msgid "key is not flagged as insecure - can't use it with the faked RNG!\n" -msgstr "" -"a chave no est marcada insegura - impossvel us-la com o RNG falso!\n" - -#: g10/skclist.c:158 -#, fuzzy, c-format -msgid "skipped \"%s\": duplicated\n" -msgstr "ignorado `%s': duplicada\n" - -#: g10/skclist.c:166 g10/skclist.c:176 g10/skclist.c:185 -#, fuzzy, c-format -msgid "skipped \"%s\": %s\n" -msgstr "ignorado `%s': %s\n" - -#: g10/skclist.c:171 -msgid "skipped: secret key already present\n" -msgstr "ignorado: a chave secreta j est presente\n" - -#: g10/skclist.c:186 -#, 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 no 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 confiana %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: verso de ficheiro invlida %d\n" - -#: g10/tdbdump.c:179 -#, fuzzy -msgid "ownertrust value missing" -msgstr "importar os valores de confiana" - -#: g10/tdbdump.c:215 -#, fuzzy, c-format -msgid "error finding trust record in `%s': %s\n" -msgstr "%s: erro ao escrever registo de diretrio: %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 confiana: sincronizao 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 confiana 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 confiana rec %lu: escrita falhou (n=%d): %s\n" - -#: g10/tdbio.c:245 -msgid "trustdb transaction too large\n" -msgstr "transao de base de dados de confiana muito grande\n" - -#: g10/tdbio.c:498 -#, fuzzy, c-format -msgid "can't access `%s': %s\n" -msgstr "impossvel 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 "impossvel criar `%s': %s\n" - -#: g10/tdbio.c:525 g10/tdbio.c:592 -#, fuzzy, c-format -msgid "can't lock `%s'\n" -msgstr "impossvel abrir `%s'\n" - -#: g10/tdbio.c:551 -#, c-format -msgid "%s: failed to create version record: %s" -msgstr "%s: falha ao criar registo de verso: %s" - -#: g10/tdbio.c:555 -#, c-format -msgid "%s: invalid trustdb created\n" -msgstr "%s: base de dados de confiana invlida criada\n" - -#: g10/tdbio.c:558 -#, c-format -msgid "%s: trustdb created\n" -msgstr "%s: base de dados de confiana criada\n" - -#: g10/tdbio.c:602 -msgid "NOTE: trustdb not writable\n" -msgstr "NOTA: no possvel escrever na trustdb\n" - -#: g10/tdbio.c:619 -#, c-format -msgid "%s: invalid trustdb\n" -msgstr "%s: base de dados de confiana invlida\n" - -#: g10/tdbio.c:651 -#, c-format -msgid "%s: failed to create hashtable: %s\n" -msgstr "%s: falha ao criar tabela de disperso: %s\n" - -#: g10/tdbio.c:659 -#, c-format -msgid "%s: error updating version record: %s\n" -msgstr "%s: erro a actualizar registo de verso: %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 verso: %s\n" - -#: g10/tdbio.c:735 -#, c-format -msgid "%s: error writing version record: %s\n" -msgstr "%s: erro ao escrever registo de verso: %s\n" - -#: g10/tdbio.c:1174 -#, c-format -msgid "trustdb: lseek failed: %s\n" -msgstr "base de dados de confiana: lseek falhou: %s\n" - -#: g10/tdbio.c:1182 -#, c-format -msgid "trustdb: read failed (n=%d): %s\n" -msgstr "base de dados de confiana: leitura falhou (n=%d): %s\n" - -#: g10/tdbio.c:1203 -#, c-format -msgid "%s: not a trustdb file\n" -msgstr "%s: no um base de dados de confiana\n" - -#: g10/tdbio.c:1221 -#, c-format -msgid "%s: version record with recnum %lu\n" -msgstr "%s: registo de verso com recnum %lu\n" - -#: g10/tdbio.c:1226 -#, c-format -msgid "%s: invalid file version %d\n" -msgstr "%s: verso de ficheiro invlida %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 diretrio: %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 confiana 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 "impossvel 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' no um identificador longo de chave vlido\n" - -#: g10/trustdb.c:258 -#, fuzzy, c-format -msgid "key %s: accepted as trusted key\n" -msgstr "chave %08lX: aceite como chave de confiana\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 confiana\n" - -#: g10/trustdb.c:311 -#, fuzzy, c-format -msgid "key %s: no public key for trusted key - skipped\n" -msgstr "" -"chave %08lX: nenhuma chave pblica para chave de confiana - ignorada\n" -"\n" - -#: g10/trustdb.c:321 -#, fuzzy, c-format -msgid "key %s marked as ultimately trusted\n" -msgstr "chave marcada como de confiana absoluta\n" - -#: g10/trustdb.c:345 -#, c-format -msgid "trust record %lu, req type %d: read failed: %s\n" -msgstr "registo de confiana %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 confiana %lu no 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 "verso 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 "no necessria uma verificao da base de dados de confiana\n" - -#: g10/trustdb.c:583 g10/trustdb.c:2352 -#, c-format -msgid "next trustdb check due at %s\n" -msgstr "proxima verificao da base de dados de confiana a %s\n" - -#: g10/trustdb.c:592 -#, fuzzy, c-format -msgid "no need for a trustdb check with `%s' trust model\n" -msgstr "no necessria uma verificao da base de dados de confiana\n" - -#: g10/trustdb.c:607 -#, fuzzy, c-format -msgid "no need for a trustdb update with `%s' trust model\n" -msgstr "no necessria uma verificao da base de dados de confiana\n" - -#: g10/trustdb.c:839 g10/trustdb.c:1277 -#, fuzzy, c-format -msgid "public key %s not found: %s\n" -msgstr "chave pblica %08lX no 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 confiana\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 pblica da chave absolutamente de confiana %08lX no encontrada\n" - -#: g10/trustdb.c:2174 -#, fuzzy, c-format -msgid "public key of ultimately trusted key %s not found\n" -msgstr "" -"chave pblica da chave absolutamente de confiana %08lX no 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 confiana %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 no pode ser verificada.\n" -"No se esquea 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 "verso desconhecida" - -#: util/errors.c:58 -msgid "unknown pubkey algorithm" -msgstr "algoritmo de chave pblica desconhecido" - -#: util/errors.c:59 -msgid "unknown digest algorithm" -msgstr "algoritmo de \"digest\" desconhecido" - -#: util/errors.c:60 -msgid "bad public key" -msgstr "chave pblica 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 pblica no 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 "no possvel abrir o porta-chaves" - -#: util/errors.c:68 -msgid "invalid packet" -msgstr "pacote invlido" - -#: util/errors.c:69 -msgid "invalid armor" -msgstr "armadura invlida" - -#: 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 no disponvel" - -#: util/errors.c:72 -msgid "wrong secret key used" -msgstr "chave secreta incorrecta" - -#: util/errors.c:73 -msgid "not supported" -msgstr "no 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 compresso 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 criao do ficheiro" - -#: util/errors.c:80 -msgid "invalid passphrase" -msgstr "frase-secreta invlida" - -#: util/errors.c:81 -msgid "unimplemented pubkey algorithm" -msgstr "algoritmo de chave pblica no implementado" - -#: util/errors.c:82 -msgid "unimplemented cipher algorithm" -msgstr "algoritmo de criptografia no 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 confiana" - -#: 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 invlido" - -#: 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 renomeao do ficheiro" - -#: util/errors.c:92 -msgid "file delete error" -msgstr "erro na remoo 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 pblica inutilizvel" - -#: 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 invlido" - -#: util/errors.c:99 -msgid "bad URI" -msgstr "URI incorrecto" - -#: util/errors.c:100 -msgid "unsupported URI" -msgstr "URI no suportado" - -#: util/errors.c:101 -msgid "network error" -msgstr "erro na rede" - -#: util/errors.c:103 -msgid "not encrypted" -msgstr "no cifrado" - -#: util/errors.c:104 -msgid "not processed" -msgstr "no processado" - -#: util/errors.c:106 -msgid "unusable public key" -msgstr "chave pblica no utilizvel" - -#: util/errors.c:107 -msgid "unusable secret key" -msgstr "chave secreta no utilizvel" - -#: 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 "no cifrado" - -#: util/errors.c:111 -#, fuzzy -msgid "no data" -msgstr "no 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 "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 "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 memria 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 informaes\n" - -#: util/secmem.c:350 -msgid "operation is not possible without initialized secure memory\n" -msgstr "a operao no possvel sem memria segura inicializada\n" - -#: util/secmem.c:351 -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 utilizao de uma algoritmo de disperso 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 informaes\n" - -#~ msgid "" -#~ "a notation name must have only printable characters or spaces, and end " -#~ "with an '='\n" -#~ msgstr "" -#~ "um nome de notao deve ter apenas caracteres imprimveis ou espaos, e " -#~ "terminar com um '='\n" - -#~ msgid "a user notation name must contain the '@' character\n" -#~ msgstr "um valor de notao de utilizador no deve conter o caracter '@'\n" - -#, fuzzy -#~ msgid "a notation name must not contain more than one '@' character\n" -#~ msgstr "um valor de notao de utilizador no deve conter o caracter '@'\n" - -#~ msgid "a notation value must not use any control characters\n" -#~ msgstr "um valor de notao no deve usar caracteres de controle\n" - -#~ msgid "WARNING: invalid notation data found\n" -#~ msgstr "AVISO: dados de notao invlidos encontrados\n" - -#~ msgid "not human readable" -#~ msgstr "no legvel por humanos" - -#, fuzzy -#~ msgid "all export-clean-* options from above" -#~ msgstr "ler opes do ficheiro" - -#, fuzzy -#~ msgid "all import-clean-* options from above" -#~ msgstr "ler opes 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 "no foi possvel alterar o exec-path para %s\n" - -#, fuzzy -#~ msgid "User ID \"%s\": %d signature removed.\n" -#~ msgstr "Utilizador \"%s\" est revocado." - -#, fuzzy -#~ msgid "User ID \"%s\": %d signatures removed.\n" -#~ msgstr "Utilizador \"%s\" est revocado." - -#, fuzzy -#~ msgid "User ID \"%s\" removed: %s\n" -#~ msgstr "Utilizador \"%s\" est revocado." - -#, 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 criao 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 "no consegui colocar o pid do cliente no agente\n" - -#~ msgid "can't get server read FD for the agent\n" -#~ msgstr "no consigo obter FD de leitura no servidor para o agente\n" - -#~ msgid "can't get server write FD for the agent\n" -#~ msgstr "no consigo obter FD de escrita no servidor para o agente\n" - -#~ msgid "communication problem with gpg-agent\n" -#~ msgstr "problemas na comunicao 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 invlida\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 secundria N" - -#~ msgid "list signatures" -#~ msgstr "lista assinaturas" - -#~ msgid "sign the key" -#~ msgstr "assina a chave" - -#~ msgid "add a secondary key" -#~ msgstr "adiciona nova chave secundria" - -#~ 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 preferncias" - -#~ msgid "updated preferences" -#~ msgstr "preferncias actualizadas" - -#~ msgid "No secondary key with index %d\n" -#~ msgstr "Nenhuma chave secundria 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 no-revogvel" - -#~ msgid "sign the key locally and non-revocably" -#~ msgstr "assinar a chave localmente e de forma no revogvel" - -#~ 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 mnimo 768 bits\n" -#~ " tamanho por omisso 1024 bits\n" -#~ " tamanho mximo 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 mnimo permitido para RSA.\n" - -#~ msgid "keysize too small; 768 is smallest value allowed.\n" -#~ msgstr "tamanho muito pequeno; 768 o valor mnimo permitido.\n" - -#~ msgid "keysize too large; %d is largest value allowed.\n" -#~ msgstr "tamanho muito grande; %d o valor mximo permitido.\n" - -#~ msgid "" -#~ "Keysizes larger than 2048 are not suggested because\n" -#~ "computations take REALLY long!\n" -#~ msgstr "" -#~ "Tamanhos de chave maiores que 2048 no so recomendados\n" -#~ "porque o tempo de computao 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 no se esquea que a radiao do seu monitor e teclado " -#~ "tambm extremamente vulnervel a ataques!\n" - -#~ msgid "Experimental algorithms should not be used!\n" -#~ msgstr "Algoritmos experimentais no 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 "impossvel fazer isso em modo no-interativo\n" - -#~ msgid "key `%s' not found: %s\n" -#~ msgstr "chave `%s' no encontrada: %s\n" - -#, fuzzy -#~ msgid "can't create file `%s': %s\n" -#~ msgstr "impossvel criar `%s': %s\n" - -#, fuzzy -#~ msgid "can't open file `%s': %s\n" -#~ msgstr "impossvel 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: Ns NO 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: impossvel abrir: %s\n" - -#~ msgid "%s: WARNING: empty file\n" -#~ msgstr "%s: AVISO: ficheiro vazio\n" - -#~ msgid "can't open %s: %s\n" -#~ msgstr "impossvel 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: impossvel aceder: %s\n" - -#~ msgid "%s: can't create lock\n" -#~ msgstr "%s: impossvel criar tranca\n" - -#~ msgid "%s: can't make lock\n" -#~ msgstr "%s: impossvel criar tranca\n" - -#~ msgid "%s: can't create: %s\n" -#~ msgstr "%s: impossvel criar: %s\n" - -#~ msgid "%s: can't create directory: %s\n" -#~ msgstr "%s: impossvel 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 "no foi possvel alterar o exec-path para %s\n" - -#, fuzzy -#~ msgid "can't open file: %s\n" -#~ msgstr "impossvel abrir %s: %s\n" - -#, fuzzy -#~ msgid "error: no ownertrust value\n" -#~ msgstr "exportar os valores de confiana" - -#~ 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- revogao falsa encontrada\n" - -#~ msgid "rev? problem checking revocation: %s\n" -#~ msgstr "rev? problema ao verificar revogao: %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 "impossvel 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 no revocvel" - -#~ msgid "sign a key locally and non-revocably" -#~ msgstr "assinar uma chave localmente e de forma no revocvel" - -#~ msgid "list only the sequence of packets" -#~ msgstr "listar apenas as sequncias de pacotes" - -#~ msgid "export the ownertrust values" -#~ msgstr "exportar os valores de confiana" - -#~ msgid "unattended trust database update" -#~ msgstr "actualizar automaticamente a base de dados de confiana" - -#~ msgid "fix a corrupted trust database" -#~ msgstr "consertar uma base de dados de confiana" - -#~ 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 destinatrio por omisso" - -#~ msgid "use the default key as default recipient" -#~ msgstr "usar a chave por omisso como destinatrio por omisso" - -#~ msgid "don't use the terminal at all" -#~ msgstr "nunca usar o terminal" - -#~ msgid "force v3 signatures" -#~ msgstr "forar assinaturas v3" - -#~ msgid "do not force v3 signatures" -#~ msgstr "no forar assinaturas v3" - -#~ msgid "force v4 key signatures" -#~ msgstr "forar assinaturas v4" - -#~ msgid "do not force v4 key signatures" -#~ msgstr "no forar 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 no-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 no 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 omisso" - -#~ msgid "|HOST|use this keyserver to lookup keys" -#~ msgstr "|ENDEREO|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 ifnroames 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 mdulo de extenso 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 opes 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 opes 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 compresso N" - -#~ msgid "throw keyid field of encrypted packets" -#~ msgstr "eliminar campo keyid dos pacotes cifrados" - -#~ msgid "Show Photo IDs" -#~ msgstr "Mostrar IDs Fotogrficos" - -#~ msgid "Don't show Photo IDs" -#~ msgstr "No mostrar IDs Fotogrficos" - -#~ 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 compresso deve estar na faixa %d..%d\n" - -#~ msgid "compress algorithm must be in range %d..%d\n" -#~ msgstr "o algoritmo de compresso 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: No 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 "preferncia %c%lu no vlida\n" - -#~ msgid "key %08lX: not a rfc2440 key - skipped\n" -#~ msgstr "chave %08lX: no uma chave rfc2440 - ignorada\n" - -#~ msgid "" -#~ "NOTE: Elgamal primary key detected - this may take some time to import\n" -#~ msgstr "" -#~ "NOTA: Chave primria Elgamal detectada - pode demorar algum tempo a " -#~ "importar\n" - -#~ msgid " (default)" -#~ msgstr " (por omisso)" - -#~ msgid "%s%c %4u%c/%08lX created: %s expires: %s" -#~ msgstr "%s%c %4u%c/%08lX criada: %s expira: %s" - -#~ msgid "Policy: " -#~ msgstr "Poltica: " - -#~ msgid "can't get key from keyserver: %s\n" -#~ msgstr "no 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 "no 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 NO 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 relgio)\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 relgio)\n" - -#~ msgid "key %08lX marked as ultimately trusted\n" -#~ msgstr "chave %08lX marcada como de confiana 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 verificao de\n" -#~ "assinaturas DSA muito mais rpida que a verificao 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 so iguais, mas alguns\n" -#~ "parmetros precisam ser escolhidos de modo especial para criar uma chave\n" -#~ "segura para assinatura: este programa faz isso, mas algumas outras\n" -#~ "implementaes do OpenPGP no vo necessariamente entender o tipo\n" -#~ "assinatura+cifragem.\n" -#~ "\n" -#~ "A chave primria precisa sempre ser uma chave capaz de fazer " -#~ "assinaturas;\n" -#~ "este o motivo pelo qual a chave ElGamal apenas para cifragem no est\n" -#~ "disponvel 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 no so " -#~ "recomendadas\n" -#~ "porque no so suportadas por todos os programas e assinaturas criadas " -#~ "com\n" -#~ "elas so grandes e sua verificao 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 utilizao deste algoritmo s suportada pelo GnuPG. No poder " -#~ "utilizar\n" -#~ "esta chave para comunicar com utilizadores do PGP. Este algoritmo " -#~ "para\n" -#~ "alm disto muito lento, e pode no ser to seguro como as outras opes.\n" - -#~ msgid "Create anyway? " -#~ msgstr "Criar mesmo assim?" - -#~ msgid "invalid symkey algorithm detected (%d)\n" -#~ msgstr "algoritmo de 'symkey' invlido detectado (%d)\n" - -#~ msgid "this keyserver is not fully HKP compatible\n" -#~ msgstr "o servidor de chaves no totalmente compatvel com HKP\n" diff --git a/po/pt_BR.po b/po/pt_BR.po deleted file mode 100644 index 47ce0fb78..000000000 --- a/po/pt_BR.po +++ /dev/null @@ -1,7567 +0,0 @@ -# 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-07-28 11:12+0200\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 "impossvel 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:1003 g10/gpg.c:3461 g10/import.c:195 g10/keygen.c:2385 -#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:342 -#: 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 "impossvel abrir `%s': %s\n" - -#: cipher/random.c:458 -#, fuzzy, c-format -msgid "can't stat `%s': %s\n" -msgstr "impossvel 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 notao invlidos encontrados\n" - -#: cipher/random.c:482 -#, fuzzy, c-format -msgid "can't read `%s': %s\n" -msgstr "impossvel 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:1002 g10/keygen.c:2864 -#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:263 -#: g10/openfile.c:357 g10/sign.c:826 g10/sign.c:1130 g10/tdbio.c:536 -#, fuzzy, c-format -msgid "can't create `%s': %s\n" -msgstr "impossvel criar %s: %s\n" - -#: cipher/random.c:556 cipher/random.c:566 -#, fuzzy, c-format -msgid "can't write `%s': %s\n" -msgstr "impossvel abrir `%s': %s\n" - -#: cipher/random.c:569 -#, fuzzy, c-format -msgid "can't close `%s': %s\n" -msgstr "impossvel abrir `%s': %s\n" - -#: cipher/random.c:814 -msgid "WARNING: using insecure random number generator!!\n" -msgstr "AVISO: usando gerador de nmeros aleatrios 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 nmeros aleatrios apenas um \"remendo\"\n" -"para poder funcionar - no de modo algum um bom gerador!\n" -"\n" -"NO 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" -"No h bytes aleatrios suficientes. Por favor, faa algum outro trabalho\n" -"para que o sistema possa coletar mais entropia!\n" -"(So necessrios 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 "enumerao 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 gerao 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 criao 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 "enumerao de blocos de chaves falhou: %s\n" - -#: g10/app-openpgp.c:1904 -#, fuzzy, c-format -msgid "key generation completed (%d seconds)\n" -msgstr "A gerao 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 vlido encontrado.\n" - -#: g10/armor.c:320 -#, c-format -msgid "armor: %s\n" -msgstr "armadura: %s\n" - -#: g10/armor.c:359 -msgid "invalid armor header: " -msgstr "cabealho de armadura invlido: " - -#: g10/armor.c:370 -msgid "armor header: " -msgstr "cabealho de armadura: " - -#: g10/armor.c:381 -msgid "invalid clearsig header\n" -msgstr "cabealho de assinatura em texto puro invlido\n" - -#: g10/armor.c:433 -msgid "nested clear text signatures\n" -msgstr "assinaturas em texto puro aninhadas\n" - -#: g10/armor.c:568 -#, fuzzy -msgid "unexpected armor: " -msgstr "armadura inesperada:" - -#: g10/armor.c:580 -msgid "invalid dash escaped line: " -msgstr "linha com hfen invlida: " - -#: g10/armor.c:734 g10/armor.c:1343 -#, fuzzy, c-format -msgid "invalid radix64 character %02X skipped\n" -msgstr "caractere radix64 invlido %02x ignorado\n" - -#: g10/armor.c:777 -msgid "premature eof (no CRC)\n" -msgstr "fim de arquivo prematuro (sem CRC)\n" - -#: g10/armor.c:811 -msgid "premature eof (in CRC)\n" -msgstr "fim de arquivo prematuro (no CRC)\n" - -#: g10/armor.c:819 -msgid "malformed CRC\n" -msgstr "CRC malformado\n" - -#: g10/armor.c:823 g10/armor.c:1380 -#, fuzzy, c-format -msgid "CRC error; %06lX - %06lX\n" -msgstr "erro de CRC; %06lx - %06lx\n" - -#: g10/armor.c:843 -#, fuzzy -msgid "premature eof (in trailer)\n" -msgstr "fim de arquivo prematuro (no \"Trailer\")\n" - -#: g10/armor.c:847 -msgid "error in trailer line\n" -msgstr "erro na linha \"trailer\"\n" - -#: g10/armor.c:1158 -msgid "no valid OpenPGP data found.\n" -msgstr "nenhum dado OpenPGP vlido encontrado.\n" - -#: g10/armor.c:1163 -#, c-format -msgid "invalid armor: line longer than %d characters\n" -msgstr "armadura invlida: linha maior que %d caracteres\n" - -#: g10/armor.c:1167 -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 no disponvel" - -#: 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 "impossvel fazer isso em modo no-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 opo? " - -#: 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 "no 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 pblico 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:280 -#, 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 preferncias" - -#: g10/card-util.c:802 -#, fuzzy -msgid "Error: invalid length of preference string.\n" -msgstr "Caractere invlido no nome\n" - -#: g10/card-util.c:811 -#, fuzzy -msgid "Error: invalid characters in preference string.\n" -msgstr "Caractere invlido 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: impresso digital invlida\n" - -#: g10/card-util.c:867 -#, fuzzy -msgid "CA fingerprint: " -msgstr "Impresso digital:" - -#: g10/card-util.c:890 -#, fuzzy -msgid "Error: invalid formatted fingerprint.\n" -msgstr "erro: impresso digital invlida\n" - -#: g10/card-util.c:938 -#, fuzzy, c-format -msgid "key operation not possible: %s\n" -msgstr "A gerao de chaves falhou: %s\n" - -#: g10/card-util.c:939 -#, fuzzy -msgid "not an OpenPGP card" -msgstr "nenhum dado OpenPGP vlido 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 no 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 "Opo invlida.\n" - -#: g10/card-util.c:1203 -#, fuzzy -msgid "Please select where to store the key:\n" -msgstr "rev- revogaes de chaves incorreta\n" - -#: g10/card-util.c:1238 -#, fuzzy -msgid "unknown key protection algorithm\n" -msgstr "algoritmo de compresso desconhecido" - -#: g10/card-util.c:1243 -#, fuzzy -msgid "secret parts of key are not available\n" -msgstr "chave secreta no disponvel" - -#: 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 disponvel" - -#: 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 confiana" - -#: 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 impresso 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 invlido (tente \"help\")\n" - -#: g10/cardglue.c:416 -#, fuzzy -msgid "card reader not available\n" -msgstr "chave secreta no disponvel" - -#: 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 "enumerao 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 usurio: " - -#: g10/cardglue.c:918 -#, fuzzy -msgid "Enter New PIN: " -msgstr "Digite o identificador de usurio: " - -#: g10/cardglue.c:919 -msgid "Enter Admin PIN: " -msgstr "" - -#: g10/cardglue.c:920 -#, fuzzy -msgid "Enter PIN: " -msgstr "Digite o identificador de usurio: " - -#: 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 no foi repetida corretamente; tente outra vez.\n" - -#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3826 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 "impossvel 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:3387 g10/keyserver.c:1700 -#: g10/revoke.c:228 -#, fuzzy, c-format -msgid "key \"%s\" not found: %s\n" -msgstr "usurio `%s' no encontrado: %s\n" - -#: g10/delkey.c:83 g10/export.c:341 g10/import.c:2349 g10/keyserver.c:1714 -#: 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 "impossvel fazer isso em modo no-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 "enumerao 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 pblica!\n" - -#: g10/delkey.c:208 -#, fuzzy -msgid "use option \"--delete-secret-keys\" to delete it first.\n" -msgstr "use a opo \"--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 criao 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 no encontrado nas preferncias\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 no encontrado nas preferncias\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:67 g10/mainproc.c:293 -#, c-format -msgid "%s encrypted data\n" -msgstr "dados criptografados com %s\n" - -#: g10/encr-data.c:69 g10/mainproc.c:297 -#, c-format -msgid "encrypted with unknown algorithm %d\n" -msgstr "criptografado com algoritmo desconhecido %d\n" - -#: g10/encr-data.c:93 -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" -"simtrica.\n" - -#: g10/encr-data.c:104 -#, 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:415 -#, fuzzy, c-format -msgid "can't create directory `%s': %s\n" -msgstr "%s: impossvel criar diretrio: %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 verso: %s\n" - -#: g10/exec.c:425 -#, fuzzy, c-format -msgid "unable to execute program `%s': %s\n" -msgstr "impossvel abrir %s: %s\n" - -#: g10/exec.c:428 -#, fuzzy, c-format -msgid "unable to execute shell `%s': %s\n" -msgstr "impossvel 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 verso: %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 no-exportvel.\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 secundria" - -#: 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: no 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: no 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 revogao 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:375 -msgid "" -"@Commands:\n" -" " -msgstr "" -"@Comandos:\n" -" " - -#: g10/gpg.c:377 -msgid "|[file]|make a signature" -msgstr "|[arquivo]|fazer uma assinatura" - -#: g10/gpg.c:378 -msgid "|[file]|make a clear text signature" -msgstr "|[arquivo]|fazer uma assinatura em texto puro" - -#: g10/gpg.c:379 -msgid "make a detached signature" -msgstr "fazer uma assinatura separada" - -#: g10/gpg.c:380 -msgid "encrypt data" -msgstr "criptografar dados" - -#: g10/gpg.c:382 -msgid "encryption only with symmetric cipher" -msgstr "" -"criptografar apenas com criptografia\n" -"simtrica" - -#: g10/gpg.c:384 -msgid "decrypt data (default)" -msgstr "descriptografar dados (padro)" - -#: g10/gpg.c:386 -msgid "verify a signature" -msgstr "verificar uma assinatura" - -#: g10/gpg.c:388 -msgid "list keys" -msgstr "listar as chaves" - -#: g10/gpg.c:390 -msgid "list keys and signatures" -msgstr "listar as chaves e as assinaturas" - -#: g10/gpg.c:391 -#, fuzzy -msgid "list and check key signatures" -msgstr "verificar as assinaturas das chaves" - -#: g10/gpg.c:392 -msgid "list keys and fingerprints" -msgstr "listar as chaves e as impresses digitais" - -#: g10/gpg.c:393 -msgid "list secret keys" -msgstr "listar as chaves secretas" - -#: g10/gpg.c:394 -msgid "generate a new key pair" -msgstr "gerar um novo par de chaves" - -#: g10/gpg.c:395 -#, fuzzy -msgid "remove keys from the public keyring" -msgstr "remover a chave do chaveiro pblico" - -#: g10/gpg.c:397 -#, fuzzy -msgid "remove keys from the secret keyring" -msgstr "remover a chave do chaveiro secreto" - -#: g10/gpg.c:398 -msgid "sign a key" -msgstr "assinar uma chave" - -#: g10/gpg.c:399 -msgid "sign a key locally" -msgstr "assinar uma chave localmente" - -#: g10/gpg.c:400 -msgid "sign or edit a key" -msgstr "assinar ou editar uma chave" - -#: g10/gpg.c:401 -msgid "generate a revocation certificate" -msgstr "gerar um certificado de revogao" - -#: g10/gpg.c:403 -msgid "export keys" -msgstr "exportar chaves" - -#: g10/gpg.c:404 -msgid "export keys to a key server" -msgstr "exportar chaves para um servidor" - -#: g10/gpg.c:405 -msgid "import keys from a key server" -msgstr "importar chaves de um servidor" - -#: g10/gpg.c:407 -#, fuzzy -msgid "search for keys on a key server" -msgstr "exportar chaves para um servidor" - -#: g10/gpg.c:409 -#, fuzzy -msgid "update all keys from a keyserver" -msgstr "importar chaves de um servidor" - -#: g10/gpg.c:413 -msgid "import/merge keys" -msgstr "importar/fundir chaves" - -#: g10/gpg.c:416 -msgid "print the card status" -msgstr "" - -#: g10/gpg.c:417 -msgid "change data on a card" -msgstr "" - -#: g10/gpg.c:418 -msgid "change a card's PIN" -msgstr "" - -#: g10/gpg.c:426 -msgid "update the trust database" -msgstr "atualizar o banco de dados de confiabilidade" - -#: g10/gpg.c:433 -msgid "|algo [files]|print message digests" -msgstr "|algo [arquivos]|imprimir \"digests\" de mensagens" - -#: g10/gpg.c:437 g10/gpgv.c:71 -msgid "" -"@\n" -"Options:\n" -" " -msgstr "" -"@\n" -"Opes:\n" -" " - -#: g10/gpg.c:439 -msgid "create ascii armored output" -msgstr "criar sada com armadura ascii" - -#: g10/gpg.c:441 -msgid "|NAME|encrypt for NAME" -msgstr "|NOME|criptografar para NOME" - -#: g10/gpg.c:452 -msgid "use this user-id to sign or decrypt" -msgstr "" -"usar este identificador de usurio para\n" -"assinar ou descriptografar" - -#: g10/gpg.c:453 -msgid "|N|set compress level N (0 disables)" -msgstr "" -"|N|estabelecer nvel de compresso N\n" -"(0 desabilita)" - -#: g10/gpg.c:458 -msgid "use canonical text mode" -msgstr "usar modo de texto cannico" - -#: g10/gpg.c:472 -msgid "use as output file" -msgstr "usar como arquivo de sada" - -#: g10/gpg.c:474 g10/gpgv.c:73 -msgid "verbose" -msgstr "detalhado" - -#: g10/gpg.c:485 -msgid "do not make any changes" -msgstr "no fazer alteraes" - -#: g10/gpg.c:486 -msgid "prompt before overwriting" -msgstr "" - -#: g10/gpg.c:527 -msgid "use strict OpenPGP behavior" -msgstr "" - -#: g10/gpg.c:528 -msgid "generate PGP 2.x compatible messages" -msgstr "" - -#: g10/gpg.c:556 -msgid "" -"@\n" -"(See the man page for a complete listing of all commands and options)\n" -msgstr "" - -#: g10/gpg.c:559 -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 usurio 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 impresses digitais\n" - -#: g10/gpg.c:757 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:774 -msgid "Usage: gpg [options] [files] (-h for help)" -msgstr "Uso: gpg [opes] [arquivos] (-h para ajuda)" - -#: g10/gpg.c:777 -msgid "" -"Syntax: gpg [options] [files]\n" -"sign, check, encrypt or decrypt\n" -"default operation depends on the input data\n" -msgstr "" -"Sintaxe: gpg [opes] [arquivos]\n" -"assina, verifica, criptografa ou descriptografa\n" -"a operao padro depende dos dados de entrada\n" - -#: g10/gpg.c:788 -msgid "" -"\n" -"Supported algorithms:\n" -msgstr "" -"\n" -"Algoritmos suportados:\n" - -#: g10/gpg.c:791 -msgid "Pubkey: " -msgstr "" - -#: g10/gpg.c:797 g10/keyedit.c:2310 -msgid "Cipher: " -msgstr "" - -#: g10/gpg.c:803 -msgid "Hash: " -msgstr "" - -#: g10/gpg.c:809 g10/keyedit.c:2356 -#, fuzzy -msgid "Compression: " -msgstr "Comentrio: " - -#: g10/gpg.c:892 -msgid "usage: gpg [options] " -msgstr "uso: gpg [opes] " - -#: g10/gpg.c:1040 -msgid "conflicting commands\n" -msgstr "comandos conflitantes\n" - -#: g10/gpg.c:1058 -#, c-format -msgid "no = sign found in group definition `%s'\n" -msgstr "" - -#: g10/gpg.c:1255 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on homedir `%s'\n" -msgstr "%s: novo arquivo de opes criado\n" - -#: g10/gpg.c:1258 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on configuration file `%s'\n" -msgstr "%s: novo arquivo de opes criado\n" - -#: g10/gpg.c:1261 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on extension `%s'\n" -msgstr "%s: novo arquivo de opes criado\n" - -#: g10/gpg.c:1267 -#, fuzzy, c-format -msgid "WARNING: unsafe permissions on homedir `%s'\n" -msgstr "%s: novo arquivo de opes criado\n" - -#: g10/gpg.c:1270 -#, fuzzy, c-format -msgid "WARNING: unsafe permissions on configuration file `%s'\n" -msgstr "%s: novo arquivo de opes criado\n" - -#: g10/gpg.c:1273 -#, fuzzy, c-format -msgid "WARNING: unsafe permissions on extension `%s'\n" -msgstr "%s: novo arquivo de opes criado\n" - -#: g10/gpg.c:1279 -#, fuzzy, c-format -msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n" -msgstr "%s: novo arquivo de opes criado\n" - -#: g10/gpg.c:1282 -#, fuzzy, c-format -msgid "" -"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n" -msgstr "%s: novo arquivo de opes criado\n" - -#: g10/gpg.c:1285 -#, fuzzy, c-format -msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n" -msgstr "%s: novo arquivo de opes criado\n" - -#: g10/gpg.c:1291 -#, fuzzy, c-format -msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n" -msgstr "%s: novo arquivo de opes criado\n" - -#: g10/gpg.c:1294 -#, fuzzy, c-format -msgid "" -"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n" -msgstr "%s: novo arquivo de opes criado\n" - -#: g10/gpg.c:1297 -#, fuzzy, c-format -msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n" -msgstr "%s: novo arquivo de opes criado\n" - -#: g10/gpg.c:1438 -#, fuzzy, c-format -msgid "unknown configuration item `%s'\n" -msgstr "%s: novo arquivo de opes criado\n" - -#: g10/gpg.c:1531 -msgid "display photo IDs during key listings" -msgstr "" - -#: g10/gpg.c:1533 -msgid "show policy URLs during signature listings" -msgstr "" - -#: g10/gpg.c:1535 -#, fuzzy -msgid "show all notations during signature listings" -msgstr "Nenhuma assinatura correspondente no chaveiro secreto\n" - -#: g10/gpg.c:1537 -msgid "show IETF standard notations during signature listings" -msgstr "" - -#: g10/gpg.c:1541 -msgid "show user-supplied notations during signature listings" -msgstr "" - -#: g10/gpg.c:1543 -#, fuzzy -msgid "show preferred keyserver URLs during signature listings" -msgstr "a URL de poltica dada invlida\n" - -#: g10/gpg.c:1545 -msgid "show user ID validity during key listings" -msgstr "" - -#: g10/gpg.c:1547 -msgid "show revoked and expired user IDs in key listings" -msgstr "" - -#: g10/gpg.c:1549 -msgid "show revoked and expired subkeys in key listings" -msgstr "" - -#: g10/gpg.c:1551 -#, fuzzy -msgid "show the keyring name in key listings" -msgstr "alterna entre listagem de chave secreta e pblica" - -#: g10/gpg.c:1553 -#, fuzzy -msgid "show expiration dates during signature listings" -msgstr "Nenhuma assinatura correspondente no chaveiro secreto\n" - -#: g10/gpg.c:1920 -#, fuzzy, c-format -msgid "NOTE: old default options file `%s' ignored\n" -msgstr "NOTA: arquivo de opes padro `%s' inexistente\n" - -#: g10/gpg.c:1962 -#, c-format -msgid "NOTE: no default option file `%s'\n" -msgstr "NOTA: arquivo de opes padro `%s' inexistente\n" - -#: g10/gpg.c:1966 -#, c-format -msgid "option file `%s': %s\n" -msgstr "arquivo de opes `%s': %s\n" - -#: g10/gpg.c:1973 -#, c-format -msgid "reading options from `%s'\n" -msgstr "lendo opes de `%s'\n" - -#: g10/gpg.c:2188 g10/gpg.c:2814 g10/gpg.c:2833 -#, c-format -msgid "NOTE: %s is not for normal use!\n" -msgstr "NOTA: %s no para uso normal!\n" - -#: g10/gpg.c:2201 -#, c-format -msgid "cipher extension `%s' not loaded due to unsafe permissions\n" -msgstr "" - -#: g10/gpg.c:2364 g10/gpg.c:2376 -#, fuzzy, c-format -msgid "`%s' is not a valid signature expiration\n" -msgstr "%s no um conjunto de caracteres vlido\n" - -#: g10/gpg.c:2452 -#, fuzzy, c-format -msgid "`%s' is not a valid character set\n" -msgstr "%s no um conjunto de caracteres vlido\n" - -#: g10/gpg.c:2476 g10/gpg.c:2663 g10/keyedit.c:4064 -#, fuzzy -msgid "could not parse keyserver URL\n" -msgstr "impossvel escrever para o chaveiro: %s\n" - -#: g10/gpg.c:2488 -#, fuzzy, c-format -msgid "%s:%d: invalid keyserver options\n" -msgstr "AVISO: `%s' um arquivo vazio\n" - -#: g10/gpg.c:2491 -#, fuzzy -msgid "invalid keyserver options\n" -msgstr "chaveiro invlido" - -#: g10/gpg.c:2498 -#, fuzzy, c-format -msgid "%s:%d: invalid import options\n" -msgstr "AVISO: `%s' um arquivo vazio\n" - -#: g10/gpg.c:2501 -#, fuzzy -msgid "invalid import options\n" -msgstr "armadura invlida" - -#: g10/gpg.c:2508 -#, fuzzy, c-format -msgid "%s:%d: invalid export options\n" -msgstr "AVISO: `%s' um arquivo vazio\n" - -#: g10/gpg.c:2511 -#, fuzzy -msgid "invalid export options\n" -msgstr "chaveiro invlido" - -#: g10/gpg.c:2518 -#, fuzzy, c-format -msgid "%s:%d: invalid list options\n" -msgstr "AVISO: `%s' um arquivo vazio\n" - -#: g10/gpg.c:2521 -#, fuzzy -msgid "invalid list options\n" -msgstr "armadura invlida" - -#: g10/gpg.c:2529 -msgid "display photo IDs during signature verification" -msgstr "" - -#: g10/gpg.c:2531 -msgid "show policy URLs during signature verification" -msgstr "" - -#: g10/gpg.c:2533 -#, fuzzy -msgid "show all notations during signature verification" -msgstr "%s no um conjunto de caracteres vlido\n" - -#: g10/gpg.c:2535 -msgid "show IETF standard notations during signature verification" -msgstr "" - -#: g10/gpg.c:2539 -msgid "show user-supplied notations during signature verification" -msgstr "" - -#: g10/gpg.c:2541 -#, fuzzy -msgid "show preferred keyserver URLs during signature verification" -msgstr "a URL de poltica dada invlida\n" - -#: g10/gpg.c:2543 -#, fuzzy -msgid "show user ID validity during signature verification" -msgstr "%s no um conjunto de caracteres vlido\n" - -#: g10/gpg.c:2545 -msgid "show revoked and expired user IDs in signature verification" -msgstr "" - -#: g10/gpg.c:2547 -msgid "validate signatures with PKA data" -msgstr "" - -#: g10/gpg.c:2549 -msgid "elevate the trust of signatures with valid PKA data" -msgstr "" - -#: g10/gpg.c:2556 -#, fuzzy, c-format -msgid "%s:%d: invalid verify options\n" -msgstr "AVISO: `%s' um arquivo vazio\n" - -#: g10/gpg.c:2559 -#, fuzzy -msgid "invalid verify options\n" -msgstr "chaveiro invlido" - -#: g10/gpg.c:2566 -#, c-format -msgid "unable to set exec-path to %s\n" -msgstr "" - -#: g10/gpg.c:2729 -#, fuzzy, c-format -msgid "%s:%d: invalid auto-key-locate list\n" -msgstr "AVISO: `%s' um arquivo vazio\n" - -#: g10/gpg.c:2732 -msgid "invalid auto-key-locate list\n" -msgstr "" - -#: g10/gpg.c:2803 -msgid "WARNING: program may create a core file!\n" -msgstr "AVISO: O programa pode criar um arquivo core!\n" - -#: g10/gpg.c:2807 -#, c-format -msgid "WARNING: %s overrides %s\n" -msgstr "" - -#: g10/gpg.c:2816 -#, c-format -msgid "%s not allowed with %s!\n" -msgstr "%s no permitido com %s!\n" - -#: g10/gpg.c:2819 -#, c-format -msgid "%s makes no sense with %s!\n" -msgstr "%s no faz sentido com %s!\n" - -#: g10/gpg.c:2826 -#, fuzzy, c-format -msgid "NOTE: %s is not available in this version\n" -msgstr "chave RSA no pode ser usada nesta verso\n" - -#: g10/gpg.c:2841 -#, fuzzy, c-format -msgid "will not run with insecure memory due to %s\n" -msgstr "escrevendo certificado privado para `%s'\n" - -#: g10/gpg.c:2855 -msgid "you can only make detached or clear signatures while in --pgp2 mode\n" -msgstr "" - -#: g10/gpg.c:2861 -msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n" -msgstr "" - -#: g10/gpg.c:2867 -msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n" -msgstr "" - -#: g10/gpg.c:2880 -msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n" -msgstr "" - -#: g10/gpg.c:2947 g10/gpg.c:2971 -msgid "selected cipher algorithm is invalid\n" -msgstr "o algoritmo de criptografia selecionado no vlido\n" - -#: g10/gpg.c:2953 g10/gpg.c:2977 -msgid "selected digest algorithm is invalid\n" -msgstr "o algoritmo de \"digest\" selecionado no vlido\n" - -#: g10/gpg.c:2959 -#, fuzzy -msgid "selected compression algorithm is invalid\n" -msgstr "o algoritmo de criptografia selecionado no vlido\n" - -#: g10/gpg.c:2965 -#, fuzzy -msgid "selected certification digest algorithm is invalid\n" -msgstr "o algoritmo de \"digest\" selecionado no vlido\n" - -#: g10/gpg.c:2980 -msgid "completes-needed must be greater than 0\n" -msgstr "completes-needed deve ser maior que 0\n" - -#: g10/gpg.c:2982 -msgid "marginals-needed must be greater than 1\n" -msgstr "marginals-needed deve ser maior que 1\n" - -#: g10/gpg.c:2984 -#, 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:2986 -#, fuzzy -msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n" -msgstr "modo S2K invlido: deve ser 0, 1 ou 3\n" - -#: g10/gpg.c:2988 -#, fuzzy -msgid "invalid min-cert-level; must be 1, 2, or 3\n" -msgstr "modo S2K invlido: deve ser 0, 1 ou 3\n" - -#: g10/gpg.c:2991 -msgid "NOTE: simple S2K mode (0) is strongly discouraged\n" -msgstr "NOTA: o modo S2K simples (0) no recomendvel\n" - -#: g10/gpg.c:2995 -msgid "invalid S2K mode; must be 0, 1 or 3\n" -msgstr "modo S2K invlido: deve ser 0, 1 ou 3\n" - -#: g10/gpg.c:3002 -#, fuzzy -msgid "invalid default preferences\n" -msgstr "lista preferncias" - -#: g10/gpg.c:3011 -#, fuzzy -msgid "invalid personal cipher preferences\n" -msgstr "lista preferncias" - -#: g10/gpg.c:3015 -#, fuzzy -msgid "invalid personal digest preferences\n" -msgstr "lista preferncias" - -#: g10/gpg.c:3019 -#, fuzzy -msgid "invalid personal compress preferences\n" -msgstr "lista preferncias" - -#: g10/gpg.c:3052 -#, fuzzy, c-format -msgid "%s does not yet work with %s\n" -msgstr "%s no faz sentido com %s!\n" - -#: g10/gpg.c:3099 -#, c-format -msgid "you may not use cipher algorithm `%s' while in %s mode\n" -msgstr "" - -#: g10/gpg.c:3104 -#, c-format -msgid "you may not use digest algorithm `%s' while in %s mode\n" -msgstr "" - -#: g10/gpg.c:3109 -#, fuzzy, c-format -msgid "you may not use compression algorithm `%s' while in %s mode\n" -msgstr "o algoritmo de criptografia selecionado no vlido\n" - -#: g10/gpg.c:3208 -#, 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:3219 -msgid "WARNING: recipients (-r) given without using public key encryption\n" -msgstr "" - -#: g10/gpg.c:3230 -msgid "--store [filename]" -msgstr "--store [nome_do_arquivo]" - -#: g10/gpg.c:3237 -msgid "--symmetric [filename]" -msgstr "--symmetric [nome_do_arquivo]" - -#: g10/gpg.c:3239 -#, fuzzy, c-format -msgid "symmetric encryption of `%s' failed: %s\n" -msgstr "descriptografia falhou: %s\n" - -#: g10/gpg.c:3249 -msgid "--encrypt [filename]" -msgstr "--encrypt [nome_do_arquivo]" - -#: g10/gpg.c:3262 -#, fuzzy -msgid "--symmetric --encrypt [filename]" -msgstr "--sign --encrypt [nome_do_arquivo]" - -#: g10/gpg.c:3264 -msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n" -msgstr "" - -#: g10/gpg.c:3267 -#, c-format -msgid "you cannot use --symmetric --encrypt while in %s mode\n" -msgstr "" - -#: g10/gpg.c:3285 -msgid "--sign [filename]" -msgstr "--sign [nome_do_arquivo]" - -#: g10/gpg.c:3298 -msgid "--sign --encrypt [filename]" -msgstr "--sign --encrypt [nome_do_arquivo]" - -#: g10/gpg.c:3313 -#, fuzzy -msgid "--symmetric --sign --encrypt [filename]" -msgstr "--sign --encrypt [nome_do_arquivo]" - -#: g10/gpg.c:3315 -msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n" -msgstr "" - -#: g10/gpg.c:3318 -#, c-format -msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n" -msgstr "" - -#: g10/gpg.c:3338 -#, fuzzy -msgid "--sign --symmetric [filename]" -msgstr "--symmetric [nome_do_arquivo]" - -#: g10/gpg.c:3347 -msgid "--clearsign [filename]" -msgstr "--clearsign [nome_do_arquivo]" - -#: g10/gpg.c:3372 -msgid "--decrypt [filename]" -msgstr "--decrypt [nome_do_arquivo]" - -#: g10/gpg.c:3380 -msgid "--sign-key user-id" -msgstr "--sign-key id-usurio" - -#: g10/gpg.c:3384 -msgid "--lsign-key user-id" -msgstr "--lsign-key id-usurio" - -#: g10/gpg.c:3405 -msgid "--edit-key user-id [commands]" -msgstr "--edit-key id-usurio [comandos]" - -#: g10/gpg.c:3476 -msgid "-k[v][v][v][c] [user-id] [keyring]" -msgstr "-k[v][v][v][c] [id-usurio] [chaveiro]" - -#: g10/gpg.c:3518 -#, fuzzy, c-format -msgid "keyserver send failed: %s\n" -msgstr "A gerao de chaves falhou: %s\n" - -#: g10/gpg.c:3520 -#, fuzzy, c-format -msgid "keyserver receive failed: %s\n" -msgstr "enumerao de chaves secretas falhou: %s\n" - -#: g10/gpg.c:3522 -#, fuzzy, c-format -msgid "key export failed: %s\n" -msgstr "A gerao de chaves falhou: %s\n" - -#: g10/gpg.c:3533 -#, fuzzy, c-format -msgid "keyserver search failed: %s\n" -msgstr "get_dir_record: search_record falhou: %s\n" - -#: g10/gpg.c:3543 -#, fuzzy, c-format -msgid "keyserver refresh failed: %s\n" -msgstr "enumerao de chaves secretas falhou: %s\n" - -#: g10/gpg.c:3594 -#, c-format -msgid "dearmoring failed: %s\n" -msgstr "retirada de armadura falhou: %s\n" - -#: g10/gpg.c:3602 -#, c-format -msgid "enarmoring failed: %s\n" -msgstr "criao de armadura falhou: %s\n" - -# "hash" poderia ser "espalhamento", mas no fica claro -#: g10/gpg.c:3689 -#, c-format -msgid "invalid hash algorithm `%s'\n" -msgstr "algoritmo de hash invlido `%s'\n" - -#: g10/gpg.c:3812 -msgid "[filename]" -msgstr "[nome_do_arquivo]" - -#: g10/gpg.c:3816 -msgid "Go ahead and type your message ...\n" -msgstr "V em frente e digite sua mensagem ...\n" - -#: g10/gpg.c:4120 -#, fuzzy -msgid "the given certification policy URL is invalid\n" -msgstr "a URL de poltica dada invlida\n" - -#: g10/gpg.c:4122 -#, fuzzy -msgid "the given signature policy URL is invalid\n" -msgstr "a URL de poltica dada invlida\n" - -#: g10/gpg.c:4155 -#, fuzzy -msgid "the given preferred keyserver URL is invalid\n" -msgstr "a URL de poltica dada invlida\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 "[usurio 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 "" - -#: g10/getkey.c:2380 g10/keyedit.c:3707 -#, fuzzy, c-format -msgid "no secret subkey for public subkey %s - ignoring\n" -msgstr "h uma chave secreta para esta chave pblica!\n" - -#: g10/getkey.c:2611 -#, fuzzy, c-format -msgid "using subkey %s instead of primary key %s\n" -msgstr "usando chave secundria %08lX ao invs de chave primria %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 pblica - 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 informaes 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 [opes] [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 [opes] [arquivos]\n" -"Utilitrio de manuteno 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 confiana, que no 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 no confivel 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 usurio do destinatrio 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 \"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 "" -"Digite o valor necessrio conforme pedido.\n" -" possvel digitar uma data ISO (AAAA-MM-DD) mas voc no ter uma boa\n" -"reao 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 endereo de email (opcional mas recomendado)" - -#: g10/helptext.c:126 -msgid "Please enter an optional comment" -msgstr "Por favor digite um comentrio (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 comentrio.\n" -"E para mudar o endereo de correio eletrnico.\n" -"O para continuar a gerao da chave.\n" -"S para interromper a gerao 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 usurio" - -#: 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 usurio.\n" -"Todos os certificados tambm sero 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 vlida na chave; normalmente no desejvel\n" -"remover esta assinatura porque ela pode ser importante para estabelecer\n" -"uma conexo de confiana 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 no pode ser verificada porque voc no tem a chave\n" -"correspondente. Voc deve adiar sua remoo at saber que chave foi usada\n" -"porque a chave desta assinatura pode estabelecer uma conexo de confiana\n" -"atravs 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 no vlida. 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 usurio chave. Geralmente\n" -"no uma boa idia remover tal assinatura. possvel que o GnuPG\n" -"no consiga mais usar esta chave. Faa isto apenas se por alguma\n" -"razo esta auto-assinatura no for vlida e h uma segunda disponvel." - -#: 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 padro (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 disponvel" - -#: g10/helptext.c:295 -#, c-format -msgid "No help available for `%s'" -msgstr "Nenhuma ajuda disponvel 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 no 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:266 -#, c-format -msgid "skipping block of type %d\n" -msgstr "ignorando bloco do tipo %d\n" - -#: g10/import.c:275 -#, fuzzy, c-format -msgid "%lu keys processed so far\n" -msgstr "%lu chaves processadas at agora\n" - -#: g10/import.c:292 -#, c-format -msgid "Total number processed: %lu\n" -msgstr "Nmero total processado: %lu\n" - -#: g10/import.c:294 -#, fuzzy, c-format -msgid " skipped new keys: %lu\n" -msgstr " novas subchaves: %lu\n" - -#: g10/import.c:297 -#, c-format -msgid " w/o user IDs: %lu\n" -msgstr " sem IDs de usurios: %lu\n" - -#: g10/import.c:299 -#, c-format -msgid " imported: %lu" -msgstr " importados: %lu" - -#: g10/import.c:305 -#, c-format -msgid " unchanged: %lu\n" -msgstr " no modificados: %lu\n" - -#: g10/import.c:307 -#, c-format -msgid " new user IDs: %lu\n" -msgstr " novos IDs de usurios: %lu\n" - -#: g10/import.c:309 -#, c-format -msgid " new subkeys: %lu\n" -msgstr " novas subchaves: %lu\n" - -#: g10/import.c:311 -#, c-format -msgid " new signatures: %lu\n" -msgstr " novas assinaturas: %lu\n" - -#: g10/import.c:313 -#, c-format -msgid " new key revocations: %lu\n" -msgstr " novas revogaes de chaves: %lu\n" - -#: g10/import.c:315 -#, c-format -msgid " secret keys read: %lu\n" -msgstr " chaves secretas lidas: %lu\n" - -#: g10/import.c:317 -#, c-format -msgid " secret keys imported: %lu\n" -msgstr " chaves secretas importadas: %lu\n" - -#: g10/import.c:319 -#, c-format -msgid " secret keys unchanged: %lu\n" -msgstr " chaves secretas no modificadas: %lu\n" - -#: g10/import.c:321 -#, fuzzy, c-format -msgid " not imported: %lu\n" -msgstr " importados: %lu" - -#: g10/import.c:323 -#, fuzzy, c-format -msgid " signatures cleaned: %lu\n" -msgstr " novas assinaturas: %lu\n" - -#: g10/import.c:325 -#, fuzzy, c-format -msgid " user IDs cleaned: %lu\n" -msgstr " chaves secretas lidas: %lu\n" - -#: g10/import.c:566 -#, 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:570 -#, fuzzy -msgid " algorithms on these user IDs:\n" -msgstr "Voc assinou estes IDs de usurio:\n" - -#: g10/import.c:607 -#, c-format -msgid " \"%s\": preference for cipher algorithm %s\n" -msgstr "" - -#: g10/import.c:619 -#, fuzzy, c-format -msgid " \"%s\": preference for digest algorithm %s\n" -msgstr "assinatura %s de: %s\n" - -#: g10/import.c:631 -#, c-format -msgid " \"%s\": preference for compression algorithm %s\n" -msgstr "" - -#: g10/import.c:644 -msgid "it is strongly suggested that you update your preferences and\n" -msgstr "" - -#: g10/import.c:646 -msgid "re-distribute this key to avoid potential algorithm mismatch problems\n" -msgstr "" - -#: g10/import.c:670 -#, c-format -msgid "you can update your preferences with: gpg --edit-key %s updpref save\n" -msgstr "" - -#: g10/import.c:720 g10/import.c:1118 -#, fuzzy, c-format -msgid "key %s: no user ID\n" -msgstr "chave %08lX: sem ID de usurio\n" - -#: g10/import.c:749 -#, fuzzy, c-format -msgid "key %s: PKS subkey corruption repaired\n" -msgstr "chave %08lX: sem subchave para ligao de chaves\n" - -#: g10/import.c:764 -#, fuzzy, c-format -msgid "key %s: accepted non self-signed user ID \"%s\"\n" -msgstr "chave %08lX: aceito ID de usurio sem auto-assinatura '" - -#: g10/import.c:770 -#, fuzzy, c-format -msgid "key %s: no valid user IDs\n" -msgstr "chave %08lX: sem IDs de usurios vlidos\n" - -#: g10/import.c:772 -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:782 g10/import.c:1240 -#, fuzzy, c-format -msgid "key %s: public key not found: %s\n" -msgstr "chave %08lX: chave pblica no encontrada: %s\n" - -#: g10/import.c:788 -#, fuzzy, c-format -msgid "key %s: new key - skipped\n" -msgstr "chave %08lX: no uma chave rfc2440 - ignorada\n" - -#: g10/import.c:797 -#, fuzzy, c-format -msgid "no writable keyring found: %s\n" -msgstr "impossvel escrever chaveiro: %s\n" - -#: g10/import.c:802 g10/openfile.c:267 g10/sign.c:831 g10/sign.c:1135 -#, c-format -msgid "writing to `%s'\n" -msgstr "escrevendo para `%s'\n" - -#: g10/import.c:806 g10/import.c:901 g10/import.c:1158 g10/import.c:1301 -#: g10/import.c:2363 g10/import.c:2385 -#, c-format -msgid "error writing keyring `%s': %s\n" -msgstr "erro na escrita do chaveiro `%s': %s\n" - -#: g10/import.c:825 -#, fuzzy, c-format -msgid "key %s: public key \"%s\" imported\n" -msgstr "chave %08lX: chave pblica importada\n" - -#: g10/import.c:849 -#, fuzzy, c-format -msgid "key %s: doesn't match our copy\n" -msgstr "chave %08lX: no corresponde nossa cpia\n" - -#: g10/import.c:866 g10/import.c:1258 -#, fuzzy, c-format -msgid "key %s: can't locate original keyblock: %s\n" -msgstr "chave %08lX: impossvel localizar bloco de chaves original: %s\n" - -#: g10/import.c:874 g10/import.c:1265 -#, fuzzy, c-format -msgid "key %s: can't read original keyblock: %s\n" -msgstr "chave %08lX: impossvel ler bloco de chaves original: %s\n" - -#: g10/import.c:911 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new user ID\n" -msgstr "chave %8lX: 1 novo ID de usurio\n" - -#: g10/import.c:914 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new user IDs\n" -msgstr "chave %08lX: %d novos IDs de usurios\n" - -#: g10/import.c:917 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new signature\n" -msgstr "chave %08lX: 1 nova assinatura\n" - -#: g10/import.c:920 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new signatures\n" -msgstr "chave %08lX: %d novas assinaturas\n" - -#: g10/import.c:923 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new subkey\n" -msgstr "chave %08lX: 1 nova subchave\n" - -#: g10/import.c:926 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new subkeys\n" -msgstr "chave %08lX: %d novas subchaves\n" - -#: g10/import.c:929 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signature cleaned\n" -msgstr "chave %08lX: %d novas assinaturas\n" - -#: g10/import.c:932 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signatures cleaned\n" -msgstr "chave %08lX: %d novas assinaturas\n" - -#: g10/import.c:935 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d user ID cleaned\n" -msgstr "chave %08lX: %d novos IDs de usurios\n" - -#: g10/import.c:938 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d user IDs cleaned\n" -msgstr "chave %08lX: %d novos IDs de usurios\n" - -#: g10/import.c:961 -#, fuzzy, c-format -msgid "key %s: \"%s\" not changed\n" -msgstr "chave %08lX: no modificada\n" - -#: g10/import.c:1124 -#, fuzzy, c-format -msgid "key %s: secret key with invalid cipher %d - skipped\n" -msgstr "chave %08lX: chave secreta sem chave pblica - ignorada\n" - -#: g10/import.c:1135 -#, fuzzy -msgid "importing secret keys not allowed\n" -msgstr "escrevendo certificado privado para `%s'\n" - -#: g10/import.c:1152 g10/import.c:2378 -#, fuzzy, c-format -msgid "no default secret keyring: %s\n" -msgstr "impossvel bloquear chaveiro secreto: %s\n" - -#: g10/import.c:1163 -#, fuzzy, c-format -msgid "key %s: secret key imported\n" -msgstr "chave %08lX: chave secreta importada\n" - -#: g10/import.c:1193 -#, fuzzy, c-format -msgid "key %s: already in secret keyring\n" -msgstr "chave %08lX: j est no chaveiro secreto\n" - -#: g10/import.c:1203 -#, fuzzy, c-format -msgid "key %s: secret key not found: %s\n" -msgstr "chave %08lX: chave secreta no encontrada: %s\n" - -#: g10/import.c:1233 -#, fuzzy, c-format -msgid "key %s: no public key - can't apply revocation certificate\n" -msgstr "" -"chave %08lX: sem chave pblica - impossvel aplicar certificado\n" -"de revogao\n" - -#: g10/import.c:1276 -#, fuzzy, c-format -msgid "key %s: invalid revocation certificate: %s - rejected\n" -msgstr "chave %08lX: certificado de revogao invlido: %s - rejeitado\n" - -#: g10/import.c:1308 -#, fuzzy, c-format -msgid "key %s: \"%s\" revocation certificate imported\n" -msgstr "chave %08lX: certificado de revogao importado\n" - -#: g10/import.c:1374 -#, fuzzy, c-format -msgid "key %s: no user ID for signature\n" -msgstr "chave %08lX: nenhum ID de usurio para assinatura\n" - -#: g10/import.c:1389 -#, fuzzy, c-format -msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n" -msgstr "chave %08lX: algoritmo de chave pblica no suportado\n" - -#: g10/import.c:1391 -#, fuzzy, c-format -msgid "key %s: invalid self-signature on user ID \"%s\"\n" -msgstr "chave %08lX: auto-assinatura invlida\n" - -#: g10/import.c:1409 -#, fuzzy, c-format -msgid "key %s: no subkey for key binding\n" -msgstr "chave %08lX: sem subchave para ligao de chaves\n" - -#: g10/import.c:1420 g10/import.c:1470 -#, fuzzy, c-format -msgid "key %s: unsupported public key algorithm\n" -msgstr "chave %08lX: algoritmo de chave pblica no suportado\n" - -#: g10/import.c:1422 -#, fuzzy, c-format -msgid "key %s: invalid subkey binding\n" -msgstr "chave %08lX: ligao de subchave invlida\n" - -#: g10/import.c:1437 -#, fuzzy, c-format -msgid "key %s: removed multiple subkey binding\n" -msgstr "chave %08lX: ligao de subchave invlida\n" - -#: g10/import.c:1459 -#, fuzzy, c-format -msgid "key %s: no subkey for key revocation\n" -msgstr "chave %08lX: sem subchave para ligao de chaves\n" - -#: g10/import.c:1472 -#, fuzzy, c-format -msgid "key %s: invalid subkey revocation\n" -msgstr "chave %08lX.%lu: Revogao de subchave vlida\n" - -#: g10/import.c:1487 -#, fuzzy, c-format -msgid "key %s: removed multiple subkey revocation\n" -msgstr "chave %08lX: ligao de subchave invlida\n" - -#: g10/import.c:1529 -#, fuzzy, c-format -msgid "key %s: skipped user ID \"%s\"\n" -msgstr "chave %08lX: ignorado ID de usurio '" - -#: g10/import.c:1550 -#, fuzzy, c-format -msgid "key %s: skipped subkey\n" -msgstr "chave %08lX: subchave ignorada\n" - -#: g10/import.c:1577 -#, fuzzy, c-format -msgid "key %s: non exportable signature (class 0x%02X) - skipped\n" -msgstr "chave %08lX: assinatura no exportvel (classe %02x) - ignorada\n" - -#: g10/import.c:1587 -#, fuzzy, c-format -msgid "key %s: revocation certificate at wrong place - skipped\n" -msgstr "chave %08lX: certificado de revogao no local errado - ignorada\n" - -#: g10/import.c:1604 -#, fuzzy, c-format -msgid "key %s: invalid revocation certificate: %s - skipped\n" -msgstr "chave %08lX: certificado de revogao invlido: %s - ignorada\n" - -#: g10/import.c:1618 -#, fuzzy, c-format -msgid "key %s: subkey signature in wrong place - skipped\n" -msgstr "chave %08lX: certificado de revogao no local errado - ignorada\n" - -#: g10/import.c:1626 -#, fuzzy, c-format -msgid "key %s: unexpected signature class (0x%02X) - skipped\n" -msgstr "chave %08lX: assinatura no exportvel (classe %02x) - ignorada\n" - -#: g10/import.c:1726 -#, fuzzy, c-format -msgid "key %s: duplicated user ID detected - merged\n" -msgstr "chave %08lX: detectado ID de usurio duplicado - unido\n" - -#: g10/import.c:1788 -#, 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:1802 -#, 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:1861 -#, fuzzy, c-format -msgid "key %s: \"%s\" revocation certificate added\n" -msgstr "chave %08lX: certificado de revogao adicionado\n" - -#: g10/import.c:1895 -#, fuzzy, c-format -msgid "key %s: direct key signature added\n" -msgstr "chave %08lX: %d novas assinaturas\n" - -#: g10/import.c:2284 -#, fuzzy -msgid "NOTE: a key's S/N does not match the card's one\n" -msgstr "lid %lu no tem chave\n" - -#: g10/import.c:2292 -#, fuzzy -msgid "NOTE: primary key is online and stored on card\n" -msgstr "ignorado: a chave secreta j est presente\n" - -#: g10/import.c:2294 -#, 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 "[revogao]" - -#: 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 no 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 no 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 no 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 no verificadas devido a erros\n" - -#: g10/keyedit.c:357 -msgid "1 user ID without valid self-signature detected\n" -msgstr "1 ID de usurio sem auto-assinatura vlida detectado\n" - -#: g10/keyedit.c:359 -#, c-format -msgid "%d user IDs without valid self-signatures detected\n" -msgstr "%d IDs de usurios sem auto-assinaturas vlidas 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 usurio para\n" -"verificar corretamente as chaves de outros usurios\n" -"(olhando em passaportes, checando impresses digitais\n" -"de outras fontes...)?\n" -"\n" -" 1 = No sei\n" -" 2 = Eu NO confio\n" -" 3 = Eu confio moderadamente\n" -" 4 = Eu confio completamente\n" -" s = Mostrar mais informaes\n" - -#: g10/keyedit.c:419 g10/pkclist.c:275 -#, fuzzy, c-format -msgid " %d = I trust marginally\n" -msgstr "%s: no 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: no 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 no 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 no-exportvel.\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 no-exportvel.\n" -"\n" - -#: g10/keyedit.c:988 -#, fuzzy -msgid "The signature will be marked as non-exportable.\n" -msgstr "" -"A assinatura ser marcada como no-exportvel.\n" -"\n" - -#: g10/keyedit.c:995 -#, fuzzy -msgid "The signature will be marked as non-revocable.\n" -msgstr "" -"A assinatura ser marcada como no-exportvel.\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:4783 g10/keyedit.c:4874 g10/keyedit.c:4938 -#: g10/keyedit.c:4999 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 no 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 no disponvel" - -#: g10/keyedit.c:1151 g10/keygen.c:3202 -#, fuzzy -msgid "Secret parts of primary key are stored on-card.\n" -msgstr "chave secreta no disponvel" - -#: 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 "Impossvel 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 no 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 no quer uma frase secreta - provavelmente isto uma *m* idia!\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 impresso digital" - -#: g10/keyedit.c:1363 -msgid "list key and user IDs" -msgstr "lista chave e identificadores de usurios" - -#: g10/keyedit.c:1365 -msgid "select user ID N" -msgstr "seleciona ID de usurio N" - -#: g10/keyedit.c:1366 -#, fuzzy -msgid "select subkey N" -msgstr "seleciona ID de usurio 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 usurio 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 usurio" - -#: g10/keyedit.c:1387 -#, fuzzy -msgid "add a photo ID" -msgstr "adiciona um novo ID de usurio" - -#: g10/keyedit.c:1389 -#, fuzzy -msgid "delete selected user IDs" -msgstr "remove ID de usurio" - -#: 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 secundria" - -#: g10/keyedit.c:1408 -#, fuzzy -msgid "add a revocation key" -msgstr "adiciona nova chave secundria" - -#: g10/keyedit.c:1410 -#, fuzzy -msgid "delete signatures from the selected user IDs" -msgstr "Realmente remover todos os IDs de usurio selecionados? " - -#: g10/keyedit.c:1412 -#, fuzzy -msgid "change the expiration date for the key or selected subkeys" -msgstr "Voc no 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 pblica" - -#: g10/keyedit.c:1419 -#, fuzzy -msgid "list preferences (expert)" -msgstr "lista preferncias" - -#: g10/keyedit.c:1421 -#, fuzzy -msgid "list preferences (verbose)" -msgstr "lista preferncias" - -#: g10/keyedit.c:1423 -#, fuzzy -msgid "set preference list for the selected user IDs" -msgstr "Realmente remover todos os IDs de usurio selecionados? " - -#: g10/keyedit.c:1428 -#, fuzzy -msgid "set the preferred keyserver URL for the selected user IDs" -msgstr "Realmente remover todos os IDs de usurio selecionados? " - -#: g10/keyedit.c:1430 -#, fuzzy -msgid "set a notation for the selected user IDs" -msgstr "Realmente remover todos os IDs de usurio 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 confiana" - -#: g10/keyedit.c:1438 -#, fuzzy -msgid "revoke signatures on the selected user IDs" -msgstr "Realmente remover todos os IDs de usurio selecionados? " - -#: g10/keyedit.c:1440 -#, fuzzy -msgid "revoke selected user IDs" -msgstr "adiciona um novo ID de usurio" - -#: g10/keyedit.c:1445 -#, fuzzy -msgid "revoke key or selected subkeys" -msgstr "revoga uma chave secundria" - -#: 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 disponvel.\n" - -#: g10/keyedit.c:1669 -msgid "Need the secret key to do this.\n" -msgstr "A chave secreta necessria 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 usurio? " - -#: g10/keyedit.c:1762 -msgid "Hint: Select the user IDs to sign\n" -msgstr "Sugesto: Selecione os IDs de usurio 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 usurio.\n" - -#: g10/keyedit.c:1818 -msgid "You can't delete the last user ID!\n" -msgstr "Voc no pode remover o ltimo ID de usurio!\n" - -#: g10/keyedit.c:1820 -#, fuzzy -msgid "Really remove all selected user IDs? (y/N) " -msgstr "Realmente remover todos os IDs de usurio selecionados? " - -#: g10/keyedit.c:1821 -#, fuzzy -msgid "Really remove this user ID? (y/N) " -msgstr "Realmente remover este ID de usurio? " - -#: g10/keyedit.c:1871 -#, fuzzy -msgid "Really move the primary key? (y/N) " -msgstr "Realmente remover este ID de usurio? " - -#: 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 "impossvel 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 usurio selecionados? " - -#: g10/keyedit.c:2006 -#, fuzzy -msgid "Really revoke this user ID? (y/N) " -msgstr "Realmente remover este ID de usurio? " - -#: 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 preferncias" - -#: g10/keyedit.c:2135 -#, fuzzy -msgid "Really update the preferences for the selected user IDs? (y/N) " -msgstr "Realmente remover todos os IDs de usurio selecionados? " - -#: g10/keyedit.c:2137 -#, fuzzy -msgid "Really update the preferences? (y/N) " -msgstr "Realmente gerar os certificados de revogao? (s/N)" - -#: g10/keyedit.c:2205 -#, fuzzy -msgid "Save changes? (y/N) " -msgstr "Salvar alteraes? " - -#: 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 "atualizao falhou: %s\n" - -#: g10/keyedit.c:2225 -#, c-format -msgid "update secret failed: %s\n" -msgstr "atualizao da chave secreta falhou: %s\n" - -#: g10/keyedit.c:2232 -msgid "Key not changed so no update needed.\n" -msgstr "Chave no alterada, nenhuma atualizao necessria.\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 "Notao: " - -#: 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 "impossvel 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:3346 -#, 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 vlida? (s/N/q)" - -#: g10/keyedit.c:3172 -msgid "Delete this invalid signature? (y/N/q)" -msgstr "Deletar esta assinatura invlida? (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 invlida" - -#: g10/keyedit.c:3249 -#, fuzzy, c-format -msgid "User ID \"%s\": already clean\n" -msgstr "A chave protegida.\n" - -#: g10/keyedit.c:3341 -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:3352 -msgid "You may not add a designated revoker to a PGP 2.x-style key.\n" -msgstr "" - -#: g10/keyedit.c:3372 -#, fuzzy -msgid "Enter the user ID of the designated revoker: " -msgstr "Digite o tamanho da chave" - -#: g10/keyedit.c:3397 -msgid "cannot appoint a PGP 2.x style key as a designated revoker\n" -msgstr "" - -#: g10/keyedit.c:3412 -msgid "you cannot appoint a key as its own designated revoker\n" -msgstr "" - -#: g10/keyedit.c:3434 -#, 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:3453 -msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n" -msgstr "" - -#: g10/keyedit.c:3459 -#, 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:3520 -msgid "Please remove selections from the secret keys.\n" -msgstr "Por favor remova as selees das chaves secretas.\n" - -#: g10/keyedit.c:3526 -#, fuzzy -msgid "Please select at most one subkey.\n" -msgstr "Por favor selecione no mximo uma chave secundria.\n" - -#: g10/keyedit.c:3530 -#, fuzzy -msgid "Changing expiration time for a subkey.\n" -msgstr "Modificando a data de validade para uma chave secundria.\n" - -#: g10/keyedit.c:3533 -msgid "Changing expiration time for the primary key.\n" -msgstr "Modificando a data de validade para uma chave primria.\n" - -#: g10/keyedit.c:3579 -msgid "You can't change the expiration date of a v3 key\n" -msgstr "Voc no pode modificar a data de validade de uma chave v3\n" - -#: g10/keyedit.c:3595 -msgid "No corresponding signature in secret ring\n" -msgstr "Nenhuma assinatura correspondente no chaveiro secreto\n" - -#: g10/keyedit.c:3668 -#, fuzzy, c-format -msgid "signing subkey %s is already cross-certified\n" -msgstr "A chave protegida.\n" - -#: g10/keyedit.c:3674 -#, c-format -msgid "subkey %s does not sign and so does not need to be cross-certified\n" -msgstr "" - -#: g10/keyedit.c:3836 -#, fuzzy -msgid "Please select exactly one user ID.\n" -msgstr "Voc precisa selecionar pelo menos um ID de usurio.\n" - -#: g10/keyedit.c:3875 g10/keyedit.c:3985 g10/keyedit.c:4105 g10/keyedit.c:4246 -#, fuzzy, c-format -msgid "skipping v3 self-signature on user ID \"%s\"\n" -msgstr "chave %08lX: auto-assinatura invlida\n" - -#: g10/keyedit.c:4046 -msgid "Enter your preferred keyserver URL: " -msgstr "" - -#: g10/keyedit.c:4126 -#, 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:4127 -#, 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:4189 -#, fuzzy -msgid "Enter the notation: " -msgstr "Notao: " - -#: g10/keyedit.c:4338 -#, fuzzy -msgid "Proceed? (y/N) " -msgstr "Sobrescrever (s/N)? " - -#: g10/keyedit.c:4402 -#, c-format -msgid "No user ID with index %d\n" -msgstr "Nenhum ID de usurio com ndice %d\n" - -#: g10/keyedit.c:4460 -#, fuzzy, c-format -msgid "No user ID with hash %s\n" -msgstr "Nenhum ID de usurio com ndice %d\n" - -#: g10/keyedit.c:4487 -#, fuzzy, c-format -msgid "No subkey with index %d\n" -msgstr "Nenhum ID de usurio com ndice %d\n" - -#: g10/keyedit.c:4622 -#, fuzzy, c-format -msgid "user ID: \"%s\"\n" -msgstr "ID de usurio: \"" - -#: g10/keyedit.c:4625 g10/keyedit.c:4689 g10/keyedit.c:4732 -#, fuzzy, c-format -msgid "signed by your key %s on %s%s%s\n" -msgstr " assinado por %08lX em %s\n" - -#: g10/keyedit.c:4627 g10/keyedit.c:4691 g10/keyedit.c:4734 -msgid " (non-exportable)" -msgstr "" - -#: g10/keyedit.c:4631 -#, fuzzy, c-format -msgid "This signature expired on %s.\n" -msgstr "Esta chave no protegida.\n" - -#: g10/keyedit.c:4635 -#, 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:4639 -#, fuzzy -msgid "Create a revocation certificate for this signature? (y/N) " -msgstr "Gerar um certificado de revogao para esta assinatura? (s/N)" - -#: g10/keyedit.c:4666 -#, fuzzy, c-format -msgid "You have signed these user IDs on key %s:\n" -msgstr "Voc assinou estes IDs de usurio:\n" - -#: g10/keyedit.c:4692 -#, fuzzy -msgid " (non-revocable)" -msgstr "assinar uma chave localmente" - -#: g10/keyedit.c:4699 -#, fuzzy, c-format -msgid "revoked by your key %s on %s\n" -msgstr " revogado por %08lX em %s\n" - -#: g10/keyedit.c:4721 -msgid "You are about to revoke these signatures:\n" -msgstr "Voc est prestes a revogar estas assinaturas:\n" - -#: g10/keyedit.c:4741 -#, fuzzy -msgid "Really create the revocation certificates? (y/N) " -msgstr "Realmente gerar os certificados de revogao? (s/N)" - -#: g10/keyedit.c:4771 -msgid "no secret key\n" -msgstr "nenhuma chave secreta\n" - -#: g10/keyedit.c:4841 -#, fuzzy, c-format -msgid "user ID \"%s\" is already revoked\n" -msgstr "A chave protegida.\n" - -#: g10/keyedit.c:4858 -#, c-format -msgid "WARNING: a user ID signature is dated %d seconds in the future\n" -msgstr "" - -#: g10/keyedit.c:4922 -#, fuzzy, c-format -msgid "Key %s is already revoked.\n" -msgstr "A chave protegida.\n" - -#: g10/keyedit.c:4984 -#, fuzzy, c-format -msgid "Subkey %s is already revoked.\n" -msgstr "A chave protegida.\n" - -#: g10/keyedit.c:5079 -#, 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 "Preferncias demais" - -# muitas ou demais ??? -#: g10/keygen.c:271 -#, fuzzy -msgid "too many digest preferences\n" -msgstr "Preferncias demais" - -# muitas ou demais ??? -#: g10/keygen.c:273 -#, fuzzy -msgid "too many compression preferences\n" -msgstr "Preferncias demais" - -#: g10/keygen.c:398 -#, fuzzy, c-format -msgid "invalid item `%s' in preference string\n" -msgstr "Caractere invlido 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 (padro)\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 vlida.\n" -" 0 = chave no 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 vlida.\n" -" 0 = chave no 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 invlido\n" - -#: g10/keygen.c:1674 -#, fuzzy -msgid "Key does not expire at all\n" -msgstr "A chave no expira nunca\n" - -#: g10/keygen.c:1675 -#, fuzzy -msgid "Signature does not expire at all\n" -msgstr "A chave no 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 no 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 no consegue mostrar datas alm de 2038.\n" -"Apesar disso, elas sero 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 usurio para identificar sua chave; o\n" -"programa constri o identificador a partir do Nome Completo, Comentrio e\n" -"Endereo Eletrnico 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 invlido no nome\n" - -#: g10/keygen.c:1738 -msgid "Name may not start with a digit\n" -msgstr "O nome no pode comear com um dgito\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 "Endereo de correio eletrnico: " - -#: g10/keygen.c:1754 -msgid "Not a valid email address\n" -msgstr "Endereo eletrnico invlido\n" - -#: g10/keygen.c:1762 -msgid "Comment: " -msgstr "Comentrio: " - -#: g10/keygen.c:1768 -msgid "Invalid character in comment\n" -msgstr "Caractere invlido no comentrio\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 usurio:\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)omentrio, (E)ndereo 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)omentrio, (E)ndereo 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 no quer uma frase secreta - provavelmente isto uma *m* idia!\n" -"Vou continuar assim mesmo. Voc pode mudar sua frase secreta a\n" -"qualquer hora, usando este programa com a opo \"--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 aleatrios. uma boa idia realizar outra\n" -"atividade (digitar no teclado, mover o mouse, usar os discos) durante a\n" -"gerao dos nmeros primos; isso d ao gerador de nmeros aleatrios\n" -"uma chance melhor de conseguir entropia suficiente.\n" - -#: g10/keygen.c:2708 -msgid "Key generation canceled.\n" -msgstr "Gerao 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 pblico 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 pblica no encontrada: %s\n" - -#: g10/keygen.c:3047 -#, fuzzy, c-format -msgid "no writable secret keyring found: %s\n" -msgstr "impossvel 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 pblica 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 no pode ser usada para criptografia. Voc pode usar\n" -"o comando \"--edit-key\" para gerar uma chave secundria 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 gerao 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 relgio)\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 relgio)\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 "enumerao de blocos de chaves falhou: %s\n" - -#: g10/keygen.c:3556 -#, fuzzy, c-format -msgid "can't create backup file `%s': %s\n" -msgstr "impossvel 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 "Notao: " - -#: g10/keylist.c:361 -#, fuzzy -msgid "Signature notation: " -msgstr "Notao: " - -#: g10/keylist.c:471 -msgid "Keyring" -msgstr "" - -#: g10/keylist.c:1505 -#, fuzzy -msgid "Primary key fingerprint:" -msgstr "listar as chaves e as impresses digitais" - -#: g10/keylist.c:1507 -#, fuzzy -msgid " Subkey fingerprint:" -msgstr " Impresso 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 " Impresso digital:" - -#: g10/keylist.c:1516 -#, fuzzy -msgid " Subkey fingerprint:" -msgstr " Impresso digital:" - -#: g10/keylist.c:1520 g10/keylist.c:1524 -#, fuzzy -msgid " Key fingerprint =" -msgstr " Impresso 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 "criao de armadura falhou: %s\n" - -#: g10/keyring.c:1252 -msgid "WARNING: 2 files with confidential information exists.\n" -msgstr "AVISO: existem 2 arquivos com informaes confidenciais.\n" - -#: g10/keyring.c:1254 -#, c-format -msgid "%s is the unchanged one\n" -msgstr "%s o no 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 possvel furo de segurana\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 poltica dada invlida\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:1421 -#, fuzzy, c-format -msgid "invalid keyserver protocol (us %d!=handler %d)\n" -msgstr "chaveiro invlido" - -#: g10/keyserver.c:906 -#, fuzzy, c-format -msgid "key \"%s\" not found on keyserver\n" -msgstr "usurio `%s' no encontrado: %s\n" - -#: g10/keyserver.c:908 -#, fuzzy -msgid "key not found on keyserver\n" -msgstr "usurio `%s' no encontrado: %s\n" - -#: g10/keyserver.c:1145 -#, fuzzy, c-format -msgid "requesting key %s from %s server %s\n" -msgstr "impossvel escrever para o chaveiro: %s\n" - -#: g10/keyserver.c:1149 -#, fuzzy, c-format -msgid "requesting key %s from %s\n" -msgstr "impossvel 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 opes de `%s'\n" - -#: g10/keyserver.c:1324 -#, c-format -msgid "sending key %s to %s server %s\n" -msgstr "" - -#: g10/keyserver.c:1328 -#, fuzzy, c-format -msgid "sending key %s to %s\n" -msgstr "" -"\"\n" -"assinado com sua chave %08lX em %s\n" - -#: g10/keyserver.c:1371 -#, fuzzy, c-format -msgid "searching for \"%s\" from %s server %s\n" -msgstr "exportar chaves para um servidor" - -#: g10/keyserver.c:1374 -#, fuzzy, c-format -msgid "searching for \"%s\" from %s\n" -msgstr "lendo opes de `%s'\n" - -#: g10/keyserver.c:1381 g10/keyserver.c:1477 -#, fuzzy -msgid "no keyserver action!\n" -msgstr "chaveiro invlido" - -#: g10/keyserver.c:1429 -#, c-format -msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n" -msgstr "" - -#: g10/keyserver.c:1438 -msgid "keyserver did not send VERSION\n" -msgstr "" - -#: g10/keyserver.c:1500 g10/keyserver.c:2028 -msgid "no keyserver known (use option --keyserver)\n" -msgstr "" - -#: g10/keyserver.c:1506 -msgid "external keyserver calls are not supported in this build\n" -msgstr "" - -#: g10/keyserver.c:1518 -#, c-format -msgid "no handler for keyserver scheme `%s'\n" -msgstr "" - -#: g10/keyserver.c:1523 -#, c-format -msgid "action `%s' not supported with keyserver scheme `%s'\n" -msgstr "" - -#: g10/keyserver.c:1531 -#, c-format -msgid "%s does not support handler version %d\n" -msgstr "" - -#: g10/keyserver.c:1538 -#, fuzzy -msgid "keyserver timed out\n" -msgstr "erro geral" - -#: g10/keyserver.c:1543 -#, fuzzy -msgid "keyserver internal error\n" -msgstr "erro geral" - -#: g10/keyserver.c:1552 -#, fuzzy, c-format -msgid "keyserver communications error: %s\n" -msgstr "enumerao de chaves secretas falhou: %s\n" - -#: g10/keyserver.c:1577 g10/keyserver.c:1611 -#, fuzzy, c-format -msgid "\"%s\" not a key ID: skipping\n" -msgstr "%s no um mapa de caracteres vlido\n" - -#: g10/keyserver.c:1870 -#, fuzzy, c-format -msgid "WARNING: unable to refresh key %s via %s: %s\n" -msgstr "%s: novo arquivo de opes criado\n" - -#: g10/keyserver.c:1892 -#, fuzzy, c-format -msgid "refreshing 1 key from %s\n" -msgstr "impossvel escrever para o chaveiro: %s\n" - -#: g10/keyserver.c:1894 -#, fuzzy, c-format -msgid "refreshing %d keys from %s\n" -msgstr "impossvel escrever para o chaveiro: %s\n" - -#: g10/keyserver.c:1950 -#, fuzzy, c-format -msgid "WARNING: unable to fetch URI %s: %s\n" -msgstr "%s: novo arquivo de opes criado\n" - -#: g10/keyserver.c:1956 -#, fuzzy, c-format -msgid "WARNING: unable to parse URI %s\n" -msgstr "%s: novo arquivo de opes 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 pblica %08lX\n" - -#: g10/mainproc.c:439 -msgid "public key encrypted data: good DEK\n" -msgstr "dados criptografados com chave pblica: DEK vlido\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 pblica 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 "revogao 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 "verificao 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 no 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 disponvel" - -#: 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 no protegida.\n" - -#: g10/mainproc.c:1868 -#, fuzzy, c-format -msgid "Signature expires %s\n" -msgstr "Esta chave no 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 "verso desconhecida" - -#: g10/mainproc.c:1893 -#, c-format -msgid "Can't check signature: %s\n" -msgstr "Impossvel 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 invlido detectado em proc_tree()\n" - -#: g10/misc.c:122 -#, c-format -msgid "can't disable core dumps: %s\n" -msgstr "impossvel 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 "atualizao 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 "impossvel manipular algoritmo de chave pblica %d\n" - -#: g10/misc.c:331 -#, fuzzy, c-format -msgid "WARNING: using experimental cipher algorithm %s\n" -msgstr "algoritmo de criptografia no 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 no encontrado nas preferncias\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- revogaes 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 "no processado(s)" - -#: g10/misc.c:732 -#, fuzzy -msgid "uncompressed|none" -msgstr "no 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 opes de `%s'\n" - -#: g10/misc.c:1042 -#, fuzzy, c-format -msgid "unknown option `%s'\n" -msgstr "destinatrio padro 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:305 -#, c-format -msgid "assuming signed data in `%s'\n" -msgstr "assumindo dados assinados em `%s'\n" - -#: g10/openfile.c:384 -#, fuzzy, c-format -msgid "new configuration file `%s' created\n" -msgstr "%s: novo arquivo de opes criado\n" - -#: g10/openfile.c:386 -#, c-format -msgid "WARNING: options in `%s' are not yet active during this run\n" -msgstr "" - -#: g10/openfile.c:418 -#, fuzzy, c-format -msgid "directory `%s' created\n" -msgstr "%s: diretrio criado\n" - -#: g10/parse-packet.c:138 -#, c-format -msgid "can't handle public key algorithm %d\n" -msgstr "impossvel manipular algoritmo de chave pblica %d\n" - -#: g10/parse-packet.c:708 -msgid "WARNING: potentially insecure symmetrically encrypted session key\n" -msgstr "" - -#: g10/parse-packet.c:1157 -#, c-format -msgid "subpacket of type %d has critical bit set\n" -msgstr "subpacote do tipo %d tem bit crtico 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 proteo %d no suportado\n" - -#: g10/passphrase.c:362 -#, fuzzy, c-format -msgid "can't connect to `%s': %s\n" -msgstr "impossvel 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" -"usurio: \"%.*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:968 -#, fuzzy -msgid "can't query passphrase in batch mode\n" -msgstr "impossvel pedir senha em modo no-interativo\n" - -#: g10/passphrase.c:812 g10/passphrase.c:973 -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" -"usurio: \"" - -#: 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:977 -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 "impossvel 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: no 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 "impossvel 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- revogaes de chaves incorreta\n" - -#: g10/pkclist.c:91 -#, fuzzy -msgid "revocation comment: " -msgstr "[revogao]" - -#: g10/pkclist.c:206 -msgid "iImMqQsS" -msgstr "" - -#: g10/pkclist.c:214 -#, fuzzy -msgid "No trust value assigned to:\n" -msgstr "" -"Nenhum valor de confiana 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: Ns NO confiamos nesta chave\n" - -#: g10/pkclist.c:279 -#, fuzzy, c-format -msgid " %d = I trust ultimately\n" -msgstr "%s: no 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 deciso? " - -#: 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 " No h indicao 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 " No h indicao 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 ns\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 se tem certeza de que esta chave pertence a seu dono.\n" -"Se voc *realmente* sabe o que est fazendo, pode responder\n" -"sim prxima 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 no confivel!\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 no est certificada com uma assinatura confivel!\n" - -#: g10/pkclist.c:604 -msgid "" -" There is no indication that the signature belongs to the owner.\n" -msgstr " No h indicao de que a assinatura pertence ao dono.\n" - -#: g10/pkclist.c:612 -msgid "WARNING: We do NOT trust this key!\n" -msgstr "AVISO: Ns NO confiamos nesta chave!\n" - -#: g10/pkclist.c:613 -msgid " The signature is probably a FORGERY.\n" -msgstr " A assinatura provavelmente uma FALSIFICAO.\n" - -#: g10/pkclist.c:621 -msgid "" -"WARNING: This key is not certified with sufficiently trusted signatures!\n" -msgstr "" -"AVISO: Esta chave no est certificada com assinaturas suficientemente\n" -" confiveis!\n" - -#: g10/pkclist.c:623 -msgid " It is not certain that the signature belongs to the owner.\n" -msgstr " No 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 pblica j est presente\n" - -#: g10/pkclist.c:885 -#, fuzzy -msgid "You did not specify a user ID. (you may use \"-r\")\n" -msgstr "" -"Voc no especificou um identificador de usurio. (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 usurio inexistente.\n" - -#: g10/pkclist.c:969 g10/pkclist.c:1043 -msgid "skipped: public key already set as default recipient\n" -msgstr "ignorado: chave pblica j marcada como destinatrio padro\n" - -#: g10/pkclist.c:990 -msgid "Public key is disabled.\n" -msgstr "A chave pblica est desativada.\n" - -#: g10/pkclist.c:999 -#, fuzzy -msgid "skipped: public key already set\n" -msgstr "%s: ignorado: a chave pblica j est presente\n" - -#: g10/pkclist.c:1034 -#, fuzzy, c-format -msgid "unknown default recipient \"%s\"\n" -msgstr "destinatrio padro desconhecido `%s'\n" - -#: g10/pkclist.c:1092 -#, c-format -msgid "%s: skipped: public key is disabled\n" -msgstr "%s: ignorado: a chave pblica est desativada\n" - -#: g10/pkclist.c:1154 -msgid "no valid addressees\n" -msgstr "nenhum endereo vlido\n" - -#: g10/plaintext.c:91 -msgid "data not saved; use option \"--output\" to save it\n" -msgstr "dados no salvos; use a opo \"--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 "impossvel abrir dados assinados `%s'\n" - -#: g10/pubkey-enc.c:104 -#, fuzzy, c-format -msgid "anonymous recipient; trying secret key %s ...\n" -msgstr "destinatrio annimo; tentando chave secreta %08lX ...\n" - -#: g10/pubkey-enc.c:135 -msgid "okay, we are the anonymous recipient.\n" -msgstr "certo, ns somos o destinatrio annimo.\n" - -#: g10/pubkey-enc.c:223 -msgid "old encoding of the DEK is not supported\n" -msgstr "codificao antiga do DEK no suportada\n" - -#: g10/pubkey-enc.c:244 -#, fuzzy, c-format -msgid "cipher algorithm %d%s is unknown or disabled\n" -msgstr "algoritmo de proteo %d no 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 no encontrado nas preferncias\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 "atualizao falhou: %s\n" - -#: g10/revoke.c:147 -#, fuzzy, c-format -msgid "key %s has no user IDs\n" -msgstr "chave %08lX: sem ID de usurio\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 revogao 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 "enumerao de blocos de chaves falhou: %s\n" - -#: g10/revoke.c:407 -#, fuzzy -msgid "Revocation certificate created.\n" -msgstr "chave %08lX: certificado de revogao 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 "usurio `%s' no encontrado: %s\n" - -#: g10/revoke.c:500 -#, fuzzy, c-format -msgid "no corresponding public key: %s\n" -msgstr "escrevendo certificado pblico para `%s'\n" - -#: g10/revoke.c:511 -#, fuzzy -msgid "public key does not match secret key!\n" -msgstr "lid %lu no tem chave\n" - -#: g10/revoke.c:518 -#, fuzzy -msgid "Create a revocation certificate for this key? (y/N) " -msgstr "Gerar um certificado de revogao para esta assinatura? (s/N)" - -#: g10/revoke.c:535 -#, fuzzy -msgid "unknown protection algorithm\n" -msgstr "algoritmo de compresso desconhecido" - -#: g10/revoke.c:543 -#, fuzzy -msgid "NOTE: This key is not protected!\n" -msgstr "Esta chave no 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- revogaes 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- revogaes 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 no disponvel" - -#: g10/seckey-cert.c:61 -#, fuzzy, c-format -msgid "protection algorithm %d%s is not supported\n" -msgstr "algoritmo de proteo %d no suportado\n" - -#: g10/seckey-cert.c:72 -#, fuzzy, c-format -msgid "protection digest %d is not supported\n" -msgstr "algoritmo de proteo %d no suportado\n" - -#: g10/seckey-cert.c:266 -#, fuzzy -msgid "Invalid passphrase; please try again" -msgstr "Frase secreta invlida; 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 "" -"impossvel evitar chave fraca para criptografia simtrica;\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 pblica %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 pblica %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 relgio)\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 relgio)\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 crtico 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 ligao 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 ligao 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 no encontrado nas preferncias\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:127 g10/skclist.c:191 -msgid "key is not flagged as insecure - can't use it with the faked RNG!\n" -msgstr "" -"a chave no est marcada como insegura - impossvel us-la com o pseudo " -"RNG!\n" - -#: g10/skclist.c:158 -#, fuzzy, c-format -msgid "skipped \"%s\": duplicated\n" -msgstr "ignorado `%s': duplicado\n" - -#: g10/skclist.c:166 g10/skclist.c:176 g10/skclist.c:185 -#, fuzzy, c-format -msgid "skipped \"%s\": %s\n" -msgstr "ignorado `%s': %s\n" - -#: g10/skclist.c:171 -#, fuzzy -msgid "skipped: secret key already present\n" -msgstr "ignorado: a chave secreta j est presente\n" - -#: g10/skclist.c:186 -#, 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 no 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 confiana %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 confiana 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: impresso digital invlida\n" - -#: g10/tdbdump.c:179 -#, fuzzy -msgid "ownertrust value missing" -msgstr "importar os valores de confiana" - -#: g10/tdbdump.c:215 -#, fuzzy, c-format -msgid "error finding trust record in `%s': %s\n" -msgstr "erro lendo registro de diretrio: %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: sincronizao 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 "transao de banco de dados de confiabilidade muito grande\n" - -#: g10/tdbio.c:498 -#, fuzzy, c-format -msgid "can't access `%s': %s\n" -msgstr "impossvel abrir `%s': %s\n" - -#: g10/tdbio.c:513 -#, c-format -msgid "%s: directory does not exist!\n" -msgstr "%s: diretrio 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 "impossvel criar %s: %s\n" - -#: g10/tdbio.c:525 g10/tdbio.c:592 -#, fuzzy, c-format -msgid "can't lock `%s'\n" -msgstr "impossvel abrir `%s'\n" - -#: g10/tdbio.c:551 -#, c-format -msgid "%s: failed to create version record: %s" -msgstr "%s: falha ao criar registro de verso: %s" - -#: g10/tdbio.c:555 -#, c-format -msgid "%s: invalid trustdb created\n" -msgstr "%s: banco de dados de confiabilidade invlido 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 invlido\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 verso: %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 verso: %s\n" - -#: g10/tdbio.c:735 -#, c-format -msgid "%s: error writing version record: %s\n" -msgstr "%s: erro escrevendo registro de verso: %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: no 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 verso com recnum %lu\n" - -#: g10/tdbio.c:1226 -#, c-format -msgid "%s: invalid file version %d\n" -msgstr "%s: verso de arquivo invlida %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 diretrio: %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 "impossvel 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 no um mapa de caracteres vlido\n" - -#: g10/trustdb.c:258 -#, fuzzy, c-format -msgid "key %s: accepted as trusted key\n" -msgstr "chave %08lX: aceita como chave confivel.\n" - -#: g10/trustdb.c:296 -#, fuzzy, c-format -msgid "key %s occurs more than once in the trustdb\n" -msgstr "" -"chave %08lX: impossvel 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 pblica - 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 confiana %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 confiana %lu: remoo 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 "verso 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: no 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 "insero de registro de confiana falhou: %s\n" - -#: g10/trustdb.c:592 -#, fuzzy, c-format -msgid "no need for a trustdb check with `%s' trust model\n" -msgstr "%s: no 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: no 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 pblica no 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 confiana" - -#: 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 confiana %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 no pde 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 "verso desconhecida" - -#: util/errors.c:58 -msgid "unknown pubkey algorithm" -msgstr "algoritmo de chave pblica desconhecido" - -#: util/errors.c:59 -msgid "unknown digest algorithm" -msgstr "algoritmo de \"digest\" desconhecido" - -#: util/errors.c:60 -msgid "bad public key" -msgstr "chave pblica 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 pblica no 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 "no possvel abrir o chaveiro" - -#: util/errors.c:68 -msgid "invalid packet" -msgstr "pacote invlido" - -#: util/errors.c:69 -msgid "invalid armor" -msgstr "armadura invlida" - -#: util/errors.c:70 -msgid "no such user id" -msgstr "identificador de usurio inexistente" - -#: util/errors.c:71 -msgid "secret key not available" -msgstr "chave secreta no disponvel" - -#: util/errors.c:72 -msgid "wrong secret key used" -msgstr "chave secreta incorreta" - -# suportado ??? -#: util/errors.c:73 -msgid "not supported" -msgstr "no 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 compresso 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 criao de arquivo" - -#: util/errors.c:80 -msgid "invalid passphrase" -msgstr "frase secreta invlida" - -#: util/errors.c:81 -msgid "unimplemented pubkey algorithm" -msgstr "algoritmo de chave pblica no implementado" - -#: util/errors.c:82 -msgid "unimplemented cipher algorithm" -msgstr "algoritmo de criptografia no 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 invlido" - -#: util/errors.c:88 -msgid "bad certificate" -msgstr "certificado incorreto" - -#: util/errors.c:89 -msgid "malformed user id" -msgstr "identificador de usurio 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 renomeao de arquivo" - -#: util/errors.c:92 -msgid "file delete error" -msgstr "erro na remoo 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 pblica inutilizvel" - -#: 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 invlido" - -#: util/errors.c:99 -msgid "bad URI" -msgstr "URI incorreto" - -#: util/errors.c:100 -msgid "unsupported URI" -msgstr "URI no suportado" - -#: util/errors.c:101 -msgid "network error" -msgstr "erro na rede" - -#: util/errors.c:103 -msgid "not encrypted" -msgstr "no criptografado" - -#: util/errors.c:104 -msgid "not processed" -msgstr "no processado(s)" - -#: util/errors.c:106 -#, fuzzy -msgid "unusable public key" -msgstr "chave pblica 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 "no 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 "no" - -#: 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 memria insegura!\n" - -#: util/secmem.c:98 -msgid "please see http://www.gnupg.org/faq.html for more information\n" -msgstr "" - -#: util/secmem.c:350 -msgid "operation is not possible without initialized secure memory\n" -msgstr "a operao no possvel sem memria segura inicializada\n" - -#: util/secmem.c:351 -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 notao deve ter apenas letras, dgitos, pontos ou sublinhados " -#~ "e terminar com '='\n" - -#, fuzzy -#~ msgid "a user notation name must contain the '@' character\n" -#~ msgstr "um valor de notao no deve usar caracteres de controle\n" - -#, fuzzy -#~ msgid "a notation name must not contain more than one '@' character\n" -#~ msgstr "um valor de notao no deve usar caracteres de controle\n" - -#~ msgid "a notation value must not use any control characters\n" -#~ msgstr "um valor de notao no deve usar caracteres de controle\n" - -#~ msgid "WARNING: invalid notation data found\n" -#~ msgstr "AVISO: dados de notao invlidos encontrados\n" - -#, fuzzy -#~ msgid "all export-clean-* options from above" -#~ msgstr "ler opes do arquivo" - -#, fuzzy -#~ msgid "all import-clean-* options from above" -#~ msgstr "ler opes 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 no exportvel (classe %02x) - ignorada\n" - -#, fuzzy -#~ msgid "Unable to clean `%s'\n" -#~ msgstr "impossvel abrir %s: %s\n" - -#, fuzzy -#~ msgid "User ID \"%s\": %d signature removed.\n" -#~ msgstr "A chave protegida.\n" - -#, fuzzy -#~ msgid "User ID \"%s\": %d signatures removed.\n" -#~ msgstr "A chave protegida.\n" - -#, fuzzy -#~ msgid "User ID \"%s\" removed: %s\n" -#~ msgstr "A chave protegida.\n" - -#, fuzzy -#~ msgid "No user IDs are removable.\n" -#~ msgstr "Nenhum identificador de usurio para chave\n" - -#, fuzzy -#~ msgid "error getting serial number: %s\n" -#~ msgstr "erro na criao 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 secundria N" - -#~ msgid "list signatures" -#~ msgstr "lista assinaturas" - -#~ msgid "sign the key" -#~ msgstr "assina a chave" - -#~ msgid "add a secondary key" -#~ msgstr "adiciona nova chave secundria" - -#~ msgid "delete signatures" -#~ msgstr "remove assinaturas" - -#~ msgid "change the expire date" -#~ msgstr "muda a data de validade" - -#, fuzzy -#~ msgid "set preference list" -#~ msgstr "lista preferncias" - -#, fuzzy -#~ msgid "updated preferences" -#~ msgstr "lista preferncias" - -#~ msgid "No secondary key with index %d\n" -#~ msgstr "Nenhuma chave secundria com ndice %d\n" - -#, fuzzy -#~ msgid "--nrsign-key user-id" -#~ msgstr "--sign-key id-usurio" - -#, fuzzy -#~ msgid "--nrlsign-key user-id" -#~ msgstr "--sign-key id-usurio" - -#, 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 mnimo 768 bits\n" -#~ " tamanho padro 1024 bits\n" -#~ " tamanho mximo 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 mnimo permitido.\n" - -#~ msgid "keysize too small; 768 is smallest value allowed.\n" -#~ msgstr "tamanho muito pequeno; 768 o valor mnimo permitido.\n" - -#~ msgid "keysize too large; %d is largest value allowed.\n" -#~ msgstr "tamanho muito grande; %d o valor mximo permitido.\n" - -#~ msgid "" -#~ "Keysizes larger than 2048 are not suggested because\n" -#~ "computations take REALLY long!\n" -#~ msgstr "" -#~ "Tamanhos de chave maiores que 2048 no so recomendados\n" -#~ "porque o tempo de computao 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 radiao de seu monitor e teclado " -#~ "tambm vulnervel a ataques!\n" - -#~ msgid "Experimental algorithms should not be used!\n" -#~ msgstr "Algoritmos experimentais no 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 padro!\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 "impossvel fazer isso em modo no-interativo\n" - -#, fuzzy -#~ msgid "key `%s' not found: %s\n" -#~ msgstr "usurio `%s' no encontrado: %s\n" - -#, fuzzy -#~ msgid "can't create file `%s': %s\n" -#~ msgstr "impossvel criar %s: %s\n" - -#, fuzzy -#~ msgid "can't open file `%s': %s\n" -#~ msgstr "impossvel 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: Ns NO 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: impossvel abrir: %s\n" - -#~ msgid "%s: WARNING: empty file\n" -#~ msgstr "%s: AVISO: arquivo vazio\n" - -#~ msgid "can't open %s: %s\n" -#~ msgstr "impossvel abrir %s: %s\n" - -#, fuzzy -#~ msgid " (%d) I trust fully\n" -#~ msgstr "%s: no 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: impossvel acessar: %s\n" - -#~ msgid "%s: can't create lock\n" -#~ msgstr "%s: impossvel criar trava\n" - -#, fuzzy -#~ msgid "%s: can't make lock\n" -#~ msgstr "%s: impossvel criar trava\n" - -#~ msgid "%s: can't create: %s\n" -#~ msgstr "%s: impossvel criar: %s\n" - -#~ msgid "%s: can't create directory: %s\n" -#~ msgstr "%s: impossvel criar diretrio: %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 "impossvel abrir %s: %s\n" - -#~ msgid "can't open file: %s\n" -#~ msgstr "impossvel 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 confiana\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- revogaes 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 "impossvel 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 seqncias de pacotes" - -# ownertrust ??? -#~ msgid "export the ownertrust values" -#~ msgstr "exportar os valores de confiana" - -#, 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 destinatrio padro" - -#~ msgid "use the default key as default recipient" -#~ msgstr "usar a chave padro como destinatrio padro" - -#~ msgid "don't use the terminal at all" -#~ msgstr "nunca usar o terminal" - -#~ msgid "force v3 signatures" -#~ msgstr "forar assinaturas v3" - -#, fuzzy -#~ msgid "do not force v3 signatures" -#~ msgstr "forar assinaturas v3" - -#, fuzzy -#~ msgid "force v4 key signatures" -#~ msgstr "forar assinaturas v3" - -#, fuzzy -#~ msgid "do not force v4 key signatures" -#~ msgstr "forar 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 no-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 no 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 padro" - -#~ msgid "|HOST|use this keyserver to lookup keys" -#~ msgstr "|ENDEREO|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 informaes de estado para o\n" -#~ "descritor de arquivo DA" - -#~ msgid "|FILE|load extension module FILE" -#~ msgstr "|ARQUIVO|carregar mdulo de extenso 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 opes 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 opes 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 compresso 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 compresso deve estar na faixa %d..%d\n" - -#~ msgid "compress algorithm must be in range %d..%d\n" -#~ msgstr "o algoritmo de compresso 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: No 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: no uma chave rfc2440 - ignorada\n" - -#, fuzzy -#~ msgid " (default)" -#~ msgstr "(o padro 1)" - -#~ msgid "Policy: " -#~ msgstr "Poltica: " - -#, fuzzy -#~ msgid "can't get key from keyserver: %s\n" -#~ msgstr "impossvel 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 NO 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 relgio)\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 relgio)\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 verificao de\n" -#~ "assinaturas DSA muito mais rpida que a verificao 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 so iguais, mas alguns\n" -#~ "parmetros precisam ser escolhidos de modo especial para criar uma chave\n" -#~ "segura para asssinatura: este programa faz isso, mas algumas outras\n" -#~ "implementaes do OpenPGP no vo necessariamente entender o tipo\n" -#~ "assinatura+criptografia.\n" -#~ "\n" -#~ "A chave primria precisa sempre ser uma chave capaz de fazer " -#~ "assinaturas;\n" -#~ "este o motivo pelo qual a chave ElGamal apenas para criptografia no " -#~ "est\n" -#~ "disponvel 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 no so " -#~ "recomendadas\n" -#~ "porque no so suportadas por todos os programas e assinaturas criadas " -#~ "com\n" -#~ "elas so grandes e sua verificao 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 usurio\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 no fica claro -#, fuzzy -#~ msgid "invalid symkey algorithm detected (%d)\n" -#~ msgstr "algoritmo de hash invlido `%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 opes\n" - -#~ msgid " Fingerprint:" -#~ msgstr " Impresso digital:" - -#~ msgid "|NAME=VALUE|use this notation data" -#~ msgstr "|NOME=VALOR|usar estes dados de notao" - -#~ msgid "" -#~ "the first character of a notation name must be a letter or an underscore\n" -#~ msgstr "" -#~ "o primeiro caractere de um nome de notao 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 notao 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 cpia no tem auto-assinatura\n" - -#~ msgid "Do you really need such a large keysize? " -#~ msgstr "Voc realmente precisa de uma chave to 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-usurio" - -#~ msgid "--delete-key user-id" -#~ msgstr "--delete-key id-usurio" - -#, fuzzy -#~ msgid "--delete-secret-and-public-key user-id" -#~ msgstr "--delete-secret-and-public-key id-usurio" - -#~ msgid "skipped: public key already set with --encrypt-to\n" -#~ msgstr "ignorado: chave pblica 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 pblica %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 "" -#~ "No foi possvel encontrar uma rota de confiana vlida para a chave.\n" -#~ "Vamos ver se possvel designar alguns valores de confiana 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 confiana indefinida encontrado.\n" -#~ "\n" - -#~ msgid "" -#~ "No trust values changed.\n" -#~ "\n" -#~ msgstr "" -#~ "Nenhum valor de confiana modificado.\n" -#~ "\n" - -#~ msgid "%08lX: no info to calculate a trust probability\n" -#~ msgstr "%08lX: sem informao para calcular probabilidade de confiana\n" - -#~ msgid "%s: error checking key: %s\n" -#~ msgstr "%s: erro na verificao 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 crtico desconhecido\n" - -#~ msgid "error reading dir record for LID %lu: %s\n" -#~ msgstr "erro lendo registro de diretrio para LID %lu: %s\n" - -#~ msgid "lid %lu: expected dir record, got type %d\n" -#~ msgstr "lid %lu: registro de diretrio esperado, tipo %d recebido\n" - -#~ msgid "no primary key for LID %lu\n" -#~ msgstr "nenhuma chave primria para LID %lu\n" - -#~ msgid "error reading primary key for LID %lu: %s\n" -#~ msgstr "erro lendo chave primria 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 confiveis\n" - -#~ msgid "NOTE: secret key %08lX is NOT protected.\n" -#~ msgstr "NOTA: a chave secreta %08lX NO est protegida.\n" - -#~ msgid "key %08lX: secret and public key don't match\n" -#~ msgstr "chave %08lX: chaves secreta e pblica no so correspondentes\n" - -#~ msgid "key %08lX.%lu: Good subkey binding\n" -#~ msgstr "chave %08lX.%lu: Ligao de subchave vlida\n" - -#~ msgid "key %08lX.%lu: Invalid subkey binding: %s\n" -#~ msgstr "chave %08lX.%lu: Ligao de subchave invlida: %s\n" - -#~ msgid "key %08lX.%lu: Valid key revocation\n" -#~ msgstr "chave %08lX.%lu: Revogao de chave vlida\n" - -#~ msgid "key %08lX.%lu: Invalid key revocation: %s\n" -#~ msgstr "chave %08lX.%lu: Revogao de chave invlida: %s\n" - -#~ msgid "Good self-signature" -#~ msgstr "Auto-assinatura vlida" - -#~ msgid "Invalid self-signature" -#~ msgstr "Auto-assinatura invlida" - -#~ msgid "Valid user ID revocation skipped due to a newer self signature" -#~ msgstr "" -#~ "Revogao vlida de ID de usurio ignorada devido a nova auto-assinatura" - -#~ msgid "Valid user ID revocation" -#~ msgstr "Revogao de ID de usurio vlida" - -#~ msgid "Invalid user ID revocation" -#~ msgstr "Revogao de ID de usurio invlida" - -#~ msgid "Valid certificate revocation" -#~ msgstr "Certificado de revogao vlido" - -#~ msgid "Good certificate" -#~ msgstr "Certificado correto" - -#~ msgid "Invalid certificate revocation" -#~ msgstr "Certificado de revogao invlido" - -#~ msgid "Invalid certificate" -#~ msgstr "Certificado invlido" - -#~ 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 ?: insero falhou: %s\n" - -#~ msgid "lid %lu: insert failed: %s\n" -#~ msgstr "lid %lu: insero 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 diretrio sem chave - ignorado\n" - -#~ msgid "\t%lu due to new pubkeys\n" -#~ msgstr "\t%lu devido a novas chaves pblicas\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 usurio\n" - -#~ msgid "check_trust: search dir record failed: %s\n" -#~ msgstr "check_trust: busca de registro de diretrio falhou: %s\n" - -#~ msgid "key %08lX: insert trust record failed: %s\n" -#~ msgstr "chave %08lX: insero de registro de confiana 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: verificao de confiana falhou: %s\n" - -#~ msgid "user '%s' not found: %s\n" -#~ msgstr "usurio `%s' no 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 "" -#~ "usurio `%s' no 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: usurio no 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 pblico padro\n" - -#~ msgid "can't lock keyring `%s': %s\n" -#~ msgstr "impossvel bloquear chaveiro `%s': %s\n" - -#~ msgid "%s: user not found\n" -#~ msgstr "%s: usurio no encontrado\n" - -#~ msgid "WARNING: can't yet handle long pref records\n" -#~ msgstr "" -#~ "AVISO: ainda impossvel manipular registros de preferncias longos\n" - -#~ msgid "%s: can't create keyring: %s\n" -#~ msgstr "%s: impossvel criar chaveiro: %s\n" - -#~ msgid "No key for user ID\n" -#~ msgstr "Nenhuma chave para identificador de usurio\n" - -#~ msgid "no secret key for decryption available\n" -#~ msgstr "nenhuma chave secreta para descriptografia disponvel\n" - -#~ msgid "" -#~ "RSA keys are deprecated; please consider creating a new key and use this " -#~ "key in the future\n" -#~ msgstr "" -#~ "Chaves RSA no so recomendveis; por favor considere criar uma nova " -#~ "chave e us-la no futuro\n" - -#~ msgid "set debugging flags" -#~ msgstr "definir parmetros de depurao" - -#~ msgid "enable full debugging" -#~ msgstr "habilitar depurao completa" - -#~ msgid "do not write comment packets" -#~ msgstr "no escrever pacotes de comentrio" - -#~ msgid "(default is 3)" -#~ msgstr "(o padro 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 gerao 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 sugestes 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 sugestes de %lu mas no " -#~ "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 sugestes de %lu no aponta para\n" -#~ "um registro de diretrio\n" - -#~ msgid "lid %lu: no primary key\n" -#~ msgstr "lid %lu: nenhuma chave primria\n" - -#~ msgid "lid %lu: user id not found in keyblock\n" -#~ msgstr "lid %lu: id de usurio no encontrado no bloco de chaves\n" - -#~ msgid "lid %lu: self-signature in hintlist\n" -#~ msgstr "lid %lu: auto-assinatura na lista de sugestes\n" - -#~ msgid "very strange: no public key\n" -#~ msgstr "muito estranho: nenhuma chave pblica\n" - -#~ msgid "hintlist %lu[%d] of %lu does not point to a dir record\n" -#~ msgstr "" -#~ "lista de sugestes %lu[%d] de %lu no aponta para registro de diretrio\n" - -#~ msgid "lid %lu: can't get keyblock: %s\n" -#~ msgstr "lid %lu: impossvel pegar bloco de chaves: %s\n" - -#~ msgid "Too many preference items" -#~ msgstr "Muitos itens de preferncia" - -#~ msgid "public key not anymore available" -#~ msgstr "a chave pblica no est mais disponvel" - -# 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 diretrio \"shadow\" %lu mas ainda no est\n" -#~ "marcado\n" - -#~ msgid "insert_trust_record: keyblock not found: %s\n" -#~ msgstr "insert_trust_record: bloco de chaves no encontrado: %s\n" - -#~ msgid "lid %lu: update failed: %s\n" -#~ msgstr "lid %lu: atualizao 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: atualizao 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 no encontrado: %s\n" - -#~ msgid "can't lock keyring `%': %s\n" -#~ msgstr "impossvel 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 "impossvel escrever bloco de chaves: %s\n" - -#, fuzzy -#~ msgid "encrypted message is valid\n" -#~ msgstr "algoritmo de \"digest\" selecionado no vlido\n" - -#, fuzzy -#~ msgid "Can't check MDC: %s\n" -#~ msgstr "Impossvel verificar assinatura: %s\n" - -#~ msgid "Usage: gpgm [options] [files] (-h for help)" -#~ msgstr "Uso: gpgm [opes] [arquivos] (-h para ajuda)" - -#~ msgid "usage: gpgm [options] " -#~ msgstr "Uso: gpgm [opes] " - -#, 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 diretrio 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 preferncias falhou: %s\n" - -#, fuzzy -#~ msgid "user '%s' read problem: %s\n" -#~ msgstr "erro de leitura do usurio `%s': %s\n" - -#, fuzzy -#~ msgid "user '%s' list problem: %s\n" -#~ msgstr "erro de listagem do usurio `%s': %s\n" - -#, fuzzy -#~ msgid "user '%s' not in trustdb\n" -#~ msgstr "usurio `%s' no est no banco de dados de confiabilidade\n" - -#~ msgid "directory record w/o primary key\n" -#~ msgstr "registro de diretrio sem chave primria\n" - -#~ msgid "key not in trustdb, searching ring.\n" -#~ msgstr "" -#~ "chave no encontrada no banco de dados de confiabilidade, procurando no " -#~ "chaveiro\n" - -#~ msgid "key not in ring: %s\n" -#~ msgstr "chave no 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 pblica perdida?" - -#~ msgid "did not use primary key for insert_trust_record()\n" -#~ msgstr "voc usou a chave primria para insert_trust_record()\n" - -#~ msgid "invalid clear text header: " -#~ msgstr "cabealho de texto puro invlido: " - -#~ msgid "LID %lu: changing trust from %u to %u\n" -#~ msgstr "LID %lu: mudando confiana de %u para %u\n" - -#~ msgid "LID %lu: setting trust to %u\n" -#~ msgstr "LID %lu: estabelecendo confiana para %u\n" diff --git a/po/ro.po b/po/ro.po deleted file mode 100644 index ea2e0a0ff..000000000 --- a/po/ro.po +++ /dev/null @@ -1,6993 +0,0 @@ -# Mesajele n limba romn pentru gnupg. -# Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc. -# Acest fiier este distribuit sub aceeai 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-07-28 11:12+0200\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 numr prim cu pbii=%u qbii=%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 numr prim cu mai puin de %d bii\n" - -#: cipher/random.c:173 -msgid "no entropy gathering module detected\n" -msgstr "nu a fost gsit 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:1003 g10/gpg.c:3461 g10/import.c:195 g10/keygen.c:2385 -#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:342 -#: 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 obine statistici `%s': %s\n" - -#: cipher/random.c:463 -#, c-format -msgid "`%s' is not a regular file - ignored\n" -msgstr "`%s' nu este un fiier normal - ignorat\n" - -#: cipher/random.c:468 -msgid "note: random_seed file is empty\n" -msgstr "not: fiier 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 fiierul 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: fiierul random_seed nu a fost actualizat\n" - -#: cipher/random.c:544 g10/exec.c:481 g10/gpg.c:1002 g10/keygen.c:2864 -#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:263 -#: g10/openfile.c:357 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 FOLOSII 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 rugm ateptai, este adunat entropia. Facei ceva dac v ajut s\n" -"nu v plictisii, pentru c va mbunti 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 octei aleatori. V rugm facei ceva pentru\n" -"a da sistemului de operare o ans de a colecta mai mult entropie\n" -"(Mai sunt necesari %d octei)\n" - -#: g10/app-openpgp.c:596 -#, c-format -msgid "failed to store the fingerprint: %s\n" -msgstr "am euat s stochez amprenta: %s\n" - -#: g10/app-openpgp.c:609 -#, c-format -msgid "failed to store the creation date: %s\n" -msgstr "am euat s stochez data crerii: %s\n" - -#: g10/app-openpgp.c:977 -#, c-format -msgid "reading public key failed: %s\n" -msgstr "citirea cheii publice a euat: %s\n" - -#: g10/app-openpgp.c:985 g10/app-openpgp.c:1910 -msgid "response does not contain the public key data\n" -msgstr "rspunsul nu conine datele cheii publice\n" - -#: g10/app-openpgp.c:993 g10/app-openpgp.c:1918 -msgid "response does not contain the RSA modulus\n" -msgstr "rspunsul nu conine modulul RSA\n" - -#: g10/app-openpgp.c:1002 g10/app-openpgp.c:1928 -msgid "response does not contain the RSA public exponent\n" -msgstr "rspunsul nu conine 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 euat: %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 strii 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 ncercri PIN Admin rmase 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 obinere 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 aplicaiei\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 lipsete\n" - -#: g10/app-openpgp.c:1742 -#, c-format -msgid "RSA modulus missing or not of size %d bits\n" -msgstr "modulus-ul RSA lipsete sau nu are %d bii\n" - -#: g10/app-openpgp.c:1749 -#, fuzzy, c-format -msgid "RSA public exponent missing or larger than %d bits\n" -msgstr "exponentul public RSA lipsete sau are mai mult de %d bii\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 lipsete sau nu are %d bii\n" - -#: g10/app-openpgp.c:1827 -#, c-format -msgid "failed to store the key: %s\n" -msgstr "am euat s stochez cheia: %s\n" - -#: g10/app-openpgp.c:1886 -msgid "please wait while key is being generated ...\n" -msgstr "v rugm ateptai ct vreme este creat noua cheie ...\n" - -#: g10/app-openpgp.c:1901 -msgid "generating key failed\n" -msgstr "generarea cheii a euat\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 "semntur %s, algoritm rezumat %s\n" - -#: g10/app-openpgp.c:2134 -#, c-format -msgid "signatures created so far: %lu\n" -msgstr "semnturi create pn acum: %lu\n" - -#: g10/app-openpgp.c:2142 -#, c-format -msgid "||Please enter the PIN%%0A[sigs done: %lu]" -msgstr "||V rugm introducei PIN%%0A[semnturi fcute: %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:320 -#, c-format -msgid "armor: %s\n" -msgstr "armur: %s\n" - -#: g10/armor.c:359 -msgid "invalid armor header: " -msgstr "header armur invalid: " - -#: g10/armor.c:370 -msgid "armor header: " -msgstr "header armur: " - -#: g10/armor.c:381 -msgid "invalid clearsig header\n" -msgstr "header clearsig invalid\n" - -#: g10/armor.c:433 -msgid "nested clear text signatures\n" -msgstr "semnturi text n clar ncuibrite\n" - -#: g10/armor.c:568 -msgid "unexpected armor: " -msgstr "armur neateptat: " - -#: g10/armor.c:580 -msgid "invalid dash escaped line: " -msgstr "linie cu liniu escape invalid: " - -#: g10/armor.c:734 g10/armor.c:1343 -#, c-format -msgid "invalid radix64 character %02X skipped\n" -msgstr "caracter radix64 invalid %02X srit\n" - -#: g10/armor.c:777 -msgid "premature eof (no CRC)\n" -msgstr "eof prematur (nici un CRC)\n" - -#: g10/armor.c:811 -msgid "premature eof (in CRC)\n" -msgstr "eof prematur (n CRC)\n" - -#: g10/armor.c:819 -msgid "malformed CRC\n" -msgstr "CRC anormal\n" - -#: g10/armor.c:823 g10/armor.c:1380 -#, c-format -msgid "CRC error; %06lX - %06lX\n" -msgstr "eroare CRC; %06lX - %06lX\n" - -#: g10/armor.c:843 -msgid "premature eof (in trailer)\n" -msgstr "eof prematur (n trailer)\n" - -#: g10/armor.c:847 -msgid "error in trailer line\n" -msgstr "eroare linia de trailer\n" - -#: g10/armor.c:1158 -msgid "no valid OpenPGP data found.\n" -msgstr "nici o dat OpenPGP valid gsit.\n" - -#: g10/armor.c:1163 -#, c-format -msgid "invalid armor: line longer than %d characters\n" -msgstr "armur invalid: linie mai lung de %d caractere\n" - -#: g10/armor.c:1167 -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 "Selecia 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 "neforat()" - -#: g10/card-util.c:441 -msgid "forced" -msgstr "forat()" - -#: 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: Spaiile 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:280 -#, 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 "Preferine limb: " - -#: g10/card-util.c:802 -msgid "Error: invalid length of preference string.\n" -msgstr "Eroare: lungime invalid pentru ir preferine.\n" - -#: g10/card-util.c:811 -msgid "Error: invalid characters in preference string.\n" -msgstr "Eroare: caractere invalide n ir preferine.\n" - -#: g10/card-util.c:832 -msgid "Sex ((M)ale, (F)emale or space): " -msgstr "Sex ((M)asculin, (F)eminin sau spaiu): " - -#: g10/card-util.c:846 -msgid "Error: invalid response.\n" -msgstr "Eroare: rspuns 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 "operaia 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 obinerea informaiei 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 rugm s observai c setrile din fabric ale PIN-urilor sunt\n" -" PIN = `%s' PIN Admin = `%s'\n" -"Ar trebui s le schimbai folosind comanda --change-pin\n" - -#: g10/card-util.c:1123 -msgid "Please select the type of key to generate:\n" -msgstr "V rugm selectai 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 "Selecie invalid.\n" - -#: g10/card-util.c:1203 -msgid "Please select where to store the key:\n" -msgstr "V rugm selectai unde s fie stocat cheia:\n" - -#: g10/card-util.c:1238 -msgid "unknown key protection algorithm\n" -msgstr "algoritm de protecie a cheii necunoscut\n" - -#: g10/card-util.c:1243 -msgid "secret parts of key are not available\n" -msgstr "pri 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 "iei 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 "afieaz acest mesaj" - -#: g10/card-util.c:1324 -msgid "list all available data" -msgstr "afieaz toate datele disponibile" - -#: g10/card-util.c:1327 -msgid "change card holder's name" -msgstr "schimb numele purttorului 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 preferinele de limb" - -#: g10/card-util.c:1332 -msgid "change card holder's sex" -msgstr "schimb sexul purttorului 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 forare a semnturii" - -#: 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 (ncercai \"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 rugm introducei cardul i apsai return sau apsai 'c' pentru a " -"renuna: " - -#: g10/cardglue.c:446 -#, fuzzy, c-format -msgid "selecting openpgp failed: %s\n" -msgstr "stergere keyblock a euat: %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 rugm scoatei cardul curent i introducai unul cu numr de serie:\n" -" %.*s\n" - -#: g10/cardglue.c:582 -msgid "Hit return when ready or enter 'c' to cancel: " -msgstr "Apsai return cnd suntei gata sau apsai 'c' pentru a renuna: " - -#: g10/cardglue.c:917 -msgid "Enter New Admin PIN: " -msgstr "Introducei noul PIN Admin: " - -#: g10/cardglue.c:918 -msgid "Enter New PIN: " -msgstr "introducei noul PIN: " - -#: g10/cardglue.c:919 -msgid "Enter Admin PIN: " -msgstr "Introducei PIN Admin: " - -#: g10/cardglue.c:920 -msgid "Enter PIN: " -msgstr "Introducei PIN: " - -#: g10/cardglue.c:937 -msgid "Repeat this PIN: " -msgstr "Repetai acest PIN: " - -#: g10/cardglue.c:952 -msgid "PIN not correctly repeated; try again" -msgstr "PIN-ul nu a fost repetat corect; mai ncercai o dat" - -#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3826 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:3387 g10/keyserver.c:1700 -#: g10/revoke.c:228 -#, c-format -msgid "key \"%s\" not found: %s\n" -msgstr "cheia \"%s\" nu a fost gsit: %s\n" - -#: g10/delkey.c:83 g10/export.c:341 g10/import.c:2349 g10/keyserver.c:1714 -#: 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 specificai 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 fr \"--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 dorii s o tergei? (d/N) " - -#: g10/delkey.c:165 -#, c-format -msgid "deleting keyblock failed: %s\n" -msgstr "stergere keyblock a euat: %s\n" - -#: g10/delkey.c:175 -msgid "ownertrust information cleared\n" -msgstr "informaii ncredere-proprietar curate\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 "" -"folosii opiunea \"--delete-secret-keys\" pentru a o terge pe aceasta mai " -"nti.\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 fiier 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 putei cifra numai cu chei RSA de 2048 bii sau mai puin\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 cifrai.\n" - -#: g10/encode.c:518 -#, c-format -msgid "" -"WARNING: forcing symmetric cipher %s (%d) violates recipient preferences\n" -msgstr "" -"AVERTISMENT: fornd cifrul simetric %s (%d) violai preferinele " -"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: fornd algoritmul de compresie %s (%d) violai preferinele " -"destinatarului\n" - -#: g10/encode.c:715 -#, c-format -msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n" -msgstr "fornd cifrul simetric %s (%d) violai preferinele 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 putei folosi %s ct 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:67 g10/mainproc.c:293 -#, c-format -msgid "%s encrypted data\n" -msgstr "%s date cifrate\n" - -#: g10/encr-data.c:69 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:93 -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:104 -msgid "problem handling encrypted packet\n" -msgstr "problem cu mnuirea pachetului cifrat\n" - -#: g10/exec.c:49 -msgid "no remote program execution supported\n" -msgstr "nu este suportat execuia nici unui program la distan\n" - -#: g10/exec.c:176 g10/openfile.c:415 -#, 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 opiunilor nesigure " -"pentru permisiunile fiierului\n" - -#: g10/exec.c:347 -msgid "this platform requires temporary files when calling external programs\n" -msgstr "" -"aceast platform necesit fiiere temporare cnd 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 "ieire 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 rspunsul 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 fiierul 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 "Semntura 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 gsit 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 - srit\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 - srit\n" - -#: g10/export.c:373 -#, fuzzy, c-format -msgid "key %s: key material on-card - skipped\n" -msgstr "cheia %s: semntur subcheie ntr-un loc greit - srit\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 euat 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:375 -msgid "" -"@Commands:\n" -" " -msgstr "" -"@Comenzi:\n" -" " - -#: g10/gpg.c:377 -msgid "|[file]|make a signature" -msgstr "|[fiier]|creaz o semntur" - -#: g10/gpg.c:378 -msgid "|[file]|make a clear text signature" -msgstr "|[fiier]|creaz o semntur text n clar" - -#: g10/gpg.c:379 -msgid "make a detached signature" -msgstr "creaz o semntur detaat" - -#: g10/gpg.c:380 -msgid "encrypt data" -msgstr "cifreaz datele" - -#: g10/gpg.c:382 -msgid "encryption only with symmetric cipher" -msgstr "cifreaz numai cu cifru simetric" - -#: g10/gpg.c:384 -msgid "decrypt data (default)" -msgstr "decripteaz datele (implicit)" - -#: g10/gpg.c:386 -msgid "verify a signature" -msgstr "verific o semntur" - -#: g10/gpg.c:388 -msgid "list keys" -msgstr "enumer chei" - -#: g10/gpg.c:390 -msgid "list keys and signatures" -msgstr "enumer chei i semnturi" - -#: g10/gpg.c:391 -msgid "list and check key signatures" -msgstr "enumer i verific semnturile cheii" - -#: g10/gpg.c:392 -msgid "list keys and fingerprints" -msgstr "enumer chei i amprente" - -#: g10/gpg.c:393 -msgid "list secret keys" -msgstr "enumer chei secrete" - -#: g10/gpg.c:394 -msgid "generate a new key pair" -msgstr "genereaz o nou perechi de chei" - -#: g10/gpg.c:395 -msgid "remove keys from the public keyring" -msgstr "terge chei de pe inelul de chei public" - -#: g10/gpg.c:397 -msgid "remove keys from the secret keyring" -msgstr "terge chei de pe inelul de chei secret" - -#: g10/gpg.c:398 -msgid "sign a key" -msgstr "semneaz o cheie" - -#: g10/gpg.c:399 -msgid "sign a key locally" -msgstr "semneaz o cheie local" - -#: g10/gpg.c:400 -msgid "sign or edit a key" -msgstr "semneaz sau editeaz o cheie" - -#: g10/gpg.c:401 -msgid "generate a revocation certificate" -msgstr "genereaz un certificat de revocare" - -#: g10/gpg.c:403 -msgid "export keys" -msgstr "export chei" - -#: g10/gpg.c:404 -msgid "export keys to a key server" -msgstr "export chei pentru un server de chei" - -#: g10/gpg.c:405 -msgid "import keys from a key server" -msgstr "import chei de la un server de chei" - -#: g10/gpg.c:407 -msgid "search for keys on a key server" -msgstr "caut pentru chei pe un server de chei" - -#: g10/gpg.c:409 -msgid "update all keys from a keyserver" -msgstr "actualizeaz toate cheile de la un server de chei" - -#: g10/gpg.c:413 -msgid "import/merge keys" -msgstr "import/combin chei" - -#: g10/gpg.c:416 -msgid "print the card status" -msgstr "afieaz starea cardului" - -#: g10/gpg.c:417 -msgid "change data on a card" -msgstr "schimb data de pe card" - -#: g10/gpg.c:418 -msgid "change a card's PIN" -msgstr "schimb PIN-ul unui card" - -#: g10/gpg.c:426 -msgid "update the trust database" -msgstr "actualizeaz baza de date de ncredere" - -#: g10/gpg.c:433 -msgid "|algo [files]|print message digests" -msgstr "|algo [fiiere]|afieaz rezumate mesaje" - -#: g10/gpg.c:437 g10/gpgv.c:71 -msgid "" -"@\n" -"Options:\n" -" " -msgstr "" -"@\n" -"Opiuni:\n" -" " - -#: g10/gpg.c:439 -msgid "create ascii armored output" -msgstr "creaz ieire n armur ascii" - -#: g10/gpg.c:441 -msgid "|NAME|encrypt for NAME" -msgstr "|NUME|cifrare pentru NUME" - -#: g10/gpg.c:452 -msgid "use this user-id to sign or decrypt" -msgstr "folosete acest id-utilizator pentru a semna sau decripta" - -#: g10/gpg.c:453 -msgid "|N|set compress level N (0 disables)" -msgstr "|N|seteaz nivel de compresie N (0 deactiveaz)" - -#: g10/gpg.c:458 -msgid "use canonical text mode" -msgstr "folosete modul text canonic" - -#: g10/gpg.c:472 -msgid "use as output file" -msgstr "folosete ca fiier ieire" - -#: g10/gpg.c:474 g10/gpgv.c:73 -msgid "verbose" -msgstr "locvace" - -#: g10/gpg.c:485 -msgid "do not make any changes" -msgstr "nu face nici o schimbare" - -#: g10/gpg.c:486 -msgid "prompt before overwriting" -msgstr "ntreab nainte de a suprascrie" - -#: g10/gpg.c:527 -msgid "use strict OpenPGP behavior" -msgstr "folosete comportament strict OpenPGP" - -#: g10/gpg.c:528 -msgid "generate PGP 2.x compatible messages" -msgstr "genereaz mesaje compatibile cu PGP 2.x" - -#: g10/gpg.c:556 -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 opiunilor)\n" - -#: g10/gpg.c:559 -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 [fiier] semneaz i cifreaz pentru utilizatorul Dan\n" -" --clearsign [fiier] creaz o semntur text n clar\n" -" --detach-sign [fiier] creaz o semntur detaat\n" -" --list-keys [nume] arat chei\n" -" --fingerprint [nume] arat amprente\n" - -#: g10/gpg.c:757 g10/gpgv.c:98 -msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n" -msgstr "Raportai bug-uri la <gnupg-bugs@gnu.org>.\n" - -#: g10/gpg.c:774 -msgid "Usage: gpg [options] [files] (-h for help)" -msgstr "Folosire: gpg [opiuni] [fiiere] (-h pentru ajutor)" - -#: g10/gpg.c:777 -msgid "" -"Syntax: gpg [options] [files]\n" -"sign, check, encrypt or decrypt\n" -"default operation depends on the input data\n" -msgstr "" -"Sintax: gpg [opiuni] [fiiere]\n" -"sign, check, encrypt sau decrypt\n" -"operaiunea implicit depinde de datele de intrare\n" - -#: g10/gpg.c:788 -msgid "" -"\n" -"Supported algorithms:\n" -msgstr "" -"\n" -"Algoritmuri suportate:\n" - -#: g10/gpg.c:791 -msgid "Pubkey: " -msgstr "Pubkey: " - -#: g10/gpg.c:797 g10/keyedit.c:2310 -msgid "Cipher: " -msgstr "Cifru: " - -#: g10/gpg.c:803 -msgid "Hash: " -msgstr "Hash: " - -#: g10/gpg.c:809 g10/keyedit.c:2356 -msgid "Compression: " -msgstr "Compresie: " - -#: g10/gpg.c:892 -msgid "usage: gpg [options] " -msgstr "folosire: gpg [opiuni] " - -#: g10/gpg.c:1040 -msgid "conflicting commands\n" -msgstr "comenzi n conflict\n" - -#: g10/gpg.c:1058 -#, c-format -msgid "no = sign found in group definition `%s'\n" -msgstr "nu am gsit nici un semn = n definiia grupului `%s'\n" - -#: g10/gpg.c:1255 -#, c-format -msgid "WARNING: unsafe ownership on homedir `%s'\n" -msgstr "" -"AVERTISMENT: proprietate nesigur (unsafe) pentru directorul home `%s'\n" - -#: g10/gpg.c:1258 -#, c-format -msgid "WARNING: unsafe ownership on configuration file `%s'\n" -msgstr "" -"AVERTISMENT: proprietate nesigur (unsafe) pentru fiier configurare `%s'\n" - -#: g10/gpg.c:1261 -#, c-format -msgid "WARNING: unsafe ownership on extension `%s'\n" -msgstr "AVERTISMENT: proprietate nesigur (unsafe) pentru extensia `%s'\n" - -#: g10/gpg.c:1267 -#, c-format -msgid "WARNING: unsafe permissions on homedir `%s'\n" -msgstr "" -"AVERTISMENT: permisiuni nesigure (unsafe) pentru directorul home `%s'\n" - -#: g10/gpg.c:1270 -#, c-format -msgid "WARNING: unsafe permissions on configuration file `%s'\n" -msgstr "" -"AVERTISMENT: permisiuni nesigure (unsafe) pentru fiier configurare `%s'\n" - -#: g10/gpg.c:1273 -#, c-format -msgid "WARNING: unsafe permissions on extension `%s'\n" -msgstr "AVERTISMENT: permisiuni nesigure (unsafe) pentru extensia `%s'\n" - -#: g10/gpg.c:1279 -#, 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:1282 -#, c-format -msgid "" -"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n" -msgstr "" -"AVERTISMENT: proprietate director incluziuni nesigur (unsafe) pentru fiier " -"configurare `%s'\n" - -#: g10/gpg.c:1285 -#, 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:1291 -#, 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:1294 -#, c-format -msgid "" -"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n" -msgstr "" -"AVERTISMENT: permisiuni director incluziuni nesigure (unsafe) pentru fiier " -"configurare `%s'\n" - -#: g10/gpg.c:1297 -#, 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:1438 -#, c-format -msgid "unknown configuration item `%s'\n" -msgstr "articol configurare necunoscut `%s'\n" - -#: g10/gpg.c:1531 -msgid "display photo IDs during key listings" -msgstr "" - -#: g10/gpg.c:1533 -msgid "show policy URLs during signature listings" -msgstr "" - -#: g10/gpg.c:1535 -#, fuzzy -msgid "show all notations during signature listings" -msgstr "Nici o semntur corespunztoare n inelul secret\n" - -#: g10/gpg.c:1537 -msgid "show IETF standard notations during signature listings" -msgstr "" - -#: g10/gpg.c:1541 -msgid "show user-supplied notations during signature listings" -msgstr "" - -#: g10/gpg.c:1543 -#, fuzzy -msgid "show preferred keyserver URLs during signature listings" -msgstr "URL-ul serverului de chei preferat furnizat este invalid\n" - -#: g10/gpg.c:1545 -msgid "show user ID validity during key listings" -msgstr "" - -#: g10/gpg.c:1547 -msgid "show revoked and expired user IDs in key listings" -msgstr "" - -#: g10/gpg.c:1549 -msgid "show revoked and expired subkeys in key listings" -msgstr "" - -#: g10/gpg.c:1551 -#, fuzzy -msgid "show the keyring name in key listings" -msgstr "arat cruia dintre inelele de chei i aparine o cheie enumerat" - -#: g10/gpg.c:1553 -#, fuzzy -msgid "show expiration dates during signature listings" -msgstr "Nici o semntur corespunztoare n inelul secret\n" - -#: g10/gpg.c:1920 -#, c-format -msgid "NOTE: old default options file `%s' ignored\n" -msgstr "NOT: fisier opiuni implicite vechi `%s' ignorat\n" - -#: g10/gpg.c:1962 -#, c-format -msgid "NOTE: no default option file `%s'\n" -msgstr "NOT: nici un fiier opiuni implicit `%s'\n" - -#: g10/gpg.c:1966 -#, c-format -msgid "option file `%s': %s\n" -msgstr "fiier opiuni `%s': %s\n" - -#: g10/gpg.c:1973 -#, c-format -msgid "reading options from `%s'\n" -msgstr "citesc opiuni din `%s'\n" - -#: g10/gpg.c:2188 g10/gpg.c:2814 g10/gpg.c:2833 -#, c-format -msgid "NOTE: %s is not for normal use!\n" -msgstr "NOT: %s nu este pentru o folosire normal!\n" - -#: g10/gpg.c:2201 -#, c-format -msgid "cipher extension `%s' not loaded due to unsafe permissions\n" -msgstr "" -"extensie cifru `%s' nu a fost ncrcat din cauza permisiunilor nesigure " -"(unsafe)\n" - -#: g10/gpg.c:2364 g10/gpg.c:2376 -#, c-format -msgid "`%s' is not a valid signature expiration\n" -msgstr "`%s' nu este expirare de semntur valid\n" - -#: g10/gpg.c:2452 -#, c-format -msgid "`%s' is not a valid character set\n" -msgstr "`%s' nu este un set de carectere valid\n" - -# -#: g10/gpg.c:2476 g10/gpg.c:2663 g10/keyedit.c:4064 -msgid "could not parse keyserver URL\n" -msgstr "nu am putut interpreta URL-ul serverului de chei\n" - -#: g10/gpg.c:2488 -#, c-format -msgid "%s:%d: invalid keyserver options\n" -msgstr "%s:%d: opiuni server de chei invalide\n" - -#: g10/gpg.c:2491 -msgid "invalid keyserver options\n" -msgstr "opiuni server de chei invalide\n" - -#: g10/gpg.c:2498 -#, c-format -msgid "%s:%d: invalid import options\n" -msgstr "%s:%d: opiuni import invalide\n" - -#: g10/gpg.c:2501 -msgid "invalid import options\n" -msgstr "opiuni import invalide\n" - -#: g10/gpg.c:2508 -#, c-format -msgid "%s:%d: invalid export options\n" -msgstr "%s:%d: opiuni export invalide\n" - -#: g10/gpg.c:2511 -msgid "invalid export options\n" -msgstr "opiuni export invalide\n" - -#: g10/gpg.c:2518 -#, c-format -msgid "%s:%d: invalid list options\n" -msgstr "%s:%d: opiuni enumerare invalide\n" - -#: g10/gpg.c:2521 -msgid "invalid list options\n" -msgstr "opiuni enumerare invalide\n" - -#: g10/gpg.c:2529 -msgid "display photo IDs during signature verification" -msgstr "" - -#: g10/gpg.c:2531 -msgid "show policy URLs during signature verification" -msgstr "" - -#: g10/gpg.c:2533 -#, fuzzy -msgid "show all notations during signature verification" -msgstr "`%s' nu este expirare de semntur valid\n" - -#: g10/gpg.c:2535 -msgid "show IETF standard notations during signature verification" -msgstr "" - -#: g10/gpg.c:2539 -msgid "show user-supplied notations during signature verification" -msgstr "" - -#: g10/gpg.c:2541 -#, fuzzy -msgid "show preferred keyserver URLs during signature verification" -msgstr "URL-ul serverului de chei preferat furnizat este invalid\n" - -#: g10/gpg.c:2543 -#, fuzzy -msgid "show user ID validity during signature verification" -msgstr "`%s' nu este expirare de semntur valid\n" - -#: g10/gpg.c:2545 -msgid "show revoked and expired user IDs in signature verification" -msgstr "" - -#: g10/gpg.c:2547 -msgid "validate signatures with PKA data" -msgstr "" - -#: g10/gpg.c:2549 -msgid "elevate the trust of signatures with valid PKA data" -msgstr "" - -#: g10/gpg.c:2556 -#, c-format -msgid "%s:%d: invalid verify options\n" -msgstr "%s:%d: opiuni verificare invalide\n" - -#: g10/gpg.c:2559 -msgid "invalid verify options\n" -msgstr "opiuni verificare invalide\n" - -#: g10/gpg.c:2566 -#, c-format -msgid "unable to set exec-path to %s\n" -msgstr "nu pot seta cale-execuie ca %s\n" - -#: g10/gpg.c:2729 -#, fuzzy, c-format -msgid "%s:%d: invalid auto-key-locate list\n" -msgstr "%s:%d: opiuni verificare invalide\n" - -#: g10/gpg.c:2732 -msgid "invalid auto-key-locate list\n" -msgstr "" - -#: g10/gpg.c:2803 -msgid "WARNING: program may create a core file!\n" -msgstr "AVERTISMENT: programul ar putea crea un fiier core!\n" - -#: g10/gpg.c:2807 -#, c-format -msgid "WARNING: %s overrides %s\n" -msgstr "AVERTISMENT: %s nlocuiete %s\n" - -#: g10/gpg.c:2816 -#, c-format -msgid "%s not allowed with %s!\n" -msgstr "%s nu este permis cu %s!\n" - -#: g10/gpg.c:2819 -#, c-format -msgid "%s makes no sense with %s!\n" -msgstr "%s nu are sens cu %s!\n" - -#: g10/gpg.c:2826 -#, 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:2841 -#, 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:2855 -msgid "you can only make detached or clear signatures while in --pgp2 mode\n" -msgstr "" -"putei crea doar semnturi detaate sau n clar ct vreme suntei n modul " -"--pgp2\n" - -#: g10/gpg.c:2861 -msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n" -msgstr "" -"nu putei semna i cifra n acelai timp ct vreme suntei n modul --pgp2\n" - -#: g10/gpg.c:2867 -msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n" -msgstr "" -"trebuie s folosii fiiere (i nu un pipe) cnd lucrai cu modul --pgp2 " -"activat.\n" - -#: g10/gpg.c:2880 -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:2947 g10/gpg.c:2971 -msgid "selected cipher algorithm is invalid\n" -msgstr "algoritm cifrare selectat este invalid\n" - -#: g10/gpg.c:2953 g10/gpg.c:2977 -msgid "selected digest algorithm is invalid\n" -msgstr "algoritm rezumat selectat este invalid\n" - -#: g10/gpg.c:2959 -msgid "selected compression algorithm is invalid\n" -msgstr "algoritm compresie selectat este invalid\n" - -#: g10/gpg.c:2965 -msgid "selected certification digest algorithm is invalid\n" -msgstr "algoritm rezumat certificare selectat este invalid\n" - -#: g10/gpg.c:2980 -msgid "completes-needed must be greater than 0\n" -msgstr "completes-needed trebuie s fie mai mare dect 0\n" - -#: g10/gpg.c:2982 -msgid "marginals-needed must be greater than 1\n" -msgstr "marginals-needed trebuie s fie mai mare dect 1\n" - -#: g10/gpg.c:2984 -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:2986 -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:2988 -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:2991 -msgid "NOTE: simple S2K mode (0) is strongly discouraged\n" -msgstr "NOT: modul S2K simplu (0) este contraindicat cu insisten\n" - -#: g10/gpg.c:2995 -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:3002 -msgid "invalid default preferences\n" -msgstr "preferine implicite invalide\n" - -#: g10/gpg.c:3011 -msgid "invalid personal cipher preferences\n" -msgstr "preferine cifrare personale invalide\n" - -#: g10/gpg.c:3015 -msgid "invalid personal digest preferences\n" -msgstr "preferine rezumat personale invalide\n" - -#: g10/gpg.c:3019 -msgid "invalid personal compress preferences\n" -msgstr "preferine compresie personale invalide\n" - -#: g10/gpg.c:3052 -#, c-format -msgid "%s does not yet work with %s\n" -msgstr "%s nu merge nc cu %s!\n" - -#: g10/gpg.c:3099 -#, c-format -msgid "you may not use cipher algorithm `%s' while in %s mode\n" -msgstr "nu putei folosi algoritmul de cifrare `%s' ct vreme n modul %s\n" - -#: g10/gpg.c:3104 -#, c-format -msgid "you may not use digest algorithm `%s' while in %s mode\n" -msgstr "nu putei folosi algorimul de rezumat `%s' ct vreme n modul %s\n" - -#: g10/gpg.c:3109 -#, c-format -msgid "you may not use compression algorithm `%s' while in %s mode\n" -msgstr "nu putei folosi algoritmul de compresie `%s' ct vreme n modul %s\n" - -#: g10/gpg.c:3208 -#, c-format -msgid "failed to initialize the TrustDB: %s\n" -msgstr "am euat s iniializez TrustDB:%s\n" - -#: g10/gpg.c:3219 -msgid "WARNING: recipients (-r) given without using public key encryption\n" -msgstr "" -"AVERTISMENT: destinatari (-r) furnizai fr a folosi cifrare cu cheie " -"public\n" - -#: g10/gpg.c:3230 -msgid "--store [filename]" -msgstr "--store [nume_fiier]" - -#: g10/gpg.c:3237 -msgid "--symmetric [filename]" -msgstr "--symmetric [nume_fiier]" - -#: g10/gpg.c:3239 -#, c-format -msgid "symmetric encryption of `%s' failed: %s\n" -msgstr "cifrarea simetric a lui `%s' a euat: %s\n" - -#: g10/gpg.c:3249 -msgid "--encrypt [filename]" -msgstr "--encrypt [nume_fiier]" - -#: g10/gpg.c:3262 -msgid "--symmetric --encrypt [filename]" -msgstr "--symmetric --encrypt [nume_fiier]" - -#: g10/gpg.c:3264 -msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n" -msgstr "nu putei folosi --symmetric --encrypt cu --s2k-mode 0\n" - -#: g10/gpg.c:3267 -#, c-format -msgid "you cannot use --symmetric --encrypt while in %s mode\n" -msgstr "nu putei folosi --symmetric --encrypt ct vreme n modul %s\n" - -#: g10/gpg.c:3285 -msgid "--sign [filename]" -msgstr "--sign [nume_fiier]" - -#: g10/gpg.c:3298 -msgid "--sign --encrypt [filename]" -msgstr "--sign --encrypt [nume_fiier]" - -#: g10/gpg.c:3313 -msgid "--symmetric --sign --encrypt [filename]" -msgstr "--symmetric --sign --encrypt [nume_fiier]" - -#: g10/gpg.c:3315 -msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n" -msgstr "nu putei folosi --symmetric --sign --encrypt cu --s2k-mode 0\n" - -#: g10/gpg.c:3318 -#, c-format -msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n" -msgstr "nu putei folosi --symmetric --sign --encrypt ct vreme n modul %s\n" - -#: g10/gpg.c:3338 -msgid "--sign --symmetric [filename]" -msgstr "--sign --symmetric [nume_fiier]" - -#: g10/gpg.c:3347 -msgid "--clearsign [filename]" -msgstr "--clearsign [nume_fiier]" - -#: g10/gpg.c:3372 -msgid "--decrypt [filename]" -msgstr "--decrypt [nume_fiier]" - -#: g10/gpg.c:3380 -msgid "--sign-key user-id" -msgstr "--sign-key id-utilizator" - -#: g10/gpg.c:3384 -msgid "--lsign-key user-id" -msgstr "--lsign-key id-utilizator" - -#: g10/gpg.c:3405 -msgid "--edit-key user-id [commands]" -msgstr "--edit-key id-utilizator [comenzi]" - -#: g10/gpg.c:3476 -msgid "-k[v][v][v][c] [user-id] [keyring]" -msgstr "-k[v][v][v][c] [id-utilizator] [inel_chei]" - -#: g10/gpg.c:3518 -#, c-format -msgid "keyserver send failed: %s\n" -msgstr "trimitere server de chei euat: %s\n" - -#: g10/gpg.c:3520 -#, c-format -msgid "keyserver receive failed: %s\n" -msgstr "recepie server de chei euat: %s\n" - -#: g10/gpg.c:3522 -#, c-format -msgid "key export failed: %s\n" -msgstr "export cheie euat: %s\n" - -#: g10/gpg.c:3533 -#, c-format -msgid "keyserver search failed: %s\n" -msgstr "cutare server de chei euat: %s\n" - -#: g10/gpg.c:3543 -#, c-format -msgid "keyserver refresh failed: %s\n" -msgstr "actualizare server de chei euat: %s\n" - -#: g10/gpg.c:3594 -#, c-format -msgid "dearmoring failed: %s\n" -msgstr "eliminarea armurii a euat: %s\n" - -#: g10/gpg.c:3602 -#, c-format -msgid "enarmoring failed: %s\n" -msgstr "punerea armurii a euat: %s\n" - -#: g10/gpg.c:3689 -#, c-format -msgid "invalid hash algorithm `%s'\n" -msgstr "algoritm hash invalid `%s'\n" - -#: g10/gpg.c:3812 -msgid "[filename]" -msgstr "[nume_fiier]" - -#: g10/gpg.c:3816 -msgid "Go ahead and type your message ...\n" -msgstr "Dai-i drumul i scriei mesajul ...\n" - -#: g10/gpg.c:4120 -msgid "the given certification policy URL is invalid\n" -msgstr "URL-ul politicii de certificare furnizat este invalid\n" - -#: g10/gpg.c:4122 -msgid "the given signature policy URL is invalid\n" -msgstr "URL-ul politicii de semnturi furnizat este invalid\n" - -#: g10/gpg.c:4155 -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 intrri n cache-ul pk - deactivat\n" - -#: g10/getkey.c:175 -msgid "[User ID not found]" -msgstr "[ID utilizator nu a fost gsit]" - -#: 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 fcut valid de --allow-non-selfsigned-uid\n" - -#: g10/getkey.c:2380 g10/keyedit.c:3707 -#, 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 fr cheie public - srit\n" - -#: g10/gpgv.c:74 -msgid "be somewhat more quiet" -msgstr "fii oarecum mai tcut" - -#: 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 informaii de stare n acest FD" - -#: g10/gpgv.c:102 -msgid "Usage: gpgv [options] [files] (-h for help)" -msgstr "Folosire: gpgv [opiuni] [fiiere] (-h pentru ajutor)" - -#: g10/gpgv.c:105 -msgid "" -"Syntax: gpg [options] [files]\n" -"Check signatures against known trusted keys\n" -msgstr "" -"Sintax: gpg [opiuni] [fiiere]\n" -"Verific semnturi 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 atribuii o valoare aici; aceast valoare\n" -"nu va fi niciodat exportat pentru o ter parte. Trebuie s\n" -"implementm reeaua-de-ncredere; aceasta nu are nimic n comun cu\n" -"certificatele-de-reea (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 Reeaua-de-ncredere, GnuPG trebuie s tie care chei\n" -"au nivel de ncredere suprem - acestea de obicei sunt cheile pentru care\n" -"avei acces la cheia secret. Rspundei \"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 dorii oricum s folosii aceast cheie fr ncredere, rspundei \"da" -"\"." - -#: g10/helptext.c:66 -msgid "" -"Enter the user ID of the addressee to whom you want to send the message." -msgstr "Introducei 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 "" -"Selectai algoritmul de folosit.\n" -"\n" -"DSA (aka DSS) este Digital Signature Algorithm i poate fi folosit numai\n" -"pentru semnturi.\n" -"\n" -"Elgamal este un algoritm numai pentru cifrare.\n" -"\n" -"RSA poate fi folosit pentru semnturi 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 folosii aceeai cheie i pentru\n" -"semnare i pentru cifrare. Acest algoritm ar trebui folosit numai\n" -"n anumite domenii. V rugm consultai mai nti un expert n domeniu." - -#: g10/helptext.c:91 -msgid "Enter the size of the key" -msgstr "Introducei 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 "Rspundei \"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 "" -"Introducei valoarea cerut precum a artat la prompt.\n" -"Este posibil s introducei o dat ISO (AAAA-LL-ZZ) dar nu vei\n" -"obine un rspuns 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 "Introducei numele deintorului cheii" - -#: g10/helptext.c:122 -msgid "please enter an optional but highly suggested email address" -msgstr "v rugm introducei o adres de email (opional dar recomandat)" - -#: g10/helptext.c:126 -msgid "Please enter an optional comment" -msgstr "V rugm introducei un comentriu opional" - -#: 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 "" -"Rspundei \"da\" (sau numai \"d\") dac suntei OK s generai 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 "" -"Cnd semnai un ID utilizator pe o cheie ar trebui s verificai mai nti\n" -"c cheia aparine persoanei numite n ID-ul utilizator. Este util i " -"altora\n" -"s tie ct de atent ai verificat acest lucru.\n" -"\n" -"\"0\" nseamn c nu pretindei nimic despre ct de atent ai verificat " -"cheia\n" -"\"1\" nseamn c credei c cheia este a persoanei ce pretinde c este\n" -" proprietarul ei, dar n-ai putut, sau nu ai verificat deloc cheia.\n" -" Aceasta este util pentru verificare \"persona\", unde semnai cheia\n" -" unui utilizator pseudonim.\n" -"\n" -"\"2\" nseamn c ai fcut o verificare supericial a cheii. De exemplu,\n" -" aceasta ar putea nsemna c ai verificat amprenta cheii i ai " -"verificat\n" -" ID-ul utilizator de pe cheie cu un ID cu poz.\n" -"\n" -"\"3\" nseamn c ai fcut o verificare extensiv a cheii. De exemplu,\n" -" aceasta ar putea nsemna c ai verificat amprenta cheii cu " -"proprietarul\n" -" cheii n persoan, c ai verificat folosind un document dificil de\n" -" falsificat cu poz (cum ar fi un paaport) c numele proprietarului " -"cheii\n" -" este acelai cu numele ID-ului utilizator al cheii i c ai verificat\n" -" (schimbnd emailuri) c adresa de email de pe cheie aparine " -"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 decidei ce nseamn \"superficial\" i\n" -"\"extensiv\" pentru d-voastr cnd semnai alte chei.\n" -"\n" -"Dac nu tii care este rspunsul, rspundei \"0\"." - -#: g10/helptext.c:186 -msgid "Answer \"yes\" if you want to sign ALL the user IDs" -msgstr "Rspundei \"da\" dac dorii s semnai 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 "" -"Rspundei \"da\" dac ntr-adevr dorii s tergei 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 "Rspundei \"da\" dac este OK s tergei 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 semntur valid pe cheie; n mod normal n-ar trebui\n" -"s tergei aceast semntur pentru c aceasta ar putea fi importantla " -"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 semntur nu poate fi verificat pentru c nu avei cheia\n" -"corespunztoare. Ar trebui s amnai tergerea sa pn tii 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 "" -"Semntura 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 semntur care leag ID-ul utilizator de cheie.\n" -"De obicei nu este o idee bun s tergei o asemenea semntur.\n" -"De fapt, GnuPG ar putea s nu mai poat folosi aceast cheie.\n" -"Aa c facei acest lucru numai dac aceast auto-semntur 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 "" -"Schimbai toate preferinele ale tuturor ID-urilor utilizator (sau doar\n" -"cele selectate) conform cu lista curent de preferine. Timestamp-urile\n" -"tuturor auto-semnturilor 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 rugm introducei fraza-parol; aceasta este o propoziie secret \n" - -#: g10/helptext.c:236 -msgid "Please repeat the last passphrase, so you are sure what you typed in." -msgstr "" -"V rugm repetai ultima fraz-parol, pentru a fi sigur() ce ai tastat." - -#: g10/helptext.c:240 -msgid "Give the name of the file to which the signature applies" -msgstr "Dai numele fiierului la care se aplic semntura" - -#: g10/helptext.c:245 -msgid "Answer \"yes\" if it is okay to overwrite the file" -msgstr "Rspundei \"da\" dac este OK s suprascriei fiierul" - -#: 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 rugm introducei un nou nume-fiier. Dac doar apsai RETURN,\n" -"va fi folosit fiierul implicit (artat 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 specificai un motiv pentru certificare. n funcie de\n" -"context avei posibilitatea s alegei din aceast list:\n" -" \"Cheia a fost compromis\"\n" -" Folosii aceast opiune dac avei un motiv s credei c persoane\n" -" neautorizate au avut acces la cheia d-voastr secret.\n" -" \"Cheia este nlocuit\"\n" -" Folosii aceast opiune dac nlocuii cheia cu una nou.\n" -" \"Cheia nu mai este folosit\"\n" -" Folosii aceast opiune dac pensionai cheia.\n" -" \"ID-ul utilizator nu mai este valid\"\n" -" Folosii aceast opiune 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 dorii, putei introduce un text descriind de ce publicai acest\n" -"certificat de revocare. V rugm fii 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 potrivete 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:266 -#, c-format -msgid "skipping block of type %d\n" -msgstr "bloc de tip %d srit\n" - -#: g10/import.c:275 -#, c-format -msgid "%lu keys processed so far\n" -msgstr "%lu chei procesate pn acum\n" - -#: g10/import.c:292 -#, c-format -msgid "Total number processed: %lu\n" -msgstr "Numr total procesate: %lu\n" - -#: g10/import.c:294 -#, c-format -msgid " skipped new keys: %lu\n" -msgstr " chei noi srite: %lu\n" - -#: g10/import.c:297 -#, c-format -msgid " w/o user IDs: %lu\n" -msgstr " fr ID-uri utilizator: %lu\n" - -#: g10/import.c:299 -#, c-format -msgid " imported: %lu" -msgstr " importate: %lu" - -#: g10/import.c:305 -#, c-format -msgid " unchanged: %lu\n" -msgstr " neschimbate: %lu\n" - -#: g10/import.c:307 -#, c-format -msgid " new user IDs: %lu\n" -msgstr " noi ID-uri utilizator: %lu\n" - -#: g10/import.c:309 -#, c-format -msgid " new subkeys: %lu\n" -msgstr " noi subchei: %lu\n" - -#: g10/import.c:311 -#, c-format -msgid " new signatures: %lu\n" -msgstr " noi semnturi: %lu\n" - -#: g10/import.c:313 -#, c-format -msgid " new key revocations: %lu\n" -msgstr " noi revocri de chei: %lu\n" - -#: g10/import.c:315 -#, c-format -msgid " secret keys read: %lu\n" -msgstr " chei secrete citite: %lu\n" - -#: g10/import.c:317 -#, c-format -msgid " secret keys imported: %lu\n" -msgstr " chei secrete importate: %lu\n" - -#: g10/import.c:319 -#, c-format -msgid " secret keys unchanged: %lu\n" -msgstr "chei secrete neschimbate: %lu\n" - -#: g10/import.c:321 -#, c-format -msgid " not imported: %lu\n" -msgstr " ne importate: %lu\n" - -#: g10/import.c:323 -#, fuzzy, c-format -msgid " signatures cleaned: %lu\n" -msgstr "semnturi create pn acum: %lu\n" - -#: g10/import.c:325 -#, fuzzy, c-format -msgid " user IDs cleaned: %lu\n" -msgstr " chei secrete citite: %lu\n" - -#: g10/import.c:566 -#, fuzzy, c-format -msgid "WARNING: key %s contains preferences for unavailable\n" -msgstr "AVERTISMENT: cheia %s conine preferine 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:570 -#, fuzzy -msgid " algorithms on these user IDs:\n" -msgstr "algoritmuri pentru aceste ID-uri utilizator:\n" - -#: g10/import.c:607 -#, c-format -msgid " \"%s\": preference for cipher algorithm %s\n" -msgstr " \"%s\": preferin pentru algoritm de cifrare %s\n" - -#: g10/import.c:619 -#, c-format -msgid " \"%s\": preference for digest algorithm %s\n" -msgstr " \"%s\": preferin pentru algoritm rezumat %s\n" - -#: g10/import.c:631 -#, c-format -msgid " \"%s\": preference for compression algorithm %s\n" -msgstr " \"%s\": preferin pentru algoritm compresie %s\n" - -#: g10/import.c:644 -msgid "it is strongly suggested that you update your preferences and\n" -msgstr "" -"este puternic sugerat s v actualizai preferinele i re-distribuii\n" - -#: g10/import.c:646 -msgid "re-distribute this key to avoid potential algorithm mismatch problems\n" -msgstr "" -"aceast cheie pentru a avita probleme poteniale de ne-potrivire de " -"algoritm\n" - -#: g10/import.c:670 -#, c-format -msgid "you can update your preferences with: gpg --edit-key %s updpref save\n" -msgstr "v putei actualiza preferinele cu: gpg --edit-key %s updpref save\n" - -#: g10/import.c:720 g10/import.c:1118 -#, c-format -msgid "key %s: no user ID\n" -msgstr "cheia %s: nici un ID utilizator\n" - -#: g10/import.c:749 -#, c-format -msgid "key %s: PKS subkey corruption repaired\n" -msgstr "cheia %s: subcheia HPK corupt a fost reparat\n" - -#: g10/import.c:764 -#, 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:770 -#, c-format -msgid "key %s: no valid user IDs\n" -msgstr "cheia %s: nici un ID utilizator valid\n" - -#: g10/import.c:772 -msgid "this may be caused by a missing self-signature\n" -msgstr "aceasta poate fi cauzat de o auto-semntur ce lipsete\n" - -#: g10/import.c:782 g10/import.c:1240 -#, c-format -msgid "key %s: public key not found: %s\n" -msgstr "cheia %s: cheia public nu a fost gsit: %s\n" - -#: g10/import.c:788 -#, c-format -msgid "key %s: new key - skipped\n" -msgstr "cheia %s: cheie nou - srit\n" - -#: g10/import.c:797 -#, c-format -msgid "no writable keyring found: %s\n" -msgstr "n-am gsit nici un inel de chei ce poate fi scris: %s\n" - -#: g10/import.c:802 g10/openfile.c:267 g10/sign.c:831 g10/sign.c:1135 -#, c-format -msgid "writing to `%s'\n" -msgstr "scriu n `%s'\n" - -#: g10/import.c:806 g10/import.c:901 g10/import.c:1158 g10/import.c:1301 -#: g10/import.c:2363 g10/import.c:2385 -#, c-format -msgid "error writing keyring `%s': %s\n" -msgstr "eroare la scrierea inelului de chei `%s': %s\n" - -#: g10/import.c:825 -#, c-format -msgid "key %s: public key \"%s\" imported\n" -msgstr "cheia %s: cheia public \"%s\" importat\n" - -#: g10/import.c:849 -#, c-format -msgid "key %s: doesn't match our copy\n" -msgstr "cheia %s: nu se potrivete cu copia noastr\n" - -#: g10/import.c:866 g10/import.c:1258 -#, c-format -msgid "key %s: can't locate original keyblock: %s\n" -msgstr "cheia %s: nu pot gsi keyblock-ul original: %s\n" - -#: g10/import.c:874 g10/import.c:1265 -#, 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:911 -#, c-format -msgid "key %s: \"%s\" 1 new user ID\n" -msgstr "cheia %s: \"%s\" 1 nou ID utilizator\n" - -#: g10/import.c:914 -#, c-format -msgid "key %s: \"%s\" %d new user IDs\n" -msgstr "cheia %s: \"%s\" %d noi ID-uri utilizator\n" - -#: g10/import.c:917 -#, c-format -msgid "key %s: \"%s\" 1 new signature\n" -msgstr "cheia %s: \"%s\" 1 nou semntur\n" - -#: g10/import.c:920 -#, c-format -msgid "key %s: \"%s\" %d new signatures\n" -msgstr "cheia %s: \"%s\" %d noi semnturi\n" - -#: g10/import.c:923 -#, c-format -msgid "key %s: \"%s\" 1 new subkey\n" -msgstr "cheia %s: \"%s\" 1 nou subcheie\n" - -#: g10/import.c:926 -#, c-format -msgid "key %s: \"%s\" %d new subkeys\n" -msgstr "cheia %s: \"%s\" %d noi subchei\n" - -#: g10/import.c:929 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signature cleaned\n" -msgstr "cheia %s: \"%s\" %d noi semnturi\n" - -#: g10/import.c:932 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signatures cleaned\n" -msgstr "cheia %s: \"%s\" %d noi semnturi\n" - -#: g10/import.c:935 -#, 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:938 -#, 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:961 -#, c-format -msgid "key %s: \"%s\" not changed\n" -msgstr "cheia %s: \"%s\" nu a fost schimbat\n" - -#: g10/import.c:1124 -#, c-format -msgid "key %s: secret key with invalid cipher %d - skipped\n" -msgstr "cheia %s: cheie secret cu cifru invalid %d - srit\n" - -#: g10/import.c:1135 -msgid "importing secret keys not allowed\n" -msgstr "importul de chei secrete nu este permis\n" - -#: g10/import.c:1152 g10/import.c:2378 -#, c-format -msgid "no default secret keyring: %s\n" -msgstr "nici un inel de chei secrete implicit: %s\n" - -#: g10/import.c:1163 -#, c-format -msgid "key %s: secret key imported\n" -msgstr "cheia %s: cheie secret importat\n" - -#: g10/import.c:1193 -#, c-format -msgid "key %s: already in secret keyring\n" -msgstr "cheia %s: deja n inelul de chei secrete\n" - -#: g10/import.c:1203 -#, c-format -msgid "key %s: secret key not found: %s\n" -msgstr "cheia %s: cheia secret nu a fost gsit: %s\n" - -#: g10/import.c:1233 -#, 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:1276 -#, c-format -msgid "key %s: invalid revocation certificate: %s - rejected\n" -msgstr "cheia %s: certificat de revocare invalid: %s - respins\n" - -#: g10/import.c:1308 -#, c-format -msgid "key %s: \"%s\" revocation certificate imported\n" -msgstr "cheia %s: certificatul de revocare \"%s\" importat\n" - -#: g10/import.c:1374 -#, c-format -msgid "key %s: no user ID for signature\n" -msgstr "cheia %s: nici un ID utilizator pentru semntur\n" - -#: g10/import.c:1389 -#, 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:1391 -#, c-format -msgid "key %s: invalid self-signature on user ID \"%s\"\n" -msgstr "cheia %s: auto-semntur invalid pentru ID-ul utilizator \"%s\"\n" - -#: g10/import.c:1409 -#, c-format -msgid "key %s: no subkey for key binding\n" -msgstr "cheia %s: nici o subcheie pentru legarea cheii\n" - -#: g10/import.c:1420 g10/import.c:1470 -#, c-format -msgid "key %s: unsupported public key algorithm\n" -msgstr "cheia %s: algoritm cu cheie public nesuportat\n" - -#: g10/import.c:1422 -#, c-format -msgid "key %s: invalid subkey binding\n" -msgstr "cheia %s: legare subcheie invalid\n" - -#: g10/import.c:1437 -#, c-format -msgid "key %s: removed multiple subkey binding\n" -msgstr "cheia %s: am ters multiple legturi de subchei\n" - -#: g10/import.c:1459 -#, 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:1472 -#, c-format -msgid "key %s: invalid subkey revocation\n" -msgstr "cheia %s: revocare de subcheie invalid\n" - -#: g10/import.c:1487 -#, c-format -msgid "key %s: removed multiple subkey revocation\n" -msgstr "cheia %s: am ters multiple revocri de subcheie\n" - -#: g10/import.c:1529 -#, c-format -msgid "key %s: skipped user ID \"%s\"\n" -msgstr "cheia %s: am srit ID-ul utilizator \"%s\"\n" - -#: g10/import.c:1550 -#, c-format -msgid "key %s: skipped subkey\n" -msgstr "cheia %s: am srit subcheia\n" - -#: g10/import.c:1577 -#, c-format -msgid "key %s: non exportable signature (class 0x%02X) - skipped\n" -msgstr "cheia %s: semntura nu poate fi exportat (clasa 0x%02X) - srit\n" - -#: g10/import.c:1587 -#, c-format -msgid "key %s: revocation certificate at wrong place - skipped\n" -msgstr "cheia %s: certificat de revocare ntr-un loc greit - srit\n" - -#: g10/import.c:1604 -#, c-format -msgid "key %s: invalid revocation certificate: %s - skipped\n" -msgstr "cheia %s: certificat de revocare invalid: %s - srit\n" - -#: g10/import.c:1618 -#, c-format -msgid "key %s: subkey signature in wrong place - skipped\n" -msgstr "cheia %s: semntur subcheie ntr-un loc greit - srit\n" - -#: g10/import.c:1626 -#, c-format -msgid "key %s: unexpected signature class (0x%02X) - skipped\n" -msgstr "cheia %s: clas de semntur neateptat (0x%02X) - srit\n" - -#: g10/import.c:1726 -#, 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:1788 -#, 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:1802 -#, 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:1861 -#, c-format -msgid "key %s: \"%s\" revocation certificate added\n" -msgstr "cheia %s: am adugat certificatul de revocare \"%s\"\n" - -#: g10/import.c:1895 -#, c-format -msgid "key %s: direct key signature added\n" -msgstr "cheia %s: am adugat semntura de cheie direct\n" - -#: g10/import.c:2284 -msgid "NOTE: a key's S/N does not match the card's one\n" -msgstr "NOT: S/N-ul unei chei nu se potrivete cu cel al cardului\n" - -#: g10/import.c:2292 -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:2294 -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 euat 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-semntur]" - -#: g10/keyedit.c:345 g10/keylist.c:390 -msgid "1 bad signature\n" -msgstr "1 semntur incorect\n" - -#: g10/keyedit.c:347 g10/keylist.c:392 -#, c-format -msgid "%d bad signatures\n" -msgstr "%d semnturi incorecte\n" - -#: g10/keyedit.c:349 g10/keylist.c:394 -msgid "1 signature not checked due to a missing key\n" -msgstr "1 semntur 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 semnturi 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 semntur 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 semnturi 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 gsit 1 ID utilizator fr auto-semntur valid\n" - -#: g10/keyedit.c:359 -#, c-format -msgid "%d user IDs without valid self-signatures detected\n" -msgstr "am gsit %d ID-uri utilizator fr auto-semnturi 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 rugm decidei ct de mult ncredere avei n acest utilizator\n" -"pentru a verifica cheile altor utilizatori (folosind paapoarte,\n" -"verificnd 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 rugm s introducei adncimea acestei semnturi de ncredere.\n" -"O adncime mai mare de 1 permite ca cheia pe care o semnai s fac\n" -"semnturi 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 rugm s introducei domeniul de restricionare al acestei semnturi, sau " -"apsai 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 "Suntei sigur() c dorii s tergei 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 "Dorii s-l semnai? (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-semntura pe \"%s\"\n" -"este o semntur stil PGP 2.x.\n" - -#: g10/keyedit.c:716 -msgid "Do you want to promote it to an OpenPGP self-signature? (y/N) " -msgstr "Dorii s o promovai la o auto-semntur OpenPGP? (d/N) " - -#: g10/keyedit.c:730 -#, c-format -msgid "" -"Your current signature on \"%s\"\n" -"has expired.\n" -msgstr "" -"Semntura 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 "" -"Dorii s creai o nou semntur 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 "" -"Semntura d-voastr curent pe \"%s\"\n" -"semntur local.\n" - -#: g10/keyedit.c:759 -msgid "Do you want to promote it to a full exportable signature? (y/N) " -msgstr "Dorii s o promovai la o semntur 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 "Dorii s o semnai 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 "Dorii ca semntura d-voastr s expire n acelai 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 putei crea o semntur OpenPGP pe o cheie PGP 2.x ct vreme suntei 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 "" -"Ct de atent ai verificat c cheia pe care suntei pe cale a o semna " -"aparine\n" -"ntr-adevr persoanei numite deasupra? Dac nu tii ce s rspundei,\n" -"introducei \"0\".\n" - -#: g10/keyedit.c:921 -#, c-format -msgid " (0) I will not answer.%s\n" -msgstr " (0) Nu voi rspunde.%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 fcut ceva verificri superficiale.%s\n" - -#: g10/keyedit.c:927 -#, c-format -msgid " (3) I have done very careful checking.%s\n" -msgstr " (3) Am fcut verificri foarte atente.%s\n" - -#: g10/keyedit.c:933 -msgid "Your selection? (enter `?' for more information): " -msgstr "Selecia dvs.? (introducei `?' pentru informaii 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 "" -"Suntei ntr-adevr sigur() c dorii s semnai\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-semntur.\n" - -#: g10/keyedit.c:970 -msgid "WARNING: the signature will not be marked as non-exportable.\n" -msgstr "AVERTISMENT: semntura 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: semntura nu va fi marcat ca non-revocabil.\n" - -#: g10/keyedit.c:988 -msgid "The signature will be marked as non-exportable.\n" -msgstr "Semntura va fi marcat ca non-exportabil.\n" - -#: g10/keyedit.c:995 -msgid "The signature will be marked as non-revocable.\n" -msgstr "Semntura 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 "Dorii cu adevrat s semnai? (d/N) " - -#: g10/keyedit.c:1067 g10/keyedit.c:4783 g10/keyedit.c:4874 g10/keyedit.c:4938 -#: g10/keyedit.c:4999 g10/sign.c:352 -#, c-format -msgid "signing failed: %s\n" -msgstr "semnarea a euat: %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 "Prile 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 "Pri 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 "" -"Introducei 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 ncercai o dat" - -#: g10/keyedit.c:1199 -msgid "" -"You don't want a passphrase - this is probably a *bad* idea!\n" -"\n" -msgstr "" -"Nu dorii 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 "Dorii ntr-adevr s facei acest lucru? (d/N) " - -#: g10/keyedit.c:1273 -msgid "moving a key signature to the correct place\n" -msgstr "mut o semntur 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 "afieaz 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 semnturi" - -#: 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 selectai local" - -#: g10/keyedit.c:1379 -msgid "sign selected user IDs with a trust signature" -msgstr "semneaz ID-urile utilizatorilor selectai cu o semntur de ncredere" - -#: g10/keyedit.c:1381 -msgid "sign selected user IDs with a non-revocable signature" -msgstr "semneaz ID-urile utilizatorilor selectai cu o semntur 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 semnturile 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 preferinele (expert)" - -#: g10/keyedit.c:1421 -msgid "list preferences (verbose)" -msgstr "afieaz preferinele (detaliat)" - -#: g10/keyedit.c:1423 -msgid "set preference list for the selected user IDs" -msgstr "seteaz lista de preferine 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 preferine 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 semnturile 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 "Avei nevoie de cheia secret pentru a face aceasta.\n" - -#: g10/keyedit.c:1677 -msgid "Please use the command \"toggle\" first.\n" -msgstr "V rugm folosii mai nti 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 semnturi\n" -" locale (lsign), un `t' pentru semnturi de ncredere (tsign), un `nr'\n" -" pentru semnturi irevocabile (nrsign), sau orice combinaie 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 "Semnai ntr-adevr toate ID-urile utilizator? (d/N) " - -#: g10/keyedit.c:1762 -msgid "Hint: Select the user IDs to sign\n" -msgstr "Sugestie: Selectai ID-ul utilizator de semnat\n" - -#: g10/keyedit.c:1771 -#, c-format -msgid "Unknown signature type `%s'\n" -msgstr "Tip de semntur 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 nti s selectai cel puin un ID utilizator.\n" - -#: g10/keyedit.c:1818 -msgid "You can't delete the last user ID!\n" -msgstr "Nu putei terge ultimul ID utilizator!\n" - -#: g10/keyedit.c:1820 -msgid "Really remove all selected user IDs? (y/N) " -msgstr "tergei ntr-adevr toate ID-urile utilizator selectate? (d/N) " - -#: g10/keyedit.c:1821 -msgid "Really remove this user ID? (y/N) " -msgstr "tergei ntr-adevr acest ID utilizator? (d/N) " - -#: g10/keyedit.c:1871 -msgid "Really move the primary key? (y/N) " -msgstr "Mutai ntr-adevr cheia primar? (d/N) " - -#: g10/keyedit.c:1883 -msgid "You must select exactly one key.\n" -msgstr "Trebuie s selectai exact o cheie.\n" - -#: g10/keyedit.c:1911 -msgid "Command expects a filename argument\n" -msgstr "Comanda ateapt un nume de fiier 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 selectai cel puin o cheie.\n" - -#: g10/keyedit.c:1969 -msgid "Do you really want to delete the selected keys? (y/N) " -msgstr "Dorii ntr-adevr s tergei cheile selectate? (d/N) " - -#: g10/keyedit.c:1970 -msgid "Do you really want to delete this key? (y/N) " -msgstr "Dorii ntr-adevr s tergei aceast cheie? (d/N) " - -#: g10/keyedit.c:2005 -msgid "Really revoke all selected user IDs? (y/N) " -msgstr "" -"Dorii ntr-adevr s revocai toate ID-urile utilizator selectate? (d/N) " - -#: g10/keyedit.c:2006 -msgid "Really revoke this user ID? (y/N) " -msgstr "Dorii ntr-adevr s revocai acest ID utilizator? (d/N) " - -#: g10/keyedit.c:2024 -msgid "Do you really want to revoke the entire key? (y/N) " -msgstr "Dorii ntr-adevr s revocai toat cheia? (d/N) " - -#: g10/keyedit.c:2035 -msgid "Do you really want to revoke the selected subkeys? (y/N) " -msgstr "Dorii ntr-adevr s revocai subcheile selectate? (d/N) " - -#: g10/keyedit.c:2037 -msgid "Do you really want to revoke this subkey? (y/N) " -msgstr "Dorii ntr-adevr s revocai 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 cnd 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 preferine ca:\n" - -#: g10/keyedit.c:2135 -msgid "Really update the preferences for the selected user IDs? (y/N) " -msgstr "" -"Dorii ntr-adevr s actualizai preferinele pentru ID-urile utilizator " -"selectate? (d/N) " - -#: g10/keyedit.c:2137 -msgid "Really update the preferences? (y/N) " -msgstr "Dorii ntr-adevr s actualizai preferinele? (d/N) " - -#: g10/keyedit.c:2205 -msgid "Save changes? (y/N) " -msgstr "Salvai schimbrile? (d/N) " - -#: g10/keyedit.c:2208 -msgid "Quit without saving? (y/N) " -msgstr "Terminai fr a salva? (d/N) " - -#: g10/keyedit.c:2218 -#, c-format -msgid "update failed: %s\n" -msgstr "actualizarea a euat: %s\n" - -#: g10/keyedit.c:2225 -#, c-format -msgid "update secret failed: %s\n" -msgstr "actualizarea secretului a euat: %s\n" - -#: g10/keyedit.c:2232 -msgid "Key not changed so no update needed.\n" -msgstr "Cheia nu a fost schimbat aa c nici o actualizare a fost necesar.\n" - -#: g10/keyedit.c:2333 -msgid "Digest: " -msgstr "Rezumat: " - -#: g10/keyedit.c:2385 -msgid "Features: " -msgstr "Capabiliti: " - -#: 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 "Notaie:" - -#: 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 rugm observai c validitatea cheii artate nu este n mod necesar\n" -"corect dac nu repornii 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. Adugarea unei poze ID poate\n" -" cauza unele versiuni de PGP s resping aceast cheie.\n" - -#: g10/keyedit.c:3016 g10/keyedit.c:3346 -msgid "Are you sure you still want to add it? (y/N) " -msgstr "Suntei nc sigur() c dorii s o adugai? (d/N) " - -#: g10/keyedit.c:3022 -msgid "You may not add a photo ID to a PGP2-style key.\n" -msgstr "Nu putei aduga o poz ID la o cheie stil PGP2.\n" - -#: g10/keyedit.c:3162 -msgid "Delete this good signature? (y/N/q)" -msgstr "tergei aceast semntur bun? (d/N/t)" - -#: g10/keyedit.c:3172 -msgid "Delete this invalid signature? (y/N/q)" -msgstr "tergei aceast semntur invalid? (d/N/t)" - -#: g10/keyedit.c:3176 -msgid "Delete this unknown signature? (y/N/q)" -msgstr "tergei aceast semntur necunoscut? (d/N/t)" - -#: g10/keyedit.c:3182 -msgid "Really delete this self-signature? (y/N)" -msgstr "tergei ntr-adevr aceast auto-semntur? (d/N)" - -#: g10/keyedit.c:3196 -#, c-format -msgid "Deleted %d signature.\n" -msgstr "Am ters %d semnturi.\n" - -#: g10/keyedit.c:3197 -#, c-format -msgid "Deleted %d signatures.\n" -msgstr "Am ters %d semnturi.\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:3249 -#, fuzzy, c-format -msgid "User ID \"%s\": already clean\n" -msgstr "ID-ul utilizator \"%s\": este deja curat.\n" - -#: g10/keyedit.c:3341 -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. Adugarea unui revocator\n" -" desemnat poate face ca unele versiuni de PGP s resping " -"cheia.\n" - -#: g10/keyedit.c:3352 -msgid "You may not add a designated revoker to a PGP 2.x-style key.\n" -msgstr "Nu putei aduga un revocator desemnat la o cheie stil PGP 2.x.\n" - -#: g10/keyedit.c:3372 -msgid "Enter the user ID of the designated revoker: " -msgstr "Introducei ID-ul utilizator al revocatorului desemnat: " - -#: g10/keyedit.c:3397 -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:3412 -msgid "you cannot appoint a key as its own designated revoker\n" -msgstr "nu putei desemna o cheie ca propriul su revocator desemnat\n" - -#: g10/keyedit.c:3434 -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:3453 -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:3459 -msgid "" -"Are you sure you want to appoint this key as a designated revoker? (y/N) " -msgstr "" -"Suntei sigur() c dorii s desemnai aceast cheie ca i un revocator " -"desemnat? (d/N) " - -#: g10/keyedit.c:3520 -msgid "Please remove selections from the secret keys.\n" -msgstr "V rugm tergei seleciile din cheile secrete.\n" - -#: g10/keyedit.c:3526 -msgid "Please select at most one subkey.\n" -msgstr "V rugm selectai cel mult o subcheie.\n" - -#: g10/keyedit.c:3530 -msgid "Changing expiration time for a subkey.\n" -msgstr "Schimb timpul de expirare pentru o subcheie.\n" - -#: g10/keyedit.c:3533 -msgid "Changing expiration time for the primary key.\n" -msgstr "Schimb timpul de expirare pentru cheia primar.\n" - -#: g10/keyedit.c:3579 -msgid "You can't change the expiration date of a v3 key\n" -msgstr "Nu putei schimba data de expirare a unei chei v3\n" - -#: g10/keyedit.c:3595 -msgid "No corresponding signature in secret ring\n" -msgstr "Nici o semntur corespunztoare n inelul secret\n" - -#: g10/keyedit.c:3668 -#, 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:3674 -#, c-format -msgid "subkey %s does not sign and so does not need to be cross-certified\n" -msgstr "" - -#: g10/keyedit.c:3836 -msgid "Please select exactly one user ID.\n" -msgstr "V rugm selectai exact un ID utilizator.\n" - -#: g10/keyedit.c:3875 g10/keyedit.c:3985 g10/keyedit.c:4105 g10/keyedit.c:4246 -#, c-format -msgid "skipping v3 self-signature on user ID \"%s\"\n" -msgstr "auto-semntur v3 srit pentru ID-ul utilizator \"%s\"\n" - -#: g10/keyedit.c:4046 -msgid "Enter your preferred keyserver URL: " -msgstr "Introducei URL-ul serverului de chei preferat: " - -#: g10/keyedit.c:4126 -msgid "Are you sure you want to replace it? (y/N) " -msgstr "Suntei sigur() c dorii s o folosii? (d/N) " - -#: g10/keyedit.c:4127 -msgid "Are you sure you want to delete it? (y/N) " -msgstr "Suntei sigur() c dorii s o folosii? (d/N) " - -#: g10/keyedit.c:4189 -#, fuzzy -msgid "Enter the notation: " -msgstr "Notare semntur: " - -#: g10/keyedit.c:4338 -#, fuzzy -msgid "Proceed? (y/N) " -msgstr "Suprascriu? (d/N) " - -#: g10/keyedit.c:4402 -#, c-format -msgid "No user ID with index %d\n" -msgstr "Nici un ID utilizator cu indicele %d\n" - -#: g10/keyedit.c:4460 -#, c-format -msgid "No user ID with hash %s\n" -msgstr "Nici un ID utilizator cu hash-ul %s\n" - -#: g10/keyedit.c:4487 -#, c-format -msgid "No subkey with index %d\n" -msgstr "Nici o subcheie cu indicele %d\n" - -#: g10/keyedit.c:4622 -#, c-format -msgid "user ID: \"%s\"\n" -msgstr "ID utilizator: \"%s\"\n" - -#: g10/keyedit.c:4625 g10/keyedit.c:4689 g10/keyedit.c:4732 -#, 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:4627 g10/keyedit.c:4691 g10/keyedit.c:4734 -msgid " (non-exportable)" -msgstr " (non-exportabil)" - -#: g10/keyedit.c:4631 -#, c-format -msgid "This signature expired on %s.\n" -msgstr "Aceast semntur a expirat pe %s.\n" - -#: g10/keyedit.c:4635 -msgid "Are you sure you still want to revoke it? (y/N) " -msgstr "Suntei nc sigur() c dorii s o revocai? (d/N) " - -#: g10/keyedit.c:4639 -msgid "Create a revocation certificate for this signature? (y/N) " -msgstr "Creai un certificat de revocare pentru aceast semntur? (d/N) " - -#: g10/keyedit.c:4666 -#, c-format -msgid "You have signed these user IDs on key %s:\n" -msgstr "Ai semnat aceste ID-uri utilizator pe cheia %s:\n" - -#: g10/keyedit.c:4692 -msgid " (non-revocable)" -msgstr " (non-revocabil)" - -#: g10/keyedit.c:4699 -#, c-format -msgid "revoked by your key %s on %s\n" -msgstr "revocat de cheia d-voastr %s pe %s\n" - -#: g10/keyedit.c:4721 -msgid "You are about to revoke these signatures:\n" -msgstr "Suntei pe cale s revocai aceste semnturi:\n" - -#: g10/keyedit.c:4741 -msgid "Really create the revocation certificates? (y/N) " -msgstr "Dorii ntr-adevr s creai certificatele de revocare? (d/N) " - -#: g10/keyedit.c:4771 -msgid "no secret key\n" -msgstr "nici o cheie secret\n" - -#: g10/keyedit.c:4841 -#, c-format -msgid "user ID \"%s\" is already revoked\n" -msgstr "ID-ul utilizator \"%s\" este deja revocat\n" - -#: g10/keyedit.c:4858 -#, c-format -msgid "WARNING: a user ID signature is dated %d seconds in the future\n" -msgstr "" -"AVERTISMENT: o semntur ID utilizator este datat %d secunde n viitor\n" - -#: g10/keyedit.c:4922 -#, c-format -msgid "Key %s is already revoked.\n" -msgstr "Cheia %s este deja revocat.\n" - -#: g10/keyedit.c:4984 -#, c-format -msgid "Subkey %s is already revoked.\n" -msgstr "Subcheia %s este deja revocat.\n" - -#: g10/keyedit.c:5079 -#, c-format -msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n" -msgstr "Afiez poza ID %s de dimensiune %ld pentru cheia %s (uid %d)\n" - -#: g10/keygen.c:262 -#, c-format -msgid "preference `%s' duplicated\n" -msgstr "preferina `%s' duplicat\n" - -#: g10/keygen.c:269 -msgid "too many cipher preferences\n" -msgstr "prea multe preferine de cifrare\n" - -#: g10/keygen.c:271 -msgid "too many digest preferences\n" -msgstr "prea multe preferine de rezumat\n" - -#: g10/keygen.c:273 -msgid "too many compression preferences\n" -msgstr "prea multe preferine de compresie\n" - -#: g10/keygen.c:398 -#, c-format -msgid "invalid item `%s' in preference string\n" -msgstr "articol invalid `%s' n irul de preferine\n" - -#: g10/keygen.c:872 -msgid "writing direct signature\n" -msgstr "scriu semntur direct\n" - -#: g10/keygen.c:911 -msgid "writing self signature\n" -msgstr "scriu auto semntur\n" - -#: g10/keygen.c:961 -msgid "writing key binding signature\n" -msgstr "scriu semntur 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 bii\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 bii\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 "Aciuni posibile pentru o cheie %s: " - -#: g10/keygen.c:1363 -msgid "Current allowed actions: " -msgstr "Aciuni 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 "Selectai ce fel de cheie dorii:\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 capabilitile)\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 capabilitile)\n" - -#: g10/keygen.c:1514 -#, c-format -msgid "DSA keypair will have %u bits.\n" -msgstr "Perechea de chei DSA va avea %u bii.\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 bii.\n" - -#: g10/keygen.c:1531 -#, c-format -msgid "What keysize do you want? (%u) " -msgstr "Ce lungime de cheie dorii? (%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 bii\n" - -#: g10/keygen.c:1556 g10/keygen.c:1561 -#, c-format -msgid "rounded up to %u bits\n" -msgstr "rotunjit prin adaos la %u bii\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 "" -"Specificai ct de mult timp dorii s fie valid cheia.\n" -" 0 = cheia nu expir\n" -" <n> = cheia expir n n zile\n" -" <n>w = cheia expir n n sptmni\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 "" -"Specificai ct de mult timp dorii s fie valid semntura.\n" -" 0 = semntura nu expir\n" -" <n> = semntura expir n n zile\n" -" <n>w = semntura expir n n sptmni\n" -" <n>m = semntura expir n n luni\n" -" <n>y = semntura 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 "Semntura 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 "Semntura 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 "Semntura 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 afia date dup 2038.\n" -"Totui, acestea vor fi corect mnuite pn 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" -"Avei nevoie de un ID utilizator pentru a identifica cheia; software-ul\n" -"construiete 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 puin 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 "Folosii setul de caractere `%s'\n" - -#: g10/keygen.c:1797 -#, c-format -msgid "" -"You selected this USER-ID:\n" -" \"%s\"\n" -"\n" -msgstr "" -"Ai 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 rugm nu punei 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 rugm corectai mai nti eroarea\n" - -#: g10/keygen.c:1888 -msgid "" -"You need a Passphrase to protect your secret key.\n" -"\n" -msgstr "" -"Avei 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 avei nevoie de o fraz-parol - aceasta este probabil o idee *proast*!\n" -"O s o fac oricum. Putei schimba fraza-parol oricnd, folosind acest\n" -"program cu opiunea \"--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 generm o grmad de octei aleatori. Este o idee bun s facei\n" -"altceva (tastai la tastatur, micai mausul, utilizai discurile)\n" -"n timpul generrii 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 gsit 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 gsit 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 " -"dorii\n" -"s folosii 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 euat: %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 "Creai ntr-adevr? (d/N) " - -#: g10/keygen.c:3509 -#, c-format -msgid "storing key onto card failed: %s\n" -msgstr "stocarea cheii pe card a euat: %s\n" - -#: g10/keygen.c:3556 -#, c-format -msgid "can't create backup file `%s': %s\n" -msgstr "nu pot crea fiier 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 sigurana 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 semnturi critic: " - -#: g10/keylist.c:267 -msgid "Signature policy: " -msgstr "Politic de semnturi: " - -#: g10/keylist.c:306 -msgid "Critical preferred keyserver: " -msgstr "Server de chei preferat critic: " - -#: g10/keylist.c:359 -msgid "Critical signature notation: " -msgstr "Notare semntur critic: " - -#: g10/keylist.c:361 -msgid "Signature notation: " -msgstr "Notare semntur: " - -#: 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 euat: %s\n" - -#: g10/keyring.c:1252 -msgid "WARNING: 2 files with confidential information exists.\n" -msgstr "AVERTISMENT: exist 2 fiiere cu informaii confideniale.\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 rugm reparai 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 pn acum (%lu semnturi)\n" - -#: g10/keyring.c:1434 -#, c-format -msgid "%lu keys cached (%lu signatures)\n" -msgstr "%lu chei puse n cache (%lu semnturi)\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 "Introducei 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: opiunile 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 "Introducei numr/numere, N)ext (urmtor), sau Q)uit (termin) > " - -#: g10/keyserver.c:808 g10/keyserver.c:1421 -#, 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 gsit pe serverul de chei\n" - -#: g10/keyserver.c:908 -msgid "key not found on keyserver\n" -msgstr "cheia nu a fost gsit 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:1324 -#, c-format -msgid "sending key %s to %s server %s\n" -msgstr "trimit cheia %s serverului %s %s\n" - -#: g10/keyserver.c:1328 -#, c-format -msgid "sending key %s to %s\n" -msgstr "trimit cheia %s lui %s\n" - -#: g10/keyserver.c:1371 -#, c-format -msgid "searching for \"%s\" from %s server %s\n" -msgstr "caut \"%s\" de pe serverul %s %s\n" - -#: g10/keyserver.c:1374 -#, c-format -msgid "searching for \"%s\" from %s\n" -msgstr "caut \"%s\" de pe %s\n" - -#: g10/keyserver.c:1381 g10/keyserver.c:1477 -msgid "no keyserver action!\n" -msgstr "nici o aciune pentru serverul de chei!\n" - -#: g10/keyserver.c:1429 -#, 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:1438 -msgid "keyserver did not send VERSION\n" -msgstr "serverul de chei nu a trimis VERSION (versiune)\n" - -#: g10/keyserver.c:1500 g10/keyserver.c:2028 -msgid "no keyserver known (use option --keyserver)\n" -msgstr "nici un server de chei cunoscut (folosii opiunea --keyserver)\n" - -#: g10/keyserver.c:1506 -msgid "external keyserver calls are not supported in this build\n" -msgstr "" -"apeluri ctre server de chei extern nu este suportat de acest program\n" - -#: g10/keyserver.c:1518 -#, 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:1523 -#, c-format -msgid "action `%s' not supported with keyserver scheme `%s'\n" -msgstr "aciunea `%s' nu este suportat cu schema serverului de chei `%s'\n" - -#: g10/keyserver.c:1531 -#, c-format -msgid "%s does not support handler version %d\n" -msgstr "%s nu suport versiunea de manipulator (handler) %d\n" - -#: g10/keyserver.c:1538 -msgid "keyserver timed out\n" -msgstr "serverul de chei a epuizat timpul de ateptare (timed out)\n" - -#: g10/keyserver.c:1543 -msgid "keyserver internal error\n" -msgstr "eroare intern server de chei\n" - -#: g10/keyserver.c:1552 -#, c-format -msgid "keyserver communications error: %s\n" -msgstr "eroare de comunicare server de chei: %s\n" - -#: g10/keyserver.c:1577 g10/keyserver.c:1611 -#, c-format -msgid "\"%s\" not a key ID: skipping\n" -msgstr "\"%s\" nu este un ID de cheie: srit\n" - -#: g10/keyserver.c:1870 -#, 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:1892 -#, c-format -msgid "refreshing 1 key from %s\n" -msgstr "reactualizez 1 cheie de la %s\n" - -#: g10/keyserver.c:1894 -#, c-format -msgid "refreshing %d keys from %s\n" -msgstr "reactualizez %d chei de la %s\n" - -#: g10/keyserver.c:1950 -#, 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:1956 -#, 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 euat: %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 euat: %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 fiier original='%.*s'\n" - -#: g10/mainproc.c:817 -msgid "standalone revocation - use \"gpg --import\" to apply\n" -msgstr "revocare standalone - folosii \"gpg --import\" pentru a aplica\n" - -#: g10/mainproc.c:1165 -#, fuzzy -msgid "no signature found\n" -msgstr "Semntur bun din \"%s\"" - -#: g10/mainproc.c:1408 -msgid "signature verification suppressed\n" -msgstr "verificare semntur eliminat\n" - -#: g10/mainproc.c:1508 -#, fuzzy -msgid "can't handle this ambiguous signature data\n" -msgstr "nu pot mnui aceste semnturi multiple\n" - -#: g10/mainproc.c:1519 -#, c-format -msgid "Signature made %s\n" -msgstr "Semntur fcut %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 "Semntur fcut %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 "Semntur INCORECT din \"%s\"" - -#: g10/mainproc.c:1679 g10/mainproc.c:1727 -#, c-format -msgid "Expired signature from \"%s\"" -msgstr "Semntur expirat din \"%s\"" - -#: g10/mainproc.c:1681 g10/mainproc.c:1729 -#, c-format -msgid "Good signature from \"%s\"" -msgstr "Semntur 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 "Semntur expirat %s\n" - -#: g10/mainproc.c:1868 -#, c-format -msgid "Signature expires %s\n" -msgstr "Semntura expir %s\n" - -#: g10/mainproc.c:1871 -#, c-format -msgid "%s signature, digest algorithm %s\n" -msgstr "semntur %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 semntura: %s\n" - -#: g10/mainproc.c:1962 g10/mainproc.c:1978 g10/mainproc.c:2064 -msgid "not a detached signature\n" -msgstr "nu o semntur detaat\n" - -#: g10/mainproc.c:2005 -msgid "" -"WARNING: multiple signatures detected. Only the first will be checked.\n" -msgstr "" -"AVERTISMENT: am detectat multiple semnturi. Numai prima va fi verificat.\n" - -#: g10/mainproc.c:2013 -#, c-format -msgid "standalone signature of class 0x%02x\n" -msgstr "semntur de sine stttoare (standalone) de clas 0x%02x\n" - -#: g10/mainproc.c:2070 -msgid "old style (PGP 2.x) signature\n" -msgstr "semntur 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 fiierelor 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 euat n %s: %s\n" - -#: g10/misc.c:207 -#, c-format -msgid "fstat(%d) failed in %s: %s\n" -msgstr "fstat(%d) a euat 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 informaii\n" - -#: g10/misc.c:681 -#, c-format -msgid "%s:%d: deprecated option \"%s\"\n" -msgstr "%s:%d: opiune nvechit \"%s\"\n" - -#: g10/misc.c:685 -#, c-format -msgid "WARNING: \"%s\" is a deprecated option\n" -msgstr "AVERTISMENT: \"%s\" este o opiune nvechit\n" - -#: g10/misc.c:687 -#, c-format -msgid "please use \"%s%s\" instead\n" -msgstr "v rugm folosii \"%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 folosii\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 "opiune ambigu `%s'\n" - -#: g10/misc.c:1042 -#, c-format -msgid "unknown option `%s'\n" -msgstr "opiune necunoscut `%s'\n" - -#: g10/openfile.c:86 -#, c-format -msgid "File `%s' exists. " -msgstr "Fiierul `%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 "Introducei un nou nume-fiier" - -#: g10/openfile.c:190 -msgid "writing to stdout\n" -msgstr "scriu la stdout\n" - -#: g10/openfile.c:305 -#, c-format -msgid "assuming signed data in `%s'\n" -msgstr "presupun date semnate n `%s'\n" - -#: g10/openfile.c:384 -#, c-format -msgid "new configuration file `%s' created\n" -msgstr "fiier de configurare nou `%s' creat\n" - -#: g10/openfile.c:386 -#, c-format -msgid "WARNING: options in `%s' are not yet active during this run\n" -msgstr "" -"AVERTISMENT: opiunile din %s nu sunt nc active n timpul acestei rulri\n" - -#: g10/openfile.c:418 -#, 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 mnui 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 potenial nesigur " -"(insecure)\n" - -#: g10/parse-packet.c:1157 -#, 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 "" -"Avei 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 "Repetai fraza-parol\n" - -#: g10/passphrase.c:573 -msgid "Enter passphrase\n" -msgstr "Introducei fraza-parol\n" - -#: g10/passphrase.c:649 -msgid "cancelled by user\n" -msgstr "anulat de utilizator\n" - -# -#: g10/passphrase.c:805 g10/passphrase.c:968 -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:973 -msgid "Enter passphrase: " -msgstr "Introducei fraza-parol: " - -#: g10/passphrase.c:895 -#, c-format -msgid "" -"You need a passphrase to unlock the secret key for\n" -"user: \"%s\"\n" -msgstr "" -"Avei 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:977 -msgid "Repeat passphrase: " -msgstr "Repetai 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" -"Alegei o imagine pentru a o folosi ca poz ID. Imaginea trebuie s fie un\n" -"fiier JPEG. Amintii-v c imaginea este pstrat n cheia d-voastr " -"public.\n" -"Dac folosii o imagine foarte larg, cheia d-voastr va deveni de asemenea\n" -"foarte larg!\n" -"ncercai s folosii o imagine de aproximativ 240x288 pixeli.\n" - -#: g10/photoid.c:95 -msgid "Enter JPEG filename for photo ID: " -msgstr "Introducei nume-fiier JPEG pentru poz ID: " - -#: g10/photoid.c:116 -#, c-format -msgid "unable to open JPEG file `%s': %s\n" -msgstr "nu pot deschide fiierul 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 octei) !\n" - -#: g10/photoid.c:129 -msgid "Are you sure you want to use it? (y/N) " -msgstr "Suntei sigur() c dorii s l folosii? (d/N) " - -#: g10/photoid.c:146 -#, c-format -msgid "`%s' is not a JPEG file\n" -msgstr "`%s' nu este un fiier 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 afia 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 "" -"Ct de mult credei c aceast cheie aparine ntr-adevr 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 = sri 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 "" -"Dorii ntr-adevr s setai 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 indicaie c aceast cheie aparine ntr-adevr " -"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 indicaie c aceast cheie aparine ntr-adevr " -"utilizatorului numit\n" - -#: g10/pkclist.c:430 -msgid "This key probably belongs to the named user\n" -msgstr "Aceast cheie aparine probabil utilizatorului numit\n" - -#: g10/pkclist.c:435 -msgid "This key belongs to us\n" -msgstr "Aceast cheie ne aparine\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 aparine persoanei numite n ID-ul\n" -"utilizator. Dac tii *cu adevrat* ce facei, putei\n" -"rspunde cu da la urmtoarea ntrebare.\n" - -#: g10/pkclist.c:468 -msgid "Use this key anyway? (y/N) " -msgstr "Folosii oricum aceast cheie? (d/N) " - -#: g10/pkclist.c:502 -msgid "WARNING: Using untrusted key!\n" -msgstr "AVERTISMENT: Folosii o cheie fr 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 semntura 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 semntur 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 indicaie c semntura aparine 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 " Semntura 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 semnturi 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 semntura aparine 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: srit: %s\n" - -#: g10/pkclist.c:834 g10/pkclist.c:1114 -#, c-format -msgid "%s: skipped: public key already present\n" -msgstr "%s: srit: 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 ai specificat un ID utilizator. (putei folosi \"-r\")\n" - -#: g10/pkclist.c:909 -msgid "Current recipients:\n" -msgstr "Destinatari cureni:\n" - -#: g10/pkclist.c:935 -msgid "" -"\n" -"Enter the user ID. End with an empty line: " -msgstr "" -"\n" -"Introducei ID-ul utilizator. Terminai 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 "srit: 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 "srit: 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: srit: 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: folosii opiunea \"--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 "Semntur detaat.\n" - -#: g10/plaintext.c:458 -msgid "Please enter name of data file: " -msgstr "V rugm introducei numele fiierului 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 gsit n preferinele " -"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 euat: %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 "Creai 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 "Ieire n armur ASCII forat.\n" - -#: g10/revoke.c:344 g10/revoke.c:568 -#, c-format -msgid "make_keysig_packet failed: %s\n" -msgstr "make_keysig_packet a euat: %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 gsit pentru \"%s\"\n" - -#: g10/revoke.c:471 -#, c-format -msgid "secret key \"%s\" not found: %s\n" -msgstr "cheia secret \"%s\" nu a fost gsit: %s\n" - -#: g10/revoke.c:500 -#, c-format -msgid "no corresponding public key: %s\n" -msgstr "nici o cheie public corespunztoare: %s\n" - -#: g10/revoke.c:511 -msgid "public key does not match secret key!\n" -msgstr "cheia public nu se potrivete cu cheia secret!\n" - -#: g10/revoke.c:518 -msgid "Create a revocation certificate for this key? (y/N) " -msgstr "Creai un certificat de revocare pentru aceast cheie? (d/N) " - -#: g10/revoke.c:535 -msgid "unknown protection algorithm\n" -msgstr "algoritm de protecie 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 rugm mutai-l pe un medium pe care l putei ascunde; dac cineva pune\n" -"mna pe acest certificat l-ar putea folosi s v fac cheia inutilizabil.\n" -"Este indicat s tiprii acest certificat i s-l pstrai undeva sigur, n\n" -"caz c mediumul este deteriorat. Dar fii atent: sistemul de tiprire al\n" -"mainii d-voastr ar putea pstra datele i s le fac accesibile altora!\n" - -#: g10/revoke.c:635 -msgid "Please select the reason for the revocation:\n" -msgstr "V rugm selectai 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 dorii s selectai %d aici)\n" - -#: g10/revoke.c:688 -msgid "Enter an optional description; end it with an empty line:\n" -msgstr "Introducei o descriere opional; terminai 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 "pri 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 protecie %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 rugm mai ncercai 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 rugm schimbai 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 protecia cheii secrete\n" - -#: g10/seskey.c:54 -msgid "weak key created - retrying\n" -msgstr "cheie slab creat - rencerc\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 semntur 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 dect semntura\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 dect semntura\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 semnturii %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 semntur 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 semntura 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 semntura 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 semnturi 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 semnturi 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 semnturi 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 semnturi 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 semnturii create a euat: %s\n" - -#: g10/sign.c:356 -#, c-format -msgid "%s/%s signature from: \"%s\"\n" -msgstr "%s/%s semntur 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 "putei semna-dataat 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: forarea algoritmului rezumat %s (%d) violeaz preferinele " -"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 "putei 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:127 g10/skclist.c:191 -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:158 -#, c-format -msgid "skipped \"%s\": duplicated\n" -msgstr "srit \"%s\": duplicat\n" - -#: g10/skclist.c:166 g10/skclist.c:176 g10/skclist.c:185 -#, c-format -msgid "skipped \"%s\": %s\n" -msgstr "srit \"%s\": %s\n" - -#: g10/skclist.c:171 -msgid "skipped: secret key already present\n" -msgstr "srit: cheia secret deja prezent\n" - -#: g10/skclist.c:186 -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 " -"semnturi!" - -#: 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 euat: %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" -"# (Folosii \"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 "lipsete valorea ncrederii n proprietari (ownertrust)" - -#: g10/tdbdump.c:215 -#, c-format -msgid "error finding trust record in `%s': %s\n" -msgstr "eroare gsire 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 euat: %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 euat: %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 euat (n=%d): %s\n" - -#: g10/tdbio.c:245 -msgid "trustdb transaction too large\n" -msgstr "tranzacia 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 euat 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 euat 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 euat: %s\n" - -#: g10/tdbio.c:1182 -#, c-format -msgid "trustdb: read failed (n=%d): %s\n" -msgstr "trustdb: citirea a euat (n=%d): %s\n" - -#: g10/tdbio.c:1203 -#, c-format -msgid "%s: not a trustdb file\n" -msgstr "%s: nu e un fiier 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 fiier 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 nregistrrii: %s\n" - -#: g10/tdbio.c:1459 -#, c-format -msgid "%s: failed to append a record: %s\n" -msgstr "%s: adugarea unei nregistrri a euat: %s\n" - -#: g10/tdbio.c:1504 -msgid "the trustdb is corrupted; please run \"gpg --fix-trustdb\".\n" -msgstr "trustdb este corupt; rulai \"gpg --fix-trustdb\".\n" - -#: g10/textfilter.c:149 -#, c-format -msgid "can't handle text lines longer than %d characters\n" -msgstr "nu pot mnui 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 - srit\n" - -#: g10/trustdb.c:321 -#, c-format -msgid "key %s marked as ultimately trusted\n" -msgstr "cheia %s marcat ca avnd 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 euat: %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 traductor 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 "urmtoarea 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 gsit: %s\n" - -#: g10/trustdb.c:1034 -msgid "please do a --check-trustdb\n" -msgstr "v rugm facei 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 numrtori valide anulate)\n" - -#: g10/trustdb.c:2160 -msgid "no ultimately trusted keys found\n" -msgstr "nu am gsit 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 gsit\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 "" -"adnc: %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 euat: %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 "" -"semntura nu a putut fi verificat.\n" -"V rugm amintii-v c fiierul de semntur (.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 lipsete 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 "semntur 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 gsit" - -#: 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 greit" - -#: 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 fiier" - -#: util/errors.c:76 -msgid "file write error" -msgstr "eroare scriere fiier" - -#: util/errors.c:77 -msgid "unknown compress algorithm" -msgstr "algoritm compresie necunoscut" - -#: util/errors.c:78 -msgid "file open error" -msgstr "eroare deschidere fiier" - -#: util/errors.c:79 -msgid "file create error" -msgstr "eroare creare fiier" - -#: 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 semnturi 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 fiier" - -#: util/errors.c:91 -msgid "file rename error" -msgstr "eroare redenumire fiier" - -#: util/errors.c:92 -msgid "file delete error" -msgstr "eroare tergere fiier" - -#: util/errors.c:93 -msgid "unexpected data" -msgstr "date neateptate" - -#: 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 "fiierul 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 reea" - -#: 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 "ai gsit 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 "vedei http://www.gnupg.org/faq.html pentru informaii suplimentare\n" - -#: util/secmem.c:350 -msgid "operation is not possible without initialized secure memory\n" -msgstr "" -"operaia nu este posibil fr memorie protejat (secure) iniializat\n" - -#: util/secmem.c:351 -msgid "(you may have used the wrong program for this task)\n" -msgstr "(ai 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 bii\n" - -#~ msgid "" -#~ "please see http://www.gnupg.org/why-not-idea.html for more information\n" -#~ msgstr "" -#~ "vedei http://www.gnupg.org/why-not-idea.html pentru informaii " -#~ "suplimentare\n" - -#~ msgid "" -#~ "a notation name must have only printable characters or spaces, and end " -#~ "with an '='\n" -#~ msgstr "" -#~ "un nume de notaie trebuie s conin numai caractere imprimabile sau " -#~ "spaii i s se termine cu un '='\n" - -#~ msgid "a user notation name must contain the '@' character\n" -#~ msgstr "un nume de notaie utilizator trebuie s conin caracterul '@'\n" - -#~ msgid "a notation name must not contain more than one '@' character\n" -#~ msgstr "" -#~ "un nume de notaie trebuie s nu conin mai mult de un caracter '@'\n" - -#~ msgid "a notation value must not use any control characters\n" -#~ msgstr "" -#~ "o valoare de notaie trebuie s nu foloseasc nici un caracter de " -#~ "control\n" - -#~ msgid "WARNING: invalid notation data found\n" -#~ msgstr "AVERTISMENT: am gsit date de notare invalide\n" - -#~ msgid "not human readable" -#~ msgstr "ilizibil" - -#, fuzzy -#~ msgid "all export-clean-* options from above" -#~ msgstr "citete opiuni din fiier" - -#, fuzzy -#~ msgid "all import-clean-* options from above" -#~ msgstr "citete opiuni din fiier" - -#~ msgid "expired: %s)" -#~ msgstr "expirat: %s)" - -#~ msgid "key %s: expired signature from key %s - skipped\n" -#~ msgstr "cheia %s: semntur expirat de la cheia %s - srit\n" - -#, fuzzy -#~ msgid "Unable to clean `%s'\n" -#~ msgstr "nu pot executa programul `%s': %s\n" - -#, fuzzy -#~ msgid "User ID \"%s\": %d signature removed.\n" -#~ msgstr "ID utilizator \"%s\" a fost revocat." - -#, fuzzy -#~ msgid "User ID \"%s\": %d signatures removed.\n" -#~ msgstr "ID utilizator \"%s\" a fost revocat." - -#, fuzzy -#~ msgid "User ID \"%s\" removed: %s\n" -#~ msgstr "ID utilizator \"%s\" a fost revocat." - -#, 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 obinerea numrului 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 greit 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 "rspuns 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 ediie\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. Folosii-l pe " -#~ "riscul dvs.!\n" - -#~ msgid "|[files]|encrypt files" -#~ msgstr "|[fiiere]|cifreaz fiiere" - -#~ msgid "store only" -#~ msgstr "doar pstreaz" - -#~ msgid "|[files]|decrypt files" -#~ msgstr "|[fiiere]|decripteaz fiiere" - -#~ 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 secvena de pachete" - -#~ msgid "export the ownertrust values" -#~ msgstr "export valorile ncrederii n proprietari" - -#~ msgid "unattended trust database update" -#~ msgstr "actualizare fr 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 fiier sau intrrii standard (stdin)" - -#~ msgid "En-Armor a file or stdin" -#~ msgstr "Pune armura unui fiier sau intrrii standard (stdin)" - -#~ msgid "|NAME|use NAME as default recipient" -#~ msgstr "|NUME|folosete NUME ca destinatar implicit" - -#~ msgid "use the default key as default recipient" -#~ msgstr "folosete cheia implicit ca destinatar implicit" - -#~ msgid "don't use the terminal at all" -#~ msgstr "nu folosi deloc terminalul" - -#~ msgid "force v3 signatures" -#~ msgstr "foreaz semnturi v3" - -#~ msgid "do not force v3 signatures" -#~ msgstr "nu fora semnturi v3" - -#~ msgid "force v4 key signatures" -#~ msgstr "foreaz semnturi de chei v4" - -#~ msgid "do not force v4 key signatures" -#~ msgstr "nu fora semnturi de chei v4" - -#~ msgid "always use a MDC for encryption" -#~ msgstr "folosete 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 "folosete 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 ntrebri" - -#~ msgid "assume no on most questions" -#~ msgstr "presupune nu la cele mai multe ntrebri" - -#~ 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|folosete NUME ca cheie secret implicit" - -#~ msgid "|HOST|use this keyserver to lookup keys" -#~ msgstr "|HOST|folosete acest server de chei pentru a cuta 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 "|[fiier]|scrie informaii de stare n fiier" - -#~ msgid "|KEYID|ultimately trust this key" -#~ msgstr "|IDCHEIE|ai ncredere deplin n aceast cheie" - -#~ msgid "|FILE|load extension module FILE" -#~ msgstr "|FIIER|ncarc modulul extensie FIIER" - -#~ 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 opiunile 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 opiunile pentru pachete, cifru i rezumat ca pentru " -#~ "comportamentul PGP 2.x" - -#~ msgid "|N|use passphrase mode N" -#~ msgstr "|N|folosete modul fraz-parol N" - -#~ msgid "|NAME|use message digest algorithm NAME for passphrases" -#~ msgstr "|NUME|folosete algoritm rezumat mesaj NUME pentru fraza-parol" - -#~ msgid "|NAME|use cipher algorithm NAME for passphrases" -#~ msgstr "|NUME|folosete algoritm cifrare NUME pentru fraza-parol" - -#~ msgid "|NAME|use cipher algorithm NAME" -#~ msgstr "|NUME|folosete algoritm cifrare NUME" - -#~ msgid "|NAME|use message digest algorithm NAME" -#~ msgstr "|NUME|folosete algoritm rezumat mesaj NUME" - -#~ msgid "|N|use compress algorithm N" -#~ msgstr "|N|folosete algoritm compresie N" - -#~ msgid "throw keyid field of encrypted packets" -#~ msgstr "ignor cmp keyid pentru pachete cifrate" - -#~ msgid "Show Photo IDs" -#~ msgstr "Arat poze ID-uri" - -#~ msgid "Don't show Photo IDs" -#~ msgstr "Nu arta 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 ediie\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 aparine ntr-adevr\n" -#~ "proprietarului, dar este oricum acceptat\n" - -#~ msgid "preference %c%lu is not valid\n" -#~ msgstr "preferina %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 generai 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 "Suntei sigur() c dorii 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 inei minte c radiaia 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: fiier gol\n" - -#~ msgid "key %08lX: not a rfc2440 key - skipped\n" -#~ msgstr "cheia %08lX: nu e o cheie rfc2440 - srit\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 semnturi" - -#~ 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 semnturi" - -#~ 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 semnturi" - -#~ 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 gsit o revocare falsificat\n" - -#~ msgid "rev? problem checking revocation: %s\n" -#~ msgstr "rev? probleme la verificare revocrii: %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 rugm folosii unul " -#~ "standard!\n" - -#~ msgid "can't get key from keyserver: %s\n" -#~ msgstr "nu pot obine 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 euat 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 cuta 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 semnturi!\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 avnd ncredere suprem\n" - -#~ msgid "signature from Elgamal signing key %08lX to %08lX skipped\n" -#~ msgstr "semntur de la cheia de semnare Elgamal %08lX la %08lX srit\n" - -#~ msgid "signature from %08lX to Elgamal signing key %08lX skipped\n" -#~ msgstr "semntur de la %08lX la cheia de semnare Elgamal %08lX srit\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 dorii oricum s folosii aceast cheie revocat, rspundei \"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 "" -#~ "Selectai algoritmul de folosit.\n" -#~ "\n" -#~ "DSA (sau DSS) este algoritmul de semntur digital care poate fi " -#~ "folosit\n" -#~ "doar pentru semnturi. Acesta este algoritmul sugerat pentru c " -#~ "verificarea\n" -#~ "semnturilor DSA este mult mai rapid dect a celor ElGamal.\n" -#~ "\n" -#~ "ElGamal este un algoritm ce poate fi folosit pentru semnturi i " -#~ "cifrare.\n" -#~ "OpenPGP face distincie ntre cele dou variante ale acestui algoritm: " -#~ "cel\n" -#~ "numai pentru cifrare i cel pentru semnare+cifrare; algoritmul este " -#~ "acelai\n" -#~ "dar civa parametrii trebuie selectai ntr-un mod special pentru a " -#~ "crea\n" -#~ "o cheie sigur pentru semnturi: acest program face acest lucru, dar " -#~ "alte\n" -#~ "implementri OpenPGP ar putea s nu neleag 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 semnturile 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 pn acum verificate (%lu semnturi)\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 ru, nu pot face acest lucru n modul batch\n" - -#~ msgid "can't open file: %s\n" -#~ msgstr "nu pot deschide fiierul: %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 vei putea\n" -#~ "folosi aceast cheie pentru a comunica cu ali utilizatori PGP. Mai " -#~ "mult,\n" -#~ "acest algoritm este foarte lent i ar putea fi mai puin sigur dect\n" -#~ "celelalte opiuni.\n" - -#~ msgid "Create anyway? " -#~ msgstr "Creai 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.po b/po/ru.po deleted file mode 100644 index ce79870e0..000000000 --- a/po/ru.po +++ /dev/null @@ -1,6290 +0,0 @@ -# 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-07-28 11:12+0200\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:1003 g10/gpg.c:3461 g10/import.c:195 g10/keygen.c:2385 -#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:342 -#: 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:1002 g10/keygen.c:2864 -#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:263 -#: g10/openfile.c:357 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:320 -#, c-format -msgid "armor: %s\n" -msgstr "формат ASCII: %s\n" - -#: g10/armor.c:359 -msgid "invalid armor header: " -msgstr "неправильный заголовок ASCII: " - -#: g10/armor.c:370 -msgid "armor header: " -msgstr "заголовок ASCII: " - -#: g10/armor.c:381 -msgid "invalid clearsig header\n" -msgstr "неправильный заголовок прозрачной подписи\n" - -#: g10/armor.c:433 -msgid "nested clear text signatures\n" -msgstr "вложенные прозрачные подписи\n" - -#: g10/armor.c:568 -msgid "unexpected armor: " -msgstr "неожиданный формат ASCII:" - -#: g10/armor.c:580 -msgid "invalid dash escaped line: " -msgstr "неправильный отступ из минусов: " - -#: g10/armor.c:734 g10/armor.c:1343 -#, c-format -msgid "invalid radix64 character %02X skipped\n" -msgstr "недопустимый символ radix64 %02X пропущен\n" - -#: g10/armor.c:777 -msgid "premature eof (no CRC)\n" -msgstr "преждевременный конец файла (нет CRC)\n" - -#: g10/armor.c:811 -msgid "premature eof (in CRC)\n" -msgstr "преждевременный конец файла (в CRC)\n" - -#: g10/armor.c:819 -msgid "malformed CRC\n" -msgstr "поврежденный CRC\n" - -#: g10/armor.c:823 g10/armor.c:1380 -#, c-format -msgid "CRC error; %06lX - %06lX\n" -msgstr "ошибка CRC; %06lX - %06lX\n" - -#: g10/armor.c:843 -msgid "premature eof (in trailer)\n" -msgstr "преждевременный конец файла (в дополнении)\n" - -#: g10/armor.c:847 -msgid "error in trailer line\n" -msgstr "ошибка в строке дополнения\n" - -#: g10/armor.c:1158 -msgid "no valid OpenPGP data found.\n" -msgstr "не найдено данных формата OpenPGP.\n" - -#: g10/armor.c:1163 -#, c-format -msgid "invalid armor: line longer than %d characters\n" -msgstr "неправильный ASCII формат: строка длиннее %d символов\n" - -#: g10/armor.c:1167 -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:280 -#, 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:3826 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:3387 g10/keyserver.c:1700 -#: 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:2349 g10/keyserver.c:1714 -#: 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:67 g10/mainproc.c:293 -#, c-format -msgid "%s encrypted data\n" -msgstr "Данные зашифрованы алгоритмом %s\n" - -#: g10/encr-data.c:69 g10/mainproc.c:297 -#, c-format -msgid "encrypted with unknown algorithm %d\n" -msgstr "зашифровано неизвестным алгоритмом %d\n" - -#: g10/encr-data.c:93 -msgid "" -"WARNING: message was encrypted with a weak key in the symmetric cipher.\n" -msgstr "" -"ВНИМАНИЕ: сообщение было зашифровано слабым ключом симметричного шифра.\n" - -#: g10/encr-data.c:104 -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:415 -#, 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:375 -msgid "" -"@Commands:\n" -" " -msgstr "" -"@Команды:\n" -" " - -#: g10/gpg.c:377 -msgid "|[file]|make a signature" -msgstr "|[file]|создать подпись к файлу" - -#: g10/gpg.c:378 -msgid "|[file]|make a clear text signature" -msgstr "|[file]|создать прозрачную подпись к файлу" - -#: g10/gpg.c:379 -msgid "make a detached signature" -msgstr "создать отделенную подпись" - -#: g10/gpg.c:380 -msgid "encrypt data" -msgstr "зашифровать данные" - -#: g10/gpg.c:382 -msgid "encryption only with symmetric cipher" -msgstr "зашифровать только симметричным шифром" - -#: g10/gpg.c:384 -msgid "decrypt data (default)" -msgstr "расшифровать данные (по умолчанию)" - -#: g10/gpg.c:386 -msgid "verify a signature" -msgstr "проверить подпись" - -#: g10/gpg.c:388 -msgid "list keys" -msgstr "вывести список ключей" - -#: g10/gpg.c:390 -msgid "list keys and signatures" -msgstr "вывести список ключей и подписей" - -#: g10/gpg.c:391 -msgid "list and check key signatures" -msgstr "вывести и проверить подписи ключей" - -#: g10/gpg.c:392 -msgid "list keys and fingerprints" -msgstr "вывести список ключей и их отпечатков" - -#: g10/gpg.c:393 -msgid "list secret keys" -msgstr "вывести список секретных ключей" - -#: g10/gpg.c:394 -msgid "generate a new key pair" -msgstr "создать новую пару ключей" - -#: g10/gpg.c:395 -msgid "remove keys from the public keyring" -msgstr "удалить ключи из таблицы открытых ключей" - -#: g10/gpg.c:397 -msgid "remove keys from the secret keyring" -msgstr "удалить ключи из таблицы закрытых ключей" - -#: g10/gpg.c:398 -msgid "sign a key" -msgstr "подписать ключ" - -#: g10/gpg.c:399 -msgid "sign a key locally" -msgstr "подписать ключ локально" - -#: g10/gpg.c:400 -msgid "sign or edit a key" -msgstr "подписать или редактировать ключ" - -#: g10/gpg.c:401 -msgid "generate a revocation certificate" -msgstr "создать сертификат отзыва" - -#: g10/gpg.c:403 -msgid "export keys" -msgstr "экспортировать ключи" - -#: g10/gpg.c:404 -msgid "export keys to a key server" -msgstr "экспортировать ключи на сервер ключей" - -#: g10/gpg.c:405 -msgid "import keys from a key server" -msgstr "импортировать ключи с сервера ключей" - -#: g10/gpg.c:407 -msgid "search for keys on a key server" -msgstr "искать ключи на сервере ключей" - -#: g10/gpg.c:409 -msgid "update all keys from a keyserver" -msgstr "обновить все ключи с сервера ключей" - -#: g10/gpg.c:413 -msgid "import/merge keys" -msgstr "импортировать/объединить ключи" - -#: g10/gpg.c:416 -msgid "print the card status" -msgstr "показать состояние карты" - -#: g10/gpg.c:417 -msgid "change data on a card" -msgstr "изменить данные на карте" - -#: g10/gpg.c:418 -msgid "change a card's PIN" -msgstr "сменить PIN карты" - -#: g10/gpg.c:426 -msgid "update the trust database" -msgstr "обновить таблицу доверий" - -#: g10/gpg.c:433 -msgid "|algo [files]|print message digests" -msgstr "|algo [files]|вывести хэши файлов" - -#: g10/gpg.c:437 g10/gpgv.c:71 -msgid "" -"@\n" -"Options:\n" -" " -msgstr "" -"@\n" -"Параметры:\n" -" " - -#: g10/gpg.c:439 -msgid "create ascii armored output" -msgstr "вывод в ASCII формате" - -#: g10/gpg.c:441 -msgid "|NAME|encrypt for NAME" -msgstr "|NAME|зашифровать для получателя NAME" - -#: g10/gpg.c:452 -msgid "use this user-id to sign or decrypt" -msgstr "использовать данный User ID для подписывания и расшифрования" - -#: g10/gpg.c:453 -msgid "|N|set compress level N (0 disables)" -msgstr "|N|установить уровень сжатия N (по умолчанию - 0)" - -#: g10/gpg.c:458 -msgid "use canonical text mode" -msgstr "использовать канонический текстовый режим" - -#: g10/gpg.c:472 -msgid "use as output file" -msgstr "вывод в указанный файл" - -#: g10/gpg.c:474 g10/gpgv.c:73 -msgid "verbose" -msgstr "подробно" - -#: g10/gpg.c:485 -msgid "do not make any changes" -msgstr "не делать никаких изменений" - -#: g10/gpg.c:486 -msgid "prompt before overwriting" -msgstr "спросить перед перезаписью" - -#: g10/gpg.c:527 -msgid "use strict OpenPGP behavior" -msgstr "строго следовать стандарту OpenPGP" - -#: g10/gpg.c:528 -msgid "generate PGP 2.x compatible messages" -msgstr "создает сообщение совместимым с PGP 2.x" - -#: g10/gpg.c:556 -msgid "" -"@\n" -"(See the man page for a complete listing of all commands and options)\n" -msgstr "" -"@\n" -"(См. документацию для более полного ознакомления с командами и параметрами)\n" - -#: g10/gpg.c:559 -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:757 g10/gpgv.c:98 -msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n" -msgstr "О найденных ошибка сообщайте <gnupg-bugs@gnu.org>.\n" - -#: g10/gpg.c:774 -msgid "Usage: gpg [options] [files] (-h for help)" -msgstr "Использование: gpg [параметры] [файлы] (-h для подсказки)" - -#: g10/gpg.c:777 -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:788 -msgid "" -"\n" -"Supported algorithms:\n" -msgstr "" -"\n" -"Поддерживаются следующие алгоритмы:\n" - -#: g10/gpg.c:791 -msgid "Pubkey: " -msgstr "С открытым ключом: " - -#: g10/gpg.c:797 g10/keyedit.c:2310 -msgid "Cipher: " -msgstr "Симметричные шифры: " - -#: g10/gpg.c:803 -msgid "Hash: " -msgstr "Хэш-функции: " - -#: g10/gpg.c:809 g10/keyedit.c:2356 -msgid "Compression: " -msgstr "Алгоритмы сжатия: " - -#: g10/gpg.c:892 -msgid "usage: gpg [options] " -msgstr "использование: gpg [опции] " - -#: g10/gpg.c:1040 -msgid "conflicting commands\n" -msgstr "несовместимые команды\n" - -#: g10/gpg.c:1058 -#, c-format -msgid "no = sign found in group definition `%s'\n" -msgstr "отсутствует знак = в определении группы `%s'\n" - -#: g10/gpg.c:1255 -#, c-format -msgid "WARNING: unsafe ownership on homedir `%s'\n" -msgstr "ВНИМАНИЕ: небезопасный владелец домашнего каталога `%s'\n" - -#: g10/gpg.c:1258 -#, c-format -msgid "WARNING: unsafe ownership on configuration file `%s'\n" -msgstr "ВНИМАНИЕ: небезопасный владелец файла конфигурации `%s'\n" - -#: g10/gpg.c:1261 -#, c-format -msgid "WARNING: unsafe ownership on extension `%s'\n" -msgstr "ВНИМАНИЕ: небезопасный владелец файла модуля расширения `%s'\n" - -#: g10/gpg.c:1267 -#, c-format -msgid "WARNING: unsafe permissions on homedir `%s'\n" -msgstr "ВНИМАНИЕ: небезопасные права доступа к домашнему каталогу `%s'\n" - -#: g10/gpg.c:1270 -#, c-format -msgid "WARNING: unsafe permissions on configuration file `%s'\n" -msgstr "ВНИМАНИЕ: небезопасные права доступа к файлу конфигурации `%s'\n" - -#: g10/gpg.c:1273 -#, c-format -msgid "WARNING: unsafe permissions on extension `%s'\n" -msgstr "ВНИМАНИЕ: небезопасные права доступа к файлу модуля расширения `%s'\n" - -#: g10/gpg.c:1279 -#, c-format -msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n" -msgstr "" -"ВНИМАНИЕ: небезопасный владелец каталога содержащего домашний каталог `%s'\n" - -#: g10/gpg.c:1282 -#, c-format -msgid "" -"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n" -msgstr "" -"ВНИМАНИЕ: небезопасный владелец каталога содержащего файл конфигурации `%s'\n" - -#: g10/gpg.c:1285 -#, c-format -msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n" -msgstr "" -"ВНИМАНИЕ: небезопасный владелец каталога содержащего модуль расширения `%s'\n" - -#: g10/gpg.c:1291 -#, c-format -msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n" -msgstr "" -"ВНИМАНИЕ: небезопасные права доступа к каталогу содержащему домашний каталог " -"`%s'\n" - -#: g10/gpg.c:1294 -#, c-format -msgid "" -"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n" -msgstr "" -"ВНИМАНИЕ: небезопасные права доступа к каталогу содержащему файл " -"конфигурации `%s'\n" - -#: g10/gpg.c:1297 -#, c-format -msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n" -msgstr "" -"ВНИМАНИЕ: небезопасные права доступа к каталогу содержащему файл модуля " -"расширения `%s'\n" - -#: g10/gpg.c:1438 -#, c-format -msgid "unknown configuration item `%s'\n" -msgstr "неизвестный параметр в файле конфигурации `%s'\n" - -#: g10/gpg.c:1531 -msgid "display photo IDs during key listings" -msgstr "" - -#: g10/gpg.c:1533 -msgid "show policy URLs during signature listings" -msgstr "" - -#: g10/gpg.c:1535 -#, fuzzy -msgid "show all notations during signature listings" -msgstr "Нет соответствующей подписи в связке секретных\n" - -#: g10/gpg.c:1537 -msgid "show IETF standard notations during signature listings" -msgstr "" - -#: g10/gpg.c:1541 -msgid "show user-supplied notations during signature listings" -msgstr "" - -#: g10/gpg.c:1543 -#, fuzzy -msgid "show preferred keyserver URLs during signature listings" -msgstr "заданный URL предпочитаемого сервера ключей неправилен\n" - -#: g10/gpg.c:1545 -msgid "show user ID validity during key listings" -msgstr "" - -#: g10/gpg.c:1547 -msgid "show revoked and expired user IDs in key listings" -msgstr "" - -#: g10/gpg.c:1549 -msgid "show revoked and expired subkeys in key listings" -msgstr "" - -#: g10/gpg.c:1551 -#, fuzzy -msgid "show the keyring name in key listings" -msgstr "переключение между просмотром открытых и закрытых ключей" - -#: g10/gpg.c:1553 -#, fuzzy -msgid "show expiration dates during signature listings" -msgstr "Нет соответствующей подписи в связке секретных\n" - -#: g10/gpg.c:1920 -#, c-format -msgid "NOTE: old default options file `%s' ignored\n" -msgstr "ЗАМЕЧАНИЕ: старый файл конфигурации по умолчанию `%s' проигнорирован\n" - -#: g10/gpg.c:1962 -#, c-format -msgid "NOTE: no default option file `%s'\n" -msgstr "ЗАМЕЧАНИЕ: файл конфигурации `%s' не обнаружен\n" - -#: g10/gpg.c:1966 -#, c-format -msgid "option file `%s': %s\n" -msgstr "файл конфигурации `%s': %s\n" - -#: g10/gpg.c:1973 -#, c-format -msgid "reading options from `%s'\n" -msgstr "параметры конфигурации взяты из файла `%s'\n" - -#: g10/gpg.c:2188 g10/gpg.c:2814 g10/gpg.c:2833 -#, c-format -msgid "NOTE: %s is not for normal use!\n" -msgstr "ЗАМЕЧАНИЕ: %s не предназначен для нормального применения!\n" - -#: g10/gpg.c:2201 -#, c-format -msgid "cipher extension `%s' not loaded due to unsafe permissions\n" -msgstr "" -"расширение шифра `%s' не загружено вследствие небезопасных прав доступа\n" - -#: g10/gpg.c:2364 g10/gpg.c:2376 -#, c-format -msgid "`%s' is not a valid signature expiration\n" -msgstr "`%s' недопустимый срок действия подписи\n" - -#: g10/gpg.c:2452 -#, c-format -msgid "`%s' is not a valid character set\n" -msgstr "`%s' недопустимая таблица символов\n" - -#: g10/gpg.c:2476 g10/gpg.c:2663 g10/keyedit.c:4064 -msgid "could not parse keyserver URL\n" -msgstr "не могу проанализировать URL сервера ключей\n" - -# test it -#: g10/gpg.c:2488 -#, c-format -msgid "%s:%d: invalid keyserver options\n" -msgstr "%s:%d: недопустимые параметры для сервера ключей\n" - -# test it -#: g10/gpg.c:2491 -msgid "invalid keyserver options\n" -msgstr "недопустимые параметры для сервера ключей\n" - -#: g10/gpg.c:2498 -#, c-format -msgid "%s:%d: invalid import options\n" -msgstr "%s:%d: недопустимые параметры импорта\n" - -#: g10/gpg.c:2501 -msgid "invalid import options\n" -msgstr "недопустимые параметры импорта\n" - -#: g10/gpg.c:2508 -#, c-format -msgid "%s:%d: invalid export options\n" -msgstr "%s:%d: недопустимые параметры экспорта\n" - -#: g10/gpg.c:2511 -msgid "invalid export options\n" -msgstr "недопустимые параметры экспорта\n" - -#: g10/gpg.c:2518 -#, c-format -msgid "%s:%d: invalid list options\n" -msgstr "%s:%d: недопустимый список параметров\n" - -#: g10/gpg.c:2521 -msgid "invalid list options\n" -msgstr "недопустимый список параметров\n" - -#: g10/gpg.c:2529 -msgid "display photo IDs during signature verification" -msgstr "" - -#: g10/gpg.c:2531 -msgid "show policy URLs during signature verification" -msgstr "" - -#: g10/gpg.c:2533 -#, fuzzy -msgid "show all notations during signature verification" -msgstr "`%s' недопустимый срок действия подписи\n" - -#: g10/gpg.c:2535 -msgid "show IETF standard notations during signature verification" -msgstr "" - -#: g10/gpg.c:2539 -msgid "show user-supplied notations during signature verification" -msgstr "" - -#: g10/gpg.c:2541 -#, fuzzy -msgid "show preferred keyserver URLs during signature verification" -msgstr "заданный URL предпочитаемого сервера ключей неправилен\n" - -#: g10/gpg.c:2543 -#, fuzzy -msgid "show user ID validity during signature verification" -msgstr "`%s' недопустимый срок действия подписи\n" - -#: g10/gpg.c:2545 -msgid "show revoked and expired user IDs in signature verification" -msgstr "" - -#: g10/gpg.c:2547 -msgid "validate signatures with PKA data" -msgstr "" - -#: g10/gpg.c:2549 -msgid "elevate the trust of signatures with valid PKA data" -msgstr "" - -# test it -#: g10/gpg.c:2556 -#, c-format -msgid "%s:%d: invalid verify options\n" -msgstr "%s:%d: недопустимые параметры проверки \n" - -# test it -#: g10/gpg.c:2559 -msgid "invalid verify options\n" -msgstr "недопустимые параметры проверки\n" - -#: g10/gpg.c:2566 -#, c-format -msgid "unable to set exec-path to %s\n" -msgstr "не могу определить путь запуска для %s\n" - -# test it -#: g10/gpg.c:2729 -#, fuzzy, c-format -msgid "%s:%d: invalid auto-key-locate list\n" -msgstr "%s:%d: недопустимые параметры проверки \n" - -#: g10/gpg.c:2732 -msgid "invalid auto-key-locate list\n" -msgstr "" - -#: g10/gpg.c:2803 -msgid "WARNING: program may create a core file!\n" -msgstr "ВНИМАНИЕ: возможно создание файла дампа памяти!\n" - -#: g10/gpg.c:2807 -#, c-format -msgid "WARNING: %s overrides %s\n" -msgstr "ВНИМАНИЕ: %s заместит %s\n" - -#: g10/gpg.c:2816 -#, c-format -msgid "%s not allowed with %s!\n" -msgstr "%s не допускается использовать с %s!\n" - -#: g10/gpg.c:2819 -#, c-format -msgid "%s makes no sense with %s!\n" -msgstr "%s не имеет смысла совместно с %s!\n" - -#: g10/gpg.c:2826 -#, c-format -msgid "NOTE: %s is not available in this version\n" -msgstr "ПРЕДУПРЕЖДАЮ: %s недоступен в данной версии\n" - -#: g10/gpg.c:2841 -#, c-format -msgid "will not run with insecure memory due to %s\n" -msgstr "не будет работать с небезопасной памятью из-за %s\n" - -#: g10/gpg.c:2855 -msgid "you can only make detached or clear signatures while in --pgp2 mode\n" -msgstr "" -"можно сделать только отделенную или прозрачную подпись в режиме --pgp2\n" - -#: g10/gpg.c:2861 -msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n" -msgstr "Вы не можете одновременно подписать и зашифровать в режиме --pgp2\n" - -#: g10/gpg.c:2867 -msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n" -msgstr "Вы должны использовать файлы (а не каналы (pipe)) в режиме --pgp2.\n" - -#: g10/gpg.c:2880 -msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n" -msgstr "для зашифрования сообщения в режиме --pgp2 требуется шифр IDEA\n" - -#: g10/gpg.c:2947 g10/gpg.c:2971 -msgid "selected cipher algorithm is invalid\n" -msgstr "выбран неверный алгоритм шифрования\n" - -#: g10/gpg.c:2953 g10/gpg.c:2977 -msgid "selected digest algorithm is invalid\n" -msgstr "выбрана неверная хэш-функция\n" - -#: g10/gpg.c:2959 -msgid "selected compression algorithm is invalid\n" -msgstr "выбран неверный алгоритм сжатия\n" - -#: g10/gpg.c:2965 -msgid "selected certification digest algorithm is invalid\n" -msgstr "выбрана неверная хэш-функция для сертификации\n" - -#: g10/gpg.c:2980 -msgid "completes-needed must be greater than 0\n" -msgstr "completes-needed должен быть больше 0\n" - -#: g10/gpg.c:2982 -msgid "marginals-needed must be greater than 1\n" -msgstr "marginals-needed должен быть больше 1\n" - -#: g10/gpg.c:2984 -msgid "max-cert-depth must be in the range from 1 to 255\n" -msgstr "max-cert-depth должен быть в диапазоне от 1 до 255\n" - -#: g10/gpg.c:2986 -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:2988 -msgid "invalid min-cert-level; must be 1, 2, or 3\n" -msgstr "недопустимый min-cert-level; должен быть 0, 1, 2 или 3\n" - -#: g10/gpg.c:2991 -msgid "NOTE: simple S2K mode (0) is strongly discouraged\n" -msgstr "ЗАМЕЧАНИЕ: простой режим S2K (0) строго не рекомендуется\n" - -#: g10/gpg.c:2995 -msgid "invalid S2K mode; must be 0, 1 or 3\n" -msgstr "недопустимый режим S2K; должно быть 0, 1 или 3\n" - -#: g10/gpg.c:3002 -msgid "invalid default preferences\n" -msgstr "недопустимые предпочтения по умолчанию\n" - -#: g10/gpg.c:3011 -msgid "invalid personal cipher preferences\n" -msgstr "недопустимые персональные предпочтения шифра\n" - -#: g10/gpg.c:3015 -msgid "invalid personal digest preferences\n" -msgstr "недопустимые персональные предпочтения хэш-функции\n" - -#: g10/gpg.c:3019 -msgid "invalid personal compress preferences\n" -msgstr "недопустимые персональные предпочтения алгоритмов сжатия\n" - -#: g10/gpg.c:3052 -#, c-format -msgid "%s does not yet work with %s\n" -msgstr "%s пока не работает совместно с %s!\n" - -#: g10/gpg.c:3099 -#, c-format -msgid "you may not use cipher algorithm `%s' while in %s mode\n" -msgstr "Вы не можете использовать шифрование `%s' в режиме %s\n" - -#: g10/gpg.c:3104 -#, c-format -msgid "you may not use digest algorithm `%s' while in %s mode\n" -msgstr "Вы не можете использовать хэш-функцию `%s' в режиме %s\n" - -#: g10/gpg.c:3109 -#, c-format -msgid "you may not use compression algorithm `%s' while in %s mode\n" -msgstr "Вы не можете использовать сжатие `%s' в режиме %s\n" - -#: g10/gpg.c:3208 -#, c-format -msgid "failed to initialize the TrustDB: %s\n" -msgstr "сбой инициализации таблицы доверий: %s\n" - -#: g10/gpg.c:3219 -msgid "WARNING: recipients (-r) given without using public key encryption\n" -msgstr "" -"ВНИМАНИЕ: получатели (-r) заданы без использования шифрования с открытым " -"ключом\n" - -#: g10/gpg.c:3230 -msgid "--store [filename]" -msgstr "--store [filename]" - -#: g10/gpg.c:3237 -msgid "--symmetric [filename]" -msgstr "--symmetric [filename]" - -#: g10/gpg.c:3239 -#, c-format -msgid "symmetric encryption of `%s' failed: %s\n" -msgstr "симметричное шифрование `%s' не удалось: %s\n" - -#: g10/gpg.c:3249 -msgid "--encrypt [filename]" -msgstr "--encrypt [filename]" - -#: g10/gpg.c:3262 -msgid "--symmetric --encrypt [filename]" -msgstr "--symmetric --encrypt [имяфайла]" - -#: g10/gpg.c:3264 -msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n" -msgstr "нельзя использовать --symmetric --encrypt совместно с --s2k-mode 0\n" - -#: g10/gpg.c:3267 -#, c-format -msgid "you cannot use --symmetric --encrypt while in %s mode\n" -msgstr "невозможно использовать --symmetric --encrypt в режиме %s\n" - -#: g10/gpg.c:3285 -msgid "--sign [filename]" -msgstr "--sign [filename]" - -#: g10/gpg.c:3298 -msgid "--sign --encrypt [filename]" -msgstr "--sign --encrypt [filename]" - -#: g10/gpg.c:3313 -msgid "--symmetric --sign --encrypt [filename]" -msgstr "--symmetric --sign --encrypt [имяфайла]" - -#: g10/gpg.c:3315 -msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n" -msgstr "" -"нельзя использовать --symmetric --sign --encrypt совместно с --s2k-mode 0\n" - -#: g10/gpg.c:3318 -#, c-format -msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n" -msgstr "невозможно использовать --symmetric --sign --encrypt в режиме %s\n" - -#: g10/gpg.c:3338 -msgid "--sign --symmetric [filename]" -msgstr "--sign --symmetric [filename]" - -#: g10/gpg.c:3347 -msgid "--clearsign [filename]" -msgstr "--clearsign [filename]" - -#: g10/gpg.c:3372 -msgid "--decrypt [filename]" -msgstr "--decrypt [filename]" - -#: g10/gpg.c:3380 -msgid "--sign-key user-id" -msgstr "--sign-key user-id" - -#: g10/gpg.c:3384 -msgid "--lsign-key user-id" -msgstr "--lsign-key user-id" - -#: g10/gpg.c:3405 -msgid "--edit-key user-id [commands]" -msgstr "--edit-key user-id [commands]" - -#: g10/gpg.c:3476 -msgid "-k[v][v][v][c] [user-id] [keyring]" -msgstr "-k[v][v][v][c] [user-id] [keyring]" - -#: g10/gpg.c:3518 -#, c-format -msgid "keyserver send failed: %s\n" -msgstr "сбой при отправке на сервер ключей: %s\n" - -#: g10/gpg.c:3520 -#, c-format -msgid "keyserver receive failed: %s\n" -msgstr "сбой при получении с сервера ключей: %s\n" - -#: g10/gpg.c:3522 -#, c-format -msgid "key export failed: %s\n" -msgstr "сбой при экспорте ключа: %s\n" - -#: g10/gpg.c:3533 -#, c-format -msgid "keyserver search failed: %s\n" -msgstr "сбой при поиске на сервере ключей: %s\n" - -#: g10/gpg.c:3543 -#, c-format -msgid "keyserver refresh failed: %s\n" -msgstr "сбой при обновлении с сервера ключей: %s\n" - -#: g10/gpg.c:3594 -#, c-format -msgid "dearmoring failed: %s\n" -msgstr "ошибка преобразования из ASCII формата: %s\n" - -#: g10/gpg.c:3602 -#, c-format -msgid "enarmoring failed: %s\n" -msgstr "ошибка преобразования в ASCII формат: %s\n" - -#: g10/gpg.c:3689 -#, c-format -msgid "invalid hash algorithm `%s'\n" -msgstr "недопустимая хэш-функция `%s'\n" - -#: g10/gpg.c:3812 -msgid "[filename]" -msgstr "[filename]" - -#: g10/gpg.c:3816 -msgid "Go ahead and type your message ...\n" -msgstr "Набирайте Ваше сообщение ...\n" - -#: g10/gpg.c:4120 -msgid "the given certification policy URL is invalid\n" -msgstr "заданный URL политики сертификации неверен\n" - -#: g10/gpg.c:4122 -msgid "the given signature policy URL is invalid\n" -msgstr "заданный URL политики подписи неверен\n" - -#: g10/gpg.c:4155 -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:3707 -#, 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:266 -#, c-format -msgid "skipping block of type %d\n" -msgstr "пропущен блок типа %d\n" - -# test it -#: g10/import.c:275 -#, c-format -msgid "%lu keys processed so far\n" -msgstr "%lu ключей обработано\n" - -#: g10/import.c:292 -#, c-format -msgid "Total number processed: %lu\n" -msgstr "Всего обработано: %lu\n" - -#: g10/import.c:294 -#, c-format -msgid " skipped new keys: %lu\n" -msgstr " пропущено новых ключей: %lu\n" - -#: g10/import.c:297 -#, c-format -msgid " w/o user IDs: %lu\n" -msgstr " без User ID: %lu\n" - -#: g10/import.c:299 -#, c-format -msgid " imported: %lu" -msgstr " импортировано: %lu" - -#: g10/import.c:305 -#, c-format -msgid " unchanged: %lu\n" -msgstr " неизмененных: %lu\n" - -#: g10/import.c:307 -#, c-format -msgid " new user IDs: %lu\n" -msgstr " новых User ID: %lu\n" - -#: g10/import.c:309 -#, c-format -msgid " new subkeys: %lu\n" -msgstr " новых подключей: %lu\n" - -#: g10/import.c:311 -#, c-format -msgid " new signatures: %lu\n" -msgstr " новых подписей: %lu\n" - -#: g10/import.c:313 -#, c-format -msgid " new key revocations: %lu\n" -msgstr " новых отзывов ключей: %lu\n" - -#: g10/import.c:315 -#, c-format -msgid " secret keys read: %lu\n" -msgstr " прочитано секретных ключей: %lu\n" - -#: g10/import.c:317 -#, c-format -msgid " secret keys imported: %lu\n" -msgstr "импортировано секретных ключей: %lu\n" - -#: g10/import.c:319 -#, c-format -msgid " secret keys unchanged: %lu\n" -msgstr " неизменённых секретных ключей: %lu\n" - -#: g10/import.c:321 -#, c-format -msgid " not imported: %lu\n" -msgstr " не импортировано: %lu\n" - -#: g10/import.c:323 -#, c-format -msgid " signatures cleaned: %lu\n" -msgstr " подписей очищено: %lu\n" - -#: g10/import.c:325 -#, c-format -msgid " user IDs cleaned: %lu\n" -msgstr " очищено User ID: %lu\n" - -#: g10/import.c:566 -#, 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:570 -#, fuzzy -msgid " algorithms on these user IDs:\n" -msgstr "алгоритмы для этих User ID:\n" - -#: g10/import.c:607 -#, c-format -msgid " \"%s\": preference for cipher algorithm %s\n" -msgstr " \"%s\": предпочитает шифр %s\n" - -#: g10/import.c:619 -#, c-format -msgid " \"%s\": preference for digest algorithm %s\n" -msgstr " \"%s\": предпочитает хеш-функцию %s\n" - -#: g10/import.c:631 -#, c-format -msgid " \"%s\": preference for compression algorithm %s\n" -msgstr " \"%s\": предпочитает сжатие %s\n" - -#: g10/import.c:644 -msgid "it is strongly suggested that you update your preferences and\n" -msgstr "крайне желательно, чтобы Вы обновили Ваши предпочтения и\n" - -#: g10/import.c:646 -msgid "re-distribute this key to avoid potential algorithm mismatch problems\n" -msgstr "" -"распространили этот ключ, чтобы избежать потенциальных проблем несовпадения " -"алгоритмов\n" - -#: g10/import.c:670 -#, 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:720 g10/import.c:1118 -#, c-format -msgid "key %s: no user ID\n" -msgstr "ключ %s: не имеет User ID\n" - -#: g10/import.c:749 -#, c-format -msgid "key %s: PKS subkey corruption repaired\n" -msgstr "ключ %s: PKS повреждение ключа исправлено\n" - -#: g10/import.c:764 -#, c-format -msgid "key %s: accepted non self-signed user ID \"%s\"\n" -msgstr "ключ %s: принят без самоподписанного User ID \"%s\"\n" - -#: g10/import.c:770 -#, c-format -msgid "key %s: no valid user IDs\n" -msgstr "ключ %s: нет действительных User ID\n" - -#: g10/import.c:772 -msgid "this may be caused by a missing self-signature\n" -msgstr "причиной этого может быть отсутствие самоподписи\n" - -#: g10/import.c:782 g10/import.c:1240 -#, c-format -msgid "key %s: public key not found: %s\n" -msgstr "ключ %s: не найден открытый ключ: %s\n" - -#: g10/import.c:788 -#, c-format -msgid "key %s: new key - skipped\n" -msgstr "ключ %s: новый ключ - пропущен\n" - -#: g10/import.c:797 -#, c-format -msgid "no writable keyring found: %s\n" -msgstr "нет доступной для записи таблицы ключей: %s\n" - -#: g10/import.c:802 g10/openfile.c:267 g10/sign.c:831 g10/sign.c:1135 -#, c-format -msgid "writing to `%s'\n" -msgstr "сохраняю в `%s'\n" - -#: g10/import.c:806 g10/import.c:901 g10/import.c:1158 g10/import.c:1301 -#: g10/import.c:2363 g10/import.c:2385 -#, c-format -msgid "error writing keyring `%s': %s\n" -msgstr "ошибка записи таблицы ключей `%s': %s\n" - -#: g10/import.c:825 -#, c-format -msgid "key %s: public key \"%s\" imported\n" -msgstr "ключ %s: открытый ключ \"%s\" импортирован\n" - -#: g10/import.c:849 -#, c-format -msgid "key %s: doesn't match our copy\n" -msgstr "ключ %s: не совпадает с копией хранимой у нас\n" - -#: g10/import.c:866 g10/import.c:1258 -#, c-format -msgid "key %s: can't locate original keyblock: %s\n" -msgstr "ключ %s: не нахожу оригинальный блок ключей: %s\n" - -#: g10/import.c:874 g10/import.c:1265 -#, c-format -msgid "key %s: can't read original keyblock: %s\n" -msgstr "ключ %s: не могу прочитать оригинальный блок ключей: %s\n" - -#: g10/import.c:911 -#, c-format -msgid "key %s: \"%s\" 1 new user ID\n" -msgstr "ключ %s: \"%s\" 1 новый User ID\n" - -#: g10/import.c:914 -#, c-format -msgid "key %s: \"%s\" %d new user IDs\n" -msgstr "ключ %s: \"%s\" %d новых User ID\n" - -#: g10/import.c:917 -#, c-format -msgid "key %s: \"%s\" 1 new signature\n" -msgstr "ключ %s: \"%s\" 1 новая подпись\n" - -#: g10/import.c:920 -#, c-format -msgid "key %s: \"%s\" %d new signatures\n" -msgstr "ключ %s: \"%s\" %d новых подписей\n" - -#: g10/import.c:923 -#, c-format -msgid "key %s: \"%s\" 1 new subkey\n" -msgstr "ключ %s: \"%s\" 1 новый подключ\n" - -#: g10/import.c:926 -#, c-format -msgid "key %s: \"%s\" %d new subkeys\n" -msgstr "ключ %s: \"%s\" %d новых подключей\n" - -#: g10/import.c:929 -#, c-format -msgid "key %s: \"%s\" %d signature cleaned\n" -msgstr "ключ %s: \"%s\" %d подпись очищена\n" - -#: g10/import.c:932 -#, c-format -msgid "key %s: \"%s\" %d signatures cleaned\n" -msgstr "ключ %s: \"%s\" %d очищеных подписей\n" - -#: g10/import.c:935 -#, c-format -msgid "key %s: \"%s\" %d user ID cleaned\n" -msgstr "ключ %s: \"%s\" %d User ID очищен\n" - -#: g10/import.c:938 -#, c-format -msgid "key %s: \"%s\" %d user IDs cleaned\n" -msgstr "ключ %s: \"%s\" %d очищенных User ID\n" - -#: g10/import.c:961 -#, c-format -msgid "key %s: \"%s\" not changed\n" -msgstr "ключ %s: \"%s\" не изменен\n" - -#: g10/import.c:1124 -#, c-format -msgid "key %s: secret key with invalid cipher %d - skipped\n" -msgstr "ключ %s: секретный ключ с недопустимым шифром %d - пропущен\n" - -#: g10/import.c:1135 -msgid "importing secret keys not allowed\n" -msgstr "импортирование секретного ключа не позволено\n" - -#: g10/import.c:1152 g10/import.c:2378 -#, c-format -msgid "no default secret keyring: %s\n" -msgstr "нет основной таблицы секретных ключей: %s\n" - -#: g10/import.c:1163 -#, c-format -msgid "key %s: secret key imported\n" -msgstr "ключ %s: секретный ключ импортирован\n" - -#: g10/import.c:1193 -#, c-format -msgid "key %s: already in secret keyring\n" -msgstr "ключ %s: уже есть в таблице секретных ключей\n" - -#: g10/import.c:1203 -#, c-format -msgid "key %s: secret key not found: %s\n" -msgstr "ключ %s: не найден секретный ключ: %s\n" - -#: g10/import.c:1233 -#, c-format -msgid "key %s: no public key - can't apply revocation certificate\n" -msgstr "ключ %s: нет открытого ключа - не могу применить сертификат отзыва\n" - -#: g10/import.c:1276 -#, c-format -msgid "key %s: invalid revocation certificate: %s - rejected\n" -msgstr "ключ %s: неправильный сертификат отзыва: %s - отвергнут\n" - -#: g10/import.c:1308 -#, c-format -msgid "key %s: \"%s\" revocation certificate imported\n" -msgstr "ключ %s: \"%s\" сертификат отзыва импортирован\n" - -#: g10/import.c:1374 -#, c-format -msgid "key %s: no user ID for signature\n" -msgstr "ключ %s: нет User ID для подписи\n" - -#: g10/import.c:1389 -#, c-format -msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n" -msgstr "" -"ключ %s: неподдерживаемый алгоритм с открытым ключом у User ID \"%s\" \n" - -#: g10/import.c:1391 -#, c-format -msgid "key %s: invalid self-signature on user ID \"%s\"\n" -msgstr "ключ %s: неправильная самоподпись на User ID \"%s\"\n" - -#: g10/import.c:1409 -#, c-format -msgid "key %s: no subkey for key binding\n" -msgstr "ключ %s: нет подключа для связывания подключей\n" - -#: g10/import.c:1420 g10/import.c:1470 -#, c-format -msgid "key %s: unsupported public key algorithm\n" -msgstr "ключ %s: неподдерживаемый алгоритм с открытым ключом\n" - -#: g10/import.c:1422 -#, c-format -msgid "key %s: invalid subkey binding\n" -msgstr "ключ %s: неправильная связь подключей\n" - -#: g10/import.c:1437 -#, c-format -msgid "key %s: removed multiple subkey binding\n" -msgstr "ключ %s: удалено многократное связывание подключей\n" - -#: g10/import.c:1459 -#, c-format -msgid "key %s: no subkey for key revocation\n" -msgstr "ключ %s: нет подключа для отзывающего ключа\n" - -#: g10/import.c:1472 -#, c-format -msgid "key %s: invalid subkey revocation\n" -msgstr "ключ %s: неправильный отзыв подключа\n" - -# test it -#: g10/import.c:1487 -#, c-format -msgid "key %s: removed multiple subkey revocation\n" -msgstr "ключ %s: удалена многожественность подключей отзыва\n" - -#: g10/import.c:1529 -#, c-format -msgid "key %s: skipped user ID \"%s\"\n" -msgstr "ключ %s: пропущен User ID \"%s\"\n" - -#: g10/import.c:1550 -#, c-format -msgid "key %s: skipped subkey\n" -msgstr "ключ %s: пропущен подключ\n" - -#: g10/import.c:1577 -#, c-format -msgid "key %s: non exportable signature (class 0x%02X) - skipped\n" -msgstr "ключ %s: не экспортируемая подпись (класс 0x%02X) - пропущена\n" - -#: g10/import.c:1587 -#, c-format -msgid "key %s: revocation certificate at wrong place - skipped\n" -msgstr "ключ %s: сертификат отзыва в неправильном месте - пропущен\n" - -#: g10/import.c:1604 -#, c-format -msgid "key %s: invalid revocation certificate: %s - skipped\n" -msgstr "ключ %s: неправильный сертификат отзыва: %s - пропущен\n" - -#: g10/import.c:1618 -#, c-format -msgid "key %s: subkey signature in wrong place - skipped\n" -msgstr "ключ %s: подпись подключа в неправильном месте - пропущена\n" - -#: g10/import.c:1626 -#, c-format -msgid "key %s: unexpected signature class (0x%02X) - skipped\n" -msgstr "ключ %s: неизвестный класс подписи (0x%02X) - пропущена\n" - -#: g10/import.c:1726 -#, c-format -msgid "key %s: duplicated user ID detected - merged\n" -msgstr "ключ %s: обнаружено дублирование User ID - объединены\n" - -#: g10/import.c:1788 -#, c-format -msgid "WARNING: key %s may be revoked: fetching revocation key %s\n" -msgstr "ВНИМАНИЕ: ключ %s возможно отозван: запрашиваю ключ отзыва %s\n" - -#: g10/import.c:1802 -#, c-format -msgid "WARNING: key %s may be revoked: revocation key %s not present.\n" -msgstr "ВНИМАНИЕ: ключ %s возможно отозван: ключ отзыва %s не получен.\n" - -#: g10/import.c:1861 -#, c-format -msgid "key %s: \"%s\" revocation certificate added\n" -msgstr "ключ %s: \"%s\" добавлен сертификат отзыва\n" - -#: g10/import.c:1895 -#, c-format -msgid "key %s: direct key signature added\n" -msgstr "ключ %s: direct key signature добавлена\n" - -#: g10/import.c:2284 -msgid "NOTE: a key's S/N does not match the card's one\n" -msgstr "ПРЕДУПРЕЖДАЮ: S/N ключа не соответствует S/N ключа на карте\n" - -#: g10/import.c:2292 -msgid "NOTE: primary key is online and stored on card\n" -msgstr "ПРЕДУПРЕЖДАЮ: главный ключ готов и сохранен в карте\n" - -#: g10/import.c:2294 -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:4783 g10/keyedit.c:4874 g10/keyedit.c:4938 -#: g10/keyedit.c:4999 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:3346 -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:3249 -#, fuzzy, c-format -msgid "User ID \"%s\": already clean\n" -msgstr "User ID \"%s\" уже очищен\n" - -#: g10/keyedit.c:3341 -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:3352 -msgid "You may not add a designated revoker to a PGP 2.x-style key.\n" -msgstr "Вы не можете добавить назначенный отзывающим ключ в PGP 2.x ключ.\n" - -#: g10/keyedit.c:3372 -msgid "Enter the user ID of the designated revoker: " -msgstr "Укажите User ID ключа, назначенного отзывающим: " - -#: g10/keyedit.c:3397 -msgid "cannot appoint a PGP 2.x style key as a designated revoker\n" -msgstr "нельзя назначить ключ PGP 2.x отзывающим\n" - -#: g10/keyedit.c:3412 -msgid "you cannot appoint a key as its own designated revoker\n" -msgstr "ключ не может быть назначен отзывающим сам себя\n" - -#: g10/keyedit.c:3434 -msgid "this key has already been designated as a revoker\n" -msgstr "этот ключ уже назначен отзывающим\n" - -#: g10/keyedit.c:3453 -msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n" -msgstr "ВНИМАНИЕ: назначение ключа отзывающим невозможно будет отменить!\n" - -#: g10/keyedit.c:3459 -msgid "" -"Are you sure you want to appoint this key as a designated revoker? (y/N) " -msgstr "Вы уверены, что хотите назначить данный ключ отзывающим? (y/N)" - -#: g10/keyedit.c:3520 -msgid "Please remove selections from the secret keys.\n" -msgstr "Снимите выделение с секретного ключа.\n" - -#: g10/keyedit.c:3526 -msgid "Please select at most one subkey.\n" -msgstr "Выделите не менее одного подключа.\n" - -#: g10/keyedit.c:3530 -msgid "Changing expiration time for a subkey.\n" -msgstr "Смена срока действительности подключа.\n" - -#: g10/keyedit.c:3533 -msgid "Changing expiration time for the primary key.\n" -msgstr "Смена срока действия главного ключа\n" - -#: g10/keyedit.c:3579 -msgid "You can't change the expiration date of a v3 key\n" -msgstr "Вы не можете изменить срок действия v3 ключа\n" - -#: g10/keyedit.c:3595 -msgid "No corresponding signature in secret ring\n" -msgstr "Нет соответствующей подписи в связке секретных\n" - -#: g10/keyedit.c:3668 -#, fuzzy, c-format -msgid "signing subkey %s is already cross-certified\n" -msgstr "" -"ВНИМАНИЕ: подписываемый подключ %s не имеет перекрестной сертификации\n" - -#: g10/keyedit.c:3674 -#, c-format -msgid "subkey %s does not sign and so does not need to be cross-certified\n" -msgstr "" - -#: g10/keyedit.c:3836 -msgid "Please select exactly one user ID.\n" -msgstr "Выберите только один User ID.\n" - -#: g10/keyedit.c:3875 g10/keyedit.c:3985 g10/keyedit.c:4105 g10/keyedit.c:4246 -#, c-format -msgid "skipping v3 self-signature on user ID \"%s\"\n" -msgstr "пропуск v3 самоподписи на User ID \"%s\"\n" - -#: g10/keyedit.c:4046 -msgid "Enter your preferred keyserver URL: " -msgstr "Введите URL предпочтаемого сервера ключей: " - -#: g10/keyedit.c:4126 -msgid "Are you sure you want to replace it? (y/N) " -msgstr "Вы действительно хотите заменить его? (y/N)" - -#: g10/keyedit.c:4127 -msgid "Are you sure you want to delete it? (y/N) " -msgstr "Вы действительно хотите удалить его? (y/N)" - -#: g10/keyedit.c:4189 -#, fuzzy -msgid "Enter the notation: " -msgstr "Примечание к подписи" - -#: g10/keyedit.c:4338 -#, fuzzy -msgid "Proceed? (y/N) " -msgstr "Перезаписать (y/N)? " - -#: g10/keyedit.c:4402 -#, c-format -msgid "No user ID with index %d\n" -msgstr "Нет User ID с индексом %d\n" - -#: g10/keyedit.c:4460 -#, c-format -msgid "No user ID with hash %s\n" -msgstr "Нет User ID с хешем %s\n" - -# c-format -#: g10/keyedit.c:4487 -#, c-format -msgid "No subkey with index %d\n" -msgstr "Нет подключа с индексом %d\n" - -#: g10/keyedit.c:4622 -#, c-format -msgid "user ID: \"%s\"\n" -msgstr "User ID: \"%s\"\n" - -#: g10/keyedit.c:4625 g10/keyedit.c:4689 g10/keyedit.c:4732 -#, c-format -msgid "signed by your key %s on %s%s%s\n" -msgstr "подписано Вашим ключом %s от %s%s%s\n" - -#: g10/keyedit.c:4627 g10/keyedit.c:4691 g10/keyedit.c:4734 -msgid " (non-exportable)" -msgstr " (не экспортируемая)" - -#: g10/keyedit.c:4631 -#, c-format -msgid "This signature expired on %s.\n" -msgstr "Срок действительности подписи закончился %s.\n" - -#: g10/keyedit.c:4635 -msgid "Are you sure you still want to revoke it? (y/N) " -msgstr "Вы уверены, что хотите отозвать? (y/N) " - -#: g10/keyedit.c:4639 -msgid "Create a revocation certificate for this signature? (y/N) " -msgstr "Создать сертификат отзыва для данной подписи? (y/N) " - -#: g10/keyedit.c:4666 -#, c-format -msgid "You have signed these user IDs on key %s:\n" -msgstr "Вы подписали данные User ID на ключе %s:\n" - -#: g10/keyedit.c:4692 -msgid " (non-revocable)" -msgstr " (не отзываемая)" - -#: g10/keyedit.c:4699 -#, c-format -msgid "revoked by your key %s on %s\n" -msgstr "отзыв Вашим ключом %s от %s\n" - -#: g10/keyedit.c:4721 -msgid "You are about to revoke these signatures:\n" -msgstr "Вы отзываете следующие подписи:\n" - -#: g10/keyedit.c:4741 -msgid "Really create the revocation certificates? (y/N) " -msgstr "Действительно создать сертификат отзыва? (y/N) " - -#: g10/keyedit.c:4771 -msgid "no secret key\n" -msgstr "нет секретного ключа\n" - -#: g10/keyedit.c:4841 -#, c-format -msgid "user ID \"%s\" is already revoked\n" -msgstr "User ID \"%s\" уже отозван\n" - -#: g10/keyedit.c:4858 -#, c-format -msgid "WARNING: a user ID signature is dated %d seconds in the future\n" -msgstr "ВНИМАНИЕ: User ID подпись датирована %d секундами в будущем\n" - -#: g10/keyedit.c:4922 -#, c-format -msgid "Key %s is already revoked.\n" -msgstr "Ключ %s уже отозван\n" - -#: g10/keyedit.c:4984 -#, c-format -msgid "Subkey %s is already revoked.\n" -msgstr "Подключ %s уже отозван\n" - -#: g10/keyedit.c:5079 -#, 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:1421 -#, 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:1324 -#, c-format -msgid "sending key %s to %s server %s\n" -msgstr "отправляю ключ %s на %s сервер %s\n" - -#: g10/keyserver.c:1328 -#, c-format -msgid "sending key %s to %s\n" -msgstr "отправка ключа %s на %s\n" - -#: g10/keyserver.c:1371 -#, c-format -msgid "searching for \"%s\" from %s server %s\n" -msgstr "поиск \"%s\" на %s сервере %s\n" - -#: g10/keyserver.c:1374 -#, c-format -msgid "searching for \"%s\" from %s\n" -msgstr "поиск \"%s\" на %s\n" - -# test it -#: g10/keyserver.c:1381 g10/keyserver.c:1477 -msgid "no keyserver action!\n" -msgstr "" - -#: g10/keyserver.c:1429 -#, c-format -msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n" -msgstr "ВНИМАНИЕ: обработчик сервера ключей от другой версии GnuPG (%s)\n" - -#: g10/keyserver.c:1438 -msgid "keyserver did not send VERSION\n" -msgstr "сервер ключей не прислал VERSION\n" - -#: g10/keyserver.c:1500 g10/keyserver.c:2028 -msgid "no keyserver known (use option --keyserver)\n" -msgstr "не заданы серверы ключей (используйте --keyserver)\n" - -#: g10/keyserver.c:1506 -msgid "external keyserver calls are not supported in this build\n" -msgstr "Данная сборка не поддерживает внешние вызовы для сервера ключей.\n" - -#: g10/keyserver.c:1518 -#, c-format -msgid "no handler for keyserver scheme `%s'\n" -msgstr "нет обработчика для схемы сервера ключей `%s'\n" - -#: g10/keyserver.c:1523 -#, c-format -msgid "action `%s' not supported with keyserver scheme `%s'\n" -msgstr "действие `%s' не поддерживается серверами ключей `%s'\n" - -#: g10/keyserver.c:1531 -#, c-format -msgid "%s does not support handler version %d\n" -msgstr "%s не поддерживает версию обработчика %d\n" - -#: g10/keyserver.c:1538 -msgid "keyserver timed out\n" -msgstr "превышено время ожидания сервера ключей\n" - -#: g10/keyserver.c:1543 -msgid "keyserver internal error\n" -msgstr "ошибка сервера ключей\n" - -#: g10/keyserver.c:1552 -#, c-format -msgid "keyserver communications error: %s\n" -msgstr "ошибка связи с сервером ключей: %s\n" - -#: g10/keyserver.c:1577 g10/keyserver.c:1611 -#, c-format -msgid "\"%s\" not a key ID: skipping\n" -msgstr "\"%s\" не идентификатор ключа: пропущен\n" - -#: g10/keyserver.c:1870 -#, c-format -msgid "WARNING: unable to refresh key %s via %s: %s\n" -msgstr "ВНИМАНИЕ: невозможно обновить ключ %s с %s: %s\n" - -#: g10/keyserver.c:1892 -#, c-format -msgid "refreshing 1 key from %s\n" -msgstr "обновление 1 ключа из %s\n" - -#: g10/keyserver.c:1894 -#, c-format -msgid "refreshing %d keys from %s\n" -msgstr "обновление %d ключей из %s\n" - -#: g10/keyserver.c:1950 -#, fuzzy, c-format -msgid "WARNING: unable to fetch URI %s: %s\n" -msgstr "ВНИМАНИЕ: невозможно обновить ключ %s с %s: %s\n" - -#: g10/keyserver.c:1956 -#, 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:305 -#, c-format -msgid "assuming signed data in `%s'\n" -msgstr "принятие подписанных данных в `%s'\n" - -#: g10/openfile.c:384 -#, c-format -msgid "new configuration file `%s' created\n" -msgstr "создан новый файл настроек `%s'\n" - -#: g10/openfile.c:386 -#, c-format -msgid "WARNING: options in `%s' are not yet active during this run\n" -msgstr "ВНИМАНИЕ: параметры в `%s' еще не активны при этом запуске\n" - -#: g10/openfile.c:418 -#, 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:1157 -#, 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:968 -msgid "can't query passphrase in batch mode\n" -msgstr "не могу получить пароль в пакетном режиме\n" - -#: g10/passphrase.c:812 g10/passphrase.c:973 -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:977 -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:127 g10/skclist.c:191 -msgid "key is not flagged as insecure - can't use it with the faked RNG!\n" -msgstr "" -"ключ не помечен как ненадежный - не могу использовать его с ненадёжным RNG!\n" - -#: g10/skclist.c:158 -#, c-format -msgid "skipped \"%s\": duplicated\n" -msgstr "пропущено \"%s\": дубликат\n" - -#: g10/skclist.c:166 g10/skclist.c:176 g10/skclist.c:185 -#, c-format -msgid "skipped \"%s\": %s\n" -msgstr "пропущено \"%s\": %s\n" - -#: g10/skclist.c:171 -msgid "skipped: secret key already present\n" -msgstr "пропущено: секретный ключ уже имеется\n" - -#: g10/skclist.c:186 -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:350 -msgid "operation is not possible without initialized secure memory\n" -msgstr "операция невозможна без инициализации защищенной памяти\n" - -#: util/secmem.c:351 -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.po b/po/sk.po deleted file mode 100644 index 1cb824eb4..000000000 --- a/po/sk.po +++ /dev/null @@ -1,7201 +0,0 @@ -# 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-07-28 11:12+0200\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 "nemem vytvori prvoslo s dkou menej ako %d bitov\n" - -#: cipher/primegen.c:312 -#, c-format -msgid "can't generate a prime with less than %d bits\n" -msgstr "nemem vytvori prvoslo s dkou menej ako %d bitov\n" - -#: cipher/random.c:173 -msgid "no entropy gathering module detected\n" -msgstr "nebol detekovan iadny modul na zskanie entropie\n" - -#: cipher/random.c:403 -#, fuzzy, c-format -msgid "can't lock `%s': %s\n" -msgstr "nemono 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:1003 g10/gpg.c:3461 g10/import.c:195 g10/keygen.c:2385 -#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:342 -#: 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 "nemem otvori `%s': %s\n" - -#: cipher/random.c:458 -#, c-format -msgid "can't stat `%s': %s\n" -msgstr "nemem poui prkaz stat na `%s': %s\n" - -#: cipher/random.c:463 -#, c-format -msgid "`%s' is not a regular file - ignored\n" -msgstr "`%s' nie je normlny sbor - ignorovan\n" - -#: cipher/random.c:468 -msgid "note: random_seed file is empty\n" -msgstr "poznmka: sbor random_seed je przdny\n" - -#: cipher/random.c:474 -msgid "WARNING: invalid size of random_seed file - not used\n" -msgstr "varovanie: neplatn vekos random_seed - sbor nepouit\n" - -#: cipher/random.c:482 -#, c-format -msgid "can't read `%s': %s\n" -msgstr "nemem ta `%s': %s\n" - -#: cipher/random.c:520 -msgid "note: random_seed file not updated\n" -msgstr "poznmka: sbor random_seed nie je aktualizovan\n" - -#: cipher/random.c:544 g10/exec.c:481 g10/gpg.c:1002 g10/keygen.c:2864 -#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:263 -#: g10/openfile.c:357 g10/sign.c:826 g10/sign.c:1130 g10/tdbio.c:536 -#, c-format -msgid "can't create `%s': %s\n" -msgstr "nemem vytvori `%s': %s\n" - -#: cipher/random.c:556 cipher/random.c:566 -#, c-format -msgid "can't write `%s': %s\n" -msgstr "nemem zapisova do `%s': %s\n" - -#: cipher/random.c:569 -#, c-format -msgid "can't close `%s': %s\n" -msgstr "nemem zavrie `%s': %s\n" - -#: cipher/random.c:814 -msgid "WARNING: using insecure random number generator!!\n" -msgstr "VAROVANIE: pouit genertor nhodnch sel nie je bezpen!!\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 "" -"Genertor nhodnch sel je len atrapa, aby program mohol bea,\n" -"v iadnom prpade nie je kryptograficky bezpen!\n" -"\n" -"NEPOUVAJTE IADNE DTA VYTVOREN TMTO 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 "" -"Prosm akajte, zskava sa entropia. Robte zatia nejak in prcu\n" -"aby ste sa nenudili a zvite tm 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 nhodnch bajtov. Prosm, pracujte s operanm systmom, aby\n" -"ste mu umonili zska viac entropie (je potrebnch %d bajtov).\n" - -#: g10/app-openpgp.c:596 -#, fuzzy, c-format -msgid "failed to store the fingerprint: %s\n" -msgstr "nemem inicializova databzu dvery: %s\n" - -#: g10/app-openpgp.c:609 -#, fuzzy, c-format -msgid "failed to store the creation date: %s\n" -msgstr "zlyhalo obnovenie vyrovnvacej pamti kov: %s\n" - -#: g10/app-openpgp.c:977 -#, fuzzy, c-format -msgid "reading public key failed: %s\n" -msgstr "zmazanie bloku ka 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 vytvran 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 ka: %s\n" - -#: g10/app-openpgp.c:1552 g10/app-openpgp.c:2003 -#, fuzzy -msgid "error reading fingerprint DO\n" -msgstr "%s: chyba pri tan vonho zznamu: %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 pr kov" - -#: 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 "nemem inicializova databzu dvery: %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 ka sa nepodarilo: %s\n" - -#: g10/app-openpgp.c:1904 -#, fuzzy, c-format -msgid "key generation completed (%d seconds)\n" -msgstr "Vytvorenie ka 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 "nenjden iadne platn dta vo formte OpenPGP.\n" - -#: g10/armor.c:320 -#, c-format -msgid "armor: %s\n" -msgstr "ASCII kdovanie: %s\n" - -#: g10/armor.c:359 -msgid "invalid armor header: " -msgstr "neplatn hlavika ASCII kdovania: " - -#: g10/armor.c:370 -msgid "armor header: " -msgstr "ASCII hlavika: " - -#: g10/armor.c:381 -msgid "invalid clearsig header\n" -msgstr "neplatn hlavika podpisu v itatenom formte\n" - -#: g10/armor.c:433 -msgid "nested clear text signatures\n" -msgstr "vnoren podpisy v itatenom formtu\n" - -#: g10/armor.c:568 -#, fuzzy -msgid "unexpected armor: " -msgstr "neoakvan kdovanie ASCII:" - -#: g10/armor.c:580 -msgid "invalid dash escaped line: " -msgstr "nesprvne oznaenie riadku mnusmi: " - -#: g10/armor.c:734 g10/armor.c:1343 -#, fuzzy, c-format -msgid "invalid radix64 character %02X skipped\n" -msgstr "neplatn znak vo formte radix64 %02x bol preskoen\n" - -#: g10/armor.c:777 -msgid "premature eof (no CRC)\n" -msgstr "predasn koniec sboru (iadne CRC)\n" - -#: g10/armor.c:811 -msgid "premature eof (in CRC)\n" -msgstr "predasn koniec sboru (v CRC)\n" - -#: g10/armor.c:819 -msgid "malformed CRC\n" -msgstr "nesprvny formt CRC\n" - -#: g10/armor.c:823 g10/armor.c:1380 -#, fuzzy, c-format -msgid "CRC error; %06lX - %06lX\n" -msgstr "Chyba CRC; %06lx - %06lx\n" - -#: g10/armor.c:843 -#, fuzzy -msgid "premature eof (in trailer)\n" -msgstr "predasn koniec sboru (v ptike)\n" - -#: g10/armor.c:847 -msgid "error in trailer line\n" -msgstr "chyba v ptike\n" - -#: g10/armor.c:1158 -msgid "no valid OpenPGP data found.\n" -msgstr "nenjden iadne platn dta vo formte OpenPGP.\n" - -#: g10/armor.c:1163 -#, c-format -msgid "invalid armor: line longer than %d characters\n" -msgstr "neplatn kdovanie ASCII: riadok je dlh ako %d znakov\n" - -#: g10/armor.c:1167 -msgid "" -"quoted printable character in armor - probably a buggy MTA has been used\n" -msgstr "" -"neplatn znak (quoted-printable) v ASCII kdovan - pravdepodobne bol " -"pouit nesprvny 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 "nemono previes v dvkovom mde\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 vber? " - -#: 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 "Dvod 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 zodpovedajci 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:280 -#, 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 predvoby" - -#: g10/card-util.c:802 -#, fuzzy -msgid "Error: invalid length of preference string.\n" -msgstr "neplatn znak v reazci s predvobami\n" - -#: g10/card-util.c:811 -#, fuzzy -msgid "Error: invalid characters in preference string.\n" -msgstr "neplatn znak v reazci s predvobami\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 odtlaok\n" - -#: g10/card-util.c:867 -#, fuzzy -msgid "CA fingerprint: " -msgstr "vypsa fingerprint" - -#: g10/card-util.c:890 -#, fuzzy -msgid "Error: invalid formatted fingerprint.\n" -msgstr "chyba: neplatn odtlaok\n" - -#: g10/card-util.c:938 -#, fuzzy, c-format -msgid "key operation not possible: %s\n" -msgstr "Vytvorenie ka sa nepodarilo: %s\n" - -#: g10/card-util.c:939 -#, fuzzy -msgid "not an OpenPGP card" -msgstr "nenjden iadne platn dta vo formte OpenPGP.\n" - -#: g10/card-util.c:948 -#, fuzzy, c-format -msgid "error getting current key info: %s\n" -msgstr "chyba pri zpise do sboru tajnch kov `%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 "Prosm, vyberte druh ka, ktor chcete:\n" - -#: g10/card-util.c:1125 g10/card-util.c:1206 -#, fuzzy -msgid " (1) Signature key\n" -msgstr "Platnos podpisu vyprala %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 vber.\n" - -#: g10/card-util.c:1203 -#, fuzzy -msgid "Please select where to store the key:\n" -msgstr "Prosm vberte dvod na revokciu:\n" - -#: g10/card-util.c:1238 -#, fuzzy -msgid "unknown key protection algorithm\n" -msgstr "neznmy ochrann algoritmus\n" - -#: g10/card-util.c:1243 -#, fuzzy -msgid "secret parts of key are not available\n" -msgstr "Tajn asti primrneho ka nie s dostupn.\n" - -#: g10/card-util.c:1248 -#, fuzzy -msgid "secret key already stored on a card\n" -msgstr "preskoen: tajn k je u v databze\n" - -#: g10/card-util.c:1319 g10/keyedit.c:1357 -msgid "quit this menu" -msgstr "ukoni toto menu" - -#: g10/card-util.c:1321 -#, fuzzy -msgid "show admin commands" -msgstr "konfliktn prkazy\n" - -#: g10/card-util.c:1322 g10/keyedit.c:1360 -msgid "show this help" -msgstr "ukza tto pomoc" - -#: g10/card-util.c:1324 -#, fuzzy -msgid "list all available data" -msgstr "K k dispozcii 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 dveryhodnos vlastnka ka" - -#: g10/card-util.c:1332 -msgid "change card holder's sex" -msgstr "" - -#: g10/card-util.c:1333 -#, fuzzy -msgid "change a CA fingerprint" -msgstr "vypsa 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 pr kov" - -#: 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 "Prkaz> " - -#: g10/card-util.c:1495 -#, fuzzy -msgid "Admin-only command\n" -msgstr "konfliktn prkazy\n" - -#: g10/card-util.c:1526 -#, fuzzy -msgid "Admin commands are allowed\n" -msgstr "konfliktn prkazy\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 prkaz (skste \"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 ka 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 sprvne; skste to znovu" - -#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3826 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 "nemono otvori `%s'\n" - -#: g10/decrypt.c:105 g10/encode.c:839 -msgid "--output doesn't work for this command\n" -msgstr "--output pre tento prkaz nefunguje\n" - -#: g10/delkey.c:75 g10/export.c:311 g10/keyedit.c:3387 g10/keyserver.c:1700 -#: g10/revoke.c:228 -#, fuzzy, c-format -msgid "key \"%s\" not found: %s\n" -msgstr "k `%s' nebol njden: %s\n" - -#: g10/delkey.c:83 g10/export.c:341 g10/import.c:2349 g10/keyserver.c:1714 -#: g10/revoke.c:234 g10/revoke.c:478 -#, c-format -msgid "error reading keyblock: %s\n" -msgstr "chyba pri tan bloku ka: %s\n" - -#: g10/delkey.c:129 g10/delkey.c:136 -msgid "(unless you specify the key by fingerprint)\n" -msgstr "(pokia neurte 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 nemono v dvkovom mde previes\n" - -#: g10/delkey.c:147 -#, fuzzy -msgid "Delete this key from the keyring? (y/N) " -msgstr "Zmaza tento k zo sboru kov? " - -#: g10/delkey.c:155 -#, fuzzy -msgid "This is a secret key! - really delete? (y/N) " -msgstr "Toto je tajn k! - skutone zmaza? " - -#: g10/delkey.c:165 -#, c-format -msgid "deleting keyblock failed: %s\n" -msgstr "zmazanie bloku ka sa nepodarilo: %s\n" - -#: g10/delkey.c:175 -msgid "ownertrust information cleared\n" -msgstr "informcie o dveryhodnosti vlastnka ka 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, pouite najprv prepna \"--delete-secret-key\".\n" - -#: g10/encode.c:213 g10/sign.c:1284 -#, c-format -msgid "error creating passphrase: %s\n" -msgstr "chyba pri vytvran hesla: %s\n" - -#: g10/encode.c:218 -msgid "can't use a symmetric ESK packet due to the S2K mode\n" -msgstr "v mde S2K nemono poui symetrick ESK paket\n" - -#: g10/encode.c:231 -#, c-format -msgid "using cipher %s\n" -msgstr "pouit 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: sbor `%s' je przdny\n" - -#: g10/encode.c:456 -msgid "you can only encrypt to RSA keys of 2048 bits or less in --pgp2 mode\n" -msgstr "" -"v mde --pgp2 mete ifrova len RSA kom s dkou 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 nemono poui na vetky ke, pre ktor ifrujete.\n" - -#: g10/encode.c:518 -#, fuzzy, c-format -msgid "" -"WARNING: forcing symmetric cipher %s (%d) violates recipient preferences\n" -msgstr "vyiadan symetrick ifra %s (%d) nevyhovuje predvobm prjemcu\n" - -#: g10/encode.c:628 g10/sign.c:963 -#, fuzzy, c-format -msgid "" -"WARNING: forcing compression algorithm %s (%d) violates recipient " -"preferences\n" -msgstr "" -"vyiadan kompresn algoritmus %s (%d) nevyhovuje predvobm prjemcu\n" - -#: g10/encode.c:715 -#, c-format -msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n" -msgstr "vyiadan symetrick ifra %s (%d) nevyhovuje predvobm prjemcu\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 "" -"pouitie %s nie je v mde %s dovolen\n" -"\n" - -#: g10/encode.c:812 -#, c-format -msgid "%s/%s encrypted for: \"%s\"\n" -msgstr "%s/%s zaifrovan pre: %s\n" - -#: g10/encr-data.c:67 g10/mainproc.c:293 -#, c-format -msgid "%s encrypted data\n" -msgstr "%s zaifrovan dta\n" - -#: g10/encr-data.c:69 g10/mainproc.c:297 -#, c-format -msgid "encrypted with unknown algorithm %d\n" -msgstr "zaifrovan neznmym algoritmom %d\n" - -#: g10/encr-data.c:93 -msgid "" -"WARNING: message was encrypted with a weak key in the symmetric cipher.\n" -msgstr "" -"VAROVANIE: sprva bola zaifrovan slabm kom v symetrickej ifre.\n" - -#: g10/encr-data.c:104 -msgid "problem handling encrypted packet\n" -msgstr "problm so zaifrovanm paketom\n" - -#: g10/exec.c:49 -msgid "no remote program execution supported\n" -msgstr "iadne vzialen vykonvanie programu nie je podporovan\n" - -#: g10/exec.c:176 g10/openfile.c:415 -#, c-format -msgid "can't create directory `%s': %s\n" -msgstr "nemem vytvori adresr `%s': %s\n" - -#: g10/exec.c:317 -msgid "" -"external program calls are disabled due to unsafe options file permissions\n" -msgstr "" -"volanie externho programu zruen kvli nebezpenm prvam sboru " -"nastaven\n" - -#: g10/exec.c:347 -#, fuzzy -msgid "this platform requires temporary files when calling external programs\n" -msgstr "" -"tto platforma potrebuje doasn sbory na spustenie externho programu\n" - -#: g10/exec.c:425 -#, fuzzy, c-format -msgid "unable to execute program `%s': %s\n" -msgstr "nemono spusti %s \"%s\": %s\n" - -#: g10/exec.c:428 -#, fuzzy, c-format -msgid "unable to execute shell `%s': %s\n" -msgstr "nemono spusti %s \"%s\": %s\n" - -#: g10/exec.c:513 -#, c-format -msgid "system error while calling external program: %s\n" -msgstr "systmov chyba pri volan externho programu: %s\n" - -#: g10/exec.c:524 g10/exec.c:590 -msgid "unnatural exit of external program\n" -msgstr "nekorektn ukonenie externho programu\n" - -#: g10/exec.c:539 -msgid "unable to execute external program\n" -msgstr "nemono spusti extern program\n" - -#: g10/exec.c:555 -#, c-format -msgid "unable to read external program response: %s\n" -msgstr "nemono cta odozvu externho 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: nemem vymaza doasn sbor (%s) `%s': %s\n" - -#: g10/exec.c:613 -#, c-format -msgid "WARNING: unable to remove temp directory `%s': %s\n" -msgstr "VAROVANIE: nemem vymaza doasn adresr `%s': %s\n" - -#: g10/export.c:61 -#, fuzzy -msgid "export signatures that are marked as local-only" -msgstr "" -"\n" -"Podpis bude oznaen ako neodvolaten (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 revokan ke pre `%s' nenjden\n" - -#: g10/export.c:67 -#, fuzzy -msgid "remove the passphrase from exported subkeys" -msgstr "revokova sekundrny k" - -#: g10/export.c:69 -#, fuzzy -msgid "remove unusable parts from key during export" -msgstr "nepouiten 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 chrnen - preskoen\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 - preskoen\n" - -#: g10/export.c:373 -#, fuzzy, c-format -msgid "key %s: key material on-card - skipped\n" -msgstr "k %08lX: podpis subka na zlom mieste - preskoen \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 "nemem inicializova databzu dvery: %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 set\n" - -#: g10/export.c:598 -msgid "WARNING: nothing exported\n" -msgstr "VAROVANIE: ni nebolo vyexportovan\n" - -#: g10/gpg.c:375 -msgid "" -"@Commands:\n" -" " -msgstr "" -"@Prkazy:\n" -" " - -#: g10/gpg.c:377 -msgid "|[file]|make a signature" -msgstr "|[sbor]|vytvori podpis" - -#: g10/gpg.c:378 -msgid "|[file]|make a clear text signature" -msgstr "|[sbor]|vytvori podpis v itatenom dokumente" - -#: g10/gpg.c:379 -msgid "make a detached signature" -msgstr "vytvori podpis oddelen od dokumentu" - -#: g10/gpg.c:380 -msgid "encrypt data" -msgstr "ifrova dta" - -#: g10/gpg.c:382 -msgid "encryption only with symmetric cipher" -msgstr "ifrovanie len so symetrickou ifrou" - -#: g10/gpg.c:384 -msgid "decrypt data (default)" -msgstr "deifrova dta (implicitne)" - -#: g10/gpg.c:386 -msgid "verify a signature" -msgstr "verifikova podpis" - -#: g10/gpg.c:388 -msgid "list keys" -msgstr "vypsa zoznam kov" - -#: g10/gpg.c:390 -msgid "list keys and signatures" -msgstr "vypsa zoznam kov a podpisov" - -#: g10/gpg.c:391 -#, fuzzy -msgid "list and check key signatures" -msgstr "skontrolova podpisy kov" - -#: g10/gpg.c:392 -msgid "list keys and fingerprints" -msgstr "vypsa zoznam kov a fingerprintov" - -#: g10/gpg.c:393 -msgid "list secret keys" -msgstr "vypsa zoznam tajnch kov" - -#: g10/gpg.c:394 -msgid "generate a new key pair" -msgstr "vytvori nov pr kov" - -#: g10/gpg.c:395 -msgid "remove keys from the public keyring" -msgstr "odstrni k zo sboru verejnch kov" - -#: g10/gpg.c:397 -msgid "remove keys from the secret keyring" -msgstr "odstrni k zo sboru tajnch kov" - -#: g10/gpg.c:398 -msgid "sign a key" -msgstr "podpsa k" - -#: g10/gpg.c:399 -msgid "sign a key locally" -msgstr "podpsa k loklne" - -#: g10/gpg.c:400 -msgid "sign or edit a key" -msgstr "podpsa alebo modifikova k" - -#: g10/gpg.c:401 -msgid "generate a revocation certificate" -msgstr "vytvori revokan certifikt" - -#: g10/gpg.c:403 -msgid "export keys" -msgstr "exportova ke" - -#: g10/gpg.c:404 -msgid "export keys to a key server" -msgstr "exportova ke na server kov" - -#: g10/gpg.c:405 -msgid "import keys from a key server" -msgstr "importova ke zo servera kov" - -#: g10/gpg.c:407 -msgid "search for keys on a key server" -msgstr "vyhada ke na serveri kov" - -#: g10/gpg.c:409 -msgid "update all keys from a keyserver" -msgstr "aktualizova vetky ke zo servera kov" - -#: g10/gpg.c:413 -msgid "import/merge keys" -msgstr "importova/zli ke" - -#: g10/gpg.c:416 -msgid "print the card status" -msgstr "" - -#: g10/gpg.c:417 -msgid "change data on a card" -msgstr "" - -#: g10/gpg.c:418 -msgid "change a card's PIN" -msgstr "" - -#: g10/gpg.c:426 -msgid "update the trust database" -msgstr "aktualizova databzu dvery" - -#: g10/gpg.c:433 -msgid "|algo [files]|print message digests" -msgstr "|algo [sbory]|vyp hash" - -#: g10/gpg.c:437 g10/gpgv.c:71 -msgid "" -"@\n" -"Options:\n" -" " -msgstr "" -"@\n" -"Monosti:\n" -" " - -#: g10/gpg.c:439 -msgid "create ascii armored output" -msgstr "vytvor vstup zakdovan pomocou ASCII" - -#: g10/gpg.c:441 -msgid "|NAME|encrypt for NAME" -msgstr "|MENO|ifrova pre MENO" - -#: g10/gpg.c:452 -msgid "use this user-id to sign or decrypt" -msgstr "" -"poui toto id uvatea na podpsanie\n" -" alebo deifrovanie" - -#: g10/gpg.c:453 -msgid "|N|set compress level N (0 disables)" -msgstr "" -"|N|nastavi rove komprimcie N (0 - iadna\n" -" komprimcia)" - -#: g10/gpg.c:458 -msgid "use canonical text mode" -msgstr "poui knonick textov md" - -#: g10/gpg.c:472 -msgid "use as output file" -msgstr "poui ako vstupn sbor" - -#: g10/gpg.c:474 g10/gpgv.c:73 -msgid "verbose" -msgstr "s dodatonmi informciami" - -#: g10/gpg.c:485 -msgid "do not make any changes" -msgstr "nevykona iadne zmeny" - -#: g10/gpg.c:486 -msgid "prompt before overwriting" -msgstr "vyiada potvrdenie pred prepsanm" - -#: g10/gpg.c:527 -msgid "use strict OpenPGP behavior" -msgstr "" - -#: g10/gpg.c:528 -msgid "generate PGP 2.x compatible messages" -msgstr "" - -#: g10/gpg.c:556 -msgid "" -"@\n" -"(See the man page for a complete listing of all commands and options)\n" -msgstr "" -"@\n" -"(Pouite manulov strnky pre kompletn zoznam vetkch prkazov a " -"monost)\n" - -#: g10/gpg.c:559 -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" -"Prklady:\n" -"\n" -" -se -r Bob [sbor] podpsa a zaifrova pre uvatea Bob\n" -" --clearsign [sbor] vytvori podpis itatenho dokumentu\n" -" --detach-sign [sbor] vytvori podpis oddelen od dokumentu\n" -" --list-keys [men] vypsa ke\n" -" --fingerprint [men] vypsa fingerprinty\n" - -#: g10/gpg.c:757 g10/gpgv.c:98 -msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n" -msgstr "" -"Chyby oznmte, prosm, na adresu <gnupg-bugs@gnu.org>.\n" -"Pripomienky k prekladu <sk-i18n@lists.linux.sk>.\n" - -#: g10/gpg.c:774 -msgid "Usage: gpg [options] [files] (-h for help)" -msgstr "Pouitie: gpg [monosti] [sbory] (-h pre pomoc)" - -#: g10/gpg.c:777 -msgid "" -"Syntax: gpg [options] [files]\n" -"sign, check, encrypt or decrypt\n" -"default operation depends on the input data\n" -msgstr "" -"Syntax: gpg [monosti] [sbory]\n" -"podpsa, overi, ifrova alebo deifrova\n" -"implicitn opercie zvisia od vstupnch dt\n" - -#: g10/gpg.c:788 -msgid "" -"\n" -"Supported algorithms:\n" -msgstr "" -"\n" -"Podporovan algoritmy:\n" - -#: g10/gpg.c:791 -msgid "Pubkey: " -msgstr "Verejn ke: " - -#: g10/gpg.c:797 g10/keyedit.c:2310 -msgid "Cipher: " -msgstr "ifry: " - -#: g10/gpg.c:803 -msgid "Hash: " -msgstr "Hash: " - -#: g10/gpg.c:809 g10/keyedit.c:2356 -msgid "Compression: " -msgstr "Kompresia: " - -#: g10/gpg.c:892 -msgid "usage: gpg [options] " -msgstr "pouitie: gpg [monosti] " - -#: g10/gpg.c:1040 -msgid "conflicting commands\n" -msgstr "konfliktn prkazy\n" - -#: g10/gpg.c:1058 -#, fuzzy, c-format -msgid "no = sign found in group definition `%s'\n" -msgstr "no = podpis njden v defincii skupiny \"%s\"\n" - -#: g10/gpg.c:1255 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on homedir `%s'\n" -msgstr "VAROVANIE: vlastnctvo pre %s nastaven nebezpene \"%s\"\n" - -#: g10/gpg.c:1258 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on configuration file `%s'\n" -msgstr "VAROVANIE: vlastnctvo pre %s nastaven nebezpene \"%s\"\n" - -#: g10/gpg.c:1261 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on extension `%s'\n" -msgstr "VAROVANIE: vlastnctvo pre %s nastaven nebezpene \"%s\"\n" - -#: g10/gpg.c:1267 -#, fuzzy, c-format -msgid "WARNING: unsafe permissions on homedir `%s'\n" -msgstr "VAROVANIE: prstupov prva pre %s nie s nastaven bezpene \"%s\"\n" - -#: g10/gpg.c:1270 -#, fuzzy, c-format -msgid "WARNING: unsafe permissions on configuration file `%s'\n" -msgstr "VAROVANIE: prstupov prva pre %s nie s nastaven bezpene \"%s\"\n" - -#: g10/gpg.c:1273 -#, fuzzy, c-format -msgid "WARNING: unsafe permissions on extension `%s'\n" -msgstr "VAROVANIE: prstupov prva pre %s nie s nastaven bezpene \"%s\"\n" - -#: g10/gpg.c:1279 -#, fuzzy, c-format -msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n" -msgstr "VAROVANIE: vlastnctvo adresra %s nastaven nebezpene \"%s\"\n" - -#: g10/gpg.c:1282 -#, fuzzy, c-format -msgid "" -"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n" -msgstr "VAROVANIE: vlastnctvo adresra %s nastaven nebezpene \"%s\"\n" - -#: g10/gpg.c:1285 -#, fuzzy, c-format -msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n" -msgstr "VAROVANIE: vlastnctvo adresra %s nastaven nebezpene \"%s\"\n" - -#: g10/gpg.c:1291 -#, fuzzy, c-format -msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n" -msgstr "" -"VAROVANIE: prstupov prva adresra %s nie s nastaven bezpene \"%s\"\n" - -#: g10/gpg.c:1294 -#, fuzzy, c-format -msgid "" -"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n" -msgstr "" -"VAROVANIE: prstupov prva adresra %s nie s nastaven bezpene \"%s\"\n" - -#: g10/gpg.c:1297 -#, fuzzy, c-format -msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n" -msgstr "" -"VAROVANIE: prstupov prva adresra %s nie s nastaven bezpene \"%s\"\n" - -#: g10/gpg.c:1438 -#, fuzzy, c-format -msgid "unknown configuration item `%s'\n" -msgstr "neznma poloka konfigurcie \"%s\"\n" - -#: g10/gpg.c:1531 -msgid "display photo IDs during key listings" -msgstr "" - -#: g10/gpg.c:1533 -msgid "show policy URLs during signature listings" -msgstr "" - -#: g10/gpg.c:1535 -#, fuzzy -msgid "show all notations during signature listings" -msgstr "V sbore tajnch kov chba zodpovedajci podpis\n" - -#: g10/gpg.c:1537 -msgid "show IETF standard notations during signature listings" -msgstr "" - -#: g10/gpg.c:1541 -msgid "show user-supplied notations during signature listings" -msgstr "" - -#: g10/gpg.c:1543 -#, fuzzy -msgid "show preferred keyserver URLs during signature listings" -msgstr "zadan URL pre podpisov politiku je neplatn\n" - -#: g10/gpg.c:1545 -msgid "show user ID validity during key listings" -msgstr "" - -#: g10/gpg.c:1547 -msgid "show revoked and expired user IDs in key listings" -msgstr "" - -#: g10/gpg.c:1549 -msgid "show revoked and expired subkeys in key listings" -msgstr "" - -#: g10/gpg.c:1551 -#, fuzzy -msgid "show the keyring name in key listings" -msgstr "uk v ktorom sbore kov je vypsan k" - -#: g10/gpg.c:1553 -#, fuzzy -msgid "show expiration dates during signature listings" -msgstr "V sbore tajnch kov chba zodpovedajci podpis\n" - -#: g10/gpg.c:1920 -#, c-format -msgid "NOTE: old default options file `%s' ignored\n" -msgstr "POZNMKA: star implicitn sbor s monosami `%s ignorovan'\n" - -#: g10/gpg.c:1962 -#, c-format -msgid "NOTE: no default option file `%s'\n" -msgstr "POZNMKA: neexistuje implicitn sbor s monosami `%s'\n" - -#: g10/gpg.c:1966 -#, c-format -msgid "option file `%s': %s\n" -msgstr "sbor s monosami `%s': %s\n" - -#: g10/gpg.c:1973 -#, c-format -msgid "reading options from `%s'\n" -msgstr "tam monosti z `%s'\n" - -#: g10/gpg.c:2188 g10/gpg.c:2814 g10/gpg.c:2833 -#, c-format -msgid "NOTE: %s is not for normal use!\n" -msgstr "POZNMKA: %s nie je pre normlne pouitie!\n" - -#: g10/gpg.c:2201 -#, fuzzy, c-format -msgid "cipher extension `%s' not loaded due to unsafe permissions\n" -msgstr "" -"ifra \"%s\" nebola nahran, pretoe prstupov prva nie s nastaven " -"bezpene\n" - -#: g10/gpg.c:2364 g10/gpg.c:2376 -#, fuzzy, c-format -msgid "`%s' is not a valid signature expiration\n" -msgstr "%s nie je platn znakov sada\n" - -#: g10/gpg.c:2452 -#, fuzzy, c-format -msgid "`%s' is not a valid character set\n" -msgstr "%s nie je platn znakov sada\n" - -#: g10/gpg.c:2476 g10/gpg.c:2663 g10/keyedit.c:4064 -#, fuzzy -msgid "could not parse keyserver URL\n" -msgstr "nemono poui URI servera kov - chyba analzy URI\n" - -#: g10/gpg.c:2488 -#, fuzzy, c-format -msgid "%s:%d: invalid keyserver options\n" -msgstr "%s:%d: neplatn parameter pre export\n" - -#: g10/gpg.c:2491 -#, fuzzy -msgid "invalid keyserver options\n" -msgstr "neplatn parameter pre export\n" - -#: g10/gpg.c:2498 -#, c-format -msgid "%s:%d: invalid import options\n" -msgstr "%s:%d: neplatn parameter pre import\n" - -#: g10/gpg.c:2501 -msgid "invalid import options\n" -msgstr "neplatn parameter pre import\n" - -#: g10/gpg.c:2508 -#, c-format -msgid "%s:%d: invalid export options\n" -msgstr "%s:%d: neplatn parameter pre export\n" - -#: g10/gpg.c:2511 -msgid "invalid export options\n" -msgstr "neplatn parameter pre export\n" - -#: g10/gpg.c:2518 -#, fuzzy, c-format -msgid "%s:%d: invalid list options\n" -msgstr "%s:%d: neplatn parameter pre import\n" - -#: g10/gpg.c:2521 -#, fuzzy -msgid "invalid list options\n" -msgstr "neplatn parameter pre import\n" - -#: g10/gpg.c:2529 -msgid "display photo IDs during signature verification" -msgstr "" - -#: g10/gpg.c:2531 -msgid "show policy URLs during signature verification" -msgstr "" - -#: g10/gpg.c:2533 -#, fuzzy -msgid "show all notations during signature verification" -msgstr "%s nie je platn znakov sada\n" - -#: g10/gpg.c:2535 -msgid "show IETF standard notations during signature verification" -msgstr "" - -#: g10/gpg.c:2539 -msgid "show user-supplied notations during signature verification" -msgstr "" - -#: g10/gpg.c:2541 -#, fuzzy -msgid "show preferred keyserver URLs during signature verification" -msgstr "zadan URL pre podpisov politiku je neplatn\n" - -#: g10/gpg.c:2543 -#, fuzzy -msgid "show user ID validity during signature verification" -msgstr "%s nie je platn znakov sada\n" - -#: g10/gpg.c:2545 -msgid "show revoked and expired user IDs in signature verification" -msgstr "" - -#: g10/gpg.c:2547 -msgid "validate signatures with PKA data" -msgstr "" - -#: g10/gpg.c:2549 -msgid "elevate the trust of signatures with valid PKA data" -msgstr "" - -#: g10/gpg.c:2556 -#, fuzzy, c-format -msgid "%s:%d: invalid verify options\n" -msgstr "%s:%d: neplatn parameter pre export\n" - -#: g10/gpg.c:2559 -#, fuzzy -msgid "invalid verify options\n" -msgstr "neplatn parameter pre export\n" - -#: g10/gpg.c:2566 -#, c-format -msgid "unable to set exec-path to %s\n" -msgstr "nemono nastavi exec-path na %s\n" - -#: g10/gpg.c:2729 -#, fuzzy, c-format -msgid "%s:%d: invalid auto-key-locate list\n" -msgstr "%s:%d: neplatn parameter pre export\n" - -#: g10/gpg.c:2732 -msgid "invalid auto-key-locate list\n" -msgstr "" - -#: g10/gpg.c:2803 -msgid "WARNING: program may create a core file!\n" -msgstr "VAROVANIE: program me vytvori sbor core!\n" - -#: g10/gpg.c:2807 -#, c-format -msgid "WARNING: %s overrides %s\n" -msgstr "VAROVANIE: %s prepe %s\n" - -#: g10/gpg.c:2816 -#, c-format -msgid "%s not allowed with %s!\n" -msgstr "Nie je dovolen pouva %s s %s!\n" - -#: g10/gpg.c:2819 -#, c-format -msgid "%s makes no sense with %s!\n" -msgstr "%s nedva s %s zmysel!\n" - -#: g10/gpg.c:2826 -#, 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:2841 -#, fuzzy, c-format -msgid "will not run with insecure memory due to %s\n" -msgstr "zapisujem tajn k do `%s'\n" - -#: g10/gpg.c:2855 -msgid "you can only make detached or clear signatures while in --pgp2 mode\n" -msgstr "" -"v mde --pgp2 mete vytvra len oddelen podpisy alebo podpisy itaten " -"ako text\n" - -#: g10/gpg.c:2861 -msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n" -msgstr "v mde --pgp2 nemono sasne ifrova a podpisova\n" - -#: g10/gpg.c:2867 -msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n" -msgstr "v mde --pgp2 muste poui sbor (nie rru).\n" - -#: g10/gpg.c:2880 -msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n" -msgstr "ifrovanie sprv v mde --pgp2 vyaduje algoritmus IDEA\n" - -#: g10/gpg.c:2947 g10/gpg.c:2971 -msgid "selected cipher algorithm is invalid\n" -msgstr "vybran ifrovac algoritmus je neplatn\n" - -#: g10/gpg.c:2953 g10/gpg.c:2977 -msgid "selected digest algorithm is invalid\n" -msgstr "vybran hashovac algoritmus je neplatn\n" - -#: g10/gpg.c:2959 -#, fuzzy -msgid "selected compression algorithm is invalid\n" -msgstr "vybran ifrovac algoritmus je neplatn\n" - -#: g10/gpg.c:2965 -msgid "selected certification digest algorithm is invalid\n" -msgstr "vybran hashovac algoritmus je neplatn\n" - -#: g10/gpg.c:2980 -msgid "completes-needed must be greater than 0\n" -msgstr "poloka completes-needed mus by via ako 0\n" - -#: g10/gpg.c:2982 -msgid "marginals-needed must be greater than 1\n" -msgstr "poloka marginals-needed mus by via ako 1\n" - -#: g10/gpg.c:2984 -#, fuzzy -msgid "max-cert-depth must be in the range from 1 to 255\n" -msgstr "poloka max-cert-depth mus by v rozmedz od 1 do 255\n" - -#: g10/gpg.c:2986 -msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n" -msgstr "neplatn implicitn rove certifikcie; mus by 0, 1, 2 alebo 3\n" - -#: g10/gpg.c:2988 -msgid "invalid min-cert-level; must be 1, 2, or 3\n" -msgstr "neplatn minimlna rove certifikcie; mus by 0, 1, 2 alebo 3\n" - -#: g10/gpg.c:2991 -msgid "NOTE: simple S2K mode (0) is strongly discouraged\n" -msgstr "POZNMKA: jednoduch md S2K (0) je drazne nedoporuovan\n" - -#: g10/gpg.c:2995 -msgid "invalid S2K mode; must be 0, 1 or 3\n" -msgstr "neplatn md S2K; mus by 0, 1 alebo 3\n" - -#: g10/gpg.c:3002 -msgid "invalid default preferences\n" -msgstr "neplatn defaultn predvoby\n" - -#: g10/gpg.c:3011 -msgid "invalid personal cipher preferences\n" -msgstr "neplatn uvatesk predvoby pre ifrovanie\n" - -#: g10/gpg.c:3015 -msgid "invalid personal digest preferences\n" -msgstr "neplatn uvatesk predvoby pre hashovanie\n" - -#: g10/gpg.c:3019 -msgid "invalid personal compress preferences\n" -msgstr "neplatn uvatesk predvoby pre kompresiu\n" - -#: g10/gpg.c:3052 -#, c-format -msgid "%s does not yet work with %s\n" -msgstr "%s ete nepracuje s %s\n" - -#: g10/gpg.c:3099 -#, fuzzy, c-format -msgid "you may not use cipher algorithm `%s' while in %s mode\n" -msgstr "nemete poui ifrovac algoritmus \"%s\" v mde %s\n" - -#: g10/gpg.c:3104 -#, fuzzy, c-format -msgid "you may not use digest algorithm `%s' while in %s mode\n" -msgstr "nemete poui hashovac algoritmus \"%s\" v mde %s\n" - -#: g10/gpg.c:3109 -#, fuzzy, c-format -msgid "you may not use compression algorithm `%s' while in %s mode\n" -msgstr "nemete poui kompresn algoritmus \"%s\" v mde %s\n" - -#: g10/gpg.c:3208 -#, c-format -msgid "failed to initialize the TrustDB: %s\n" -msgstr "nemem inicializova databzu dvery: %s\n" - -#: g10/gpg.c:3219 -msgid "WARNING: recipients (-r) given without using public key encryption\n" -msgstr "" -"VAROVANIE: dan adrest (-r) bez pouitia ifrovania s verejnm kom\n" - -#: g10/gpg.c:3230 -msgid "--store [filename]" -msgstr "--store [meno sboru]" - -#: g10/gpg.c:3237 -msgid "--symmetric [filename]" -msgstr "--symmetric [meno sboru]" - -#: g10/gpg.c:3239 -#, fuzzy, c-format -msgid "symmetric encryption of `%s' failed: %s\n" -msgstr "deifrovanie zlyhalo: %s\n" - -#: g10/gpg.c:3249 -msgid "--encrypt [filename]" -msgstr "--encrypt [meno sboru]" - -#: g10/gpg.c:3262 -#, fuzzy -msgid "--symmetric --encrypt [filename]" -msgstr "--sign --encrypt [meno sboru]" - -#: g10/gpg.c:3264 -msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n" -msgstr "" - -#: g10/gpg.c:3267 -#, fuzzy, c-format -msgid "you cannot use --symmetric --encrypt while in %s mode\n" -msgstr "" -"pouitie %s nie je v mde %s dovolen\n" -"\n" - -#: g10/gpg.c:3285 -msgid "--sign [filename]" -msgstr "--sign [meno sboru]" - -#: g10/gpg.c:3298 -msgid "--sign --encrypt [filename]" -msgstr "--sign --encrypt [meno sboru]" - -#: g10/gpg.c:3313 -#, fuzzy -msgid "--symmetric --sign --encrypt [filename]" -msgstr "--sign --encrypt [meno sboru]" - -#: g10/gpg.c:3315 -msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n" -msgstr "" - -#: g10/gpg.c:3318 -#, fuzzy, c-format -msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n" -msgstr "" -"pouitie %s nie je v mde %s dovolen\n" -"\n" - -#: g10/gpg.c:3338 -msgid "--sign --symmetric [filename]" -msgstr "--sign --symmetric [meno sboru]" - -#: g10/gpg.c:3347 -msgid "--clearsign [filename]" -msgstr "--clearsign [meno sboru]" - -#: g10/gpg.c:3372 -msgid "--decrypt [filename]" -msgstr "--decrypt [meno sboru]" - -#: g10/gpg.c:3380 -msgid "--sign-key user-id" -msgstr "--sign-key id uvatea" - -#: g10/gpg.c:3384 -msgid "--lsign-key user-id" -msgstr "--lsign-key id uvatea" - -#: g10/gpg.c:3405 -msgid "--edit-key user-id [commands]" -msgstr "--edit-key id uvatea [prkazy]" - -#: g10/gpg.c:3476 -msgid "-k[v][v][v][c] [user-id] [keyring]" -msgstr "-k[v][v][v][c] [id uvatea] [sbor s kmi (keyring)]" - -#: g10/gpg.c:3518 -#, c-format -msgid "keyserver send failed: %s\n" -msgstr "nepodarilo posla k na server: %s\n" - -#: g10/gpg.c:3520 -#, c-format -msgid "keyserver receive failed: %s\n" -msgstr "nepodarilo sa prija k zo servera: %s\n" - -#: g10/gpg.c:3522 -#, c-format -msgid "key export failed: %s\n" -msgstr "nepodaril sa export ka: %s\n" - -#: g10/gpg.c:3533 -#, c-format -msgid "keyserver search failed: %s\n" -msgstr "nepodarilo sa njs server: %s\n" - -#: g10/gpg.c:3543 -#, c-format -msgid "keyserver refresh failed: %s\n" -msgstr "aktualizcia servera zlyhala: %s\n" - -#: g10/gpg.c:3594 -#, c-format -msgid "dearmoring failed: %s\n" -msgstr "dekdovanie z ASCII formtu zlyhalo: %s\n" - -#: g10/gpg.c:3602 -#, c-format -msgid "enarmoring failed: %s\n" -msgstr "kdovanie do ASCII formtu zlyhalo: %s\n" - -#: g10/gpg.c:3689 -#, c-format -msgid "invalid hash algorithm `%s'\n" -msgstr "neplatn hashovac algoritmus `%s'\n" - -#: g10/gpg.c:3812 -msgid "[filename]" -msgstr "[meno sboru]" - -#: g10/gpg.c:3816 -msgid "Go ahead and type your message ...\n" -msgstr "Zanite psa svoju sprvu ...\n" - -#: g10/gpg.c:4120 -msgid "the given certification policy URL is invalid\n" -msgstr "zadan URL pre certifikan politiku je neplatn\n" - -#: g10/gpg.c:4122 -msgid "the given signature policy URL is invalid\n" -msgstr "zadan URL pre podpisov politiku je neplatn\n" - -#: g10/gpg.c:4155 -#, 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 "prli vea poloiek v bufferi verejnch kov - 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:3707 -#, 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 "pouvam sekundrny k %08lX namiesto primrneho ka %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 verejnho ka - preskoen\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 sboru kov? " - -#: g10/gpgv.c:77 -msgid "make timestamp conflicts only a warning" -msgstr "konflikt asovho raztka" - -#: g10/gpgv.c:78 -msgid "|FD|write status info to this FD" -msgstr "|FD|zapsa informcie o stave do tohto FD" - -#: g10/gpgv.c:102 -msgid "Usage: gpgv [options] [files] (-h for help)" -msgstr "Pouitie: gpgv [monosti] [sbory] (-h pre pomoc)" - -#: g10/gpgv.c:105 -msgid "" -"Syntax: gpg [options] [files]\n" -"Check signatures against known trusted keys\n" -msgstr "" -"Syntax: gpg [nastavenia] [sbory]\n" -"Skontroluje podpisy oproti znmym dveryhodnm kom\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 Vs, aby ste sem priradili hodnotu; tto hodnota nebude nikdy\n" -"exportovan tretej strane. Potrebujeme ju k implementcii \"pavuiny\n" -"dvery\"; nem to ni spolon s (implicitne vytvorenou) \"pavuinou\n" -"certifiktov\"." - -#: 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 mon vybudova pavuinu dvery, mus GnuPG vedie, ktorm kom\n" -"dverujete absoltne - obyajne s to tie ke, pre ktor mte prstup\n" -"k tajnm kom. Odpovedzte \"ano\", aby ste nastavili tieto ke\n" -"ako absoltne dveryhodn\n" - -#: g10/helptext.c:62 -msgid "If you want to use this untrusted key anyway, answer \"yes\"." -msgstr "" -"Pokia aj tak chcete poui tento nedveryhodn k, odpovedzte \"ano\"." - -#: g10/helptext.c:66 -msgid "" -"Enter the user ID of the addressee to whom you want to send the message." -msgstr "Vlote identifiktor adresta, ktormu chcete posla sprvu." - -#: 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 "" -"Vebecne nemono odpora pouva rovnak k na ifrovanie a " -"podeisovanie\n" -"Tento algoritmus je vhodn poui len za uritch podmienok.\n" -"Kontaktujte prosm najprv bezpenostnho pecialistu." - -#: g10/helptext.c:91 -msgid "Enter the size of the key" -msgstr "Vlote dku ka" - -#: 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 "" -"Vlote poadovan hodnotu tak, ako je uveden v prkazovom riadku.\n" -"Je mon vloi dtum vo formte ISO (RRRR-MM-DD), ale nedostanete\n" -"sprvnu chybov hlku - miesto toho systm sksi interpretova\n" -"zadan hodnotu ako interval." - -#: g10/helptext.c:117 -msgid "Enter the name of the key holder" -msgstr "Vlote meno dritea ka" - -#: g10/helptext.c:122 -msgid "please enter an optional but highly suggested email address" -msgstr "prosm, vlote e-mailov adresu (nepovinn, ale vemi odporan)" - -#: g10/helptext.c:126 -msgid "Please enter an optional comment" -msgstr "Prosm, vlote nepovinn komentr" - -#: 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 nzvu.\n" -"C pre zmenu komentra.\n" -"E pre zmenu e-mailovej adresy.\n" -"O pre pokraovanie generovania ka.\n" -"Q pre ukonenie generovania ka." - -#: 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 "" -"Skr ako podpete id uvatea, mali by ste najprv overi, i k\n" -"patr osobe, ktorej meno je uveden v identifiktore uvatea.\n" -"Je vemi uiton, ke ostatn vedia, ako dsledne ste previedli\n" -"takto overenie.\n" -"\n" -"\"0\" znamen, e neuvdzate, ako dsledne ste pravos ka overili\n" -"\n" -"\"1\" znamen, e verte tomu, e k patr osobe, ktor je uveden,\n" -" v uvateskom ID, ale nemohli ste alebo jste nepreverili tto " -"skutonos.\n" -" To je uiton pre \"osobn\" verifikciu, ke podpisujete ke, ktor\n" -" pouvaj pseudonym uvatea.\n" -"\n" -"\"2\" znamen, e ste iastone overili pravos ka. Napr. ste overili\n" -" fingerprint ka a skontrolovali identifiktor uvatea\n" -" uveden na ki s fotografickm id.\n" -"\n" -"\"3\" Znamen, e ste vykonali vemi dkladn overenie pravosti ka.\n" -" To me naprklad znamena, e ste overili fingerprint ka \n" -" jeho vlastnka osobne a alej ste pomocou tako falovatenho \n" -" dokumentu s fotografiou (naprklad pasu) overili, e meno majitea\n" -" ka sa zhoduje s menom uvedenm v uvateskom ID a alej ste \n" -" overili (vmenou elektronickch dopisov), e elektronick adresa " -"uveden \n" -" v ID uvatea patr majiteovi ka.\n" -"\n" -"Prosm nezabdajte, e prklady uveden pre rove 2 a 3 s *len*\n" -"prklady.\n" -"Je len na Vaom rozhodnut, o \"iaston\" a \"dkladn\" overenie " -"znamen\n" -"ke budete podpisova ke inm uvateom.\n" -"\n" -"Pokia neviete, ak je sprvna odpove, odpovedzte \"0\"." - -#: g10/helptext.c:186 -#, fuzzy -msgid "Answer \"yes\" if you want to sign ALL the user IDs" -msgstr "" -"Pokia chcete podpsa VETKY identifiktory uvateov, 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 skutone chcete zmaza tento identifiktor uvatea, odpovedzte \"ano" -"\".\n" -"Vetky certifikty 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 ka; normlne nechcete tento podpis zmaza,\n" -"pretoe me by dleit pri vytvran dvery ka alebo inho ka\n" -"ceritifikovanho tmto kom." - -#: 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 neme by overen, pretoe nemte zodpovedajci verejn k.\n" -"Jeho zmazanie by ste mali odloi do asu, ke budete vedie, ktor k\n" -"bol pouit, pretoe tento podpisovac k me vytvori dveru\n" -"prostrednctvom inho u certifikovanho ka." - -#: 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 odstrni z Vho sboru kov." - -#: 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 viae identifiktor uvatea ku ku. Zvyajne\n" -"nie je dobr takto podpis odstrni. GnuPG neme tento k naalej\n" -"pouva. Urobte to len v prpade, ke je tento podpis ka\n" -"nm samm z nejakho dvodu neplatn a ke je k dispozcii 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 predvoby pre vetky uvatesk ID (alebo len pre oznaen)\n" -"na aktulny zoznam predvolieb. asov raztka vetkch dotknutch podpisov\n" -"kov nimi samotnmi bud posunut o jednu sekundu dopredu.\n" - -#: g10/helptext.c:230 -msgid "Please enter the passhrase; this is a secret sentence \n" -msgstr "Prosm, vlote 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 "" -"Prosm, zopakujte posledn heslo, aby ste si boli ist, o ste napsali." - -#: g10/helptext.c:240 -msgid "Give the name of the file to which the signature applies" -msgstr "Zadajte nzov sboru, ku ktormu sa podpis vzahuje" - -#: g10/helptext.c:245 -msgid "Answer \"yes\" if it is okay to overwrite the file" -msgstr "Ak si prajete prepsanie sboru, 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 "" -"Prosm, vlote nov nzov sboru. Ak len stlate RETURN, bude\n" -"pouit implicitn sbor (ktor je zobrazen v ztvorkch)." - -#: 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 dvod certifikcie. V zvislosti na kontexte\n" -"mte monos si vybra zo zoznamu:\n" -" \"k bol kompromitovan\"\n" -" Toto pouite, pokia si myslte, e k Vmu tajnmu ku zskali\n" -" prstup neoprvnen osoby.\n" -" \"k je nahraden\"\n" -" Toto pouite, pokia ste tento k nahradili novm kom.\n" -" \"k sa u nepouva\"\n" -" Toto pouite, pokia tento k u nepouvate.\n" -" \"Identifiktor uvatea u nie je platn\"\n" -" Toto pouite, pokia by sa identifiktor uvatea u nemal pouva;\n" -" normlne sa pouva na oznaenie 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, mete vloi text popisujc pvod vzniku tohto revokanho\n" -"ceritifiktu. Prosm, strune. \n" -"Text kon przdnym riadkom.\n" - -#: g10/helptext.c:287 -msgid "No help available" -msgstr "Pomoc nie je k dispozcii" - -#: 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 databzu dvery" - -#: g10/import.c:102 -#, fuzzy -msgid "create a public key when importing a secret key" -msgstr "verejn k neshlas s tajnm!\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 "nepouiten tajn k" - -#: g10/import.c:108 -msgid "remove as much as possible from key after import" -msgstr "" - -#: g10/import.c:266 -#, c-format -msgid "skipping block of type %d\n" -msgstr "blok typu %d bol preskoen\n" - -#: g10/import.c:275 -#, fuzzy, c-format -msgid "%lu keys processed so far\n" -msgstr "%lu ke boli doteraz spracovan\n" - -#: g10/import.c:292 -#, c-format -msgid "Total number processed: %lu\n" -msgstr "Celkovo spracovanch kov: %lu\n" - -#: g10/import.c:294 -#, c-format -msgid " skipped new keys: %lu\n" -msgstr " preskoen nov ke: %lu\n" - -#: g10/import.c:297 -#, c-format -msgid " w/o user IDs: %lu\n" -msgstr " bez identifiktorov: %lu\n" - -#: g10/import.c:299 -#, c-format -msgid " imported: %lu" -msgstr " importovan: %lu" - -#: g10/import.c:305 -#, c-format -msgid " unchanged: %lu\n" -msgstr " bez zmien: %lu\n" - -#: g10/import.c:307 -#, c-format -msgid " new user IDs: %lu\n" -msgstr " nov id uvateov: %lu\n" - -#: g10/import.c:309 -#, c-format -msgid " new subkeys: %lu\n" -msgstr " nov podke: %lu\n" - -#: g10/import.c:311 -#, c-format -msgid " new signatures: %lu\n" -msgstr " nov podpisy: %lu\n" - -#: g10/import.c:313 -#, c-format -msgid " new key revocations: %lu\n" -msgstr " nov revokcie kov: %lu\n" - -#: g10/import.c:315 -#, c-format -msgid " secret keys read: %lu\n" -msgstr " pretan tajn ke: %lu\n" - -#: g10/import.c:317 -#, c-format -msgid " secret keys imported: %lu\n" -msgstr " importovan tajn ke: %lu\n" - -#: g10/import.c:319 -#, c-format -msgid " secret keys unchanged: %lu\n" -msgstr " tajn ke nezmenen: %lu\n" - -#: g10/import.c:321 -#, c-format -msgid " not imported: %lu\n" -msgstr " neimportovan: %lu\n" - -#: g10/import.c:323 -#, fuzzy, c-format -msgid " signatures cleaned: %lu\n" -msgstr " nov podpisy: %lu\n" - -#: g10/import.c:325 -#, fuzzy, c-format -msgid " user IDs cleaned: %lu\n" -msgstr " pretan tajn ke: %lu\n" - -#: g10/import.c:566 -#, 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:570 -#, fuzzy -msgid " algorithms on these user IDs:\n" -msgstr "Podpsali ste nasledujce identifiktory uvatea:\n" - -#: g10/import.c:607 -#, c-format -msgid " \"%s\": preference for cipher algorithm %s\n" -msgstr "" - -#: g10/import.c:619 -#, fuzzy, c-format -msgid " \"%s\": preference for digest algorithm %s\n" -msgstr "%s podpis, hashovac algoritmus %s\n" - -#: g10/import.c:631 -#, c-format -msgid " \"%s\": preference for compression algorithm %s\n" -msgstr "" - -#: g10/import.c:644 -msgid "it is strongly suggested that you update your preferences and\n" -msgstr "" - -#: g10/import.c:646 -msgid "re-distribute this key to avoid potential algorithm mismatch problems\n" -msgstr "" - -#: g10/import.c:670 -#, c-format -msgid "you can update your preferences with: gpg --edit-key %s updpref save\n" -msgstr "" - -#: g10/import.c:720 g10/import.c:1118 -#, fuzzy, c-format -msgid "key %s: no user ID\n" -msgstr "k %08lX: chyba identifiktor uvatea\n" - -#: g10/import.c:749 -#, fuzzy, c-format -msgid "key %s: PKS subkey corruption repaired\n" -msgstr "k %08lX: HKP pokodenie podka opraven\n" - -# c-format -#: g10/import.c:764 -#, fuzzy, c-format -msgid "key %s: accepted non self-signed user ID \"%s\"\n" -msgstr "" -"k %08lX: prijat id uvatea '%s', ktor nie je podpsan nm samm\n" - -#: g10/import.c:770 -#, fuzzy, c-format -msgid "key %s: no valid user IDs\n" -msgstr "k %08lX: chba platn identifiktor uvatea\n" - -#: g10/import.c:772 -msgid "this may be caused by a missing self-signature\n" -msgstr "me to by spsoben chbajcim podpisom ka nm samm\n" - -#: g10/import.c:782 g10/import.c:1240 -#, fuzzy, c-format -msgid "key %s: public key not found: %s\n" -msgstr "k %08lX: verejn k nenjden: %s\n" - -#: g10/import.c:788 -#, fuzzy, c-format -msgid "key %s: new key - skipped\n" -msgstr "k %08lX: nov k - preskoen\n" - -#: g10/import.c:797 -#, c-format -msgid "no writable keyring found: %s\n" -msgstr "nenjden zapisovaten sbor kov (keyring): %s\n" - -#: g10/import.c:802 g10/openfile.c:267 g10/sign.c:831 g10/sign.c:1135 -#, c-format -msgid "writing to `%s'\n" -msgstr "zapisujem do '%s'\n" - -#: g10/import.c:806 g10/import.c:901 g10/import.c:1158 g10/import.c:1301 -#: g10/import.c:2363 g10/import.c:2385 -#, c-format -msgid "error writing keyring `%s': %s\n" -msgstr "chyba pri zpise sboru kov (keyring) `%s': %s\n" - -#: g10/import.c:825 -#, fuzzy, c-format -msgid "key %s: public key \"%s\" imported\n" -msgstr "k %08lX: verejn k \"%s\" importovan\n" - -#: g10/import.c:849 -#, fuzzy, c-format -msgid "key %s: doesn't match our copy\n" -msgstr "k %08lX: nezodpoved naej kpii\n" - -#: g10/import.c:866 g10/import.c:1258 -#, fuzzy, c-format -msgid "key %s: can't locate original keyblock: %s\n" -msgstr "k %08lX: nemem njs originlny blok ka: %s\n" - -#: g10/import.c:874 g10/import.c:1265 -#, fuzzy, c-format -msgid "key %s: can't read original keyblock: %s\n" -msgstr "k %08lX: nemem ta originlny blok ka: %s\n" - -#: g10/import.c:911 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new user ID\n" -msgstr "k %08lX: \"%s\" 1 nov identifiktor uvatea\n" - -#: g10/import.c:914 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new user IDs\n" -msgstr "k %08lX: \"%s\" %d novch identifiktorov uvatea\n" - -#: g10/import.c:917 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new signature\n" -msgstr "k %08lX: \"%s\" 1 nov podpis\n" - -#: g10/import.c:920 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new signatures\n" -msgstr "k %08lX: \"%s\" %d novch podpisov\n" - -#: g10/import.c:923 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new subkey\n" -msgstr "k %08lX: \"%s\" 1 nov podk\n" - -#: g10/import.c:926 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new subkeys\n" -msgstr "k %08lX: \"%s\" %d novch podkov\n" - -#: g10/import.c:929 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signature cleaned\n" -msgstr "k %08lX: \"%s\" %d novch podpisov\n" - -#: g10/import.c:932 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signatures cleaned\n" -msgstr "k %08lX: \"%s\" %d novch podpisov\n" - -#: g10/import.c:935 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d user ID cleaned\n" -msgstr "k %08lX: \"%s\" %d novch identifiktorov uvatea\n" - -#: g10/import.c:938 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d user IDs cleaned\n" -msgstr "k %08lX: \"%s\" %d novch identifiktorov uvatea\n" - -#: g10/import.c:961 -#, fuzzy, c-format -msgid "key %s: \"%s\" not changed\n" -msgstr "k %08lX: \"%s\" bez zmeny\n" - -#: g10/import.c:1124 -#, fuzzy, c-format -msgid "key %s: secret key with invalid cipher %d - skipped\n" -msgstr "k %08lX: tajn k bez verejnho ka %d - preskoen\n" - -#: g10/import.c:1135 -#, fuzzy -msgid "importing secret keys not allowed\n" -msgstr "zapisujem tajn k do `%s'\n" - -#: g10/import.c:1152 g10/import.c:2378 -#, c-format -msgid "no default secret keyring: %s\n" -msgstr "nie je nastaven implicitn sbor tajnch kov %s\n" - -#: g10/import.c:1163 -#, fuzzy, c-format -msgid "key %s: secret key imported\n" -msgstr "k %08lX: tajn k importovan\n" - -#: g10/import.c:1193 -#, fuzzy, c-format -msgid "key %s: already in secret keyring\n" -msgstr "k %08lX: je u v sbore tajnch kov\n" - -#: g10/import.c:1203 -#, fuzzy, c-format -msgid "key %s: secret key not found: %s\n" -msgstr "k %08lX: nebol njden tajn k: %s\n" - -#: g10/import.c:1233 -#, fuzzy, c-format -msgid "key %s: no public key - can't apply revocation certificate\n" -msgstr "" -"k %08lX: chba verejn k - nemem aplikova revokan certifikt\n" - -#: g10/import.c:1276 -#, fuzzy, c-format -msgid "key %s: invalid revocation certificate: %s - rejected\n" -msgstr "k %08lX: neplatn revokan certifikt: %s - zamietnut\n" - -#: g10/import.c:1308 -#, fuzzy, c-format -msgid "key %s: \"%s\" revocation certificate imported\n" -msgstr "k %08lX: \"%s\" revokan certifikt importovan\n" - -#: g10/import.c:1374 -#, fuzzy, c-format -msgid "key %s: no user ID for signature\n" -msgstr "k %08lX: neexistuje id uvatea pre podpis\n" - -#: g10/import.c:1389 -#, fuzzy, c-format -msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n" -msgstr "" -"k %08lX: nepodporovan algoritmus verejnho ka u uvateskho id \"%s" -"\"\n" - -#: g10/import.c:1391 -#, fuzzy, c-format -msgid "key %s: invalid self-signature on user ID \"%s\"\n" -msgstr "" -"k %08lX: neplatn podpis ka nm samm u uvateskho id \"%s\"\n" - -#: g10/import.c:1409 -#, fuzzy, c-format -msgid "key %s: no subkey for key binding\n" -msgstr "k %08lX: neexistuje podk pre viazanie kov\n" - -#: g10/import.c:1420 g10/import.c:1470 -#, fuzzy, c-format -msgid "key %s: unsupported public key algorithm\n" -msgstr "k %08lX: nepodporovan algoritmus verejnho ka\n" - -#: g10/import.c:1422 -#, fuzzy, c-format -msgid "key %s: invalid subkey binding\n" -msgstr "k %08lX: neplatn vzba podka\n" - -#: g10/import.c:1437 -#, fuzzy, c-format -msgid "key %s: removed multiple subkey binding\n" -msgstr "k %08lX: zmazan viacnsobn vzba podka\n" - -#: g10/import.c:1459 -#, fuzzy, c-format -msgid "key %s: no subkey for key revocation\n" -msgstr "k %08lX: neexistuje podk na revokciu ka\n" - -#: g10/import.c:1472 -#, fuzzy, c-format -msgid "key %s: invalid subkey revocation\n" -msgstr "k %08lX: neplatn revokan podk\n" - -#: g10/import.c:1487 -#, fuzzy, c-format -msgid "key %s: removed multiple subkey revocation\n" -msgstr "k %08lX: zmazan viacnsobn revokcia podka\n" - -#: g10/import.c:1529 -#, fuzzy, c-format -msgid "key %s: skipped user ID \"%s\"\n" -msgstr "k %08lX: identifiktor uvatea preskoen '" - -#: g10/import.c:1550 -#, fuzzy, c-format -msgid "key %s: skipped subkey\n" -msgstr "k %08lX: podk preskoen\n" - -#: g10/import.c:1577 -#, fuzzy, c-format -msgid "key %s: non exportable signature (class 0x%02X) - skipped\n" -msgstr "k %08lX: podpis nie je exportovaten (trieda %02x) - preskoen\n" - -#: g10/import.c:1587 -#, fuzzy, c-format -msgid "key %s: revocation certificate at wrong place - skipped\n" -msgstr "k %08lX: revokan certifikt na zlom mieste - preskoen \n" - -#: g10/import.c:1604 -#, fuzzy, c-format -msgid "key %s: invalid revocation certificate: %s - skipped\n" -msgstr "k %08lX: neplatn revokan certifikt: %s - preskoen\n" - -#: g10/import.c:1618 -#, fuzzy, c-format -msgid "key %s: subkey signature in wrong place - skipped\n" -msgstr "k %08lX: podpis subka na zlom mieste - preskoen \n" - -#: g10/import.c:1626 -#, fuzzy, c-format -msgid "key %s: unexpected signature class (0x%02X) - skipped\n" -msgstr "k %08lX: neoakvan podpisov trieda (0x%02X) - preskoen\n" - -#: g10/import.c:1726 -#, fuzzy, c-format -msgid "key %s: duplicated user ID detected - merged\n" -msgstr "k %08lX: zisten duplikovan identifiktor uvatea - zlen\n" - -#: g10/import.c:1788 -#, fuzzy, c-format -msgid "WARNING: key %s may be revoked: fetching revocation key %s\n" -msgstr "" -"VAROVANIE: k %08lX me by revokovan: skam zska revokan k %" -"08lX\n" - -#: g10/import.c:1802 -#, fuzzy, c-format -msgid "WARNING: key %s may be revoked: revocation key %s not present.\n" -msgstr "" -"VAROVANIE: k %08lX me by revokovan: revokan k %08lX nenjden.\n" - -#: g10/import.c:1861 -#, fuzzy, c-format -msgid "key %s: \"%s\" revocation certificate added\n" -msgstr "k %08lX: pridan revokan certifikt \"%s\"\n" - -#: g10/import.c:1895 -#, fuzzy, c-format -msgid "key %s: direct key signature added\n" -msgstr "k %08lX: podpis ka nm samm (direct key signature)\n" - -#: g10/import.c:2284 -#, fuzzy -msgid "NOTE: a key's S/N does not match the card's one\n" -msgstr "verejn k neshlas s tajnm!\n" - -#: g10/import.c:2292 -#, fuzzy -msgid "NOTE: primary key is online and stored on card\n" -msgstr "preskoen: tajn k je u v databze\n" - -#: g10/import.c:2294 -#, fuzzy -msgid "NOTE: secondary key is online and stored on card\n" -msgstr "preskoen: tajn k je u v databze\n" - -#: g10/keydb.c:168 -#, c-format -msgid "error creating keyring `%s': %s\n" -msgstr "chyba pri vytvran sboru kov (keyring)`%s': %s\n" - -#: g10/keydb.c:175 -#, c-format -msgid "keyring `%s' created\n" -msgstr "sbor kov (keyring) `%s' vytvoren\n" - -#: g10/keydb.c:316 g10/keydb.c:319 -#, fuzzy, c-format -msgid "keyblock resource `%s': %s\n" -msgstr "chyba pri vytvran `%s': %s\n" - -#: g10/keydb.c:698 -#, c-format -msgid "failed to rebuild keyring cache: %s\n" -msgstr "zlyhalo obnovenie vyrovnvacej pamti kov: %s\n" - -#: g10/keyedit.c:266 -msgid "[revocation]" -msgstr "[revokcia]" - -#: g10/keyedit.c:267 -msgid "[self-signature]" -msgstr "[podpis ka nm samm]" - -#: 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 zlch 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, pretoe chba 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 neoverench, pretoe chba k\n" - -#: g10/keyedit.c:353 g10/keylist.c:398 -msgid "1 signature not checked due to an error\n" -msgstr "1 podpis neoveren, pretoe 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 neoverench, pretoe vznikli chyby\n" - -#: g10/keyedit.c:357 -msgid "1 user ID without valid self-signature detected\n" -msgstr "zisten 1 identifiktor uvatea bez platnho podpisu nm samm\n" - -#: g10/keyedit.c:359 -#, c-format -msgid "%d user IDs without valid self-signatures detected\n" -msgstr "" -"zistench %d identifiktorov uvatea bez platnho podpisu nm samm\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 "" -"Prosm rozhodnite, nakoko dverujete tomuto uvateovi, e sprvne\n" -"verifikuje ke inch uvateov (prezretm cestovnch pasov,\n" -"kontrolou fingerprintov z rznych zdrojov...)?\n" -"\n" - -#: g10/keyedit.c:419 g10/pkclist.c:275 -#, fuzzy, c-format -msgid " %d = I trust marginally\n" -msgstr " %d = Dverujem iastone\n" - -#: g10/keyedit.c:420 g10/pkclist.c:277 -#, fuzzy, c-format -msgid " %d = I trust fully\n" -msgstr " %d = Dverujem 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 "Uvatesk 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 stle chcete podpsa 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 " Nemono podpsa.\n" - -#: g10/keyedit.c:627 -#, c-format -msgid "User ID \"%s\" is expired." -msgstr "Uvatesk ID \"%s\" je revokovan." - -#: g10/keyedit.c:655 -#, c-format -msgid "User ID \"%s\" is not self-signed." -msgstr "ID uvatea \"%s\" nie je podpsan nm samm." - -#: g10/keyedit.c:683 -#, fuzzy, c-format -msgid "User ID \"%s\" is signable. " -msgstr "ID uvatea \"%s\" nie je podpsan nm samm." - -#: g10/keyedit.c:685 -#, fuzzy -msgid "Sign it? (y/N) " -msgstr "Skutone podpsa? " - -#: g10/keyedit.c:707 -#, c-format -msgid "" -"The self-signature on \"%s\"\n" -"is a PGP 2.x-style signature.\n" -msgstr "" -"Podpis ka \"%s\" nm samm je\n" -"podpis vo formte 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 formt OpenPGP? (a/N) " - -#: g10/keyedit.c:730 -#, c-format -msgid "" -"Your current signature on \"%s\"\n" -"has expired.\n" -msgstr "" -"V sasn podpis na \"%s\"\n" -"je len loklny.\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 Vho podpisu vyprala 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 sasn podpis na \"%s\"\n" -"je len loklny.\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 exportovaten podpis? (a/N) " - -#: g10/keyedit.c:780 -#, fuzzy, c-format -msgid "\"%s\" was already locally signed by key %s\n" -msgstr "\"%s\" je u loklne podpsan kom %08lX\n" - -#: g10/keyedit.c:783 -#, fuzzy, c-format -msgid "\"%s\" was already signed by key %s\n" -msgstr "\"%s\" je u podpsan kom %08lX\n" - -#: g10/keyedit.c:788 -msgid "Do you want to sign it again anyway? (y/N) " -msgstr "Ste si ist, e stle chcete podpsa tento k? (a/N) " - -#: g10/keyedit.c:810 -#, fuzzy, c-format -msgid "Nothing to sign with key %s\n" -msgstr "Ni na podpsanie kom %08lX\n" - -#: g10/keyedit.c:825 -msgid "This key has expired!" -msgstr "Platnos ka vyprala!" - -#: g10/keyedit.c:843 -#, c-format -msgid "This key is due to expire on %s.\n" -msgstr "Platnos ka 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 Vho podpisu vyprala 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 "" -"Nemete vytvori OpenPGP podpis ka typu PGP 2.x, ke ste v --pgp2 mde.\n" - -#: g10/keyedit.c:891 -msgid "This would make the key unusable in PGP 2.x.\n" -msgstr "To by spsobilo nepouitelnos ka 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 podpsa\n" -"patr vyie uvedenej osobe?\n" -"Pokia nepoznte 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) Vbec som to nekontroloval(a).%s\n" - -#: g10/keyedit.c:925 -#, c-format -msgid " (2) I have done casual checking.%s\n" -msgstr " (2) iastone som to overil(a).%s\n" - -#: g10/keyedit.c:927 -#, c-format -msgid " (3) I have done very careful checking.%s\n" -msgstr " (3) Vemi dkladne som to overil(a).%s\n" - -#: g10/keyedit.c:933 -#, fuzzy -msgid "Your selection? (enter `?' for more information): " -msgstr "V vber? ('?' - viac informci): " - -#: 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 podpsa tento k\n" -"svojm kom: \"" - -#: g10/keyedit.c:964 -#, fuzzy -msgid "This will be a self-signature.\n" -msgstr "" -"\n" -"Ide o podpis ka nm samm\n" - -#: g10/keyedit.c:970 -#, fuzzy -msgid "WARNING: the signature will not be marked as non-exportable.\n" -msgstr "" -"\n" -"VAROVANIE: podpis nebude oznaen ako neexportovaten.\n" - -#: g10/keyedit.c:978 -#, fuzzy -msgid "WARNING: the signature will not be marked as non-revocable.\n" -msgstr "" -"\n" -"VAROVANIE: podpis nebude oznaen ako neodvolaten (non-revocable).\n" - -#: g10/keyedit.c:988 -#, fuzzy -msgid "The signature will be marked as non-exportable.\n" -msgstr "" -"\n" -"Podpis bude oznaen ako neexportovaten.\n" -"\n" - -#: g10/keyedit.c:995 -#, fuzzy -msgid "The signature will be marked as non-revocable.\n" -msgstr "" -"\n" -"Podpis bude oznaen ako neodvolaten (non-revocable).\n" - -#: g10/keyedit.c:1002 -#, fuzzy -msgid "I have not checked this key at all.\n" -msgstr "" -"\n" -"Vbec som tento k neoveril.\n" - -#: g10/keyedit.c:1007 -#, fuzzy -msgid "I have checked this key casually.\n" -msgstr "" -"\n" -"iastone som overil tento k.\n" - -#: g10/keyedit.c:1012 -#, fuzzy -msgid "I have checked this key very carefully.\n" -msgstr "" -"\n" -"Velmi dkladne som overil tento k.\n" - -#: g10/keyedit.c:1022 -#, fuzzy -msgid "Really sign? (y/N) " -msgstr "Skutone podpsa? " - -#: g10/keyedit.c:1067 g10/keyedit.c:4783 g10/keyedit.c:4874 g10/keyedit.c:4938 -#: g10/keyedit.c:4999 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 chrnen.\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 primrneho ka 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 primrneho ka nie s dostupn.\n" - -#: g10/keyedit.c:1155 g10/keygen.c:3206 -msgid "Key is protected.\n" -msgstr "k je chrnen.\n" - -#: g10/keyedit.c:1179 -#, c-format -msgid "Can't edit this key: %s\n" -msgstr "Nie je mon editova tento k: %s\n" - -#: g10/keyedit.c:1185 -msgid "" -"Enter the new passphrase for this secret key.\n" -"\n" -msgstr "" -"Vlote 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 sprvne; skste 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* npad!\n" -"\n" - -#: g10/keyedit.c:1202 -#, fuzzy -msgid "Do you really want to do this? (y/N) " -msgstr "Skutone to chcete urobi? " - -#: g10/keyedit.c:1273 -msgid "moving a key signature to the correct place\n" -msgstr "presvam podpis ka na sprvne miesto\n" - -#: g10/keyedit.c:1359 -msgid "save and quit" -msgstr "uloi a ukoni" - -#: g10/keyedit.c:1362 -#, fuzzy -msgid "show key fingerprint" -msgstr "vypsa fingerprint" - -#: g10/keyedit.c:1363 -msgid "list key and user IDs" -msgstr "vypsa zoznam kov a id uvateov" - -#: g10/keyedit.c:1365 -msgid "select user ID N" -msgstr "vyberte identifiktor uvatea N" - -#: g10/keyedit.c:1366 -#, fuzzy -msgid "select subkey N" -msgstr "vyberte identifiktor uvatea 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 "podpsa k loklne" - -#: g10/keyedit.c:1379 -#, fuzzy -msgid "sign selected user IDs with a trust signature" -msgstr "Npoveda: Vyberte id uvatea na podpsanie\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 identifiktor uvatea" - -#: 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 identifiktor uvatea" - -#: 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 sekundrny k" - -#: g10/keyedit.c:1408 -msgid "add a revocation key" -msgstr "prida revokan k" - -#: g10/keyedit.c:1410 -#, fuzzy -msgid "delete signatures from the selected user IDs" -msgstr "Skutone aktualizova predvoby pre vybran id uvatea? " - -#: g10/keyedit.c:1412 -#, fuzzy -msgid "change the expiration date for the key or selected subkeys" -msgstr "Nemete zmeni dobu platnosti ka verzie 3\n" - -#: g10/keyedit.c:1414 -#, fuzzy -msgid "flag the selected user ID as primary" -msgstr "oznai uvatesk ID ako primrne" - -#: g10/keyedit.c:1416 -#, fuzzy -msgid "toggle between the secret and public key listings" -msgstr "prepn medzi vypsanm zoznamu tajnch a verejnch kov" - -#: g10/keyedit.c:1419 -msgid "list preferences (expert)" -msgstr "vypsa zoznam predvolieb (pre expertov)" - -#: g10/keyedit.c:1421 -msgid "list preferences (verbose)" -msgstr "vypsa zoznam predvolieb (podrobne)" - -#: g10/keyedit.c:1423 -#, fuzzy -msgid "set preference list for the selected user IDs" -msgstr "Skutone aktualizova predvoby pre vybran id uvatea? " - -#: g10/keyedit.c:1428 -#, fuzzy -msgid "set the preferred keyserver URL for the selected user IDs" -msgstr "nemono poui URI servera kov - chyba analzy URI\n" - -#: g10/keyedit.c:1430 -#, fuzzy -msgid "set a notation for the selected user IDs" -msgstr "Skutone aktualizova predvoby pre vybran id uvatea? " - -#: g10/keyedit.c:1432 -msgid "change the passphrase" -msgstr "zmeni heslo" - -#: g10/keyedit.c:1436 -msgid "change the ownertrust" -msgstr "zmeni dveryhodnos vlastnka ka" - -#: g10/keyedit.c:1438 -#, fuzzy -msgid "revoke signatures on the selected user IDs" -msgstr "Skutone revokova vetky vybran id uvatea? " - -#: g10/keyedit.c:1440 -#, fuzzy -msgid "revoke selected user IDs" -msgstr "revokova identifiktor uvatea" - -#: g10/keyedit.c:1445 -#, fuzzy -msgid "revoke key or selected subkeys" -msgstr "revokova sekundrny 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 "ukza 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 tajnho ka `%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 opercie je potrebn tajn k.\n" - -#: g10/keyedit.c:1677 -msgid "Please use the command \"toggle\" first.\n" -msgstr "Prosm, najskr pouite prkaz \"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 "Skutone podpsa vetky id uvatea? " - -#: g10/keyedit.c:1762 -msgid "Hint: Select the user IDs to sign\n" -msgstr "Npoveda: Vyberte id uvatea na podpsanie\n" - -#: g10/keyedit.c:1771 -#, fuzzy, c-format -msgid "Unknown signature type `%s'\n" -msgstr "neznma trieda podpisu" - -#: g10/keyedit.c:1794 -#, c-format -msgid "This command is not allowed while in %s mode.\n" -msgstr "Tento prkaz nie je v mdoch %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 "Muste vybra aspo jedno id uvatea.\n" - -#: g10/keyedit.c:1818 -msgid "You can't delete the last user ID!\n" -msgstr "Nemete zmaza posledn id uvatea!\n" - -#: g10/keyedit.c:1820 -#, fuzzy -msgid "Really remove all selected user IDs? (y/N) " -msgstr "Skutone odstrni vetky vybran id uvatea? " - -#: g10/keyedit.c:1821 -#, fuzzy -msgid "Really remove this user ID? (y/N) " -msgstr "Skutone odstrni toto id uvatea? " - -#: g10/keyedit.c:1871 -#, fuzzy -msgid "Really move the primary key? (y/N) " -msgstr "Skutone odstrni toto id uvatea? " - -#: g10/keyedit.c:1883 -#, fuzzy -msgid "You must select exactly one key.\n" -msgstr "Muste 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 "nemem otvori `%s': %s\n" - -#: g10/keyedit.c:1942 -#, fuzzy, c-format -msgid "Error reading backup key from `%s': %s\n" -msgstr "chyba pri vytvran sboru kov (keyring)`%s': %s\n" - -#: g10/keyedit.c:1966 -msgid "You must select at least one key.\n" -msgstr "Muste vybra aspo jeden k.\n" - -#: g10/keyedit.c:1969 -#, fuzzy -msgid "Do you really want to delete the selected keys? (y/N) " -msgstr "Skutone chcete zmaza vybran ke? " - -#: g10/keyedit.c:1970 -#, fuzzy -msgid "Do you really want to delete this key? (y/N) " -msgstr "Skutone chcete zmaza tento k? " - -#: g10/keyedit.c:2005 -#, fuzzy -msgid "Really revoke all selected user IDs? (y/N) " -msgstr "Skutone revokova vetky vybran id uvatea? " - -#: g10/keyedit.c:2006 -#, fuzzy -msgid "Really revoke this user ID? (y/N) " -msgstr "Skutone revokova toto id uvatea? " - -#: g10/keyedit.c:2024 -#, fuzzy -msgid "Do you really want to revoke the entire key? (y/N) " -msgstr "Skutone chcete revokova tento k? " - -#: g10/keyedit.c:2035 -#, fuzzy -msgid "Do you really want to revoke the selected subkeys? (y/N) " -msgstr "Skutone chcete revokova vybran ke? " - -#: g10/keyedit.c:2037 -#, fuzzy -msgid "Do you really want to revoke this subkey? (y/N) " -msgstr "Skutone 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 "Skutone aktualizova predvoby pre vybran id uvatea? " - -#: g10/keyedit.c:2137 -#, fuzzy -msgid "Really update the preferences? (y/N) " -msgstr "Skutone aktualizova predvoby? " - -#: g10/keyedit.c:2205 -#, fuzzy -msgid "Save changes? (y/N) " -msgstr "Uloi zmeny? " - -#: g10/keyedit.c:2208 -#, fuzzy -msgid "Quit without saving? (y/N) " -msgstr "Ukoni bez uloenia? " - -#: g10/keyedit.c:2218 -#, c-format -msgid "update failed: %s\n" -msgstr "aktualizcia zlyhala: %s\n" - -#: g10/keyedit.c:2225 -#, c-format -msgid "update secret failed: %s\n" -msgstr "aktualizcia tajnho ka zlyhala: %s\n" - -#: g10/keyedit.c:2232 -msgid "Key not changed so no update needed.\n" -msgstr "k nebol zmenen, take 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 "Notcie: " - -#: g10/keyedit.c:2630 -msgid "There are no preferences on a PGP 2.x-style user ID.\n" -msgstr "Uvatesk ID vo formte PGP 2.x nem iadne predvoby\n" - -#: g10/keyedit.c:2689 -#, fuzzy, c-format -msgid "This key was revoked on %s by %s key %s\n" -msgstr "Tento k me by revokovan kom %s " - -#: g10/keyedit.c:2710 -#, fuzzy, c-format -msgid "This key may be revoked by %s key %s" -msgstr "Tento k me by revokovan kom %s " - -#: g10/keyedit.c:2716 -#, fuzzy -msgid "(sensitive)" -msgstr "(citliv informcia)" - -#: 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: nemem 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 " dvera: %c/%c" - -#: g10/keyedit.c:2756 -#, fuzzy, c-format -msgid "trust: %s" -msgstr " dvera: %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 oznaen 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 "" -"Prosm nezabdajte, e zobrazovan daje o platnosti kov nemusia\n" -"by sprvne, pokia znovu nespustte 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 uvatea nebolo oznaen ako primrne. Tento prkaz\n" -"spsob, e in ID uvatea sa bude povaova primrne.\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 fotografickho ID me v niektorch\n" -" verzich PGP vies k odmietnutiu tohto ka.\n" - -#: g10/keyedit.c:3016 g10/keyedit.c:3346 -msgid "Are you sure you still want to add it? (y/N) " -msgstr "Ste si ist, e ho chcete stle 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 pridva fotografick ID k PGP2 ku.\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 neznmy podpis? (a/N/u)" - -#: g10/keyedit.c:3182 -msgid "Really delete this self-signature? (y/N)" -msgstr "Skutone zmaza tento podpis podpsan sebou samm? (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 "Zmazanch %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 spsob reprezentcie v ASCII" - -#: g10/keyedit.c:3249 -#, fuzzy, c-format -msgid "User ID \"%s\": already clean\n" -msgstr "uvatesk ID \"%s\" je u revokovan\n" - -#: g10/keyedit.c:3341 -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 fotografickho ID me v niektorch\n" -" verzich PGP vies k odmietnutiu tohoto ka.\n" - -#: g10/keyedit.c:3352 -msgid "You may not add a designated revoker to a PGP 2.x-style key.\n" -msgstr "Nemali by ste pridva fotografick ID k PGP2 ku.\n" - -#: g10/keyedit.c:3372 -msgid "Enter the user ID of the designated revoker: " -msgstr "Vlote identifiktor uvatea poverenho revokciou: " - -#: g10/keyedit.c:3397 -msgid "cannot appoint a PGP 2.x style key as a designated revoker\n" -msgstr "k vo formte PGP 2.x nemono poveri revokciou\n" - -#: g10/keyedit.c:3412 -msgid "you cannot appoint a key as its own designated revoker\n" -msgstr "k nemono poveri revokciou nm samm\n" - -#: g10/keyedit.c:3434 -#, fuzzy -msgid "this key has already been designated as a revoker\n" -msgstr "VAROVANIE: Tento k bol revokovan jeho urenm revoktorom/!\n" - -#: g10/keyedit.c:3453 -msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n" -msgstr "VAROVANIE: oznaenie ka ako revokovac u neme by zruen!\n" - -#: g10/keyedit.c:3459 -#, fuzzy -msgid "" -"Are you sure you want to appoint this key as a designated revoker? (y/N) " -msgstr "Ste si ist, e chcete oznai tento k ako revokovac? (a/N): " - -#: g10/keyedit.c:3520 -msgid "Please remove selections from the secret keys.\n" -msgstr "Prosm, odstrte vber z tajnch kov.\n" - -#: g10/keyedit.c:3526 -#, fuzzy -msgid "Please select at most one subkey.\n" -msgstr "Prosm, vyberte najviac jeden sekundrny k.\n" - -#: g10/keyedit.c:3530 -#, fuzzy -msgid "Changing expiration time for a subkey.\n" -msgstr "Menm dobu platnosti sekundrneho ka.\n" - -#: g10/keyedit.c:3533 -msgid "Changing expiration time for the primary key.\n" -msgstr "Menm dobu platnosti primrneho ka.\n" - -#: g10/keyedit.c:3579 -msgid "You can't change the expiration date of a v3 key\n" -msgstr "Nemete zmeni dobu platnosti ka verzie 3\n" - -#: g10/keyedit.c:3595 -msgid "No corresponding signature in secret ring\n" -msgstr "V sbore tajnch kov chba zodpovedajci podpis\n" - -#: g10/keyedit.c:3668 -#, fuzzy, c-format -msgid "signing subkey %s is already cross-certified\n" -msgstr "VAROVANIE: podpisovac podk %08lX nie je krovo certifikovan\n" - -#: g10/keyedit.c:3674 -#, c-format -msgid "subkey %s does not sign and so does not need to be cross-certified\n" -msgstr "" - -#: g10/keyedit.c:3836 -msgid "Please select exactly one user ID.\n" -msgstr "Prosm, vyberte prve jedno id uvatea.\n" - -#: g10/keyedit.c:3875 g10/keyedit.c:3985 g10/keyedit.c:4105 g10/keyedit.c:4246 -#, fuzzy, c-format -msgid "skipping v3 self-signature on user ID \"%s\"\n" -msgstr "preskoen v3 podpis ka nm samm u uvateskho id \"%s\"\n" - -#: g10/keyedit.c:4046 -msgid "Enter your preferred keyserver URL: " -msgstr "" - -#: g10/keyedit.c:4126 -#, fuzzy -msgid "Are you sure you want to replace it? (y/N) " -msgstr "Ste si ist, e ho chcete poui? (a/N) " - -#: g10/keyedit.c:4127 -#, fuzzy -msgid "Are you sure you want to delete it? (y/N) " -msgstr "Ste si ist, e ho chcete poui? (a/N) " - -#: g10/keyedit.c:4189 -#, fuzzy -msgid "Enter the notation: " -msgstr "Podpisov notcia: " - -#: g10/keyedit.c:4338 -#, fuzzy -msgid "Proceed? (y/N) " -msgstr "Prepsa (a/N)? " - -#: g10/keyedit.c:4402 -#, c-format -msgid "No user ID with index %d\n" -msgstr "Neexistuje identifiktor uvatea s indexom %d\n" - -#: g10/keyedit.c:4460 -#, fuzzy, c-format -msgid "No user ID with hash %s\n" -msgstr "Neexistuje identifiktor uvatea s indexom %d\n" - -#: g10/keyedit.c:4487 -#, fuzzy, c-format -msgid "No subkey with index %d\n" -msgstr "Neexistuje identifiktor uvatea s indexom %d\n" - -#: g10/keyedit.c:4622 -#, fuzzy, c-format -msgid "user ID: \"%s\"\n" -msgstr "id uvatea: \"" - -#: g10/keyedit.c:4625 g10/keyedit.c:4689 g10/keyedit.c:4732 -#, fuzzy, c-format -msgid "signed by your key %s on %s%s%s\n" -msgstr " podpsan %08lX v %s%s%s\n" - -#: g10/keyedit.c:4627 g10/keyedit.c:4691 g10/keyedit.c:4734 -msgid " (non-exportable)" -msgstr " (nexeportovaten)" - -#: g10/keyedit.c:4631 -#, c-format -msgid "This signature expired on %s.\n" -msgstr "Platnos podpisu vypr %s.\n" - -#: g10/keyedit.c:4635 -msgid "Are you sure you still want to revoke it? (y/N) " -msgstr "Ste si ist, e ho chcete stle revokova? (a/N) " - -#: g10/keyedit.c:4639 -msgid "Create a revocation certificate for this signature? (y/N) " -msgstr "Vytvori pre tento podpis revokan certifikt? (a/N)" - -#: g10/keyedit.c:4666 -#, fuzzy, c-format -msgid "You have signed these user IDs on key %s:\n" -msgstr "Podpsali ste nasledujce identifiktory uvatea:\n" - -#: g10/keyedit.c:4692 -#, fuzzy -msgid " (non-revocable)" -msgstr " (nexeportovaten)" - -#: g10/keyedit.c:4699 -#, fuzzy, c-format -msgid "revoked by your key %s on %s\n" -msgstr " revokovan %08lX v %s\n" - -#: g10/keyedit.c:4721 -msgid "You are about to revoke these signatures:\n" -msgstr "Chystte sa revokova tieto podpisy:\n" - -#: g10/keyedit.c:4741 -msgid "Really create the revocation certificates? (y/N) " -msgstr "Skutone vytvori revokan certifikty? (a/N) " - -#: g10/keyedit.c:4771 -msgid "no secret key\n" -msgstr "neexistuje tajn k\n" - -#: g10/keyedit.c:4841 -#, c-format -msgid "user ID \"%s\" is already revoked\n" -msgstr "uvatesk ID \"%s\" je u revokovan\n" - -#: g10/keyedit.c:4858 -#, c-format -msgid "WARNING: a user ID signature is dated %d seconds in the future\n" -msgstr "VAROVANIE: podpis pouivatekho ID vznikol %d sekund v budcnosti\n" - -#: g10/keyedit.c:4922 -#, fuzzy, c-format -msgid "Key %s is already revoked.\n" -msgstr "uvatesk ID \"%s\" je u revokovan\n" - -#: g10/keyedit.c:4984 -#, fuzzy, c-format -msgid "Subkey %s is already revoked.\n" -msgstr "uvatesk ID \"%s\" je u revokovan\n" - -#: g10/keyedit.c:5079 -#, fuzzy, c-format -msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n" -msgstr "" -"Zobrazujem %s fotografick ID s vekosou %ld pre k 0x%08lX (uid %d)\n" - -#: g10/keygen.c:262 -#, fuzzy, c-format -msgid "preference `%s' duplicated\n" -msgstr "duplicita predvoby %c%lu\n" - -#: g10/keygen.c:269 -#, fuzzy -msgid "too many cipher preferences\n" -msgstr "prli vea `%c' predvolieb\n" - -#: g10/keygen.c:271 -#, fuzzy -msgid "too many digest preferences\n" -msgstr "prli vea `%c' predvolieb\n" - -#: g10/keygen.c:273 -#, fuzzy -msgid "too many compression preferences\n" -msgstr "prli vea `%c' predvolieb\n" - -#: g10/keygen.c:398 -#, fuzzy, c-format -msgid "invalid item `%s' in preference string\n" -msgstr "neplatn znak v reazci s predvobami\n" - -#: g10/keygen.c:872 -msgid "writing direct signature\n" -msgstr "zapisujem podpis ka nm samm (direct signature)\n" - -#: g10/keygen.c:911 -msgid "writing self signature\n" -msgstr "zapisujem podpis ka sebou samm\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 dka ka; pouijem %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 "dka ka zaokrhlen 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 dta" - -#: 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 "Prosm, vyberte druh ka, 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 "Pr kov DSA bude ma dku 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 vekos ka 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 "Poadovan dka ka je %u bitov.\n" - -#: g10/keygen.c:1556 g10/keygen.c:1561 -#, c-format -msgid "rounded up to %u bits\n" -msgstr "zaokrhlen 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 "" -"Prosm urte, ako dlho by mal k platit.\n" -" 0 = doba platnosti ka nie je obmedzen\n" -" <n> = doba platnosti ka skon za n dn\n" -" <n>w = doba platnosti ka skon za n tdov\n" -" <n>m = doba platnosti ka skon za n mesiacov\n" -" <n>y = doba platnosti ka 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 "" -"Prosm urte, 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 tdov\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 systm nevie zobrazi dtumy po roku 2038.\n" -"V kadom prpade bud dtumy korektne spracovvan do roku 2106.\n" - -#: g10/keygen.c:1692 -#, fuzzy -msgid "Is this correct? (y/N) " -msgstr "Je to sprvne (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 mon rozpozna V k, muste pozna identifiktor uvatea;\n" -"program ho zlo z Vho mena a priezviska, komentra 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 neme zana 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 "Komentr: " - -#: g10/keygen.c:1768 -msgid "Invalid character in comment\n" -msgstr "Neplatn znak v komentri\n" - -#: g10/keygen.c:1791 -#, c-format -msgid "You are using the `%s' character set.\n" -msgstr "Pouvate znakov sadu `%s'.\n" - -#: g10/keygen.c:1797 -#, c-format -msgid "" -"You selected this USER-ID:\n" -" \"%s\"\n" -"\n" -msgstr "" -"Zvolili ste tento identifiktor uvatea:\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 poa meno alebo komentr nepte, prosm, 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)omentr, (E)-mail alebo (U)koni? " - -#: g10/keygen.c:1829 -msgid "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? " -msgstr "Zmeni (M)eno, (K)omentr, (E)-mail alebo (P)okraova/(U)koni? " - -#: g10/keygen.c:1848 -msgid "Please correct the error first\n" -msgstr "Najskr, prosm, opravte chybu\n" - -#: g10/keygen.c:1888 -msgid "" -"You need a Passphrase to protect your secret key.\n" -"\n" -msgstr "" -"Na ochranu Vho tajnho ka muste 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 npad!\n" -"Dobre, budem pokraova bez hesla. Kedykovek mete heslo zmeni pouitm\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 vea nhodnch bajtov. Poas vytvrania mete\n" -"vykonva in prcu na potai (psa na klvesnici, pohybova myou,\n" -"pouva disky); vaka tomu m genertor lepiu ancu zska dostatok " -"entropie.\n" - -#: g10/keygen.c:2708 -msgid "Key generation canceled.\n" -msgstr "Vytvranie ka bolo zruen.\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 "nenjden zapisovaten sbor verejnch kov (pubring): %s\n" - -#: g10/keygen.c:3047 -#, c-format -msgid "no writable secret keyring found: %s\n" -msgstr "nenjden zapisovaten sbor tajnch kov (secring): %s\n" - -#: g10/keygen.c:3065 -#, c-format -msgid "error writing public keyring `%s': %s\n" -msgstr "chyba pri zpise do sboru verejnch kov `%s': %s\n" - -#: g10/keygen.c:3072 -#, c-format -msgid "error writing secret keyring `%s': %s\n" -msgstr "chyba pri zpise do sboru tajnch kov `%s': %s\n" - -#: g10/keygen.c:3095 -msgid "public and secret key created and signed.\n" -msgstr "verejn a tajn k boli vytvoren a podpsan.\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 neme by pouit na ifrovanie. Pre vytvorenie\n" -"sekundrneho ka na tento el mete poui prkaz \"--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 ka 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 budcnosti (dolo k zmene asu alebo\n" -"je problm so systmovm 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 budcnosti (dolo k zmene asu alebo\n" -"je problm so systmovm asom)\n" - -#: g10/keygen.c:3181 g10/keygen.c:3311 -msgid "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n" -msgstr "POZNMKA: vytvorenie podka pre ke v3 nie je v slade s OpenPGP\n" - -#: g10/keygen.c:3220 g10/keygen.c:3344 -#, fuzzy -msgid "Really create? (y/N) " -msgstr "Skutone vytvori? " - -#: g10/keygen.c:3509 -#, fuzzy, c-format -msgid "storing key onto card failed: %s\n" -msgstr "zmazanie bloku ka sa nepodarilo: %s\n" - -#: g10/keygen.c:3556 -#, fuzzy, c-format -msgid "can't create backup file `%s': %s\n" -msgstr "nemem vytvori `%s': %s\n" - -#: g10/keygen.c:3582 -#, fuzzy, c-format -msgid "NOTE: backup of card key saved to `%s'\n" -msgstr "POZNMKA: platnos tajnho ka %08lX skonila %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 notcia: " - -#: g10/keylist.c:361 -msgid "Signature notation: " -msgstr "Podpisov notcia: " - -#: g10/keylist.c:471 -msgid "Keyring" -msgstr "sbor kov (keyring)" - -#: g10/keylist.c:1505 -msgid "Primary key fingerprint:" -msgstr "Primrny fingerprint ka:" - -#: g10/keylist.c:1507 -msgid " Subkey fingerprint:" -msgstr " Fingerprint podka:" - -#. 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 " Primrny fingerprint ka:" - -#: g10/keylist.c:1516 -msgid " Subkey fingerprint:" -msgstr " Fingerprint podka:" - -#: g10/keylist.c:1520 g10/keylist.c:1524 -#, fuzzy -msgid " Key fingerprint =" -msgstr " Fingerprint ka =" - -#: 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 "kdovanie do ASCII formtu zlyhalo: %s\n" - -#: g10/keyring.c:1252 -msgid "WARNING: 2 files with confidential information exists.\n" -msgstr "VAROVANIE: Existuj dva sbory s tajnmi informciami.\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 "Prosm, opravte tento mon bezpenostn problm\n" - -#: g10/keyring.c:1376 -#, fuzzy, c-format -msgid "caching keyring `%s'\n" -msgstr "kontrolujem sbor kov (keyring) `%s'\n" - -#: g10/keyring.c:1422 -#, fuzzy, c-format -msgid "%lu keys cached so far (%lu signatures)\n" -msgstr "%lu kov skontrolovanch (%lu podpisov)\n" - -#: g10/keyring.c:1434 -#, fuzzy, c-format -msgid "%lu keys cached (%lu signatures)\n" -msgstr "%lu kov skontrolovanch (%lu podpisov)\n" - -#: g10/keyring.c:1505 -#, c-format -msgid "%s: keyring created\n" -msgstr "%s: sbor kov (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' ete nie je aktvne\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:1421 -#, 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 njden: %s\n" - -#: g10/keyserver.c:908 -#, fuzzy -msgid "key not found on keyserver\n" -msgstr "k `%s' nebol njden: %s\n" - -#: g10/keyserver.c:1145 -#, fuzzy, c-format -msgid "requesting key %s from %s server %s\n" -msgstr "poadujem k %08lX z %s\n" - -#: g10/keyserver.c:1149 -#, fuzzy, c-format -msgid "requesting key %s from %s\n" -msgstr "poadujem k %08lX z %s\n" - -#: g10/keyserver.c:1173 -#, fuzzy, c-format -msgid "searching for names from %s server %s\n" -msgstr "vyhadvam \"%s\" na HKP serveri %s\n" - -#: g10/keyserver.c:1176 -#, fuzzy, c-format -msgid "searching for names from %s\n" -msgstr "vyhadvam \"%s\" na HKP serveri %s\n" - -#: g10/keyserver.c:1324 -#, fuzzy, c-format -msgid "sending key %s to %s server %s\n" -msgstr "vyhadvam \"%s\" na HKP serveri %s\n" - -#: g10/keyserver.c:1328 -#, fuzzy, c-format -msgid "sending key %s to %s\n" -msgstr "" -"\"\n" -"podpsan Vam kom %08lX v %s\n" - -#: g10/keyserver.c:1371 -#, fuzzy, c-format -msgid "searching for \"%s\" from %s server %s\n" -msgstr "vyhadvam \"%s\" na HKP serveri %s\n" - -#: g10/keyserver.c:1374 -#, fuzzy, c-format -msgid "searching for \"%s\" from %s\n" -msgstr "vyhadvam \"%s\" na HKP serveri %s\n" - -#: g10/keyserver.c:1381 g10/keyserver.c:1477 -#, fuzzy -msgid "no keyserver action!\n" -msgstr "neplatn parameter pre export\n" - -#: g10/keyserver.c:1429 -#, c-format -msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n" -msgstr "" - -#: g10/keyserver.c:1438 -msgid "keyserver did not send VERSION\n" -msgstr "" - -#: g10/keyserver.c:1500 g10/keyserver.c:2028 -msgid "no keyserver known (use option --keyserver)\n" -msgstr "" - -#: g10/keyserver.c:1506 -msgid "external keyserver calls are not supported in this build\n" -msgstr "" - -#: g10/keyserver.c:1518 -#, c-format -msgid "no handler for keyserver scheme `%s'\n" -msgstr "" - -#: g10/keyserver.c:1523 -#, c-format -msgid "action `%s' not supported with keyserver scheme `%s'\n" -msgstr "" - -#: g10/keyserver.c:1531 -#, c-format -msgid "%s does not support handler version %d\n" -msgstr "" - -#: g10/keyserver.c:1538 -#, fuzzy -msgid "keyserver timed out\n" -msgstr "chyba servera kov" - -#: g10/keyserver.c:1543 -#, fuzzy -msgid "keyserver internal error\n" -msgstr "chyba servera kov" - -#: g10/keyserver.c:1552 -#, fuzzy, c-format -msgid "keyserver communications error: %s\n" -msgstr "nepodarilo sa prija k zo servera: %s\n" - -#: g10/keyserver.c:1577 g10/keyserver.c:1611 -#, c-format -msgid "\"%s\" not a key ID: skipping\n" -msgstr "" - -#: g10/keyserver.c:1870 -#, fuzzy, c-format -msgid "WARNING: unable to refresh key %s via %s: %s\n" -msgstr "VAROVANIE: nemem vymaza doasn sbor (%s) `%s': %s\n" - -#: g10/keyserver.c:1892 -#, fuzzy, c-format -msgid "refreshing 1 key from %s\n" -msgstr "poadujem k %08lX z %s\n" - -#: g10/keyserver.c:1894 -#, fuzzy, c-format -msgid "refreshing %d keys from %s\n" -msgstr "poadujem k %08lX z %s\n" - -#: g10/keyserver.c:1950 -#, fuzzy, c-format -msgid "WARNING: unable to fetch URI %s: %s\n" -msgstr "VAROVANIE: nemem vymaza doasn sbor (%s) `%s': %s\n" - -#: g10/keyserver.c:1956 -#, fuzzy, c-format -msgid "WARNING: unable to parse URI %s\n" -msgstr "VAROVANIE: nemem vymaza doasn sbor (%s) `%s': %s\n" - -#: g10/mainproc.c:240 -#, c-format -msgid "weird size for an encrypted session key (%d)\n" -msgstr "zvltna vekos ifrovacieho ka pre sedenie (%d)\n" - -#: g10/mainproc.c:291 -#, c-format -msgid "%s encrypted session key\n" -msgstr "%s k ifrovanho sedenia\n" - -#: g10/mainproc.c:301 -#, fuzzy, c-format -msgid "passphrase generated with unknown digest algorithm %d\n" -msgstr "zaifrovan neznmym 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 "dta zaifrovan verejnm kom: sprvny DEK\n" - -#: g10/mainproc.c:472 -#, fuzzy, c-format -msgid "encrypted with %u-bit %s key, ID %s, created %s\n" -msgstr "zaifrovan %u-bitovm %s kom, ID %08lX, vytvorenm %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 "zaifrovan %s kom, ID %08lX\n" - -#: g10/mainproc.c:494 -#, c-format -msgid "public key decryption failed: %s\n" -msgstr "deifrovanie verejnm kom zlyhalo: %s\n" - -#: g10/mainproc.c:508 -#, c-format -msgid "encrypted with %lu passphrases\n" -msgstr "zaifrovan s %lu heslami\n" - -#: g10/mainproc.c:510 -msgid "encrypted with 1 passphrase\n" -msgstr "zaifrovan jednm heslom\n" - -#: g10/mainproc.c:541 g10/mainproc.c:563 -#, c-format -msgid "assuming %s encrypted data\n" -msgstr "predpokladm %s ifrovanch dt\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 poksime nahradi " -"algoritmom %s\n" - -#: g10/mainproc.c:581 -msgid "decryption okay\n" -msgstr "deifrovanie o.k.\n" - -#: g10/mainproc.c:585 -msgid "WARNING: message was not integrity protected\n" -msgstr "VAROVANIE: sprva nem ochranu integrity\n" - -#: g10/mainproc.c:598 -msgid "WARNING: encrypted message has been manipulated!\n" -msgstr "VAROVANIE: so zaifrovanou sprvou bolo manipulovan!\n" - -#: g10/mainproc.c:604 -#, c-format -msgid "decryption failed: %s\n" -msgstr "deifrovanie zlyhalo: %s\n" - -#: g10/mainproc.c:623 -msgid "NOTE: sender requested \"for-your-eyes-only\"\n" -msgstr "POZNMKA: odosielate poadoval (\"for-your-eyes-only\")\n" - -#: g10/mainproc.c:625 -#, c-format -msgid "original file name='%.*s'\n" -msgstr "pvodn meno sboru='%.*s'\n" - -#: g10/mainproc.c:817 -msgid "standalone revocation - use \"gpg --import\" to apply\n" -msgstr "" -"samostatn revokan certifikt - pouite \"gpg --import\", ak ho chcete " -"vyui\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 "verifikcia podpisu potlaen\n" - -#: g10/mainproc.c:1508 -#, fuzzy -msgid "can't handle this ambiguous signature data\n" -msgstr "neviem pracova s tmito nsobnmi podpismi\n" - -#: g10/mainproc.c:1519 -#, fuzzy, c-format -msgid "Signature made %s\n" -msgstr "Platnos podpisu vyprala %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 ka ID %08lX\n" - -#: g10/mainproc.c:1544 -msgid "Key available at: " -msgstr "K k dispozcii 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 vypranou platnosou 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 vyprala %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 "binrne" - -#: g10/mainproc.c:1873 -msgid "textmode" -msgstr "textov md" - -#: g10/mainproc.c:1873 g10/trustdb.c:531 -msgid "unknown" -msgstr "neznme" - -#: g10/mainproc.c:1893 -#, c-format -msgid "Can't check signature: %s\n" -msgstr "Nemem 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: Njden viacnsobne 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 starho typu (PGP 2.x)\n" - -#: g10/mainproc.c:2080 -msgid "invalid root packet detected in proc_tree()\n" -msgstr "njden neplatn koreov paket v proc_tree()\n" - -#: g10/misc.c:122 -#, c-format -msgid "can't disable core dumps: %s\n" -msgstr "nemem vypn vytvranie core sborov: %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 "nemono otvori sbor: %s\n" - -#: g10/misc.c:207 -#, fuzzy, c-format -msgid "fstat(%d) failed in %s: %s\n" -msgstr "databza dvery: procedra read() (n=%d) zlyhala: %s\n" - -#: g10/misc.c:316 -#, fuzzy, c-format -msgid "WARNING: using experimental public key algorithm %s\n" -msgstr "nemem pracova s algoritmom verejnho ka %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 "" -"vyiadan hashovac algoritmus %s (%d) nevyhovuje predvobm prjemcu\n" - -#: g10/misc.c:447 -msgid "the IDEA cipher plugin is not present\n" -msgstr "IDEA modul pre GnuPG nenjden\n" - -#: g10/misc.c:448 g10/sig-check.c:103 -#, fuzzy, c-format -msgid "please see %s for more information\n" -msgstr " i = prosm o viac informci\n" - -#: g10/misc.c:681 -#, c-format -msgid "%s:%d: deprecated option \"%s\"\n" -msgstr "%s:%d: pouitie parametra \"%s\" sa neodpora\n" - -#: g10/misc.c:685 -#, c-format -msgid "WARNING: \"%s\" is a deprecated option\n" -msgstr "VAROVN: pouitie parametra \"%s\" sa neodpora\n" - -#: g10/misc.c:687 -#, c-format -msgid "please use \"%s%s\" instead\n" -msgstr "pouite 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 "VAROVN: pouitie parametra \"%s\" sa neodpora\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 "tto sprva nemus pouiten s %s\n" - -#: g10/misc.c:1017 -#, fuzzy, c-format -msgid "ambiguous option `%s'\n" -msgstr "tam monosti z `%s'\n" - -#: g10/misc.c:1042 -#, fuzzy, c-format -msgid "unknown option `%s'\n" -msgstr "neznmy implicitn adrest `%s'\n" - -#: g10/openfile.c:86 -#, c-format -msgid "File `%s' exists. " -msgstr "Sbor `%s' existuje. " - -#: g10/openfile.c:90 -#, fuzzy -msgid "Overwrite? (y/N) " -msgstr "Prepsa (a/N)? " - -#: g10/openfile.c:123 -#, c-format -msgid "%s: unknown suffix\n" -msgstr "%s: neznma prpona\n" - -#: g10/openfile.c:145 -msgid "Enter new filename" -msgstr "Vlote nov nzov sboru" - -#: g10/openfile.c:190 -msgid "writing to stdout\n" -msgstr "zapisujem na tandardn vstup (stdout)\n" - -#: g10/openfile.c:305 -#, c-format -msgid "assuming signed data in `%s'\n" -msgstr "predpokladm podpsan dta v `%s'\n" - -#: g10/openfile.c:384 -#, c-format -msgid "new configuration file `%s' created\n" -msgstr "vytvoren nov konfiguran sbor `%s'\n" - -#: g10/openfile.c:386 -#, c-format -msgid "WARNING: options in `%s' are not yet active during this run\n" -msgstr "VAROVANIE: nastavenie v `%s' ete nie je aktvne\n" - -#: g10/openfile.c:418 -#, fuzzy, c-format -msgid "directory `%s' created\n" -msgstr "%s: adresr vytvoren\n" - -#: g10/parse-packet.c:138 -#, c-format -msgid "can't handle public key algorithm %d\n" -msgstr "nemem pracova s algoritmom verejnho ka %d\n" - -#: g10/parse-packet.c:708 -msgid "WARNING: potentially insecure symmetrically encrypted session key\n" -msgstr "" -"VAROVANIE: pravdepodobne nebezpen symetricky ifrovan k sedenia\n" - -#: g10/parse-packet.c:1157 -#, 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 formt 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 "nemem 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 "problm s agentom - pouvanie agenta vypnut\n" - -#: g10/passphrase.c:532 g10/passphrase.c:914 -#, fuzzy, c-format -msgid " (main key ID %s)" -msgstr " (hlavn ID ka %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 uvatea:\n" -"\"%.*s\"\n" -"k s dkou %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 "Vloi heslo\n" - -#: g10/passphrase.c:649 -msgid "cancelled by user\n" -msgstr "zruen uvateom\n" - -#: g10/passphrase.c:805 g10/passphrase.c:968 -#, fuzzy -msgid "can't query passphrase in batch mode\n" -msgstr "v dvkovom reime sa nemem pta na heslo\n" - -#: g10/passphrase.c:812 g10/passphrase.c:973 -msgid "Enter passphrase: " -msgstr "Vlote 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" -"Muste pozna heslo, aby ste odomkli tajn k pre\n" -"uvatea: \"" - -#: g10/passphrase.c:901 -#, fuzzy, c-format -msgid "%u-bit %s key, ID %s, created %s" -msgstr "dka %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:977 -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 obrzok, ktor bude pouit ako fotografick ID. Tento obrzok\n" -"mus by vo formte JPEG. Pamtajte, e bude uloen vo Vaom verejnom " -"ki.\n" -"Ak pouijete vemi vek obrzok, k bude tie vek! Odporan vekos\n" -"obrzka je okolo 240x288.\n" - -#: g10/photoid.c:95 -msgid "Enter JPEG filename for photo ID: " -msgstr "Meno sbor s fotografiou vo formte JPEG: " - -#: g10/photoid.c:116 -#, fuzzy, c-format -msgid "unable to open JPEG file `%s': %s\n" -msgstr "nemono otvori sbor: %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 poui? (a/N) " - -#: g10/photoid.c:146 -#, fuzzy, c-format -msgid "`%s' is not a JPEG file\n" -msgstr "\"%s\" nie je sbor JPEG\n" - -#: g10/photoid.c:165 -msgid "Is this photo correct (y/N/q)? " -msgstr "Je tto fotografia sprvna (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 "nemono nastavi exec-path na %s\n" - -#: g10/pkclist.c:62 g10/revoke.c:623 -msgid "No reason specified" -msgstr "Dvod 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 nepouva" - -#: g10/pkclist.c:70 g10/revoke.c:627 -msgid "User ID is no longer valid" -msgstr "Identifiktor uvatea u neplat" - -#: g10/pkclist.c:74 -msgid "reason for revocation: " -msgstr "dvod na revokciu: " - -#: g10/pkclist.c:91 -msgid "revocation comment: " -msgstr "revokan poznmka: " - -#: 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 dvery 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 majiteovi\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 = Nedverujem\n" - -#: g10/pkclist.c:279 -#, fuzzy, c-format -msgid " %d = I trust ultimately\n" -msgstr " %d = Dverujem absoltne\n" - -#: g10/pkclist.c:285 -#, fuzzy -msgid " m = back to the main menu\n" -msgstr " m = sp do hlavnho menu\n" - -#: g10/pkclist.c:288 -#, fuzzy -msgid " s = skip this key\n" -msgstr " s = preskoi tento k\n" - -#: g10/pkclist.c:289 -#, fuzzy -msgid " q = quit\n" -msgstr " u = ukoni\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 "Vae rozhodnutie? " - -#: g10/pkclist.c:320 -#, fuzzy -msgid "Do you really want to set this key to ultimate trust? (y/N) " -msgstr "Skutone chcete nastavi pre tento k absoltnu dveru? " - -#: g10/pkclist.c:334 -msgid "Certificates leading to an ultimately trusted key:\n" -msgstr "Certifikty vedce k finlnemu dveryhodnmu ku:\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 nenaznauje tomu, e tento podpis patr vlastnkovi ka.\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 nenaznauje tomu, e tento podpis patr vlastnkovi ka.\n" - -#: g10/pkclist.c:430 -#, fuzzy -msgid "This key probably belongs to the named user\n" -msgstr "Tento k pravdepodobne patr jeho majiteovi\n" - -#: g10/pkclist.c:435 -msgid "This key belongs to us\n" -msgstr "Tento k patr nm (mme zodpovedajci 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 vydva za jeho\n" -"vlastnka. Pokia *skutone* viete, o robte, mete na otzku\n" -"odpoveda no\n" -"\n" - -#: g10/pkclist.c:468 -#, fuzzy -msgid "Use this key anyway? (y/N) " -msgstr "Poui napriek tomu tento k? " - -#: g10/pkclist.c:502 -msgid "WARNING: Using untrusted key!\n" -msgstr "VAROVANIE: Je pouit nedveryhodn k!\n" - -#: g10/pkclist.c:509 -msgid "WARNING: this key might be revoked (revocation key not present)\n" -msgstr "VAROVANIE: k me by revokovan (revokan 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 urenm revoktorom/!\n" - -#: g10/pkclist.c:521 -msgid "WARNING: This key has been revoked by its owner!\n" -msgstr "VAROVANIE: Tento k bol revokovan jeho vlastnkom!\n" - -#: g10/pkclist.c:522 -#, fuzzy -msgid " This could mean that the signature is forged.\n" -msgstr " To me znamena, e podpis je falon.\n" - -#: g10/pkclist.c:528 -msgid "WARNING: This subkey has been revoked by its owner!\n" -msgstr "VAROVANIE: Tento podk bol revokovan jeho vlastnkom!\n" - -#: g10/pkclist.c:533 -msgid "Note: This key has been disabled.\n" -msgstr "Poznmka: Tento k bol oznaen 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 "Poznmka: Skonila platnos tohto ka!\n" - -#: g10/pkclist.c:602 -msgid "WARNING: This key is not certified with a trusted signature!\n" -msgstr "VAROVANIE: Tento k nie certifikovan dveryhodnm podpisom!\n" - -#: g10/pkclist.c:604 -msgid "" -" There is no indication that the signature belongs to the owner.\n" -msgstr "" -" Ni nenaznauje tomu, e tento podpis patr vlastnkovi ka.\n" - -#: g10/pkclist.c:612 -msgid "WARNING: We do NOT trust this key!\n" -msgstr "VAROVANIE: NEdverujeme tomuto ku!\n" - -#: g10/pkclist.c:613 -msgid " The signature is probably a FORGERY.\n" -msgstr " Tento podpis je pravdepodobne FALON.\n" - -#: g10/pkclist.c:621 -msgid "" -"WARNING: This key is not certified with sufficiently trusted signatures!\n" -msgstr "" -"VAROVANIE: Tento k nie je certifikovan dostatone dveryhodnmi " -"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 vlastnkovi.\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: preskoen: %s\n" - -#: g10/pkclist.c:834 g10/pkclist.c:1114 -#, c-format -msgid "%s: skipped: public key already present\n" -msgstr "%s: preskoen: verejn k je u obsiahnut v databze\n" - -#: g10/pkclist.c:885 -msgid "You did not specify a user ID. (you may use \"-r\")\n" -msgstr "" -"Nepecifikovali ste identifiktor uvatea (user ID). Mete poui \"-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" -"Napte identifiktor uvatea (user ID). Ukonite przdnym riadkom: " - -#: g10/pkclist.c:960 -msgid "No such user ID.\n" -msgstr "Takto identifiktor uvatea neexistuje.\n" - -#: g10/pkclist.c:969 g10/pkclist.c:1043 -msgid "skipped: public key already set as default recipient\n" -msgstr "preskoen: verejn k je u nastaven poda implicitnho adresta\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 "preskoen: verejn k je u nastaven\n" - -#: g10/pkclist.c:1034 -#, fuzzy, c-format -msgid "unknown default recipient \"%s\"\n" -msgstr "neznmy implicitn adrest `%s'\n" - -#: g10/pkclist.c:1092 -#, c-format -msgid "%s: skipped: public key is disabled\n" -msgstr "%s: preskoen: 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 "dta neboli uloen; na ich uloenie pouite prepna \"--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 vytvran `%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 "Prosm, vlote nzov dtovho sboru: " - -#: g10/plaintext.c:490 -msgid "reading stdin ...\n" -msgstr "tam tandardn vstup (stdin) ...\n" - -#: g10/plaintext.c:524 -msgid "no signed data\n" -msgstr "chbaj podpsan dta\n" - -#: g10/plaintext.c:538 -#, c-format -msgid "can't open signed data `%s'\n" -msgstr "nemem otvori podpsan dta '%s'\n" - -#: g10/pubkey-enc.c:104 -#, fuzzy, c-format -msgid "anonymous recipient; trying secret key %s ...\n" -msgstr "anonymn adrest; skam tajn k %08lX ...\n" - -#: g10/pubkey-enc.c:135 -msgid "okay, we are the anonymous recipient.\n" -msgstr "o.k., my sme anonymn adrest.\n" - -#: g10/pubkey-enc.c:223 -msgid "old encoding of the DEK is not supported\n" -msgstr "star kdovanie DEK nie je podporovn\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 zakzan\n" - -#: g10/pubkey-enc.c:282 -#, fuzzy, c-format -msgid "WARNING: cipher algorithm %s not found in recipient preferences\n" -msgstr "POZNMKA: v predvobch nenjden ifrovac algoritmus %d\n" - -#: g10/pubkey-enc.c:302 -#, fuzzy, c-format -msgid "NOTE: secret key %s expired at %s\n" -msgstr "POZNMKA: platnos tajnho ka %08lX skonila %s\n" - -#: g10/pubkey-enc.c:308 -msgid "NOTE: key has been revoked" -msgstr "POZNMKA: 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 identifiktor uvatea\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 revokan k)\n" - -#: g10/revoke.c:316 -#, fuzzy -msgid "Create a designated revocation certificate for this key? (y/N) " -msgstr "Vytvori pre tento podpis revokan certifikt? " - -#: g10/revoke.c:329 g10/revoke.c:554 -msgid "ASCII armored output forced.\n" -msgstr "Vynten ASCII textov vstup.\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 "Revokan certifikt bol vytvoren.\n" - -#: g10/revoke.c:413 -#, fuzzy, c-format -msgid "no revocation keys found for \"%s\"\n" -msgstr "iadne revokan ke pre `%s' nenjden\n" - -#: g10/revoke.c:471 -#, fuzzy, c-format -msgid "secret key \"%s\" not found: %s\n" -msgstr "tajn k `%s' nebol njden: %s\n" - -#: g10/revoke.c:500 -#, c-format -msgid "no corresponding public key: %s\n" -msgstr "iadny zodpovedajci verejn k: %s\n" - -#: g10/revoke.c:511 -msgid "public key does not match secret key!\n" -msgstr "verejn k neshlas s tajnm!\n" - -#: g10/revoke.c:518 -#, fuzzy -msgid "Create a revocation certificate for this key? (y/N) " -msgstr "Vytvori pre tento podpis revokan certifikt? " - -#: g10/revoke.c:535 -msgid "unknown protection algorithm\n" -msgstr "neznmy ochrann algoritmus\n" - -#: g10/revoke.c:543 -msgid "NOTE: This key is not protected!\n" -msgstr "POZNMKA: Tento k nie je chrnen!\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 revokan certifikt.\n" -"\n" -"Presute ho na mdium, ktor mete schova; ak Mallory zska k\n" -"tomuto certifiktu prstup, me znefunkni V k. Jednoduch je\n" -"vytlai certifikt a schova ho, pre prpad e by mdium bolo neitaten.\n" -"Ale hroz nebezpeenstvo: Tlaov systm Vho potaa me uklada dta a\n" -"sprstupni ich inm!\n" - -#: g10/revoke.c:635 -msgid "Please select the reason for the revocation:\n" -msgstr "Prosm vberte dvod na revokciu:\n" - -#: g10/revoke.c:645 -msgid "Cancel" -msgstr "Zrui" - -#: 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, napte popis; ukonite przdnym riadkom:\n" - -#: g10/revoke.c:716 -#, c-format -msgid "Reason for revocation: %s\n" -msgstr "Dvod na revokciu: %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 ka 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 podporovn\n" - -#: g10/seckey-cert.c:72 -#, fuzzy, c-format -msgid "protection digest %d is not supported\n" -msgstr "ochrann algoritmus %d%s nie je podporovn\n" - -#: g10/seckey-cert.c:266 -msgid "Invalid passphrase; please try again" -msgstr "Neplatn heslo; prosm, skste 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 - zmete, prosm, 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 set na ochranu tajnho ka\n" - -#: g10/seskey.c:54 -msgid "weak key created - retrying\n" -msgstr "vytvoren slab k - skam znovu\n" - -#: g10/seskey.c:59 -#, c-format -msgid "cannot avoid weak key for symmetric cipher; tried %d times!\n" -msgstr "" -"nemem sa vyvarova slabho ka pre symetrick ifru; operciu som sksil " -"%d krt!\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 sprve\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 krovo 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 krov certifikciu\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 budcnosti (dolo k zmene asu alebo\n" -"je problm so systmovm 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 budcnosti (dolo k zmene asu alebo\n" -"je problm so systmovm asom)\n" - -#: g10/sig-check.c:205 -#, fuzzy, c-format -msgid "NOTE: signature key %s expired %s\n" -msgstr "POZNMKA: podpisovmu ku %08lX skonila 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 "" -"predpokladm neplatn podpis kom %08lX, pretoe je nastaven neznmy " -"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 revokciu ka\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 podkov\n" - -#: g10/sign.c:85 -msgid "can't put notation data into v3 (PGP 2.x style) signatures\n" -msgstr "nemem prida dodaton daje do v3 (PGP 2.x tl) podpisov\n" - -#: g10/sign.c:93 -msgid "can't put notation data into v3 (PGP 2.x style) key signatures\n" -msgstr "nemem prida dodaton daje do v3 (PGP 2.x tl) podpisov kov\n" - -#: g10/sign.c:107 -#, c-format -msgid "WARNING: unable to %%-expand notation (too large). Using unexpanded.\n" -msgstr "" -"VAROVANIE: nemono %%-expandova notcie (prli dlh). Pouit " -"neexpandovan.\n" - -#: g10/sign.c:124 -msgid "can't put a policy URL into v3 (PGP 2.x style) signatures\n" -msgstr "nemem prida politiku URL do v3 (PGP 2.x tl) podpisov\n" - -#: g10/sign.c:132 -msgid "can't put a policy URL into v3 key (PGP 2.x style) signatures\n" -msgstr "nemem prida politiku URL do v3 (PGP 2.x tl) podpisov kov\n" - -#: g10/sign.c:145 -#, fuzzy, c-format -msgid "" -"WARNING: unable to %%-expand policy URL (too large). Using unexpanded.\n" -msgstr "" -"VAROVANIE: nemem %%-expandova URL politiky (prli dlh). Pouit " -"neexpandovan.\n" - -#: g10/sign.c:173 -#, fuzzy, c-format -msgid "" -"WARNING: unable to %%-expand preferred keyserver URL (too large). Using " -"unexpanded.\n" -msgstr "" -"VAROVANIE: nemem %%-expandova URL politiky (prli dlh). Pouit " -"neexpandovan.\n" - -#: g10/sign.c:347 -#, c-format -msgid "checking created signature failed: %s\n" -msgstr "kontrola vytvorenho 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 mde --pgp2 mete vytvori len oddelen podpis ka vo formte PGP-2.x\n" - -#: g10/sign.c:862 -#, fuzzy, c-format -msgid "" -"WARNING: forcing digest algorithm %s (%d) violates recipient preferences\n" -msgstr "" -"vyiadan hashovac algoritmus %s (%d) nevyhovuje predvobm prjemcu\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 mde --pgp2 mete vytvra itaten podpisy len s kmi formtu PGP-2." -"x\n" - -#: g10/sign.c:1278 -#, c-format -msgid "%s encryption will be used\n" -msgstr "bude pouit ifrovanie %s\n" - -#: g10/skclist.c:127 g10/skclist.c:191 -msgid "key is not flagged as insecure - can't use it with the faked RNG!\n" -msgstr "" -"k nie je oznaen ako nedostatone bezpen - nemem ho poui s " -"falonm RNG!\n" - -#: g10/skclist.c:158 -#, fuzzy, c-format -msgid "skipped \"%s\": duplicated\n" -msgstr "preskoen `%s': duplikovan\n" - -#: g10/skclist.c:166 g10/skclist.c:176 g10/skclist.c:185 -#, fuzzy, c-format -msgid "skipped \"%s\": %s\n" -msgstr "preskoen `%s': %s\n" - -#: g10/skclist.c:171 -msgid "skipped: secret key already present\n" -msgstr "preskoen: tajn k je u v databze\n" - -#: g10/skclist.c:186 -#, fuzzy -msgid "this is a PGP generated Elgamal key which is not secure for signatures!" -msgstr "" -"preskoen `%s': toto je vygenerovan PGP k poda algoritmu ElGamal,\n" -"podpisy vytvoren tmto kom nie s bezpen!\n" - -#: g10/tdbdump.c:60 g10/trustdb.c:366 -#, c-format -msgid "trust record %lu, type %d: write failed: %s\n" -msgstr "zznam dvery %lu, typ %d: zpis 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 pridelench hodnt dveryhodnosti, vytvoren %s\n" -"# (Pouite \"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 prli dlh\n" - -#: g10/tdbdump.c:168 -msgid "colon missing" -msgstr "" - -#: g10/tdbdump.c:174 -#, fuzzy -msgid "invalid fingerprint" -msgstr "chyba: neplatn odtlaok\n" - -#: g10/tdbdump.c:179 -#, fuzzy -msgid "ownertrust value missing" -msgstr "" -"importova hodnoty dveryhodnosti\n" -" vlastnka ka" - -#: g10/tdbdump.c:215 -#, fuzzy, c-format -msgid "error finding trust record in `%s': %s\n" -msgstr "chyba pri hadan zznamu dvery: %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 "databza dvery: synchronizcia zlyhala %s\n" - -#: g10/tdbio.c:129 g10/tdbio.c:1445 -#, c-format -msgid "trustdb rec %lu: lseek failed: %s\n" -msgstr "zznam v databze dvery %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 "zznam v databze dvery %lu: zpis sa nepodaril (n=%d): %s\n" - -#: g10/tdbio.c:245 -msgid "trustdb transaction too large\n" -msgstr "transakcia s databzou dvery je prli dlh\n" - -#: g10/tdbio.c:498 -#, fuzzy, c-format -msgid "can't access `%s': %s\n" -msgstr "nemem zavrie `%s': %s\n" - -#: g10/tdbio.c:513 -#, c-format -msgid "%s: directory does not exist!\n" -msgstr "%s: adresr 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 "nemem vytvori `%s': %s\n" - -#: g10/tdbio.c:525 g10/tdbio.c:592 -#, fuzzy, c-format -msgid "can't lock `%s'\n" -msgstr "nemono otvori `%s'\n" - -#: g10/tdbio.c:551 -#, c-format -msgid "%s: failed to create version record: %s" -msgstr "%s: nepodarilo sa vytvori zznam verzie: %s" - -#: g10/tdbio.c:555 -#, c-format -msgid "%s: invalid trustdb created\n" -msgstr "%s: vytvoren neplatn databza dvery\n" - -#: g10/tdbio.c:558 -#, c-format -msgid "%s: trustdb created\n" -msgstr "%s: databza dvery vytvoren\n" - -#: g10/tdbio.c:602 -msgid "NOTE: trustdb not writable\n" -msgstr "POZNMKA: do trustdb nemono zapisova\n" - -#: g10/tdbio.c:619 -#, c-format -msgid "%s: invalid trustdb\n" -msgstr "%s: neplatn databze dvery\n" - -#: g10/tdbio.c:651 -#, c-format -msgid "%s: failed to create hashtable: %s\n" -msgstr "%s: nepodarilo sa vytvori hashovaciu tabuku: %s\n" - -#: g10/tdbio.c:659 -#, c-format -msgid "%s: error updating version record: %s\n" -msgstr "%s: chyba pri aktualizcii zznamu 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 zznamu verzie: %s\n" - -#: g10/tdbio.c:735 -#, c-format -msgid "%s: error writing version record: %s\n" -msgstr "%s: chyba pri zpise zznamu verzie: %s\n" - -#: g10/tdbio.c:1174 -#, c-format -msgid "trustdb: lseek failed: %s\n" -msgstr "databze dvery: procedra lseek() zlyhala: %s\n" - -#: g10/tdbio.c:1182 -#, c-format -msgid "trustdb: read failed (n=%d): %s\n" -msgstr "databza dvery: procedra read() (n=%d) zlyhala: %s\n" - -#: g10/tdbio.c:1203 -#, c-format -msgid "%s: not a trustdb file\n" -msgstr "%s: nie je sbor databzy dvery\n" - -#: g10/tdbio.c:1221 -#, c-format -msgid "%s: version record with recnum %lu\n" -msgstr "%s: zznam verzie s slom %lu\n" - -#: g10/tdbio.c:1226 -#, c-format -msgid "%s: invalid file version %d\n" -msgstr "%s: neplatn verzia sboru %d\n" - -#: g10/tdbio.c:1411 -#, c-format -msgid "%s: error reading free record: %s\n" -msgstr "%s: chyba pri tan vonho zznamu: %s\n" - -#: g10/tdbio.c:1419 -#, c-format -msgid "%s: error writing dir record: %s\n" -msgstr "%s: chyba pri zpise adresrovho zznamu: %s\n" - -#: g10/tdbio.c:1429 -#, c-format -msgid "%s: failed to zero a record: %s\n" -msgstr "%s: vynulovanie zznamu zlyhalo: %s\n" - -#: g10/tdbio.c:1459 -#, c-format -msgid "%s: failed to append a record: %s\n" -msgstr "%s: pridanie zznamu zlyhalo: %s\n" - -#: g10/tdbio.c:1504 -msgid "the trustdb is corrupted; please run \"gpg --fix-trustdb\".\n" -msgstr "databza dvery je pokoden; prosm spustite \"gpg --fix-trustdb\".\n" - -#: g10/textfilter.c:149 -#, c-format -msgid "can't handle text lines longer than %d characters\n" -msgstr "nemem pracova s riadkami dlhmi 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 dveryhodn 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 databze dvery 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: nenjden verejn k k dveryhodnmu ku - preskoen\n" - -#: g10/trustdb.c:321 -#, fuzzy, c-format -msgid "key %s marked as ultimately trusted\n" -msgstr "k oznaen ako absoltne dveryhodn.\n" - -#: g10/trustdb.c:345 -#, c-format -msgid "trust record %lu, req type %d: read failed: %s\n" -msgstr "zznam dvery %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 "zznam dvery %lu nie je poadovanho 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 "neznme" - -#: 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 databzu dvery\n" - -#: g10/trustdb.c:583 g10/trustdb.c:2352 -#, c-format -msgid "next trustdb check due at %s\n" -msgstr "dalia kontrola databzy dvery %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 databzu dvery\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 databzu dvery\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 njden: %s\n" - -#: g10/trustdb.c:1034 -msgid "please do a --check-trustdb\n" -msgstr "prosm vykonajte --check-trustdb\n" - -#: g10/trustdb.c:1038 -msgid "checking the trustdb\n" -msgstr "kontrolujem databzu dvery\n" - -#: g10/trustdb.c:2095 -#, c-format -msgid "%d keys processed (%d validity counts cleared)\n" -msgstr "%d kov spracovanch (%d potov platnosti vymazanch)\n" - -#: g10/trustdb.c:2160 -msgid "no ultimately trusted keys found\n" -msgstr "neboli njden iadne absoltne dveryhodn ke\n" - -#: g10/trustdb.c:2174 -#, fuzzy, c-format -msgid "public key of ultimately trusted key %s not found\n" -msgstr "verejn k k absoltne dveryhodnmu ku %08lX nebol njden\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 "zznam dvery %lu, typ %d: zpis 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 mon overi.\n" -"Prosm, nezabdajte, e sbor s podpisom (.sig alebo .asc)\n" -"by mal by prvm sborom zadanm na prkazovom riadku.\n" - -#: g10/verify.c:192 -#, c-format -msgid "input line %u too long or missing LF\n" -msgstr "vstupn riadok %u je prli dlh alebo na konci chba znak LF\n" - -#: util/errors.c:55 -msgid "general error" -msgstr "veobecn chyba" - -#: util/errors.c:56 -msgid "unknown packet type" -msgstr "neznmy typ paketu" - -#: util/errors.c:57 -msgid "unknown version" -msgstr "neznma verzia" - -#: util/errors.c:58 -msgid "unknown pubkey algorithm" -msgstr "neznmy algoritmus verejnho ka" - -#: util/errors.c:59 -msgid "unknown digest algorithm" -msgstr "neznmy 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 kontrolnho stu" - -#: util/errors.c:64 -msgid "bad passphrase" -msgstr "nesprvne heslo" - -#: util/errors.c:65 -msgid "public key not found" -msgstr "verejn k nenjden" - -#: util/errors.c:66 -msgid "unknown cipher algorithm" -msgstr "neznmy ifrovac algoritmus" - -#: util/errors.c:67 -msgid "can't open the keyring" -msgstr "nemem otvori sbor kov" - -#: util/errors.c:68 -msgid "invalid packet" -msgstr "neplatn paket" - -#: util/errors.c:69 -msgid "invalid armor" -msgstr "neplatn spsob reprezentcie v ASCII" - -#: util/errors.c:70 -msgid "no such user id" -msgstr "uvate s tmto 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 pouit nesprvny tajn k" - -#: util/errors.c:73 -msgid "not supported" -msgstr "nepodporovan" - -#: util/errors.c:74 -msgid "bad key" -msgstr "nesprvny k" - -#: util/errors.c:75 -msgid "file read error" -msgstr "chyba pri tan sboru" - -#: util/errors.c:76 -msgid "file write error" -msgstr "chyba pri zpise sboru" - -#: util/errors.c:77 -msgid "unknown compress algorithm" -msgstr "neznmy kompresn algoritmus" - -#: util/errors.c:78 -msgid "file open error" -msgstr "chyba pri otvran sboru" - -#: util/errors.c:79 -msgid "file create error" -msgstr "chyba pri vytvran sboru" - -#: util/errors.c:80 -msgid "invalid passphrase" -msgstr "nesprvne heslo" - -#: util/errors.c:81 -msgid "unimplemented pubkey algorithm" -msgstr "algoritmus verejnho ka 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 "neznma trieda podpisu" - -#: util/errors.c:84 -msgid "trust database error" -msgstr "chyba v databze dvery" - -#: util/errors.c:85 -msgid "bad MPI" -msgstr "nesprvne MPI" - -#: util/errors.c:86 -msgid "resource limit" -msgstr "obmedzenie zdrojov" - -#: util/errors.c:87 -msgid "invalid keyring" -msgstr "neplatn sbor kov" - -#: util/errors.c:88 -msgid "bad certificate" -msgstr "nesprvny certifikt" - -#: util/errors.c:89 -msgid "malformed user id" -msgstr "nesprvny formt id uvatea" - -#: util/errors.c:90 -msgid "file close error" -msgstr "chyba pri zatvran sboru" - -#: util/errors.c:91 -msgid "file rename error" -msgstr "chyba pri premenovvan sboru" - -#: util/errors.c:92 -msgid "file delete error" -msgstr "chyba pri mazan sboru" - -#: util/errors.c:93 -msgid "unexpected data" -msgstr "neoakvan dta" - -#: util/errors.c:94 -msgid "timestamp conflict" -msgstr "konflikt asovho raztka" - -#: util/errors.c:95 -msgid "unusable pubkey algorithm" -msgstr "nepouiten algoritmus s verejnm kom" - -#: util/errors.c:96 -msgid "file exists" -msgstr "sbor 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 "nesprvne 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 "nezaifrovan" - -#: util/errors.c:104 -msgid "not processed" -msgstr "nespracovan" - -#: util/errors.c:106 -msgid "unusable public key" -msgstr "nepouiten verejn k" - -#: util/errors.c:107 -msgid "unusable secret key" -msgstr "nepouiten tajn k" - -#: util/errors.c:108 -msgid "keyserver error" -msgstr "chyba servera kov" - -#: util/errors.c:109 -#, fuzzy -msgid "canceled" -msgstr "Zrui" - -#: util/errors.c:110 -#, fuzzy -msgid "no card" -msgstr "nezaifrovan" - -#: util/errors.c:111 -#, fuzzy -msgid "no data" -msgstr "chbaj podpsan dta\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 "njden 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 "ukoni" - -#: 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: Pouvan pam nie je bezpen!\n" - -#: util/secmem.c:98 -msgid "please see http://www.gnupg.org/faq.html for more information\n" -msgstr "Viac informci njdete na adrese http://www.gnupg.org/faq.html\n" - -#: util/secmem.c:350 -msgid "operation is not possible without initialized secure memory\n" -msgstr "vykonanie opercie nie je mon bez inicializovanej bezpenej pamte\n" - -#: util/secmem.c:351 -msgid "(you may have used the wrong program for this task)\n" -msgstr "(pravdepodobne ste na tto lohu pouili nesprvny program)\n" - -#~ msgid "DSA requires the use of a 160 bit hash algorithm\n" -#~ msgstr "DSA poaduje pouitie 160 bitovho hashovacieho algoritmu\n" - -#~ msgid "" -#~ "please see http://www.gnupg.org/why-not-idea.html for more information\n" -#~ msgstr "" -#~ "viac informci njdete 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 me obsahova len psmen, slice, bodky, podiarnky alebo " -#~ "medzery a koni 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: njden neplatn formt zpisu dtumu\n" - -#~ msgid "not human readable" -#~ msgstr "nie je v priamo itatenom formte" - -#, fuzzy -#~ msgid "all export-clean-* options from above" -#~ msgstr "ta nastavenia zo sboru" - -#, fuzzy -#~ msgid "all import-clean-* options from above" -#~ msgstr "ta nastavenia zo sboru" - -#, fuzzy -#~ msgid "expired: %s)" -#~ msgstr " [platnos skon: %s]" - -#, fuzzy -#~ msgid "key %s: expired signature from key %s - skipped\n" -#~ msgstr "k %08lX: neoakvan podpisov trieda (0x%02X) - preskoen\n" - -#, fuzzy -#~ msgid "Unable to clean `%s'\n" -#~ msgstr "nemono spusti %s \"%s\": %s\n" - -#, fuzzy -#~ msgid "User ID \"%s\": %d signature removed.\n" -#~ msgstr "Uvatesk ID \"%s\" je revokovan." - -#, fuzzy -#~ msgid "User ID \"%s\": %d signatures removed.\n" -#~ msgstr "Uvatesk ID \"%s\" je revokovan." - -#, fuzzy -#~ msgid "User ID \"%s\" removed: %s\n" -#~ msgstr "Uvatesk ID \"%s\" je revokovan." - -#, fuzzy -#~ msgid "No user IDs are removable.\n" -#~ msgstr "uvatesk ID \"%s\" je u revokovan\n" - -#, fuzzy -#~ msgid "error getting serial number: %s\n" -#~ msgstr "chyba pri vytvran hesla: %s\n" - -#~ msgid "bad passphrase or unknown cipher algorithm (%d)\n" -#~ msgstr "nesprvne heslo alebo neznmy ifrovac algoritmus (%d)\n" - -#~ msgid "can't set client pid for the agent\n" -#~ msgstr "nemem nastavi PID klienta pre gpg-agenta\n" - -#~ msgid "can't get server read FD for the agent\n" -#~ msgstr "nemono zska server read file descriptor pre agenta\n" - -#~ msgid "can't get server write FD for the agent\n" -#~ msgstr "nemono zska server write file descriptor pre agenta\n" - -#~ msgid "communication problem with gpg-agent\n" -#~ msgstr "problm v komunikcii s gpg-agentom\n" - -#~ msgid "passphrase too long\n" -#~ msgstr "heslo je prli 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 "problm s agentom: agent vracia 0x%lx\n" - -#~ msgid "select secondary key N" -#~ msgstr "vyberte sekundrny k N" - -#~ msgid "list signatures" -#~ msgstr "vypsa zoznam podpisov" - -#~ msgid "sign the key" -#~ msgstr "podpsa k" - -#~ msgid "add a secondary key" -#~ msgstr "prida sekundrny 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 predvoby" - -#~ msgid "No secondary key with index %d\n" -#~ msgstr "Neexistuje sekundrny k s indexom %d\n" - -#~ msgid "--nrsign-key user-id" -#~ msgstr "--nrsign-key id uvatea" - -#~ msgid "--nrlsign-key user-id" -#~ msgstr "--nrlsign-key id uvatea" - -#, fuzzy -#~ msgid "make a trust signature" -#~ msgstr "vytvori podpis oddelen od dokumentu" - -#~ msgid "sign the key non-revocably" -#~ msgstr "podpsa k bez monosti odvola podpis (non-revocably)" - -#~ msgid "sign the key locally and non-revocably" -#~ msgstr "podpsa k loklne a bez monosti 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 "veobecn chyba" - -#~ msgid "passwd" -#~ msgstr "passwd" - -#~ msgid "save" -#~ msgstr "uloi" - -#~ 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 kov" - -#~ 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 "" -#~ "Chystm sa vytvori nov pr kov %s.\n" -#~ " minimlna vekos ka je 768 bitov\n" -#~ " implicitn vekos ka je 1024 bitov\n" -#~ " najvyia navrhovan vekos ka je 2048 bitov\n" - -#~ msgid "DSA only allows keysizes from 512 to 1024\n" -#~ msgstr "k DSA mus ma vekos od 512 do 1024 bitov.\n" - -#~ msgid "keysize too small; 1024 is smallest value allowed for RSA.\n" -#~ msgstr "" -#~ "vekos ka je prli mal; minimlna povolen vekos pre RSA je 1024 " -#~ "bitov.\n" - -#~ msgid "keysize too small; 768 is smallest value allowed.\n" -#~ msgstr "" -#~ "vekos ka je prli mal; minimlna povolen vekos je 768 bitov.\n" - -#~ msgid "keysize too large; %d is largest value allowed.\n" -#~ msgstr "vekos ka je prli vek; maximlna povolen hodnota je %d.\n" - -#~ msgid "" -#~ "Keysizes larger than 2048 are not suggested because\n" -#~ "computations take REALLY long!\n" -#~ msgstr "" -#~ "Vekosti kov vie ako 2048 bitov se neodporaj, pretoe\n" -#~ "vpoty potom trvaj VEMI dlho!\n" - -#, fuzzy -#~ msgid "Are you sure that you want this keysize? (y/N) " -#~ msgstr "Skutone chcete vytvori k tejto dky? " - -#~ msgid "" -#~ "Okay, but keep in mind that your monitor and keyboard radiation is also " -#~ "very vulnerable to attacks!\n" -#~ msgstr "" -#~ "Dobre, ale nezabdajte, e informcie mu by vyzraden z potaa aj " -#~ "elektromagnetickm vyarovanm monitora alebo klvesnice!\n" - -#~ msgid "Experimental algorithms should not be used!\n" -#~ msgstr "Experimentlne algoritmy by sa nemali pouva!\n" - -#~ msgid "" -#~ "this cipher algorithm is deprecated; please use a more standard one!\n" -#~ msgstr "" -#~ "tento ifrovac algoritmus je zastaral; prosm, pouite 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 "nemono previes v dvkovom mde\n" - -#~ msgid "key `%s' not found: %s\n" -#~ msgstr "k `%s' nebol njden: %s\n" - -#, fuzzy -#~ msgid "can't create file `%s': %s\n" -#~ msgstr "nemem vytvori `%s': %s\n" - -#, fuzzy -#~ msgid "can't open file `%s': %s\n" -#~ msgstr "nemono otvori sbor: %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: skonila platnos ka\n" - -#~ msgid "%08lX: We do NOT trust this key\n" -#~ msgstr "%08lX: NEdverujeme tomuto ku!\n" - -#~ msgid " (%d) RSA (sign and encrypt)\n" -#~ msgstr " (%d) RSA (pro ifrovn 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 ifrovn 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 ifrovn a podpis)\n" - -#~ msgid "%s: can't open: %s\n" -#~ msgstr "%s: nemem otvori: %s\n" - -#~ msgid "%s: WARNING: empty file\n" -#~ msgstr "%s: VAROVANIE: sbor je przdny\n" - -#~ msgid "can't open %s: %s\n" -#~ msgstr "nemono otvori %s: %s\n" - -#, fuzzy -#~ msgid " (%d) I trust marginally\n" -#~ msgstr " %d = Dverujem iastone\n" - -#, fuzzy -#~ msgid " (%d) I trust fully\n" -#~ msgstr " %d = Dverujem plne\n" - -#, fuzzy -#~ msgid "expires" -#~ msgstr "expire" - -#, fuzzy -#~ msgid "" -#~ "\"\n" -#~ "locally signed with your key %s at %s\n" -#~ msgstr "" -#~ "\"\n" -#~ "loklne podpsan Vam kom %08lX v %s\n" - -#, fuzzy -#~ msgid " signed by %s on %s%s\n" -#~ msgstr " podpsan %08lX v %s%s\n" - -#~ msgid "%s: can't access: %s\n" -#~ msgstr "%s: nemem pristupova k: %s\n" - -#~ msgid "%s: can't create lock\n" -#~ msgstr "%s: nemem vytvori zmok\n" - -#~ msgid "%s: can't make lock\n" -#~ msgstr "%s: nemem zamkn\n" - -#~ msgid "%s: can't create: %s\n" -#~ msgstr "%s: nemem vytvori: %s\n" - -#~ msgid "%s: can't create directory: %s\n" -#~ msgstr "%s: nemem vytvori adresr: %s\n" - -#~ msgid "If you want to use this revoked key anyway, answer \"yes\"." -#~ msgstr "" -#~ "Pokia aj tak chcete poui tento revokovan k, odpovedzte \"ano\"." - -#~ msgid "Unable to open photo \"%s\": %s\n" -#~ msgstr "Nemono otvori fotografiu \"%s\": %s\n" - -#~ msgid "can't open file: %s\n" -#~ msgstr "nemono otvori sbor: %s\n" - -#~ msgid "error: missing colon\n" -#~ msgstr "chyba: chba iarka\n" - -#~ msgid "error: no ownertrust value\n" -#~ msgstr "chyba: iadna rove dveryhodnosti\n" - -#~ msgid " (main key ID %08lX)" -#~ msgstr " (hlavn ID ka %08lX)" - -#~ msgid "rev! subkey has been revoked: %s\n" -#~ msgstr "rev! podk bol revokovan: %s\n" - -#~ msgid "rev- faked revocation found\n" -#~ msgstr "rev- njden falon revokcia\n" - -#~ msgid "rev? problem checking revocation: %s\n" -#~ msgstr "rev? problm overenia revokcie: %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: nemem vytvori: %s\n" - -#~ msgid "" -#~ "WARNING: digest `%s' is not part of OpenPGP. Use at your own risk!\n" -#~ msgstr "" -#~ "VAROVANIE: hash `%s' nie je sasou OpenPGP. Pouitie na vlastn " -#~ "nebezpeie!\n" - -#~ msgid "|[files]|encrypt files" -#~ msgstr "|[sbor]|ifrova sbor" - -#~ msgid "store only" -#~ msgstr "len uloenie" - -#~ msgid "|[files]|decrypt files" -#~ msgstr "|[sbor]|deifrova sbor" - -#~ msgid "sign a key non-revocably" -#~ msgstr "podpsa k bez monosti revokcie podpisu" - -#~ msgid "sign a key locally and non-revocably" -#~ msgstr "" -#~ "podpsa k loklne a bez monosti\n" -#~ " revokcie podpisu" - -#~ msgid "list only the sequence of packets" -#~ msgstr "vypsa len poradie paketov" - -#~ msgid "export the ownertrust values" -#~ msgstr "" -#~ "exportova hodnoty dveryhodnosti\n" -#~ " vlastnka ka" - -#~ msgid "unattended trust database update" -#~ msgstr "neinteraktvna aktualizcia databzy dvery" - -#~ msgid "fix a corrupted trust database" -#~ msgstr "opravi naruen databzu dvery" - -#~ msgid "De-Armor a file or stdin" -#~ msgstr "Dekdova ASCII sbor alebo std. vstup" - -#~ msgid "En-Armor a file or stdin" -#~ msgstr "Zakdova sbor alebo std. vstup do ASCII" - -#~ msgid "|NAME|use NAME as default recipient" -#~ msgstr "|MENO|poui MENO ako implicitnho adresta" - -#~ msgid "use the default key as default recipient" -#~ msgstr "" -#~ "poui implicitn k ako implicitnho\n" -#~ " adresta" - -#~ msgid "don't use the terminal at all" -#~ msgstr "vbec nepouva terminl" - -#~ msgid "force v3 signatures" -#~ msgstr "vynti podpisy verzie 3" - -#~ msgid "do not force v3 signatures" -#~ msgstr "nevynucova podpisy verzie 3" - -#~ msgid "force v4 key signatures" -#~ msgstr "vynti 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 vdy poui MDC" - -#~ msgid "never use a MDC for encryption" -#~ msgstr "na ifrovanie nikdy nepoui MDC" - -#~ msgid "use the gpg-agent" -#~ msgstr "pouite gpg-agenta" - -#~ msgid "batch mode: never ask" -#~ msgstr "dvkov reim: nikdy sa na ni nepta" - -#~ msgid "assume yes on most questions" -#~ msgstr "automaticky odpoveda no na vinu otzok" - -#~ msgid "assume no on most questions" -#~ msgstr "automaticky odpoveda NIE na vinu otzok" - -#~ msgid "add this keyring to the list of keyrings" -#~ msgstr "" -#~ "prida tento sbor kov do zoznamu\n" -#~ " pouvanch sborov kov" - -#~ msgid "add this secret keyring to the list" -#~ msgstr "prida tento sbor tajnch kov do zoznamu" - -#~ msgid "|NAME|use NAME as default secret key" -#~ msgstr "|MENO|poui MENO ako implicitn tajn k" - -#~ msgid "|HOST|use this keyserver to lookup keys" -#~ msgstr "" -#~ "|POTA|poui tento server kov na vyhadvanie\n" -#~ " kov" - -#~ msgid "|NAME|set terminal charset to NAME" -#~ msgstr "|MENO|nastav znakov sadu terminlu na MENO" - -#~ msgid "|[file]|write status info to file" -#~ msgstr "|[sbor]|zap informciu o stave do sboru" - -#~ msgid "|KEYID|ultimately trust this key" -#~ msgstr "|k|plne dverova tomuto ku" - -#~ msgid "|FILE|load extension module FILE" -#~ msgstr "|SBOR|nahra rozirujci modul SBOR" - -#~ msgid "emulate the mode described in RFC1991" -#~ msgstr "emulova md popsan v RFC1991" - -#~ msgid "set all packet, cipher and digest options to OpenPGP behavior" -#~ msgstr "" -#~ "nastav vetky vlastnosti paketov, ifier\n" -#~ " a hashov ako v OpenPGP" - -#~ msgid "set all packet, cipher and digest options to PGP 2.x behavior" -#~ msgstr "" -#~ "nastav vetky vlastnosti paketov, ifier\n" -#~ " a hashov ako v PGP 2.x" - -#~ msgid "|N|use passphrase mode N" -#~ msgstr "|N|poui md hesla N" - -#~ msgid "|NAME|use message digest algorithm NAME for passphrases" -#~ msgstr "|ALG|poui hashovac algoritmus ALG pre hesl" - -#~ msgid "|NAME|use cipher algorithm NAME for passphrases" -#~ msgstr "|ALG|poui ifrovac algoritmus ALG pre hesl" - -#~ msgid "|NAME|use cipher algorithm NAME" -#~ msgstr "|ALG|poui ifrovac algoritmus ALG" - -#~ msgid "|NAME|use message digest algorithm NAME" -#~ msgstr "|ALG|poui hashovac algoritmus ALG" - -#~ msgid "|N|use compress algorithm N" -#~ msgstr "|N|poui kompresn algoritmus N" - -#~ msgid "throw keyid field of encrypted packets" -#~ msgstr "" -#~ "zahodi identifiktor ka zo ifrovanch\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 prkazov riadok na prehliadanie\n" -#~ " fotografickho 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 vlastnkovi, napriek\n" -#~ "tomu je akceptovan\n" - -#~ msgid "preference %c%lu is not valid\n" -#~ msgstr "predvoba %c%lu nie je platn\n" - -#~ msgid "key %08lX: not a rfc2440 key - skipped\n" -#~ msgstr "k %08lX: nie je vo formte RFC 2440 - preskoen\n" - -#~ msgid "" -#~ "NOTE: Elgamal primary key detected - this may take some time to import\n" -#~ msgstr "" -#~ "POZNMKA: Njden primrny k Elgamal - import me chvu trva\n" - -#~ msgid " (default)" -#~ msgstr "deifrova dta (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 "nemem dosta k zo servera kov: %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 "spen 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 kov nepodporuje --search-keys\n" - -#~ msgid "can't search keyserver: %s\n" -#~ msgstr "nemem prehadva server kov: %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 " -#~ "nm vytvoren NIE S bezpen!\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 budcnosti (dolo ku zmene asu " -#~ "alebo\n" -#~ "je problm so systmovm 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 budcnosti (dolo ke zmene asu " -#~ "alebo\n" -#~ "je problm so systmovm asom)\n" - -#~ msgid "key %08lX marked as ultimately trusted\n" -#~ msgstr "k %08lX oznaen ako absoltne dveryhodn.\n" - -#~ msgid "signature from Elgamal signing key %08lX to %08lX skipped\n" -#~ msgstr "podpis od podpisovho ka Elgamal %08lX po %08lX preskoen\n" - -#~ msgid "signature from %08lX to Elgamal signing key %08lX skipped\n" -#~ msgstr "podpis od %08lX po podpisov k Elgamal %08lX preskoen\n" - -#~ msgid "checking at depth %d signed=%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/%d/%d\n" -#~ msgstr "" -#~ "kontrola v hbke %d podpsan=%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 (nazvan tie DSS) je algoritmus digitlneho podpisu, ktor me " -#~ "by\n" -#~ "pouit len pre podpisy. Je to odporan algoritmus, pretoe overenie\n" -#~ "DSA podpisov je ovea rchlej ako v algoritme ElGamal.\n" -#~ "\n" -#~ "Algoritmus ElGamal me by pouvan ako na podpisy tak na ifrovanie.\n" -#~ "tandard OpenPGP rozliuje medzi dvoma reimami tohto algoritmu:\n" -#~ "len ifrovanie a ifrovanie+podpis; v podstate je to rovnak, ale " -#~ "niekoko\n" -#~ "parametrov mus by vybranch pecilnym spsobom pre vytvorenie " -#~ "bezpenho ka\n" -#~ "pre podpisy: tento program to vie, ale nie je vyadovan, aby aj in\n" -#~ "implementcie OpenPGP pracovali v reime podpis+ifrovanie.\n" -#~ "\n" -#~ "Prv (primrny) k mus by vdy k, ktor je schopn podpisova;\n" -#~ "to je dvod, preo v tomto menu nie je k dispozcii k algoritmu " -#~ "ElGamal\n" -#~ "uren 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 ke definovan v RFC2440, nie s odporan,\n" -#~ "pretoe nie s podporovn vetkmi programami a podpisy nimi vytvoren\n" -#~ "s dos vek a na overenie vemi pomal." - -#~ msgid "%lu keys so far checked (%lu signatures)\n" -#~ msgstr "%lu kov u skontrolovanch (%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/sv.po b/po/sv.po deleted file mode 100644 index 9abf51398..000000000 --- a/po/sv.po +++ /dev/null @@ -1,7297 +0,0 @@ -# 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$ -# -msgid "" -msgstr "" -"Project-Id-Version: gnupg 1.2.6\n" -"Report-Msgid-Bugs-To: gnupg-i18n@gnupg.org\n" -"POT-Creation-Date: 2006-07-28 11:12+0200\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:1003 g10/gpg.c:3461 g10/import.c:195 g10/keygen.c:2385 -#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:342 -#: 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:1002 g10/keygen.c:2864 -#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:263 -#: g10/openfile.c:357 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:320 -#, c-format -msgid "armor: %s\n" -msgstr "ASCII-skal: %s\n" - -#: g10/armor.c:359 -msgid "invalid armor header: " -msgstr "felaktig rubrikrad i ASCII-skalet: " - -#: g10/armor.c:370 -msgid "armor header: " -msgstr "rad i ASCII-skalet: " - -#: g10/armor.c:381 -msgid "invalid clearsig header\n" -msgstr "felaktig rubrikrad i klartextsignatur\n" - -#: g10/armor.c:433 -msgid "nested clear text signatures\n" -msgstr "flera klartextsignaturer går in i varandra\n" - -#: g10/armor.c:568 -#, 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:580 -msgid "invalid dash escaped line: " -msgstr "felaktig rad som börjar med bindestreck: " - -# överhoppad eller hoppades över? -#: g10/armor.c:734 g10/armor.c:1343 -#, 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:777 -msgid "premature eof (no CRC)\n" -msgstr "för tidigt filslut (ingen CRC-summa)\n" - -#: g10/armor.c:811 -msgid "premature eof (in CRC)\n" -msgstr "för tidigt filslut (i CRC-summan)\n" - -#: g10/armor.c:819 -msgid "malformed CRC\n" -msgstr "felformaterad CRC-summa\n" - -#: g10/armor.c:823 g10/armor.c:1380 -#, fuzzy, c-format -msgid "CRC error; %06lX - %06lX\n" -msgstr "CRC-fel; %06lx - %06lx\n" - -#: g10/armor.c:843 -#, fuzzy -msgid "premature eof (in trailer)\n" -msgstr "för tidigt filslut (i den avslutande raden)\n" - -#: g10/armor.c:847 -msgid "error in trailer line\n" -msgstr "fel i avslutande rad\n" - -#: g10/armor.c:1158 -msgid "no valid OpenPGP data found.\n" -msgstr "hittade ingen giltig OpenPGP-data.\n" - -#: g10/armor.c:1163 -#, 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:1167 -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:280 -#, 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:3826 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:3387 g10/keyserver.c:1700 -#: 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:2349 g10/keyserver.c:1714 -#: 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:67 g10/mainproc.c:293 -#, c-format -msgid "%s encrypted data\n" -msgstr "%s krypterad data\n" - -#: g10/encr-data.c:69 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:93 -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:104 -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:415 -#, 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:375 -msgid "" -"@Commands:\n" -" " -msgstr "" -"@Kommandon:\n" -" " - -#: g10/gpg.c:377 -msgid "|[file]|make a signature" -msgstr "|[fil]|skapa en signatur" - -#: g10/gpg.c:378 -msgid "|[file]|make a clear text signature" -msgstr "|[fil]|skapa en klartext-signatur" - -#: g10/gpg.c:379 -msgid "make a detached signature" -msgstr "skapa signatur i en separat fil" - -#: g10/gpg.c:380 -msgid "encrypt data" -msgstr "kryptera data" - -#: g10/gpg.c:382 -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:384 -msgid "decrypt data (default)" -msgstr "dekryptera data (standard)" - -#: g10/gpg.c:386 -msgid "verify a signature" -msgstr "verifiera en signatur" - -#: g10/gpg.c:388 -msgid "list keys" -msgstr "visa en lista på nycklar" - -#: g10/gpg.c:390 -msgid "list keys and signatures" -msgstr "visa en lista på nycklar och signaturer" - -#: g10/gpg.c:391 -#, fuzzy -msgid "list and check key signatures" -msgstr "verifiera nyckelsignaturer" - -#: g10/gpg.c:392 -msgid "list keys and fingerprints" -msgstr "visa en lista på nycklar och fingeravtryck" - -#: g10/gpg.c:393 -msgid "list secret keys" -msgstr "visa en lista på hemliga nycklar" - -#: g10/gpg.c:394 -msgid "generate a new key pair" -msgstr "generera ett nytt nyckelpar" - -#: g10/gpg.c:395 -msgid "remove keys from the public keyring" -msgstr "ta bort nycklar från den öppna nyckelringen" - -#: g10/gpg.c:397 -msgid "remove keys from the secret keyring" -msgstr "ta bort nycklar från den hemliga nyckelringen" - -#: g10/gpg.c:398 -msgid "sign a key" -msgstr "signera en nyckel" - -#: g10/gpg.c:399 -msgid "sign a key locally" -msgstr "signera en nyckel lokalt" - -#: g10/gpg.c:400 -msgid "sign or edit a key" -msgstr "signera eller redigera en nyckel" - -#: g10/gpg.c:401 -msgid "generate a revocation certificate" -msgstr "generera ett spärrcertifikat" - -#: g10/gpg.c:403 -msgid "export keys" -msgstr "exportera nycklar" - -#: g10/gpg.c:404 -msgid "export keys to a key server" -msgstr "exportera nycklar till en nyckelserver" - -#: g10/gpg.c:405 -msgid "import keys from a key server" -msgstr "importera nycklar från en nyckelserver" - -#: g10/gpg.c:407 -msgid "search for keys on a key server" -msgstr "sök efter nycklar hos en nyckelserver" - -#: g10/gpg.c:409 -msgid "update all keys from a keyserver" -msgstr "uppdatera alla nycklar nycklar från en nyckelserver" - -#: g10/gpg.c:413 -msgid "import/merge keys" -msgstr "importera/slå ihop nycklar" - -#: g10/gpg.c:416 -msgid "print the card status" -msgstr "" - -#: g10/gpg.c:417 -msgid "change data on a card" -msgstr "" - -#: g10/gpg.c:418 -msgid "change a card's PIN" -msgstr "" - -#: g10/gpg.c:426 -msgid "update the trust database" -msgstr "uppdatera tillitsdatabasen" - -#: g10/gpg.c:433 -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:437 g10/gpgv.c:71 -msgid "" -"@\n" -"Options:\n" -" " -msgstr "" -"@\n" -"Flaggor:\n" -" " - -#: g10/gpg.c:439 -msgid "create ascii armored output" -msgstr "skapa utdata med ett ascii-skal" - -#: g10/gpg.c:441 -msgid "|NAME|encrypt for NAME" -msgstr "|NAMN|kryptera för NAMN" - -#: g10/gpg.c:452 -msgid "use this user-id to sign or decrypt" -msgstr "använd denna användaridentitet för att signera eller dekryptera" - -#: g10/gpg.c:453 -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:458 -msgid "use canonical text mode" -msgstr "använd \"ursprunglig text\"-läget" - -#: g10/gpg.c:472 -msgid "use as output file" -msgstr "använd som fil för utdata" - -#: g10/gpg.c:474 g10/gpgv.c:73 -msgid "verbose" -msgstr "utförlig" - -#: g10/gpg.c:485 -msgid "do not make any changes" -msgstr "gör inga ändringar" - -#: g10/gpg.c:486 -msgid "prompt before overwriting" -msgstr "Fråga före ersättning" - -#: g10/gpg.c:527 -msgid "use strict OpenPGP behavior" -msgstr "" - -#: g10/gpg.c:528 -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:556 -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:559 -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:757 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:774 -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:777 -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:788 -msgid "" -"\n" -"Supported algorithms:\n" -msgstr "" -"\n" -"Stödda algoritmer:\n" - -#: g10/gpg.c:791 -msgid "Pubkey: " -msgstr "öppen nyckel: " - -#: g10/gpg.c:797 g10/keyedit.c:2310 -msgid "Cipher: " -msgstr "Chiffer: " - -#: g10/gpg.c:803 -msgid "Hash: " -msgstr "Kontrollsumma: " - -#: g10/gpg.c:809 g10/keyedit.c:2356 -msgid "Compression: " -msgstr "Komprimering: " - -#: g10/gpg.c:892 -msgid "usage: gpg [options] " -msgstr "användning: gpg [flaggor] " - -#: g10/gpg.c:1040 -msgid "conflicting commands\n" -msgstr "motstridiga kommandon\n" - -# Vad betyder detta? -#: g10/gpg.c:1058 -#, fuzzy, c-format -msgid "no = sign found in group definition `%s'\n" -msgstr "no = signatur hittad i gruppdefinitionen \"%s\"\n" - -#: g10/gpg.c:1255 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on homedir `%s'\n" -msgstr "VARNING: %s osäker ägare till %s\n" - -#: g10/gpg.c:1258 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on configuration file `%s'\n" -msgstr "VARNING: %s osäker ägare till %s\n" - -#: g10/gpg.c:1261 -#, fuzzy, c-format -msgid "WARNING: unsafe ownership on extension `%s'\n" -msgstr "VARNING: %s osäker ägare till %s\n" - -#: g10/gpg.c:1267 -#, fuzzy, c-format -msgid "WARNING: unsafe permissions on homedir `%s'\n" -msgstr "WARNING: osäkra befogenheter för %s \"%s\"\n" - -#: g10/gpg.c:1270 -#, 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:1273 -#, fuzzy, c-format -msgid "WARNING: unsafe permissions on extension `%s'\n" -msgstr "WARNING: osäkra befogenheter för %s \"%s\"\n" - -#: g10/gpg.c:1279 -#, 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:1282 -#, 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:1285 -#, 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:1291 -#, 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:1294 -#, 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:1297 -#, 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:1438 -#, fuzzy, c-format -msgid "unknown configuration item `%s'\n" -msgstr "okänt configurationspost \"%s\"\n" - -#: g10/gpg.c:1531 -msgid "display photo IDs during key listings" -msgstr "" - -#: g10/gpg.c:1533 -msgid "show policy URLs during signature listings" -msgstr "" - -#: g10/gpg.c:1535 -#, fuzzy -msgid "show all notations during signature listings" -msgstr "Det finns ingen motsvarande signatur i den hemliga nyckelringen\n" - -#: g10/gpg.c:1537 -msgid "show IETF standard notations during signature listings" -msgstr "" - -#: g10/gpg.c:1541 -msgid "show user-supplied notations during signature listings" -msgstr "" - -#: g10/gpg.c:1543 -#, fuzzy -msgid "show preferred keyserver URLs during signature listings" -msgstr "den angivna URL som beskriver signaturpolicy är felaktig\n" - -#: g10/gpg.c:1545 -msgid "show user ID validity during key listings" -msgstr "" - -#: g10/gpg.c:1547 -msgid "show revoked and expired user IDs in key listings" -msgstr "" - -#: g10/gpg.c:1549 -msgid "show revoked and expired subkeys in key listings" -msgstr "" - -#: g10/gpg.c:1551 -#, fuzzy -msgid "show the keyring name in key listings" -msgstr "visa vilken nyckelring den listade nyckeln hör till" - -#: g10/gpg.c:1553 -#, fuzzy -msgid "show expiration dates during signature listings" -msgstr "Det finns ingen motsvarande signatur i den hemliga nyckelringen\n" - -#: g10/gpg.c:1920 -#, 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:1962 -#, c-format -msgid "NOTE: no default option file `%s'\n" -msgstr "OBS: inställningsfilen \"%s\" saknas\n" - -#: g10/gpg.c:1966 -#, c-format -msgid "option file `%s': %s\n" -msgstr "inställningsfil \"%s\": %s\n" - -#: g10/gpg.c:1973 -#, c-format -msgid "reading options from `%s'\n" -msgstr "läser inställningar från \"%s\"\n" - -#: g10/gpg.c:2188 g10/gpg.c:2814 g10/gpg.c:2833 -#, 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:2201 -#, 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:2364 g10/gpg.c:2376 -#, fuzzy, c-format -msgid "`%s' is not a valid signature expiration\n" -msgstr "%s är ingen giltig teckentabell\n" - -#: g10/gpg.c:2452 -#, fuzzy, c-format -msgid "`%s' is not a valid character set\n" -msgstr "%s är ingen giltig teckentabell\n" - -#: g10/gpg.c:2476 g10/gpg.c:2663 g10/keyedit.c:4064 -#, fuzzy -msgid "could not parse keyserver URL\n" -msgstr "kunde inte tolka nyckelserver-URI\n" - -#: g10/gpg.c:2488 -#, fuzzy, c-format -msgid "%s:%d: invalid keyserver options\n" -msgstr "%s: felaktiga exportinställningar %d\n" - -#: g10/gpg.c:2491 -#, fuzzy -msgid "invalid keyserver options\n" -msgstr "felaktiga exportinställningar\n" - -#: g10/gpg.c:2498 -#, c-format -msgid "%s:%d: invalid import options\n" -msgstr "%s: felaktiga importinställningar %d\n" - -#: g10/gpg.c:2501 -msgid "invalid import options\n" -msgstr "felaktiga importinställningar\n" - -#: g10/gpg.c:2508 -#, c-format -msgid "%s:%d: invalid export options\n" -msgstr "%s: felaktiga exportinställningar %d\n" - -#: g10/gpg.c:2511 -msgid "invalid export options\n" -msgstr "felaktiga exportinställningar\n" - -#: g10/gpg.c:2518 -#, fuzzy, c-format -msgid "%s:%d: invalid list options\n" -msgstr "%s: felaktiga importinställningar %d\n" - -#: g10/gpg.c:2521 -#, fuzzy -msgid "invalid list options\n" -msgstr "felaktiga importinställningar\n" - -#: g10/gpg.c:2529 -msgid "display photo IDs during signature verification" -msgstr "" - -#: g10/gpg.c:2531 -msgid "show policy URLs during signature verification" -msgstr "" - -#: g10/gpg.c:2533 -#, fuzzy -msgid "show all notations during signature verification" -msgstr "%s är ingen giltig teckentabell\n" - -#: g10/gpg.c:2535 -msgid "show IETF standard notations during signature verification" -msgstr "" - -#: g10/gpg.c:2539 -msgid "show user-supplied notations during signature verification" -msgstr "" - -#: g10/gpg.c:2541 -#, fuzzy -msgid "show preferred keyserver URLs during signature verification" -msgstr "den angivna URL som beskriver signaturpolicy är felaktig\n" - -#: g10/gpg.c:2543 -#, fuzzy -msgid "show user ID validity during signature verification" -msgstr "%s är ingen giltig teckentabell\n" - -#: g10/gpg.c:2545 -msgid "show revoked and expired user IDs in signature verification" -msgstr "" - -#: g10/gpg.c:2547 -msgid "validate signatures with PKA data" -msgstr "" - -#: g10/gpg.c:2549 -msgid "elevate the trust of signatures with valid PKA data" -msgstr "" - -#: g10/gpg.c:2556 -#, fuzzy, c-format -msgid "%s:%d: invalid verify options\n" -msgstr "%s: felaktiga exportinställningar %d\n" - -#: g10/gpg.c:2559 -#, fuzzy -msgid "invalid verify options\n" -msgstr "felaktiga exportinställningar\n" - -#: g10/gpg.c:2566 -#, 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:2729 -#, fuzzy, c-format -msgid "%s:%d: invalid auto-key-locate list\n" -msgstr "%s: felaktiga exportinställningar %d\n" - -#: g10/gpg.c:2732 -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:2803 -msgid "WARNING: program may create a core file!\n" -msgstr "VARNING: programmet kan komma att skapa en minnesutskrift!\n" - -#: g10/gpg.c:2807 -#, c-format -msgid "WARNING: %s overrides %s\n" -msgstr "VARNING: %s gäller istället för %s\n" - -#: g10/gpg.c:2816 -#, c-format -msgid "%s not allowed with %s!\n" -msgstr "%s är inte tillåten tillsammans med %s!\n" - -#: g10/gpg.c:2819 -#, 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:2826 -#, 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:2841 -#, fuzzy, c-format -msgid "will not run with insecure memory due to %s\n" -msgstr "skriver hemlig nyckel till \"%s\"\n" - -#: g10/gpg.c:2855 -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:2861 -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:2867 -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:2880 -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:2947 g10/gpg.c:2971 -msgid "selected cipher algorithm is invalid\n" -msgstr "den valda krypteringsalgoritmen är felaktig\n" - -#: g10/gpg.c:2953 g10/gpg.c:2977 -msgid "selected digest algorithm is invalid\n" -msgstr "den valda kontrollsummealgoritmen är felaktig\n" - -#: g10/gpg.c:2959 -#, fuzzy -msgid "selected compression algorithm is invalid\n" -msgstr "den valda krypteringsalgoritmen är felaktig\n" - -#: g10/gpg.c:2965 -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:2980 -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:2982 -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:2984 -#, 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:2986 -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:2988 -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:2991 -msgid "NOTE: simple S2K mode (0) is strongly discouraged\n" -msgstr "OBS: enkelt S2K-läge (0) rekommenderas inte\n" - -#: g10/gpg.c:2995 -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:3002 -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:3011 -msgid "invalid personal cipher preferences\n" -msgstr "felaktig inställning av vilka krypteringsalgoritmer du föredrar\n" - -#: g10/gpg.c:3015 -msgid "invalid personal digest preferences\n" -msgstr "felaktig inställning av vilka checksummealgoritmer du föredrar\n" - -#: g10/gpg.c:3019 -msgid "invalid personal compress preferences\n" -msgstr "felaktig inställning av vilka kompressionsalgoritmer du föredrar\n" - -#: g10/gpg.c:3052 -#, c-format -msgid "%s does not yet work with %s\n" -msgstr "%s fungerar ännu inte med %s\n" - -#: g10/gpg.c:3099 -#, 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:3104 -#, 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:3109 -#, 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:3208 -#, c-format -msgid "failed to initialize the TrustDB: %s\n" -msgstr "misslyckades med att initialisera tillitsdatabasen: %s\n" - -#: g10/gpg.c:3219 -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:3230 -msgid "--store [filename]" -msgstr "--store [filnamn]" - -#: g10/gpg.c:3237 -msgid "--symmetric [filename]" -msgstr "--symmetric [filnamn]" - -#: g10/gpg.c:3239 -#, fuzzy, c-format -msgid "symmetric encryption of `%s' failed: %s\n" -msgstr "dekrypteringen misslyckades: %s\n" - -#: g10/gpg.c:3249 -msgid "--encrypt [filename]" -msgstr "--encrypt [filnamn]" - -#: g10/gpg.c:3262 -#, fuzzy -msgid "--symmetric --encrypt [filename]" -msgstr "--sign --encrypt [filnamn]" - -#: g10/gpg.c:3264 -msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n" -msgstr "" - -#: g10/gpg.c:3267 -#, 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:3285 -msgid "--sign [filename]" -msgstr "--sign [filnamn]" - -#: g10/gpg.c:3298 -msgid "--sign --encrypt [filename]" -msgstr "--sign --encrypt [filnamn]" - -#: g10/gpg.c:3313 -#, fuzzy -msgid "--symmetric --sign --encrypt [filename]" -msgstr "--sign --encrypt [filnamn]" - -#: g10/gpg.c:3315 -msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n" -msgstr "" - -#: g10/gpg.c:3318 -#, 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:3338 -msgid "--sign --symmetric [filename]" -msgstr "--sign --symmetric [filnamn]" - -#: g10/gpg.c:3347 -msgid "--clearsign [filename]" -msgstr "--clearsign [filnamn]" - -#: g10/gpg.c:3372 -msgid "--decrypt [filename]" -msgstr "--decrypt [filnamn]" - -#: g10/gpg.c:3380 -msgid "--sign-key user-id" -msgstr "--sign-key användaridentitet" - -#: g10/gpg.c:3384 -msgid "--lsign-key user-id" -msgstr "--lsign-key användaridentitet" - -#: g10/gpg.c:3405 -msgid "--edit-key user-id [commands]" -msgstr "--edit-key användaridentitet [kommandon]" - -#: g10/gpg.c:3476 -msgid "-k[v][v][v][c] [user-id] [keyring]" -msgstr "-k[v][v][v][c] [användaridentitet] [nyckelring]" - -#: g10/gpg.c:3518 -#, c-format -msgid "keyserver send failed: %s\n" -msgstr "Sändning till nyckelservern misslyckades: %s\n" - -#: g10/gpg.c:3520 -#, c-format -msgid "keyserver receive failed: %s\n" -msgstr "Hämtning från nyckelservern misslyckades: %s\n" - -#: g10/gpg.c:3522 -#, c-format -msgid "key export failed: %s\n" -msgstr "Export av nyckeln misslyckades: %s\n" - -#: g10/gpg.c:3533 -#, c-format -msgid "keyserver search failed: %s\n" -msgstr "Sökning på nyckelservern misslyckades: %s\n" - -#: g10/gpg.c:3543 -#, c-format -msgid "keyserver refresh failed: %s\n" -msgstr "Uppdatering av nyckeln från en nyckelserver misslyckades: %s\n" - -#: g10/gpg.c:3594 -#, c-format -msgid "dearmoring failed: %s\n" -msgstr "misslyckades med att ta bort ASCII-skalet: %s\n" - -#: g10/gpg.c:3602 -#, c-format -msgid "enarmoring failed: %s\n" -msgstr "misslyckades med att skapa ASCII-skal: %s\n" - -#: g10/gpg.c:3689 -#, c-format -msgid "invalid hash algorithm `%s'\n" -msgstr "felaktig kontrollsummealgoritm `%s'\n" - -#: g10/gpg.c:3812 -msgid "[filename]" -msgstr "[filnamn]" - -#: g10/gpg.c:3816 -msgid "Go ahead and type your message ...\n" -msgstr "Skriv ditt meddelande här ...\n" - -#: g10/gpg.c:4120 -msgid "the given certification policy URL is invalid\n" -msgstr "den angivna URL som beskriver certifikationspolicy är felaktig\n" - -#: g10/gpg.c:4122 -msgid "the given signature policy URL is invalid\n" -msgstr "den angivna URL som beskriver signaturpolicy är felaktig\n" - -#: g10/gpg.c:4155 -#, 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:3707 -#, 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:266 -#, c-format -msgid "skipping block of type %d\n" -msgstr "hoppar över block av typen %d\n" - -#: g10/import.c:275 -#, fuzzy, c-format -msgid "%lu keys processed so far\n" -msgstr "har behandlat %lu nycklar hittills\n" - -#: g10/import.c:292 -#, c-format -msgid "Total number processed: %lu\n" -msgstr " Totalt antal behandlade enheter: %lu\n" - -#: g10/import.c:294 -#, c-format -msgid " skipped new keys: %lu\n" -msgstr " överhoppade nya nycklar: %lu\n" - -#: g10/import.c:297 -#, c-format -msgid " w/o user IDs: %lu\n" -msgstr " utan användaridentiteter: %lu\n" - -#: g10/import.c:299 -#, c-format -msgid " imported: %lu" -msgstr " importerade: %lu" - -#: g10/import.c:305 -#, c-format -msgid " unchanged: %lu\n" -msgstr " oförändrade: %lu\n" - -#: g10/import.c:307 -#, c-format -msgid " new user IDs: %lu\n" -msgstr " nya användaridentiteter: %lu\n" - -#: g10/import.c:309 -#, c-format -msgid " new subkeys: %lu\n" -msgstr " nya undernycklar: %lu\n" - -#: g10/import.c:311 -#, c-format -msgid " new signatures: %lu\n" -msgstr " nya signaturer: %lu\n" - -#: g10/import.c:313 -#, c-format -msgid " new key revocations: %lu\n" -msgstr " nya spärrar av nycklar: %lu\n" - -#: g10/import.c:315 -#, c-format -msgid " secret keys read: %lu\n" -msgstr " antal lästa hemliga nycklar: %lu\n" - -#: g10/import.c:317 -#, c-format -msgid " secret keys imported: %lu\n" -msgstr "antal importerade hemliga nycklar: %lu\n" - -#: g10/import.c:319 -#, c-format -msgid " secret keys unchanged: %lu\n" -msgstr "antal oförändrade hemliga nycklar: %lu\n" - -#: g10/import.c:321 -#, c-format -msgid " not imported: %lu\n" -msgstr " inte importerade: %lu\n" - -#: g10/import.c:323 -#, fuzzy, c-format -msgid " signatures cleaned: %lu\n" -msgstr " nya signaturer: %lu\n" - -#: g10/import.c:325 -#, fuzzy, c-format -msgid " user IDs cleaned: %lu\n" -msgstr " antal lästa hemliga nycklar: %lu\n" - -#: g10/import.c:566 -#, 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:570 -#, fuzzy -msgid " algorithms on these user IDs:\n" -msgstr "Du har signerat följande användaridentiteter:\n" - -#: g10/import.c:607 -#, c-format -msgid " \"%s\": preference for cipher algorithm %s\n" -msgstr "" - -#: g10/import.c:619 -#, fuzzy, c-format -msgid " \"%s\": preference for digest algorithm %s\n" -msgstr "%s signatur, sammandragsalgoritm %s\n" - -#: g10/import.c:631 -#, c-format -msgid " \"%s\": preference for compression algorithm %s\n" -msgstr "" - -#: g10/import.c:644 -msgid "it is strongly suggested that you update your preferences and\n" -msgstr "" - -#: g10/import.c:646 -msgid "re-distribute this key to avoid potential algorithm mismatch problems\n" -msgstr "" - -#: g10/import.c:670 -#, c-format -msgid "you can update your preferences with: gpg --edit-key %s updpref save\n" -msgstr "" - -#: g10/import.c:720 g10/import.c:1118 -#, 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:749 -#, 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:764 -#, 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:770 -#, fuzzy, c-format -msgid "key %s: no valid user IDs\n" -msgstr "nyckel %08lX: inga giltiga användaridentiteter\n" - -#: g10/import.c:772 -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:782 g10/import.c:1240 -#, fuzzy, c-format -msgid "key %s: public key not found: %s\n" -msgstr "nyckel %08lX: hittade ingen öppen nyckel: %s\n" - -#: g10/import.c:788 -#, fuzzy, c-format -msgid "key %s: new key - skipped\n" -msgstr "nyckel %08lX: ny nyckel - hoppade över den\n" - -#: g10/import.c:797 -#, c-format -msgid "no writable keyring found: %s\n" -msgstr "hittade ingen nyckelring som gick att skriva till: %s\n" - -#: g10/import.c:802 g10/openfile.c:267 g10/sign.c:831 g10/sign.c:1135 -#, c-format -msgid "writing to `%s'\n" -msgstr "skriver till \"%s\"\n" - -#: g10/import.c:806 g10/import.c:901 g10/import.c:1158 g10/import.c:1301 -#: g10/import.c:2363 g10/import.c:2385 -#, 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:825 -#, fuzzy, c-format -msgid "key %s: public key \"%s\" imported\n" -msgstr "nyckel %08lX: importerade öppen nyckel \"%s\"\n" - -#: g10/import.c:849 -#, 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:866 g10/import.c:1258 -#, 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:874 g10/import.c:1265 -#, 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:911 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new user ID\n" -msgstr "nyckel %08lX: \"%s\" 1 ny användaridentitet\n" - -#: g10/import.c:914 -#, 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:917 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new signature\n" -msgstr "nyckel %08lX: \"%s\" 1 ny signatur\n" - -#: g10/import.c:920 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new signatures\n" -msgstr "nyckel %08lX: \"%s\" %d nya signaturer\n" - -#: g10/import.c:923 -#, fuzzy, c-format -msgid "key %s: \"%s\" 1 new subkey\n" -msgstr "nyckel %08lX: \"%s\" 1 ny undernyckel\n" - -#: g10/import.c:926 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d new subkeys\n" -msgstr "nyckel %08lX: \"%s\" %d nya undernycklar\n" - -#: g10/import.c:929 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signature cleaned\n" -msgstr "nyckel %08lX: \"%s\" %d nya signaturer\n" - -#: g10/import.c:932 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signatures cleaned\n" -msgstr "nyckel %08lX: \"%s\" %d nya signaturer\n" - -#: g10/import.c:935 -#, 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:938 -#, 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:961 -#, fuzzy, c-format -msgid "key %s: \"%s\" not changed\n" -msgstr "nyckel %08lX: \"%s\" inte ändrad\n" - -#: g10/import.c:1124 -#, 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:1135 -#, fuzzy -msgid "importing secret keys not allowed\n" -msgstr "skriver hemlig nyckel till \"%s\"\n" - -#: g10/import.c:1152 g10/import.c:2378 -#, c-format -msgid "no default secret keyring: %s\n" -msgstr "ingen hemlig nyckelring angiven som standard: %s\n" - -#: g10/import.c:1163 -#, fuzzy, c-format -msgid "key %s: secret key imported\n" -msgstr "nyckel %08lX: den hemliga nyckeln är importerad\n" - -#: g10/import.c:1193 -#, fuzzy, c-format -msgid "key %s: already in secret keyring\n" -msgstr "nyckel %08lX: finns redan i den hemliga nyckelringen\n" - -#: g10/import.c:1203 -#, 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:1233 -#, 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:1276 -#, fuzzy, c-format -msgid "key %s: invalid revocation certificate: %s - rejected\n" -msgstr "nyckel %08lX: ogiltigt spärrcertifikat: %s - avvisat\n" - -#: g10/import.c:1308 -#, fuzzy, c-format -msgid "key %s: \"%s\" revocation certificate imported\n" -msgstr "nyckel %08lX: \"%s\" spärrcertifikat importerat\n" - -#: g10/import.c:1374 -#, 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:1389 -#, 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:1391 -#, 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:1409 -#, fuzzy, c-format -msgid "key %s: no subkey for key binding\n" -msgstr "nyckel %08lX: ingen undernyckel för nyckelbindning\n" - -#: g10/import.c:1420 g10/import.c:1470 -#, 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:1422 -#, fuzzy, c-format -msgid "key %s: invalid subkey binding\n" -msgstr "nyckel %08lX: ogiltig undernyckelbindning\n" - -#: g10/import.c:1437 -#, fuzzy, c-format -msgid "key %s: removed multiple subkey binding\n" -msgstr "nyckel %08lX: tog bort multipla bindningar av undernyckel\n" - -#: g10/import.c:1459 -#, 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:1472 -#, fuzzy, c-format -msgid "key %s: invalid subkey revocation\n" -msgstr "nyckel %08lX: ogiltig spärr av undernyckel\n" - -#: g10/import.c:1487 -#, 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:1529 -#, fuzzy, c-format -msgid "key %s: skipped user ID \"%s\"\n" -msgstr "nyckel %08lX: hoppade över användaridentitet '" - -#: g10/import.c:1550 -#, fuzzy, c-format -msgid "key %s: skipped subkey\n" -msgstr "nyckel %08lX: hoppade över undernyckel\n" - -#: g10/import.c:1577 -#, 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:1587 -#, 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:1604 -#, 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:1618 -#, 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:1626 -#, 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:1726 -#, 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:1788 -#, 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:1802 -#, 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:1861 -#, fuzzy, c-format -msgid "key %s: \"%s\" revocation certificate added\n" -msgstr "nyckel %08lX: \"%s\" spärrcertifikat importerat\n" - -#: g10/import.c:1895 -#, fuzzy, c-format -msgid "key %s: direct key signature added\n" -msgstr "nyckel %08lX: lagt till direkt nyckelsignatur\n" - -#: g10/import.c:2284 -#, 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:2292 -#, fuzzy -msgid "NOTE: primary key is online and stored on card\n" -msgstr "hoppade över: hemlig nyckel finns redan\n" - -#: g10/import.c:2294 -#, 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:4783 g10/keyedit.c:4874 g10/keyedit.c:4938 -#: g10/keyedit.c:4999 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:3346 -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:3249 -#, fuzzy, c-format -msgid "User ID \"%s\": already clean\n" -msgstr "Användar-ID \"%s\" är redan spärrad\n" - -#: g10/keyedit.c:3341 -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:3352 -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:3372 -msgid "Enter the user ID of the designated revoker: " -msgstr "Ange användar-ID för spärrnyckeln: " - -#: g10/keyedit.c:3397 -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:3412 -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:3434 -#, 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:3453 -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:3459 -#, 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:3520 -msgid "Please remove selections from the secret keys.\n" -msgstr "Tag bort markeringar från de hemliga nycklarna.\n" - -#: g10/keyedit.c:3526 -#, fuzzy -msgid "Please select at most one subkey.\n" -msgstr "Välj som högst en undernyckel.\n" - -#: g10/keyedit.c:3530 -#, fuzzy -msgid "Changing expiration time for a subkey.\n" -msgstr "Ändrar giltighetstid för en undernyckel.\n" - -#: g10/keyedit.c:3533 -msgid "Changing expiration time for the primary key.\n" -msgstr "Ändrar giltighetstid för huvudnyckeln.\n" - -#: g10/keyedit.c:3579 -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:3595 -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:3668 -#, fuzzy, c-format -msgid "signing subkey %s is already cross-certified\n" -msgstr "VARNING: Signeringsundernyckeln %08lX är inte korscertifierad\n" - -#: g10/keyedit.c:3674 -#, c-format -msgid "subkey %s does not sign and so does not need to be cross-certified\n" -msgstr "" - -#: g10/keyedit.c:3836 -msgid "Please select exactly one user ID.\n" -msgstr "Du måste välja bara en användaridentitet.\n" - -#: g10/keyedit.c:3875 g10/keyedit.c:3985 g10/keyedit.c:4105 g10/keyedit.c:4246 -#, 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:4046 -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:4126 -#, 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:4127 -#, fuzzy -msgid "Are you sure you want to delete it? (y/N) " -msgstr "Vill du verkligen använda det (j/N)?" - -#: g10/keyedit.c:4189 -#, fuzzy -msgid "Enter the notation: " -msgstr "Signaturnotering: " - -#: g10/keyedit.c:4338 -#, fuzzy -msgid "Proceed? (y/N) " -msgstr "Skriv över (j/N)? " - -#: g10/keyedit.c:4402 -#, c-format -msgid "No user ID with index %d\n" -msgstr "Ingen användaridentitet med index %d\n" - -#: g10/keyedit.c:4460 -#, fuzzy, c-format -msgid "No user ID with hash %s\n" -msgstr "Ingen användaridentitet med index %d\n" - -#: g10/keyedit.c:4487 -#, fuzzy, c-format -msgid "No subkey with index %d\n" -msgstr "Ingen användaridentitet med index %d\n" - -#: g10/keyedit.c:4622 -#, fuzzy, c-format -msgid "user ID: \"%s\"\n" -msgstr "användaridentitet: \"" - -#: g10/keyedit.c:4625 g10/keyedit.c:4689 g10/keyedit.c:4732 -#, 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:4627 g10/keyedit.c:4691 g10/keyedit.c:4734 -msgid " (non-exportable)" -msgstr " (icke exporterbar)" - -#: g10/keyedit.c:4631 -#, c-format -msgid "This signature expired on %s.\n" -msgstr "Denna signatur gick ut den %s.\n" - -# nyckel? signatur? -#: g10/keyedit.c:4635 -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:4639 -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:4666 -#, 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:4692 -#, fuzzy -msgid " (non-revocable)" -msgstr " (icke exporterbar)" - -#: g10/keyedit.c:4699 -#, fuzzy, c-format -msgid "revoked by your key %s on %s\n" -msgstr " spärrad av %08lX %s\n" - -#: g10/keyedit.c:4721 -msgid "You are about to revoke these signatures:\n" -msgstr "Du står i begrepp att återkalla dessa signaturer:\n" - -#: g10/keyedit.c:4741 -msgid "Really create the revocation certificates? (y/N) " -msgstr "Vill du verkligen skapa spärrcertifikatet? (y/N) " - -#: g10/keyedit.c:4771 -msgid "no secret key\n" -msgstr "ingen hemlig nyckel\n" - -#: g10/keyedit.c:4841 -#, c-format -msgid "user ID \"%s\" is already revoked\n" -msgstr "Användar-ID \"%s\" är redan spärrad\n" - -#: g10/keyedit.c:4858 -#, 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:4922 -#, fuzzy, c-format -msgid "Key %s is already revoked.\n" -msgstr "Användar-ID \"%s\" är redan spärrad\n" - -#: g10/keyedit.c:4984 -#, fuzzy, c-format -msgid "Subkey %s is already revoked.\n" -msgstr "Användar-ID \"%s\" är redan spärrad\n" - -#: g10/keyedit.c:5079 -#, 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:1421 -#, 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:1324 -#, 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:1328 -#, fuzzy, c-format -msgid "sending key %s to %s\n" -msgstr "begär nyckel %08lX från %s\n" - -#: g10/keyserver.c:1371 -#, 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:1374 -#, fuzzy, c-format -msgid "searching for \"%s\" from %s\n" -msgstr "söker \"%s\" från HKP-server %s\n" - -#: g10/keyserver.c:1381 g10/keyserver.c:1477 -#, fuzzy -msgid "no keyserver action!\n" -msgstr "nyckelserverfel" - -#: g10/keyserver.c:1429 -#, c-format -msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n" -msgstr "" - -#: g10/keyserver.c:1438 -msgid "keyserver did not send VERSION\n" -msgstr "" - -#: g10/keyserver.c:1500 g10/keyserver.c:2028 -msgid "no keyserver known (use option --keyserver)\n" -msgstr "" - -#: g10/keyserver.c:1506 -msgid "external keyserver calls are not supported in this build\n" -msgstr "" - -#: g10/keyserver.c:1518 -#, c-format -msgid "no handler for keyserver scheme `%s'\n" -msgstr "" - -#: g10/keyserver.c:1523 -#, c-format -msgid "action `%s' not supported with keyserver scheme `%s'\n" -msgstr "" - -#: g10/keyserver.c:1531 -#, c-format -msgid "%s does not support handler version %d\n" -msgstr "" - -#: g10/keyserver.c:1538 -#, fuzzy -msgid "keyserver timed out\n" -msgstr "nyckelserverfel" - -#: g10/keyserver.c:1543 -#, fuzzy -msgid "keyserver internal error\n" -msgstr "nyckelserverfel" - -#: g10/keyserver.c:1552 -#, fuzzy, c-format -msgid "keyserver communications error: %s\n" -msgstr "Hämtning från nyckelservern misslyckades: %s\n" - -#: g10/keyserver.c:1577 g10/keyserver.c:1611 -#, c-format -msgid "\"%s\" not a key ID: skipping\n" -msgstr "" - -#: g10/keyserver.c:1870 -#, 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:1892 -#, fuzzy, c-format -msgid "refreshing 1 key from %s\n" -msgstr "begär nyckel %08lX från %s\n" - -#: g10/keyserver.c:1894 -#, fuzzy, c-format -msgid "refreshing %d keys from %s\n" -msgstr "begär nyckel %08lX från %s\n" - -#: g10/keyserver.c:1950 -#, 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:1956 -#, 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:305 -#, c-format -msgid "assuming signed data in `%s'\n" -msgstr "antar att signera data finns i filen \"%s\"\n" - -#: g10/openfile.c:384 -#, c-format -msgid "new configuration file `%s' created\n" -msgstr "ny konfigurationsfil `%s'skapad\n" - -#: g10/openfile.c:386 -#, 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:418 -#, 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:1157 -#, 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:968 -#, 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:973 -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:977 -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:127 g10/skclist.c:191 -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:158 -#, fuzzy, c-format -msgid "skipped \"%s\": duplicated\n" -msgstr "hoppade över \"%s\": förekommer flera gånger\n" - -#: g10/skclist.c:166 g10/skclist.c:176 g10/skclist.c:185 -#, fuzzy, c-format -msgid "skipped \"%s\": %s\n" -msgstr "hoppade över `%s': %s\n" - -#: g10/skclist.c:171 -msgid "skipped: secret key already present\n" -msgstr "hoppade över: hemlig nyckel finns redan\n" - -#: g10/skclist.c:186 -#, 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:350 -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:351 -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 "User ID \"%s\": %d signature removed.\n" -#~ msgstr "Användar-ID \"%s\" är spärrat." - -#, fuzzy -#~ msgid "User ID \"%s\": %d signatures removed.\n" -#~ msgstr "Användar-ID \"%s\" är spärrat." - -#, fuzzy -#~ msgid "User ID \"%s\" removed: %s\n" -#~ msgstr "Användar-ID \"%s\" är spärrat." - -#, 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.po b/po/tr.po deleted file mode 100644 index 3234887d6..000000000 --- a/po/tr.po +++ /dev/null @@ -1,7022 +0,0 @@ -# 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-07-28 11:12+0200\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:1003 g10/gpg.c:3461 g10/import.c:195 g10/keygen.c:2385 -#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:342 -#: 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:1002 g10/keygen.c:2864 -#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:263 -#: g10/openfile.c:357 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:320 -#, c-format -msgid "armor: %s\n" -msgstr "zırh: %s\n" - -#: g10/armor.c:359 -msgid "invalid armor header: " -msgstr "zırh başlığı geçersiz: " - -#: g10/armor.c:370 -msgid "armor header: " -msgstr "zırh başlığı: " - -#: g10/armor.c:381 -msgid "invalid clearsig header\n" -msgstr "açıkça okunabilen imza başlığı geçersiz\n" - -#: g10/armor.c:433 -msgid "nested clear text signatures\n" -msgstr "açıkça okunabilen imzalar dahil edildi\n" - -#: g10/armor.c:568 -msgid "unexpected armor: " -msgstr "beklenmeyen zırh: " - -#: g10/armor.c:580 -msgid "invalid dash escaped line: " -msgstr "araçizgisi escape'lı satır geçersiz: " - -#: g10/armor.c:734 g10/armor.c:1343 -#, c-format -msgid "invalid radix64 character %02X skipped\n" -msgstr "geçersiz radix64 karakteri %02X atlandı\n" - -#: g10/armor.c:777 -msgid "premature eof (no CRC)\n" -msgstr "dosya sonu belirsiz (CRC yok)\n" - -#: g10/armor.c:811 -msgid "premature eof (in CRC)\n" -msgstr "dosya sonu belirsiz (CRC içinde)\n" - -#: g10/armor.c:819 -msgid "malformed CRC\n" -msgstr "CRC bozulmuş\n" - -#: g10/armor.c:823 g10/armor.c:1380 -#, c-format -msgid "CRC error; %06lX - %06lX\n" -msgstr "CRC hatası; %06lX - %06lX\n" - -#: g10/armor.c:843 -msgid "premature eof (in trailer)\n" -msgstr "dosya sonu belirsiz (kuyruk içinde)\n" - -#: g10/armor.c:847 -msgid "error in trailer line\n" -msgstr "kuyruk satırında hata\n" - -#: g10/armor.c:1158 -msgid "no valid OpenPGP data found.\n" -msgstr "geçerli OpenPGP verisi yok\n" - -#: g10/armor.c:1163 -#, 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:1167 -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:280 -#, 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:3826 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:3387 g10/keyserver.c:1700 -#: 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:2349 g10/keyserver.c:1714 -#: 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:67 g10/mainproc.c:293 -#, c-format -msgid "%s encrypted data\n" -msgstr "%s şifreli veri\n" - -#: g10/encr-data.c:69 g10/mainproc.c:297 -#, c-format -msgid "encrypted with unknown algorithm %d\n" -msgstr "bilinmeyen algoritma %d ile şifrelenmiş\n" - -#: g10/encr-data.c:93 -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:104 -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:415 -#, 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:375 -msgid "" -"@Commands:\n" -" " -msgstr "" -"@Komutlar:\n" -" " - -#: g10/gpg.c:377 -msgid "|[file]|make a signature" -msgstr "|[dosya]|bir imza yapar" - -#: g10/gpg.c:378 -msgid "|[file]|make a clear text signature" -msgstr "|[dosya]|açıkça okunabilen bir imza yapar" - -#: g10/gpg.c:379 -msgid "make a detached signature" -msgstr "bağımsız bir imza yapar" - -#: g10/gpg.c:380 -msgid "encrypt data" -msgstr "veriyi şifreler" - -#: g10/gpg.c:382 -msgid "encryption only with symmetric cipher" -msgstr "sadece simetrik şifre ile şifreler" - -#: g10/gpg.c:384 -msgid "decrypt data (default)" -msgstr "veri şifresini açar (öntanımlı)" - -#: g10/gpg.c:386 -msgid "verify a signature" -msgstr "bir imzayı doğrular" - -#: g10/gpg.c:388 -msgid "list keys" -msgstr "anahtarları listeler" - -#: g10/gpg.c:390 -msgid "list keys and signatures" -msgstr "anahtarları ve imzaları listeler" - -#: g10/gpg.c:391 -msgid "list and check key signatures" -msgstr "anahtar imzalarını listeler ve sınar" - -#: g10/gpg.c:392 -msgid "list keys and fingerprints" -msgstr "anahtarları ve parmak izlerini listeler" - -#: g10/gpg.c:393 -msgid "list secret keys" -msgstr "gizli anahtarları listeler" - -#: g10/gpg.c:394 -msgid "generate a new key pair" -msgstr "yeni bir anahtar çifti üretir" - -#: g10/gpg.c:395 -msgid "remove keys from the public keyring" -msgstr "anahtarları genel anahtar zincirinden siler" - -#: g10/gpg.c:397 -msgid "remove keys from the secret keyring" -msgstr "anahtarları gizli anahtar zincirinden siler" - -#: g10/gpg.c:398 -msgid "sign a key" -msgstr "bir anahtarı imzalar" - -#: g10/gpg.c:399 -msgid "sign a key locally" -msgstr "bir anahtarı yerel olarak imzalar" - -#: g10/gpg.c:400 -msgid "sign or edit a key" -msgstr "bir anahtarı düzenler ve imzalar" - -#: g10/gpg.c:401 -msgid "generate a revocation certificate" -msgstr "bir yürürlükten kaldırma sertifikası üretir" - -#: g10/gpg.c:403 -msgid "export keys" -msgstr "anahtarları gönderir" - -#: g10/gpg.c:404 -msgid "export keys to a key server" -msgstr "anahtarları bir anahtar sunucusuna gönderir" - -#: g10/gpg.c:405 -msgid "import keys from a key server" -msgstr "anahtarları bir anahtar sunucusundan indirir" - -#: g10/gpg.c:407 -msgid "search for keys on a key server" -msgstr "bir anahtar sunucusunda anahtarları arar" - -#: g10/gpg.c:409 -msgid "update all keys from a keyserver" -msgstr "anahtarları bir anahtar sunucusundan günceller" - -#: g10/gpg.c:413 -msgid "import/merge keys" -msgstr "anahtarları indirir/katıştırır" - -#: g10/gpg.c:416 -msgid "print the card status" -msgstr "kart durumunu basar" - -#: g10/gpg.c:417 -msgid "change data on a card" -msgstr "kart üzerindeki veriyi değiştirir" - -#: g10/gpg.c:418 -msgid "change a card's PIN" -msgstr "bir kartın PIN'ini değiştirir" - -#: g10/gpg.c:426 -msgid "update the trust database" -msgstr "güvence veritabanını günceller" - -#: g10/gpg.c:433 -msgid "|algo [files]|print message digests" -msgstr "|algo [dosyalar]|ileti özümlemelerini gösterir" - -#: g10/gpg.c:437 g10/gpgv.c:71 -msgid "" -"@\n" -"Options:\n" -" " -msgstr "" -"@\n" -"Seçenekler:\n" -" " - -#: g10/gpg.c:439 -msgid "create ascii armored output" -msgstr "ascii zırhlı çıktı oluşturur" - -#: g10/gpg.c:441 -msgid "|NAME|encrypt for NAME" -msgstr "|İSİM|İSİM için şifreleme yapar" - -#: g10/gpg.c:452 -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:453 -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:458 -msgid "use canonical text mode" -msgstr "kurallı metin kipini kullanır" - -#: g10/gpg.c:472 -msgid "use as output file" -msgstr "çıktı dosyası olarak kullanılır" - -#: g10/gpg.c:474 g10/gpgv.c:73 -msgid "verbose" -msgstr "çok detaylı" - -#: g10/gpg.c:485 -msgid "do not make any changes" -msgstr "hiçbir değişiklik yapmaz" - -#: g10/gpg.c:486 -msgid "prompt before overwriting" -msgstr "üzerine yazmadan önce sorar" - -#: g10/gpg.c:527 -msgid "use strict OpenPGP behavior" -msgstr "kesin OpenPGP davranışı etkin olur" - -#: g10/gpg.c:528 -msgid "generate PGP 2.x compatible messages" -msgstr "PGP 2.x uyumlu iletiler üretilir" - -#: g10/gpg.c:556 -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:559 -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:757 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:774 -msgid "Usage: gpg [options] [files] (-h for help)" -msgstr "Kullanımı: gpg [seçenekler] [dosyalar] (yardım için -h)" - -#: g10/gpg.c:777 -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:788 -msgid "" -"\n" -"Supported algorithms:\n" -msgstr "" -"\n" -"Desteklenen algoritmalar:\n" - -#: g10/gpg.c:791 -msgid "Pubkey: " -msgstr "GenAnah: " - -#: g10/gpg.c:797 g10/keyedit.c:2310 -msgid "Cipher: " -msgstr "Şifre: " - -#: g10/gpg.c:803 -msgid "Hash: " -msgstr "Hash: " - -#: g10/gpg.c:809 g10/keyedit.c:2356 -msgid "Compression: " -msgstr "Sıkıştırma: " - -#: g10/gpg.c:892 -msgid "usage: gpg [options] " -msgstr "kullanımı: gpg [seçenekler] " - -#: g10/gpg.c:1040 -msgid "conflicting commands\n" -msgstr "çelişen komutlar\n" - -#: g10/gpg.c:1058 -#, 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:1255 -#, c-format -msgid "WARNING: unsafe ownership on homedir `%s'\n" -msgstr "UYARI: '%s' evdizininde güvensiz iyelik\n" - -#: g10/gpg.c:1258 -#, 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:1261 -#, c-format -msgid "WARNING: unsafe ownership on extension `%s'\n" -msgstr "UYARI: '%s' eklentisinde güvensiz iyelik\n" - -#: g10/gpg.c:1267 -#, c-format -msgid "WARNING: unsafe permissions on homedir `%s'\n" -msgstr "UYARI: UYARI: '%s' evdizininde güvensiz izinler\n" - -#: g10/gpg.c:1270 -#, 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:1273 -#, c-format -msgid "WARNING: unsafe permissions on extension `%s'\n" -msgstr "UYARI: '%s' eklentisinde güvensiz izinler\n" - -#: g10/gpg.c:1279 -#, 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:1282 -#, 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:1285 -#, 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:1291 -#, 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:1294 -#, 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:1297 -#, 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:1438 -#, c-format -msgid "unknown configuration item `%s'\n" -msgstr "yapılandırma öğesi '%s' bilinmiyor\n" - -#: g10/gpg.c:1531 -msgid "display photo IDs during key listings" -msgstr "" - -#: g10/gpg.c:1533 -msgid "show policy URLs during signature listings" -msgstr "" - -#: g10/gpg.c:1535 -#, fuzzy -msgid "show all notations during signature listings" -msgstr "Gizli anahtar demetinde uygun/benzer imza yok\n" - -#: g10/gpg.c:1537 -msgid "show IETF standard notations during signature listings" -msgstr "" - -#: g10/gpg.c:1541 -msgid "show user-supplied notations during signature listings" -msgstr "" - -#: g10/gpg.c:1543 -#, fuzzy -msgid "show preferred keyserver URLs during signature listings" -msgstr "belirtilen anahtar sunucusu adresi geçersiz\n" - -#: g10/gpg.c:1545 -msgid "show user ID validity during key listings" -msgstr "" - -#: g10/gpg.c:1547 -msgid "show revoked and expired user IDs in key listings" -msgstr "" - -#: g10/gpg.c:1549 -msgid "show revoked and expired subkeys in key listings" -msgstr "" - -#: g10/gpg.c:1551 -#, fuzzy -msgid "show the keyring name in key listings" -msgstr "listedeki bir anahtarın hangi anahtar zincirinde olduğunu gösterir" - -#: g10/gpg.c:1553 -#, fuzzy -msgid "show expiration dates during signature listings" -msgstr "Gizli anahtar demetinde uygun/benzer imza yok\n" - -#: g10/gpg.c:1920 -#, 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:1962 -#, c-format -msgid "NOTE: no default option file `%s'\n" -msgstr "BİLGİ: \"%s\" öntanımlı seçenek dosyası yok\n" - -#: g10/gpg.c:1966 -#, c-format -msgid "option file `%s': %s\n" -msgstr "seçenek dosyası \"%s\": %s\n" - -#: g10/gpg.c:1973 -#, c-format -msgid "reading options from `%s'\n" -msgstr "\"%s\"den seçenekler okunuyor\n" - -#: g10/gpg.c:2188 g10/gpg.c:2814 g10/gpg.c:2833 -#, 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:2201 -#, 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:2364 g10/gpg.c:2376 -#, 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:2452 -#, 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:2476 g10/gpg.c:2663 g10/keyedit.c:4064 -msgid "could not parse keyserver URL\n" -msgstr "anahtar sunucusunun adresi çözümlenemedi\n" - -#: g10/gpg.c:2488 -#, c-format -msgid "%s:%d: invalid keyserver options\n" -msgstr "%s:%d: anahtar sunucusu seçenekleri geçersiz\n" - -#: g10/gpg.c:2491 -msgid "invalid keyserver options\n" -msgstr "anahtar sunucusu seçenekleri geçersiz\n" - -#: g10/gpg.c:2498 -#, c-format -msgid "%s:%d: invalid import options\n" -msgstr "%s:%d: geçersiz içselleştirme seçenekleri\n" - -#: g10/gpg.c:2501 -msgid "invalid import options\n" -msgstr "içselleştirme seçenekleri geçersiz\n" - -#: g10/gpg.c:2508 -#, c-format -msgid "%s:%d: invalid export options\n" -msgstr "%s:%d geçersiz dışsallaştırma seçenekleri\n" - -#: g10/gpg.c:2511 -msgid "invalid export options\n" -msgstr "dışsallaştırma seçenekleri geçersiz\n" - -#: g10/gpg.c:2518 -#, c-format -msgid "%s:%d: invalid list options\n" -msgstr "%s:%d: liste seçenekleri geçersiz\n" - -#: g10/gpg.c:2521 -msgid "invalid list options\n" -msgstr "liste seçenekleri geçersiz\n" - -#: g10/gpg.c:2529 -msgid "display photo IDs during signature verification" -msgstr "" - -#: g10/gpg.c:2531 -msgid "show policy URLs during signature verification" -msgstr "" - -#: g10/gpg.c:2533 -#, fuzzy -msgid "show all notations during signature verification" -msgstr "'%s' geçerli bir karakter kümesi değil\n" - -#: g10/gpg.c:2535 -msgid "show IETF standard notations during signature verification" -msgstr "" - -#: g10/gpg.c:2539 -msgid "show user-supplied notations during signature verification" -msgstr "" - -#: g10/gpg.c:2541 -#, fuzzy -msgid "show preferred keyserver URLs during signature verification" -msgstr "belirtilen anahtar sunucusu adresi geçersiz\n" - -#: g10/gpg.c:2543 -#, fuzzy -msgid "show user ID validity during signature verification" -msgstr "'%s' geçerli bir karakter kümesi değil\n" - -#: g10/gpg.c:2545 -msgid "show revoked and expired user IDs in signature verification" -msgstr "" - -#: g10/gpg.c:2547 -msgid "validate signatures with PKA data" -msgstr "" - -#: g10/gpg.c:2549 -msgid "elevate the trust of signatures with valid PKA data" -msgstr "" - -#: g10/gpg.c:2556 -#, c-format -msgid "%s:%d: invalid verify options\n" -msgstr "%s:%d doğrulama seçenekleri geçersiz\n" - -#: g10/gpg.c:2559 -msgid "invalid verify options\n" -msgstr "doğrulama seçenekleri geçersiz\n" - -#: g10/gpg.c:2566 -#, 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:2729 -#, 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:2732 -msgid "invalid auto-key-locate list\n" -msgstr "" - -#: g10/gpg.c:2803 -msgid "WARNING: program may create a core file!\n" -msgstr "UYARI: program bir \"core\" dosyası oluşturabilir!\n" - -#: g10/gpg.c:2807 -#, c-format -msgid "WARNING: %s overrides %s\n" -msgstr "UYARI: %s %s'i aşıyor\n" - -#: g10/gpg.c:2816 -#, c-format -msgid "%s not allowed with %s!\n" -msgstr "%s ile %s birlikte kullanılmaz!\n" - -#: g10/gpg.c:2819 -#, c-format -msgid "%s makes no sense with %s!\n" -msgstr "%s, %s ile etkisiz olur!\n" - -#: g10/gpg.c:2826 -#, fuzzy, c-format -msgid "NOTE: %s is not available in this version\n" -msgstr "gpg-agent bu oturumda kullanılamaz\n" - -#: g10/gpg.c:2841 -#, 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:2855 -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:2861 -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:2867 -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:2880 -msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n" -msgstr "--pgp2 kipinde ileti şifrelemesi IDEA şifresi gerektirir\n" - -#: g10/gpg.c:2947 g10/gpg.c:2971 -msgid "selected cipher algorithm is invalid\n" -msgstr "seçilen şifre algoritması geçersiz\n" - -#: g10/gpg.c:2953 g10/gpg.c:2977 -msgid "selected digest algorithm is invalid\n" -msgstr "seçilen özümleme algoritması geçersiz\n" - -#: g10/gpg.c:2959 -msgid "selected compression algorithm is invalid\n" -msgstr "seçilen şifre algoritması geçersiz\n" - -#: g10/gpg.c:2965 -msgid "selected certification digest algorithm is invalid\n" -msgstr "seçilen sertifikalama özümleme algoritması geçersiz\n" - -#: g10/gpg.c:2980 -msgid "completes-needed must be greater than 0\n" -msgstr "\"completes-needed\" 0 dan büyük olmalı\n" - -#: g10/gpg.c:2982 -msgid "marginals-needed must be greater than 1\n" -msgstr "\"marginals-needed\" 1 den büyük olmalı\n" - -#: g10/gpg.c:2984 -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:2986 -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:2988 -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:2991 -msgid "NOTE: simple S2K mode (0) is strongly discouraged\n" -msgstr "BİLGİ: basit S2K kipi (0) kesinlikle tavsiye edilmez\n" - -#: g10/gpg.c:2995 -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:3002 -msgid "invalid default preferences\n" -msgstr "öntanımlı tercihler geçersiz\n" - -#: g10/gpg.c:3011 -msgid "invalid personal cipher preferences\n" -msgstr "kişisel şifre tercihleri geçersiz\n" - -#: g10/gpg.c:3015 -msgid "invalid personal digest preferences\n" -msgstr "kişisel özümleme tercihleri geçersiz\n" - -#: g10/gpg.c:3019 -msgid "invalid personal compress preferences\n" -msgstr "kişisel sıkıştırma tercihleri geçersiz\n" - -#: g10/gpg.c:3052 -#, c-format -msgid "%s does not yet work with %s\n" -msgstr "%s, %s ile henüz çalışmıyor\n" - -#: g10/gpg.c:3099 -#, 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:3104 -#, 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:3109 -#, 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:3208 -#, 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:3219 -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:3230 -msgid "--store [filename]" -msgstr "--store [dosyaismi]" - -#: g10/gpg.c:3237 -msgid "--symmetric [filename]" -msgstr "--symmetric [dosyaismi]" - -#: g10/gpg.c:3239 -#, 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:3249 -msgid "--encrypt [filename]" -msgstr "--encrypt [dosyaismi]" - -#: g10/gpg.c:3262 -msgid "--symmetric --encrypt [filename]" -msgstr "--symmetric --encrypt [dosyaismi]" - -#: g10/gpg.c:3264 -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:3267 -#, 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:3285 -msgid "--sign [filename]" -msgstr "--sign [dosyaismi]" - -#: g10/gpg.c:3298 -msgid "--sign --encrypt [filename]" -msgstr "--sign --encrypt [dosyaismi]" - -#: g10/gpg.c:3313 -msgid "--symmetric --sign --encrypt [filename]" -msgstr "--symmetric --sign --encrypt [dosyaismi]" - -#: g10/gpg.c:3315 -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:3318 -#, 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:3338 -msgid "--sign --symmetric [filename]" -msgstr "--sign --symmetric [DOSYA]" - -#: g10/gpg.c:3347 -msgid "--clearsign [filename]" -msgstr "--clearsign [dosyaismi]" - -#: g10/gpg.c:3372 -msgid "--decrypt [filename]" -msgstr "--decrypt [dosyaismi]" - -#: g10/gpg.c:3380 -msgid "--sign-key user-id" -msgstr "--sign-key kullanıcı-kimliği" - -#: g10/gpg.c:3384 -msgid "--lsign-key user-id" -msgstr "--lsign-key kullanıcı-kimliği" - -#: g10/gpg.c:3405 -msgid "--edit-key user-id [commands]" -msgstr "--edit-key kullanıcı-kimliği [komutlar]" - -#: g10/gpg.c:3476 -msgid "-k[v][v][v][c] [user-id] [keyring]" -msgstr "-k[v][v][v][c] [kullanıcı-kimliği] [anahtar-zinciri]" - -#: g10/gpg.c:3518 -#, 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:3520 -#, 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:3522 -#, c-format -msgid "key export failed: %s\n" -msgstr "anahtar ihracı başarısızlığa uğradı: %s\n" - -#: g10/gpg.c:3533 -#, c-format -msgid "keyserver search failed: %s\n" -msgstr "anahtar sunucusunda arama başarısız: %s\n" - -#: g10/gpg.c:3543 -#, c-format -msgid "keyserver refresh failed: %s\n" -msgstr "anahtar sunucusunda tazeleme başarısız: %s\n" - -#: g10/gpg.c:3594 -#, c-format -msgid "dearmoring failed: %s\n" -msgstr "zırhın kaldırılması başarısız: %s\n" - -#: g10/gpg.c:3602 -#, c-format -msgid "enarmoring failed: %s\n" -msgstr "zırhlama başarısız: %s\n" - -#: g10/gpg.c:3689 -#, c-format -msgid "invalid hash algorithm `%s'\n" -msgstr "`%s' hash algoritması geçersiz\n" - -#: g10/gpg.c:3812 -msgid "[filename]" -msgstr "[dosyaismi]" - -#: g10/gpg.c:3816 -msgid "Go ahead and type your message ...\n" -msgstr "İletinizi yazın ...\n" - -#: g10/gpg.c:4120 -msgid "the given certification policy URL is invalid\n" -msgstr "belirtilen sertifika güvence adresi geçersiz\n" - -#: g10/gpg.c:4122 -msgid "the given signature policy URL is invalid\n" -msgstr "belirtilen imza güvence adresi geçersiz\n" - -#: g10/gpg.c:4155 -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:3707 -#, 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:266 -#, c-format -msgid "skipping block of type %d\n" -msgstr "%d. tür blok atlandı\n" - -#: g10/import.c:275 -#, c-format -msgid "%lu keys processed so far\n" -msgstr "şu ana kadar %lu anahtar işlendi\n" - -#: g10/import.c:292 -#, c-format -msgid "Total number processed: %lu\n" -msgstr "İşlenmiş toplam miktar: %lu\n" - -#: g10/import.c:294 -#, c-format -msgid " skipped new keys: %lu\n" -msgstr " yeni anahtarlar atlandı: %lu\n" - -#: g10/import.c:297 -#, c-format -msgid " w/o user IDs: %lu\n" -msgstr " kullanıcı kimliksiz: %lu\n" - -#: g10/import.c:299 -#, c-format -msgid " imported: %lu" -msgstr " alınan: %lu" - -#: g10/import.c:305 -#, c-format -msgid " unchanged: %lu\n" -msgstr " değişmedi: %lu\n" - -#: g10/import.c:307 -#, c-format -msgid " new user IDs: %lu\n" -msgstr " yeni kullanıcı kimliği: %lu\n" - -#: g10/import.c:309 -#, c-format -msgid " new subkeys: %lu\n" -msgstr " yeni yardımcı anahtarlar: %lu\n" - -#: g10/import.c:311 -#, c-format -msgid " new signatures: %lu\n" -msgstr " yeni imzalar: %lu\n" - -#: g10/import.c:313 -#, c-format -msgid " new key revocations: %lu\n" -msgstr " yeni anahtar iptalleri: %lu\n" - -#: g10/import.c:315 -#, c-format -msgid " secret keys read: %lu\n" -msgstr " gizli anahtarlar okundu: %lu\n" - -#: g10/import.c:317 -#, c-format -msgid " secret keys imported: %lu\n" -msgstr " gizli anahtarlar indirildi: %lu\n" - -#: g10/import.c:319 -#, c-format -msgid " secret keys unchanged: %lu\n" -msgstr " gizli anahtarlar değişmedi: %lu\n" - -#: g10/import.c:321 -#, c-format -msgid " not imported: %lu\n" -msgstr " alınamadı: %lu\n" - -#: g10/import.c:323 -#, fuzzy, c-format -msgid " signatures cleaned: %lu\n" -msgstr "şu ana kadar oluşturulan imzalar: %lu\n" - -#: g10/import.c:325 -#, fuzzy, c-format -msgid " user IDs cleaned: %lu\n" -msgstr " gizli anahtarlar okundu: %lu\n" - -#: g10/import.c:566 -#, 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:570 -#, fuzzy -msgid " algorithms on these user IDs:\n" -msgstr "Bu kullanıcı kimlikler için algoritmalar:\n" - -#: g10/import.c:607 -#, c-format -msgid " \"%s\": preference for cipher algorithm %s\n" -msgstr " \"%s\": şifreleme algoritması %s için tercih edilir\n" - -#: g10/import.c:619 -#, c-format -msgid " \"%s\": preference for digest algorithm %s\n" -msgstr " \"%s\": özümleme algoritması %s için tercih edilir\n" - -#: g10/import.c:631 -#, 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:644 -msgid "it is strongly suggested that you update your preferences and\n" -msgstr "tercihlerinizi güncellemenizi ve\n" - -#: g10/import.c:646 -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:670 -#, 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:720 g10/import.c:1118 -#, c-format -msgid "key %s: no user ID\n" -msgstr "anahtar %s: kullanıcı kimliği yok\n" - -#: g10/import.c:749 -#, c-format -msgid "key %s: PKS subkey corruption repaired\n" -msgstr "anahtar %s: PKS yardımcı anahtar bozulması giderildi\n" - -#: g10/import.c:764 -#, 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:770 -#, c-format -msgid "key %s: no valid user IDs\n" -msgstr "anahtar %s: geçerli kullanıcı kimliği yok\n" - -#: g10/import.c:772 -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:782 g10/import.c:1240 -#, c-format -msgid "key %s: public key not found: %s\n" -msgstr "anahtar %s: genel anahtar yok: %s\n" - -#: g10/import.c:788 -#, c-format -msgid "key %s: new key - skipped\n" -msgstr "anahtar %s: yeni anahtar - atlandı\n" - -#: g10/import.c:797 -#, c-format -msgid "no writable keyring found: %s\n" -msgstr "yazılabilir bir anahtar zinciri yok: %s\n" - -#: g10/import.c:802 g10/openfile.c:267 g10/sign.c:831 g10/sign.c:1135 -#, c-format -msgid "writing to `%s'\n" -msgstr "\"%s\"e yazıyor\n" - -#: g10/import.c:806 g10/import.c:901 g10/import.c:1158 g10/import.c:1301 -#: g10/import.c:2363 g10/import.c:2385 -#, c-format -msgid "error writing keyring `%s': %s\n" -msgstr "\"%s\" anahtar zincirine yazarken hata oluştu: %s\n" - -#: g10/import.c:825 -#, c-format -msgid "key %s: public key \"%s\" imported\n" -msgstr "anahtar %s: genel anahtar \"%s\" alındı\n" - -#: g10/import.c:849 -#, c-format -msgid "key %s: doesn't match our copy\n" -msgstr "anahtar %s: bizim kopyamızla eşleşmiyor\n" - -#: g10/import.c:866 g10/import.c:1258 -#, 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:874 g10/import.c:1265 -#, 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:911 -#, 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:914 -#, 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:917 -#, c-format -msgid "key %s: \"%s\" 1 new signature\n" -msgstr "anahtar %s: \"%s\" 1 yeni imza\n" - -#: g10/import.c:920 -#, c-format -msgid "key %s: \"%s\" %d new signatures\n" -msgstr "anahtar %s: \"%s\" %d yeni imza\n" - -#: g10/import.c:923 -#, c-format -msgid "key %s: \"%s\" 1 new subkey\n" -msgstr "anahtar %s: %s 1 yeni yardımcı anahtar\n" - -#: g10/import.c:926 -#, c-format -msgid "key %s: \"%s\" %d new subkeys\n" -msgstr "anahtar %s: \"%s\" %d yeni yardımcı anahtar\n" - -#: g10/import.c:929 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signature cleaned\n" -msgstr "anahtar %s: \"%s\" %d yeni imza\n" - -#: g10/import.c:932 -#, fuzzy, c-format -msgid "key %s: \"%s\" %d signatures cleaned\n" -msgstr "anahtar %s: \"%s\" %d yeni imza\n" - -#: g10/import.c:935 -#, 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:938 -#, 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:961 -#, c-format -msgid "key %s: \"%s\" not changed\n" -msgstr "anahtar %s: \"%s\" değişmedi\n" - -#: g10/import.c:1124 -#, 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:1135 -msgid "importing secret keys not allowed\n" -msgstr "gizli anahtarı alımına izin verilmez\n" - -#: g10/import.c:1152 g10/import.c:2378 -#, c-format -msgid "no default secret keyring: %s\n" -msgstr "öntanımlı gizli anahtar zinciri yok: %s\n" - -#: g10/import.c:1163 -#, c-format -msgid "key %s: secret key imported\n" -msgstr "anahtar %s: gizli anahtar alındı\n" - -#: g10/import.c:1193 -#, c-format -msgid "key %s: already in secret keyring\n" -msgstr "anahtar %s: zaten gizli anahtar zincirinde\n" - -#: g10/import.c:1203 -#, c-format -msgid "key %s: secret key not found: %s\n" -msgstr "anahtar %s: gizli anahtar yok: %s\n" - -#: g10/import.c:1233 -#, 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:1276 -#, 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:1308 -#, 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:1374 -#, 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:1389 -#, 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:1391 -#, 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:1409 -#, 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:1420 g10/import.c:1470 -#, c-format -msgid "key %s: unsupported public key algorithm\n" -msgstr "anahtar %s: genel anahtar algoritması desteklenmiyor\n" - -#: g10/import.c:1422 -#, c-format -msgid "key %s: invalid subkey binding\n" -msgstr "anahtar %s: yardımcı anahtar garantileme geçersiz\n" - -#: g10/import.c:1437 -#, 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:1459 -#, 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:1472 -#, 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:1487 -#, 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:1529 -#, c-format -msgid "key %s: skipped user ID \"%s\"\n" -msgstr "anahtar %s: kullanıcı kimliği \"%s\" atlandı\n" - -#: g10/import.c:1550 -#, c-format -msgid "key %s: skipped subkey\n" -msgstr "anahtar %s: yardımcı anahtar atlandı\n" - -#: g10/import.c:1577 -#, 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:1587 -#, 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:1604 -#, 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:1618 -#, 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:1626 -#, 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:1726 -#, 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:1788 -#, 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:1802 -#, 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:1861 -#, 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:1895 -#, c-format -msgid "key %s: direct key signature added\n" -msgstr "anahtar %s: doğrudan anahtar imzası eklendi\n" - -#: g10/import.c:2284 -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:2292 -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:2294 -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:4783 g10/keyedit.c:4874 g10/keyedit.c:4938 -#: g10/keyedit.c:4999 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:3346 -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:3249 -#, fuzzy, c-format -msgid "User ID \"%s\": already clean\n" -msgstr "kullanıcı kimliği \"%s\" zaten iptal edilmişti\n" - -#: g10/keyedit.c:3341 -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:3352 -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:3372 -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:3397 -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:3412 -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:3434 -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:3453 -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:3459 -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:3520 -msgid "Please remove selections from the secret keys.\n" -msgstr "Lütfen gizli anahtarlardan seçilenleri silin.\n" - -#: g10/keyedit.c:3526 -msgid "Please select at most one subkey.\n" -msgstr "Lütfen en fazla bir yardımcı anahtar seçin.\n" - -#: g10/keyedit.c:3530 -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:3533 -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:3579 -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:3595 -msgid "No corresponding signature in secret ring\n" -msgstr "Gizli anahtar demetinde uygun/benzer imza yok\n" - -#: g10/keyedit.c:3668 -#, 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:3674 -#, c-format -msgid "subkey %s does not sign and so does not need to be cross-certified\n" -msgstr "" - -#: g10/keyedit.c:3836 -msgid "Please select exactly one user ID.\n" -msgstr "Lütfen sadece ve sadece bir kullanıcı kimlik seçiniz.\n" - -#: g10/keyedit.c:3875 g10/keyedit.c:3985 g10/keyedit.c:4105 g10/keyedit.c:4246 -#, 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:4046 -msgid "Enter your preferred keyserver URL: " -msgstr "Tercih ettiğiniz sunucunun adresini girin: " - -#: g10/keyedit.c:4126 -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:4127 -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:4189 -#, fuzzy -msgid "Enter the notation: " -msgstr "imza niteleyici: " - -#: g10/keyedit.c:4338 -#, fuzzy -msgid "Proceed? (y/N) " -msgstr "Üzerine yazılsın mı? (e/H ya da y/N) " - -#: g10/keyedit.c:4402 -#, c-format -msgid "No user ID with index %d\n" -msgstr "%d endeksine sahip kullanıcı kimliği yok\n" - -#: g10/keyedit.c:4460 -#, fuzzy, c-format -msgid "No user ID with hash %s\n" -msgstr "%d endeksine sahip kullanıcı kimliği yok\n" - -#: g10/keyedit.c:4487 -#, c-format -msgid "No subkey with index %d\n" -msgstr "%d indisli bir yardımcı anahtar yok\n" - -#: g10/keyedit.c:4622 -#, c-format -msgid "user ID: \"%s\"\n" -msgstr "Kullanıcı kimliği: \"%s\"\n" - -#: g10/keyedit.c:4625 g10/keyedit.c:4689 g10/keyedit.c:4732 -#, 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:4627 g10/keyedit.c:4691 g10/keyedit.c:4734 -msgid " (non-exportable)" -msgstr " (dışarda geçersiz)" - -#: g10/keyedit.c:4631 -#, c-format -msgid "This signature expired on %s.\n" -msgstr "Bu anahtarın geçerliliği %s de bitti.\n" - -#: g10/keyedit.c:4635 -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:4639 -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:4666 -#, 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:4692 -msgid " (non-revocable)" -msgstr " (yürülükten kaldırılmaz)" - -#: g10/keyedit.c:4699 -#, 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:4721 -msgid "You are about to revoke these signatures:\n" -msgstr "Bu imzaları yürürlükten kaldırmak üzeresiniz:\n" - -#: g10/keyedit.c:4741 -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:4771 -msgid "no secret key\n" -msgstr "gizli anahtar yok\n" - -#: g10/keyedit.c:4841 -#, c-format -msgid "user ID \"%s\" is already revoked\n" -msgstr "kullanıcı kimliği \"%s\" zaten iptal edilmişti\n" - -#: g10/keyedit.c:4858 -#, 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:4922 -#, c-format -msgid "Key %s is already revoked.\n" -msgstr "Anahtar %s zaten yürürlükten kaldırılmış.\n" - -#: g10/keyedit.c:4984 -#, 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:5079 -#, 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:1421 -#, 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:1324 -#, 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:1328 -#, c-format -msgid "sending key %s to %s\n" -msgstr "%s anahtarı %s adresine gönderiliyor\n" - -#: g10/keyserver.c:1371 -#, 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:1374 -#, c-format -msgid "searching for \"%s\" from %s\n" -msgstr "%2$s adresinde \"%1$s\" aranıyor\n" - -#: g10/keyserver.c:1381 g10/keyserver.c:1477 -msgid "no keyserver action!\n" -msgstr "bir anahtar sunucusu eylemi yok!\n" - -#: g10/keyserver.c:1429 -#, 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:1438 -msgid "keyserver did not send VERSION\n" -msgstr "anahtar sunucusu VERSION göndermiyor\n" - -#: g10/keyserver.c:1500 g10/keyserver.c:2028 -msgid "no keyserver known (use option --keyserver)\n" -msgstr "bilinen bir anahtar sunucusu yok (--keyserver seçeneğini kullanın)\n" - -#: g10/keyserver.c:1506 -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:1518 -#, c-format -msgid "no handler for keyserver scheme `%s'\n" -msgstr "`%s' anahtar sunucusu şeması için eylemci yok\n" - -#: g10/keyserver.c:1523 -#, 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:1531 -#, 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:1538 -msgid "keyserver timed out\n" -msgstr "anahtar sunucusu zamanaşımına uğradı\n" - -#: g10/keyserver.c:1543 -msgid "keyserver internal error\n" -msgstr "anahtar sunucusu iç hatası\n" - -#: g10/keyserver.c:1552 -#, c-format -msgid "keyserver communications error: %s\n" -msgstr "anahtar sunucusuyla iletişim hatası: %s\n" - -#: g10/keyserver.c:1577 g10/keyserver.c:1611 -#, c-format -msgid "\"%s\" not a key ID: skipping\n" -msgstr "\"%s\" bir anahtar kimliği değil: atlanıyor\n" - -#: g10/keyserver.c:1870 -#, 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:1892 -#, c-format -msgid "refreshing 1 key from %s\n" -msgstr "1 anahtar %s adresinden tazeleniyor\n" - -#: g10/keyserver.c:1894 -#, c-format -msgid "refreshing %d keys from %s\n" -msgstr "%d anahtar %s adresinden tazeleniyor\n" - -#: g10/keyserver.c:1950 -#, fuzzy, c-format -msgid "WARNING: unable to fetch URI %s: %s\n" -msgstr "UYARI: %s anahtarı %s üzerinden tazelenemiyor: %s\n" - -#: g10/keyserver.c:1956 -#, 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:305 -#, c-format -msgid "assuming signed data in `%s'\n" -msgstr "\"%s\" içindeki veri imzalı kabul ediliyor\n" - -#: g10/openfile.c:384 -#, c-format -msgid "new configuration file `%s' created\n" -msgstr "yeni yapılandırma dosyası `%s' oluşturuldu\n" - -#: g10/openfile.c:386 -#, 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:418 -#, 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:1157 -#, 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:968 -msgid "can't query passphrase in batch mode\n" -msgstr "betik kipinde parola sorgulanamaz\n" - -#: g10/passphrase.c:812 g10/passphrase.c:973 -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:977 -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:127 g10/skclist.c:191 -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:158 -#, c-format -msgid "skipped \"%s\": duplicated\n" -msgstr "\"%s\" atlandı: tekrarlanmış\n" - -#: g10/skclist.c:166 g10/skclist.c:176 g10/skclist.c:185 -#, c-format -msgid "skipped \"%s\": %s\n" -msgstr "\"%s\" atlandı: %s\n" - -#: g10/skclist.c:171 -msgid "skipped: secret key already present\n" -msgstr "atlandı: gizli anahtar zaten var\n" - -#: g10/skclist.c:186 -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:350 -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:351 -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 "User ID \"%s\": %d signature removed.\n" -#~ msgstr "Kullanıcı kimliği \"%s\" yürürlükten kaldırıldı." - -#, fuzzy -#~ msgid "User ID \"%s\": %d signatures removed.\n" -#~ msgstr "Kullanıcı kimliği \"%s\" yürürlükten kaldırıldı." - -#, fuzzy -#~ msgid "User ID \"%s\" removed: %s\n" -#~ msgstr "Kullanıcı kimliği \"%s\" yürürlükten kaldırıldı." - -#, 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.po b/po/zh_CN.po deleted file mode 100644 index 597e82be5..000000000 --- a/po/zh_CN.po +++ /dev/null @@ -1,6106 +0,0 @@ -# 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-07-28 11:12+0200\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:1003 g10/gpg.c:3461 g10/import.c:195 g10/keygen.c:2385 -#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:342 -#: 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:1002 g10/keygen.c:2864 -#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:263 -#: g10/openfile.c:357 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:320 -#, c-format -msgid "armor: %s\n" -msgstr "ASCII 封装:%s\n" - -#: g10/armor.c:359 -msgid "invalid armor header: " -msgstr "无效的 ASCII 封装头:" - -#: g10/armor.c:370 -msgid "armor header: " -msgstr "ASCII 封装头:" - -#: g10/armor.c:381 -msgid "invalid clearsig header\n" -msgstr "无效的明文签名头\n" - -#: g10/armor.c:433 -msgid "nested clear text signatures\n" -msgstr "多层明文签名\n" - -#: g10/armor.c:568 -msgid "unexpected armor: " -msgstr "与预期不符的 ASCII 封装:" - -#: g10/armor.c:580 -msgid "invalid dash escaped line: " -msgstr "以连字符开头的行格式错误:" - -#: g10/armor.c:734 g10/armor.c:1343 -#, c-format -msgid "invalid radix64 character %02X skipped\n" -msgstr "跳过无效的 64 进制字符 %02x\n" - -#: g10/armor.c:777 -msgid "premature eof (no CRC)\n" -msgstr "文件先于预期结束(没有 CRC 部分)\n" - -#: g10/armor.c:811 -msgid "premature eof (in CRC)\n" -msgstr "文件先于预期结束(CRC 部分未结束)\n" - -#: g10/armor.c:819 -msgid "malformed CRC\n" -msgstr "异常的 CRC\n" - -#: g10/armor.c:823 g10/armor.c:1380 -#, c-format -msgid "CRC error; %06lX - %06lX\n" -msgstr "CRC 错误:%06lx - %06lx\n" - -#: g10/armor.c:843 -msgid "premature eof (in trailer)\n" -msgstr "文件先于预期结束(于结尾处)\n" - -#: g10/armor.c:847 -msgid "error in trailer line\n" -msgstr "结尾行有问题\n" - -#: g10/armor.c:1158 -msgid "no valid OpenPGP data found.\n" -msgstr "找不到有效的 OpenPGP 数据。\n" - -#: g10/armor.c:1163 -#, c-format -msgid "invalid armor: line longer than %d characters\n" -msgstr "无效的 ASCII 封装:一行超过 %d 字符\n" - -#: g10/armor.c:1167 -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:280 -#, 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:3826 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:3387 g10/keyserver.c:1700 -#: 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:2349 g10/keyserver.c:1714 -#: 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:67 g10/mainproc.c:293 -#, c-format -msgid "%s encrypted data\n" -msgstr "%s 加密过的数据\n" - -#: g10/encr-data.c:69 g10/mainproc.c:297 -#, c-format -msgid "encrypted with unknown algorithm %d\n" -msgstr "以未知的算法 %d 加密\n" - -#: g10/encr-data.c:93 -msgid "" -"WARNING: message was encrypted with a weak key in the symmetric cipher.\n" -msgstr "警告:报文被使用对称加密算法的弱密钥加密。\n" - -#: g10/encr-data.c:104 -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:415 -#, 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:375 -msgid "" -"@Commands:\n" -" " -msgstr "" -"@指令:\n" -" " - -#: g10/gpg.c:377 -msgid "|[file]|make a signature" -msgstr "|[文件名]|生成一份签名" - -#: g10/gpg.c:378 -msgid "|[file]|make a clear text signature" -msgstr "|[文件名]|生成一份明文签名" - -#: g10/gpg.c:379 -msgid "make a detached signature" -msgstr "生成一份分离的签名" - -#: g10/gpg.c:380 -msgid "encrypt data" -msgstr "加密数据" - -#: g10/gpg.c:382 -msgid "encryption only with symmetric cipher" -msgstr "仅使用对称加密" - -#: g10/gpg.c:384 -msgid "decrypt data (default)" -msgstr "解密数据(默认)" - -#: g10/gpg.c:386 -msgid "verify a signature" -msgstr "验证签名" - -#: g10/gpg.c:388 -msgid "list keys" -msgstr "列出密钥" - -#: g10/gpg.c:390 -msgid "list keys and signatures" -msgstr "列出密钥和签名" - -#: g10/gpg.c:391 -msgid "list and check key signatures" -msgstr "列出并检查密钥签名" - -#: g10/gpg.c:392 -msgid "list keys and fingerprints" -msgstr "列出密钥和指纹" - -#: g10/gpg.c:393 -msgid "list secret keys" -msgstr "列出私钥" - -#: g10/gpg.c:394 -msgid "generate a new key pair" -msgstr "生成一副新的密钥对" - -#: g10/gpg.c:395 -msgid "remove keys from the public keyring" -msgstr "从公钥钥匙环里删除密钥" - -#: g10/gpg.c:397 -msgid "remove keys from the secret keyring" -msgstr "从私钥钥匙环里删除密钥" - -#: g10/gpg.c:398 -msgid "sign a key" -msgstr "为某把密钥添加签名" - -#: g10/gpg.c:399 -msgid "sign a key locally" -msgstr "为某把密钥添加本地签名" - -#: g10/gpg.c:400 -msgid "sign or edit a key" -msgstr "编辑某把密钥或为其添加签名" - -#: g10/gpg.c:401 -msgid "generate a revocation certificate" -msgstr "生成一份吊销证书" - -#: g10/gpg.c:403 -msgid "export keys" -msgstr "导出密钥" - -#: g10/gpg.c:404 -msgid "export keys to a key server" -msgstr "把密钥导出到某个公钥服务器上" - -#: g10/gpg.c:405 -msgid "import keys from a key server" -msgstr "从公钥服务器上导入密钥" - -#: g10/gpg.c:407 -msgid "search for keys on a key server" -msgstr "在公钥服务器上搜寻密钥" - -#: g10/gpg.c:409 -msgid "update all keys from a keyserver" -msgstr "从公钥服务器更新所有的本地密钥" - -#: g10/gpg.c:413 -msgid "import/merge keys" -msgstr "导入/合并密钥" - -#: g10/gpg.c:416 -msgid "print the card status" -msgstr "打印卡状态" - -#: g10/gpg.c:417 -msgid "change data on a card" -msgstr "更改卡上的数据" - -#: g10/gpg.c:418 -msgid "change a card's PIN" -msgstr "更改卡的 PIN" - -#: g10/gpg.c:426 -msgid "update the trust database" -msgstr "更新信任度数据库" - -#: g10/gpg.c:433 -msgid "|algo [files]|print message digests" -msgstr "|算法 [文件]|使用指定的散列算法打印报文散列值" - -#: g10/gpg.c:437 g10/gpgv.c:71 -msgid "" -"@\n" -"Options:\n" -" " -msgstr "" -"@\n" -"选项:\n" -" " - -#: g10/gpg.c:439 -msgid "create ascii armored output" -msgstr "输出经 ASCII 封装" - -#: g10/gpg.c:441 -msgid "|NAME|encrypt for NAME" -msgstr "|某甲|为收件者“某甲”加密" - -#: g10/gpg.c:452 -msgid "use this user-id to sign or decrypt" -msgstr "使用这个用户标识来签名或解密" - -#: g10/gpg.c:453 -msgid "|N|set compress level N (0 disables)" -msgstr "|N|设定压缩等级为 N (0 表示不压缩)" - -#: g10/gpg.c:458 -msgid "use canonical text mode" -msgstr "使用标准的文本模式" - -#: g10/gpg.c:472 -msgid "use as output file" -msgstr "指定输出文件" - -#: g10/gpg.c:474 g10/gpgv.c:73 -msgid "verbose" -msgstr "详细模式" - -#: g10/gpg.c:485 -msgid "do not make any changes" -msgstr "不做任何改变" - -#: g10/gpg.c:486 -msgid "prompt before overwriting" -msgstr "覆盖前先询问" - -#: g10/gpg.c:527 -msgid "use strict OpenPGP behavior" -msgstr "行为严格遵循 OpenPGP 定义" - -#: g10/gpg.c:528 -msgid "generate PGP 2.x compatible messages" -msgstr "生成与 PGP 2.x 兼容的报文" - -#: g10/gpg.c:556 -msgid "" -"@\n" -"(See the man page for a complete listing of all commands and options)\n" -msgstr "" -"@\n" -"(请参考在线说明以获得所有命令和选项的完整清单)\n" - -#: g10/gpg.c:559 -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:757 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:774 -msgid "Usage: gpg [options] [files] (-h for help)" -msgstr "用法: gpg [选项] [文件] (用 -h 求助)" - -#: g10/gpg.c:777 -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:788 -msgid "" -"\n" -"Supported algorithms:\n" -msgstr "" -"\n" -"支持的算法:\n" - -#: g10/gpg.c:791 -msgid "Pubkey: " -msgstr "公钥:" - -#: g10/gpg.c:797 g10/keyedit.c:2310 -msgid "Cipher: " -msgstr "对称加密:" - -#: g10/gpg.c:803 -msgid "Hash: " -msgstr "散列:" - -#: g10/gpg.c:809 g10/keyedit.c:2356 -msgid "Compression: " -msgstr "压缩:" - -#: g10/gpg.c:892 -msgid "usage: gpg [options] " -msgstr "用法:gpg [选项] " - -#: g10/gpg.c:1040 -msgid "conflicting commands\n" -msgstr "冲突的指令\n" - -#: g10/gpg.c:1058 -#, c-format -msgid "no = sign found in group definition `%s'\n" -msgstr "在‘%s’组定义里找不到等号(=)\n" - -#: g10/gpg.c:1255 -#, c-format -msgid "WARNING: unsafe ownership on homedir `%s'\n" -msgstr "警告:用户目录‘%s’所有权不安全\n" - -#: g10/gpg.c:1258 -#, c-format -msgid "WARNING: unsafe ownership on configuration file `%s'\n" -msgstr "警告:配置文件‘%s’所有权不安全\n" - -#: g10/gpg.c:1261 -#, c-format -msgid "WARNING: unsafe ownership on extension `%s'\n" -msgstr "警告:扩展模块‘%s’所有权不安全\n" - -#: g10/gpg.c:1267 -#, c-format -msgid "WARNING: unsafe permissions on homedir `%s'\n" -msgstr "警告:用户目录‘%s’权限不安全\n" - -#: g10/gpg.c:1270 -#, c-format -msgid "WARNING: unsafe permissions on configuration file `%s'\n" -msgstr "警告:配置文件‘%s’权限不安全\n" - -#: g10/gpg.c:1273 -#, c-format -msgid "WARNING: unsafe permissions on extension `%s'\n" -msgstr "警告:扩展模块‘%s’权限不安全\n" - -#: g10/gpg.c:1279 -#, c-format -msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n" -msgstr "警告:用户目录‘%s’的关闭目录所有权不安全\n" - -#: g10/gpg.c:1282 -#, c-format -msgid "" -"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n" -msgstr "警告:配置文件‘%s’的关闭目录所有权不安全\n" - -#: g10/gpg.c:1285 -#, c-format -msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n" -msgstr "警告:扩展模块‘%s’的关闭目录所有权不安全\n" - -#: g10/gpg.c:1291 -#, c-format -msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n" -msgstr "警告:用户目录‘%s’的关闭目录权限不安全\n" - -#: g10/gpg.c:1294 -#, c-format -msgid "" -"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n" -msgstr "警告:配置文件‘%s’的关闭目录权限不安全\n" - -#: g10/gpg.c:1297 -#, c-format -msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n" -msgstr "警告:扩展模块‘%s’的关闭目录权限不安全\n" - -#: g10/gpg.c:1438 -#, c-format -msgid "unknown configuration item `%s'\n" -msgstr "未知的配置项‘%s’\n" - -#: g10/gpg.c:1531 -msgid "display photo IDs during key listings" -msgstr "列出密钥时显示用户标识" - -#: g10/gpg.c:1533 -msgid "show policy URLs during signature listings" -msgstr "列出签名时显示策略 URL" - -#: g10/gpg.c:1535 -msgid "show all notations during signature listings" -msgstr "列出签名时显示 IETF 标准注记" - -#: g10/gpg.c:1537 -msgid "show IETF standard notations during signature listings" -msgstr "列出签名时显示 IETF 标准注记" - -#: g10/gpg.c:1541 -msgid "show user-supplied notations during signature listings" -msgstr "列出签名时显示用户提供的注记" - -#: g10/gpg.c:1543 -msgid "show preferred keyserver URLs during signature listings" -msgstr "列出密钥时显示首选公钥服务器 URL" - -#: g10/gpg.c:1545 -msgid "show user ID validity during key listings" -msgstr "列出密钥时显示用户标识的有效性" - -#: g10/gpg.c:1547 -msgid "show revoked and expired user IDs in key listings" -msgstr "列出密钥时显示已吊销或已过期的用户标识" - -#: g10/gpg.c:1549 -msgid "show revoked and expired subkeys in key listings" -msgstr "列出密钥时显示已吊销或已过期的子钥" - -#: g10/gpg.c:1551 -msgid "show the keyring name in key listings" -msgstr "列出密钥时显示钥匙环的名称" - -#: g10/gpg.c:1553 -msgid "show expiration dates during signature listings" -msgstr "列出签名时显示过期日期" - -#: g10/gpg.c:1920 -#, c-format -msgid "NOTE: old default options file `%s' ignored\n" -msgstr "注意:旧式的默认配置文件‘%s’已被忽略\n" - -#: g10/gpg.c:1962 -#, c-format -msgid "NOTE: no default option file `%s'\n" -msgstr "注意:没有默认配置文件‘%s’\n" - -#: g10/gpg.c:1966 -#, c-format -msgid "option file `%s': %s\n" -msgstr "配置文件‘%s’:%s\n" - -#: g10/gpg.c:1973 -#, c-format -msgid "reading options from `%s'\n" -msgstr "从‘%s’读取选项\n" - -#: g10/gpg.c:2188 g10/gpg.c:2814 g10/gpg.c:2833 -#, c-format -msgid "NOTE: %s is not for normal use!\n" -msgstr "注意:一般情况下不会用到 %s!\n" - -#: g10/gpg.c:2201 -#, c-format -msgid "cipher extension `%s' not loaded due to unsafe permissions\n" -msgstr "对称加算密法扩展模块‘%s’因为权限不安全而未被载入\n" - -#: g10/gpg.c:2364 g10/gpg.c:2376 -#, c-format -msgid "`%s' is not a valid signature expiration\n" -msgstr "‘%s’不是一个有效的签名过期日期\n" - -#: g10/gpg.c:2452 -#, c-format -msgid "`%s' is not a valid character set\n" -msgstr "‘%s’不是一个有效的字符集\n" - -#: g10/gpg.c:2476 g10/gpg.c:2663 g10/keyedit.c:4064 -msgid "could not parse keyserver URL\n" -msgstr "无法解析公钥服务器 URL\n" - -#: g10/gpg.c:2488 -#, c-format -msgid "%s:%d: invalid keyserver options\n" -msgstr "%s:%d:无效的公钥服务器选项\n" - -#: g10/gpg.c:2491 -msgid "invalid keyserver options\n" -msgstr "无效的公钥服务器选项\n" - -#: g10/gpg.c:2498 -#, c-format -msgid "%s:%d: invalid import options\n" -msgstr "%s:%d:无效的导入选项\n" - -#: g10/gpg.c:2501 -msgid "invalid import options\n" -msgstr "无效的导入选项\n" - -#: g10/gpg.c:2508 -#, c-format -msgid "%s:%d: invalid export options\n" -msgstr "%s:%d:无效的导出选项\n" - -#: g10/gpg.c:2511 -msgid "invalid export options\n" -msgstr "无效的导出选项\n" - -#: g10/gpg.c:2518 -#, c-format -msgid "%s:%d: invalid list options\n" -msgstr "%s:%d:无效的列表选项\n" - -#: g10/gpg.c:2521 -msgid "invalid list options\n" -msgstr "无效的列表选项\n" - -#: g10/gpg.c:2529 -msgid "display photo IDs during signature verification" -msgstr "验证签名时显示照片标识" - -#: g10/gpg.c:2531 -msgid "show policy URLs during signature verification" -msgstr "验证签名时显示策略 URL" - -#: g10/gpg.c:2533 -msgid "show all notations during signature verification" -msgstr "验证签名时显示所有注记" - -#: g10/gpg.c:2535 -msgid "show IETF standard notations during signature verification" -msgstr "验证签名时显示 IETF 标准注记" - -#: g10/gpg.c:2539 -msgid "show user-supplied notations during signature verification" -msgstr "验证签名时显示用户提供的注记" - -#: g10/gpg.c:2541 -msgid "show preferred keyserver URLs during signature verification" -msgstr "验证签名时显示首选公钥服务器 URL" - -#: g10/gpg.c:2543 -msgid "show user ID validity during signature verification" -msgstr "验证签名时显示用户标识的有效性" - -#: g10/gpg.c:2545 -msgid "show revoked and expired user IDs in signature verification" -msgstr "验证密钥时显示已吊销或已过期的子钥" - -#: g10/gpg.c:2547 -msgid "validate signatures with PKA data" -msgstr "使用 PKA 数据验证签名的有效性" - -#: g10/gpg.c:2549 -msgid "elevate the trust of signatures with valid PKA data" -msgstr "提升带有有效 PKA 数据的签名的信任度" - -#: g10/gpg.c:2556 -#, c-format -msgid "%s:%d: invalid verify options\n" -msgstr "%s:%d:无效的校验选项\n" - -#: g10/gpg.c:2559 -msgid "invalid verify options\n" -msgstr "无效的校验选项\n" - -#: g10/gpg.c:2566 -#, c-format -msgid "unable to set exec-path to %s\n" -msgstr "无法把运行路径设成 %s\n" - -#: g10/gpg.c:2729 -#, c-format -msgid "%s:%d: invalid auto-key-locate list\n" -msgstr "%s:%d:无效的 auto-key-locate 清单\n" - -#: g10/gpg.c:2732 -msgid "invalid auto-key-locate list\n" -msgstr "无效的 auto-key-locate 清单\n" - -#: g10/gpg.c:2803 -msgid "WARNING: program may create a core file!\n" -msgstr "警告:程序可能会创建核心内存转储!\n" - -#: g10/gpg.c:2807 -#, c-format -msgid "WARNING: %s overrides %s\n" -msgstr "警告:%s 会使得 %s 失效\n" - -#: g10/gpg.c:2816 -#, c-format -msgid "%s not allowed with %s!\n" -msgstr "%s 不可与 %s 并用\n" - -#: g10/gpg.c:2819 -#, c-format -msgid "%s makes no sense with %s!\n" -msgstr "%s 与 %s 并用无意义!\n" - -#: g10/gpg.c:2826 -#, c-format -msgid "NOTE: %s is not available in this version\n" -msgstr "注意:%s 本版本中不可用\n" - -#: g10/gpg.c:2841 -#, c-format -msgid "will not run with insecure memory due to %s\n" -msgstr "不会在内存不安全的情况下运行,原因是 %s\n" - -#: g10/gpg.c:2855 -msgid "you can only make detached or clear signatures while in --pgp2 mode\n" -msgstr "您只有在 --pgp2 模式下才能做分离式或明文签名\n" - -#: g10/gpg.c:2861 -msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n" -msgstr "您在 --pgp2 模式下时,不能同时签名和加密\n" - -#: g10/gpg.c:2867 -msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n" -msgstr "启用 --pgp2 时您应该只使用文件,而非管道\n" - -#: g10/gpg.c:2880 -msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n" -msgstr "在 --pgp2 模式下加密报文需要 IDEA 算法\n" - -#: g10/gpg.c:2947 g10/gpg.c:2971 -msgid "selected cipher algorithm is invalid\n" -msgstr "所选的对称加密算法无效\n" - -#: g10/gpg.c:2953 g10/gpg.c:2977 -msgid "selected digest algorithm is invalid\n" -msgstr "所选的散列算法无效\n" - -#: g10/gpg.c:2959 -msgid "selected compression algorithm is invalid\n" -msgstr "所选的压缩算法无效\n" - -#: g10/gpg.c:2965 -msgid "selected certification digest algorithm is invalid\n" -msgstr "所选的证书散列算法无效\n" - -#: g10/gpg.c:2980 -msgid "completes-needed must be greater than 0\n" -msgstr "需要的完全可信签名数一定要大于 0\n" - -#: g10/gpg.c:2982 -msgid "marginals-needed must be greater than 1\n" -msgstr "需要的勉强可信签名数一定要大于 1\n" - -#: g10/gpg.c:2984 -msgid "max-cert-depth must be in the range from 1 to 255\n" -msgstr "最大验证深度一定要介于 1 和 255 之间\n" - -#: g10/gpg.c:2986 -msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n" -msgstr "无效的默认验证级别;一定要是 0,1,2 或 3\n" - -#: g10/gpg.c:2988 -msgid "invalid min-cert-level; must be 1, 2, or 3\n" -msgstr "无效的最小验证级别;一定要是 1,2 或 3\n" - -#: g10/gpg.c:2991 -msgid "NOTE: simple S2K mode (0) is strongly discouraged\n" -msgstr "注意:强烈不建议使用简单的 S2K 模式(0)\n" - -#: g10/gpg.c:2995 -msgid "invalid S2K mode; must be 0, 1 or 3\n" -msgstr "无效的 S2K 模式;必须是 0,1 或 3\n" - -#: g10/gpg.c:3002 -msgid "invalid default preferences\n" -msgstr "无效的默认首选项\n" - -#: g10/gpg.c:3011 -msgid "invalid personal cipher preferences\n" -msgstr "无效的个人对称加密算法首选项\n" - -#: g10/gpg.c:3015 -msgid "invalid personal digest preferences\n" -msgstr "无效的个人散列算法首选项\n" - -#: g10/gpg.c:3019 -msgid "invalid personal compress preferences\n" -msgstr "无效的个人压缩算法首选项\n" - -#: g10/gpg.c:3052 -#, c-format -msgid "%s does not yet work with %s\n" -msgstr "%s 尚不能和 %s 并用\n" - -#: g10/gpg.c:3099 -#, c-format -msgid "you may not use cipher algorithm `%s' while in %s mode\n" -msgstr "您不能在 %s 模式下使用‘%s’对称加密算法\n" - -#: g10/gpg.c:3104 -#, c-format -msgid "you may not use digest algorithm `%s' while in %s mode\n" -msgstr "您不能在 %s 模式下使用‘%s’散列算法\n" - -#: g10/gpg.c:3109 -#, c-format -msgid "you may not use compression algorithm `%s' while in %s mode\n" -msgstr "您不能在 %s 模式下使用‘%s’压缩算法\n" - -#: g10/gpg.c:3208 -#, c-format -msgid "failed to initialize the TrustDB: %s\n" -msgstr "初始化信任度数据库失败:%s\n" - -#: g10/gpg.c:3219 -msgid "WARNING: recipients (-r) given without using public key encryption\n" -msgstr "警告:给定了收件人(-r)但并未使用公钥加密\n" - -#: g10/gpg.c:3230 -msgid "--store [filename]" -msgstr "--store [文件名]" - -#: g10/gpg.c:3237 -msgid "--symmetric [filename]" -msgstr "--symmetric [文件名]" - -#: g10/gpg.c:3239 -#, c-format -msgid "symmetric encryption of `%s' failed: %s\n" -msgstr "对称加密‘%s’失败:%s\n" - -#: g10/gpg.c:3249 -msgid "--encrypt [filename]" -msgstr "--encrypt [文件名]" - -#: g10/gpg.c:3262 -msgid "--symmetric --encrypt [filename]" -msgstr "--symmetric --encrypt [文件名]" - -#: g10/gpg.c:3264 -msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n" -msgstr "使用 --symmetric --encrypt 时不能使用 --s2k-mode 0\n" - -#: g10/gpg.c:3267 -#, c-format -msgid "you cannot use --symmetric --encrypt while in %s mode\n" -msgstr "您不能在 %s 模式下使用 --symmetric -encrypt\n" - -#: g10/gpg.c:3285 -msgid "--sign [filename]" -msgstr "--sign [文件名]" - -#: g10/gpg.c:3298 -msgid "--sign --encrypt [filename]" -msgstr "--sign --encrypt [文件名]" - -#: g10/gpg.c:3313 -msgid "--symmetric --sign --encrypt [filename]" -msgstr "--symmetric --sign --encrypt [文件名]" - -#: g10/gpg.c:3315 -msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n" -msgstr "使用 --symmetric --sign --encrypt 时不能使用 --s2k-mode 0\n" - -#: g10/gpg.c:3318 -#, c-format -msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n" -msgstr "您不能在 %s 模式下使用 --symmetric --sign -encrypt\n" - -#: g10/gpg.c:3338 -msgid "--sign --symmetric [filename]" -msgstr "--sign --symmetric [文件名]" - -#: g10/gpg.c:3347 -msgid "--clearsign [filename]" -msgstr "--clearsign [文件名]" - -#: g10/gpg.c:3372 -msgid "--decrypt [filename]" -msgstr "--decrypt [文件名]" - -#: g10/gpg.c:3380 -msgid "--sign-key user-id" -msgstr "--sign-key 用户标识" - -#: g10/gpg.c:3384 -msgid "--lsign-key user-id" -msgstr "--lsign-key 用户标识" - -#: g10/gpg.c:3405 -msgid "--edit-key user-id [commands]" -msgstr "--edit-key 用户标识 [指令]" - -#: g10/gpg.c:3476 -msgid "-k[v][v][v][c] [user-id] [keyring]" -msgstr "-k[v][v][v][c] [用户标识] [钥匙环]" - -#: g10/gpg.c:3518 -#, c-format -msgid "keyserver send failed: %s\n" -msgstr "上传至公钥服务器失败:%s\n" - -#: g10/gpg.c:3520 -#, c-format -msgid "keyserver receive failed: %s\n" -msgstr "从公钥服务器接收失败:%s\n" - -#: g10/gpg.c:3522 -#, c-format -msgid "key export failed: %s\n" -msgstr "导出密钥失败:%s\n" - -#: g10/gpg.c:3533 -#, c-format -msgid "keyserver search failed: %s\n" -msgstr "搜寻公钥服务器失败:%s\n" - -#: g10/gpg.c:3543 -#, c-format -msgid "keyserver refresh failed: %s\n" -msgstr "从公钥服务器更新失败:%s\n" - -#: g10/gpg.c:3594 -#, c-format -msgid "dearmoring failed: %s\n" -msgstr "解开 ASCII 封装失败:%s\n" - -#: g10/gpg.c:3602 -#, c-format -msgid "enarmoring failed: %s\n" -msgstr "进行 ASCII 封装失败:%s\n" - -#: g10/gpg.c:3689 -#, c-format -msgid "invalid hash algorithm `%s'\n" -msgstr "无效的‘%s’散列算法\n" - -#: g10/gpg.c:3812 -msgid "[filename]" -msgstr "[文件名]" - -#: g10/gpg.c:3816 -msgid "Go ahead and type your message ...\n" -msgstr "请开始键入您的报文……\n" - -#: g10/gpg.c:4120 -msgid "the given certification policy URL is invalid\n" -msgstr "给定的的验证策略 URL 无效\n" - -#: g10/gpg.c:4122 -msgid "the given signature policy URL is invalid\n" -msgstr "给定的签名策略 URL 无效\n" - -#: g10/gpg.c:4155 -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:3707 -#, 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:266 -#, c-format -msgid "skipping block of type %d\n" -msgstr "跳过 %d 样式的区块\n" - -#: g10/import.c:275 -#, c-format -msgid "%lu keys processed so far\n" -msgstr "目前已处理 %lu 把密钥\n" - -#: g10/import.c:292 -#, c-format -msgid "Total number processed: %lu\n" -msgstr "合计被处理的数量:%lu\n" - -#: g10/import.c:294 -#, c-format -msgid " skipped new keys: %lu\n" -msgstr " 已跳过的新密钥:%lu\n" - -#: g10/import.c:297 -#, c-format -msgid " w/o user IDs: %lu\n" -msgstr " 遗失用户标识:%lu\n" - -#: g10/import.c:299 -#, c-format -msgid " imported: %lu" -msgstr " 已导入:%lu" - -#: g10/import.c:305 -#, c-format -msgid " unchanged: %lu\n" -msgstr " 未改变:%lu\n" - -#: g10/import.c:307 -#, c-format -msgid " new user IDs: %lu\n" -msgstr " 新用户标识:%lu\n" - -#: g10/import.c:309 -#, c-format -msgid " new subkeys: %lu\n" -msgstr " 新的子钥:%lu\n" - -#: g10/import.c:311 -#, c-format -msgid " new signatures: %lu\n" -msgstr " 新的签名:%lu\n" - -#: g10/import.c:313 -#, c-format -msgid " new key revocations: %lu\n" -msgstr " 新的密钥吊销:%lu\n" - -#: g10/import.c:315 -#, c-format -msgid " secret keys read: %lu\n" -msgstr " 读取的私钥:%lu\n" - -#: g10/import.c:317 -#, c-format -msgid " secret keys imported: %lu\n" -msgstr " 导入的私钥:%lu\n" - -#: g10/import.c:319 -#, c-format -msgid " secret keys unchanged: %lu\n" -msgstr " 未改变的私钥:%lu\n" - -#: g10/import.c:321 -#, c-format -msgid " not imported: %lu\n" -msgstr " 未被导入:%lu\n" - -#: g10/import.c:323 -#, c-format -msgid " signatures cleaned: %lu\n" -msgstr " 清除的签名:%lu\n" - -#: g10/import.c:325 -#, c-format -msgid " user IDs cleaned: %lu\n" -msgstr " 清除的用户标识:%lu\n" - -#: g10/import.c:566 -#, 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:570 -#, fuzzy -msgid " algorithms on these user IDs:\n" -msgstr " 新用户标识:%lu\n" - -#: g10/import.c:607 -#, c-format -msgid " \"%s\": preference for cipher algorithm %s\n" -msgstr " “%s”:对称加密算法 %s 对应首选项\n" - -#: g10/import.c:619 -#, c-format -msgid " \"%s\": preference for digest algorithm %s\n" -msgstr " “%s”:散列算法 %s 对应首选项\n" - -#: g10/import.c:631 -#, c-format -msgid " \"%s\": preference for compression algorithm %s\n" -msgstr " “%s”:压缩算法 %s 对应首选项\n" - -#: g10/import.c:644 -msgid "it is strongly suggested that you update your preferences and\n" -msgstr "强烈建议您更新您的首选项并重新分发这把密钥,\n" - -#: g10/import.c:646 -msgid "re-distribute this key to avoid potential algorithm mismatch problems\n" -msgstr "以避免可能的算法不匹配问题\n" - -#: g10/import.c:670 -#, 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:720 g10/import.c:1118 -#, c-format -msgid "key %s: no user ID\n" -msgstr "密钥 %s:没有用户标识\n" - -#: g10/import.c:749 -#, c-format -msgid "key %s: PKS subkey corruption repaired\n" -msgstr "密钥 %s:PKS 子钥破损已修复\n" - -#: g10/import.c:764 -#, c-format -msgid "key %s: accepted non self-signed user ID \"%s\"\n" -msgstr "密钥 %s:已接受不含自身签名的用户标识“%s”\n" - -#: g10/import.c:770 -#, c-format -msgid "key %s: no valid user IDs\n" -msgstr "密钥 %s:没有有效的用户标识\n" - -#: g10/import.c:772 -msgid "this may be caused by a missing self-signature\n" -msgstr "这可能由于遗失自身签名所致\n" - -#: g10/import.c:782 g10/import.c:1240 -#, c-format -msgid "key %s: public key not found: %s\n" -msgstr "密钥 %s:找不到公钥:%s\n" - -#: g10/import.c:788 -#, c-format -msgid "key %s: new key - skipped\n" -msgstr "密钥 %s:新密钥――已跳过\n" - -#: g10/import.c:797 -#, c-format -msgid "no writable keyring found: %s\n" -msgstr "找不到可写的钥匙环:%s\n" - -#: g10/import.c:802 g10/openfile.c:267 g10/sign.c:831 g10/sign.c:1135 -#, c-format -msgid "writing to `%s'\n" -msgstr "正在写入‘%s’\n" - -#: g10/import.c:806 g10/import.c:901 g10/import.c:1158 g10/import.c:1301 -#: g10/import.c:2363 g10/import.c:2385 -#, c-format -msgid "error writing keyring `%s': %s\n" -msgstr "写入钥匙环‘%s’时出错: %s\n" - -#: g10/import.c:825 -#, c-format -msgid "key %s: public key \"%s\" imported\n" -msgstr "密钥 %s:公钥“%s”已导入\n" - -#: g10/import.c:849 -#, c-format -msgid "key %s: doesn't match our copy\n" -msgstr "密钥 %s:与我们的副本不吻合\n" - -#: g10/import.c:866 g10/import.c:1258 -#, c-format -msgid "key %s: can't locate original keyblock: %s\n" -msgstr "密钥 %s:无法定位原始的密钥区块:%s\n" - -#: g10/import.c:874 g10/import.c:1265 -#, c-format -msgid "key %s: can't read original keyblock: %s\n" -msgstr "密钥 %s:无法读取原始的密钥区块: %s\n" - -#: g10/import.c:911 -#, c-format -msgid "key %s: \"%s\" 1 new user ID\n" -msgstr "密钥 %s:“%s”一个新的用户标识\n" - -#: g10/import.c:914 -#, c-format -msgid "key %s: \"%s\" %d new user IDs\n" -msgstr "密钥 %s:“%s”%d 个新的用户标识\n" - -#: g10/import.c:917 -#, c-format -msgid "key %s: \"%s\" 1 new signature\n" -msgstr "密钥 %s:“%s”1 个新的签名\n" - -#: g10/import.c:920 -#, c-format -msgid "key %s: \"%s\" %d new signatures\n" -msgstr "密钥 %s:“%s”%d 个新的签名\n" - -#: g10/import.c:923 -#, c-format -msgid "key %s: \"%s\" 1 new subkey\n" -msgstr "密钥 %s:“%s”1 个新的子钥\n" - -#: g10/import.c:926 -#, c-format -msgid "key %s: \"%s\" %d new subkeys\n" -msgstr "密钥 %s:“%s”%d 个新的子钥\n" - -#: g10/import.c:929 -#, c-format -msgid "key %s: \"%s\" %d signature cleaned\n" -msgstr "密钥 %s:“%s”%d 个签名被清除\n" - -#: g10/import.c:932 -#, c-format -msgid "key %s: \"%s\" %d signatures cleaned\n" -msgstr "密钥 %s:“%s”%d 个签名被清除\n" - -#: g10/import.c:935 -#, c-format -msgid "key %s: \"%s\" %d user ID cleaned\n" -msgstr "密钥 %s:“%s”%d 个用户标识被清除\n" - -#: g10/import.c:938 -#, c-format -msgid "key %s: \"%s\" %d user IDs cleaned\n" -msgstr "密钥 %s:“%s”%d 个用户标识被清除\n" - -#: g10/import.c:961 -#, c-format -msgid "key %s: \"%s\" not changed\n" -msgstr "密钥 %s:“%s”未改变\n" - -#: g10/import.c:1124 -#, c-format -msgid "key %s: secret key with invalid cipher %d - skipped\n" -msgstr "密钥 %s:私钥使用了无效的加密算法 %d――已跳过\n" - -#: g10/import.c:1135 -msgid "importing secret keys not allowed\n" -msgstr "不允许导入私钥\n" - -#: g10/import.c:1152 g10/import.c:2378 -#, c-format -msgid "no default secret keyring: %s\n" -msgstr "没有默认的私钥钥匙环: %s\n" - -#: g10/import.c:1163 -#, c-format -msgid "key %s: secret key imported\n" -msgstr "密钥 %s:私钥已导入\n" - -#: g10/import.c:1193 -#, c-format -msgid "key %s: already in secret keyring\n" -msgstr "密钥 %s:已在私钥钥匙环中\n" - -#: g10/import.c:1203 -#, c-format -msgid "key %s: secret key not found: %s\n" -msgstr "密钥 %s:找不到私钥:%s\n" - -#: g10/import.c:1233 -#, c-format -msgid "key %s: no public key - can't apply revocation certificate\n" -msgstr "密钥 %s:没有公钥――无法应用吊销证书\n" - -#: g10/import.c:1276 -#, c-format -msgid "key %s: invalid revocation certificate: %s - rejected\n" -msgstr "密钥 %s:无效的吊销证书:%s――已拒绝\n" - -#: g10/import.c:1308 -#, c-format -msgid "key %s: \"%s\" revocation certificate imported\n" -msgstr "密钥 %s:“%s”吊销证书已被导入\n" - -#: g10/import.c:1374 -#, c-format -msgid "key %s: no user ID for signature\n" -msgstr "密钥 %s:签名没有用户标识\n" - -#: g10/import.c:1389 -#, c-format -msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n" -msgstr "密钥 %s:用户标识“%s”使用了不支持的公钥算法\n" - -#: g10/import.c:1391 -#, c-format -msgid "key %s: invalid self-signature on user ID \"%s\"\n" -msgstr "密钥 %s:用户标识“%s”自身签名无效\n" - -#: g10/import.c:1409 -#, c-format -msgid "key %s: no subkey for key binding\n" -msgstr "密钥 %s:没有可供绑定的子钥\n" - -#: g10/import.c:1420 g10/import.c:1470 -#, c-format -msgid "key %s: unsupported public key algorithm\n" -msgstr "密钥 %s:不支持的公钥算法\n" - -#: g10/import.c:1422 -#, c-format -msgid "key %s: invalid subkey binding\n" -msgstr "密钥 %s:无效的子钥绑定\n" - -#: g10/import.c:1437 -#, c-format -msgid "key %s: removed multiple subkey binding\n" -msgstr "密钥 %s:已删除多重子钥绑定\n" - -#: g10/import.c:1459 -#, c-format -msgid "key %s: no subkey for key revocation\n" -msgstr "密钥 %s:没有用于密钥吊销的子钥\n" - -#: g10/import.c:1472 -#, c-format -msgid "key %s: invalid subkey revocation\n" -msgstr "密钥 %s:无效的子钥吊销\n" - -#: g10/import.c:1487 -#, c-format -msgid "key %s: removed multiple subkey revocation\n" -msgstr "密钥 %s:已删除多重子钥吊销\n" - -#: g10/import.c:1529 -#, c-format -msgid "key %s: skipped user ID \"%s\"\n" -msgstr "密钥 %s:已跳过用户标识“%s”\n" - -#: g10/import.c:1550 -#, 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:1577 -#, c-format -msgid "key %s: non exportable signature (class 0x%02X) - skipped\n" -msgstr "密钥 %s:不可导出的签名(验证级别 0x%02X)――已跳过\n" - -#: g10/import.c:1587 -#, c-format -msgid "key %s: revocation certificate at wrong place - skipped\n" -msgstr "密钥 %s:吊销证书位置错误――已跳过\n" - -#: g10/import.c:1604 -#, c-format -msgid "key %s: invalid revocation certificate: %s - skipped\n" -msgstr "密钥 %s:无效的吊销证书:%s――已跳过\n" - -#: g10/import.c:1618 -#, c-format -msgid "key %s: subkey signature in wrong place - skipped\n" -msgstr "密钥 %s:子钥签名位置错误――已跳过\n" - -#: g10/import.c:1626 -#, c-format -msgid "key %s: unexpected signature class (0x%02X) - skipped\n" -msgstr "密钥 %s:与预期不符的签名验证级别(0x%02X)――已跳过\n" - -#: g10/import.c:1726 -#, c-format -msgid "key %s: duplicated user ID detected - merged\n" -msgstr "密钥 %s:检测到重复的用户标识――已合并\n" - -#: g10/import.c:1788 -#, c-format -msgid "WARNING: key %s may be revoked: fetching revocation key %s\n" -msgstr "警告:密钥 %s 可能已被吊销:正在取回吊销密钥 %s\n" - -#: g10/import.c:1802 -#, c-format -msgid "WARNING: key %s may be revoked: revocation key %s not present.\n" -msgstr "警告:密钥 %s 可能已被吊销:吊销密钥 %s 不存在。\n" - -#: g10/import.c:1861 -#, c-format -msgid "key %s: \"%s\" revocation certificate added\n" -msgstr "密钥 %s:已新增吊销证书“%s”\n" - -#: g10/import.c:1895 -#, c-format -msgid "key %s: direct key signature added\n" -msgstr "密钥 %s:已新增直接密钥签名\n" - -#: g10/import.c:2284 -msgid "NOTE: a key's S/N does not match the card's one\n" -msgstr "注意:密钥的序列号与卡的不符\n" - -#: g10/import.c:2292 -msgid "NOTE: primary key is online and stored on card\n" -msgstr "注意:主钥在线,存储在卡上\n" - -#: g10/import.c:2294 -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:4783 g10/keyedit.c:4874 g10/keyedit.c:4938 -#: g10/keyedit.c:4999 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:3346 -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:3249 -#, c-format -msgid "User ID \"%s\": already clean\n" -msgstr "用户标识“%s”:无用部分已清除\n" - -#: g10/keyedit.c:3341 -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:3352 -msgid "You may not add a designated revoker to a PGP 2.x-style key.\n" -msgstr "您不可以为 PGP 2.x 样式的密钥添加指定吊销者。\n" - -#: g10/keyedit.c:3372 -msgid "Enter the user ID of the designated revoker: " -msgstr "输入指定吊销者的用户标识:" - -#: g10/keyedit.c:3397 -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:3412 -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:3434 -msgid "this key has already been designated as a revoker\n" -msgstr "这把密钥已被指定为一个吊销者\n" - -#: g10/keyedit.c:3453 -msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n" -msgstr "警告:将某把密钥指派为指定吊销者的操作无法撤销!\n" - -#: g10/keyedit.c:3459 -msgid "" -"Are you sure you want to appoint this key as a designated revoker? (y/N) " -msgstr "您确定要将这把密钥设为指定吊销者吗?(y/N):" - -#: g10/keyedit.c:3520 -msgid "Please remove selections from the secret keys.\n" -msgstr "请从私钥中删除选择。\n" - -#: g10/keyedit.c:3526 -msgid "Please select at most one subkey.\n" -msgstr "请至多选择一个子钥。\n" - -#: g10/keyedit.c:3530 -msgid "Changing expiration time for a subkey.\n" -msgstr "将要变更子钥的使用期限。\n" - -#: g10/keyedit.c:3533 -msgid "Changing expiration time for the primary key.\n" -msgstr "将要变更主钥的使用期限。\n" - -#: g10/keyedit.c:3579 -msgid "You can't change the expiration date of a v3 key\n" -msgstr "您不能变更 v3 密钥的使用期限\n" - -#: g10/keyedit.c:3595 -msgid "No corresponding signature in secret ring\n" -msgstr "在私钥环里没有相应的签名\n" - -#: g10/keyedit.c:3668 -#, c-format -msgid "signing subkey %s is already cross-certified\n" -msgstr "签名的子钥 %s 已经交叉验证\n" - -#: g10/keyedit.c:3674 -#, c-format -msgid "subkey %s does not sign and so does not need to be cross-certified\n" -msgstr "子钥 %s 不签名,因此不需要交叉验证\n" - -#: g10/keyedit.c:3836 -msgid "Please select exactly one user ID.\n" -msgstr "请精确地选择一个用户标识。\n" - -#: g10/keyedit.c:3875 g10/keyedit.c:3985 g10/keyedit.c:4105 g10/keyedit.c:4246 -#, c-format -msgid "skipping v3 self-signature on user ID \"%s\"\n" -msgstr "跳过用户标识“%s”的 v3 自身签名\n" - -#: g10/keyedit.c:4046 -msgid "Enter your preferred keyserver URL: " -msgstr "输入您首选的公钥服务器的 URL:" - -#: g10/keyedit.c:4126 -msgid "Are you sure you want to replace it? (y/N) " -msgstr "您确定要替换它吗?(y/N)" - -#: g10/keyedit.c:4127 -msgid "Are you sure you want to delete it? (y/N) " -msgstr "您确定要删除它吗?(y/N)" - -#: g10/keyedit.c:4189 -msgid "Enter the notation: " -msgstr "输入注记:" - -#: g10/keyedit.c:4338 -msgid "Proceed? (y/N) " -msgstr "继续?(y/N)" - -#: g10/keyedit.c:4402 -#, c-format -msgid "No user ID with index %d\n" -msgstr "没有索引为 %d 的用户标识\n" - -#: g10/keyedit.c:4460 -#, c-format -msgid "No user ID with hash %s\n" -msgstr "没有散列值为 %s 的用户标识\n" - -#: g10/keyedit.c:4487 -#, c-format -msgid "No subkey with index %d\n" -msgstr "没有索引为 %d 的子钥\n" - -#: g10/keyedit.c:4622 -#, c-format -msgid "user ID: \"%s\"\n" -msgstr "用户标识:“%s”\n" - -#: g10/keyedit.c:4625 g10/keyedit.c:4689 g10/keyedit.c:4732 -#, c-format -msgid "signed by your key %s on %s%s%s\n" -msgstr "由您的密钥 %s 于 %s%s%s 签名\n" - -#: g10/keyedit.c:4627 g10/keyedit.c:4691 g10/keyedit.c:4734 -msgid " (non-exportable)" -msgstr " (不可导出)" - -#: g10/keyedit.c:4631 -#, c-format -msgid "This signature expired on %s.\n" -msgstr "这份签名已在 %s 过期。\n" - -#: g10/keyedit.c:4635 -msgid "Are you sure you still want to revoke it? (y/N) " -msgstr "您确定您仍然想要吊销它吗?(y/N)" - -#: g10/keyedit.c:4639 -msgid "Create a revocation certificate for this signature? (y/N) " -msgstr "要为这份签名生成一份吊销证书吗?(y/N)" - -#: g10/keyedit.c:4666 -#, c-format -msgid "You have signed these user IDs on key %s:\n" -msgstr "您已经为这些密钥 %s 上的这些用户标识添加签名:\n" - -#: g10/keyedit.c:4692 -msgid " (non-revocable)" -msgstr " (不可吊销)" - -#: g10/keyedit.c:4699 -#, c-format -msgid "revoked by your key %s on %s\n" -msgstr "由您的密钥 %s 于 %s 吊销\n" - -#: g10/keyedit.c:4721 -msgid "You are about to revoke these signatures:\n" -msgstr "您正在吊销这些签名:\n" - -#: g10/keyedit.c:4741 -msgid "Really create the revocation certificates? (y/N) " -msgstr "真的要生成吊销证书吗?(y/N)" - -#: g10/keyedit.c:4771 -msgid "no secret key\n" -msgstr "没有私钥\n" - -#: g10/keyedit.c:4841 -#, c-format -msgid "user ID \"%s\" is already revoked\n" -msgstr "用户标识“%s”已经被吊销。\n" - -#: g10/keyedit.c:4858 -#, c-format -msgid "WARNING: a user ID signature is dated %d seconds in the future\n" -msgstr "警告:有一份用户标识签名的日期标记为 %d 秒后的未来\n" - -#: g10/keyedit.c:4922 -#, c-format -msgid "Key %s is already revoked.\n" -msgstr "密钥 %s 已被吊销。\n" - -#: g10/keyedit.c:4984 -#, c-format -msgid "Subkey %s is already revoked.\n" -msgstr "子钥 %s 已被吊销。\n" - -#: g10/keyedit.c:5079 -#, 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:1421 -#, 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:1324 -#, c-format -msgid "sending key %s to %s server %s\n" -msgstr "将密钥‘%s’上传到 %s 服务器 %s\n" - -#: g10/keyserver.c:1328 -#, c-format -msgid "sending key %s to %s\n" -msgstr "将密钥‘%s’上传到 %s\n" - -#: g10/keyserver.c:1371 -#, c-format -msgid "searching for \"%s\" from %s server %s\n" -msgstr "搜索“%s”,在 %s 服务器 %s 上\n" - -#: g10/keyserver.c:1374 -#, c-format -msgid "searching for \"%s\" from %s\n" -msgstr "搜索“%s”,在 %s 上\n" - -#: g10/keyserver.c:1381 g10/keyserver.c:1477 -msgid "no keyserver action!\n" -msgstr "公钥服务器无动作!\n" - -#: g10/keyserver.c:1429 -#, c-format -msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n" -msgstr "警告:处理公钥服务器的程序来自不同版本的 GnuPG (%s)\n" - -#: g10/keyserver.c:1438 -msgid "keyserver did not send VERSION\n" -msgstr "公钥服务器未发送 VERSION\n" - -#: g10/keyserver.c:1500 g10/keyserver.c:2028 -msgid "no keyserver known (use option --keyserver)\n" -msgstr "未给出公钥服务器(使用 --keyserver 选项)\n" - -#: g10/keyserver.c:1506 -msgid "external keyserver calls are not supported in this build\n" -msgstr "这一编译版本不支持外部调用公钥服务器\n" - -#: g10/keyserver.c:1518 -#, c-format -msgid "no handler for keyserver scheme `%s'\n" -msgstr "没有处理‘%s’公钥服务器的程序\n" - -#: g10/keyserver.c:1523 -#, c-format -msgid "action `%s' not supported with keyserver scheme `%s'\n" -msgstr "‘%s’操作不为‘%s’公钥服务器所支持\n" - -#: g10/keyserver.c:1531 -#, c-format -msgid "%s does not support handler version %d\n" -msgstr "%s 不支持对版本 %d 的处理\n" - -#: g10/keyserver.c:1538 -msgid "keyserver timed out\n" -msgstr "公钥服务器超时\n" - -#: g10/keyserver.c:1543 -msgid "keyserver internal error\n" -msgstr "公钥服务器内部错误\n" - -#: g10/keyserver.c:1552 -#, c-format -msgid "keyserver communications error: %s\n" -msgstr "公钥服务器通讯错误:%s\n" - -#: g10/keyserver.c:1577 g10/keyserver.c:1611 -#, c-format -msgid "\"%s\" not a key ID: skipping\n" -msgstr "“%s”不是一个用户标识:跳过\n" - -#: g10/keyserver.c:1870 -#, c-format -msgid "WARNING: unable to refresh key %s via %s: %s\n" -msgstr "警告:无法更新密钥 %s,通过 %s:%s\n" - -#: g10/keyserver.c:1892 -#, c-format -msgid "refreshing 1 key from %s\n" -msgstr "1 个密钥正从 %s 得到更新\n" - -#: g10/keyserver.c:1894 -#, c-format -msgid "refreshing %d keys from %s\n" -msgstr "%d 个密钥正从 %s 得到更新\n" - -#: g10/keyserver.c:1950 -#, c-format -msgid "WARNING: unable to fetch URI %s: %s\n" -msgstr "警告:无法获取 URI %s:%s\n" - -#: g10/keyserver.c:1956 -#, 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:305 -#, c-format -msgid "assuming signed data in `%s'\n" -msgstr "假定被签名的数据是‘%s’\n" - -#: g10/openfile.c:384 -#, c-format -msgid "new configuration file `%s' created\n" -msgstr "新的配置文件‘%s’已建立\n" - -#: g10/openfile.c:386 -#, c-format -msgid "WARNING: options in `%s' are not yet active during this run\n" -msgstr "警告:在‘%s’里的选项于此次运行期间未被使用\n" - -#: g10/openfile.c:418 -#, 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:1157 -#, 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:968 -msgid "can't query passphrase in batch mode\n" -msgstr "在批处理模式中无法查询密码\n" - -#: g10/passphrase.c:812 g10/passphrase.c:973 -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:977 -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:127 g10/skclist.c:191 -msgid "key is not flagged as insecure - can't use it with the faked RNG!\n" -msgstr "密钥未被标示为不安全――不能与假的随机数发生器共同使用!\n" - -#: g10/skclist.c:158 -#, c-format -msgid "skipped \"%s\": duplicated\n" -msgstr "“%s”已跳过:重复\n" - -#: g10/skclist.c:166 g10/skclist.c:176 g10/skclist.c:185 -#, c-format -msgid "skipped \"%s\": %s\n" -msgstr "“%s”已跳过:%s\n" - -#: g10/skclist.c:171 -msgid "skipped: secret key already present\n" -msgstr "已跳过:私钥已存在\n" - -#: g10/skclist.c:186 -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:350 -msgid "operation is not possible without initialized secure memory\n" -msgstr "安全内存未初始化,不能进行操作\n" - -#: util/secmem.c:351 -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.po b/po/zh_TW.po deleted file mode 100644 index 75aa24e28..000000000 --- a/po/zh_TW.po +++ /dev/null @@ -1,6176 +0,0 @@ -# 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-07-28 11:12+0200\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:1003 g10/gpg.c:3461 g10/import.c:195 g10/keygen.c:2385 -#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:342 -#: 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:1002 g10/keygen.c:2864 -#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:263 -#: g10/openfile.c:357 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:320 -#, c-format -msgid "armor: %s\n" -msgstr "封裝: %s\n" - -#: g10/armor.c:359 -msgid "invalid armor header: " -msgstr "無效的封裝檔頭: " - -#: g10/armor.c:370 -msgid "armor header: " -msgstr "封裝檔頭: " - -#: g10/armor.c:381 -msgid "invalid clearsig header\n" -msgstr "無效的明文簽章檔頭\n" - -#: g10/armor.c:433 -msgid "nested clear text signatures\n" -msgstr "多層明文簽章\n" - -#: g10/armor.c:568 -msgid "unexpected armor: " -msgstr "未預期的封裝: " - -#: g10/armor.c:580 -msgid "invalid dash escaped line: " -msgstr "無效的破折號逸出列: " - -#: g10/armor.c:734 g10/armor.c:1343 -#, c-format -msgid "invalid radix64 character %02X skipped\n" -msgstr "無效的 64 進位字符 %02x 被跳過了\n" - -#: g10/armor.c:777 -msgid "premature eof (no CRC)\n" -msgstr "檔案未預期的結束 (沒有 CRC 的部分)\n" - -#: g10/armor.c:811 -msgid "premature eof (in CRC)\n" -msgstr "檔案未預期的結束 (CRC 的部分未結束)\n" - -#: g10/armor.c:819 -msgid "malformed CRC\n" -msgstr "CRC 被變造過\n" - -#: g10/armor.c:823 g10/armor.c:1380 -#, c-format -msgid "CRC error; %06lX - %06lX\n" -msgstr "CRC 錯誤; %06lX - %06lX\n" - -#: g10/armor.c:843 -msgid "premature eof (in trailer)\n" -msgstr "檔案未預期的結束 (於結尾處)\n" - -#: g10/armor.c:847 -msgid "error in trailer line\n" -msgstr "結尾列有問題\n" - -#: g10/armor.c:1158 -msgid "no valid OpenPGP data found.\n" -msgstr "找不到有效的 OpenPGP 資料.\n" - -#: g10/armor.c:1163 -#, c-format -msgid "invalid armor: line longer than %d characters\n" -msgstr "無效的封裝: 列長超出 %d 字符\n" - -#: g10/armor.c:1167 -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:280 -#, 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:3826 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:3387 g10/keyserver.c:1700 -#: 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:2349 g10/keyserver.c:1714 -#: 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:67 g10/mainproc.c:293 -#, c-format -msgid "%s encrypted data\n" -msgstr "%s 加密過的資料\n" - -#: g10/encr-data.c:69 g10/mainproc.c:297 -#, c-format -msgid "encrypted with unknown algorithm %d\n" -msgstr "以未知的演算法 %d 加密過\n" - -#: g10/encr-data.c:93 -msgid "" -"WARNING: message was encrypted with a weak key in the symmetric cipher.\n" -msgstr "警告: 訊息被以對稱式編密法的弱金鑰加密了.\n" - -#: g10/encr-data.c:104 -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:415 -#, 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:375 -msgid "" -"@Commands:\n" -" " -msgstr "" -"@指令:\n" -" " - -#: g10/gpg.c:377 -msgid "|[file]|make a signature" -msgstr "|[檔案]|建立一份簽章" - -#: g10/gpg.c:378 -msgid "|[file]|make a clear text signature" -msgstr "|[檔案]|建立一份明文簽章" - -#: g10/gpg.c:379 -msgid "make a detached signature" -msgstr "建立一份分離式簽章" - -#: g10/gpg.c:380 -msgid "encrypt data" -msgstr "加密資料" - -#: g10/gpg.c:382 -msgid "encryption only with symmetric cipher" -msgstr "僅使用對稱式編密法來加密" - -#: g10/gpg.c:384 -msgid "decrypt data (default)" -msgstr "資料解密 (預設)" - -#: g10/gpg.c:386 -msgid "verify a signature" -msgstr "驗證某份簽章" - -#: g10/gpg.c:388 -msgid "list keys" -msgstr "列出金鑰" - -#: g10/gpg.c:390 -msgid "list keys and signatures" -msgstr "列出金鑰和簽章" - -#: g10/gpg.c:391 -msgid "list and check key signatures" -msgstr "列出並檢查金鑰簽章" - -#: g10/gpg.c:392 -msgid "list keys and fingerprints" -msgstr "列出金鑰和指紋" - -#: g10/gpg.c:393 -msgid "list secret keys" -msgstr "列出私鑰" - -#: g10/gpg.c:394 -msgid "generate a new key pair" -msgstr "產生一份新的金鑰對" - -#: g10/gpg.c:395 -msgid "remove keys from the public keyring" -msgstr "從公鑰鑰匙圈裡移去金鑰" - -#: g10/gpg.c:397 -msgid "remove keys from the secret keyring" -msgstr "從私鑰鑰匙圈裡移去金鑰" - -#: g10/gpg.c:398 -msgid "sign a key" -msgstr "簽署某把金鑰" - -#: g10/gpg.c:399 -msgid "sign a key locally" -msgstr "僅在本地簽署某把金鑰" - -#: g10/gpg.c:400 -msgid "sign or edit a key" -msgstr "簽署或編輯某把金鑰" - -#: g10/gpg.c:401 -msgid "generate a revocation certificate" -msgstr "產生一份撤銷憑證" - -#: g10/gpg.c:403 -msgid "export keys" -msgstr "匯出金鑰" - -#: g10/gpg.c:404 -msgid "export keys to a key server" -msgstr "把金鑰匯出至某個金鑰伺服器上" - -#: g10/gpg.c:405 -msgid "import keys from a key server" -msgstr "從某個金鑰伺服器上匯入金鑰" - -#: g10/gpg.c:407 -msgid "search for keys on a key server" -msgstr "在某個金鑰伺服器上搜尋金鑰" - -#: g10/gpg.c:409 -msgid "update all keys from a keyserver" -msgstr "從某個金鑰伺服器上更新所有的金鑰" - -#: g10/gpg.c:413 -msgid "import/merge keys" -msgstr "匯入/合併金鑰" - -#: g10/gpg.c:416 -msgid "print the card status" -msgstr "列印卡片狀態" - -#: g10/gpg.c:417 -msgid "change data on a card" -msgstr "變更卡片上的資料" - -#: g10/gpg.c:418 -msgid "change a card's PIN" -msgstr "變更某張卡片的個人識別碼 (PIN)" - -#: g10/gpg.c:426 -msgid "update the trust database" -msgstr "更新信任資料庫" - -#: g10/gpg.c:433 -msgid "|algo [files]|print message digests" -msgstr "|演算法 [檔案]|印出訊息摘要" - -#: g10/gpg.c:437 g10/gpgv.c:71 -msgid "" -"@\n" -"Options:\n" -" " -msgstr "" -"@\n" -"選項:\n" -" " - -#: g10/gpg.c:439 -msgid "create ascii armored output" -msgstr "建立以 ASCII 封裝過的輸出" - -#: g10/gpg.c:441 -msgid "|NAME|encrypt for NAME" -msgstr "|名字|以「名字」作為加密對象" - -#: g10/gpg.c:452 -msgid "use this user-id to sign or decrypt" -msgstr "使用這個使用者 ID 來簽署或解密" - -#: g10/gpg.c:453 -msgid "|N|set compress level N (0 disables)" -msgstr "|N|設定壓縮等級為 N (0 表示不壓縮)" - -#: g10/gpg.c:458 -msgid "use canonical text mode" -msgstr "使用標準的文字模式" - -#: g10/gpg.c:472 -msgid "use as output file" -msgstr "當作輸出檔案來使用" - -#: g10/gpg.c:474 g10/gpgv.c:73 -msgid "verbose" -msgstr "囉唆模式" - -#: g10/gpg.c:485 -msgid "do not make any changes" -msgstr "不要做任何改變" - -#: g10/gpg.c:486 -msgid "prompt before overwriting" -msgstr "覆寫前先詢問" - -#: g10/gpg.c:527 -msgid "use strict OpenPGP behavior" -msgstr "使用嚴謹的 OpenPGP 行為" - -#: g10/gpg.c:528 -msgid "generate PGP 2.x compatible messages" -msgstr "產生 PGP 2.x 相容性訊息" - -#: g10/gpg.c:556 -msgid "" -"@\n" -"(See the man page for a complete listing of all commands and options)\n" -msgstr "" -"@\n" -"(請參照線上說明頁面來取得所有命令和選項的完整清單)\n" - -#: g10/gpg.c:559 -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:757 g10/gpgv.c:98 -msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n" -msgstr "請向 <gnupg-bugs@gnu.org> 回報程式瑕疵.\n" - -#: g10/gpg.c:774 -msgid "Usage: gpg [options] [files] (-h for help)" -msgstr "用法: gpg [選項] [檔案] (或用 -h 求助)" - -#: g10/gpg.c:777 -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:788 -msgid "" -"\n" -"Supported algorithms:\n" -msgstr "" -"\n" -"已被支援的演算法:\n" - -#: g10/gpg.c:791 -msgid "Pubkey: " -msgstr "公鑰: " - -#: g10/gpg.c:797 g10/keyedit.c:2310 -msgid "Cipher: " -msgstr "編密法: " - -#: g10/gpg.c:803 -msgid "Hash: " -msgstr "雜湊: " - -#: g10/gpg.c:809 g10/keyedit.c:2356 -msgid "Compression: " -msgstr "壓縮: " - -#: g10/gpg.c:892 -msgid "usage: gpg [options] " -msgstr "用法: gpg [選項] " - -#: g10/gpg.c:1040 -msgid "conflicting commands\n" -msgstr "指令彼此矛盾\n" - -#: g10/gpg.c:1058 -#, c-format -msgid "no = sign found in group definition `%s'\n" -msgstr "在群組定義 `%s' 裡找不到 = 記號\n" - -#: g10/gpg.c:1255 -#, c-format -msgid "WARNING: unsafe ownership on homedir `%s'\n" -msgstr "警告: 家目錄 `%s' 的所有權並不安全\n" - -#: g10/gpg.c:1258 -#, c-format -msgid "WARNING: unsafe ownership on configuration file `%s'\n" -msgstr "警告: 組態檔案 `%s' 的所有權並不安全\n" - -#: g10/gpg.c:1261 -#, c-format -msgid "WARNING: unsafe ownership on extension `%s'\n" -msgstr "警告: 延伸模組 `%s' 的所有權並不安全\n" - -#: g10/gpg.c:1267 -#, c-format -msgid "WARNING: unsafe permissions on homedir `%s'\n" -msgstr "警告: 家目錄 `%s' 的權限並不安全\n" - -#: g10/gpg.c:1270 -#, c-format -msgid "WARNING: unsafe permissions on configuration file `%s'\n" -msgstr "警告: 組態檔案 `%s' 的權限並不安全\n" - -#: g10/gpg.c:1273 -#, c-format -msgid "WARNING: unsafe permissions on extension `%s'\n" -msgstr "警告: 延伸模組 `%s' 的權限並不安全\n" - -#: g10/gpg.c:1279 -#, c-format -msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n" -msgstr "警告: 家目錄 `%s' 的封入目錄所有權並不安全\n" - -#: g10/gpg.c:1282 -#, c-format -msgid "" -"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n" -msgstr "警告: 組態檔案 `%s' 的封入目錄所有權並不安全\n" - -#: g10/gpg.c:1285 -#, c-format -msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n" -msgstr "警告: 延伸模組 `%s' 的封入目錄所有權並不安全\n" - -#: g10/gpg.c:1291 -#, c-format -msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n" -msgstr "警告: 家目錄 `%s' 的封入目錄權限並不安全\n" - -#: g10/gpg.c:1294 -#, c-format -msgid "" -"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n" -msgstr "警告: 組態檔案 `%s' 的封入目錄權限並不安全\n" - -#: g10/gpg.c:1297 -#, c-format -msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n" -msgstr "警告: 延伸模組 `%s' 的封入目錄權限並不安全\n" - -#: g10/gpg.c:1438 -#, c-format -msgid "unknown configuration item `%s'\n" -msgstr "未知的組態項目 `%s'\n" - -#: g10/gpg.c:1531 -msgid "display photo IDs during key listings" -msgstr "" - -#: g10/gpg.c:1533 -msgid "show policy URLs during signature listings" -msgstr "" - -#: g10/gpg.c:1535 -#, fuzzy -msgid "show all notations during signature listings" -msgstr "在私鑰圈裡沒有一致的簽章\n" - -#: g10/gpg.c:1537 -msgid "show IETF standard notations during signature listings" -msgstr "" - -#: g10/gpg.c:1541 -msgid "show user-supplied notations during signature listings" -msgstr "" - -#: g10/gpg.c:1543 -#, fuzzy -msgid "show preferred keyserver URLs during signature listings" -msgstr "給定的偏好金鑰伺服器 URL 無效\n" - -#: g10/gpg.c:1545 -msgid "show user ID validity during key listings" -msgstr "" - -#: g10/gpg.c:1547 -msgid "show revoked and expired user IDs in key listings" -msgstr "" - -#: g10/gpg.c:1549 -msgid "show revoked and expired subkeys in key listings" -msgstr "" - -#: g10/gpg.c:1551 -#, fuzzy -msgid "show the keyring name in key listings" -msgstr "在私鑰清單和公鑰清單間切換" - -#: g10/gpg.c:1553 -#, fuzzy -msgid "show expiration dates during signature listings" -msgstr "在私鑰圈裡沒有一致的簽章\n" - -#: g10/gpg.c:1920 -#, c-format -msgid "NOTE: old default options file `%s' ignored\n" -msgstr "請注意: 舊有的預設選項檔 `%s' 已被忽略\n" - -#: g10/gpg.c:1962 -#, c-format -msgid "NOTE: no default option file `%s'\n" -msgstr "請注意: 沒有預設選項檔 `%s'\n" - -#: g10/gpg.c:1966 -#, c-format -msgid "option file `%s': %s\n" -msgstr "選項檔 `%s': %s\n" - -#: g10/gpg.c:1973 -#, c-format -msgid "reading options from `%s'\n" -msgstr "從 `%s' 讀取選項\n" - -#: g10/gpg.c:2188 g10/gpg.c:2814 g10/gpg.c:2833 -#, c-format -msgid "NOTE: %s is not for normal use!\n" -msgstr "請注意: 一般情況下不會用到 %s!\n" - -#: g10/gpg.c:2201 -#, c-format -msgid "cipher extension `%s' not loaded due to unsafe permissions\n" -msgstr "編密法延伸模組 `%s' 因為權限不安全而未被載入\n" - -#: g10/gpg.c:2364 g10/gpg.c:2376 -#, c-format -msgid "`%s' is not a valid signature expiration\n" -msgstr "`%s' 不是一個有效的簽章使用期限\n" - -#: g10/gpg.c:2452 -#, c-format -msgid "`%s' is not a valid character set\n" -msgstr "`%s' 不是一個有效的字元集\n" - -#: g10/gpg.c:2476 g10/gpg.c:2663 g10/keyedit.c:4064 -msgid "could not parse keyserver URL\n" -msgstr "無法剖析金鑰伺服器 URI\n" - -#: g10/gpg.c:2488 -#, c-format -msgid "%s:%d: invalid keyserver options\n" -msgstr "%s:%d: 無效的金鑰伺服器選項\n" - -#: g10/gpg.c:2491 -msgid "invalid keyserver options\n" -msgstr "無效的金鑰伺服器選項\n" - -#: g10/gpg.c:2498 -#, c-format -msgid "%s:%d: invalid import options\n" -msgstr "%s:%d: 無效的匯入選項\n" - -#: g10/gpg.c:2501 -msgid "invalid import options\n" -msgstr "無效的匯入選項\n" - -#: g10/gpg.c:2508 -#, c-format -msgid "%s:%d: invalid export options\n" -msgstr "%s:%d: 無效的匯出選項\n" - -#: g10/gpg.c:2511 -msgid "invalid export options\n" -msgstr "無效的匯出選項\n" - -#: g10/gpg.c:2518 -#, c-format -msgid "%s:%d: invalid list options\n" -msgstr "%s:%d: 無效的清單選項\n" - -#: g10/gpg.c:2521 -msgid "invalid list options\n" -msgstr "無效的清單選項\n" - -#: g10/gpg.c:2529 -msgid "display photo IDs during signature verification" -msgstr "" - -#: g10/gpg.c:2531 -msgid "show policy URLs during signature verification" -msgstr "" - -#: g10/gpg.c:2533 -#, fuzzy -msgid "show all notations during signature verification" -msgstr "`%s' 不是一個有效的簽章使用期限\n" - -#: g10/gpg.c:2535 -msgid "show IETF standard notations during signature verification" -msgstr "" - -#: g10/gpg.c:2539 -msgid "show user-supplied notations during signature verification" -msgstr "" - -#: g10/gpg.c:2541 -#, fuzzy -msgid "show preferred keyserver URLs during signature verification" -msgstr "給定的偏好金鑰伺服器 URL 無效\n" - -#: g10/gpg.c:2543 -#, fuzzy -msgid "show user ID validity during signature verification" -msgstr "`%s' 不是一個有效的簽章使用期限\n" - -#: g10/gpg.c:2545 -msgid "show revoked and expired user IDs in signature verification" -msgstr "" - -#: g10/gpg.c:2547 -msgid "validate signatures with PKA data" -msgstr "" - -#: g10/gpg.c:2549 -msgid "elevate the trust of signatures with valid PKA data" -msgstr "" - -#: g10/gpg.c:2556 -#, c-format -msgid "%s:%d: invalid verify options\n" -msgstr "%s:%d: 無效的驗證選項\n" - -#: g10/gpg.c:2559 -msgid "invalid verify options\n" -msgstr "無效的驗證選項\n" - -#: g10/gpg.c:2566 -#, c-format -msgid "unable to set exec-path to %s\n" -msgstr "無法把執行檔路徑設成 %s\n" - -#: g10/gpg.c:2729 -#, fuzzy, c-format -msgid "%s:%d: invalid auto-key-locate list\n" -msgstr "%s:%d: 無效的驗證選項\n" - -#: g10/gpg.c:2732 -msgid "invalid auto-key-locate list\n" -msgstr "" - -#: g10/gpg.c:2803 -msgid "WARNING: program may create a core file!\n" -msgstr "警告: 程式可能會傾印出核心檔!\n" - -#: g10/gpg.c:2807 -#, c-format -msgid "WARNING: %s overrides %s\n" -msgstr "警告: %s 會使得 %s 失效\n" - -#: g10/gpg.c:2816 -#, c-format -msgid "%s not allowed with %s!\n" -msgstr "%s 不被允許跟 %s 併用\n" - -#: g10/gpg.c:2819 -#, c-format -msgid "%s makes no sense with %s!\n" -msgstr "%s 跟 %s 放在一起沒有意義!\n" - -#: g10/gpg.c:2826 -#, c-format -msgid "NOTE: %s is not available in this version\n" -msgstr "注意: %s 在本版中無法使用\n" - -#: g10/gpg.c:2841 -#, c-format -msgid "will not run with insecure memory due to %s\n" -msgstr "因為 %s 而不會在不安全的記憶體中執行\n" - -#: g10/gpg.c:2855 -msgid "you can only make detached or clear signatures while in --pgp2 mode\n" -msgstr "妳祇有在 --pgp2 模式下纔能做出分離式或明文簽章\n" - -#: g10/gpg.c:2861 -msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n" -msgstr "妳在 --pgp2 模式下時, 不能同時簽署和加密\n" - -#: g10/gpg.c:2867 -msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n" -msgstr "啟用 --pgp2 時妳祇應該使用檔案, 而非管道\n" - -#: g10/gpg.c:2880 -msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n" -msgstr "在 --pgp2 模式下加密訊息需要 IDEA 編密法\n" - -#: g10/gpg.c:2947 g10/gpg.c:2971 -msgid "selected cipher algorithm is invalid\n" -msgstr "所選的編密演算法無效\n" - -#: g10/gpg.c:2953 g10/gpg.c:2977 -msgid "selected digest algorithm is invalid\n" -msgstr "所選的摘要演算法無效\n" - -#: g10/gpg.c:2959 -msgid "selected compression algorithm is invalid\n" -msgstr "所選的壓縮演算法無效\n" - -#: g10/gpg.c:2965 -msgid "selected certification digest algorithm is invalid\n" -msgstr "所選的憑證摘要演算法無效\n" - -#: g10/gpg.c:2980 -msgid "completes-needed must be greater than 0\n" -msgstr "completes-needed 一定要大於 0\n" - -#: g10/gpg.c:2982 -msgid "marginals-needed must be greater than 1\n" -msgstr "marginals-needed 一定要大於 1\n" - -#: g10/gpg.c:2984 -msgid "max-cert-depth must be in the range from 1 to 255\n" -msgstr "max-cert-depth 一定要介於 1 和 255 之間\n" - -#: g10/gpg.c:2986 -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:2988 -msgid "invalid min-cert-level; must be 1, 2, or 3\n" -msgstr "無效的 min-cert-level; 一定要是 1, 2 或 3\n" - -#: g10/gpg.c:2991 -msgid "NOTE: simple S2K mode (0) is strongly discouraged\n" -msgstr "請注意: 強烈不建議使用單純的 S2K 模式 (0)\n" - -#: g10/gpg.c:2995 -msgid "invalid S2K mode; must be 0, 1 or 3\n" -msgstr "無效的 S2K 模式; 一定要是 0, 1 或 3\n" - -#: g10/gpg.c:3002 -msgid "invalid default preferences\n" -msgstr "無效的預設偏好\n" - -#: g10/gpg.c:3011 -msgid "invalid personal cipher preferences\n" -msgstr "無效的個人編密法偏好\n" - -#: g10/gpg.c:3015 -msgid "invalid personal digest preferences\n" -msgstr "無效的個人摘要偏好\n" - -#: g10/gpg.c:3019 -msgid "invalid personal compress preferences\n" -msgstr "無效的個人壓縮偏好\n" - -#: g10/gpg.c:3052 -#, c-format -msgid "%s does not yet work with %s\n" -msgstr "%s 還沒辦法跟 %s 一起運作\n" - -#: g10/gpg.c:3099 -#, c-format -msgid "you may not use cipher algorithm `%s' while in %s mode\n" -msgstr "妳不該將編密演算法 `%s' 用於 %s 模式中\n" - -#: g10/gpg.c:3104 -#, c-format -msgid "you may not use digest algorithm `%s' while in %s mode\n" -msgstr "妳不該將摘要演算法 `%s' 用於 %s 模式中\n" - -#: g10/gpg.c:3109 -#, c-format -msgid "you may not use compression algorithm `%s' while in %s mode\n" -msgstr "妳不該將壓縮演算法 `%s' 用於 %s 模式中\n" - -#: g10/gpg.c:3208 -#, c-format -msgid "failed to initialize the TrustDB: %s\n" -msgstr "信任資料庫啟始失敗: %s\n" - -#: g10/gpg.c:3219 -msgid "WARNING: recipients (-r) given without using public key encryption\n" -msgstr "警告: 給定的收件者 (-r) 未使用公鑰加密\n" - -#: g10/gpg.c:3230 -msgid "--store [filename]" -msgstr "--store [檔名]" - -#: g10/gpg.c:3237 -msgid "--symmetric [filename]" -msgstr "--symmetric [檔名]" - -#: g10/gpg.c:3239 -#, c-format -msgid "symmetric encryption of `%s' failed: %s\n" -msgstr "`%s' 的對稱式加密失敗: %s\n" - -#: g10/gpg.c:3249 -msgid "--encrypt [filename]" -msgstr "--encrypt [檔名]" - -#: g10/gpg.c:3262 -msgid "--symmetric --encrypt [filename]" -msgstr "--symmetric --encrypt [檔名]" - -#: g10/gpg.c:3264 -msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n" -msgstr "妳不能在 --s2k-mode 0 中使用 --symmetric --encrypt\n" - -#: g10/gpg.c:3267 -#, c-format -msgid "you cannot use --symmetric --encrypt while in %s mode\n" -msgstr "妳不能在 %s 模式中使用 --symmetric --encrypt\n" - -#: g10/gpg.c:3285 -msgid "--sign [filename]" -msgstr "--sign [檔名]" - -#: g10/gpg.c:3298 -msgid "--sign --encrypt [filename]" -msgstr "--sign --encrypt [檔名]" - -#: g10/gpg.c:3313 -msgid "--symmetric --sign --encrypt [filename]" -msgstr "--symmetric --sign --encrypt [檔名]" - -#: g10/gpg.c:3315 -msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n" -msgstr "妳不能在 --s2k-mode 0 中使用 --symmetric --sign --encrypt\n" - -#: g10/gpg.c:3318 -#, c-format -msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n" -msgstr "妳不能在 %s 模式中使用 --symmetric --sign --encrypt\n" - -#: g10/gpg.c:3338 -msgid "--sign --symmetric [filename]" -msgstr "--sign --symmetric [檔名]" - -#: g10/gpg.c:3347 -msgid "--clearsign [filename]" -msgstr "--clearsign [檔名]" - -#: g10/gpg.c:3372 -msgid "--decrypt [filename]" -msgstr "--decrypt [檔名]" - -#: g10/gpg.c:3380 -msgid "--sign-key user-id" -msgstr "--sign-key 使用者ID" - -#: g10/gpg.c:3384 -msgid "--lsign-key user-id" -msgstr "--lsign-key 使用者ID" - -#: g10/gpg.c:3405 -msgid "--edit-key user-id [commands]" -msgstr "--edit-key 使用者ID [指令]" - -#: g10/gpg.c:3476 -msgid "-k[v][v][v][c] [user-id] [keyring]" -msgstr "-k[v][v][v][c] [使用者ID] [鑰匙圈]" - -#: g10/gpg.c:3518 -#, c-format -msgid "keyserver send failed: %s\n" -msgstr "送至金鑰伺服器時失敗: %s\n" - -#: g10/gpg.c:3520 -#, c-format -msgid "keyserver receive failed: %s\n" -msgstr "從金鑰伺服器接收時失敗: %s\n" - -#: g10/gpg.c:3522 -#, c-format -msgid "key export failed: %s\n" -msgstr "金鑰匯出時失敗: %s\n" - -#: g10/gpg.c:3533 -#, c-format -msgid "keyserver search failed: %s\n" -msgstr "從金鑰伺服器中搜尋時失敗: %s\n" - -#: g10/gpg.c:3543 -#, c-format -msgid "keyserver refresh failed: %s\n" -msgstr "從金鑰伺服器更新時失敗: %s\n" - -#: g10/gpg.c:3594 -#, c-format -msgid "dearmoring failed: %s\n" -msgstr "解開封裝失敗: %s\n" - -#: g10/gpg.c:3602 -#, c-format -msgid "enarmoring failed: %s\n" -msgstr "進行封裝失敗: %s\n" - -#: g10/gpg.c:3689 -#, c-format -msgid "invalid hash algorithm `%s'\n" -msgstr "無效的 `%s' 雜湊演算法\n" - -#: g10/gpg.c:3812 -msgid "[filename]" -msgstr "[檔名]" - -#: g10/gpg.c:3816 -msgid "Go ahead and type your message ...\n" -msgstr "請開始鍵入妳的訊息 ...\n" - -#: g10/gpg.c:4120 -msgid "the given certification policy URL is invalid\n" -msgstr "給定的的憑證原則 URL 無效\n" - -#: g10/gpg.c:4122 -msgid "the given signature policy URL is invalid\n" -msgstr "給定的簽章原則 URL 無效\n" - -#: g10/gpg.c:4155 -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:3707 -#, 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:266 -#, c-format -msgid "skipping block of type %d\n" -msgstr "正在跳過 %d 型態的區塊\n" - -#: g10/import.c:275 -#, c-format -msgid "%lu keys processed so far\n" -msgstr "已有 %lu 把金鑰被處理了\n" - -#: g10/import.c:292 -#, c-format -msgid "Total number processed: %lu\n" -msgstr "總共被處理的數量: %lu\n" - -#: g10/import.c:294 -#, c-format -msgid " skipped new keys: %lu\n" -msgstr " 已跳過的新金鑰: %lu\n" - -#: g10/import.c:297 -#, c-format -msgid " w/o user IDs: %lu\n" -msgstr " 沒有使用者的 ID: %lu\n" - -#: g10/import.c:299 -#, c-format -msgid " imported: %lu" -msgstr " 已匯入: %lu" - -#: g10/import.c:305 -#, c-format -msgid " unchanged: %lu\n" -msgstr " 未改變的: %lu\n" - -#: g10/import.c:307 -#, c-format -msgid " new user IDs: %lu\n" -msgstr " 新的使用者 ID: %lu\n" - -#: g10/import.c:309 -#, c-format -msgid " new subkeys: %lu\n" -msgstr " 新的子鑰: %lu\n" - -#: g10/import.c:311 -#, c-format -msgid " new signatures: %lu\n" -msgstr " 新的簽章: %lu\n" - -#: g10/import.c:313 -#, c-format -msgid " new key revocations: %lu\n" -msgstr " 新的金鑰撤銷: %lu\n" - -#: g10/import.c:315 -#, c-format -msgid " secret keys read: %lu\n" -msgstr " 被讀取的私鑰: %lu\n" - -#: g10/import.c:317 -#, c-format -msgid " secret keys imported: %lu\n" -msgstr " 已匯入的私鑰: %lu\n" - -#: g10/import.c:319 -#, c-format -msgid " secret keys unchanged: %lu\n" -msgstr " 未改變的私鑰: %lu\n" - -#: g10/import.c:321 -#, c-format -msgid " not imported: %lu\n" -msgstr " 未被匯入: %lu\n" - -#: g10/import.c:323 -#, c-format -msgid " signatures cleaned: %lu\n" -msgstr " 已被清除掉的簽章: %lu\n" - -#: g10/import.c:325 -#, c-format -msgid " user IDs cleaned: %lu\n" -msgstr " 已被清除掉的使用者 ID: %lu\n" - -#: g10/import.c:566 -#, 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:570 -#, fuzzy -msgid " algorithms on these user IDs:\n" -msgstr "這些使用者 ID 上的演算法:\n" - -#: g10/import.c:607 -#, c-format -msgid " \"%s\": preference for cipher algorithm %s\n" -msgstr " \"%s\": 編密演算法 %s 的偏好設定\n" - -#: g10/import.c:619 -#, c-format -msgid " \"%s\": preference for digest algorithm %s\n" -msgstr " \"%s\": 摘要演算法 %s 的偏好設定\n" - -#: g10/import.c:631 -#, c-format -msgid " \"%s\": preference for compression algorithm %s\n" -msgstr " \"%s\": 壓縮演算法 %s 的偏好設定\n" - -#: g10/import.c:644 -msgid "it is strongly suggested that you update your preferences and\n" -msgstr "我們強烈建議妳更新妳的偏好設定, 並\n" - -#: g10/import.c:646 -msgid "re-distribute this key to avoid potential algorithm mismatch problems\n" -msgstr "重新散佈此金鑰, 以避免潛在的演算法不一致問題.\n" - -#: g10/import.c:670 -#, 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:720 g10/import.c:1118 -#, c-format -msgid "key %s: no user ID\n" -msgstr "金鑰 %s: 沒有使用者 ID\n" - -#: g10/import.c:749 -#, c-format -msgid "key %s: PKS subkey corruption repaired\n" -msgstr "金鑰 %s: PKS 子鑰的訛誤已被修復\n" - -#: g10/import.c:764 -#, c-format -msgid "key %s: accepted non self-signed user ID \"%s\"\n" -msgstr "金鑰 %s: 非自我簽署的使用者 ID \"%s\" 已被接受\n" - -#: g10/import.c:770 -#, c-format -msgid "key %s: no valid user IDs\n" -msgstr "金鑰 %s: 沒有有效的使用者 ID\n" - -#: g10/import.c:772 -msgid "this may be caused by a missing self-signature\n" -msgstr "這可能是由於遺失自我簽章所導致的後果\n" - -#: g10/import.c:782 g10/import.c:1240 -#, c-format -msgid "key %s: public key not found: %s\n" -msgstr "金鑰 %s: 找不到公鑰: %s\n" - -#: g10/import.c:788 -#, c-format -msgid "key %s: new key - skipped\n" -msgstr "金鑰 %s: 新的金鑰 - 已跳過\n" - -#: g10/import.c:797 -#, c-format -msgid "no writable keyring found: %s\n" -msgstr "找不到可寫的鑰匙圈: %s\n" - -#: g10/import.c:802 g10/openfile.c:267 g10/sign.c:831 g10/sign.c:1135 -#, c-format -msgid "writing to `%s'\n" -msgstr "正在寫到 `%s'\n" - -#: g10/import.c:806 g10/import.c:901 g10/import.c:1158 g10/import.c:1301 -#: g10/import.c:2363 g10/import.c:2385 -#, c-format -msgid "error writing keyring `%s': %s\n" -msgstr "寫到鑰匙圈 `%s' 時發生錯誤: %s\n" - -#: g10/import.c:825 -#, c-format -msgid "key %s: public key \"%s\" imported\n" -msgstr "金鑰 %s: 公鑰 \"%s\" 已被匯入\n" - -#: g10/import.c:849 -#, c-format -msgid "key %s: doesn't match our copy\n" -msgstr "金鑰 %s: 跟我們的副本不吻合\n" - -#: g10/import.c:866 g10/import.c:1258 -#, c-format -msgid "key %s: can't locate original keyblock: %s\n" -msgstr "金鑰 %s: 無法定位原始的金鑰區塊: %s\n" - -#: g10/import.c:874 g10/import.c:1265 -#, c-format -msgid "key %s: can't read original keyblock: %s\n" -msgstr "金鑰 %s: 無法讀取原始的金鑰區塊: %s\n" - -#: g10/import.c:911 -#, c-format -msgid "key %s: \"%s\" 1 new user ID\n" -msgstr "金鑰 %s: \"%s\" 1 個新的使用者 ID\n" - -#: g10/import.c:914 -#, c-format -msgid "key %s: \"%s\" %d new user IDs\n" -msgstr "金鑰 %s: \"%s\" %d 個新的使用者 ID\n" - -#: g10/import.c:917 -#, c-format -msgid "key %s: \"%s\" 1 new signature\n" -msgstr "金鑰 %s: \"%s\" 1 個新的簽章\n" - -#: g10/import.c:920 -#, c-format -msgid "key %s: \"%s\" %d new signatures\n" -msgstr "金鑰 %s: \"%s\" %d 個新的簽章\n" - -#: g10/import.c:923 -#, c-format -msgid "key %s: \"%s\" 1 new subkey\n" -msgstr "金鑰 %s: \"%s\" 1 個新的子鑰\n" - -#: g10/import.c:926 -#, c-format -msgid "key %s: \"%s\" %d new subkeys\n" -msgstr "金鑰 %s: \"%s\" %d 個新的子鑰\n" - -#: g10/import.c:929 -#, c-format -msgid "key %s: \"%s\" %d signature cleaned\n" -msgstr "金鑰 %s: \"%s\" 已清除掉 %d 份簽章\n" - -#: g10/import.c:932 -#, c-format -msgid "key %s: \"%s\" %d signatures cleaned\n" -msgstr "金鑰 %s: \"%s\" 已清除掉 %d 份簽章\n" - -#: g10/import.c:935 -#, c-format -msgid "key %s: \"%s\" %d user ID cleaned\n" -msgstr "金鑰 %s: \"%s\" 已清除掉 %d 個使用者 ID\n" - -#: g10/import.c:938 -#, c-format -msgid "key %s: \"%s\" %d user IDs cleaned\n" -msgstr "金鑰 %s: \"%s\" 已清除掉 %d 個使用者 ID\n" - -#: g10/import.c:961 -#, c-format -msgid "key %s: \"%s\" not changed\n" -msgstr "金鑰 %s: \"%s\" 沒有被改變\n" - -#: g10/import.c:1124 -#, c-format -msgid "key %s: secret key with invalid cipher %d - skipped\n" -msgstr "金鑰 %s: 私鑰使用了無效的編密法 %d - 已跳過\n" - -#: g10/import.c:1135 -msgid "importing secret keys not allowed\n" -msgstr "未被允許匯入私鑰\n" - -#: g10/import.c:1152 g10/import.c:2378 -#, c-format -msgid "no default secret keyring: %s\n" -msgstr "沒有預設的私鑰鑰匙圈: %s\n" - -#: g10/import.c:1163 -#, c-format -msgid "key %s: secret key imported\n" -msgstr "金鑰 %s: 私鑰被匯入了\n" - -#: g10/import.c:1193 -#, c-format -msgid "key %s: already in secret keyring\n" -msgstr "金鑰 %s: 已經在私鑰鑰匙圈中了\n" - -#: g10/import.c:1203 -#, c-format -msgid "key %s: secret key not found: %s\n" -msgstr "金鑰 %s: 找不到私鑰: %s\n" - -#: g10/import.c:1233 -#, c-format -msgid "key %s: no public key - can't apply revocation certificate\n" -msgstr "金鑰 %s: 沒有公鑰 - 無法套用撤銷憑證\n" - -#: g10/import.c:1276 -#, c-format -msgid "key %s: invalid revocation certificate: %s - rejected\n" -msgstr "金鑰 %s: 無效的撤銷憑證: %s - 已駁回\n" - -#: g10/import.c:1308 -#, c-format -msgid "key %s: \"%s\" revocation certificate imported\n" -msgstr "金鑰 %s: \"%s\" 撤銷憑證已被匯入\n" - -#: g10/import.c:1374 -#, c-format -msgid "key %s: no user ID for signature\n" -msgstr "金鑰 %s: 簽章沒有使用者 ID\n" - -#: g10/import.c:1389 -#, c-format -msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n" -msgstr "金鑰 %s: 使用者 ID \"%s\" 使用了未被支援的公鑰演算法\n" - -#: g10/import.c:1391 -#, c-format -msgid "key %s: invalid self-signature on user ID \"%s\"\n" -msgstr "金鑰 %s: 使用者 ID \"%s\" 有無效的自我簽章\n" - -#: g10/import.c:1409 -#, c-format -msgid "key %s: no subkey for key binding\n" -msgstr "金鑰 %s: 沒有子鑰可供附帶\n" - -#: g10/import.c:1420 g10/import.c:1470 -#, c-format -msgid "key %s: unsupported public key algorithm\n" -msgstr "金鑰 %s: 未被支援的公鑰演算法\n" - -#: g10/import.c:1422 -#, c-format -msgid "key %s: invalid subkey binding\n" -msgstr "金鑰 %s: 無效的附帶子鑰\n" - -#: g10/import.c:1437 -#, c-format -msgid "key %s: removed multiple subkey binding\n" -msgstr "金鑰 %s: 多重附帶子鑰已被移除\n" - -#: g10/import.c:1459 -#, c-format -msgid "key %s: no subkey for key revocation\n" -msgstr "金鑰 %s: 沒有子鑰可供金鑰撤銷\n" - -#: g10/import.c:1472 -#, c-format -msgid "key %s: invalid subkey revocation\n" -msgstr "金鑰 %s: 無效的子鑰撤銷\n" - -#: g10/import.c:1487 -#, c-format -msgid "key %s: removed multiple subkey revocation\n" -msgstr "金鑰 %s: 多重子鑰撤銷已移除\n" - -#: g10/import.c:1529 -#, c-format -msgid "key %s: skipped user ID \"%s\"\n" -msgstr "金鑰 %s: 使用者 ID \"%s\" 已跳過\n" - -#: g10/import.c:1550 -#, 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:1577 -#, c-format -msgid "key %s: non exportable signature (class 0x%02X) - skipped\n" -msgstr "金鑰 %s: 不可匯出的簽章 (等級 0x%02X) - 已跳過\n" - -#: g10/import.c:1587 -#, c-format -msgid "key %s: revocation certificate at wrong place - skipped\n" -msgstr "金鑰 %s: 撤銷憑證在錯誤的地方 - 已跳過\n" - -#: g10/import.c:1604 -#, c-format -msgid "key %s: invalid revocation certificate: %s - skipped\n" -msgstr "金鑰 %s: 無效的撤銷憑證: %s - 已跳過\n" - -#: g10/import.c:1618 -#, c-format -msgid "key %s: subkey signature in wrong place - skipped\n" -msgstr "金鑰 %s: 子鑰簽章在錯誤的地方 - 已跳過\n" - -#: g10/import.c:1626 -#, c-format -msgid "key %s: unexpected signature class (0x%02X) - skipped\n" -msgstr "金鑰 %s: 非預期的簽章等級 (0x%02X) - 已跳過\n" - -#: g10/import.c:1726 -#, c-format -msgid "key %s: duplicated user ID detected - merged\n" -msgstr "金鑰 %s: 偵測到重複的使用者 ID - 已合併\n" - -#: g10/import.c:1788 -#, c-format -msgid "WARNING: key %s may be revoked: fetching revocation key %s\n" -msgstr "警告: 金鑰 %s 可能被撤銷了: 正在取回撤銷金鑰 %s\n" - -#: g10/import.c:1802 -#, c-format -msgid "WARNING: key %s may be revoked: revocation key %s not present.\n" -msgstr "警告: 金鑰 %s 可能被撤銷了: 撤銷金鑰 %s 未出現.\n" - -#: g10/import.c:1861 -#, c-format -msgid "key %s: \"%s\" revocation certificate added\n" -msgstr "金鑰 %s: 已新增 \"%s\" 撤銷憑證\n" - -#: g10/import.c:1895 -#, c-format -msgid "key %s: direct key signature added\n" -msgstr "金鑰 %s: 已新增直接金鑰簽章\n" - -#: g10/import.c:2284 -msgid "NOTE: a key's S/N does not match the card's one\n" -msgstr "請注意: 某份金鑰的序號 (S/N) 與卡片的序號並不吻合\n" - -#: g10/import.c:2292 -msgid "NOTE: primary key is online and stored on card\n" -msgstr "請注意: 主鑰在線上且已存放於卡片上了\n" - -#: g10/import.c:2294 -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:4783 g10/keyedit.c:4874 g10/keyedit.c:4938 -#: g10/keyedit.c:4999 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:3346 -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:3249 -#, fuzzy, c-format -msgid "User ID \"%s\": already clean\n" -msgstr "使用者 ID \"%s\": 已經是乾淨的了.\n" - -#: g10/keyedit.c:3341 -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:3352 -msgid "You may not add a designated revoker to a PGP 2.x-style key.\n" -msgstr "妳不可以把指定撤銷者增加到 PGP2 型態的金鑰裡.\n" - -#: g10/keyedit.c:3372 -msgid "Enter the user ID of the designated revoker: " -msgstr "輸入指定撤銷者的使用者 ID: " - -#: g10/keyedit.c:3397 -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:3412 -msgid "you cannot appoint a key as its own designated revoker\n" -msgstr "妳不能指派某把金鑰為它自己的指定撤銷者\n" - -#: g10/keyedit.c:3434 -msgid "this key has already been designated as a revoker\n" -msgstr "這把金鑰已被指定為撤銷者了\n" - -#: g10/keyedit.c:3453 -msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n" -msgstr "警告: 一旦把某把金鑰指派為指定撤銷者後, 就無法反悔了!\n" - -#: g10/keyedit.c:3459 -msgid "" -"Are you sure you want to appoint this key as a designated revoker? (y/N) " -msgstr "妳確定要指派這把金鑰為指定撤銷者嗎? (y/N) " - -#: g10/keyedit.c:3520 -msgid "Please remove selections from the secret keys.\n" -msgstr "請從私鑰中移除選擇.\n" - -#: g10/keyedit.c:3526 -msgid "Please select at most one subkey.\n" -msgstr "請至多選擇一把次鑰.\n" - -#: g10/keyedit.c:3530 -msgid "Changing expiration time for a subkey.\n" -msgstr "正在變更某把次鑰的使用期限.\n" - -#: g10/keyedit.c:3533 -msgid "Changing expiration time for the primary key.\n" -msgstr "正在變更主鑰的使用期限.\n" - -#: g10/keyedit.c:3579 -msgid "You can't change the expiration date of a v3 key\n" -msgstr "妳不能變更 v3 金鑰的使用期限\n" - -#: g10/keyedit.c:3595 -msgid "No corresponding signature in secret ring\n" -msgstr "在私鑰圈裡沒有一致的簽章\n" - -#: g10/keyedit.c:3668 -#, fuzzy, c-format -msgid "signing subkey %s is already cross-certified\n" -msgstr "警告: 正要簽署的子鑰 %s 未經交叉認證\n" - -#: g10/keyedit.c:3674 -#, c-format -msgid "subkey %s does not sign and so does not need to be cross-certified\n" -msgstr "" - -#: g10/keyedit.c:3836 -msgid "Please select exactly one user ID.\n" -msgstr "請精確地選擇一個使用者 ID.\n" - -#: g10/keyedit.c:3875 g10/keyedit.c:3985 g10/keyedit.c:4105 g10/keyedit.c:4246 -#, c-format -msgid "skipping v3 self-signature on user ID \"%s\"\n" -msgstr "正在跳過使用者 ID \"%s\" 的 v3 自我簽章\n" - -#: g10/keyedit.c:4046 -msgid "Enter your preferred keyserver URL: " -msgstr "請輸入妳的偏好金鑰伺服器 URL: " - -#: g10/keyedit.c:4126 -msgid "Are you sure you want to replace it? (y/N) " -msgstr "妳確定要取代它嗎? (y/N) " - -#: g10/keyedit.c:4127 -msgid "Are you sure you want to delete it? (y/N) " -msgstr "妳確定要刪除它嗎? (y/N) " - -#: g10/keyedit.c:4189 -#, fuzzy -msgid "Enter the notation: " -msgstr "簽章標記: " - -#: g10/keyedit.c:4338 -#, fuzzy -msgid "Proceed? (y/N) " -msgstr "是否覆寫? (y/N) " - -#: g10/keyedit.c:4402 -#, c-format -msgid "No user ID with index %d\n" -msgstr "索引 %d 沒有對應到使用者 ID\n" - -#: g10/keyedit.c:4460 -#, c-format -msgid "No user ID with hash %s\n" -msgstr "雜湊 %s 沒有對應到使用者 ID\n" - -#: g10/keyedit.c:4487 -#, c-format -msgid "No subkey with index %d\n" -msgstr "索引 %d 沒有對應到次鑰\n" - -#: g10/keyedit.c:4622 -#, c-format -msgid "user ID: \"%s\"\n" -msgstr "使用者 ID: \"%s\"\n" - -#: g10/keyedit.c:4625 g10/keyedit.c:4689 g10/keyedit.c:4732 -#, c-format -msgid "signed by your key %s on %s%s%s\n" -msgstr "已被妳的金鑰 %s 於 %s%s%s 簽署了\n" - -#: g10/keyedit.c:4627 g10/keyedit.c:4691 g10/keyedit.c:4734 -msgid " (non-exportable)" -msgstr " (不可匯出)" - -#: g10/keyedit.c:4631 -#, c-format -msgid "This signature expired on %s.\n" -msgstr "這份簽署已經在 %s 過期了.\n" - -#: g10/keyedit.c:4635 -msgid "Are you sure you still want to revoke it? (y/N) " -msgstr "妳確定妳仍然想要撤銷它嗎? (y/N) " - -#: g10/keyedit.c:4639 -msgid "Create a revocation certificate for this signature? (y/N) " -msgstr "要為這份簽章建立一份撤銷憑證嗎? (y/N) " - -#: g10/keyedit.c:4666 -#, c-format -msgid "You have signed these user IDs on key %s:\n" -msgstr "妳已經簽署了金鑰 %s 上的這些使用者 ID:\n" - -#: g10/keyedit.c:4692 -msgid " (non-revocable)" -msgstr " (不可撤銷)" - -#: g10/keyedit.c:4699 -#, c-format -msgid "revoked by your key %s on %s\n" -msgstr "被妳的金鑰 %s 於 %s 所撤銷了\n" - -#: g10/keyedit.c:4721 -msgid "You are about to revoke these signatures:\n" -msgstr "妳正在撤銷這些簽章:\n" - -#: g10/keyedit.c:4741 -msgid "Really create the revocation certificates? (y/N) " -msgstr "真的要建立撤銷憑證嗎? (y/N) " - -#: g10/keyedit.c:4771 -msgid "no secret key\n" -msgstr "沒有私鑰\n" - -#: g10/keyedit.c:4841 -#, c-format -msgid "user ID \"%s\" is already revoked\n" -msgstr "使用者 ID \"%s\" 已經被撤銷了\n" - -#: g10/keyedit.c:4858 -#, c-format -msgid "WARNING: a user ID signature is dated %d seconds in the future\n" -msgstr "警告: 有一份使用者 ID 簽章的日期標記為 %d 秒後的未來\n" - -#: g10/keyedit.c:4922 -#, c-format -msgid "Key %s is already revoked.\n" -msgstr "金鑰 %s 已經被撤銷了.\n" - -#: g10/keyedit.c:4984 -#, c-format -msgid "Subkey %s is already revoked.\n" -msgstr "次鑰 %s 已經被撤銷了.\n" - -#: g10/keyedit.c:5079 -#, 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:1421 -#, 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:1324 -#, c-format -msgid "sending key %s to %s server %s\n" -msgstr "遞送金鑰 %s 至 %s 伺服器 %s\n" - -#: g10/keyserver.c:1328 -#, c-format -msgid "sending key %s to %s\n" -msgstr "遞送金鑰 %s 至 %s\n" - -#: g10/keyserver.c:1371 -#, c-format -msgid "searching for \"%s\" from %s server %s\n" -msgstr "正在搜尋 \"%s\" 於 %s 伺服器 %s\n" - -#: g10/keyserver.c:1374 -#, c-format -msgid "searching for \"%s\" from %s\n" -msgstr "正在搜尋 \"%s\" 於 %s\n" - -#: g10/keyserver.c:1381 g10/keyserver.c:1477 -msgid "no keyserver action!\n" -msgstr "沒有金鑰伺服器動作!\n" - -#: g10/keyserver.c:1429 -#, c-format -msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n" -msgstr "警告: 金鑰伺服器經手程式 (handler) 係來自不同版本的 GnuPG (%s)\n" - -#: g10/keyserver.c:1438 -msgid "keyserver did not send VERSION\n" -msgstr "金鑰伺服器並未送出版本 (VERSION)\n" - -#: g10/keyserver.c:1500 g10/keyserver.c:2028 -msgid "no keyserver known (use option --keyserver)\n" -msgstr "沒有已知的金鑰伺服器 (使用 --keyserver 選項)\n" - -#: g10/keyserver.c:1506 -msgid "external keyserver calls are not supported in this build\n" -msgstr "本版並不支援外部金鑰伺服器叫用\n" - -#: g10/keyserver.c:1518 -#, c-format -msgid "no handler for keyserver scheme `%s'\n" -msgstr "沒有金鑰伺服器方案 (scheme) `%s' 的經手程式 (handler)\n" - -#: g10/keyserver.c:1523 -#, c-format -msgid "action `%s' not supported with keyserver scheme `%s'\n" -msgstr "動作 `%s' 並未被金鑰伺服器方案 (scheme) `%s' 所支援\n" - -#: g10/keyserver.c:1531 -#, c-format -msgid "%s does not support handler version %d\n" -msgstr "%s 並不支援經手程式 (handler) 版本 %d\n" - -#: g10/keyserver.c:1538 -msgid "keyserver timed out\n" -msgstr "金鑰伺服器逾時\n" - -#: g10/keyserver.c:1543 -msgid "keyserver internal error\n" -msgstr "金鑰伺服器內部出錯\n" - -#: g10/keyserver.c:1552 -#, c-format -msgid "keyserver communications error: %s\n" -msgstr "金鑰伺服器通訊出錯: %s\n" - -#: g10/keyserver.c:1577 g10/keyserver.c:1611 -#, c-format -msgid "\"%s\" not a key ID: skipping\n" -msgstr "\"%s\" 並非金鑰 ID: 正跳過\n" - -#: g10/keyserver.c:1870 -#, c-format -msgid "WARNING: unable to refresh key %s via %s: %s\n" -msgstr "警告: 無法更新金鑰 %s 於 %s: %s\n" - -#: g10/keyserver.c:1892 -#, c-format -msgid "refreshing 1 key from %s\n" -msgstr "正從 %s 更新 1 份金鑰\n" - -#: g10/keyserver.c:1894 -#, c-format -msgid "refreshing %d keys from %s\n" -msgstr "正在更新 %d 份金鑰自 %s\n" - -#: g10/keyserver.c:1950 -#, fuzzy, c-format -msgid "WARNING: unable to fetch URI %s: %s\n" -msgstr "警告: 無法更新金鑰 %s 於 %s: %s\n" - -#: g10/keyserver.c:1956 -#, 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:305 -#, c-format -msgid "assuming signed data in `%s'\n" -msgstr "假設被簽署的資料在 `%s'\n" - -#: g10/openfile.c:384 -#, c-format -msgid "new configuration file `%s' created\n" -msgstr "新的設定檔 `%s' 被建立了\n" - -#: g10/openfile.c:386 -#, c-format -msgid "WARNING: options in `%s' are not yet active during this run\n" -msgstr "警告: 在 `%s' 裡的選項於這次執行期間並沒有被啟用\n" - -#: g10/openfile.c:418 -#, 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:1157 -#, 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:968 -msgid "can't query passphrase in batch mode\n" -msgstr "無法在批次模式中查詢密語\n" - -#: g10/passphrase.c:812 g10/passphrase.c:973 -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:977 -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:127 g10/skclist.c:191 -msgid "key is not flagged as insecure - can't use it with the faked RNG!\n" -msgstr "金鑰未被標示為不安全 - 不能夠拿來跟假的隨機數字產生器併用!\n" - -#: g10/skclist.c:158 -#, c-format -msgid "skipped \"%s\": duplicated\n" -msgstr "已跳過 \"%s\": 重複了\n" - -#: g10/skclist.c:166 g10/skclist.c:176 g10/skclist.c:185 -#, c-format -msgid "skipped \"%s\": %s\n" -msgstr "已跳過 \"%s\": %s\n" - -#: g10/skclist.c:171 -msgid "skipped: secret key already present\n" -msgstr "已跳過: 私鑰已經存在\n" - -#: g10/skclist.c:186 -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:350 -msgid "operation is not possible without initialized secure memory\n" -msgstr "尚未啟用安全的記憶體前, 不可能進行操作\n" - -#: util/secmem.c:351 -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/scd/ChangeLog b/scd/ChangeLog new file mode 100644 index 000000000..ba2ede72c --- /dev/null +++ b/scd/ChangeLog @@ -0,0 +1,1430 @@ +2006-06-28 Werner Koch <wk@g10code.com> + + * 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-09 Marcus Brinkmann <marcus@g10code.de> + + * Makefile.am (scdaemon_LDADD): Add $(NETLIBS). + +2006-04-14 Marcus Brinkmann <marcus@g10code.de> + + * app.c (select_application): Cover up a slot mismatch error in + case it happens (it shouldn't happen). + (release_application): Use APP->slot. Lock the reader. + (application_notify_card_removed): Lock the reader. + +2006-04-11 Werner Koch <wk@g10code.com> + + * command.c (hex_to_buffer): New. + (cmd_apdu): New. + +2006-04-03 Werner Koch <wk@g10code.com> + + * scdaemon.c [__GLIBC__]: Default to libpcsclite.so.1. + +2006-03-21 Werner Koch <wk@g10code.com> + + * command.c (cmd_pksign): Add --hash option. + +2006-03-01 Werner Koch <wk@g10code.com> + + * command.c (status_file_update_lock): New. + (scd_update_reader_status_file): Use lock and factor existing code + out to .. + (update_reader_status_file): .. this. + (do_reset): Use the lock and call update_reader_status_file. + +2006-02-20 Werner Koch <wk@g10code.com> + + * apdu.c (open_pcsc_reader): Fixed double free. Thanks to Moritz. + +2006-02-09 Werner Koch <wk@g10code.com> + + * command.c (get_reader_slot, do_reset) + (scd_update_reader_status_file): Rewrote. + + * app.c (release_application): Factored code out to .. + (deallocate_app): new function. + (select_application): Introduce new saved application stuff. + (application_notify_card_removed): New. + * command.c (update_card_removed): Call it here. + (do_reset): And here. + + * app.c (check_application_conflict): New. + * command.c (open_card): Use it here. + (cmd_restart): New command. + + * command.c (cmd_lock): Fixed --wait option to actually terminate. + +2006-02-08 Werner Koch <wk@g10code.com> + + * ccid-driver.c (ccid_get_atr): Read Parameter and select T=1 + using these parameters. + (scan_or_find_devices): Check for NULL r_fd. + +2006-02-02 Werner Koch <wk@g10code.com> + + * 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-01 Werner Koch <wk@g10code.com> + + * app-openpgp.c (do_sign): Give user error if hash algorithm is + not supported by the card. + +2005-12-06 Werner Koch <wk@g10code.com> + + * apdu.c (open_pcsc_reader): Check that pcsc-wrapper is actually + installed. + +2005-11-23 Werner Koch <wk@g10code.com> + + * app-nks.c (verify_pin): Give a special error message for a Nullpin. + +2005-10-29 Werner Koch <wk@g10code.com> + + * ccid-driver.c (send_escape_cmd): New args RESULT, RESULTLEN and + RESULTMAX. Changed all callers. + (ccid_transceive_escape): New. + +2005-10-27 Werner Koch <wk@g10code.com> + + * apdu.c [__CYGWIN__]: Make cygwin environment similar to _WIN32. + Suggested by John P. Clizbe. + * scdaemon.c [__CYGWIN__]: Set default PC/SC driver to winscard.dll. + +2005-10-19 Werner Koch <wk@g10code.com> + + * ccid-driver.h (CCID_DRIVER_ERR_NO_KEYPAD): New. + * apdu.h (SW_HOST_NO_KEYPAD): New. + * iso7816.h (struct iso7816_pininfo_s): New. + * iso7816.c (map_sw): Support new code. + (iso7816_check_keypad): New. + (iso7816_verify_kp, iso7816_change_reference_data_kp) + (iso7816_reset_retry_counter_kp): New. Extended versions of the + original functions. + * 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. + + * scdaemon.c: New option --disable-keypad. + +2005-10-08 Marcus Brinkmann <marcus@g10code.de> + + * Makefile.am (scdaemon_LDADD): Add ../gl/libgnu.a after + ../common/libcommon.a. + +2005-09-20 Werner Koch <wk@g10code.com> + + * app-dinsig.c (verify_pin): Try ISO 9564 BCD encoding. + + * iso7816.c (iso7816_select_application): Add arg FLAGS. Changed + all callers to pass 0. + * app-openpgp.c (app_select_openpgp): But this one requires a + special flag. + + * app-p15.c (app_select_p15): Don't use select application for the + BELPIC. + +2005-09-09 Werner Koch <wk@g10code.com> + + * pcsc-wrapper.c (main): Removed bogus free. + + * app-p15.c (do_auth): New. + (do_getattr): New attribs $AUTHKEYID and $DISPSERIALNO. + * app-openpgp.c (do_getattr): Ditto. + +2005-09-08 Werner Koch <wk@g10code.com> + + * app-openpgp.c (do_getattr): New key $AUTHKEYID. + +2005-09-06 Werner Koch <wk@g10code.com> + + * app-p15.c (do_sign): Tweaked for BELPIC cards. + (read_home_df): New arg R_BELPIC. + (app_select_p15): Set card type for BELPIC. + +2005-09-05 Werner Koch <wk@g10code.com> + + * iso7816.c (iso7816_select_path): New. + * app-p15.c (select_ef_by_path): Allow for direct path selection. + (app_select_p15): Try using the Belgian variant of pkcs#15. + (read_home_df): New. + (read_ef_odf): Generalized. + (read_ef_tokeninfo): New. + (read_p15_info): Set serialnumber from TokenInfo. + (app_select_p15): Don't munge serialNumber - that must be done + only once. + + * 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. + * pcsc-wrapper.c (handle_status): Return the current protocol as + a new third word. + +2005-08-05 Werner Koch <wk@g10code.com> + + * apdu.c (open_rapdu_reader): Set the reader number. + +2005-07-05 Werner Koch <wk@g10code.com> + + * app-openpgp.c (do_readkey): Return a mallcoed copy of the key as + required by the description. Thanks to Moritz for tracking this + problem down. + +2005-06-21 Werner Koch <wk@g10code.com> + + * scdaemon.c (main): ifdef call to ccid_set_debug_level. + + * apdu.c (reset_pcsc_reader, open_pcsc_reader): Cast size_t to + ulong for printf. + +2005-06-06 Werner Koch <wk@g10code.com> + + * scdaemon.c (main): New option --debug-allow-core-dump. + +2005-06-03 Werner Koch <wk@g10code.com> + + * scdaemon.c (handle_connections): Make sure that the signals we + are handling are not blocked.Block signals while creating new + threads. + (handle_connections): Include the file descriptor into the name of + the thread. + +2005-06-02 Werner Koch <wk@g10code.com> + + * app.c (app_dump_state, dump_mutex_state): New. + * scdaemon.c (handle_signal): Print it on SIGUSR1. + + * app-openpgp.c (do_writekey): Typo fix. + + * command.c (open_card): Check for locked state even if an + application context is available. + + * app-common.h: Add REF_COUNT field. + * app.c (release_application, select_application): Implement + reference counting to share the context beween connections. + + * app.c (lock_reader, unlock_reader): Take SLOT instead of APP as + argument. Changed all callers. + (select_application): Unlock the reader on error. This should fix + the hangs I noticed last week. + + * scdaemon.h: Removed card_ctx_t cruft. + +2005-06-01 Werner Koch <wk@g10code.com> + + * scdaemon.c: Include mkdtemp.h. + +2005-05-31 Werner Koch <wk@g10code.com> + + * tlv.c [GNUPG_MAJOR_VERSION==1]: Define constants instead of + including a gnupg 1.4 header. + +2005-05-30 Werner Koch <wk@g10code.com> + + * tlv.c: Add hack to compile without gpg-error.h when used with + GnuPG 1.4. + +2005-05-23 Werner Koch <wk@g10code.com> + + * Makefile.am: Do not build sc-copykeys anymore. + + * app-openpgp.c (app_openpgp_storekey, app_openpgp_readkey) + (app_openpgp_cardinfo): Removed. + + * ccid-driver.c (parse_ccid_descriptor): SCR335 FW version 5.14 is + 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> + + * scdaemon.c (handle_signal): Print thread info on SIGUSR1. + +2005-05-20 Werner Koch <wk@g10code.com> + + * ccid-driver.c: Replaced macro DEBUG_T1 by a new debug level. + (parse_ccid_descriptor): Mark SCR335 firmware version 5.18 good. + (ccid_transceive): Arghhh. The seqno is another bit in the + R-block than in the I block, this was wrong at one place. + + * scdaemon.c: New options --debug-ccid-driver and + --debug-disable-ticker. + + * app-openpgp.c (do_genkey, do_writekey): Factored code to check + for existing key out into .. + (does_key_exist): .. New function. + +2005-05-19 Werner Koch <wk@g10code.com> + + * tlv.c (parse_sexp): New. + + * command.c (cmd_writekey): New. + * app.c (app_writekey): New. + * app-common.c (app_t): Add function ptr WRITEKEY. + * app-openpgp.c (do_writekey): New. + + * app-openpgp.c (do_readkey) [GNUPG_MAJOR_VERSION==1]: Return error. + * app-common.h (app_t) [GNUPG_MAJOR_VERSION==1]: Add a field to + store the Assuan context. + +2005-05-17 Werner Koch <wk@g10code.com> + + * scdaemon.c: Removed non-pth code paths. + (create_socket_name, create_server_socket): New. Taken from + ../agent/gpg-agent. + (cleanup): Changed to adjust for SOCKET_NAME now being malloced. + (ticker_thread): Always use pth_event_occurred; it is again + defined for all decent PTH versions. + (handle_connections): New. Based on the gpg-agent code. + (start_connection_thread): Ditto. + (ticker_thread): Removed. + (cleanup_sh): Removed. + (main): Run the handler for the pipe server in a separate + thread. This replaces the old ticker thread. + (scd_get_socket_name): New. + * command.c (cmd_getinfo): New command GETINFO. + (scd_command_handler): Renamed argument and changed code to use an + already connected FD. + +2005-05-15 Werner Koch <wk@g10code.com> + + * app.c, app-common.h, app-nks.c, app-p15.c, app-dinsig.c + * app-openpgp.c: Change most function return types from int to + gpg_error_t. + * command.c (pin_cb): Ditto. + * sc-copykeys.c (pincb): Ditto. + + * app.c (lock_reader, unlock_reader): New. Changed call handler + wrappers to make use of these functions. + +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-04-27 Werner Koch <wk@g10code.com> + + * app-p15.c (micardo_mse): New. + (do_sign): Call it. + * iso7816.c (iso7816_manage_security_env): Allow passing DATA as + NULL to indicate an empty Lc. + * tlv.c (find_tlv): Check that a found object fits into the + buffer. + (find_tlv_unchecked): New as replacement for the old non-checking + variant. + * app.c (select_application): Keep on using the non-checking + variant. + * app-openpgp.c (get_one_do, dump_all_do): Ditto. + + + Removal of the old OpenSC based code. + + * app-p15.c: New. Basic support for pkcs15 cards without OpenSC. + There are quite a couple of things missing but at least I can use + my old TCOS cards from the Aegypten-1 development for signing. + * app.c (select_application): Detect pkcs15 applications. + * Makefile.am (scdaemon_SOURCES): Removed card.c, card-common.h + and card-p15.c because they are now obsolete. Added app-p15.c. + Removed all OpenSC stuff. + * command.c (do_reset, open_card, cmd_serialno, cmd_learn) + (cmd_readcert, cmd_readkey, cmd_pksign, cmd_pkdecrypt): Removed + all special cases for the old card.c based mechanisms. + * scdaemon.c, apdu.c: Removed all special cases for OpenSC. + +2005-04-20 Werner Koch <wk@g10code.com> + + * command.c: Use GPG_ERR_LOCKED instead of EBUSY. + +2005-04-14 Werner Koch <wk@g10code.com> + + * app-openpgp.c (retrieve_key_material): Rewritten. Return a + proper error code. + (retrieve_next_token): Removed. + (retrieve_fpr_from_card): Rewritten to make use of DO caching and + to take the KEYNO as arg. + (get_public_key): Renamed variable for clarity. + +2005-04-12 Werner Koch <wk@g10code.com> + + Basic support for several sessions. + + * command.c (scd_command_handler): Replace the primary_connection + stuff by a real connection list. Release the local context on + exit. + (scd_update_reader_status_file): Update accordingly. Send signal + to all connections who registered an event signal. + (cmd_lock, cmd_unlock, register_commands): New commands LOCK and + UNLOCK. + (cmd_setdata, cmd_pksign, cmd_pkauth, cmd_pkdecrypt, cmd_setattr) + (cmd_genkey, cmd_passwd, cmd_checkpin): Return an error if reader + is locked. + (do_reset): Handle locking. + (open_card): Ditto. Share the reader slot with other sessions. + (get_reader_slot): New. + (update_card_removed): New. Use it in the TEST_CARD_REMOVAL macro. + +2005-04-07 Werner Koch <wk@g10code.com> + + * app-openpgp.c (do_check_pin): Add hack to allow verification of + CHV3. + (get_public_key): Don't use gcry functions to create S-expressions. + (do_deinit, do_readkey, do_genkey, send_keypair_info): Adjust for + above change. + +2005-03-29 Moritz Schulte <moritz@g10code.com> + + * app-openpgp.c (retrieve_fpr_from_card): New function. + (retrieve_next_token): New function. + (retrieve_key_material): New function. + (get_public_key): Implement retrival of key through expernal + helper (gpg) in case the openpgp card is not cooperative enough. + +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-02-25 Werner Koch <wk@g10code.com> + + * app-openpgp.c (get_public_key): Make sure not to return negative + numbers. + (do_sign): Allow passing of indata with algorithm prefix. + (do_auth): Allow OPENPGP.3 as an alternative ID. + + * app.c (app_getattr): Return just the S/N but not the timestamp. + +2005-02-24 Werner Koch <wk@g10code.com> + + * app.c (app_getattr): Return APPTYPE or SERIALNO type even if the + application does dot support the getattr call. + + * app-openpgp.c (get_one_do): Never try to get a non cacheable + object from the cache. + (get_one_do): Add new arg to return an error code. Changed all + callers. + (do_getattr): Let it return a proper error code. + + * app.c (select_application): Return an error code and the + application context in an new arg. + * command.c (open_card): Adjusted for that. Don't use the + fallback if no card is present. Return an error if the card has + been removed without a reset. + (do_reset, cmd_serialno): Clear that error flag. + (TEST_CARD_REMOVAL): New. Use it with all command handlers. + (scd_update_reader_status_file): Set the error flag on all changes. + + * scdaemon.c (ticker_thread): Termintate if a shutdown is pending. + + * apdu.c: Added some PCSC error codes. + (pcsc_error_to_sw): New. + (reset_pcsc_reader, pcsc_get_status, pcsc_send_apdu) + (open_pcsc_reader): Do proper error code mapping. + +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. + +2005-02-22 Werner Koch <wk@g10code.com> + + * app-openpgp.c (app_local_s): New field PK. + (do_deinit, do_genkey, app_openpgp_storekey): Clear it. + (get_public_key, send_keypair_info): New. + (do_learn_status): Send KEYPAIR info + + * app-common.h (app_ctx_t): Add function pointer READKEY. + * app.c (app_readkey): New. + * command.c (cmd_readkey): Use READKEY function if possible. + +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-25 Werner Koch <wk@g10code.com> + + * apdu.c (apdu_send_le, apdu_send_direct): Fix some compiler + warnings. + + * 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 obnly 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 + cached fingerprint will get updated to the old value and later + when signing the generated key the checking of the fingerprint + fails because 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. + +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-21 Werner Koch <wk@g10code.com> + + * scdaemon.c (main): Use default_homedir(). + +2004-12-18 Werner Koch <wk@g10code.com> + + * scdaemon.c (main) [W32]: Remove special Pth initialize.. + + * scdaemon.h (map_assuan_err): Define in terms of + map_assuan_err_with_source. + +2004-12-15 Werner Koch <wk@g10code.com> + + * scdaemon.c [W32]: Various hacks to make it run under W32. + + * command.c (scd_update_reader_status_file) [W32]: Don't use kill. + + * apdu.c [W32]: Disable use of pcsc_wrapper. + + * Makefile.am (scdaemon_LDADD): Reorder libs. + (sc_copykeys_LDADD): Add libassuan because it is needed for W32. + +2004-12-06 Werner Koch <wk@g10code.com> + + * Makefile.am (pkglib_PROGRAMS): Build only for W32. + +2004-10-22 Werner Koch <wk@g10code.com> + + * app-openpgp.c (verify_chv3): The minium length for CHV3 is + 8. Changed string to match the other ones. + +2004-10-21 Werner Koch <wk@g10code.com> + + * app-openpgp.c (do_sign): Replace asprintf by direct allocation. + This avoids problems with missing vasprintf implementations in + gnupg 1.4. + + * app-common.h (app_openpgp_storekey: Add prototype. + +2004-10-20 Werner Koch <wk@g10code.com> + + * sc-investigate: Removed. + * Makefile.am (sc_investigate): Removed. + + * pcsc-wrapper.c (load_pcsc_driver): Load get_status_change func. + (handle_open): Succeed even without a present card. + (handle_status, handle_reset): New. + + * apdu.c (apdu_open_reader): Load pcsc_get_status_change fucntion. + (pcsc_get_status): Implemented. + (reset_pcsc_reader): Implemented. + (open_pcsc_reader): Succeed even with no card inserted. + (open_ccid_reader): Set LAST_STATUS. + + * iso7816.c (iso7816_select_application): Always use 0 for P1. + +2004-10-18 Werner Koch <wk@g10code.com> + + * ccid-driver.c (ccid_get_atr): Reset T=1 state info. + +2004-10-14 Werner Koch <wk@g10code.com> + + * app-openpgp.c (parse_login_data): New. + (app_select_openpgp): Call it. + (do_setattr): Reparse it after change. + +2004-10-06 Werner Koch <wk@g10code.de> + + * ccid-driver.c (ccid_open_reader): Store the vendor ID. + (ccid_transceive_secure): New. + (parse_ccid_descriptor): Workaround for an SCM reader problem. + +2004-10-04 Werner Koch <wk@g10code.de> + + * ccid-driver.c (send_escape_cmd): New. + +2004-09-30 Werner Koch <wk@g10code.com> + + * Makefile.am: Adjusted for gettext 0.14. + + * app-openpgp.c (do_sign): Add the error string to the verify + failed messages. + +2004-09-27 Werner Koch <wk@g10code.com> + + From gnupg 1.3 + + * 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. + + * 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. + + * apdu.c (open_pcsc_reader): Do not print empty reader string. + + * 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. + + * 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. + + * 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. + + From gnupg 1.3 - David Shaw <dshaw@jabberwocky.com> + + * app-openpgp.c (verify_chv3): Show a countdown of how many wrong + admin PINs can be entered before the card is locked. + + * app-openpgp.c (get_cached_data): Avoid mallocing zero since it + breaks us when using --enable-m-guard. + + * ccid-driver.c (usb_get_string_simple): Replacement function to + work with older libusb. + + * 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-11 Werner Koch <wk@g10code.com> + + * app-openpgp.c (app_select_openpgp): Its app_munge_serialno and + not app_number_serialno. + +2004-08-20 Werner Koch <wk@g10code.de> + + * app.c (select_application): Fixed serial number extraction and + added the BMI card workaround. + (app_munge_serialno): New. + * app-openpgp.c (app_select_openpgp): Try munging serialno. + +2004-08-05 Werner Koch <wk@g10code.de> + + * scdaemon.c (main): New option --disable-application. + * app.c (is_app_allowed): New. + (select_application): Use it to check for disabled applications. + + * 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. + +2004-07-27 Moritz Schulte <moritz@g10code.com> + + * apdu.c: Include <signal.h>. + + * Makefile.am: Use @DL_LIBS@ instead of -ldl. + +2004-07-22 Werner Koch <wk@g10code.de> + + * Makefile.am: Make OpenSC lib link after libgcrypt. Do not link + to pth. + * apdu.c: Don't use Pth if we use OpenSC. + * sc-investigate.c, scdaemon.c: Disable use of pth if OpenSC is used. + + * scdaemon.c (main): Bumbed thread stack size up to 512k. + +2004-07-16 Werner Koch <wk@gnupg.org> + + * 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. + +2004-07-15 Werner Koch <wk@gnupg.org> + + * 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. + +2004-07-02 Werner Koch <wk@gnupg.org> + + * 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. + +2004-07-01 Werner Koch <wk@gnupg.org> + + * sc-investigate.c: Initialize Pth which is now required. + (interactive_shell): New command "readpk". + + * app-openpgp.c (do_getattr): Fix for sending CA-FPR. + +2004-06-30 Werner Koch <wk@gnupg.org> + + * app-openpgp.c (app_openpgp_readkey): Fixed check for valid + exponent. + +2004-06-18 Werner Koch <wk@g10code.com> + + * sc-investigate.c (my_read_line): Renamed from read_line. + +2004-06-16 Werner Koch <wk@gnupg.org> + + * apdu.c (osc_get_status): Fixed type in function name. Noted by + Axel Thimm. Yes, I didn't tested it with OpenSC :-(. + +2004-04-28 Werner Koch <wk@gnupg.org> + + * app-openpgp.c (do_setattr): Sync FORCE_CHV1. + +2004-04-27 Werner Koch <wk@gnupg.org> + + * app-common.h: Do not include ksba.h for gnupg 1. + +2004-04-26 Werner Koch <wk@gnupg.org> + + * app-common.h: New members FNC.DEINIT and APP_LOCAL. + * app.c (release_application): Call new deconstructor. + * 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. + + * scdaemon.c (main): Do the last change the usual way. This is so + that we can easily test for versioned config files above. + +2004-04-26 Marcus Brinkmann <marcus@g10code.de> + + * scdaemon.c (main): For now, always print default filename for + --gpgconf-list, and never /dev/null. + +2004-04-21 Werner Koch <wk@gnupg.org> + + * command.c (scd_update_reader_status_file): Send a signal back to + the client. + (option_handler): Parse the new event-signal option. + + * scdaemon.c (handle_signal): Do not use SIGUSR{1,2} anymore for + changing the verbosity. + +2004-04-20 Werner Koch <wk@gnupg.org> + + * command.c (scd_update_reader_status_file): Write status files. + + * app-help.c (app_help_read_length_of_cert): Fixed calculation of + R_CERTOFF. + + * pcsc-wrapper.c: New. + * Makefile.am (pkglib_PROGRAMS): Install it here. + * apdu.c (writen, readn): New. + (open_pcsc_reader, pcsc_send_apdu, close_pcsc_reader): Use the + pcsc-wrapper if we are using Pth. + (apdu_send_le): Reinitialize RESULTLEN. Handle SW_EOF_REACHED + like SW_SUCCESS. + +2004-04-19 Werner Koch <wk@gnupg.org> + + * 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. + +2004-04-14 Werner Koch <wk@gnupg.org> + + * scdaemon.h (server_control_s): Add member READER_SLOT. + * scdaemon.c (scd_init_default_ctrl): Initialize READER_SLOT to -1. + * command.c (open_card): Reuse an open slot. + (reset_notify): Just reset the slot if supported by the reader. + (do_reset): Factored code from above out. + (scd_command_handler): Use it for cleanup. + + * 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. + + * command.c (scd_update_reader_status_file): New. + * scdaemon.c (handle_tick): Call it. + +2004-04-13 Werner Koch <wk@gnupg.org> + + * scdaemon.c: Convert to a Pth application. + (handle_signal, ticker_thread, handle_tick): New. + (main): Fire up the ticker thread in server mode. + +2004-03-23 Werner Koch <wk@gnupg.org> + + * scdaemon.c (main) <gpgconf_list>: Fixed output for pcsc_driver. + +2004-03-17 Werner Koch <wk@gnupg.org> + + * tlv.c (parse_ber_header): Do not check for tag overflow - it + does not make sense. Simplified the check for length overflow. + + * scdaemon.c (main) <gpgconf>: Fixed default value quoting. + +2004-03-16 Werner Koch <wk@gnupg.org> + + * app-dinsig.c: Implemented. Based on app-nks.c and card-dinsig.c + * app-nks.c (get_length_of_cert): Removed. + * app-help.c: New. + (app_help_read_length_of_cert): New. Code taken from above. New + optional arg R_CERTOFF. + + * card-dinsig.c: Removed. + * card.c (card_get_serial_and_stamp): Do not bind to the old and + never finsiged card-dinsig.c. + + * iso7816.c (iso7816_read_binary): Allow for an NMAX > 254. + +2004-03-11 Werner Koch <wk@gnupg.org> + + * scdaemon.h (out_of_core): Removed. Replaced callers by standard + gpg_error function. + + * apdu.c, iso7816.c, ccid-driver.c [GNUPG_SCD_MAIN_HEADER]: Allow + to include a header defined by the compiler. This helps us to + reuse the source in other software. + +2004-03-10 Werner Koch <wk@gnupg.org> + + * iso7816.c (iso7816_read_record): New arg SHORT_EF. Changed all + callers. + +2004-02-18 Werner Koch <wk@gnupg.org> + + * sc-investigate.c (main): Setup the used character set. + * scdaemon.c (main): Ditto. + + * scdaemon.c (set_debug): New. Add option --debug-level. + (main): Add option --gpgconf-list. + +2004-02-12 Werner Koch <wk@gnupg.org> + + * Makefile.am: Include cmacros.am for common flags. + +2004-01-29 Werner Koch <wk@gnupg.org> + + * command.c (reset_notify): Release the application context and + close the reader. + +2004-01-28 Werner Koch <wk@gnupg.org> + + * iso7816.c (iso7816_manage_security_env): New. + (iso7816_decipher): Add PADIND argument. + +2004-01-27 Werner Koch <wk@gnupg.org> + + * command.c (cmd_readcert, cmd_readkey): Work on a copy of LINE. + + * app-common.h (app_ctx_s): Added readcert field. + * app.c (app_readcert): New. + * tlv.c (parse_ber_header): Added; taken from libksba. + +2004-01-26 Werner Koch <wk@gnupg.org> + + * card.c (map_sc_err): Use SCD as the error source. + + * command.c (open_card): ADD arg NAME to allow requesting a + specific application. Changed all callers. + (cmd_serialno): Allow optional argument to select the desired + application. + + * app-nks.c: New. + + * scdaemon.h (opt): Add READER_PORT. + * scdaemon.c (main): Set it here. + * app.c (app_set_default_reader_port): Removed. + (select_application): Add NAME arg and figure out a + default serial number from the GDO. Add SLOT arg and remove all + reader management. + (release_application): New. + (app_write_learn_status): Output an APPTYPE status line. + * command.c (open_card): Adapt for select_application change. + * app-openpgp.c (app_select_openpgp): Removed SN and SNLEN args + and set it directly. Changed all callers. + +2004-01-25 Werner Koch <wk@gnupg.org> + + * iso7816.c (iso7816_select_application): P1 kludge for OpenPGP + card. + * app-openpgp.c (find_tlv): Factor out this function to .. + * tlv.c, tlv.h: .. new. + + * scdaemon.h: Introduced app_t and ctrl_t as the new types for APP + and CTRL. + +2004-01-21 Werner Koch <wk@gnupg.org> + + * apdu.c (apdu_send_le): Treat SW_EOF_REACHED as a warning. + +2004-01-20 Werner Koch <wk@gnupg.org> + + * iso7816.c (iso7816_read_binary): New. + (iso7816_select_file): New. + (iso7816_list_directory): New. + + * sc-investigate.c: Add option -i. + (select_app, read_line, interactive_shell): New. + +2004-01-16 Werner Koch <wk@gnupg.org> + + * apdu.h: Add SW_FILE_NOT_FOUND. + * iso7816.c (map_sw): Map it to GPG_ERR_ENOENT. + * iso7816.c (iso7816_select_file): New. + + * app-dinsig.c: New file w/o any real code yet. + * Makefile.am (scdaemon_SOURCES,sc_investigate_SOURCES): Add file. + + * sc-investigate.c: Add option --disable-ccid. + +2003-12-19 Werner Koch <wk@gnupg.org> + + * apdu.c (apdu_send_le): Send a get_response with the indicated + length and not the 64 bytes we used for testing. + + * app-openpgp.c (verify_chv2, verify_chv3, do_sign): Check the + minimum length of the passphrase, so that we don't need to + decrement the retry counter. + +2003-12-17 Werner Koch <wk@gnupg.org> + + * card-p15.c (p15_enum_keypairs): Replaced KRC by RC. + * card-dinsig.c (dinsig_enum_keypairs): Ditto. + +2003-12-16 Werner Koch <wk@gnupg.org> + + * scdaemon.c (main): Set the prefixes for assuan logging. + +2003-11-17 Werner Koch <wk@gnupg.org> + + * scdaemon.c, scdaemon.h: New options --allow-admin and --deny-admin. + * app-openpgp.c (verify_chv3): Check it here. + +2003-11-12 Werner Koch <wk@gnupg.org> + + Adjusted for API changes in Libksba. + +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-25 Werner Koch <wk@gnupg.org> + + * ccid-driver.c (ccid_open_reader): Return an error if no USB + devices are found. + + * command.c (cmd_genkey, cmd_passwd): Fixed faulty use of + !spacep(). + + * apdu.c (apdu_open_reader): Hacks for PC/SC under Windows. + +2003-10-20 Werner Koch <wk@gnupg.org> + + * command.c (cmd_checkpin): New. + (register_commands): Add command CHECKPIN. + * app.c (app_check_pin): New. + * app-openpgp.c (check_against_given_fingerprint): New. Factored + out that code elsewhere. + (do_check_pin): New. + +2003-10-10 Werner Koch <wk@gnupg.org> + + * 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. + +2003-10-09 Werner Koch <wk@gnupg.org> + + * ccid-driver.c (ccid_transceive): Add T=1 chaining for sending. + +2003-10-08 Werner Koch <wk@gnupg.org> + + * app-openpgp.c (do_getattr): Support SERIALNO and AID. + +2003-10-01 Werner Koch <wk@gnupg.org> + + * 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 + +2003-09-30 Werner Koch <wk@gnupg.org> + + * command.c (cmd_getattr): New command GETATTR. + * app.c (app_setattr): New. + (do_getattr): New. + (do_learn_status): Reimplemented in terms of do_getattr. + + * 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. + +2003-09-28 Werner Koch <wk@gnupg.org> + + * app-openpgp.c (dump_all_do): Use gpg_err_code and not gpg_error. + +2003-09-19 Werner Koch <wk@gnupg.org> + + * ccid-driver.c (parse_ccid_descriptor): New. + (read_device_info): New. + (ccid_open_reader): Check that the device has all required features. + +2003-09-06 Werner Koch <wk@gnupg.org> + + * scdaemon.c (main): --pcsc-driver again defaults to pcsclite. + David Corcoran was so kind to remove the GPL incompatible + advertisng clause from pcsclite. + * apdu.c (apdu_open_reader): Actually make pcsc-driver option work. + +2003-09-05 Werner Koch <wk@gnupg.org> + + * ccid-driver.c: More work, data can now actually be retrieved. + * ccid-driver.c, ccid-driver.h: Alternativley allow use under BSD + conditions. + +2003-09-02 Werner Koch <wk@gnupg.org> + + * scdaemon.c, scdaemon.h: New option --pcsc-ccid. + * ccid-driver.c, ccid-driver.h: New but far from being useful. + * Makefile.am: Add above. + * apdu.c: Add support for that ccid driver. + +2003-08-26 Timo Schulz <twoaday@freakmail.de> + + * apdu.c (new_reader_slot): Only set 'is_osc' when OpenSC + is used. + +2003-08-25 Werner Koch <wk@gnupg.org> + + * command.c (cmd_setattr): Use a copy of LINE. + (cmd_genkey): Use a copy of KEYNO. + (cmd_passwd): Use a copy of CHVNOSTR. + (cmd_pksign, cmd_pkauth, cmd_pkdecrypt): s/strdup/xtrystrdup/. + +2003-08-19 Werner Koch <wk@gnupg.org> + + * scdaemon.c, scdaemon.h: New option --pcsc-driver. + * apdu.c (apdu_open_reader): Use that option here instead of a + hardcoded one. + +2003-08-18 Werner Koch <wk@gnupg.org> + + * Makefile.am: Add OPENSC_LIBS to all programs. + + * scdaemon.c, scdaemon.h: New option --disable-opensc. + * card.c (card_open): Implement it. + * apdu.c (open_osc_reader, osc_send_apdu): New. + (apdu_open_reader) [HAVE_OPENSC]: Use the opensc driver if not + disabled. + (error_string) [HAVE_OPENSC]: Use sc_strerror. + (send_apdu) [HAVE_OPENSC]: Call osc_apdu_send. + + * card-p15.c (p15_enum_keypairs, p15_prepare_key): Adjusted for + libgpg-error. + +2003-08-14 Timo Schulz <twoaday@freakmail.de> + + * apdu.c (ct_activate_card): Change the code a little to avoid + problems with other readers. + * Always use 'dynload.h' instead of 'dlfcn.h'. + +2003-08-05 Werner Koch <wk@gnupg.org> + + * app-openpgp.c (dump_all_do): Don't analyze constructed DOs after + an error. + +2003-08-04 Werner Koch <wk@gnupg.org> + + * app.c (app_set_default_reader_port): New. + (select_application): Use it here. + * scdaemon.c (main): and here. + * sc-copykeys.c: --reader-port does now take a string. + * sc-investigate.c, scdaemon.c: Ditto. + * apdu.c (apdu_open_reader): Ditto. Load pcsclite if no ctapi + driver is configured. Always include code for ctapi. + (new_reader_slot): Don't test for already used ports and remove + port arg. + (open_pcsc_reader, pcsc_send_apdu, pcsc_error_string): New. + (apdu_send_le): Changed RC to long to cope with PC/SC. + + * scdaemon.c, scdaemon.h: New option --ctapi-driver. + * sc-investigate.c, sc-copykeys.c: Ditto. + +2003-07-31 Werner Koch <wk@gnupg.org> + + * Makefile.am (scdaemon_LDADD): Added INTLLIBS. + +2003-07-28 Werner Koch <wk@gnupg.org> + + * app-openpgp.c (do_setattr): Change implementation. Allow all + useful DOs. + +2003-07-27 Werner Koch <wk@gnupg.org> + + Adjusted for gcry_mpi_print and gcry_mpi_scan API change. + +2003-07-24 Werner Koch <wk@gnupg.org> + + * app-openpgp.c (do_learn_status): Print more status information. + (app_select_openpgp): Store the card version. + (store_fpr): Add argument card_version and fix DOs for old cards. + (app_openpgp_storekey): Likewise. + +2003-07-23 Werner Koch <wk@gnupg.org> + + * command.c (cmd_pkauth): New. + (cmd_setdata): Check whether data was given at all to avoid + passing 0 to malloc. + + * app.c (app_auth): New. + * app-openpgp.c (do_auth): New. + +2003-07-22 Werner Koch <wk@gnupg.org> + + * command.c (cmd_passwd): New. + * app.c (app_change_pin): New. + * app-openpgp.c (do_change_pin): New. + * iso7816.c (iso7816_reset_retry_counter): Implemented. + + * sc-investigate.c (main): New option --gen-random. + * iso7816.c (iso7816_get_challenge): Don't create APDUs with a + length larger than 255. + +2003-07-17 Werner Koch <wk@gnupg.org> + + * command.c (cmd_random): New command RANDOM. + + * iso7816.c (map_sw): New. Use it in this file to return + meaningful error messages. Changed all public fucntions to return + a gpg_error_t. + (iso7816_change_reference_data): New. + * apdu.c (apdu_open_reader): Use faked status words for soem + system errors. + +2003-07-16 Werner Koch <wk@gnupg.org> + + * apdu.c (apdu_send_simple): Use apdu_send_le so that we can + specify not to send Le as it should be. + +2003-07-15 Werner Koch <wk@gnupg.org> + + * Makefile.am: Add sc-copykeys program. + * sc-copykeys.c: New. + * app-openpgp.c (app_openpgp_storekey): New. + (app_openpgp_cardinfo): New. + (count_bits): New. + (store_fpr): And use it here to get the actual length in bit. + +2003-07-03 Werner Koch <wk@gnupg.org> + + * app-openpgp.c (do_setattr): Add setting of the URL. + (app_select_openpgp): Dump card data only in very verbose mode. + (do_decipher): New. + +2003-07-02 Werner Koch <wk@gnupg.org> + + * app-openpgp.c (get_sig_counter): New. + (do_sign): Print the signature counter and enable the PIN callback. + (do_genkey): Implement the PIN callback. + +2003-07-01 Werner Koch <wk@gnupg.org> + + * app-openpgp.c (store_fpr): Fixed fingerprint calculation. + +2003-06-26 Werner Koch <wk@gnupg.org> + + * app-openpgp.c (find_tlv): Fixed length header parsing. + + * app.c (app_genkey): New. + * command.c (cmd_genkey): New. + +2003-06-25 Werner Koch <wk@gnupg.org> + + * command.c (percent_plus_unescape): New. + (cmd_setattr): New. + +2003-06-24 Werner Koch <wk@gnupg.org> + + * command.c (send_status_info): New. + + * app-openpgp.c (app_select_openpgp): Replace SLOT arg by APP arg + and setup the function pointers in APP on success. Changed callers. + * app.c: New. + * app-common.h: New. + * scdaemon.h (APP): New type to handle applications. + (server_control_s): Add an APP context field. + + * command.c (cmd_serialno): Handle applications. + (cmd_pksign): Ditto. + (cmd_pkdecrypt): Ditto. + (reset_notify): Ditto. + (cmd_learn): For now return error for application contexts. + (cmd_readcert): Ditto. + (cmd_readkey): Ditto. + +2003-06-04 Werner Koch <wk@gnupg.org> + + * card.c (map_sc_err): Renamed gpg_make_err to gpg_err_make. + + Renamed error codes from INVALID to INV and removed _ERROR suffixes. + +2003-06-03 Werner Koch <wk@gnupg.org> + + Changed all error codes in all files to the new libgpg-error scheme. + + * scdaemon.h: Include gpg-error.h and errno.h + * card.c (map_sc_err): Use unknown for the error source. + * Makefile.am: Link with libgpg-error + +2003-05-14 Werner Koch <wk@gnupg.org> + + * atr.c, atr.h: New. + * sc-investigate.c: Dump the ATR in a human readable format. + +2003-05-08 Werner Koch <wk@gnupg.org> + + * scdaemon.h (DBG_CARD_IO_VALUE): New. + + * sc-investigate.c: New. + * scdaemon.c (main): Removed --print-atr option. + + * iso7816.c, iso7816.h, app-openpgp.c: New. + +2003-04-29 Werner Koch <wk@gnupg.org> + + * scdaemon.c: New options --print-atr and --reader-port + * apdu.c, apdu.h: New + + * card.c, card-p15.c, card-dinsig.c: Allow build without OpenSC. + + * Makefile.am (LDFLAGS): Removed. + + * command.c (register_commands): Adjusted for new Assuan semantics. + +2002-08-21 Werner Koch <wk@gnupg.org> + + * scdaemon.c (main): New option --daemon so that the program is + not accidently started in the background. + +2002-08-16 Werner Koch <wk@gnupg.org> + + * scdaemon.c: Include i18n.h. + + * card-common.h (struct p15_private_s): Forward declaration. Add + it to card_ctx_s. + * card.c (card_close): Make sure private data is released. + (card_enum_certs): New. + * card-p15.c (p15_release_private_data): New. + (init_private_data): New to work around an OpenSC weirdness. + (p15_enum_keypairs): Do an OpenSC get_objects only once. + (p15_enum_certs): New. + (card_p15_bind): Bind new function. + * command.c (cmd_learn): Return information about the certificates. + +2002-08-09 Werner Koch <wk@gnupg.org> + + * card.c (card_get_serial_and_stamp): Use the tokeinfo serial + number as a fallback. Add a special prefix for serial numbers. + +2002-07-30 Werner Koch <wk@gnupg.org> + + Changes to cope with OpenSC 0.7.0: + + * card.c: Removed the check for the packed opensc version. + Changed include file names of opensc. + (map_sc_err): Adjusted error codes for new opensc version. + * card-p15.c: Changed include filename of opensc. + * card-dinsig.c: Ditto. + + * card-p15.c (p15_decipher): Add flags argument to OpenSC call. + +2002-07-24 Werner Koch <wk@gnupg.org> + + * card.c (find_simple_tlv, find_iccsn): New. + (card_get_serial_and_stamp): Improved serial number parser. + +2002-06-27 Werner Koch <wk@gnupg.org> + + * scdaemon.c (main): Use GNUPG_DEFAULT_HOMEDIR constant. + +2002-06-15 Werner Koch <wk@gnupg.org> + + * card-dinsig.c: Documented some stuff from the DIN norm. + +2002-04-15 Werner Koch <wk@gnupg.org> + + * command.c (cmd_pksign, cmd_pkdecrypt): Use a copy of the key ID. + +2002-04-12 Werner Koch <wk@gnupg.org> + + * scdaemon.c: New option --debug-sc N. + * card.c (card_open): set it here. + + * card-p15.c (p15_prepare_key): Factored out common code from ... + (p15_sign, p15_decipher): here and made the decryption work the + regular way. + +2002-04-10 Werner Koch <wk@gnupg.org> + + * card.c (card_open): Return immediately when no reader is available. + +2002-03-27 Werner Koch <wk@gnupg.org> + + * card.c (card_open, card_close): Adjusted for changes in OpenSC. + +2002-03-10 Werner Koch <wk@gnupg.org> + + * card-p15.c, card-dinsig.c, card-common.h: New. + * card.c: Factored most code out to the new modules, so that we + can better support different types of card applications. + +2002-01-26 Werner Koch <wk@gnupg.org> + + * scdaemon.c scdaemon.h, command.c: New. Based on the code from + the gpg-agent. + + + Copyright 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/scd/Makefile.am b/scd/Makefile.am new file mode 100644 index 000000000..61c0c05d9 --- /dev/null +++ b/scd/Makefile.am @@ -0,0 +1,72 @@ +# Copyright (C) 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 + +bin_PROGRAMS = scdaemon +if ! HAVE_W32_SYSTEM +pkglib_PROGRAMS = pcsc-wrapper +endif + +AM_CPPFLAGS = -I$(top_srcdir)/gl -I$(top_srcdir)/intl -I$(top_srcdir)/common + +include $(top_srcdir)/am/cmacros.am + +AM_CFLAGS = $(LIBGCRYPT_CFLAGS) \ + $(KSBA_CFLAGS) $(LIBASSUAN_CFLAGS) $(PTH_CFLAGS) + + +card_apps = app-openpgp.c app-nks.c app-dinsig.c app-p15.c + +scdaemon_SOURCES = \ + scdaemon.c scdaemon.h \ + command.c \ + apdu.c apdu.h \ + ccid-driver.c ccid-driver.h \ + iso7816.c iso7816.h \ + tlv.c tlv.h \ + app.c app-common.h app-help.c $(card_apps) + + +scdaemon_LDADD = ../jnlib/libjnlib.a ../common/libcommon.a ../gl/libgnu.a \ + $(LIBGCRYPT_LIBS) $(KSBA_LIBS) $(PTH_LIBS) $(LIBASSUAN_LIBS) \ + $(LIBUSB_LIBS) -lgpg-error $(LIBINTL) $(DL_LIBS) $(NETLIBS) + +# Removed for now: We need to decide whether it makes sense to +# continue it at all, given that gpg has now all required +# functionality. +#sc_copykeys_SOURCES = \ +# sc-copykeys.c scdaemon.h \ +# apdu.c apdu.h \ +# ccid-driver.c ccid-driver.h \ +# iso7816.c iso7816.h \ +# tlv.c tlv.h \ +# atr.c atr.h \ +# app.c app-common.h app-help.c $(card_apps) +# +#sc_copykeys_LDADD = \ +# ../jnlib/libjnlib.a ../common/libcommon.a \ +# ../common/libsimple-pwquery.a \ +# $(LIBGCRYPT_LIBS) $(PTH_LIBS) $(KSBA_LIBS) $(LIBASSUAN_LIBS) \ +# $(LIBUSB_LIBS) \ +# -lgpg-error @LIBINTL@ @DL_LIBS@ +# +pcsc_wrapper_SOURCES = pcsc-wrapper.c +pcsc_wrapper_LDADD = $(DL_LIBS) +pcsc_wrapper_CFLAGS = diff --git a/g10/apdu.c b/scd/apdu.c similarity index 99% rename from g10/apdu.c rename to scd/apdu.c index 52fdbc723..d6bbdefd5 100644 --- a/g10/apdu.c +++ b/scd/apdu.c @@ -1328,6 +1328,14 @@ open_pcsc_reader (const char *portstr) int err; unsigned int dummy_status; int sw = SW_HOST_CARD_IO_ERROR; + const char *wrapperpgm = GNUPG_LIBDIR "/pcsc-wrapper"; + + if (access (wrapperpgm, X_OK)) + { + log_error ("can't run PC/SC access module `%s': %s\n", + wrapperpgm, strerror (errno)); + return -1; + } slot = new_reader_slot (); if (slot == -1) @@ -1400,7 +1408,7 @@ open_pcsc_reader (const char *portstr) close(i); errno = 0; - execl (GNUPG_LIBDIR "/pcsc-wrapper", + execl (wrapperpgm, "pcsc-wrapper", "--", "1", /* API version */ @@ -2361,7 +2369,7 @@ apdu_close_reader (int slot) } /* 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 + the handle ready for later use. A apdu_reset_reader should be used to get it active again. */ int apdu_shutdown_reader (int slot) @@ -2840,8 +2848,8 @@ apdu_send_simple_kp (int slot, int class, int ins, int p0, int p1, 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.*/ + on success. If the slot is locked, the function returns + immediately with an error. */ int apdu_send_direct (int slot, const unsigned char *apdudata, size_t apdudatalen, int handle_more, diff --git a/g10/apdu.h b/scd/apdu.h similarity index 100% rename from g10/apdu.h rename to scd/apdu.h diff --git a/g10/app-common.h b/scd/app-common.h similarity index 96% rename from g10/app-common.h rename to scd/app-common.h index c80bfb527..3b828780d 100644 --- a/g10/app-common.h +++ b/scd/app-common.h @@ -40,6 +40,11 @@ struct app_ctx_s { function pointers may be used. Note that for unsupported operations the particular function pointer is set to NULL */ + + int ref_count; /* Number of connections currently using this + application context. fixme: We might want to + merg this witghn INITIALIZED above. */ + int slot; /* Used reader. */ /* If this is used by GnuPG 1.4 we need to know the assuan context @@ -124,6 +129,9 @@ size_t app_help_read_length_of_cert (int slot, int fid, size_t *r_certoff); /*-- app.c --*/ +void app_dump_state (void); +void application_notify_card_removed (int slot); +gpg_error_t check_application_conflict (ctrl_t ctrl, const char *name); gpg_error_t select_application (ctrl_t ctrl, int slot, const char *name, app_t *r_app); void release_application (app_t app); diff --git a/scd/app-dinsig.c b/scd/app-dinsig.c new file mode 100644 index 000000000..752e8a346 --- /dev/null +++ b/scd/app-dinsig.c @@ -0,0 +1,459 @@ +/* app-dinsig.c - The DINSIG (DIN V 66291-1) card application. + * Copyright (C) 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. + */ + + +/* The German signature law and its bylaw (SigG and SigV) is currently + used with an interface specification described in DIN V 66291-1. + The AID to be used is: 'D27600006601'. + + The file IDs for certificates utilize the generic format: + Cxyz + C being the hex digit 'C' (12). + x being the service indicator: + '0' := SigG conform digital signature. + '1' := entity authentication. + '2' := key encipherment. + '3' := data encipherment. + '4' := key agreement. + other values are reserved for future use. + y being the security environment number using '0' for cards + not supporting a SE number. + z being the certificate type: + '0' := C.CH (base certificate of card holder) or C.ICC. + '1' .. '7' := C.CH (business or professional certificate + of card holder. + '8' .. 'D' := C.CA (certificate of a CA issue by the Root-CA). + 'E' := C.RCA (self certified certificate of the Root-CA). + 'F' := reserved. + + The file IDs used by default are: + '1F00' EF.SSD (security service descriptor). [o,o] + '2F02' EF.GDO (global data objects) [m,m] + 'A000' EF.PROT (signature log). Cyclic file with 20 records of 53 byte. + Read and update after user authentication. [o,o] + 'B000' EF.PK.RCA.DS (public keys of Root-CA). Size is 512b or size + of keys. [m (unless a 'C00E' is present),m] + 'B001' EF.PK.CA.DS (public keys of CAs). Size is 512b or size + of keys. [o,o] + 'C00n' EF.C.CH.DS (digital signature certificate of card holder) + with n := 0 .. 7. Size is 2k or size of cert. Read and + update allowed after user authentication. [m,m] + 'C00m' EF.C.CA.DS (digital signature certificate of CA) + with m := 8 .. E. Size is 1k or size of cert. Read always + allowed, update after user authentication. [o,o] + 'C100' EF.C.ICC.AUT (AUT certificate of ICC) [o,m] + 'C108' EF.C.CA.AUT (AUT certificate of CA) [o,m] + 'D000' EF.DM (display message) [-,m] + + The letters in brackets indicate optional or mandatory files: The + first for card terminals under full control and the second for + "business" card terminals. +*/ + + + + +#include <config.h> +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <assert.h> +#include <time.h> + +#include "scdaemon.h" + +#include "iso7816.h" +#include "app-common.h" +#include "tlv.h" + + +static gpg_error_t +do_learn_status (app_t app, ctrl_t ctrl) +{ + gpg_error_t err; + char ct_buf[100], id_buf[100]; + char hexkeygrip[41]; + size_t len, certoff; + unsigned char *der; + size_t derlen; + ksba_cert_t cert; + int fid; + + /* Return the certificate of the card holder. */ + fid = 0xC000; + len = app_help_read_length_of_cert (app->slot, fid, &certoff); + if (!len) + return 0; /* Card has not been personalized. */ + + sprintf (ct_buf, "%d", 101); + sprintf (id_buf, "DINSIG.%04X", fid); + send_status_info (ctrl, "CERTINFO", + ct_buf, strlen (ct_buf), + id_buf, strlen (id_buf), + NULL, (size_t)0); + + /* Now we need to read the certificate, so that we can get the + public key out of it. */ + err = iso7816_read_binary (app->slot, certoff, len-certoff, &der, &derlen); + if (err) + { + log_info ("error reading entire certificate from FID 0x%04X: %s\n", + fid, gpg_strerror (err)); + return 0; + } + + err = ksba_cert_new (&cert); + if (err) + { + xfree (der); + return err; + } + err = ksba_cert_init_from_mem (cert, der, derlen); + xfree (der); der = NULL; + if (err) + { + log_error ("failed to parse the certificate at FID 0x%04X: %s\n", + fid, gpg_strerror (err)); + ksba_cert_release (cert); + return err; + } + err = app_help_get_keygrip_string (cert, hexkeygrip); + if (err) + { + log_error ("failed to calculate the keygrip for FID 0x%04X\n", fid); + ksba_cert_release (cert); + return gpg_error (GPG_ERR_CARD); + } + ksba_cert_release (cert); + + sprintf (id_buf, "DINSIG.%04X", fid); + send_status_info (ctrl, "KEYPAIRINFO", + hexkeygrip, 40, + id_buf, strlen (id_buf), + NULL, (size_t)0); + return 0; +} + + + + +/* Read the certificate with id CERTID (as returned by learn_status in + the CERTINFO status lines) and return it in the freshly allocated + buffer put into CERT and the length of the certificate put into + CERTLEN. + + FIXME: This needs some cleanups and caching with do_learn_status. +*/ +static gpg_error_t +do_readcert (app_t app, const char *certid, + unsigned char **cert, size_t *certlen) +{ + int fid; + gpg_error_t err; + unsigned char *buffer; + const unsigned char *p; + size_t buflen, n; + int class, tag, constructed, ndef; + size_t totobjlen, objlen, hdrlen; + int rootca = 0; + + *cert = NULL; + *certlen = 0; + if (strncmp (certid, "DINSIG.", 7) ) + return gpg_error (GPG_ERR_INV_ID); + certid += 7; + if (!hexdigitp (certid) || !hexdigitp (certid+1) + || !hexdigitp (certid+2) || !hexdigitp (certid+3) + || certid[4]) + return gpg_error (GPG_ERR_INV_ID); + fid = xtoi_4 (certid); + if (fid != 0xC000 ) + return gpg_error (GPG_ERR_NOT_FOUND); + + /* Read the entire file. fixme: This could be optimized by first + reading the header to figure out how long the certificate + actually is. */ + err = iso7816_select_file (app->slot, fid, 0, NULL, NULL); + if (err) + { + log_error ("error selecting FID 0x%04X: %s\n", fid, gpg_strerror (err)); + return err; + } + + err = iso7816_read_binary (app->slot, 0, 0, &buffer, &buflen); + if (err) + { + log_error ("error reading certificate from FID 0x%04X: %s\n", + fid, gpg_strerror (err)); + return err; + } + + if (!buflen || *buffer == 0xff) + { + log_info ("no certificate contained in FID 0x%04X\n", fid); + err = gpg_error (GPG_ERR_NOT_FOUND); + goto leave; + } + + /* Now figure something out about the object. */ + p = buffer; + n = buflen; + err = parse_ber_header (&p, &n, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (err) + goto leave; + if ( class == CLASS_UNIVERSAL && tag == TAG_SEQUENCE && constructed ) + ; + else if ( class == CLASS_UNIVERSAL && tag == TAG_SET && constructed ) + rootca = 1; + else + return gpg_error (GPG_ERR_INV_OBJ); + totobjlen = objlen + hdrlen; + assert (totobjlen <= buflen); + + err = parse_ber_header (&p, &n, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (err) + goto leave; + + if (rootca) + ; + else if (class == CLASS_UNIVERSAL && tag == TAG_OBJECT_ID && !constructed) + { + const unsigned char *save_p; + + /* The certificate seems to be contained in a userCertificate + container. Skip this and assume the following sequence is + the certificate. */ + if (n < objlen) + { + err = gpg_error (GPG_ERR_INV_OBJ); + goto leave; + } + p += objlen; + n -= objlen; + save_p = p; + err = parse_ber_header (&p, &n, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (err) + goto leave; + if ( !(class == CLASS_UNIVERSAL && tag == TAG_SEQUENCE && constructed) ) + return gpg_error (GPG_ERR_INV_OBJ); + totobjlen = objlen + hdrlen; + assert (save_p + totobjlen <= buffer + buflen); + memmove (buffer, save_p, totobjlen); + } + + *cert = buffer; + buffer = NULL; + *certlen = totobjlen; + + leave: + xfree (buffer); + return err; +} + + +/* Verify the PIN if required. */ +static gpg_error_t +verify_pin (app_t app, + gpg_error_t (*pincb)(void*, const char *, char **), + void *pincb_arg) +{ + if (!app->did_chv1 || app->force_chv1 ) + { + const char *s; + char *pinvalue; + int rc; + + rc = pincb (pincb_arg, "PIN", &pinvalue); + if (rc) + { + log_info ("PIN callback returned error: %s\n", gpg_strerror (rc)); + return rc; + } + + /* We require the PIN to be at least 6 and at max 8 bytes. + According to the specs, this should all be ASCII. */ + for (s=pinvalue; digitp (s); s++) + ; + if (*s) + { + log_error ("Non-numeric digits found in PIN\n"); + xfree (pinvalue); + return gpg_error (GPG_ERR_BAD_PIN); + } + + if (strlen (pinvalue) < 6) + { + log_error ("PIN is too short; minimum length is 6\n"); + xfree (pinvalue); + return gpg_error (GPG_ERR_BAD_PIN); + } + else if (strlen (pinvalue) > 8) + { + log_error ("PIN is too large; maximum length is 8\n"); + xfree (pinvalue); + return gpg_error (GPG_ERR_BAD_PIN); + } + + rc = iso7816_verify (app->slot, 0x81, pinvalue, strlen (pinvalue)); + if (gpg_err_code (rc) == GPG_ERR_INV_VALUE) + { + /* We assume that ISO 9564-1 encoding is used and we failed + because the first nibble we passed was 3 and not 2. DIN + says something about looking up such an encoding in the + SSD but I was not able to find any tag relevant to + this. */ + char paddedpin[8]; + int i, ndigits; + + for (ndigits=0, s=pinvalue; *s; ndigits++, s++) + ; + i = 0; + paddedpin[i++] = 0x20 | (ndigits & 0x0f); + for (s=pinvalue; i < sizeof paddedpin && *s && s[1]; s = s+2 ) + paddedpin[i++] = (((*s - '0') << 4) | ((s[1] - '0') & 0x0f)); + if (i < sizeof paddedpin && *s) + paddedpin[i++] = (((*s - '0') << 4) | 0x0f); + while (i < sizeof paddedpin) + paddedpin[i++] = 0xff; + rc = iso7816_verify (app->slot, 0x81, paddedpin, sizeof paddedpin); + } + if (rc) + { + log_error ("verify PIN failed\n"); + xfree (pinvalue); + return rc; + } + app->did_chv1 = 1; + xfree (pinvalue); + } + + return 0; +} + + + +/* Create the signature and return the allocated result in OUTDATA. + If a PIN is required the PINCB will be used to ask for the PIN; + that callback should return the PIN in an allocated buffer and + store that in the 3rd argument. */ +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; + int fid; + unsigned char data[35]; /* Must be large enough for a SHA-1 digest + + the largest OID _prefix above. */ + + if (!keyidstr || !*keyidstr) + return gpg_error (GPG_ERR_INV_VALUE); + if (indatalen != 20 && indatalen != 16 && indatalen != 35) + return gpg_error (GPG_ERR_INV_VALUE); + + /* Check that the provided ID is vaid. This is not really needed + but we do it to to enforce correct usage by the caller. */ + if (strncmp (keyidstr, "DINSIG.", 7) ) + return gpg_error (GPG_ERR_INV_ID); + keyidstr += 7; + if (!hexdigitp (keyidstr) || !hexdigitp (keyidstr+1) + || !hexdigitp (keyidstr+2) || !hexdigitp (keyidstr+3) + || keyidstr[4]) + return gpg_error (GPG_ERR_INV_ID); + fid = xtoi_4 (keyidstr); + if (fid != 0xC000) + return gpg_error (GPG_ERR_NOT_FOUND); + + /* Prepare the DER object from INDATA. */ + if (indatalen == 35) + { + /* Alright, the caller was so kind to send us an already + prepared DER object. Check that it is what we want and that + it matches the hash algorithm. */ + if (hashalgo == GCRY_MD_SHA1 && !memcmp (indata, sha1_prefix, 15)) + ; + else if (hashalgo == GCRY_MD_RMD160 && !memcmp (indata, rmd160_prefix,15)) + ; + else + return gpg_error (GPG_ERR_UNSUPPORTED_ALGORITHM); + memcpy (data, indata, indatalen); + } + else + { + 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); + } + + rc = verify_pin (app, pincb, pincb_arg); + if (!rc) + rc = iso7816_compute_ds (app->slot, data, 35, outdata, outdatalen); + return rc; +} + + + +/* Select the DINSIG application on the card in SLOT. This function + must be used before any other DINSIG application functions. */ +gpg_error_t +app_select_dinsig (APP app) +{ + static char const aid[] = { 0xD2, 0x76, 0x00, 0x00, 0x66, 0x01 }; + int slot = app->slot; + int rc; + + rc = iso7816_select_application (slot, aid, sizeof aid, 0); + if (!rc) + { + app->apptype = "DINSIG"; + + app->fnc.learn_status = do_learn_status; + app->fnc.readcert = do_readcert; + app->fnc.getattr = NULL; + app->fnc.setattr = NULL; + app->fnc.genkey = NULL; + app->fnc.sign = do_sign; + app->fnc.auth = NULL; + app->fnc.decipher = NULL; + app->fnc.change_pin = NULL; + app->fnc.check_pin = NULL; + + app->force_chv1 = 1; + } + + return rc; +} diff --git a/scd/app-help.c b/scd/app-help.c new file mode 100644 index 000000000..861d8e3bc --- /dev/null +++ b/scd/app-help.c @@ -0,0 +1,163 @@ +/* app-help.c - Application helper functions + * 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. + */ + +#include <config.h> +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "scdaemon.h" +#include "app-common.h" +#include "iso7816.h" +#include "tlv.h" + +/* Return the KEYGRIP for the certificate CERT as an hex encoded + string in the user provided buffer HEXKEYGRIP which must be of at + least 41 bytes. */ +gpg_error_t +app_help_get_keygrip_string (ksba_cert_t cert, char *hexkeygrip) +{ + gpg_error_t err; + gcry_sexp_t s_pkey; + ksba_sexp_t p; + size_t n; + unsigned char array[20]; + int i; + + p = ksba_cert_get_public_key (cert); + if (!p) + return gpg_error (GPG_ERR_BUG); + n = gcry_sexp_canon_len (p, 0, NULL, NULL); + if (!n) + return gpg_error (GPG_ERR_INV_SEXP); + err = gcry_sexp_sscan (&s_pkey, NULL, (char*)p, n); + xfree (p); + if (err) + return err; /* Can't parse that S-expression. */ + if (!gcry_pk_get_keygrip (s_pkey, array)) + { + gcry_sexp_release (s_pkey); + return gpg_error (GPG_ERR_GENERAL); /* Failed to calculate the keygrip.*/ + } + gcry_sexp_release (s_pkey); + + for (i=0; i < 20; i++) + sprintf (hexkeygrip+i*2, "%02X", array[i]); + + return 0; +} + + + +/* Given the SLOT and the File ID FID, return the length of the + certificate contained in that file. Returns 0 if the file does not + exists or does not contain a certificate. If R_CERTOFF is not + NULL, the length the header will be stored at this address; thus to + parse the X.509 certificate a read should start at that offset. + + On success the file is still selected. +*/ +size_t +app_help_read_length_of_cert (int slot, int fid, size_t *r_certoff) +{ + gpg_error_t err; + unsigned char *buffer; + const unsigned char *p; + size_t buflen, n; + int class, tag, constructed, ndef; + size_t resultlen, objlen, hdrlen; + + err = iso7816_select_file (slot, fid, 0, NULL, NULL); + if (err) + { + log_info ("error selecting FID 0x%04X: %s\n", fid, gpg_strerror (err)); + return 0; + } + + err = iso7816_read_binary (slot, 0, 32, &buffer, &buflen); + if (err) + { + log_info ("error reading certificate from FID 0x%04X: %s\n", + fid, gpg_strerror (err)); + return 0; + } + + if (!buflen || *buffer == 0xff) + { + log_info ("no certificate contained in FID 0x%04X\n", fid); + xfree (buffer); + return 0; + } + + p = buffer; + n = buflen; + err = parse_ber_header (&p, &n, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (err) + { + log_info ("error parsing certificate in FID 0x%04X: %s\n", + fid, gpg_strerror (err)); + xfree (buffer); + return 0; + } + + /* All certificates should commence with a SEQUENCE except for the + special ROOT CA which are enclosed in a SET. */ + if ( !(class == CLASS_UNIVERSAL && constructed + && (tag == TAG_SEQUENCE || tag == TAG_SET))) + { + log_info ("contents of FID 0x%04X does not look like a certificate\n", + fid); + return 0; + } + + resultlen = objlen + hdrlen; + if (r_certoff) + { + /* The callers want the offset to the actual certificate. */ + *r_certoff = hdrlen; + + err = parse_ber_header (&p, &n, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (err) + return 0; + + if (class == CLASS_UNIVERSAL && tag == TAG_OBJECT_ID && !constructed) + { + /* The certificate seems to be contained in a + userCertificate container. Assume the following sequence + is the certificate. */ + *r_certoff += hdrlen + objlen; + if (*r_certoff > resultlen) + { + *r_certoff = 0; + return 0; /* That should never happen. */ + } + } + else + *r_certoff = 0; + } + + return resultlen; +} + + diff --git a/scd/app-nks.c b/scd/app-nks.c new file mode 100644 index 000000000..1ca8d4187 --- /dev/null +++ b/scd/app-nks.c @@ -0,0 +1,519 @@ +/* app-nks.c - The Telesec NKS 2.0 card application. + * 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. + */ + +#include <config.h> +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <assert.h> +#include <time.h> + +#include "scdaemon.h" +#include "i18n.h" +#include "iso7816.h" +#include "app-common.h" +#include "tlv.h" + +static struct { + int fid; /* File ID. */ + int certtype; /* Type of certificate or 0 if it is not a certificate. */ + int iskeypair; /* If true has the FID of the correspoding certificate. */ + int issignkey; /* True if file is a key usable for signing. */ + int isenckey; /* True if file is a key usable for decryption. */ +} filelist[] = { + { 0x4531, 0, 0xC000, 1, 0 }, + { 0xC000, 101 }, + { 0x4331, 100 }, + { 0x4332, 100 }, + { 0xB000, 110 }, + { 0x45B1, 0, 0xC200, 0, 1 }, + { 0xC200, 101 }, + { 0x43B1, 100 }, + { 0x43B2, 100 }, + { 0, 0 } +}; + + + +/* Read the file with FID, assume it contains a public key and return + its keygrip in the caller provided 41 byte buffer R_GRIPSTR. */ +static gpg_error_t +keygripstr_from_pk_file (int slot, int fid, char *r_gripstr) +{ + gpg_error_t err; + unsigned char grip[20]; + unsigned char *buffer[2]; + size_t buflen[2]; + gcry_sexp_t sexp; + int i; + + err = iso7816_select_file (slot, fid, 0, NULL, NULL); + if (err) + return err; + err = iso7816_read_record (slot, 1, 1, 0, &buffer[0], &buflen[0]); + if (err) + return err; + err = iso7816_read_record (slot, 2, 1, 0, &buffer[1], &buflen[1]); + if (err) + { + xfree (buffer[0]); + return err; + } + + for (i=0; i < 2; i++) + { + /* Check that the value appears like an integer encoded as + Simple-TLV. We don't check the tag because the tests cards I + have use 1 for both, the modulus and the exponent - the + example in the documentation gives 2 for the exponent. */ + if (buflen[i] < 3) + err = gpg_error (GPG_ERR_TOO_SHORT); + else if (buffer[i][1] != buflen[i]-2 ) + err = gpg_error (GPG_ERR_INV_OBJ); + } + + if (!err) + err = gcry_sexp_build (&sexp, NULL, + "(public-key (rsa (n %b) (e %b)))", + (int)buflen[0]-2, buffer[0]+2, + (int)buflen[1]-2, buffer[1]+2); + + xfree (buffer[0]); + xfree (buffer[1]); + if (err) + return err; + + if (!gcry_pk_get_keygrip (sexp, grip)) + { + err = gpg_error (GPG_ERR_INTERNAL); /* i.e. RSA not supported by + libgcrypt. */ + } + else + { + for (i=0; i < 20; i++) + sprintf (r_gripstr+i*2, "%02X", grip[i]); + } + gcry_sexp_release (sexp); + return err; +} + + + +static gpg_error_t +do_learn_status (APP app, CTRL ctrl) +{ + gpg_error_t err; + char ct_buf[100], id_buf[100]; + int i; + + /* Output information about all useful objects. */ + for (i=0; filelist[i].fid; i++) + { + if (filelist[i].certtype) + { + size_t len; + + len = app_help_read_length_of_cert (app->slot, + filelist[i].fid, NULL); + if (len) + { + /* FIXME: We should store the length in the application's + context so that a following readcert does only need to + read that many bytes. */ + sprintf (ct_buf, "%d", filelist[i].certtype); + sprintf (id_buf, "NKS-DF01.%04X", filelist[i].fid); + send_status_info (ctrl, "CERTINFO", + ct_buf, strlen (ct_buf), + id_buf, strlen (id_buf), + NULL, (size_t)0); + } + } + else if (filelist[i].iskeypair) + { + char gripstr[40+1]; + + err = keygripstr_from_pk_file (app->slot, filelist[i].fid, gripstr); + if (err) + log_error ("can't get keygrip from FID 0x%04X: %s\n", + filelist[i].fid, gpg_strerror (err)); + else + { + sprintf (id_buf, "NKS-DF01.%04X", filelist[i].fid); + send_status_info (ctrl, "KEYPAIRINFO", + gripstr, 40, + id_buf, strlen (id_buf), + NULL, (size_t)0); + } + } + } + + return 0; +} + + + + +/* Read the certificate with id CERTID (as returned by learn_status in + the CERTINFO status lines) and return it in the freshly allocated + buffer put into CERT and the length of the certificate put into + CERTLEN. */ +static gpg_error_t +do_readcert (app_t app, const char *certid, + unsigned char **cert, size_t *certlen) +{ + int i, fid; + gpg_error_t err; + unsigned char *buffer; + const unsigned char *p; + size_t buflen, n; + int class, tag, constructed, ndef; + size_t totobjlen, objlen, hdrlen; + int rootca = 0; + + *cert = NULL; + *certlen = 0; + if (strncmp (certid, "NKS-DF01.", 9) ) + return gpg_error (GPG_ERR_INV_ID); + certid += 9; + if (!hexdigitp (certid) || !hexdigitp (certid+1) + || !hexdigitp (certid+2) || !hexdigitp (certid+3) + || certid[4]) + return gpg_error (GPG_ERR_INV_ID); + fid = xtoi_4 (certid); + for (i=0; filelist[i].fid; i++) + if ((filelist[i].certtype || filelist[i].iskeypair) + && filelist[i].fid == fid) + break; + if (!filelist[i].fid) + return gpg_error (GPG_ERR_NOT_FOUND); + + /* If the requested objects is a plain public key, redirect it to + the corresponding certificate. The whole system is a bit messy + becuase we sometime use the key directly or let the caller + retrieve the key from the certificate. The valid point behind + that is to support not-yet stored certificates. */ + if (filelist[i].iskeypair) + fid = filelist[i].iskeypair; + + + /* Read the entire file. fixme: This could be optimized by first + reading the header to figure out how long the certificate + actually is. */ + err = iso7816_select_file (app->slot, fid, 0, NULL, NULL); + if (err) + { + log_error ("error selecting FID 0x%04X: %s\n", fid, gpg_strerror (err)); + return err; + } + + err = iso7816_read_binary (app->slot, 0, 0, &buffer, &buflen); + if (err) + { + log_error ("error reading certificate from FID 0x%04X: %s\n", + fid, gpg_strerror (err)); + return err; + } + + if (!buflen || *buffer == 0xff) + { + log_info ("no certificate contained in FID 0x%04X\n", fid); + err = gpg_error (GPG_ERR_NOT_FOUND); + goto leave; + } + + /* Now figure something out about the object. */ + p = buffer; + n = buflen; + err = parse_ber_header (&p, &n, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (err) + goto leave; + if ( class == CLASS_UNIVERSAL && tag == TAG_SEQUENCE && constructed ) + ; + else if ( class == CLASS_UNIVERSAL && tag == TAG_SET && constructed ) + rootca = 1; + else + return gpg_error (GPG_ERR_INV_OBJ); + totobjlen = objlen + hdrlen; + assert (totobjlen <= buflen); + + err = parse_ber_header (&p, &n, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (err) + goto leave; + + if (rootca) + ; + else if (class == CLASS_UNIVERSAL && tag == TAG_OBJECT_ID && !constructed) + { + const unsigned char *save_p; + + /* The certificate seems to be contained in a userCertificate + container. Skip this and assume the following sequence is + the certificate. */ + if (n < objlen) + { + err = gpg_error (GPG_ERR_INV_OBJ); + goto leave; + } + p += objlen; + n -= objlen; + save_p = p; + err = parse_ber_header (&p, &n, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (err) + goto leave; + if ( !(class == CLASS_UNIVERSAL && tag == TAG_SEQUENCE && constructed) ) + return gpg_error (GPG_ERR_INV_OBJ); + totobjlen = objlen + hdrlen; + assert (save_p + totobjlen <= buffer + buflen); + memmove (buffer, save_p, totobjlen); + } + + *cert = buffer; + buffer = NULL; + *certlen = totobjlen; + + leave: + xfree (buffer); + return err; +} + + +/* Verify the PIN if required. */ +static gpg_error_t +verify_pin (app_t app, + gpg_error_t (*pincb)(void*, const char *, char **), + void *pincb_arg) +{ + /* Note that force_chv1 is never set but we do it here anyway so + that other applications may reuse this function. For example it + makes sense to set force_chv1 for German signature law cards. + NKS is very similar to the DINSIG draft standard. */ + if (!app->did_chv1 || app->force_chv1 ) + { + char *pinvalue; + int rc; + + rc = pincb (pincb_arg, "PIN", &pinvalue); + if (rc) + { + log_info ("PIN callback returned error: %s\n", gpg_strerror (rc)); + return rc; + } + + /* The following limits are due to TCOS but also defined in the + NKS specs. */ + if (strlen (pinvalue) < 6) + { + log_error ("PIN is too short; minimum length is 6\n"); + xfree (pinvalue); + return gpg_error (GPG_ERR_BAD_PIN); + } + else if (strlen (pinvalue) > 16) + { + log_error ("PIN is too large; maximum length is 16\n"); + xfree (pinvalue); + return gpg_error (GPG_ERR_BAD_PIN); + } + + /* Also it is possible to use a local PIN, we use the gloabl + PIN for this application. */ + rc = iso7816_verify (app->slot, 0, pinvalue, strlen (pinvalue)); + if (rc) + { + if ( gpg_error (rc) == GPG_ERR_USE_CONDITIONS ) + log_error (_("the NullPIN has not yet been changed\n")); + else + log_error ("verify PIN failed\n"); + xfree (pinvalue); + return rc; + } + app->did_chv1 = 1; + xfree (pinvalue); + } + + return 0; +} + + + +/* Create the signature and return the allocated result in OUTDATA. + If a PIN is required the PINCB will be used to ask for the PIN; + that callback should return the PIN in an allocated buffer and + store that in the 3rd argument. */ +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, i; + int fid; + unsigned char data[35]; /* Must be large enough for a SHA-1 digest + + the largest OID _prefix above. */ + + if (!keyidstr || !*keyidstr) + return gpg_error (GPG_ERR_INV_VALUE); + if (indatalen != 20 && indatalen != 16 && indatalen != 35) + return gpg_error (GPG_ERR_INV_VALUE); + + /* Check that the provided ID is vaid. This is not really needed + but we do it to to enforce correct usage by the caller. */ + if (strncmp (keyidstr, "NKS-DF01.", 9) ) + return gpg_error (GPG_ERR_INV_ID); + keyidstr += 9; + if (!hexdigitp (keyidstr) || !hexdigitp (keyidstr+1) + || !hexdigitp (keyidstr+2) || !hexdigitp (keyidstr+3) + || keyidstr[4]) + return gpg_error (GPG_ERR_INV_ID); + fid = xtoi_4 (keyidstr); + for (i=0; filelist[i].fid; i++) + if (filelist[i].iskeypair && filelist[i].fid == fid) + break; + if (!filelist[i].fid) + return gpg_error (GPG_ERR_NOT_FOUND); + if (!filelist[i].issignkey) + return gpg_error (GPG_ERR_INV_ID); + + /* Prepare the DER object from INDATA. */ + if (indatalen == 35) + { + /* Alright, the caller was so kind to send us an already + prepared DER object. Check that it is waht we want and that + it matches the hash algorithm. */ + if (hashalgo == GCRY_MD_SHA1 && !memcmp (indata, sha1_prefix, 15)) + ; + else if (hashalgo == GCRY_MD_RMD160 && !memcmp (indata, rmd160_prefix,15)) + ; + else + return gpg_error (GPG_ERR_UNSUPPORTED_ALGORITHM); + memcpy (data, indata, indatalen); + } + else + { + 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); + } + + rc = verify_pin (app, pincb, pincb_arg); + if (!rc) + rc = iso7816_compute_ds (app->slot, data, 35, outdata, outdatalen); + return rc; +} + + + + +/* Decrypt the data in INDATA and return the allocated result in OUTDATA. + If a PIN is required the PINCB will be used to ask for the PIN; it + should return the PIN in an allocated buffer and put it into PIN. */ +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 ) +{ + static const unsigned char mse_parm[] = { + 0x80, 1, 0x10, /* Select algorithm RSA. */ + 0x84, 1, 0x81 /* Select local secret key 1 for decryption. */ + }; + int rc, i; + int fid; + + if (!keyidstr || !*keyidstr || !indatalen) + return gpg_error (GPG_ERR_INV_VALUE); + + /* Check that the provided ID is vaid. This is not really needed + but we do it to to enforce correct usage by the caller. */ + if (strncmp (keyidstr, "NKS-DF01.", 9) ) + return gpg_error (GPG_ERR_INV_ID); + keyidstr += 9; + if (!hexdigitp (keyidstr) || !hexdigitp (keyidstr+1) + || !hexdigitp (keyidstr+2) || !hexdigitp (keyidstr+3) + || keyidstr[4]) + return gpg_error (GPG_ERR_INV_ID); + fid = xtoi_4 (keyidstr); + for (i=0; filelist[i].fid; i++) + if (filelist[i].iskeypair && filelist[i].fid == fid) + break; + if (!filelist[i].fid) + return gpg_error (GPG_ERR_NOT_FOUND); + if (!filelist[i].isenckey) + return gpg_error (GPG_ERR_INV_ID); + + /* Do the TCOS specific MSE. */ + rc = iso7816_manage_security_env (app->slot, + 0xC1, 0xB8, + mse_parm, sizeof mse_parm); + if (!rc) + rc = verify_pin (app, pincb, pincb_arg); + if (!rc) + rc = iso7816_decipher (app->slot, indata, indatalen, 0x81, + outdata, outdatalen); + return rc; +} + + + +/* Select the NKS 2.0 application on the card in SLOT. */ +gpg_error_t +app_select_nks (APP app) +{ + static char const aid[] = { 0xD2, 0x76, 0x00, 0x00, 0x03, 0x01, 0x02 }; + int slot = app->slot; + int rc; + + rc = iso7816_select_application (slot, aid, sizeof aid, 0); + if (!rc) + { + app->apptype = "NKS"; + + app->fnc.learn_status = do_learn_status; + app->fnc.readcert = do_readcert; + app->fnc.getattr = NULL; + app->fnc.setattr = NULL; + app->fnc.genkey = NULL; + app->fnc.sign = do_sign; + app->fnc.auth = NULL; + app->fnc.decipher = do_decipher; + app->fnc.change_pin = NULL; + app->fnc.check_pin = NULL; + } + + return rc; +} + + diff --git a/g10/app-openpgp.c b/scd/app-openpgp.c similarity index 97% rename from g10/app-openpgp.c rename to scd/app-openpgp.c index 102e52329..47ff8abc2 100644 --- a/g10/app-openpgp.c +++ b/scd/app-openpgp.c @@ -113,8 +113,8 @@ struct app_local_s { 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 + size_t keylen; /* The length of the above S-expression. This + is usullay only required for cross checks because the length of an S-expression is implicitly available. */ } pk[3]; @@ -485,7 +485,7 @@ count_bits (const unsigned char *a, size_t len) 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: + (0x18) and consist of key=value pairs. There is one key defined: F=<flags> @@ -697,6 +697,8 @@ do_getattr (app_t app, ctrl_t ctrl, const char *name) { "PRIVATE-DO-2", 0x0102 }, { "PRIVATE-DO-3", 0x0103 }, { "PRIVATE-DO-4", 0x0104 }, + { "$AUTHKEYID", 0x0000, -3 }, + { "$DISPSERIALNO",0x0000, -4 }, { NULL, 0 } }; int idx, i, rc; @@ -743,6 +745,29 @@ do_getattr (app_t app, ctrl_t ctrl, const char *name) send_status_info (ctrl, table[idx].name, tmp, strlen (tmp), NULL, 0); return 0; } + if (table[idx].special == -3) + { + char const tmp[] = "OPENPGP.3"; + send_status_info (ctrl, table[idx].name, tmp, strlen (tmp), NULL, 0); + return 0; + } + if (table[idx].special == -4) + { + char *serial; + time_t stamp; + + if (!app_get_serial_and_stamp (app, &serial, &stamp)) + { + if (strlen (serial) > 16+12) + { + send_status_info (ctrl, table[idx].name, serial+16, 12, NULL, 0); + xfree (serial); + return 0; + } + xfree (serial); + } + return gpg_error (GPG_ERR_INV_NAME); + } relptr = get_one_do (app, table[idx].tag, &value, &valuelen, &rc); if (relptr) @@ -949,8 +974,8 @@ get_public_key (app_t app, int keyno) size_t buflen, keydatalen, mlen, elen; unsigned char *mbuf = NULL; unsigned char *ebuf = NULL; - unsigned char *keybuf = NULL; - unsigned char *keybuf_p; + char *keybuf = NULL; + char *keybuf_p; if (keyno < 1 || keyno > 3) return gpg_error (GPG_ERR_INV_ID); @@ -964,14 +989,16 @@ get_public_key (app_t app, int keyno) app->app_local->pk[keyno].key = NULL; app->app_local->pk[keyno].keylen = 0; + m = e = NULL; /* (avoid cc warning) */ + 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); + err = iso7816_read_public_key + (app->slot, (const unsigned char*)(keyno == 0? "\xB6" : + keyno == 1? "\xB8" : "\xA4"), + 2, + &buffer, &buflen); if (err) { log_error (_("reading public key failed: %s\n"), gpg_strerror (err)); @@ -1108,7 +1135,7 @@ get_public_key (app_t app, int keyno) strcpy (keybuf_p, ")))"); keybuf_p += strlen (keybuf_p); - app->app_local->pk[keyno].key = keybuf; + app->app_local->pk[keyno].key = (unsigned char*)keybuf; app->app_local->pk[keyno].keylen = (keybuf_p - keybuf); leave: @@ -1229,8 +1256,15 @@ do_readkey (app_t app, const char *keyid, unsigned char **pk, size_t *pklen) 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;; + *pk = xtrymalloc (*pklen); + if (!*pk) + { + err = gpg_error_from_errno (errno); + *pklen = 0; + return err; + } + memcpy (*pk, buf, *pklen); return 0; #else return gpg_error (GPG_ERR_NOT_IMPLEMENTED); @@ -1251,6 +1285,11 @@ verify_chv2 (app_t app, if (!app->did_chv2) { char *pinvalue; + iso7816_pininfo_t pininfo; + + memset (&pininfo, 0, sizeof pininfo); + pininfo.mode = 1; + pininfo.minlen = 6; rc = pincb (pincb_arg, "PIN", &pinvalue); if (rc) @@ -1890,11 +1929,10 @@ do_genkey (app_t app, ctrl_t ctrl, const char *keynostr, unsigned int flags, #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); + (app->slot, (const unsigned char*)(keyno == 0? "\xB6" : + keyno == 1? "\xB8" : "\xA4"), + 2, + &buffer, &buflen); if (rc) { rc = gpg_error (GPG_ERR_CARD); @@ -2047,7 +2085,7 @@ check_against_given_fingerprint (app_t app, const char *fpr, int keyno) 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 + Note that this function 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). */ @@ -2084,8 +2122,8 @@ do_sign (app_t app, const char *keyidstr, int hashalgo, ; else { - log_error(_("card does not support digest algorithm %s\n"), - digest_algo_to_string(hashalgo)); + log_error (_("card does not support digest algorithm %s\n"), + gcry_md_algo_name (hashalgo)); return gpg_error (GPG_ERR_INV_VALUE); } @@ -2200,7 +2238,7 @@ do_sign (app_t app, const char *keyidstr, int hashalgo, fingerprint delimited by a slash. Optionally the id OPENPGP.3 may be given. - Note that this fucntion may return the error code + Note that this function 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). */ @@ -2427,7 +2465,9 @@ app_select_openpgp (app_t app) size_t buflen; void *relptr; - rc = iso7816_select_application (slot, aid, sizeof aid); + /* Note that the card can't cope with P2=0xCO, thus we need to pass a + special flag value. */ + rc = iso7816_select_application (slot, aid, sizeof aid, 0x0001); if (!rc) { unsigned int manufacturer; diff --git a/scd/app-p15.c b/scd/app-p15.c new file mode 100644 index 000000000..8a7732c85 --- /dev/null +++ b/scd/app-p15.c @@ -0,0 +1,3416 @@ +/* app-p15.c - The pkcs#15 card application. + * 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. + */ + +/* Information pertaining to the BELPIC developer card samples: + + Unblock PUK: "222222111111" + Reset PIN: "333333111111") + + e.g. the APDUs 00:20:00:02:08:2C:33:33:33:11:11:11:FF + and 00:24:01:01:08:24:12:34:FF:FF:FF:FF:FF + should change the PIN into 1234. +*/ + +#include <config.h> +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <assert.h> +#include <time.h> + +#include "scdaemon.h" + +#include "iso7816.h" +#include "app-common.h" +#include "tlv.h" +#include "apdu.h" /* fixme: we should move the card detection to a + separate file */ + +/* Types of cards we know and which needs special treatment. */ +typedef enum + { + CARD_TYPE_UNKNOWN, + CARD_TYPE_TCOS, + CARD_TYPE_MICARDO, + CARD_TYPE_BELPIC /* Belgian eID card specs. */ + } +card_type_t; + +/* A list card types with ATRs noticed with these cards. */ +#define X(a) ((unsigned char const *)(a)) +static struct +{ + size_t atrlen; + unsigned char const *atr; + card_type_t type; +} card_atr_list[] = { + { 19, X("\x3B\xBA\x13\x00\x81\x31\x86\x5D\x00\x64\x05\x0A\x02\x01\x31\x80" + "\x90\x00\x8B"), + CARD_TYPE_TCOS }, /* SLE44 */ + { 19, X("\x3B\xBA\x14\x00\x81\x31\x86\x5D\x00\x64\x05\x14\x02\x02\x31\x80" + "\x90\x00\x91"), + CARD_TYPE_TCOS }, /* SLE66S */ + { 19, X("\x3B\xBA\x96\x00\x81\x31\x86\x5D\x00\x64\x05\x60\x02\x03\x31\x80" + "\x90\x00\x66"), + CARD_TYPE_TCOS }, /* SLE66P */ + { 27, X("\x3B\xFF\x94\x00\xFF\x80\xB1\xFE\x45\x1F\x03\x00\x68\xD2\x76\x00" + "\x00\x28\xFF\x05\x1E\x31\x80\x00\x90\x00\x23"), + CARD_TYPE_MICARDO }, /* German BMI card */ + { 19, X("\x3B\x6F\x00\xFF\x00\x68\xD2\x76\x00\x00\x28\xFF\x05\x1E\x31\x80" + "\x00\x90\x00"), + CARD_TYPE_MICARDO }, /* German BMI card (ATR due to reader problem) */ + { 26, X("\x3B\xFE\x94\x00\xFF\x80\xB1\xFA\x45\x1F\x03\x45\x73\x74\x45\x49" + "\x44\x20\x76\x65\x72\x20\x31\x2E\x30\x43"), + CARD_TYPE_MICARDO }, /* EstEID (Estonian Big Brother card) */ + + { 0 } +}; +#undef X + + +/* The AID of PKCS15. */ +static char const pkcs15_aid[] = { 0xA0, 0, 0, 0, 0x63, + 0x50, 0x4B, 0x43, 0x53, 0x2D, 0x31, 0x35 }; + +/* The Belgian eID variant - they didn't understood why a shared AID + is useful for a standard. Oh well. */ +static char const pkcs15be_aid[] = { 0xA0, 0, 0, 0x01, 0x77, + 0x50, 0x4B, 0x43, 0x53, 0x2D, 0x31, 0x35 }; + + +/* The PIN types as defined in pkcs#15 v1.1 */ +typedef enum + { + PIN_TYPE_BCD = 0, + PIN_TYPE_ASCII_NUMERIC = 1, + PIN_TYPE_UTF8 = 2, + PIN_TYPE_HALF_NIBBLE_BCD = 3, + PIN_TYPE_ISO9564_1 = 4 + } pin_type_t; + + +/* A bit array with for the key usage flags from the + commonKeyAttributes. */ +struct keyusage_flags_s +{ + unsigned int encrypt: 1; + unsigned int decrypt: 1; + unsigned int sign: 1; + unsigned int sign_recover: 1; + unsigned int wrap: 1; + unsigned int unwrap: 1; + unsigned int verify: 1; + unsigned int verify_recover: 1; + unsigned int derive: 1; + unsigned int non_repudiation: 1; +}; +typedef struct keyusage_flags_s keyusage_flags_t; + + + +/* This is an object to store information about a Certificate + Directory File (CDF) in a format suitable for further processing by + us. To keep memory management, simple we use a linked list of + items; i.e. one such object represents one certificate and the list + the entire CDF. */ +struct cdf_object_s +{ + /* Link to next item when used in a linked list. */ + struct cdf_object_s *next; + + /* Length and allocated buffer with the Id of this object. */ + size_t objidlen; + unsigned char *objid; + + /* To avoid reading a certificate more than once, we cache it in an + allocated memory IMAGE of IMAGELEN. */ + size_t imagelen; + unsigned char *image; + + /* Set to true if a length and offset is available. */ + int have_off; + /* The offset and length of the object. They are only valid if + HAVE_OFF is true and set to 0 if HAVE_OFF is false. */ + unsigned long off, len; + + /* The length of the path as given in the CDF and the path itself. + path[0] is the top DF (usually 0x3f00). The path will never be + empty. */ + size_t pathlen; + unsigned short path[1]; +}; +typedef struct cdf_object_s *cdf_object_t; + + +/* This is an object to store information about a Private Key + Directory File (PrKDF) in a format suitable for further processing + by us. To keep memory management, simple we use a linked list of + items; i.e. one such object represents one certificate and the list + the entire PrKDF. */ +struct prkdf_object_s +{ + /* Link to next item when used in a linked list. */ + struct prkdf_object_s *next; + + /* Length and allocated buffer with the Id of this object. */ + size_t objidlen; + unsigned char *objid; + + /* Length and allocated buffer with the authId of this object or + NULL if no authID is known. */ + size_t authidlen; + unsigned char *authid; + + /* The key's usage flags. */ + keyusage_flags_t usageflags; + + /* The keyReference and a flag telling whether it is valid. */ + unsigned long key_reference; + int key_reference_valid; + + /* Set to true if a length and offset is available. */ + int have_off; + /* The offset and length of the object. They are only valid if + HAVE_OFF is true and set to 0 if HAVE_OFF is false. */ + unsigned long off, len; + + /* The length of the path as given in the PrKDF and the path itself. + path[0] is the top DF (usually 0x3f00). */ + size_t pathlen; + unsigned short path[1]; +}; +typedef struct prkdf_object_s *prkdf_object_t; + + +/* This is an object to store information about a Authentication + Object Directory File (AODF) in a format suitable for further + processing by us. To keep memory management, simple we use a linked + list of items; i.e. one such object represents one authentication + object and the list the entire AOKDF. */ +struct aodf_object_s +{ + /* Link to next item when used in a linked list. */ + struct aodf_object_s *next; + + /* Length and allocated buffer with the Id of this object. */ + size_t objidlen; + unsigned char *objid; + + /* Length and allocated buffer with the authId of this object or + NULL if no authID is known. */ + size_t authidlen; + unsigned char *authid; + + /* The PIN Flags. */ + struct + { + unsigned int case_sensitive: 1; + unsigned int local: 1; + unsigned int change_disabled: 1; + unsigned int unblock_disabled: 1; + unsigned int initialized: 1; + unsigned int needs_padding: 1; + unsigned int unblocking_pin: 1; + unsigned int so_pin: 1; + unsigned int disable_allowed: 1; + unsigned int integrity_protected: 1; + unsigned int confidentiality_protected: 1; + unsigned int exchange_ref_data: 1; + } pinflags; + + /* The PIN Type. */ + pin_type_t pintype; + + /* The minimum length of a PIN. */ + unsigned long min_length; + + /* The stored length of a PIN. */ + unsigned long stored_length; + + /* The maximum length of a PIN and a flag telling whether it is valid. */ + unsigned long max_length; + int max_length_valid; + + /* The pinReference and a flag telling whether it is valid. */ + unsigned long pin_reference; + int pin_reference_valid; + + /* The padChar and a flag telling whether it is valid. */ + char pad_char; + int pad_char_valid; + + + /* Set to true if a length and offset is available. */ + int have_off; + /* The offset and length of the object. They are only valid if + HAVE_OFF is true and set to 0 if HAVE_OFF is false. */ + unsigned long off, len; + + /* The length of the path as given in the Aodf and the path itself. + path[0] is the top DF (usually 0x3f00). PATH is optional and thus + may be NULL. Malloced.*/ + size_t pathlen; + unsigned short *path; +}; +typedef struct aodf_object_s *aodf_object_t; + + +/* Context local to this application. */ +struct app_local_s +{ + /* The home DF. Note, that we don't yet support a multilevel + hierachy. Thus we assume this is directly below the MF. */ + unsigned short home_df; + + /* The type of the card. */ + card_type_t card_type; + + /* Flag indicating whether we may use direct path selection. */ + int direct_path_selection; + + /* Structure with the EFIDs of the objects described in the ODF + file. */ + struct + { + unsigned short private_keys; + unsigned short public_keys; + unsigned short trusted_public_keys; + unsigned short secret_keys; + unsigned short certificates; + unsigned short trusted_certificates; + unsigned short useful_certificates; + unsigned short data_objects; + unsigned short auth_objects; + } odf; + + /* The PKCS#15 serialnumber from EF(TokeiNFo) or NULL. Malloced. */ + unsigned char *serialno; + size_t serialnolen; + + /* Information on all certificates. */ + cdf_object_t certificate_info; + /* Information on all trusted certificates. */ + cdf_object_t trusted_certificate_info; + /* Information on all useful certificates. */ + cdf_object_t useful_certificate_info; + + /* Information on all private keys. */ + prkdf_object_t private_key_info; + + /* Information on all authentication objects. */ + aodf_object_t auth_object_info; + +}; + + +/*** Local prototypes. ***/ +static gpg_error_t readcert_by_cdf (app_t app, cdf_object_t cdf, + unsigned char **r_cert, size_t *r_certlen); + + + +/* Release the CDF object A */ +static void +release_cdflist (cdf_object_t a) +{ + while (a) + { + cdf_object_t tmp = a->next; + xfree (a->image); + xfree (a->objid); + xfree (a); + a = tmp; + } +} + +/* Release the PrKDF object A. */ +static void +release_prkdflist (prkdf_object_t a) +{ + while (a) + { + prkdf_object_t tmp = a->next; + xfree (a->objid); + xfree (a->authid); + xfree (a); + a = tmp; + } +} + +/* Release just one aodf object. */ +void +release_aodf_object (aodf_object_t a) +{ + if (a) + { + xfree (a->objid); + xfree (a->authid); + xfree (a->path); + xfree (a); + } +} + +/* Release the AODF list A. */ +static void +release_aodflist (aodf_object_t a) +{ + while (a) + { + aodf_object_t tmp = a->next; + release_aodf_object (a); + a = tmp; + } +} + + +/* Release all local resources. */ +static void +do_deinit (app_t app) +{ + if (app && app->app_local) + { + release_cdflist (app->app_local->certificate_info); + release_cdflist (app->app_local->trusted_certificate_info); + release_cdflist (app->app_local->useful_certificate_info); + release_prkdflist (app->app_local->private_key_info); + release_aodflist (app->app_local->auth_object_info); + xfree (app->app_local->serialno); + xfree (app->app_local); + app->app_local = NULL; + } +} + + + +/* Do a select and a read for the file with EFID. EFID_DESC is a + desctription of the EF to be used with error messages. On success + BUFFER and BUFLEN contain the entire content of the EF. The caller + must free BUFFER only on success. */ +static gpg_error_t +select_and_read_binary (int slot, unsigned short efid, const char *efid_desc, + unsigned char **buffer, size_t *buflen) +{ + gpg_error_t err; + + err = iso7816_select_file (slot, efid, 0, NULL, NULL); + if (err) + { + log_error ("error selecting %s (0x%04X): %s\n", + efid_desc, efid, gpg_strerror (err)); + return err; + } + err = iso7816_read_binary (slot, 0, 0, buffer, buflen); + if (err) + { + log_error ("error reading %s (0x%04X): %s\n", + efid_desc, efid, gpg_strerror (err)); + return err; + } + return 0; +} + + +/* This function calls select file to read a file using a complete + path which may or may not start at the master file (MF). */ +static gpg_error_t +select_ef_by_path (app_t app, const unsigned short *path, size_t pathlen) +{ + gpg_error_t err; + int i, j; + + if (!pathlen) + return gpg_error (GPG_ERR_INV_VALUE); + + if (pathlen && *path != 0x3f00 ) + log_debug ("WARNING: relative path selection not yet implemented\n"); + + if (app->app_local->direct_path_selection) + { + err = iso7816_select_path (app->slot, path+1, pathlen-1, NULL, NULL); + if (err) + { + log_error ("error selecting path "); + for (j=0; j < pathlen; j++) + log_printf ("%04hX", path[j]); + log_printf (": %s\n", gpg_strerror (err)); + return err; + } + } + else + { + /* FIXME: Need code to remember the last PATH so that we can decide + what select commands to send in case the path does not start off + with 3F00. We might also want to use direct path selection if + supported by the card. */ + for (i=0; i < pathlen; i++) + { + err = iso7816_select_file (app->slot, path[i], + !(i+1 == pathlen), NULL, NULL); + if (err) + { + log_error ("error selecting part %d from path ", i); + for (j=0; j < pathlen; j++) + log_printf ("%04hX", path[j]); + log_printf (": %s\n", gpg_strerror (err)); + return err; + } + } + } + return 0; +} + +/* Parse a cert Id string (or a key Id string) and return the binary + object Id string in a newly allocated buffer stored at R_OBJID and + R_OBJIDLEN. On Error NULL will be stored there and an error code + returned. On success caller needs to free the buffer at R_OBJID. */ +static gpg_error_t +parse_certid (app_t app, const char *certid, + unsigned char **r_objid, size_t *r_objidlen) +{ + char tmpbuf[10]; + const char *s; + size_t objidlen; + unsigned char *objid; + int i; + + *r_objid = NULL; + *r_objidlen = 0; + + if (app->app_local->home_df) + sprintf (tmpbuf, "P15-%04hX.", (app->app_local->home_df & 0xffff)); + else + strcpy (tmpbuf, "P15."); + if (strncmp (certid, tmpbuf, strlen (tmpbuf)) ) + { + if (!strncmp (certid, "P15.", 4) + || (!strncmp (certid, "P15-", 4) + && hexdigitp (certid+4) + && hexdigitp (certid+5) + && hexdigitp (certid+6) + && hexdigitp (certid+7) + && certid[8] == '.')) + return gpg_error (GPG_ERR_NOT_FOUND); + return gpg_error (GPG_ERR_INV_ID); + } + certid += strlen (tmpbuf); + + for (s=certid, objidlen=0; hexdigitp (s); s++, objidlen++) + ; + if (*s || !objidlen || (objidlen%2)) + return gpg_error (GPG_ERR_INV_ID); + objidlen /= 2; + objid = xtrymalloc (objidlen); + if (!objid) + return gpg_error_from_errno (errno); + for (s=certid, i=0; i < objidlen; i++, s+=2) + objid[i] = xtoi_2 (s); + *r_objid = objid; + *r_objidlen = objidlen; + return 0; +} + + +/* Find a certificate object by the certificate ID CERTID and store a + pointer to it at R_CDF. */ +static gpg_error_t +cdf_object_from_certid (app_t app, const char *certid, cdf_object_t *r_cdf) +{ + gpg_error_t err; + size_t objidlen; + unsigned char *objid; + cdf_object_t cdf; + + err = parse_certid (app, certid, &objid, &objidlen); + if (err) + return err; + + for (cdf = app->app_local->certificate_info; cdf; cdf = cdf->next) + if (cdf->objidlen == objidlen && !memcmp (cdf->objid, objid, objidlen)) + break; + if (!cdf) + for (cdf = app->app_local->trusted_certificate_info; cdf; cdf = cdf->next) + if (cdf->objidlen == objidlen && !memcmp (cdf->objid, objid, objidlen)) + break; + if (!cdf) + for (cdf = app->app_local->useful_certificate_info; cdf; cdf = cdf->next) + if (cdf->objidlen == objidlen && !memcmp (cdf->objid, objid, objidlen)) + break; + xfree (objid); + if (!cdf) + return gpg_error (GPG_ERR_NOT_FOUND); + *r_cdf = cdf; + return 0; +} + + +/* Find a private key object by the key Id string KEYIDSTR and store a + pointer to it at R_PRKDF. */ +static gpg_error_t +prkdf_object_from_keyidstr (app_t app, const char *keyidstr, + prkdf_object_t *r_prkdf) +{ + gpg_error_t err; + size_t objidlen; + unsigned char *objid; + prkdf_object_t prkdf; + + err = parse_certid (app, keyidstr, &objid, &objidlen); + if (err) + return err; + + for (prkdf = app->app_local->private_key_info; prkdf; prkdf = prkdf->next) + if (prkdf->objidlen == objidlen && !memcmp (prkdf->objid, objid, objidlen)) + break; + xfree (objid); + if (!prkdf) + return gpg_error (GPG_ERR_NOT_FOUND); + *r_prkdf = prkdf; + return 0; +} + + + + +/* Read and parse the Object Directory File and store away the + pointers. ODF_FID shall contain the FID of the ODF. + + Example of such a file: + + A0 06 30 04 04 02 60 34 = Private Keys + A4 06 30 04 04 02 60 35 = Certificates + A5 06 30 04 04 02 60 36 = TrustedCertificates + A7 06 30 04 04 02 60 37 = DataObjects + A8 06 30 04 04 02 60 38 = AuthObjects + + These are all PathOrObjects using the path CHOICE element. The + paths are octet strings of length 2. Using this Path CHOICE + element is recommended, so we only implement that for now. +*/ +static gpg_error_t +read_ef_odf (app_t app, unsigned short odf_fid) +{ + gpg_error_t err; + unsigned char *buffer, *p; + size_t buflen; + unsigned short value; + size_t offset; + + err = select_and_read_binary (app->slot, odf_fid, "ODF", &buffer, &buflen); + if (err) + return err; + + if (buflen < 8) + { + log_error ("error: ODF too short\n"); + xfree (buffer); + return gpg_error (GPG_ERR_INV_OBJ); + } + p = buffer; + while (buflen && *p && *p != 0xff) + { + if ( buflen >= 8 + && (p[0] & 0xf0) == 0xA0 + && !memcmp (p+1, "\x06\x30\x04\x04\x02", 5) ) + { + offset = 6; + } + else if ( buflen >= 12 + && (p[0] & 0xf0) == 0xA0 + && !memcmp (p+1, "\x0a\x30\x08\x04\x06\x3F\x00", 7) + && app->app_local->home_df == ((p[8]<<8)|p[9]) ) + { + /* We only allow a full path if all files are at the same + level and below the home directory. The extend this we + would need to make use of new data type capable of + keeping a full path. */ + offset = 10; + } + else + { + log_error ("ODF format is not supported by us\n"); + xfree (buffer); + return gpg_error (GPG_ERR_INV_OBJ); + } + switch ((p[0] & 0x0f)) + { + case 0: value = app->app_local->odf.private_keys; break; + case 1: value = app->app_local->odf.public_keys; break; + case 2: value = app->app_local->odf.trusted_public_keys; break; + case 3: value = app->app_local->odf.secret_keys; break; + case 4: value = app->app_local->odf.certificates; break; + case 5: value = app->app_local->odf.trusted_certificates; break; + case 6: value = app->app_local->odf.useful_certificates; break; + case 7: value = app->app_local->odf.data_objects; break; + case 8: value = app->app_local->odf.auth_objects; break; + default: value = 0; break; + } + if (value) + { + log_error ("duplicate object type %d in ODF ignored\n",(p[0]&0x0f)); + continue; + } + value = ((p[offset] << 8) | p[offset+1]); + switch ((p[0] & 0x0f)) + { + case 0: app->app_local->odf.private_keys = value; break; + case 1: app->app_local->odf.public_keys = value; break; + case 2: app->app_local->odf.trusted_public_keys = value; break; + case 3: app->app_local->odf.secret_keys = value; break; + case 4: app->app_local->odf.certificates = value; break; + case 5: app->app_local->odf.trusted_certificates = value; break; + case 6: app->app_local->odf.useful_certificates = value; break; + case 7: app->app_local->odf.data_objects = value; break; + case 8: app->app_local->odf.auth_objects = value; break; + default: + log_error ("unknown object type %d in ODF ignored\n", (p[0]&0x0f)); + } + offset += 2; + + if (buflen < offset) + break; + p += offset; + buflen -= offset; + } + + if (buflen) + log_info ("warning: %u bytes of garbage detected at end of ODF\n", buflen); + + xfree (buffer); + return 0; +} + + +/* Parse the BIT STRING with the keyUsageFlags from teh + CommonKeyAttributes. */ +static gpg_error_t +parse_keyusage_flags (const unsigned char *der, size_t derlen, + keyusage_flags_t *usageflags) +{ + unsigned int bits, mask; + int i, unused, full; + + memset (usageflags, 0, sizeof *usageflags); + if (!derlen) + return gpg_error (GPG_ERR_INV_OBJ); + + unused = *der++; derlen--; + if ((!derlen && unused) || unused/8 > derlen) + return gpg_error (GPG_ERR_ENCODING_PROBLEM); + full = derlen - (unused+7)/8; + unused %= 8; + mask = 0; + for (i=1; unused; i <<= 1, unused--) + mask |= i; + + /* First octet */ + if (derlen) + { + bits = *der++; derlen--; + if (full) + full--; + else + { + bits &= ~mask; + mask = 0; + } + } + else + bits = 0; + if ((bits & 0x80)) usageflags->encrypt = 1; + if ((bits & 0x40)) usageflags->decrypt = 1; + if ((bits & 0x20)) usageflags->sign = 1; + if ((bits & 0x10)) usageflags->sign_recover = 1; + if ((bits & 0x08)) usageflags->wrap = 1; + if ((bits & 0x04)) usageflags->unwrap = 1; + if ((bits & 0x02)) usageflags->verify = 1; + if ((bits & 0x01)) usageflags->verify_recover = 1; + + /* Second octet. */ + if (derlen) + { + bits = *der++; derlen--; + if (full) + full--; + else + { + bits &= ~mask; + mask = 0; + } + } + else + bits = 0; + if ((bits & 0x80)) usageflags->derive = 1; + if ((bits & 0x40)) usageflags->non_repudiation = 1; + + return 0; +} + +/* Read and parse the Private Key Directory Files. */ +/* + 6034 (privatekeys) + +30 33 30 11 0C 08 53 4B 2E 43 48 2E 44 53 03 02 030...SK.CH.DS.. +06 80 04 01 07 30 0C 04 01 01 03 03 06 00 40 02 .....0........@. +02 00 50 A1 10 30 0E 30 08 04 06 3F 00 40 16 00 ..P..0.0...?.@.. +50 02 02 04 00 30 33 30 11 0C 08 53 4B 2E 43 48 P....030...SK.CH +2E 4B 45 03 02 06 80 04 01 0A 30 0C 04 01 0C 03 .KE.......0..... +03 06 44 00 02 02 00 52 A1 10 30 0E 30 08 04 06 ..D....R..0.0... +3F 00 40 16 00 52 02 02 04 00 30 34 30 12 0C 09 ?.@..R....040... +53 4B 2E 43 48 2E 41 55 54 03 02 06 80 04 01 0A SK.CH.AUT....... +30 0C 04 01 0D 03 03 06 20 00 02 02 00 51 A1 10 0....... ....Q.. +30 0E 30 08 04 06 3F 00 40 16 00 51 02 02 04 00 0.0...?.@..Q.... +30 37 30 15 0C 0C 53 4B 2E 43 48 2E 44 53 2D 53 070...SK.CH.DS-S +50 58 03 02 06 80 04 01 0A 30 0C 04 01 02 03 03 PX.......0...... +06 20 00 02 02 00 53 A1 10 30 0E 30 08 04 06 3F . ....S..0.0...? +00 40 16 00 53 02 02 04 00 00 00 00 00 00 00 00 .@..S........... +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + + 0 30 51: SEQUENCE { + 2 30 17: SEQUENCE { -- commonObjectAttributes + 4 0C 8: UTF8String 'SK.CH.DS' + 14 03 2: BIT STRING 6 unused bits + : '01'B (bit 0) + 18 04 1: OCTET STRING --authid + : 07 + : } + 21 30 12: SEQUENCE { -- commonKeyAttributes + 23 04 1: OCTET STRING + : 01 + 26 03 3: BIT STRING 6 unused bits + : '1000000000'B (bit 9) + 31 02 2: INTEGER 80 -- keyReference (optional) + : } + 35 A1 16: [1] { -- keyAttributes + 37 30 14: SEQUENCE { -- privateRSAKeyAttributes + 39 30 8: SEQUENCE { -- objectValue + 41 04 6: OCTET STRING --path + : 3F 00 40 16 00 50 + : } + 49 02 2: INTEGER 1024 -- modulus + : } + : } + : } + + +*/ +static gpg_error_t +read_ef_prkdf (app_t app, unsigned short fid, prkdf_object_t *result) +{ + gpg_error_t err; + unsigned char *buffer = NULL; + size_t buflen; + const unsigned char *p; + size_t n, objlen, hdrlen; + int class, tag, constructed, ndef; + prkdf_object_t prkdflist = NULL; + int i; + + if (!fid) + return gpg_error (GPG_ERR_NO_DATA); /* No private keys. */ + + err = select_and_read_binary (app->slot, fid, "PrKDF", &buffer, &buflen); + if (err) + return err; + + p = buffer; + n = buflen; + + /* FIXME: This shares a LOT of code with read_ef_cdf! */ + + /* Loop over the records. We stop as soon as we detect a new record + starting with 0x00 or 0xff as these values are commonly used to + pad data blocks and are no valid ASN.1 encoding. */ + while (n && *p && *p != 0xff) + { + const unsigned char *pp; + size_t nn; + int where; + const char *errstr = NULL; + prkdf_object_t prkdf = NULL; + unsigned long ul; + const unsigned char *objid; + size_t objidlen; + const unsigned char *authid = NULL; + size_t authidlen = 0; + keyusage_flags_t usageflags; + unsigned long key_reference = 0; + int key_reference_valid = 0; + const char *s; + + err = parse_ber_header (&p, &n, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && (objlen > n || tag != TAG_SEQUENCE)) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + { + log_error ("error parsing PrKDF record: %s\n", gpg_strerror (err)); + goto leave; + } + pp = p; + nn = objlen; + p += objlen; + n -= objlen; + + /* Parse the commonObjectAttributes. */ + where = __LINE__; + err = parse_ber_header (&pp, &nn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && (objlen > nn || tag != TAG_SEQUENCE)) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + goto parse_error; + { + const unsigned char *ppp = pp; + size_t nnn = objlen; + + pp += objlen; + nn -= objlen; + + /* Search the optional AuthId. We need to skip the optional + Label (UTF8STRING) and the optional CommonObjectFlags + (BITSTRING). */ + where = __LINE__; + err = parse_ber_header (&ppp, &nnn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && (objlen > nnn || class != CLASS_UNIVERSAL)) + err = gpg_error (GPG_ERR_INV_OBJ); + if (gpg_err_code (err) == GPG_ERR_EOF) + goto no_authid; + if (err) + goto parse_error; + if (tag == TAG_UTF8_STRING) + { + ppp += objlen; /* Skip the Label. */ + nnn -= objlen; + + where = __LINE__; + err = parse_ber_header (&ppp, &nnn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && (objlen > nnn || class != CLASS_UNIVERSAL)) + err = gpg_error (GPG_ERR_INV_OBJ); + if (gpg_err_code (err) == GPG_ERR_EOF) + goto no_authid; + if (err) + goto parse_error; + } + if (tag == TAG_BIT_STRING) + { + ppp += objlen; /* Skip the CommonObjectFlags. */ + nnn -= objlen; + + where = __LINE__; + err = parse_ber_header (&ppp, &nnn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && (objlen > nnn || class != CLASS_UNIVERSAL)) + err = gpg_error (GPG_ERR_INV_OBJ); + if (gpg_err_code (err) == GPG_ERR_EOF) + goto no_authid; + if (err) + goto parse_error; + } + if (tag == TAG_OCTET_STRING && objlen) + { + authid = ppp; + authidlen = objlen; + } + no_authid: + ; + } + + /* Parse the commonKeyAttributes. */ + where = __LINE__; + err = parse_ber_header (&pp, &nn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && (objlen > nn || tag != TAG_SEQUENCE)) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + goto parse_error; + { + const unsigned char *ppp = pp; + size_t nnn = objlen; + + pp += objlen; + nn -= objlen; + + /* Get the Id. */ + where = __LINE__; + err = parse_ber_header (&ppp, &nnn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && (objlen > nnn + || class != CLASS_UNIVERSAL || tag != TAG_OCTET_STRING)) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + goto parse_error; + objid = ppp; + objidlen = objlen; + ppp += objlen; + nnn -= objlen; + + /* Get the KeyUsageFlags. */ + where = __LINE__; + err = parse_ber_header (&ppp, &nnn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && (objlen > nnn + || class != CLASS_UNIVERSAL || tag != TAG_BIT_STRING)) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + goto parse_error; + err = parse_keyusage_flags (ppp, objlen, &usageflags); + if (err) + goto parse_error; + ppp += objlen; + nnn -= objlen; + + /* Find the keyReference */ + where = __LINE__; + err = parse_ber_header (&ppp, &nnn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (gpg_err_code (err) == GPG_ERR_EOF) + goto leave_cki; + if (!err && objlen > nnn) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + goto parse_error; + if (class == CLASS_UNIVERSAL && tag == TAG_BOOLEAN) + { + /* Skip the native element. */ + ppp += objlen; + nnn -= objlen; + + err = parse_ber_header (&ppp, &nnn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (gpg_err_code (err) == GPG_ERR_EOF) + goto leave_cki; + if (!err && objlen > nnn) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + goto parse_error; + } + if (class == CLASS_UNIVERSAL && tag == TAG_BIT_STRING) + { + /* Skip the accessFlags. */ + ppp += objlen; + nnn -= objlen; + + err = parse_ber_header (&ppp, &nnn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (gpg_err_code (err) == GPG_ERR_EOF) + goto leave_cki; + if (!err && objlen > nnn) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + goto parse_error; + } + if (class == CLASS_UNIVERSAL && tag == TAG_INTEGER) + { + /* Yep, this is the keyReference. */ + for (ul=0; objlen; objlen--) + { + ul <<= 8; + ul |= (*ppp++) & 0xff; + nnn--; + } + key_reference = ul; + key_reference_valid = 1; + } + + leave_cki: + ; + } + + + /* Skip subClassAttributes. */ + where = __LINE__; + err = parse_ber_header (&pp, &nn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && objlen > nn) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + goto parse_error; + if (class == CLASS_CONTEXT && tag == 0) + { + pp += objlen; + nn -= objlen; + + where = __LINE__; + err = parse_ber_header (&pp, &nn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + } + /* Parse the keyAttributes. */ + if (!err && (objlen > nn || class != CLASS_CONTEXT || tag != 1)) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + goto parse_error; + nn = objlen; + + where = __LINE__; + err = parse_ber_header (&pp, &nn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && objlen > nn) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + goto parse_error; + if (class == CLASS_UNIVERSAL && tag == TAG_SEQUENCE) + ; /* RSA */ + else if (class == CLASS_CONTEXT) + { + switch (tag) + { + case 0: errstr = "EC key objects are not supported"; break; + case 1: errstr = "DH key objects are not supported"; break; + case 2: errstr = "DSA key objects are not supported"; break; + case 3: errstr = "KEA key objects are not supported"; break; + default: errstr = "unknown privateKeyObject"; break; + } + goto parse_error; + } + else + { + err = gpg_error (GPG_ERR_INV_OBJ); + goto parse_error; + } + + nn = objlen; + + /* Check that the reference is a Path object. */ + where = __LINE__; + err = parse_ber_header (&pp, &nn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && objlen > nn) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + goto parse_error; + if (class != CLASS_UNIVERSAL || tag != TAG_SEQUENCE) + { + errstr = "unsupported reference type"; + goto parse_error; + } + nn = objlen; + + /* Parse the Path object. */ + where = __LINE__; + err = parse_ber_header (&pp, &nn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && objlen > nn) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + goto parse_error; + + /* Make sure that the next element is a non zero path and of + even length (FID are two bytes each). */ + if (class != CLASS_UNIVERSAL || tag != TAG_OCTET_STRING + || !objlen || (objlen & 1) ) + { + errstr = "invalid path reference"; + goto parse_error; + } + /* Create a new PrKDF list item. */ + prkdf = xtrycalloc (1, (sizeof *prkdf + - sizeof(unsigned short) + + objlen/2 * sizeof(unsigned short))); + if (!prkdf) + { + err = gpg_error_from_errno (errno); + goto leave; + } + prkdf->objidlen = objidlen; + prkdf->objid = xtrymalloc (objidlen); + if (!prkdf->objid) + { + err = gpg_error_from_errno (errno); + xfree (prkdf); + goto leave; + } + memcpy (prkdf->objid, objid, objidlen); + if (authid) + { + prkdf->authidlen = authidlen; + prkdf->authid = xtrymalloc (authidlen); + if (!prkdf->authid) + { + err = gpg_error_from_errno (errno); + xfree (prkdf->objid); + xfree (prkdf); + goto leave; + } + memcpy (prkdf->authid, authid, authidlen); + } + + prkdf->pathlen = objlen/2; + for (i=0; i < prkdf->pathlen; i++, pp += 2, nn -= 2) + prkdf->path[i] = ((pp[0] << 8) | pp[1]); + + prkdf->usageflags = usageflags; + prkdf->key_reference = key_reference; + prkdf->key_reference_valid = key_reference_valid; + + if (nn) + { + /* An index and length follows. */ + prkdf->have_off = 1; + where = __LINE__; + err = parse_ber_header (&pp, &nn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && (objlen > nn + || class != CLASS_UNIVERSAL || tag != TAG_INTEGER)) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + goto parse_error; + + for (ul=0; objlen; objlen--) + { + ul <<= 8; + ul |= (*pp++) & 0xff; + nn--; + } + prkdf->off = ul; + + where = __LINE__; + err = parse_ber_header (&pp, &nn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && (objlen > nn + || class != CLASS_CONTEXT || tag != 0)) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + goto parse_error; + + for (ul=0; objlen; objlen--) + { + ul <<= 8; + ul |= (*pp++) & 0xff; + nn--; + } + prkdf->len = ul; + } + + + log_debug ("PrKDF %04hX: id=", fid); + for (i=0; i < prkdf->objidlen; i++) + log_printf ("%02X", prkdf->objid[i]); + log_printf (" path="); + for (i=0; i < prkdf->pathlen; i++) + log_printf ("%04hX", prkdf->path[i]); + if (prkdf->have_off) + log_printf ("[%lu/%lu]", prkdf->off, prkdf->len); + if (prkdf->authid) + { + log_printf (" authid="); + for (i=0; i < prkdf->authidlen; i++) + log_printf ("%02X", prkdf->authid[i]); + } + if (prkdf->key_reference_valid) + log_printf (" keyref=0x%02lX", prkdf->key_reference); + log_printf (" usage="); + s = ""; + if (prkdf->usageflags.encrypt) log_printf ("%sencrypt", s), s = ","; + if (prkdf->usageflags.decrypt) log_printf ("%sdecrypt", s), s = ","; + if (prkdf->usageflags.sign ) log_printf ("%ssign", s), s = ","; + if (prkdf->usageflags.sign_recover) + log_printf ("%ssign_recover", s), s = ","; + if (prkdf->usageflags.wrap ) log_printf ("%swrap", s), s = ","; + if (prkdf->usageflags.unwrap ) log_printf ("%sunwrap", s), s = ","; + if (prkdf->usageflags.verify ) log_printf ("%sverify", s), s = ","; + if (prkdf->usageflags.verify_recover) + log_printf ("%sverify_recover", s), s = ","; + if (prkdf->usageflags.derive ) log_printf ("%sderive", s), s = ","; + if (prkdf->usageflags.non_repudiation) + log_printf ("%snon_repudiation", s), s = ","; + log_printf ("\n"); + + /* Put it into the list. */ + prkdf->next = prkdflist; + prkdflist = prkdf; + prkdf = NULL; + continue; /* Ready. */ + + parse_error: + log_error ("error parsing PrKDF record (%d): %s - skipped\n", + where, errstr? errstr : gpg_strerror (err)); + if (prkdf) + { + xfree (prkdf->objid); + xfree (prkdf->authid); + xfree (prkdf); + } + err = 0; + } /* End looping over all records. */ + + leave: + xfree (buffer); + if (err) + release_prkdflist (prkdflist); + else + *result = prkdflist; + return err; +} + + +/* Read and parse the Certificate Directory Files identified by FID. + On success a newlist of CDF object gets stored at RESULT and the + caller is then responsible of releasing this list. On error a + error code is returned and RESULT won't get changed. */ +static gpg_error_t +read_ef_cdf (app_t app, unsigned short fid, cdf_object_t *result) +{ + gpg_error_t err; + unsigned char *buffer = NULL; + size_t buflen; + const unsigned char *p; + size_t n, objlen, hdrlen; + int class, tag, constructed, ndef; + cdf_object_t cdflist = NULL; + int i; + + if (!fid) + return gpg_error (GPG_ERR_NO_DATA); /* No certificates. */ + + err = select_and_read_binary (app->slot, fid, "CDF", &buffer, &buflen); + if (err) + return err; + + p = buffer; + n = buflen; + + /* Loop over the records. We stop as soon as we detect a new record + starting with 0x00 or 0xff as these values are commonly used to + pad data blocks and are no valid ASN.1 encoding. */ + while (n && *p && *p != 0xff) + { + const unsigned char *pp; + size_t nn; + int where; + const char *errstr = NULL; + cdf_object_t cdf = NULL; + unsigned long ul; + const unsigned char *objid; + size_t objidlen; + + err = parse_ber_header (&p, &n, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && (objlen > n || tag != TAG_SEQUENCE)) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + { + log_error ("error parsing CDF record: %s\n", gpg_strerror (err)); + goto leave; + } + pp = p; + nn = objlen; + p += objlen; + n -= objlen; + + /* Skip the commonObjectAttributes. */ + where = __LINE__; + err = parse_ber_header (&pp, &nn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && (objlen > nn || tag != TAG_SEQUENCE)) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + goto parse_error; + pp += objlen; + nn -= objlen; + + /* Parse the commonCertificateAttributes. */ + where = __LINE__; + err = parse_ber_header (&pp, &nn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && (objlen > nn || tag != TAG_SEQUENCE)) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + goto parse_error; + { + const unsigned char *ppp = pp; + size_t nnn = objlen; + + pp += objlen; + nn -= objlen; + + /* Get the Id. */ + where = __LINE__; + err = parse_ber_header (&ppp, &nnn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && (objlen > nnn + || class != CLASS_UNIVERSAL || tag != TAG_OCTET_STRING)) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + goto parse_error; + objid = ppp; + objidlen = objlen; + } + + /* Parse the certAttribute. */ + where = __LINE__; + err = parse_ber_header (&pp, &nn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && (objlen > nn || class != CLASS_CONTEXT || tag != 1)) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + goto parse_error; + nn = objlen; + + where = __LINE__; + err = parse_ber_header (&pp, &nn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && (objlen > nn + || class != CLASS_UNIVERSAL || tag != TAG_SEQUENCE)) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + goto parse_error; + nn = objlen; + + /* Check that the reference is a Path object. */ + where = __LINE__; + err = parse_ber_header (&pp, &nn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && objlen > nn) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + goto parse_error; + if (class != CLASS_UNIVERSAL || tag != TAG_SEQUENCE) + { + errstr = "unsupported reference type"; + continue; + } + nn = objlen; + + /* Parse the Path object. */ + where = __LINE__; + err = parse_ber_header (&pp, &nn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && objlen > nn) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + goto parse_error; + + /* Make sure that the next element is a non zero path and of + even length (FID are two bytes each). */ + if (class != CLASS_UNIVERSAL || tag != TAG_OCTET_STRING + || !objlen || (objlen & 1) ) + { + errstr = "invalid path reference"; + goto parse_error; + } + /* Create a new CDF list item. */ + cdf = xtrycalloc (1, (sizeof *cdf + - sizeof(unsigned short) + + objlen/2 * sizeof(unsigned short))); + if (!cdf) + { + err = gpg_error_from_errno (errno); + goto leave; + } + cdf->objidlen = objidlen; + cdf->objid = xtrymalloc (objidlen); + if (!cdf->objid) + { + err = gpg_error_from_errno (errno); + xfree (cdf); + goto leave; + } + memcpy (cdf->objid, objid, objidlen); + + cdf->pathlen = objlen/2; + for (i=0; i < cdf->pathlen; i++, pp += 2, nn -= 2) + cdf->path[i] = ((pp[0] << 8) | pp[1]); + + if (nn) + { + /* An index and length follows. */ + cdf->have_off = 1; + where = __LINE__; + err = parse_ber_header (&pp, &nn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && (objlen > nn + || class != CLASS_UNIVERSAL || tag != TAG_INTEGER)) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + goto parse_error; + + for (ul=0; objlen; objlen--) + { + ul <<= 8; + ul |= (*pp++) & 0xff; + nn--; + } + cdf->off = ul; + + where = __LINE__; + err = parse_ber_header (&pp, &nn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && (objlen > nn + || class != CLASS_CONTEXT || tag != 0)) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + goto parse_error; + + for (ul=0; objlen; objlen--) + { + ul <<= 8; + ul |= (*pp++) & 0xff; + nn--; + } + cdf->len = ul; + } + + log_debug ("CDF %04hX: id=", fid); + for (i=0; i < cdf->objidlen; i++) + log_printf ("%02X", cdf->objid[i]); + log_printf (" path="); + for (i=0; i < cdf->pathlen; i++) + log_printf ("%04hX", cdf->path[i]); + if (cdf->have_off) + log_printf ("[%lu/%lu]", cdf->off, cdf->len); + log_printf ("\n"); + + /* Put it into the list. */ + cdf->next = cdflist; + cdflist = cdf; + cdf = NULL; + continue; /* Ready. */ + + parse_error: + log_error ("error parsing CDF record (%d): %s - skipped\n", + where, errstr? errstr : gpg_strerror (err)); + xfree (cdf); + err = 0; + } /* End looping over all records. */ + + leave: + xfree (buffer); + if (err) + release_cdflist (cdflist); + else + *result = cdflist; + return err; +} + + +/* +SEQUENCE { + SEQUENCE { -- CommonObjectAttributes + UTF8String 'specific PIN for DS' + BIT STRING 0 unused bits + '00000011'B + } + SEQUENCE { -- CommonAuthenticationObjectAttributes + OCTET STRING + 07 -- iD + } + + [1] { -- typeAttributes + SEQUENCE { -- PinAttributes + BIT STRING 0 unused bits + '0000100000110010'B -- local,initialized,needs-padding + -- exchangeRefData + ENUMERATED 1 -- ascii-numeric + INTEGER 6 -- minLength + INTEGER 6 -- storedLength + INTEGER 8 -- maxLength + [0] + 02 -- pinReference + GeneralizedTime 19/04/2002 12:12 GMT -- lastPinChange + SEQUENCE { + OCTET STRING + 3F 00 40 16 -- path to DF of PIN + } + } + } + } + +*/ +/* Read and parse an Authentication Object Directory File identified + by FID. On success a newlist of AODF objects gets stored at RESULT + and the caller is responsible of releasing this list. On error a + error code is returned and RESULT won't get changed. */ +static gpg_error_t +read_ef_aodf (app_t app, unsigned short fid, aodf_object_t *result) +{ + gpg_error_t err; + unsigned char *buffer = NULL; + size_t buflen; + const unsigned char *p; + size_t n, objlen, hdrlen; + int class, tag, constructed, ndef; + aodf_object_t aodflist = NULL; + int i; + + if (!fid) + return gpg_error (GPG_ERR_NO_DATA); /* No authentication objects. */ + + err = select_and_read_binary (app->slot, fid, "AODF", &buffer, &buflen); + if (err) + return err; + + p = buffer; + n = buflen; + + /* FIXME: This shares a LOT of code with read_ef_prkdf! */ + + /* Loop over the records. We stop as soon as we detect a new record + starting with 0x00 or 0xff as these values are commonly used to + pad data blocks and are no valid ASN.1 encoding. */ + while (n && *p && *p != 0xff) + { + const unsigned char *pp; + size_t nn; + int where; + const char *errstr = NULL; + aodf_object_t aodf = NULL; + unsigned long ul; + const char *s; + + err = parse_ber_header (&p, &n, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && (objlen > n || tag != TAG_SEQUENCE)) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + { + log_error ("error parsing AODF record: %s\n", gpg_strerror (err)); + goto leave; + } + pp = p; + nn = objlen; + p += objlen; + n -= objlen; + + /* Allocate memory for a new AODF list item. */ + aodf = xtrycalloc (1, sizeof *aodf); + if (!aodf) + goto no_core; + + /* Parse the commonObjectAttributes. */ + where = __LINE__; + err = parse_ber_header (&pp, &nn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && (objlen > nn || tag != TAG_SEQUENCE)) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + goto parse_error; + { + const unsigned char *ppp = pp; + size_t nnn = objlen; + + pp += objlen; + nn -= objlen; + + /* Search the optional AuthId. We need to skip the optional + Label (UTF8STRING) and the optional CommonObjectFlags + (BITSTRING). */ + where = __LINE__; + err = parse_ber_header (&ppp, &nnn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && (objlen > nnn || class != CLASS_UNIVERSAL)) + err = gpg_error (GPG_ERR_INV_OBJ); + if (gpg_err_code (err) == GPG_ERR_EOF) + goto no_authid; + if (err) + goto parse_error; + if (tag == TAG_UTF8_STRING) + { + ppp += objlen; /* Skip the Label. */ + nnn -= objlen; + + where = __LINE__; + err = parse_ber_header (&ppp, &nnn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && (objlen > nnn || class != CLASS_UNIVERSAL)) + err = gpg_error (GPG_ERR_INV_OBJ); + if (gpg_err_code (err) == GPG_ERR_EOF) + goto no_authid; + if (err) + goto parse_error; + } + if (tag == TAG_BIT_STRING) + { + ppp += objlen; /* Skip the CommonObjectFlags. */ + nnn -= objlen; + + where = __LINE__; + err = parse_ber_header (&ppp, &nnn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && (objlen > nnn || class != CLASS_UNIVERSAL)) + err = gpg_error (GPG_ERR_INV_OBJ); + if (gpg_err_code (err) == GPG_ERR_EOF) + goto no_authid; + if (err) + goto parse_error; + } + if (tag == TAG_OCTET_STRING && objlen) + { + aodf->authidlen = objlen; + aodf->authid = xtrymalloc (objlen); + if (!aodf->authid) + goto no_core; + memcpy (aodf->authid, ppp, objlen); + } + no_authid: + ; + } + + /* Parse the CommonAuthenticationObjectAttributes. */ + where = __LINE__; + err = parse_ber_header (&pp, &nn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && (objlen > nn || tag != TAG_SEQUENCE)) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + goto parse_error; + { + const unsigned char *ppp = pp; + size_t nnn = objlen; + + pp += objlen; + nn -= objlen; + + /* Get the Id. */ + where = __LINE__; + err = parse_ber_header (&ppp, &nnn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && (objlen > nnn + || class != CLASS_UNIVERSAL || tag != TAG_OCTET_STRING)) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + goto parse_error; + + aodf->objidlen = objlen; + aodf->objid = xtrymalloc (objlen); + if (!aodf->objid) + goto no_core; + memcpy (aodf->objid, ppp, objlen); + } + + /* Parse the typeAttributes. */ + where = __LINE__; + err = parse_ber_header (&pp, &nn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && (objlen > nn || class != CLASS_CONTEXT || tag != 1)) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + goto parse_error; + nn = objlen; + + where = __LINE__; + err = parse_ber_header (&pp, &nn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && objlen > nn) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + goto parse_error; + if (class == CLASS_UNIVERSAL && tag == TAG_SEQUENCE) + ; /* PinAttributes */ + else if (class == CLASS_CONTEXT) + { + switch (tag) + { + case 0: errstr = "biometric auth types are not supported"; break; + case 1: errstr = "authKey auth types are not supported"; break; + case 2: errstr = "external auth type are not supported"; break; + default: errstr = "unknown privateKeyObject"; break; + } + goto parse_error; + } + else + { + err = gpg_error (GPG_ERR_INV_OBJ); + goto parse_error; + } + + nn = objlen; + + /* PinFlags */ + where = __LINE__; + err = parse_ber_header (&pp, &nn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && (objlen > nn || !objlen + || class != CLASS_UNIVERSAL || tag != TAG_BIT_STRING)) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + goto parse_error; + + { + unsigned int bits, mask; + int unused, full; + + unused = *pp++; nn--; objlen--; + if ((!objlen && unused) || unused/8 > objlen) + { + err = gpg_error (GPG_ERR_ENCODING_PROBLEM); + goto parse_error; + } + full = objlen - (unused+7)/8; + unused %= 8; + mask = 0; + for (i=1; unused; i <<= 1, unused--) + mask |= i; + + /* The first octet */ + bits = 0; + if (objlen) + { + bits = *pp++; nn--; objlen--; + if (full) + full--; + else + { + bits &= ~mask; + mask = 0; + } + } + if ((bits & 0x80)) /* ASN.1 bit 0. */ + aodf->pinflags.case_sensitive = 1; + if ((bits & 0x40)) /* ASN.1 bit 1. */ + aodf->pinflags.local = 1; + if ((bits & 0x20)) + aodf->pinflags.change_disabled = 1; + if ((bits & 0x10)) + aodf->pinflags.unblock_disabled = 1; + if ((bits & 0x08)) + aodf->pinflags.initialized = 1; + if ((bits & 0x04)) + aodf->pinflags.needs_padding = 1; + if ((bits & 0x02)) + aodf->pinflags.unblocking_pin = 1; + if ((bits & 0x01)) + aodf->pinflags.so_pin = 1; + /* The second octet. */ + bits = 0; + if (objlen) + { + bits = *pp++; nn--; objlen--; + if (full) + full--; + else + { + bits &= ~mask; + mask = 0; + } + } + if ((bits & 0x80)) + aodf->pinflags.disable_allowed = 1; + if ((bits & 0x40)) + aodf->pinflags.integrity_protected = 1; + if ((bits & 0x20)) + aodf->pinflags.confidentiality_protected = 1; + if ((bits & 0x10)) + aodf->pinflags.exchange_ref_data = 1; + /* Skip remaining bits. */ + pp += objlen; + nn -= objlen; + } + + + /* PinType */ + where = __LINE__; + err = parse_ber_header (&pp, &nn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && (objlen > nn + || class != CLASS_UNIVERSAL || tag != TAG_ENUMERATED)) + err = gpg_error (GPG_ERR_INV_OBJ); + if (!err && (objlen > sizeof (pin_type_t) || objlen > sizeof (ul))) + err = gpg_error (GPG_ERR_UNSUPPORTED_ENCODING); + if (err) + goto parse_error; + + for (ul=0; objlen; objlen--) + { + ul <<= 8; + ul |= (*pp++) & 0xff; + nn--; + } + aodf->pintype = ul; + + + /* minLength */ + where = __LINE__; + err = parse_ber_header (&pp, &nn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && (objlen > nn + || class != CLASS_UNIVERSAL || tag != TAG_INTEGER)) + err = gpg_error (GPG_ERR_INV_OBJ); + if (!err && objlen > sizeof (ul)) + err = gpg_error (GPG_ERR_UNSUPPORTED_ENCODING); + if (err) + goto parse_error; + for (ul=0; objlen; objlen--) + { + ul <<= 8; + ul |= (*pp++) & 0xff; + nn--; + } + aodf->min_length = ul; + + + /* storedLength */ + where = __LINE__; + err = parse_ber_header (&pp, &nn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && (objlen > nn + || class != CLASS_UNIVERSAL || tag != TAG_INTEGER)) + err = gpg_error (GPG_ERR_INV_OBJ); + if (!err && objlen > sizeof (ul)) + err = gpg_error (GPG_ERR_UNSUPPORTED_ENCODING); + if (err) + goto parse_error; + for (ul=0; objlen; objlen--) + { + ul <<= 8; + ul |= (*pp++) & 0xff; + nn--; + } + aodf->stored_length = ul; + + /* optional maxLength */ + where = __LINE__; + err = parse_ber_header (&pp, &nn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (gpg_err_code (err) == GPG_ERR_EOF) + goto ready; + if (!err && objlen > nn) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + goto parse_error; + if (class == CLASS_UNIVERSAL && tag == TAG_INTEGER) + { + if (objlen > sizeof (ul)) + { + err = gpg_error (GPG_ERR_UNSUPPORTED_ENCODING); + goto parse_error; + } + for (ul=0; objlen; objlen--) + { + ul <<= 8; + ul |= (*pp++) & 0xff; + nn--; + } + aodf->max_length = ul; + aodf->max_length_valid = 1; + + where = __LINE__; + err = parse_ber_header (&pp, &nn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (gpg_err_code (err) == GPG_ERR_EOF) + goto ready; + if (!err && objlen > nn) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + goto parse_error; + } + + /* Optional pinReference. */ + if (class == CLASS_CONTEXT && tag == 0) + { + if (objlen > sizeof (ul)) + { + err = gpg_error (GPG_ERR_UNSUPPORTED_ENCODING); + goto parse_error; + } + for (ul=0; objlen; objlen--) + { + ul <<= 8; + ul |= (*pp++) & 0xff; + nn--; + } + aodf->pin_reference = ul; + aodf->pin_reference_valid = 1; + + where = __LINE__; + err = parse_ber_header (&pp, &nn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (gpg_err_code (err) == GPG_ERR_EOF) + goto ready; + if (!err && objlen > nn) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + goto parse_error; + } + + /* Optional padChar. */ + if (class == CLASS_UNIVERSAL && tag == TAG_OCTET_STRING) + { + if (objlen != 1) + { + errstr = "padChar is not of size(1)"; + goto parse_error; + } + aodf->pad_char = *pp++; nn--; + aodf->pad_char_valid = 1; + + where = __LINE__; + err = parse_ber_header (&pp, &nn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (gpg_err_code (err) == GPG_ERR_EOF) + goto ready; + if (!err && objlen > nn) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + goto parse_error; + } + + /* Skip optional lastPinChange. */ + if (class == CLASS_UNIVERSAL && tag == TAG_GENERALIZED_TIME) + { + pp += objlen; + nn -= objlen; + + where = __LINE__; + err = parse_ber_header (&pp, &nn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (gpg_err_code (err) == GPG_ERR_EOF) + goto ready; + if (!err && objlen > nn) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + goto parse_error; + } + + /* Optional Path object. */ + if (class == CLASS_UNIVERSAL || tag == TAG_SEQUENCE) + { + const unsigned char *ppp = pp; + size_t nnn = objlen; + + pp += objlen; + nn -= objlen; + + where = __LINE__; + err = parse_ber_header (&ppp, &nnn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && objlen > nnn) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + goto parse_error; + + /* Make sure that the next element is a non zero FID and of + even length (FID are two bytes each). */ + if (class != CLASS_UNIVERSAL || tag != TAG_OCTET_STRING + || !objlen || (objlen & 1) ) + { + errstr = "invalid path reference"; + goto parse_error; + } + + aodf->pathlen = objlen/2; + aodf->path = xtrymalloc (aodf->pathlen); + if (!aodf->path) + goto no_core; + for (i=0; i < aodf->pathlen; i++, ppp += 2, nnn -= 2) + aodf->path[i] = ((ppp[0] << 8) | ppp[1]); + + if (nnn) + { + /* An index and length follows. */ + aodf->have_off = 1; + where = __LINE__; + err = parse_ber_header (&ppp, &nnn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && (objlen > nnn + || class != CLASS_UNIVERSAL || tag != TAG_INTEGER)) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + goto parse_error; + + for (ul=0; objlen; objlen--) + { + ul <<= 8; + ul |= (*ppp++) & 0xff; + nnn--; + } + aodf->off = ul; + + where = __LINE__; + err = parse_ber_header (&ppp, &nnn, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && (objlen > nnn + || class != CLASS_CONTEXT || tag != 0)) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + goto parse_error; + + for (ul=0; objlen; objlen--) + { + ul <<= 8; + ul |= (*ppp++) & 0xff; + nnn--; + } + aodf->len = ul; + } + } + + /* Igonore further objects which might be there due to future + extensions of pkcs#15. */ + + ready: + log_debug ("AODF %04hX: id=", fid); + for (i=0; i < aodf->objidlen; i++) + log_printf ("%02X", aodf->objid[i]); + if (aodf->authid) + { + log_printf (" authid="); + for (i=0; i < aodf->authidlen; i++) + log_printf ("%02X", aodf->authid[i]); + } + log_printf (" flags="); + s = ""; + if (aodf->pinflags.case_sensitive) + log_printf ("%scase_sensitive", s), s = ","; + if (aodf->pinflags.local) + log_printf ("%slocal", s), s = ","; + if (aodf->pinflags.change_disabled) + log_printf ("%schange_disabled", s), s = ","; + if (aodf->pinflags.unblock_disabled) + log_printf ("%sunblock_disabled", s), s = ","; + if (aodf->pinflags.initialized) + log_printf ("%sinitialized", s), s = ","; + if (aodf->pinflags.needs_padding) + log_printf ("%sneeds_padding", s), s = ","; + if (aodf->pinflags.unblocking_pin) + log_printf ("%sunblocking_pin", s), s = ","; + if (aodf->pinflags.so_pin) + log_printf ("%sso_pin", s), s = ","; + if (aodf->pinflags.disable_allowed) + log_printf ("%sdisable_allowed", s), s = ","; + if (aodf->pinflags.integrity_protected) + log_printf ("%sintegrity_protected", s), s = ","; + if (aodf->pinflags.confidentiality_protected) + log_printf ("%sconfidentiality_protected", s), s = ","; + if (aodf->pinflags.exchange_ref_data) + log_printf ("%sexchange_ref_data", s), s = ","; + { + char numbuf[50]; + switch (aodf->pintype) + { + case PIN_TYPE_BCD: s = "bcd"; break; + case PIN_TYPE_ASCII_NUMERIC: s = "ascii-numeric"; break; + case PIN_TYPE_UTF8: s = "utf8"; break; + case PIN_TYPE_HALF_NIBBLE_BCD: s = "half-nibble-bcd"; break; + case PIN_TYPE_ISO9564_1: s = "iso9564-1"; break; + default: + sprintf (numbuf, "%lu", (unsigned long)aodf->pintype); + s = numbuf; + } + log_printf (" type=%s", s); + } + log_printf (" min=%lu", aodf->min_length); + log_printf (" stored=%lu", aodf->stored_length); + if (aodf->max_length_valid) + log_printf (" max=%lu", aodf->max_length); + if (aodf->pad_char_valid) + log_printf (" pad=0x%02x", aodf->pad_char); + if (aodf->pin_reference_valid) + log_printf (" pinref=0x%02lX", aodf->pin_reference); + if (aodf->pathlen) + { + log_printf (" path="); + for (i=0; i < aodf->pathlen; i++) + log_printf ("%04hX", aodf->path[i]); + if (aodf->have_off) + log_printf ("[%lu/%lu]", aodf->off, aodf->len); + } + log_printf ("\n"); + + /* Put it into the list. */ + aodf->next = aodflist; + aodflist = aodf; + aodf = NULL; + continue; /* Ready. */ + + no_core: + err = gpg_error_from_errno (errno); + release_aodf_object (aodf); + goto leave; + + parse_error: + log_error ("error parsing AODF record (%d): %s - skipped\n", + where, errstr? errstr : gpg_strerror (err)); + err = 0; + release_aodf_object (aodf); + } /* End looping over all records. */ + + leave: + xfree (buffer); + if (err) + release_aodflist (aodflist); + else + *result = aodflist; + return err; +} + + + + + +/* Read and parse the EF(TokenInfo). + +TokenInfo ::= SEQUENCE { + version INTEGER {v1(0)} (v1,...), + serialNumber OCTET STRING, + manufacturerID Label OPTIONAL, + label [0] Label OPTIONAL, + tokenflags TokenFlags, + seInfo SEQUENCE OF SecurityEnvironmentInfo OPTIONAL, + recordInfo [1] RecordInfo OPTIONAL, + supportedAlgorithms [2] SEQUENCE OF AlgorithmInfo OPTIONAL, + ..., + issuerId [3] Label OPTIONAL, + holderId [4] Label OPTIONAL, + lastUpdate [5] LastUpdate OPTIONAL, + preferredLanguage PrintableString OPTIONAL -- In accordance with + -- IETF RFC 1766 +} (CONSTRAINED BY { -- Each AlgorithmInfo.reference value must be unique --}) + +TokenFlags ::= BIT STRING { + readonly (0), + loginRequired (1), + prnGeneration (2), + eidCompliant (3) +} + + + 5032: + +30 31 02 01 00 04 04 05 45 36 9F 0C 0C 44 2D 54 01......E6...D-T +72 75 73 74 20 47 6D 62 48 80 14 4F 66 66 69 63 rust GmbH..Offic +65 20 69 64 65 6E 74 69 74 79 20 63 61 72 64 03 e identity card. +02 00 40 20 63 61 72 64 03 02 00 40 00 00 00 00 ..@ card...@.... +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + + 0 49: SEQUENCE { + 2 1: INTEGER 0 + 5 4: OCTET STRING 05 45 36 9F + 11 12: UTF8String 'D-Trust GmbH' + 25 20: [0] 'Office identity card' + 47 2: BIT STRING + : '00000010'B (bit 1) + : Error: Spurious zero bits in bitstring. + : } + + + + + */ +static gpg_error_t +read_ef_tokeninfo (app_t app) +{ + gpg_error_t err; + unsigned char *buffer = NULL; + size_t buflen; + const unsigned char *p; + size_t n, objlen, hdrlen; + int class, tag, constructed, ndef; + unsigned long ul; + + err = select_and_read_binary (app->slot, 0x5032, "TokenInfo", + &buffer, &buflen); + if (err) + return err; + + p = buffer; + n = buflen; + + err = parse_ber_header (&p, &n, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && (objlen > n || tag != TAG_SEQUENCE)) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + { + log_error ("error parsing TokenInfo: %s\n", gpg_strerror (err)); + goto leave; + } + + n = objlen; + + /* Version. */ + err = parse_ber_header (&p, &n, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && (objlen > n || tag != TAG_INTEGER)) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + goto leave; + + for (ul=0; objlen; objlen--) + { + ul <<= 8; + ul |= (*p++) & 0xff; + n--; + } + if (ul) + { + log_error ("invalid version %lu in TokenInfo\n", ul); + err = gpg_error (GPG_ERR_INV_OBJ); + goto leave; + } + + /* serialNumber. */ + err = parse_ber_header (&p, &n, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (!err && (objlen > n || tag != TAG_OCTET_STRING || !objlen)) + err = gpg_error (GPG_ERR_INV_OBJ); + if (err) + goto leave; + + xfree (app->app_local->serialno); + app->app_local->serialno = xtrymalloc (objlen); + if (!app->app_local->serialno) + { + err = gpg_error_from_errno (errno); + goto leave; + } + memcpy (app->app_local->serialno, p, objlen); + app->app_local->serialnolen = objlen; + log_printhex ("Serialnumber from EF(TokenInfo) is:", p, objlen); + + leave: + xfree (buffer); + return err; +} + + +/* Get all the basic information from the pkcs#15 card, check the + structure and initialize our local context. This is used once at + application initialization. */ +static gpg_error_t +read_p15_info (app_t app) +{ + gpg_error_t err; + + if (!read_ef_tokeninfo (app)) + { + /* If we don't have a serial number yet but the TokenInfo provides + one, use that. */ + if (!app->serialno && app->app_local->serialno) + { + app->serialno = app->app_local->serialno; + app->serialnolen = app->app_local->serialnolen; + app->app_local->serialno = NULL; + app->app_local->serialnolen = 0; + err = app_munge_serialno (app); + if (err) + return err; + } + } + + /* Read the ODF so that we know the location of all directory + files. */ + /* Fixme: We might need to get a non-standard ODF FID from TokenInfo. */ + err = read_ef_odf (app, 0x5031); + if (err) + return err; + + /* Read certificate information. */ + assert (!app->app_local->certificate_info); + assert (!app->app_local->trusted_certificate_info); + assert (!app->app_local->useful_certificate_info); + err = read_ef_cdf (app, app->app_local->odf.certificates, + &app->app_local->certificate_info); + if (!err || gpg_err_code (err) == GPG_ERR_NO_DATA) + err = read_ef_cdf (app, app->app_local->odf.trusted_certificates, + &app->app_local->trusted_certificate_info); + if (!err || gpg_err_code (err) == GPG_ERR_NO_DATA) + err = read_ef_cdf (app, app->app_local->odf.useful_certificates, + &app->app_local->useful_certificate_info); + if (gpg_err_code (err) == GPG_ERR_NO_DATA) + err = 0; + if (err) + return err; + + /* Read information about private keys. */ + assert (!app->app_local->private_key_info); + err = read_ef_prkdf (app, app->app_local->odf.private_keys, + &app->app_local->private_key_info); + if (gpg_err_code (err) == GPG_ERR_NO_DATA) + err = 0; + if (err) + return err; + + /* Read information about authentication objects. */ + assert (!app->app_local->auth_object_info); + err = read_ef_aodf (app, app->app_local->odf.auth_objects, + &app->app_local->auth_object_info); + if (gpg_err_code (err) == GPG_ERR_NO_DATA) + err = 0; + + + return err; +} + + +/* Helper to do_learn_status: Send information about all certificates + listed in CERTINFO back. Use CERTTYPE as type of the + certificate. */ +static gpg_error_t +send_certinfo (app_t app, ctrl_t ctrl, const char *certtype, + cdf_object_t certinfo) +{ + for (; certinfo; certinfo = certinfo->next) + { + char *buf, *p; + int i; + + buf = xtrymalloc (9 + certinfo->objidlen*2 + 1); + if (!buf) + return gpg_error_from_errno (errno); + p = stpcpy (buf, "P15"); + if (app->app_local->home_df) + { + sprintf (p, "-%04hX", (app->app_local->home_df & 0xffff)); + p += 5; + } + p = stpcpy (p, "."); + for (i=0; i < certinfo->objidlen; i++) + { + sprintf (p, "%02X", certinfo->objid[i]); + p += 2; + } + + send_status_info (ctrl, "CERTINFO", + certtype, strlen (certtype), + buf, strlen (buf), + NULL, (size_t)0); + xfree (buf); + } + return 0; +} + + +/* Get the keygrip of the private key object PRKDF. On success the + keygrip gets returned in the caller provided 41 byte buffer + R_GRIPSTR. */ +static gpg_error_t +keygripstr_from_prkdf (app_t app, prkdf_object_t prkdf, char *r_gripstr) +{ + gpg_error_t err; + cdf_object_t cdf; + unsigned char *der; + size_t derlen; + ksba_cert_t cert; + + /* FIXME: We should check whether a public key directory file and a + matching public key for PRKDF is available. This should make + extraction of the key much easier. My current test card doesn't + have one, so we can only use the fallback solution bu looking for + a matching certificate and extract the key from there. */ + + /* Look for a matching certificate. A certificate matches if the Id + matches the obne of the private key info. */ + for (cdf = app->app_local->certificate_info; cdf; cdf = cdf->next) + if (cdf->objidlen == prkdf->objidlen + && !memcmp (cdf->objid, prkdf->objid, prkdf->objidlen)) + break; + if (!cdf) + for (cdf = app->app_local->trusted_certificate_info; cdf; cdf = cdf->next) + if (cdf->objidlen == prkdf->objidlen + && !memcmp (cdf->objid, prkdf->objid, prkdf->objidlen)) + break; + if (!cdf) + for (cdf = app->app_local->useful_certificate_info; cdf; cdf = cdf->next) + if (cdf->objidlen == prkdf->objidlen + && !memcmp (cdf->objid, prkdf->objid, prkdf->objidlen)) + break; + if (!cdf) + return gpg_error (GPG_ERR_NOT_FOUND); + + err = readcert_by_cdf (app, cdf, &der, &derlen); + if (err) + return err; + + err = ksba_cert_new (&cert); + if (!err) + err = ksba_cert_init_from_mem (cert, der, derlen); + xfree (der); + if (!err) + err = app_help_get_keygrip_string (cert, r_gripstr); + ksba_cert_release (cert); + + return err; +} + + + + +/* Helper to do_learn_status: Send information about all known + keypairs back. FIXME: much code duplication from + send_sertinfo(). */ +static gpg_error_t +send_keypairinfo (app_t app, ctrl_t ctrl, prkdf_object_t keyinfo) +{ + gpg_error_t err; + + for (; keyinfo; keyinfo = keyinfo->next) + { + char gripstr[40+1]; + char *buf, *p; + int i, j; + + buf = xtrymalloc (9 + keyinfo->objidlen*2 + 1); + if (!buf) + return gpg_error_from_errno (errno); + p = stpcpy (buf, "P15"); + if (app->app_local->home_df) + { + sprintf (p, "-%04hX", (app->app_local->home_df & 0xffff)); + p += 5; + } + p = stpcpy (p, "."); + for (i=0; i < keyinfo->objidlen; i++) + { + sprintf (p, "%02X", keyinfo->objid[i]); + p += 2; + } + + err = keygripstr_from_prkdf (app, keyinfo, gripstr); + if (err) + { + log_error ("can't get keygrip from "); + for (j=0; j < keyinfo->pathlen; j++) + log_printf ("%04hX", keyinfo->path[j]); + log_printf (": %s\n", gpg_strerror (err)); + } + else + { + assert (strlen (gripstr) == 40); + send_status_info (ctrl, "KEYPAIRINFO", + gripstr, 40, + buf, strlen (buf), + NULL, (size_t)0); + } + xfree (buf); + } + return 0; +} + + + +/* This is the handler for the LEARN command. */ +static gpg_error_t +do_learn_status (app_t app, ctrl_t ctrl) +{ + gpg_error_t err; + + err = send_certinfo (app, ctrl, "100", app->app_local->certificate_info); + if (!err) + err = send_certinfo (app, ctrl, "101", + app->app_local->trusted_certificate_info); + if (!err) + err = send_certinfo (app, ctrl, "102", + app->app_local->useful_certificate_info); + if (!err) + err = send_keypairinfo (app, ctrl, app->app_local->private_key_info); + + return err; +} + + +/* Read a certifciate using the information in CDF and return the + certificate in a newly llocated buffer R_CERT and its length + R_CERTLEN. */ +static gpg_error_t +readcert_by_cdf (app_t app, cdf_object_t cdf, + unsigned char **r_cert, size_t *r_certlen) +{ + gpg_error_t err; + unsigned char *buffer = NULL; + const unsigned char *p, *save_p; + size_t buflen, n; + int class, tag, constructed, ndef; + size_t totobjlen, objlen, hdrlen; + int rootca; + int i; + + *r_cert = NULL; + *r_certlen = 0; + + /* First check whether it has been cached. */ + if (cdf->image) + { + *r_cert = xtrymalloc (cdf->imagelen); + if (!*r_cert) + return gpg_error_from_errno (errno); + memcpy (*r_cert, cdf->image, cdf->imagelen); + *r_certlen = cdf->imagelen; + return 0; + } + + /* Read the entire file. fixme: This could be optimized by first + reading the header to figure out how long the certificate + actually is. */ + err = select_ef_by_path (app, cdf->path, cdf->pathlen); + if (err) + goto leave; + + err = iso7816_read_binary (app->slot, cdf->off, cdf->len, &buffer, &buflen); + if (!err && (!buflen || *buffer == 0xff)) + err = gpg_error (GPG_ERR_NOT_FOUND); + if (err) + { + log_error ("error reading certificate with Id "); + for (i=0; i < cdf->objidlen; i++) + log_printf ("%02X", cdf->objid[i]); + log_printf (": %s\n", gpg_strerror (err)); + goto leave; + } + + /* Check whether this is really a certificate. */ + p = buffer; + n = buflen; + err = parse_ber_header (&p, &n, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (err) + goto leave; + + if (class == CLASS_UNIVERSAL && tag == TAG_SEQUENCE && constructed) + rootca = 0; + else if ( class == CLASS_UNIVERSAL && tag == TAG_SET && constructed ) + rootca = 1; + else + { + err = gpg_error (GPG_ERR_INV_OBJ); + goto leave; + } + totobjlen = objlen + hdrlen; + assert (totobjlen <= buflen); + + err = parse_ber_header (&p, &n, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (err) + goto leave; + + if (!rootca + && class == CLASS_UNIVERSAL && tag == TAG_OBJECT_ID && !constructed) + { + /* The certificate seems to be contained in a userCertificate + container. Skip this and assume the following sequence is + the certificate. */ + if (n < objlen) + { + err = gpg_error (GPG_ERR_INV_OBJ); + goto leave; + } + p += objlen; + n -= objlen; + save_p = p; + err = parse_ber_header (&p, &n, &class, &tag, &constructed, + &ndef, &objlen, &hdrlen); + if (err) + goto leave; + if ( !(class == CLASS_UNIVERSAL && tag == TAG_SEQUENCE && constructed) ) + { + err = gpg_error (GPG_ERR_INV_OBJ); + goto leave; + } + totobjlen = objlen + hdrlen; + assert (save_p + totobjlen <= buffer + buflen); + memmove (buffer, save_p, totobjlen); + } + + *r_cert = buffer; + buffer = NULL; + *r_certlen = totobjlen; + + /* Try to cache it. */ + if (!cdf->image && (cdf->image = xtrymalloc (*r_certlen))) + { + memcpy (cdf->image, *r_cert, *r_certlen); + cdf->imagelen = *r_certlen; + } + + + leave: + xfree (buffer); + return err; +} + + +/* Handler for the READCERT command. + + Read the certificate with id CERTID (as returned by learn_status in + the CERTINFO status lines) and return it in the freshly allocated + buffer to be stored at R_CERT and its length at R_CERTLEN. A error + code will be returned on failure and R_CERT and R_CERTLEN will be + set to NULL/0. */ +static gpg_error_t +do_readcert (app_t app, const char *certid, + unsigned char **r_cert, size_t *r_certlen) +{ + gpg_error_t err; + cdf_object_t cdf; + + *r_cert = NULL; + *r_certlen = 0; + err = cdf_object_from_certid (app, certid, &cdf); + if (!err) + err =readcert_by_cdf (app, cdf, r_cert, r_certlen); + return err; +} + + + +/* 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) +{ + gpg_error_t err; + int i; + + if (!strcmp (name, "$AUTHKEYID")) + { + char *buf, *p; + prkdf_object_t prkdf; + + /* We return the ID of the first private keycapable of + signing. */ + for (prkdf = app->app_local->private_key_info; prkdf; + prkdf = prkdf->next) + if (prkdf->usageflags.sign) + break; + if (prkdf) + { + buf = xtrymalloc (9 + prkdf->objidlen*2 + 1); + if (!buf) + return gpg_error_from_errno (errno); + p = stpcpy (buf, "P15"); + if (app->app_local->home_df) + { + sprintf (p, "-%04hX", (app->app_local->home_df & 0xffff)); + p += 5; + } + p = stpcpy (p, "."); + for (i=0; i < prkdf->objidlen; i++) + { + sprintf (p, "%02X", prkdf->objid[i]); + p += 2; + } + + send_status_info (ctrl, name, buf, strlen (buf), NULL, 0); + xfree (buf); + return 0; + } + } + else if (!strcmp (name, "$DISPSERIALNO")) + { + /* For certain cards we return special IDs. There is no + general rule for it so we need to decide case by case. */ + if (app->app_local->card_type == CARD_TYPE_BELPIC) + { + /* The eID card has a card number printed on the fron matter + which seems to be a good indication. */ + unsigned char *buffer; + const unsigned char *p; + size_t buflen, n; + unsigned short path[] = { 0x3F00, 0xDF01, 0x4031 }; + + err = select_ef_by_path (app, path, DIM(path) ); + if (!err) + err = iso7816_read_binary (app->slot, 0, 0, &buffer, &buflen); + if (err) + { + log_error ("error accessing EF(ID): %s\n", gpg_strerror (err)); + return err; + } + + p = find_tlv (buffer, buflen, 1, &n); + if (p && n == 12) + { + char tmp[12+2+1]; + memcpy (tmp, p, 3); + tmp[3] = '-'; + memcpy (tmp+4, p+3, 7); + tmp[11] = '-'; + memcpy (tmp+12, p+10, 2); + tmp[14] = 0; + send_status_info (ctrl, name, tmp, strlen (tmp), NULL, 0); + xfree (buffer); + return 0; + } + xfree (buffer); + } + + } + return gpg_error (GPG_ERR_INV_NAME); +} + + + + +/* Micardo cards require special treatment. This is a helper for the + crypto functions to manage the security environment. We expect that + the key file has already been selected. FID is the one of the + selected key. */ +static gpg_error_t +micardo_mse (app_t app, unsigned short fid) +{ + gpg_error_t err; + int recno; + unsigned short refdata = 0; + int se_num; + unsigned char msebuf[10]; + + /* Read the KeyD file containing extra information on keys. */ + err = iso7816_select_file (app->slot, 0x0013, 0, NULL, NULL); + if (err) + { + log_error ("error reading EF_keyD: %s\n", gpg_strerror (err)); + return err; + } + + for (recno = 1, se_num = -1; ; recno++) + { + unsigned char *buffer; + size_t buflen; + size_t n, nn; + const unsigned char *p, *pp; + + err = iso7816_read_record (app->slot, recno, 1, 0, &buffer, &buflen); + if (gpg_err_code (err) == GPG_ERR_NOT_FOUND) + break; /* ready */ + if (err) + { + log_error ("error reading EF_keyD record: %s\n", + gpg_strerror (err)); + return err; + } + log_printhex ("keyD record:", buffer, buflen); + p = find_tlv (buffer, buflen, 0x83, &n); + if (p && n == 4 && ((p[2]<<8)|p[3]) == fid) + { + refdata = ((p[0]<<8)|p[1]); + /* Locate the SE DO and the there included sec env number. */ + p = find_tlv (buffer, buflen, 0x7b, &n); + if (p && n) + { + pp = find_tlv (p, n, 0x80, &nn); + if (pp && nn == 1) + { + se_num = *pp; + xfree (buffer); + break; /* found. */ + } + } + } + xfree (buffer); + } + if (se_num == -1) + { + log_error ("CRT for keyfile %04hX not found\n", fid); + return gpg_error (GPG_ERR_NOT_FOUND); + } + + + /* Restore the security environment to SE_NUM if needed */ + if (se_num) + { + err = iso7816_manage_security_env (app->slot, 0xf3, se_num, NULL, 0); + if (err) + { + log_error ("restoring SE to %d failed: %s\n", + se_num, gpg_strerror (err)); + return err; + } + } + + /* Set the DST reference data. */ + msebuf[0] = 0x83; + msebuf[1] = 0x03; + msebuf[2] = 0x80; + msebuf[3] = (refdata >> 8); + msebuf[4] = refdata; + err = iso7816_manage_security_env (app->slot, 0x41, 0xb6, msebuf, 5); + if (err) + { + log_error ("setting SE to reference file %04hX failed: %s\n", + refdata, gpg_strerror (err)); + return err; + } + return 0; +} + + + +/* Handler for the PKSIGN command. + + Create the signature and return the allocated result in OUTDATA. + If a PIN is required, the PINCB will be used to ask for the PIN; + that callback should return the PIN in an allocated buffer and + store that as the 3rd argument. */ +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 }; + + gpg_error_t err; + int i; + unsigned char data[35]; /* Must be large enough for a SHA-1 digest + + the largest OID prefix above. */ + prkdf_object_t prkdf; /* The private key object. */ + aodf_object_t aodf; /* The associated authentication object. */ + int no_data_padding = 0; /* True if the card want the data without padding.*/ + int mse_done = 0; /* Set to true if the MSE has been done. */ + + if (!keyidstr || !*keyidstr) + return gpg_error (GPG_ERR_INV_VALUE); + if (indatalen != 20 && indatalen != 16 && indatalen != 35) + return gpg_error (GPG_ERR_INV_VALUE); + + err = prkdf_object_from_keyidstr (app, keyidstr, &prkdf); + if (err) + return err; + if (!(prkdf->usageflags.sign || prkdf->usageflags.sign_recover + ||prkdf->usageflags.non_repudiation)) + { + log_error ("key %s may not be used for signing\n", keyidstr); + return gpg_error (GPG_ERR_WRONG_KEY_USAGE); + } + + if (!prkdf->authid) + { + log_error ("no authentication object defined for %s\n", keyidstr); + /* fixme: we might want to go ahead and do without PIN + verification. */ + return gpg_error (GPG_ERR_UNSUPPORTED_OPERATION); + } + + /* Find the authentication object to this private key object. */ + for (aodf = app->app_local->auth_object_info; aodf; aodf = aodf->next) + if (aodf->objidlen == prkdf->authidlen + && !memcmp (aodf->objid, prkdf->authid, prkdf->authidlen)) + break; + if (!aodf) + { + log_error ("authentication object for %s missing\n", keyidstr); + return gpg_error (GPG_ERR_INV_CARD); + } + if (aodf->authid) + { + log_error ("PIN verification is protected by an " + "additional authentication token\n"); + return gpg_error (GPG_ERR_BAD_PIN_METHOD); + } + if (aodf->pinflags.integrity_protected + || aodf->pinflags.confidentiality_protected) + { + log_error ("PIN verification requires unsupported protecion method\n"); + return gpg_error (GPG_ERR_BAD_PIN_METHOD); + } + if (!aodf->stored_length && aodf->pinflags.needs_padding) + { + log_error ("PIN verification requires padding but no length known\n"); + return gpg_error (GPG_ERR_INV_CARD); + } + + /* Select the key file. Note that this may change the security + environment thus we do it before PIN verification. */ + err = select_ef_by_path (app, prkdf->path, prkdf->pathlen); + if (err) + { + log_error ("error selecting file for key %s: %s\n", + keyidstr, gpg_strerror (errno)); + return err; + } + + + /* Due to the fact that the non-repudiation signature on a BELPIC + card requires a ver verify immediately before the DSO we set the + MSE before we do the verification. Other cards might allow to do + this also but I don't want to break anything, thus we do it only + for the BELPIC card here. */ + if (app->app_local->card_type == CARD_TYPE_BELPIC) + { + unsigned char mse[5]; + + mse[0] = 4; /* Length of the template. */ + mse[1] = 0x80; /* Algorithm reference tag. */ + mse[2] = 0x02; /* Algorithm: RSASSA-PKCS1-v1.5 using SHA1. */ + mse[3] = 0x84; /* Private key reference tag. */ + mse[4] = prkdf->key_reference_valid? prkdf->key_reference : 0x82; + + err = iso7816_manage_security_env (app->slot, + 0x41, 0xB6, + mse, sizeof mse); + no_data_padding = 1; + mse_done = 1; + } + if (err) + { + log_error ("MSE failed: %s\n", gpg_strerror (err)); + return err; + } + + + /* Now that we have all the information available, prepare and run + the PIN verification.*/ + if (1) + { + char *pinvalue; + size_t pinvaluelen; + const char *errstr; + const char *s; + + if (prkdf->usageflags.non_repudiation + && app->app_local->card_type == CARD_TYPE_BELPIC) + err = pincb (pincb_arg, "PIN (qualified signature!)", &pinvalue); + else + err = pincb (pincb_arg, "PIN", &pinvalue); + if (err) + { + log_info ("PIN callback returned error: %s\n", gpg_strerror (err)); + return err; + } + + /* We might need to cope with UTF8 things here. Not sure how + min_length etc. are exactly defined, for now we take them as + a plain octet count. */ + + if (strlen (pinvalue) < aodf->min_length) + { + log_error ("PIN is too short; minimum length is %lu\n", + aodf->min_length); + err = gpg_error (GPG_ERR_BAD_PIN); + } + else if (aodf->stored_length && strlen (pinvalue) > aodf->stored_length) + { + /* This would otherwise truncate the PIN silently. */ + log_error ("PIN is too large; maximum length is %lu\n", + aodf->stored_length); + err = gpg_error (GPG_ERR_BAD_PIN); + } + else if (aodf->max_length_valid && strlen (pinvalue) > aodf->max_length) + { + log_error ("PIN is too large; maximum length is %lu\n", + aodf->max_length); + err = gpg_error (GPG_ERR_BAD_PIN); + } + + if (err) + { + xfree (pinvalue); + return err; + } + + errstr = NULL; + err = 0; + switch (aodf->pintype) + { + case PIN_TYPE_BCD: + case PIN_TYPE_ASCII_NUMERIC: + for (s=pinvalue; digitp (s); s++) + ; + if (*s) + { + errstr = "Non-numeric digits found in PIN"; + err = gpg_error (GPG_ERR_BAD_PIN); + } + break; + case PIN_TYPE_UTF8: + break; + case PIN_TYPE_HALF_NIBBLE_BCD: + errstr = "PIN type Half-Nibble-BCD is not supported"; + break; + case PIN_TYPE_ISO9564_1: + errstr = "PIN type ISO9564-1 is not supported"; + break; + default: + errstr = "Unknown PIN type"; + break; + } + if (errstr) + { + log_error ("can't verify PIN: %s\n", errstr); + xfree (pinvalue); + return err? err : gpg_error (GPG_ERR_BAD_PIN_METHOD); + } + + + if (aodf->pintype == PIN_TYPE_BCD ) + { + char *paddedpin; + int ndigits; + + for (ndigits=0, s=pinvalue; *s; ndigits++, s++) + ; + paddedpin = xtrymalloc (aodf->stored_length+1); + if (!paddedpin) + { + err = gpg_error_from_errno (errno); + xfree (pinvalue); + return err; + } + + i = 0; + paddedpin[i++] = 0x20 | (ndigits & 0x0f); + for (s=pinvalue; i < aodf->stored_length && *s && s[1]; s = s+2 ) + paddedpin[i++] = (((*s - '0') << 4) | ((s[1] - '0') & 0x0f)); + if (i < aodf->stored_length && *s) + paddedpin[i++] = (((*s - '0') << 4) + |((aodf->pad_char_valid?aodf->pad_char:0)&0x0f)); + + if (aodf->pinflags.needs_padding) + while (i < aodf->stored_length) + paddedpin[i++] = aodf->pad_char_valid? aodf->pad_char : 0; + + xfree (pinvalue); + pinvalue = paddedpin; + pinvaluelen = i; + } + else if (aodf->pinflags.needs_padding) + { + char *paddedpin; + + paddedpin = xtrymalloc (aodf->stored_length+1); + if (!paddedpin) + { + err = gpg_error_from_errno (errno); + xfree (pinvalue); + return err; + } + for (i=0, s=pinvalue; i < aodf->stored_length && *s; i++, s++) + paddedpin[i] = *s; + /* Not sure what padding char to use if none has been set. + For now we use 0x00; maybe a space would be better. */ + for (; i < aodf->stored_length; i++) + paddedpin[i] = aodf->pad_char_valid? aodf->pad_char : 0; + paddedpin[i] = 0; + pinvaluelen = i; + xfree (pinvalue); + pinvalue = paddedpin; + } + else + pinvaluelen = strlen (pinvalue); + + err = iso7816_verify (app->slot, + aodf->pin_reference_valid? aodf->pin_reference : 0, + pinvalue, pinvaluelen); + xfree (pinvalue); + if (err) + { + log_error ("PIN verification failed: %s\n", gpg_strerror (err)); + return err; + } + log_debug ("PIN verification succeeded\n"); + } + + /* Prepare the DER object from INDATA. */ + if (indatalen == 35) + { + /* Alright, the caller was so kind to send us an already + prepared DER object. Check that it is what we want and that + it matches the hash algorithm. */ + if (hashalgo == GCRY_MD_SHA1 && !memcmp (indata, sha1_prefix, 15)) + ; + else if (hashalgo == GCRY_MD_RMD160 + && !memcmp (indata, rmd160_prefix, 15)) + ; + else + return gpg_error (GPG_ERR_UNSUPPORTED_ALGORITHM); + memcpy (data, indata, indatalen); + } + else + { + /* Need to prepend the prefix. */ + 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); + } + + /* Manage security environment needs to be weaked for certain cards. */ + if (mse_done) + err = 0; + else if (app->app_local->card_type == CARD_TYPE_TCOS) + { + /* TCOS creates signatures always using the local key 0. MSE + may not be used. */ + } + else if (app->app_local->card_type == CARD_TYPE_MICARDO) + { + if (!prkdf->pathlen) + err = gpg_error (GPG_ERR_BUG); + else + err = micardo_mse (app, prkdf->path[prkdf->pathlen-1]); + } + else if (prkdf->key_reference_valid) + { + unsigned char mse[3]; + + mse[0] = 0x84; /* Select asym. key. */ + mse[1] = 1; + mse[2] = prkdf->key_reference; + + err = iso7816_manage_security_env (app->slot, + 0x41, 0xB6, + mse, sizeof mse); + } + if (err) + { + log_error ("MSE failed: %s\n", gpg_strerror (err)); + return err; + } + + if (no_data_padding) + err = iso7816_compute_ds (app->slot, data+15, 20, outdata, outdatalen); + else + err = iso7816_compute_ds (app->slot, data, 35, outdata, outdatalen); + return err; +} + + +/* Handler for the PKAUTH command. + + This is basically the same as the PKSIGN command but we firstcheck + that the requested key is suitable for authentication; that is, it + must match the criteria used for the attribute $AUTHKEYID. See + do_sign for calling conventions; there is no HASHALGO, though. */ +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 ) +{ + gpg_error_t err; + prkdf_object_t prkdf; + + if (!keyidstr || !*keyidstr) + return gpg_error (GPG_ERR_INV_VALUE); + + err = prkdf_object_from_keyidstr (app, keyidstr, &prkdf); + if (err) + return err; + if (!prkdf->usageflags.sign) + { + log_error ("key %s may not be used for authentication\n", keyidstr); + return gpg_error (GPG_ERR_WRONG_KEY_USAGE); + } + return do_sign (app, keyidstr, GCRY_MD_SHA1, pincb, pincb_arg, + indata, indatalen, outdata, outdatalen); +} + + + +/* Assume that EF(DIR) has been selected. Read its content and figure + out the home EF of pkcs#15. Return that home DF or 0 if not found + and the value at the address of BELPIC indicates whether it was + found by the belpic aid. */ +static unsigned short +read_home_df (int slot, int *r_belpic) +{ + gpg_error_t err; + unsigned char *buffer; + const unsigned char *p, *pp; + size_t buflen, n, nn; + unsigned short result = 0; + + *r_belpic = 0; + + err = iso7816_read_binary (slot, 0, 0, &buffer, &buflen); + if (err) + { + log_error ("error reading EF{DIR}: %s\n", gpg_strerror (err)); + return 0; + } + + /* FIXME: We need to scan all records. */ + p = find_tlv (buffer, buflen, 0x61, &n); + if (p && n) + { + pp = find_tlv (p, n, 0x4f, &nn); + if (pp && ((nn == sizeof pkcs15_aid && !memcmp (pp, pkcs15_aid, nn)) + || (*r_belpic = (nn == sizeof pkcs15be_aid + && !memcmp (pp, pkcs15be_aid, nn))))) + { + pp = find_tlv (p, n, 0x50, &nn); + if (pp) /* fixme: Filter log value? */ + log_info ("pkcs#15 application label from EF(DIR) is `%.*s'\n", + (int)nn, pp); + pp = find_tlv (p, n, 0x51, &nn); + if (pp && nn == 4 && *pp == 0x3f && !pp[1]) + { + result = ((pp[2] << 8) | pp[3]); + log_info ("pkcs#15 application directory is 0x%04hX\n", result); + } + } + } + xfree (buffer); + return result; +} + + +/* + Select the PKCS#15 application on the card in SLOT. + */ +gpg_error_t +app_select_p15 (app_t app) +{ + int slot = app->slot; + int rc; + unsigned short def_home_df = 0; + card_type_t card_type = CARD_TYPE_UNKNOWN; + int direct = 0; + int is_belpic = 0; + + rc = iso7816_select_application (slot, pkcs15_aid, sizeof pkcs15_aid, 0); + if (rc) + { /* Not found: Try to locate it from 2F00. We use direct path + selection here because it seems that the Belgian eID card + does only allow for that. Many other cards supports this + selection method too. Note, that we don't use + select_application above for the Belgian card - the call + works but it seems that it did not switch to the correct DF. + Using the 2f02 just works. */ + unsigned short path[1] = { 0x2f00 }; + + rc = iso7816_select_path (app->slot, path, 1, NULL, NULL); + if (!rc) + { + direct = 1; + def_home_df = read_home_df (slot, &is_belpic); + if (def_home_df) + { + path[0] = def_home_df; + rc = iso7816_select_path (app->slot, path, 1, NULL, NULL); + } + } + } + if (rc) + { /* Still not found: Try the default DF. */ + def_home_df = 0x5015; + rc = iso7816_select_file (slot, def_home_df, 1, NULL, NULL); + } + if (!rc) + { + /* Determine the type of the card. The general case is to look + it up from the ATR table. For the Belgian eID card we know + it instantly from the AID. */ + if (is_belpic) + { + card_type = CARD_TYPE_BELPIC; + } + else + { + unsigned char *atr; + size_t atrlen; + int i; + + atr = apdu_get_atr (app->slot, &atrlen); + if (!atr) + rc = gpg_error (GPG_ERR_INV_CARD); + else + { + for (i=0; card_atr_list[i].atrlen; i++) + if (card_atr_list[i].atrlen == atrlen + && !memcmp (card_atr_list[i].atr, atr, atrlen)) + { + card_type = card_atr_list[i].type; + break; + } + xfree (atr); + } + } + } + if (!rc) + { + app->apptype = "P15"; + + app->app_local = xtrycalloc (1, sizeof *app->app_local); + if (!app->app_local) + { + rc = gpg_error_from_errno (errno); + goto leave; + } + + /* Set the home DF. Note that we currently can't do that if the + selection via application ID worked. This will store 0 there + instead. FIXME: We either need to figure the home_df via the + DIR file or using the return values from the select file + APDU. */ + app->app_local->home_df = def_home_df; + + /* Store the card type. FIXME: We might want to put this into + the common APP structure. */ + app->app_local->card_type = card_type; + + /* Store whether we may and should use direct path selection. */ + app->app_local->direct_path_selection = direct; + + /* Read basic information and thus check whether this is a real + card. */ + rc = read_p15_info (app); + if (rc) + goto leave; + + /* Special serial number munging. We need to check for a German + prototype card right here because we need to access to + EF(TokenInfo). We mark such a serial number by the using a + prefix of FF0100. */ + if (app->serialnolen == 12 + && !memcmp (app->serialno, "\xD2\x76\0\0\0\0\0\0\0\0\0\0", 12)) + { + /* This is a German card with a silly serial number. Try to get + the serial number from the EF(TokenInfo). . */ + unsigned char *p; + + /* FIXME: actually get it from EF(TokenInfo). */ + + p = xtrymalloc (3 + app->serialnolen); + if (!p) + rc = gpg_error (gpg_err_code_from_errno (errno)); + else + { + memcpy (p, "\xff\x01", 3); + memcpy (p+3, app->serialno, app->serialnolen); + app->serialnolen += 3; + xfree (app->serialno); + app->serialno = p; + } + } + + app->fnc.deinit = do_deinit; + app->fnc.learn_status = do_learn_status; + app->fnc.readcert = do_readcert; + app->fnc.getattr = do_getattr; + app->fnc.setattr = NULL; + app->fnc.genkey = NULL; + app->fnc.sign = do_sign; + app->fnc.auth = do_auth; + app->fnc.decipher = NULL; + app->fnc.change_pin = NULL; + app->fnc.check_pin = NULL; + + leave: + if (rc) + do_deinit (app); + } + + return rc; +} diff --git a/scd/app.c b/scd/app.c new file mode 100644 index 000000000..e3d42054b --- /dev/null +++ b/scd/app.c @@ -0,0 +1,862 @@ +/* app.c - Application selection. + * 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 <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +# include <pth.h> + +#include "scdaemon.h" +#include "app-common.h" +#include "apdu.h" +#include "iso7816.h" +#include "tlv.h" + +/* This table is used to keep track of locks on a per reader base. + The index into the table is the slot number of the reader. The + mutex will be initialized on demand (one of the advantages of a + userland threading system). */ +static struct +{ + int initialized; + pth_mutex_t lock; + app_t app; /* Application context in use or NULL. */ + app_t last_app; /* Last application object used as this slot or NULL. */ +} lock_table[10]; + + + +static void deallocate_app (app_t app); + + + +/* Lock the reader SLOT. This function shall be used right before + calling any of the actual application functions to serialize access + to the reader. We do this always even if the reader is not + actually used. This allows an actual connection to assume that it + never shares a reader (while performing one command). Returns 0 on + success; only then the unlock_reader function must be called after + returning from the handler. */ +static gpg_error_t +lock_reader (int slot) +{ + gpg_error_t err; + + if (slot < 0 || slot >= DIM (lock_table)) + return gpg_error (slot<0? GPG_ERR_INV_VALUE : GPG_ERR_RESOURCE_LIMIT); + + if (!lock_table[slot].initialized) + { + if (!pth_mutex_init (&lock_table[slot].lock)) + { + err = gpg_error_from_errno (errno); + log_error ("error initializing mutex: %s\n", strerror (errno)); + return err; + } + lock_table[slot].initialized = 1; + lock_table[slot].app = NULL; + lock_table[slot].last_app = NULL; + } + + if (!pth_mutex_acquire (&lock_table[slot].lock, 0, NULL)) + { + err = gpg_error_from_errno (errno); + log_error ("failed to acquire APP lock for slot %d: %s\n", + slot, strerror (errno)); + return err; + } + + return 0; +} + +/* Release a lock on the reader. See lock_reader(). */ +static void +unlock_reader (int slot) +{ + if (slot < 0 || slot >= DIM (lock_table) + || !lock_table[slot].initialized) + log_bug ("unlock_reader called for invalid slot %d\n", slot); + + if (!pth_mutex_release (&lock_table[slot].lock)) + log_error ("failed to release APP lock for slot %d: %s\n", + slot, strerror (errno)); + +} + + +static void +dump_mutex_state (pth_mutex_t *m) +{ + if (!(m->mx_state & PTH_MUTEX_INITIALIZED)) + log_printf ("not_initialized"); + else if (!(m->mx_state & PTH_MUTEX_LOCKED)) + log_printf ("not_locked"); + else + log_printf ("locked tid=0x%lx count=%lu", (long)m->mx_owner, m->mx_count); +} + + +/* This function may be called to print information pertaining to the + current state of this module to the log. */ +void +app_dump_state (void) +{ + int slot; + + for (slot=0; slot < DIM (lock_table); slot++) + if (lock_table[slot].initialized) + { + log_info ("app_dump_state: slot=%d lock=", slot); + dump_mutex_state (&lock_table[slot].lock); + if (lock_table[slot].app) + { + log_printf (" app=%p", lock_table[slot].app); + if (lock_table[slot].app->apptype) + log_printf (" type=`%s'", lock_table[slot].app->apptype); + } + if (lock_table[slot].last_app) + { + log_printf (" lastapp=%p", lock_table[slot].last_app); + if (lock_table[slot].last_app->apptype) + log_printf (" type=`%s'", lock_table[slot].last_app->apptype); + } + log_printf ("\n"); + } +} + +/* Check wether the application NAME is allowed. This does not mean + we have support for it though. */ +static int +is_app_allowed (const char *name) +{ + strlist_t l; + + for (l=opt.disabled_applications; l; l = l->next) + if (!strcmp (l->d, name)) + return 0; /* no */ + return 1; /* yes */ +} + + +/* This may be called to tell this module about a removed card. */ +void +application_notify_card_removed (int slot) +{ + app_t app; + + if (slot < 0 || slot >= DIM (lock_table)) + return; + + /* FIXME: We are ignoring any error value here. */ + lock_reader (slot); + + /* Deallocate a saved application for that slot, so that we won't + try to reuse it. If there is no saved application, set a flag so + that we won't save the current state. */ + app = lock_table[slot].last_app; + + if (app) + { + lock_table[slot].last_app = NULL; + deallocate_app (app); + } + unlock_reader (slot); +} + + +/* This fucntion is used by the serialno command to check for an + application conflict which may appear if the serialno command is + used to request a specific application and the connection has + already done a select_application. */ +gpg_error_t +check_application_conflict (ctrl_t ctrl, const char *name) +{ + int slot = ctrl->reader_slot; + app_t app; + + if (slot < 0 || slot >= DIM (lock_table)) + return gpg_error (GPG_ERR_INV_VALUE); + + app = lock_table[slot].initialized ? lock_table[slot].app : NULL; + if (app && app->apptype && name) + if ( ascii_strcasecmp (app->apptype, name)) + return gpg_error (GPG_ERR_CONFLICT); + return 0; +} + + +/* If called with NAME as NULL, select the best fitting application + and return a context; otherwise select the application with NAME + and return a context. SLOT identifies the reader device. Returns + an error code and stores NULL at R_APP if no application was found + or no card is present. */ +gpg_error_t +select_application (ctrl_t ctrl, int slot, const char *name, app_t *r_app) +{ + gpg_error_t err; + app_t app = NULL; + unsigned char *result = NULL; + size_t resultlen; + + *r_app = NULL; + + err = lock_reader (slot); + if (err) + return err; + + /* First check whether we already have an application to share. */ + app = lock_table[slot].initialized ? lock_table[slot].app : NULL; + if (app && name) + if (!app->apptype || ascii_strcasecmp (app->apptype, name)) + { + unlock_reader (slot); + if (app->apptype) + log_info ("application `%s' in use by reader %d - can't switch\n", + app->apptype, slot); + return gpg_error (GPG_ERR_CONFLICT); + } + + /* If we don't have an app, check whether we have a saved + application for that slot. This is useful so that a card does + not get reset even if only one session is using the card - so the + PIN cache and other cached data are preserved. */ + if (!app && lock_table[slot].initialized && lock_table[slot].last_app) + { + app = lock_table[slot].last_app; + if (!name || (app->apptype && !ascii_strcasecmp (app->apptype, name)) ) + { + /* Yes, we can reuse this application - either the caller + requested an unspecific one or the requested one matches + the saved one. */ + lock_table[slot].app = app; + lock_table[slot].last_app = NULL; + } + else + { + /* No, this saved application can't be used - deallocate it. */ + lock_table[slot].last_app = NULL; + deallocate_app (app); + app = NULL; + } + } + + /* If we can reuse an application, bump the reference count and + return it. */ + if (app) + { + if (app->slot != slot) + log_bug ("slot mismatch %d/%d\n", app->slot, slot); + app->slot = slot; + + app->ref_count++; + *r_app = app; + unlock_reader (slot); + return 0; /* Okay: We share that one. */ + } + + /* Need to allocate a new one. */ + app = xtrycalloc (1, sizeof *app); + if (!app) + { + err = gpg_error_from_errno (errno); + log_info ("error allocating context: %s\n", gpg_strerror (err)); + unlock_reader (slot); + return err; + } + app->slot = slot; + + + /* Fixme: We should now first check whether a card is at all + present. */ + + /* Try to read the GDO file first to get a default serial number. */ + err = iso7816_select_file (slot, 0x3F00, 1, NULL, NULL); + if (!err) + err = iso7816_select_file (slot, 0x2F02, 0, NULL, NULL); + if (!err) + err = iso7816_read_binary (slot, 0, 0, &result, &resultlen); + if (!err) + { + size_t n; + const unsigned char *p; + + p = find_tlv_unchecked (result, resultlen, 0x5A, &n); + if (p) + resultlen -= (p-result); + if (p && n > resultlen && n == 0x0d && resultlen+1 == n) + { + /* The object it does not fit into the buffer. This is an + invalid encoding (or the buffer is too short. However, I + have some test cards with such an invalid encoding and + therefore I use this ugly workaround to return something + I can further experiment with. */ + log_info ("enabling BMI testcard workaround\n"); + n--; + } + + if (p && n <= resultlen) + { + /* The GDO file is pretty short, thus we simply reuse it for + storing the serial number. */ + memmove (result, p, n); + app->serialno = result; + app->serialnolen = n; + err = app_munge_serialno (app); + if (err) + goto leave; + } + else + xfree (result); + result = NULL; + } + + /* For certain error codes, there is no need to try more. */ + if (gpg_err_code (err) == GPG_ERR_CARD_NOT_PRESENT) + goto leave; + + + /* Figure out the application to use. */ + err = gpg_error (GPG_ERR_NOT_FOUND); + + if (err && is_app_allowed ("openpgp") + && (!name || !strcmp (name, "openpgp"))) + err = app_select_openpgp (app); + if (err && is_app_allowed ("nks") && (!name || !strcmp (name, "nks"))) + err = app_select_nks (app); + if (err && is_app_allowed ("p15") && (!name || !strcmp (name, "p15"))) + err = app_select_p15 (app); + if (err && is_app_allowed ("dinsig") && (!name || !strcmp (name, "dinsig"))) + err = app_select_dinsig (app); + if (err && name) + err = gpg_error (GPG_ERR_NOT_SUPPORTED); + + leave: + if (err) + { + if (name) + log_info ("can't select application `%s': %s\n", + name, gpg_strerror (err)); + else + log_info ("no supported card application found: %s\n", + gpg_strerror (err)); + xfree (app); + unlock_reader (slot); + return err; + } + + app->initialized = 1; + app->ref_count = 1; + lock_table[slot].app = app; + *r_app = app; + unlock_reader (slot); + return 0; +} + + +/* Deallocate the application. */ +static void +deallocate_app (app_t app) +{ + if (app->fnc.deinit) + { + app->fnc.deinit (app); + app->fnc.deinit = NULL; + } + + xfree (app->serialno); + xfree (app); +} + +/* Free the resources associated with the application APP. APP is + allowed to be NULL in which case this is a no-op. Note that we are + using reference counting to track the users of the application and + actually deferring the deallocation to allow for a later reuse by + a new connection. */ +void +release_application (app_t app) +{ + int slot; + + if (!app) + return; + + if (app->ref_count < 1) + log_bug ("trying to release an already released context\n"); + if (--app->ref_count) + return; + + /* Move the reference to the application in the lock table. */ + slot = app->slot; + /* FIXME: We are ignoring any error value. */ + lock_reader (slot); + if (lock_table[slot].app != app) + { + unlock_reader (slot); + log_bug ("app mismatch %p/%p\n", app, lock_table[slot].app); + deallocate_app (app); + return; + } + + if (lock_table[slot].last_app) + deallocate_app (lock_table[slot].last_app); + lock_table[slot].last_app = lock_table[slot].app; + lock_table[slot].app = NULL; + unlock_reader (slot); +} + + + +/* The serial number may need some cosmetics. Do it here. This + function shall only be called once after a new serial number has + been put into APP->serialno. + + Prefixes we use: + + FF 00 00 = For serial numbers starting with an FF + FF 01 00 = Some german p15 cards return an empty serial number so the + serial number from the EF(TokenInfo) is used instead. + + All other serial number not starting with FF are used as they are. +*/ +gpg_error_t +app_munge_serialno (app_t app) +{ + if (app->serialnolen && app->serialno[0] == 0xff) + { + /* The serial number starts with our special prefix. This + requires that we put our default prefix "FF0000" in front. */ + unsigned char *p = xtrymalloc (app->serialnolen + 3); + if (!p) + return gpg_error (gpg_err_code_from_errno (errno)); + memcpy (p, "\xff\0", 3); + memcpy (p+3, app->serialno, app->serialnolen); + app->serialnolen += 3; + xfree (app->serialno); + app->serialno = p; + } + return 0; +} + + + +/* 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. If STAMP is not + of interest, NULL may be passed. */ +gpg_error_t +app_get_serial_and_stamp (app_t app, char **serial, time_t *stamp) +{ + char *buf, *p; + int i; + + if (!app || !serial) + return gpg_error (GPG_ERR_INV_VALUE); + + *serial = NULL; + if (stamp) + *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; +} + + +/* Write out the application specifig status lines for the LEARN + command. */ +gpg_error_t +app_write_learn_status (app_t app, CTRL ctrl) +{ + gpg_error_t err; + + if (!app) + return gpg_error (GPG_ERR_INV_VALUE); + if (!app->initialized) + return gpg_error (GPG_ERR_CARD_NOT_INITIALIZED); + if (!app->fnc.learn_status) + return gpg_error (GPG_ERR_UNSUPPORTED_OPERATION); + + if (app->apptype) + send_status_info (ctrl, "APPTYPE", + app->apptype, strlen (app->apptype), NULL, 0); + err = lock_reader (app->slot); + if (err) + return err; + err = app->fnc.learn_status (app, ctrl); + unlock_reader (app->slot); + return err; +} + + +/* Read the certificate with id CERTID (as returned by learn_status in + the CERTINFO status lines) and return it in the freshly allocated + buffer put into CERT and the length of the certificate put into + CERTLEN. */ +gpg_error_t +app_readcert (app_t app, const char *certid, + unsigned char **cert, size_t *certlen) +{ + gpg_error_t err; + + if (!app) + return gpg_error (GPG_ERR_INV_VALUE); + if (!app->initialized) + return gpg_error (GPG_ERR_CARD_NOT_INITIALIZED); + if (!app->fnc.readcert) + return gpg_error (GPG_ERR_UNSUPPORTED_OPERATION); + err = lock_reader (app->slot); + if (err) + return err; + err = app->fnc.readcert (app, certid, cert, certlen); + unlock_reader (app->slot); + return err; +} + + +/* Read the key with ID KEYID. 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 NULL will be stored at PK and PKLEN and an error + code returned. + + This function might not be supported by all applications. */ +gpg_error_t +app_readkey (app_t app, const char *keyid, unsigned char **pk, size_t *pklen) +{ + gpg_error_t err; + + if (pk) + *pk = NULL; + if (pklen) + *pklen = 0; + + if (!app || !keyid || !pk || !pklen) + return gpg_error (GPG_ERR_INV_VALUE); + if (!app->initialized) + return gpg_error (GPG_ERR_CARD_NOT_INITIALIZED); + if (!app->fnc.readkey) + return gpg_error (GPG_ERR_UNSUPPORTED_OPERATION); + err = lock_reader (app->slot); + if (err) + return err; + err= app->fnc.readkey (app, keyid, pk, pklen); + unlock_reader (app->slot); + return err; +} + + +/* Perform a GETATTR operation. */ +gpg_error_t +app_getattr (app_t app, CTRL ctrl, const char *name) +{ + gpg_error_t err; + + if (!app || !name || !*name) + return gpg_error (GPG_ERR_INV_VALUE); + if (!app->initialized) + return gpg_error (GPG_ERR_CARD_NOT_INITIALIZED); + + if (app->apptype && name && !strcmp (name, "APPTYPE")) + { + send_status_info (ctrl, "APPTYPE", + app->apptype, strlen (app->apptype), NULL, 0); + return 0; + } + if (name && !strcmp (name, "SERIALNO")) + { + char *serial; + time_t stamp; + int rc; + + rc = app_get_serial_and_stamp (app, &serial, &stamp); + if (rc) + return rc; + send_status_info (ctrl, "SERIALNO", serial, strlen (serial), NULL, 0); + xfree (serial); + return 0; + } + + if (!app->fnc.getattr) + return gpg_error (GPG_ERR_UNSUPPORTED_OPERATION); + err = lock_reader (app->slot); + if (err) + return err; + err = app->fnc.getattr (app, ctrl, name); + unlock_reader (app->slot); + return err; +} + +/* Perform a SETATTR operation. */ +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 err; + + if (!app || !name || !*name || !value) + return gpg_error (GPG_ERR_INV_VALUE); + if (!app->initialized) + return gpg_error (GPG_ERR_CARD_NOT_INITIALIZED); + if (!app->fnc.setattr) + return gpg_error (GPG_ERR_UNSUPPORTED_OPERATION); + err = lock_reader (app->slot); + if (err) + return err; + err = app->fnc.setattr (app, name, pincb, pincb_arg, value, valuelen); + unlock_reader (app->slot); + return err; +} + +/* Create the signature and return the allocated result in OUTDATA. + If a PIN is required the PINCB will be used to ask for the PIN; it + should return the PIN in an allocated buffer and put it into PIN. */ +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 err; + + if (!app || !indata || !indatalen || !outdata || !outdatalen || !pincb) + return gpg_error (GPG_ERR_INV_VALUE); + if (!app->initialized) + return gpg_error (GPG_ERR_CARD_NOT_INITIALIZED); + if (!app->fnc.sign) + return gpg_error (GPG_ERR_UNSUPPORTED_OPERATION); + err = lock_reader (app->slot); + if (err) + return err; + err = app->fnc.sign (app, keyidstr, hashalgo, + pincb, pincb_arg, + indata, indatalen, + outdata, outdatalen); + unlock_reader (app->slot); + if (opt.verbose) + log_info ("operation sign result: %s\n", gpg_strerror (err)); + return err; +} + +/* Create the signature using the INTERNAL AUTHENTICATE command and + return the allocated result in OUTDATA. If a PIN is required the + PINCB will be used to ask for the PIN; it should return the PIN in + an allocated buffer and put it into PIN. */ +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 err; + + if (!app || !indata || !indatalen || !outdata || !outdatalen || !pincb) + return gpg_error (GPG_ERR_INV_VALUE); + if (!app->initialized) + return gpg_error (GPG_ERR_CARD_NOT_INITIALIZED); + if (!app->fnc.auth) + return gpg_error (GPG_ERR_UNSUPPORTED_OPERATION); + err = lock_reader (app->slot); + if (err) + return err; + err = app->fnc.auth (app, keyidstr, + pincb, pincb_arg, + indata, indatalen, + outdata, outdatalen); + unlock_reader (app->slot); + if (opt.verbose) + log_info ("operation auth result: %s\n", gpg_strerror (err)); + return err; +} + + +/* Decrypt the data in INDATA and return the allocated result in OUTDATA. + If a PIN is required the PINCB will be used to ask for the PIN; it + should return the PIN in an allocated buffer and put it into PIN. */ +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 err; + + if (!app || !indata || !indatalen || !outdata || !outdatalen || !pincb) + return gpg_error (GPG_ERR_INV_VALUE); + if (!app->initialized) + return gpg_error (GPG_ERR_CARD_NOT_INITIALIZED); + if (!app->fnc.decipher) + return gpg_error (GPG_ERR_UNSUPPORTED_OPERATION); + err = lock_reader (app->slot); + if (err) + return err; + err = app->fnc.decipher (app, keyidstr, + pincb, pincb_arg, + indata, indatalen, + outdata, outdatalen); + unlock_reader (app->slot); + if (opt.verbose) + log_info ("operation decipher result: %s\n", gpg_strerror (err)); + return err; +} + + +/* Perform the WRITEKEY operation. */ +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 err; + + if (!app || !keyidstr || !*keyidstr || !pincb) + return gpg_error (GPG_ERR_INV_VALUE); + if (!app->initialized) + return gpg_error (GPG_ERR_CARD_NOT_INITIALIZED); + if (!app->fnc.writekey) + return gpg_error (GPG_ERR_UNSUPPORTED_OPERATION); + err = lock_reader (app->slot); + if (err) + return err; + err = app->fnc.writekey (app, ctrl, keyidstr, flags, + pincb, pincb_arg, keydata, keydatalen); + unlock_reader (app->slot); + if (opt.verbose) + log_info ("operation writekey result: %s\n", gpg_strerror (err)); + return err; + +} + + +/* Perform a SETATTR operation. */ +gpg_error_t +app_genkey (app_t app, CTRL ctrl, const char *keynostr, unsigned int flags, + gpg_error_t (*pincb)(void*, const char *, char **), + void *pincb_arg) +{ + gpg_error_t err; + + if (!app || !keynostr || !*keynostr || !pincb) + return gpg_error (GPG_ERR_INV_VALUE); + if (!app->initialized) + return gpg_error (GPG_ERR_CARD_NOT_INITIALIZED); + if (!app->fnc.genkey) + return gpg_error (GPG_ERR_UNSUPPORTED_OPERATION); + err = lock_reader (app->slot); + if (err) + return err; + err = app->fnc.genkey (app, ctrl, keynostr, flags, pincb, pincb_arg); + unlock_reader (app->slot); + if (opt.verbose) + log_info ("operation genkey result: %s\n", gpg_strerror (err)); + return err; +} + + +/* Perform a GET CHALLENGE operation. This fucntion is special as it + directly accesses the card without any application specific + wrapper. */ +gpg_error_t +app_get_challenge (app_t app, size_t nbytes, unsigned char *buffer) +{ + gpg_error_t err; + + if (!app || !nbytes || !buffer) + return gpg_error (GPG_ERR_INV_VALUE); + if (!app->initialized) + return gpg_error (GPG_ERR_CARD_NOT_INITIALIZED); + err = lock_reader (app->slot); + if (err) + return err; + err = iso7816_get_challenge (app->slot, nbytes, buffer); + unlock_reader (app->slot); + return err; +} + + + +/* Perform a CHANGE REFERENCE DATA or RESET RETRY COUNTER operation. */ +gpg_error_t +app_change_pin (app_t app, CTRL ctrl, const char *chvnostr, int reset_mode, + gpg_error_t (*pincb)(void*, const char *, char **), + void *pincb_arg) +{ + gpg_error_t err; + + if (!app || !chvnostr || !*chvnostr || !pincb) + return gpg_error (GPG_ERR_INV_VALUE); + if (!app->initialized) + return gpg_error (GPG_ERR_CARD_NOT_INITIALIZED); + if (!app->fnc.change_pin) + return gpg_error (GPG_ERR_UNSUPPORTED_OPERATION); + err = lock_reader (app->slot); + if (err) + return err; + err = app->fnc.change_pin (app, ctrl, chvnostr, reset_mode, + pincb, pincb_arg); + unlock_reader (app->slot); + if (opt.verbose) + log_info ("operation change_pin result: %s\n", gpg_strerror (err)); + return err; +} + + +/* Perform a VERIFY operation without doing anything lese. This may + be used to initialze a the PIN cache for long lasting other + operations. Its use is highly application dependent. */ +gpg_error_t +app_check_pin (app_t app, const char *keyidstr, + gpg_error_t (*pincb)(void*, const char *, char **), + void *pincb_arg) +{ + gpg_error_t err; + + if (!app || !keyidstr || !*keyidstr || !pincb) + return gpg_error (GPG_ERR_INV_VALUE); + if (!app->initialized) + return gpg_error (GPG_ERR_CARD_NOT_INITIALIZED); + if (!app->fnc.check_pin) + return gpg_error (GPG_ERR_UNSUPPORTED_OPERATION); + err = lock_reader (app->slot); + if (err) + return err; + err = app->fnc.check_pin (app, keyidstr, pincb, pincb_arg); + unlock_reader (app->slot); + if (opt.verbose) + log_info ("operation check_pin result: %s\n", gpg_strerror (err)); + return err; +} + diff --git a/scd/atr.c b/scd/atr.c new file mode 100644 index 000000000..bd5a22621 --- /dev/null +++ b/scd/atr.c @@ -0,0 +1,288 @@ +/* atr.c - ISO 7816 ATR fucntions + * 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 <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <assert.h> + +#include "scdaemon.h" +#include "apdu.h" +#include "atr.h" +#include "dynload.h" + +static int const fi_table[16] = { 0, 372, 558, 744, 1116,1488, 1860, -1, + -1, 512, 768, 1024, 1536, 2048, -1, -1 }; +static int const di_table[16] = { -1, 1, 2, 4, 8, 16, -1, -1, + 0, -1, -2, -4, -8, -16, -32, -64}; + + +/* Dump the ATR of the card at SLOT in a human readable format to + stream FP. */ +int +atr_dump (int slot, FILE *fp) +{ + unsigned char *atrbuffer, *atr; + size_t atrlen; + int have_ta, have_tb, have_tc, have_td; + int n_historical; + int idx, val; + unsigned char chksum; + + atr = atrbuffer = apdu_get_atr (slot, &atrlen); + if (!atr) + return gpg_error (GPG_ERR_GENERAL); + + fprintf (fp, "Info on ATR of length %u at slot %d\n", + (unsigned int)atrlen, slot); + if (!atrlen) + { + fprintf (fp, "error: empty ATR\n"); + goto bailout; + } + + + if (*atr == 0x3b) + fputs ("direct convention\n", fp); + else if (*atr == 0x3f) + fputs ("inverse convention\n", fp); + else + fprintf (fp,"error: invalid TS character 0x%02x\n", *atr); + if (!--atrlen) + goto bailout; + atr++; + + chksum = *atr; + for (idx=1; idx < atrlen-1; idx++) + chksum ^= atr[idx]; + + have_ta = !!(*atr & 0x10); + have_tb = !!(*atr & 0x20); + have_tc = !!(*atr & 0x40); + have_td = !!(*atr & 0x80); + n_historical = (*atr & 0x0f); + fprintf (fp, "%d historical characters indicated\n", n_historical); + + if (have_ta + have_tb + have_tc + have_td + n_historical > atrlen) + fputs ("error: ATR shorter than indicated by format character\n", fp); + if (!--atrlen) + goto bailout; + atr++; + + if (have_ta) + { + fputs ("TA1: F=", fp); + val = fi_table[(*atr >> 4) & 0x0f]; + if (!val) + fputs ("internal clock", fp); + else if (val == -1) + fputs ("RFU", fp); + else + fprintf (fp, "%d", val); + fputs (" D=", fp); + val = di_table[*atr & 0x0f]; + if (!val) + fputs ("[impossible value]\n", fp); + else if (val == -1) + fputs ("RFU\n", fp); + else if (val < 0 ) + fprintf (fp, "1/%d\n", val); + else + fprintf (fp, "%d\n", val); + + if (!--atrlen) + goto bailout; + atr++; + } + + if (have_tb) + { + fprintf (fp, "TB1: II=%d PI1=%d%s\n", (*atr >> 5) & 3, *atr & 0x1f, + (*atr & 0x80)? " [high bit not cleared]":""); + if (!--atrlen) + goto bailout; + atr++; + } + + if (have_tc) + { + if (*atr == 255) + fputs ("TC1: guard time shortened to 1 etu\n", fp); + else + fprintf (fp, "TC1: (extra guard time) N=%d\n", *atr); + + if (!--atrlen) + goto bailout; + atr++; + } + + if (have_td) + { + have_ta = !!(*atr & 0x10); + have_tb = !!(*atr & 0x20); + have_tc = !!(*atr & 0x40); + have_td = !!(*atr & 0x80); + fprintf (fp, "TD1: protocol T%d supported\n", *atr & 0x0f); + + if (have_ta + have_tb + have_tc + have_td + n_historical > atrlen) + fputs ("error: ATR shorter than indicated by format character\n", fp); + + if (!--atrlen) + goto bailout; + atr++; + } + else + have_ta = have_tb = have_tc = have_td = 0; + + if (have_ta) + { + fprintf (fp, "TA2: (PTS) %stoggle, %splicit, T=%02X\n", + (*atr & 0x80)? "no-":"", + (*atr & 0x10)? "im": "ex", + (*atr & 0x0f)); + if ((*atr & 0x60)) + fprintf (fp, "note: reserved bits are set (TA2=0x%02X)\n", *atr); + if (!--atrlen) + goto bailout; + atr++; + } + + if (have_tb) + { + fprintf (fp, "TB2: PI2=%d\n", *atr); + if (!--atrlen) + goto bailout; + atr++; + } + + if (have_tc) + { + fprintf (fp, "TC2: PWI=%d\n", *atr); + if (!--atrlen) + goto bailout; + atr++; + } + + if (have_td) + { + have_ta = !!(*atr & 0x10); + have_tb = !!(*atr & 0x20); + have_tc = !!(*atr & 0x40); + have_td = !!(*atr & 0x80); + fprintf (fp, "TD2: protocol T%d supported\n", *atr & 0x0f); + + if (have_ta + have_tb + have_tc + have_td + n_historical > atrlen) + fputs ("error: ATR shorter than indicated by format character\n", fp); + + if (!--atrlen) + goto bailout; + atr++; + } + else + have_ta = have_tb = have_tc = have_td = 0; + + for (idx = 3; have_ta || have_tb || have_tc || have_td; idx++) + { + if (have_ta) + { + fprintf (fp, "TA%d: IFSC=%d\n", idx, *atr); + if (!--atrlen) + goto bailout; + atr++; + } + + if (have_tb) + { + fprintf (fp, "TB%d: BWI=%d CWI=%d\n", + idx, (*atr >> 4) & 0x0f, *atr & 0x0f); + if (!--atrlen) + goto bailout; + atr++; + } + + if (have_tc) + { + fprintf (fp, "TC%d: 0x%02X\n", idx, *atr); + if (!--atrlen) + goto bailout; + atr++; + } + + if (have_td) + { + have_ta = !!(*atr & 0x10); + have_tb = !!(*atr & 0x20); + have_tc = !!(*atr & 0x40); + have_td = !!(*atr & 0x80); + fprintf (fp, "TD%d: protocol T%d supported\n", idx, *atr & 0x0f); + + if (have_ta + have_tb + have_tc + have_td + n_historical > atrlen) + fputs ("error: ATR shorter than indicated by format character\n", + fp); + + if (!--atrlen) + goto bailout; + atr++; + } + else + have_ta = have_tb = have_tc = have_td = 0; + } + + if (n_historical + 1 > atrlen) + fputs ("error: ATR shorter than required for historical bytes " + "and checksum\n", fp); + + if (n_historical) + { + fputs ("Historical:", fp); + for (; n_historical && atrlen ; n_historical--, atrlen--, atr++) + fprintf (fp, " %02X", *atr); + putchar ('\n'); + } + + if (!atrlen) + fputs ("error: checksum missing\n", fp); + else if (*atr == chksum) + fprintf (fp, "TCK: %02X (good)\n", *atr); + else + fprintf (fp, "TCK: %02X (bad; calculated %02X)\n", *atr, chksum); + + atrlen--; + if (atrlen) + fprintf (fp, "error: %u bytes garbage at end of ATR\n", + (unsigned int)atrlen ); + + bailout: + xfree (atrbuffer); + + return 0; +} + + + + + + + + + diff --git a/g10/global.h b/scd/atr.h similarity index 72% rename from g10/global.h rename to scd/atr.h index 1b2f872b1..c70089ca5 100644 --- a/g10/global.h +++ b/scd/atr.h @@ -1,5 +1,5 @@ -/* global.h - Local typedefs and constants - * Copyright (C) 2001 Free Software Foundation, Inc. +/* atr.h - ISO 7816 ATR functions + * Copyright (C) 2003 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -19,12 +19,11 @@ * USA. */ -#ifndef GPG_GLOBAL_H -#define GPG_GLOBAL_H +#ifndef ATR_H +#define ATR_H -#define MAX_FINGERPRINT_LEN 20 +int atr_dump (int slot, FILE *fp); -typedef struct kbnode_struct *KBNODE; -typedef struct keydb_search_desc KEYDB_SEARCH_DESC; -#endif /*GPG_GLOBAL_H*/ + +#endif /*ATR_H*/ diff --git a/scd/card-common.h b/scd/card-common.h new file mode 100644 index 000000000..dd7529d5b --- /dev/null +++ b/scd/card-common.h @@ -0,0 +1,74 @@ +/* card-common.h - Common declarations for all card types + * 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. + */ + +#ifndef CARD_COMMON_H +#define CARD_COMMON_H + +/* Declaration of private data structure used by card-p15.c */ +struct p15private_s; + + +struct card_ctx_s { + int reader; /* used reader */ + struct sc_context *ctx; + struct sc_card *scard; + struct sc_pkcs15_card *p15card; /* only if there is a pkcs15 application */ + struct p15private_s *p15priv; /* private data used by card-p15.c */ + + struct { + int initialized; /* the card has been initialied and the function + pointers may be used. However for + unsupported operations the particular + function pointer is set to NULL */ + + int (*enum_keypairs) (CARD card, int idx, + unsigned char *keygrip, char **keyid); + int (*enum_certs) (CARD card, int idx, char **certid, int *certtype); + int (*read_cert) (CARD card, const char *certidstr, + unsigned char **cert, size_t *ncert); + int (*sign) (CARD card, + const char *keyidstr, int hashalgo, + int (pincb)(void*, const char *, char **), + void *pincb_arg, + const void *indata, size_t indatalen, + unsigned char **outdata, size_t *outdatalen ); + int (*decipher) (CARD card, const char *keyidstr, + int (pincb)(void*, const char *, char **), + void *pincb_arg, + const void *indata, size_t indatalen, + unsigned char **outdata, size_t *outdatalen); + } fnc; + +}; + +/*-- card.c --*/ +gpg_error_t map_sc_err (int rc); +int card_help_get_keygrip (ksba_cert_t cert, unsigned char *array); + +/*-- card-15.c --*/ +void p15_release_private_data (CARD card); + +/* constructors */ +void card_p15_bind (CARD card); +void card_dinsig_bind (CARD card); + + +#endif /*CARD_COMMON_H*/ diff --git a/scd/card-dinsig.c b/scd/card-dinsig.c new file mode 100644 index 000000000..d50d758f2 --- /dev/null +++ b/scd/card-dinsig.c @@ -0,0 +1,259 @@ +/* card-dinsig.c - German signature law (DINSIG) functions + * 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. + */ + +/* The German signature law and its bylaw (SigG and SigV) is currently + used with an interface specification described in DIN V 66291-1. + The AID to be used is: 'D27600006601'. + + The file IDs for certificates utilize the generic format: + Cxyz + C being the hex digit 'C' (12). + x being the service indicator: + '0' := SigG conform digital signature. + '1' := entity authentication. + '2' := key encipherment. + '3' := data encipherment. + '4' := key agreement. + other values are reserved for future use. + y being the security environment number using '0' for cards + not supporting a SE number. + z being the certificate type: + '0' := C.CH (base certificate of ard holder) or C.ICC. + '1' .. '7' := C.CH (business or professional certificate + of card holder. + '8' .. 'D' := C.CA (certificate of a CA issue by the Root-CA). + 'E' := C.RCA (self certified certificate of the Root-CA). + 'F' := reserved. + + The file IDs used by default are: + '1F00' EF.SSD (security service descriptor). [o,o] + '2F02' EF.GDO (global data objects) [m,m] + 'A000' EF.PROT (signature log). Cyclic file with 20 records of 53 byte. + Read and update after user authentication. [o,o] + 'B000' EF.PK.RCA.DS (public keys of Root-CA). Size is 512b or size + of keys. [m (unless a 'C00E' is present),m] + 'B001' EF.PK.CA.DS (public keys of CAs). Size is 512b or size + of keys. [o,o] + 'C00n' EF.C.CH.DS (digital signature certificate of card holder) + with n := 0 .. 7. Size is 2k or size of cert. Read and + update allowed after user authentication. [m,m] + 'C00m' EF.C.CA.DS (digital signature certificate of CA) + with m := 8 .. E. Size is 1k or size of cert. Read always + allowed, update after uder authentication. [o,o] + 'C100' EF.C.ICC.AUT (AUT certificate of ICC) [o,m] + 'C108' EF.C.CA.AUT (AUT certificate of CA) [o,m] + 'D000' EF.DM (display message) [-,m] + + The letters in brackets indicate optional or mandatory files: The + first for card terminals under full control and the second for + "business" card terminals. + + FIXME: Needs a lot more explanation. + +*/ + + +#include <config.h> +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <time.h> + +#ifdef HAVE_OPENSC +#include <opensc/pkcs15.h> +#include "scdaemon.h" +#include <ksba.h> + +#include "card-common.h" + +static int dinsig_read_cert (CARD card, const char *certidstr, + unsigned char **cert, size_t *ncert); + + + +/* See card.c for interface description. Frankly we don't do any real + enumeration but just check whether the well know files are + available. */ +static int +dinsig_enum_keypairs (CARD card, int idx, + unsigned char *keygrip, char **keyid) +{ + int rc; + unsigned char *buf; + size_t buflen; + ksba_cert_t cert; + + /* fixme: We should locate the application via the EF(DIR) and not + assume a Netkey card */ + if (!idx) + rc = dinsig_read_cert (card, "DINSIG-DF01.C000", &buf, &buflen); + else if (idx == 1) + rc = dinsig_read_cert (card, "DINSIG-DF01.C200", &buf, &buflen); + else + rc = -1; + if (rc) + return rc; + + rc = ksba_cert_new (&cert); + if (rc) + { + xfree (buf); + return rc; + } + + rc = ksba_cert_init_from_mem (cert, buf, buflen); + xfree (buf); + if (rc) + { + log_error ("failed to parse the certificate at idx %d: %s\n", + idx, gpg_strerror (rc)); + ksba_cert_release (cert); + return rc; + } + if (card_help_get_keygrip (cert, keygrip)) + { + log_error ("failed to calculate the keygrip at index %d\n", idx); + ksba_cert_release (cert); + return gpg_error (GPG_ERR_CARD); + } + ksba_cert_release (cert); + + /* return the iD */ + if (keyid) + { + *keyid = xtrymalloc (17); + if (!*keyid) + return gpg_error (gpg_err_code_from_errno (errno)); + if (!idx) + strcpy (*keyid, "DINSIG-DF01.C000"); + else + strcpy (*keyid, "DINSIG-DF01.C200"); + } + + return 0; +} + + + +/* See card.c for interface description */ +static int +dinsig_read_cert (CARD card, const char *certidstr, + unsigned char **cert, size_t *ncert) +{ + int rc; + struct sc_path path; + struct sc_file *file; + unsigned char *buf; + int buflen; + + if (!strcmp (certidstr, "DINSIG-DF01.C000")) + sc_format_path ("3F00DF01C000", &path); + else if (!strcmp (certidstr, "DINSIG-DF01.C200")) + sc_format_path ("3F00DF01C200", &path); + else + return gpg_error (GPG_ERR_INV_ID); + + rc = sc_select_file (card->scard, &path, &file); + if (rc) + { + log_error ("sc_select_file failed: %s\n", sc_strerror (rc)); + return map_sc_err (rc); + } + if (file->type != SC_FILE_TYPE_WORKING_EF + || file->ef_structure != SC_FILE_EF_TRANSPARENT) + { + log_error ("wrong type or structure of certificate EF\n"); + sc_file_free (file); + return gpg_error (GPG_ERR_CARD); + } + if (file->size < 20) /* check against a somewhat arbitrary length */ + { + log_error ("certificate EF too short\n"); + sc_file_free (file); + return gpg_error (GPG_ERR_CARD); + } + buf = xtrymalloc (file->size); + if (!buf) + { + gpg_error_t tmperr = gpg_error (gpg_err_code_from_errno (errno)); + sc_file_free (file); + return tmperr; + } + + rc = sc_read_binary (card->scard, 0, buf, file->size, 0); + if (rc >= 0 && rc != file->size) + { + log_error ("short read on certificate EF\n"); + sc_file_free (file); + xfree (buf); + return gpg_error (GPG_ERR_CARD); + } + sc_file_free (file); + if (rc < 0) + { + log_error ("error reading certificate EF: %s\n", sc_strerror (rc)); + xfree (buf); + return map_sc_err (rc); + } + buflen = rc; + + /* The object is not a plain certificate but wrapped into id-at + userCertificate - fixme: we should check the specs and decided + whether libksba should support it */ + if (buflen > 9 && buf[0] == 0x30 && buf[4] == 6 && buf[5] == 3 + && buf[6] == 0x55 && buf[7] == 4 && buf[8] == 0x24) + { + /* We have to strip the padding. Although this is a good idea + anyway, we have to do it due to a KSBA problem; KSBA does not + work correct when the buffer is larger than the ASN.1 + structure and the certificates here are padded with FF. So + as a workaround we look at the outer structure to get the + size of the entire thing and adjust the buflen. We can only + do this when there is a 2 byte length field */ + size_t seqlen; + if (buf[1] == 0x82) + { + seqlen = ((buf[2] << 8) | buf[3]) + 4; + if (seqlen < buflen) + buflen = seqlen; + } + memmove (buf, buf+9, buflen-9); + buflen -= 9; + } + + *cert = buf; + *ncert = buflen; + return 0; +} + + + + +/* Bind our operations to the card */ +void +card_dinsig_bind (CARD card) +{ + card->fnc.enum_keypairs = dinsig_enum_keypairs; + card->fnc.read_cert = dinsig_read_cert; + +} +#endif /*HAVE_OPENSC*/ diff --git a/scd/card-p15.c b/scd/card-p15.c new file mode 100644 index 000000000..63d537d5a --- /dev/null +++ b/scd/card-p15.c @@ -0,0 +1,501 @@ +/* card-p15.c - PKCS-15 based card access + * 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. + */ + +#include <config.h> +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <time.h> + +#ifdef HAVE_OPENSC +#include <opensc/pkcs15.h> + +#include "scdaemon.h" +#include <ksba.h> +#include "card-common.h" + + +struct p15private_s { + int n_prkey_rsa_objs; + struct sc_pkcs15_object *prkey_rsa_objs[32]; + int n_cert_objs; + struct sc_pkcs15_object *cert_objs[32]; +}; + + +/* Allocate private data. */ +static int +init_private_data (CARD card) +{ + struct p15private_s *priv; + int rc; + + if (card->p15priv) + return 0; /* already done. */ + + priv = xtrycalloc (1, sizeof *priv); + if (!priv) + return gpg_error (gpg_err_code_from_errno (errno)); + + /* OpenSC (0.7.0) is a bit strange in that the get_objects functions + tries to be a bit too clever and implicitly does an enumeration + which eventually leads to the fact that every call to this + fucntion returns one more macthing object. The old code in + p15_enum_keypairs assume that it would alwyas return the same + numer of objects and used this to figure out what the last object + enumerated is. We now do an enum_objects just once and keep it + in the private data. */ + rc = sc_pkcs15_get_objects (card->p15card, SC_PKCS15_TYPE_PRKEY_RSA, + priv->prkey_rsa_objs, + DIM (priv->prkey_rsa_objs)); + if (rc < 0) + { + log_error ("private keys enumeration failed: %s\n", sc_strerror (rc)); + xfree (priv); + return gpg_error (GPG_ERR_CARD); + } + priv->n_prkey_rsa_objs = rc; + + /* Read all certificate objects. */ + rc = sc_pkcs15_get_objects (card->p15card, SC_PKCS15_TYPE_CERT_X509, + priv->cert_objs, + DIM (priv->cert_objs)); + if (rc < 0) + { + log_error ("private keys enumeration failed: %s\n", sc_strerror (rc)); + xfree (priv); + return gpg_error (GPG_ERR_CARD); + } + priv->n_cert_objs = rc; + + card->p15priv = priv; + return 0; +} + + +/* Release private data used in this module. */ +void +p15_release_private_data (CARD card) +{ + if (!card->p15priv) + return; + xfree (card->p15priv); + card->p15priv = NULL; +} + + + +/* See card.c for interface description */ +static int +p15_enum_keypairs (CARD card, int idx, + unsigned char *keygrip, char **keyid) +{ + int rc; + struct p15private_s *priv; + struct sc_pkcs15_object *tmpobj; + int nobjs; + struct sc_pkcs15_prkey_info *pinfo; + struct sc_pkcs15_cert_info *certinfo; + struct sc_pkcs15_cert *certder; + ksba_cert_t cert; + + rc = init_private_data (card); + if (rc) + return rc; + priv = card->p15priv; + nobjs = priv->n_prkey_rsa_objs; + rc = 0; + if (idx >= nobjs) + return -1; + pinfo = priv->prkey_rsa_objs[idx]->data; + + /* now we need to read the certificate so that we can calculate the + keygrip */ + rc = sc_pkcs15_find_cert_by_id (card->p15card, &pinfo->id, &tmpobj); + if (rc) + { + log_info ("certificate for private key %d not found: %s\n", + idx, sc_strerror (rc)); + /* note, that we return the ID anyway */ + rc = gpg_error (GPG_ERR_MISSING_CERT); + goto return_keyid; + } + certinfo = tmpobj->data; + rc = sc_pkcs15_read_certificate (card->p15card, certinfo, &certder); + if (rc) + { + log_info ("failed to read certificate for private key %d: %s\n", + idx, sc_strerror (rc)); + return gpg_error (GPG_ERR_CARD); + } + + rc = ksba_cert_new (&cert); + if (rc) + { + sc_pkcs15_free_certificate (certder); + return rc; + } + rc = ksba_cert_init_from_mem (cert, certder->data, certder->data_len); + sc_pkcs15_free_certificate (certder); + if (rc) + { + log_error ("failed to parse the certificate for private key %d: %s\n", + idx, gpg_strerror (rc)); + ksba_cert_release (cert); + return rc; + } + if (card_help_get_keygrip (cert, keygrip)) + { + log_error ("failed to calculate the keygrip of private key %d\n", idx); + ksba_cert_release (cert); + return gpg_error (GPG_ERR_CARD); + } + ksba_cert_release (cert); + + rc = 0; + return_keyid: + if (keyid) + { + char *p; + int i; + + *keyid = p = xtrymalloc (9+pinfo->id.len*2+1); + if (!*keyid) + return gpg_error (gpg_err_code_from_errno (errno)); + p = stpcpy (p, "P15-5015."); + for (i=0; i < pinfo->id.len; i++, p += 2) + sprintf (p, "%02X", pinfo->id.value[i]); + *p = 0; + } + + return rc; +} + +/* See card.c for interface description */ +static int +p15_enum_certs (CARD card, int idx, char **certid, int *type) +{ + int rc; + struct p15private_s *priv; + struct sc_pkcs15_object *obj; + struct sc_pkcs15_cert_info *cinfo; + int nobjs; + + rc = init_private_data (card); + if (rc) + return rc; + priv = card->p15priv; + nobjs = priv->n_cert_objs; + rc = 0; + if (idx >= nobjs) + return -1; + obj = priv->cert_objs[idx]; + cinfo = obj->data; + + if (certid) + { + char *p; + int i; + + *certid = p = xtrymalloc (9+cinfo->id.len*2+1); + if (!*certid) + return gpg_error (gpg_err_code_from_errno (errno)); + p = stpcpy (p, "P15-5015."); + for (i=0; i < cinfo->id.len; i++, p += 2) + sprintf (p, "%02X", cinfo->id.value[i]); + *p = 0; + } + if (type) + { + if (!obj->df) + *type = 0; /* unknown */ + else if (obj->df->type == SC_PKCS15_CDF) + *type = 100; + else if (obj->df->type == SC_PKCS15_CDF_TRUSTED) + *type = 101; + else if (obj->df->type == SC_PKCS15_CDF_USEFUL) + *type = 102; + else + *type = 0; /* error -> unknown */ + } + + return rc; +} + + + +static int +idstr_to_id (const char *idstr, struct sc_pkcs15_id *id) +{ + const char *s; + int n; + + /* For now we only support the standard DF */ + if (strncmp (idstr, "P15-5015.", 9) ) + return gpg_error (GPG_ERR_INV_ID); + for (s=idstr+9, n=0; hexdigitp (s); s++, n++) + ; + if (*s || (n&1)) + return gpg_error (GPG_ERR_INV_ID); /*invalid or odd number of digits*/ + n /= 2; + if (!n || n > SC_PKCS15_MAX_ID_SIZE) + return gpg_error (GPG_ERR_INV_ID); /* empty or too large */ + for (s=idstr+9, n=0; *s; s += 2, n++) + id->value[n] = xtoi_2 (s); + id->len = n; + return 0; +} + + +/* See card.c for interface description */ +static int +p15_read_cert (CARD card, const char *certidstr, + unsigned char **cert, size_t *ncert) +{ + struct sc_pkcs15_object *tmpobj; + struct sc_pkcs15_id certid; + struct sc_pkcs15_cert_info *certinfo; + struct sc_pkcs15_cert *certder; + int rc; + + if (!card || !certidstr || !cert || !ncert) + return gpg_error (GPG_ERR_INV_VALUE); + if (!card->p15card) + return gpg_error (GPG_ERR_NO_PKCS15_APP); + + rc = idstr_to_id (certidstr, &certid); + if (rc) + return rc; + + rc = sc_pkcs15_find_cert_by_id (card->p15card, &certid, &tmpobj); + if (rc) + { + log_info ("certificate '%s' not found: %s\n", + certidstr, sc_strerror (rc)); + return -1; + } + certinfo = tmpobj->data; + rc = sc_pkcs15_read_certificate (card->p15card, certinfo, &certder); + if (rc) + { + log_info ("failed to read certificate '%s': %s\n", + certidstr, sc_strerror (rc)); + return gpg_error (GPG_ERR_CARD); + } + + *cert = xtrymalloc (certder->data_len); + if (!*cert) + { + gpg_error_t tmperr = gpg_error (gpg_err_code_from_errno (errno)); + sc_pkcs15_free_certificate (certder); + return tmperr; + } + memcpy (*cert, certder->data, certder->data_len); + *ncert = certder->data_len; + sc_pkcs15_free_certificate (certder); + return 0; +} + + + + + +static int +p15_prepare_key (CARD card, const char *keyidstr, + int (pincb)(void*, const char *, char **), + void *pincb_arg, struct sc_pkcs15_object **r_keyobj) +{ + struct sc_pkcs15_id keyid; + struct sc_pkcs15_pin_info *pin; + struct sc_pkcs15_object *keyobj, *pinobj; + char *pinvalue; + int rc; + + rc = idstr_to_id (keyidstr, &keyid); + if (rc) + return rc; + + rc = sc_pkcs15_find_prkey_by_id (card->p15card, &keyid, &keyobj); + if (rc < 0) + { + log_error ("private key not found: %s\n", sc_strerror(rc)); + return gpg_error (GPG_ERR_NO_SECKEY); + } + + rc = sc_pkcs15_find_pin_by_auth_id (card->p15card, + &keyobj->auth_id, &pinobj); + if (rc) + { + log_error ("failed to find PIN by auth ID: %s\n", sc_strerror (rc)); + return gpg_error (GPG_ERR_BAD_PIN_METHOD); + } + pin = pinobj->data; + + /* Fixme: pack this into a verification loop */ + /* Fixme: we might want to pass pin->min_length and + pin->stored_length */ + rc = pincb (pincb_arg, pinobj->label, &pinvalue); + if (rc) + { + log_info ("PIN callback returned error: %s\n", gpg_strerror (rc)); + return rc; + } + + rc = sc_pkcs15_verify_pin (card->p15card, pin, + pinvalue, strlen (pinvalue)); + xfree (pinvalue); + if (rc) + { + log_info ("PIN verification failed: %s\n", sc_strerror (rc)); + return gpg_error (GPG_ERR_BAD_PIN); + } + + /* fixme: check wheter we need to release KEYOBJ in case of an error */ + *r_keyobj = keyobj; + return 0; +} + + +/* See card.c for interface description */ +static int +p15_sign (CARD card, const char *keyidstr, int hashalgo, + int (pincb)(void*, const char *, char **), + void *pincb_arg, + const void *indata, size_t indatalen, + unsigned char **outdata, size_t *outdatalen ) +{ + unsigned int cryptflags; + struct sc_pkcs15_object *keyobj; + int rc; + unsigned char *outbuf = NULL; + size_t outbuflen; + + if (hashalgo != GCRY_MD_SHA1) + return gpg_error (GPG_ERR_UNSUPPORTED_ALGORITHM); + + rc = p15_prepare_key (card, keyidstr, pincb, pincb_arg, &keyobj); + if (rc) + return rc; + + cryptflags = SC_ALGORITHM_RSA_PAD_PKCS1; + + outbuflen = 1024; + outbuf = xtrymalloc (outbuflen); + if (!outbuf) + return gpg_error (gpg_err_code_from_errno (errno)); + + rc = sc_pkcs15_compute_signature (card->p15card, keyobj, + cryptflags, + indata, indatalen, + outbuf, outbuflen ); + if (rc < 0) + { + log_error ("failed to create signature: %s\n", sc_strerror (rc)); + rc = gpg_error (GPG_ERR_CARD); + } + else + { + *outdatalen = rc; + *outdata = outbuf; + outbuf = NULL; + rc = 0; + } + + xfree (outbuf); + return rc; +} + + +/* See card.c for description */ +static int +p15_decipher (CARD card, const char *keyidstr, + int (pincb)(void*, const char *, char **), + void *pincb_arg, + const void *indata, size_t indatalen, + unsigned char **outdata, size_t *outdatalen ) +{ + struct sc_pkcs15_object *keyobj; + int rc; + unsigned char *outbuf = NULL; + size_t outbuflen; + + rc = p15_prepare_key (card, keyidstr, pincb, pincb_arg, &keyobj); + if (rc) + return rc; + + if (card && card->scard && card->scard->driver + && !strcasecmp (card->scard->driver->short_name, "tcos")) + { + /* very ugly hack to force the use of a local key. We need this + until we have fixed the initialization code for TCOS cards */ + struct sc_pkcs15_prkey_info *prkey = keyobj->data; + if ( !(prkey->key_reference & 0x80)) + { + prkey->key_reference |= 0x80; + log_debug ("using TCOS hack to force the use of local keys\n"); + } + if (*keyidstr && keyidstr[strlen(keyidstr)-1] == '6') + { + prkey->key_reference |= 1; + log_debug ("warning: using even more TCOS hacks\n"); + } + } + + outbuflen = indatalen < 256? 256 : indatalen; + outbuf = xtrymalloc (outbuflen); + if (!outbuf) + return gpg_error (gpg_err_code_from_errno (errno)); + + rc = sc_pkcs15_decipher (card->p15card, keyobj, + 0, + indata, indatalen, + outbuf, outbuflen); + if (rc < 0) + { + log_error ("failed to decipher the data: %s\n", sc_strerror (rc)); + rc = gpg_error (GPG_ERR_CARD); + } + else + { + *outdatalen = rc; + *outdata = outbuf; + outbuf = NULL; + rc = 0; + } + + xfree (outbuf); + return rc; +} + + + +/* Bind our operations to the card */ +void +card_p15_bind (CARD card) +{ + card->fnc.enum_keypairs = p15_enum_keypairs; + card->fnc.enum_certs = p15_enum_certs; + card->fnc.read_cert = p15_read_cert; + card->fnc.sign = p15_sign; + card->fnc.decipher = p15_decipher; +} +#endif /*HAVE_OPENSC*/ diff --git a/scd/card.c b/scd/card.c new file mode 100644 index 000000000..7a41ab7bb --- /dev/null +++ b/scd/card.c @@ -0,0 +1,571 @@ +/* card.c - SCdaemon card functions + * 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. + */ + +#include <config.h> +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <time.h> + +#ifdef HAVE_OPENSC +#include <opensc/pkcs15.h> +#endif + +#include "scdaemon.h" +#include <ksba.h> + +#include "card-common.h" + +/* Map the SC error codes to the GNUPG ones */ +gpg_error_t +map_sc_err (int rc) +{ + gpg_err_code_t e; + + switch (rc) + { + case 0: e = 0; break; +#ifdef HAVE_OPENSC + case SC_ERROR_NOT_SUPPORTED: e = GPG_ERR_NOT_SUPPORTED; break; + case SC_ERROR_PKCS15_APP_NOT_FOUND: e = GPG_ERR_NO_PKCS15_APP; break; + case SC_ERROR_OUT_OF_MEMORY: e = GPG_ERR_ENOMEM; break; + case SC_ERROR_CARD_NOT_PRESENT: e = GPG_ERR_CARD_NOT_PRESENT; break; + case SC_ERROR_CARD_REMOVED: e = GPG_ERR_CARD_REMOVED; break; + case SC_ERROR_INVALID_CARD: e = GPG_ERR_INV_CARD; break; +#endif + default: e = GPG_ERR_CARD; break; + } + /* It does not make much sense to further distingusih the error + source between OpenSC and SCD. Thus we use SCD as source + here. */ + return gpg_err_make (GPG_ERR_SOURCE_SCD, e); +} + +/* Get the keygrip from CERT, return 0 on success */ +int +card_help_get_keygrip (ksba_cert_t cert, unsigned char *array) +{ + gcry_sexp_t s_pkey; + int rc; + ksba_sexp_t p; + size_t n; + + p = ksba_cert_get_public_key (cert); + if (!p) + return -1; /* oops */ + n = gcry_sexp_canon_len (p, 0, NULL, NULL); + if (!n) + return -1; /* libksba did not return a proper S-expression */ + rc = gcry_sexp_sscan ( &s_pkey, NULL, p, n); + xfree (p); + if (rc) + return -1; /* can't parse that S-expression */ + array = gcry_pk_get_keygrip (s_pkey, array); + gcry_sexp_release (s_pkey); + if (!array) + return -1; /* failed to calculate the keygrip */ + return 0; +} + + + + + + + +/* Create a new context for the card and figures out some basic + information of the card. Detects whether a PKCS_15 application is + stored. + + Common errors: GPG_ERR_CARD_NOT_PRESENT */ +int +card_open (CARD *rcard) +{ +#ifdef HAVE_OPENSC + CARD card; + int rc; + + if (opt.disable_opensc) + return gpg_error (GPG_ERR_NOT_SUPPORTED); + + card = xtrycalloc (1, sizeof *card); + if (!card) + return gpg_error (gpg_err_code_from_errno (errno)); + card->reader = 0; + + rc = sc_establish_context (&card->ctx, "scdaemon"); + if (rc) + { + log_error ("failed to establish SC context: %s\n", sc_strerror (rc)); + rc = map_sc_err (rc); + goto leave; + } + if (card->reader >= card->ctx->reader_count) + { + log_error ("no card reader available\n"); + rc = gpg_error (GPG_ERR_CARD); + goto leave; + } + card->ctx->error_file = log_get_stream (); + card->ctx->debug = opt.debug_sc; + card->ctx->debug_file = log_get_stream (); + + if (sc_detect_card_presence (card->ctx->reader[card->reader], 0) != 1) + { + rc = gpg_error (GPG_ERR_CARD_NOT_PRESENT); + goto leave; + } + + rc = sc_connect_card (card->ctx->reader[card->reader], 0, &card->scard); + if (rc) + { + log_error ("failed to connect card in reader %d: %s\n", + card->reader, sc_strerror (rc)); + rc = map_sc_err (rc); + goto leave; + } + if (opt.verbose) + log_info ("connected to card in reader %d using driver `%s'\n", + card->reader, card->scard->driver->name); + + rc = sc_lock (card->scard); + if (rc) + { + log_error ("can't lock card in reader %d: %s\n", + card->reader, sc_strerror (rc)); + rc = map_sc_err (rc); + goto leave; + } + + + leave: + if (rc) + card_close (card); + else + *rcard = card; + + return rc; +#else + return gpg_error (GPG_ERR_NOT_SUPPORTED); +#endif +} + + +/* Close a card and release all resources */ +void +card_close (CARD card) +{ + if (card) + { +#ifdef HAVE_OPENSC + if (card->p15card) + { + sc_pkcs15_unbind (card->p15card); + card->p15card = NULL; + } + if (card->p15priv) + p15_release_private_data (card); + if (card->scard) + { + sc_unlock (card->scard); + sc_disconnect_card (card->scard, 0); + card->scard = NULL; + } + if (card->ctx) + { + sc_release_context (card->ctx); + card->ctx = NULL; + } +#endif + xfree (card); + } +} + +/* Locate a simple 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. */ +#ifdef HAVE_OPENSC +static const char * +find_simple_tlv (const unsigned char *buffer, size_t length, + int tag, size_t *nbytes) +{ + const char *s = buffer; + size_t n = length; + size_t len; + + for (;;) + { + buffer = s; + if (n < 2) + return NULL; /* buffer too short for tag and length. */ + len = s[1]; + s += 2; n -= 2; + if (len == 255) + { + if (n < 2) + return NULL; /* we expected 2 more bytes with the length. */ + len = (s[0] << 8) | s[1]; + s += 2; n -= 2; + } + if (*buffer == tag) + { + *nbytes = len; + return s; + } + if (len > n) + return NULL; /* buffer too short to skip to the next tag. */ + s += len; n -= len; + } +} +#endif /*HAVE_OPENSC*/ + +/* Find the ICC Serial Number within the provided BUFFER of LENGTH + (which should contain the GDO file) and return it as a hex encoded + string and allocated string in SERIAL. Return an error code when + the ICCSN was not found. */ +#ifdef HAVE_OPENSC +static int +find_iccsn (const unsigned char *buffer, size_t length, char **serial) +{ + size_t n; + const unsigned char *s; + char *p; + + s = find_simple_tlv (buffer, length, 0x5A, &n); + if (!s) + return gpg_error (GPG_ERR_CARD); + length -= s - buffer; + if (n > length) + { + /* Oops, it does not fit into the buffer. This is an invalid + encoding (or the buffer is too short. However, I have some + test cards with such an invalid encoding and therefore I use + this ugly workaround to return something I can further + experiment with. */ + if (n == 0x0D && length+1 == n) + { + log_debug ("enabling BMI testcard workaround\n"); + n--; + } + else + return gpg_error (GPG_ERR_CARD); /* Bad encoding; does + not fit into buffer. */ + } + if (!n) + return gpg_error (GPG_ERR_CARD); /* Well, that is too short. */ + + *serial = p = xtrymalloc (2*n+1); + if (!*serial) + return gpg_error (gpg_err_code_from_errno (errno)); + for (; n; n--, p += 2, s++) + sprintf (p, "%02X", *s); + *p = 0; + return 0; +} +#endif /*HAVE_OPENSC*/ + +/* 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. The serial + is mandatory for a PKCS_15 application and an error will be + returned if this value is not availbale. For non-PKCS-15 cards a + serial number is constructed by other means. Caller must free + SERIAL unless the function returns an error. */ +int +card_get_serial_and_stamp (CARD card, char **serial, time_t *stamp) +{ +#ifdef HAVE_OPENSC + int rc; + struct sc_path path; + struct sc_file *file; + unsigned char buf[256]; + int buflen; +#endif + + if (!card || !serial || !stamp) + return gpg_error (GPG_ERR_INV_VALUE); + + *serial = NULL; + *stamp = 0; /* not available */ + +#ifdef HAVE_OPENSC + if (!card->fnc.initialized) + { + card->fnc.initialized = 1; + /* The first use of this card tries to figure out the type of the card + and sets up the function pointers. */ + rc = sc_pkcs15_bind (card->scard, &card->p15card); + if (rc) + { + if (rc != SC_ERROR_PKCS15_APP_NOT_FOUND) + log_error ("binding of existing PKCS-15 failed in reader %d: %s\n", + card->reader, sc_strerror (rc)); + card->p15card = NULL; + rc = 0; + } + if (card->p15card) + card_p15_bind (card); + card->fnc.initialized = 1; + } + + + /* We should lookup the iso 7812-1 and 8583-3 - argh ISO + practice is suppressing innovation - IETF rules! So we + always get the serialnumber from the 2F02 GDO file. */ + /* FIXME: in case we can't parse the 2F02 EF and we have a P15 card, + we should get the serial number from the respective P15 file */ + sc_format_path ("3F002F02", &path); + rc = sc_select_file (card->scard, &path, &file); + if (rc) + { + log_error ("sc_select_file failed: %s\n", sc_strerror (rc)); + return gpg_error (GPG_ERR_CARD); + } + if (file->type != SC_FILE_TYPE_WORKING_EF + || file->ef_structure != SC_FILE_EF_TRANSPARENT) + { + log_error ("wrong type or structure of GDO file\n"); + sc_file_free (file); + return gpg_error (GPG_ERR_CARD); + } + + if (!file->size || file->size >= DIM(buf) ) + { /* FIXME: Use a real parser */ + log_error ("unsupported size of GDO file (%d)\n", file->size); + sc_file_free (file); + return gpg_error (GPG_ERR_CARD); + } + buflen = file->size; + + rc = sc_read_binary (card->scard, 0, buf, buflen, 0); + sc_file_free (file); + if (rc < 0) + { + log_error ("error reading GDO file: %s\n", sc_strerror (rc)); + return gpg_error (GPG_ERR_CARD); + } + if (rc != buflen) + { + log_error ("short read on GDO file\n"); + return gpg_error (GPG_ERR_CARD); + } + + rc = find_iccsn (buf, buflen, serial); + if (gpg_err_code (rc) == GPG_ERR_CARD) + log_error ("invalid structure of GDO file\n"); + if (!rc && card->p15card && !strcmp (*serial, "D27600000000000000000000")) + { /* This is a German card with a silly serial number. Try to get + the serial number from the EF(TokenInfo). We indicate such a + serial number by the using the prefix: "FF0100". */ + const char *efser = card->p15card->serial_number; + char *p; + + if (!efser) + efser = ""; + + xfree (*serial); + *serial = NULL; + p = xtrymalloc (strlen (efser) + 7); + if (!p) + rc = gpg_error (gpg_err_code_from_errno (errno)); + else + { + strcpy (p, "FF0100"); + strcpy (p+6, efser); + *serial = p; + } + } + else if (!rc && **serial == 'F' && (*serial)[1] == 'F') + { /* The serial number starts with our special prefix. This + requires that we put our default prefix "FF0000" in front. */ + char *p = xtrymalloc (strlen (*serial) + 7); + if (!p) + { + xfree (*serial); + *serial = NULL; + rc = gpg_error (gpg_err_code_from_errno (errno)); + } + else + { + strcpy (p, "FF0000"); + strcpy (p+6, *serial); + xfree (*serial); + *serial = p; + } + } + return rc; +#else + return gpg_error (GPG_ERR_NOT_SUPPORTED); +#endif +} + + +/* Enumerate all keypairs on the card and return the Keygrip as well + as the internal identification of the key. KEYGRIP must be a + caller provided buffer with a size of 20 bytes which will receive + the KEYGRIP of the keypair. If KEYID is not NULL, it returns the + ID field of the key in allocated memory; this is a string without + spaces. The function returns -1 when all keys have been + enumerated. Note that the error GPG_ERR_MISSING_CERTIFICATE may be + returned if there is just the private key but no public key (ie.e a + certificate) available. Applications might want to continue + enumerating after this error.*/ +int +card_enum_keypairs (CARD card, int idx, + unsigned char *keygrip, + char **keyid) +{ + int rc; + + if (keyid) + *keyid = NULL; + + if (!card || !keygrip) + return gpg_error (GPG_ERR_INV_VALUE); + if (idx < 0) + return gpg_error (GPG_ERR_INV_INDEX); + if (!card->fnc.initialized) + return gpg_error (GPG_ERR_CARD_NOT_INITIALIZED); + if (!card->fnc.enum_keypairs) + return gpg_error (GPG_ERR_UNSUPPORTED_OPERATION); + rc = card->fnc.enum_keypairs (card, idx, keygrip, keyid); + if (opt.verbose) + log_info ("card operation enum_keypairs result: %s\n", + gpg_strerror (rc)); + return rc; +} + + +/* Enumerate all trusted certificates available on the card, return + their ID in CERT and the type in CERTTYPE. Types of certificates + are: + 0 := Unknown + 100 := Regular X.509 cert + 101 := Trusted X.509 cert + 102 := Useful X.509 cert + 110 := Root CA cert (DINSIG) + */ +int +card_enum_certs (CARD card, int idx, char **certid, int *certtype) +{ + int rc; + + if (certid) + *certid = NULL; + + if (!card) + return gpg_error (GPG_ERR_INV_VALUE); + if (idx < 0) + return gpg_error (GPG_ERR_INV_INDEX); + if (!card->fnc.initialized) + return gpg_error (GPG_ERR_CARD_NOT_INITIALIZED); + if (!card->fnc.enum_certs) + return gpg_error (GPG_ERR_UNSUPPORTED_OPERATION); + rc = card->fnc.enum_certs (card, idx, certid, certtype); + if (opt.verbose) + log_info ("card operation enum_certs result: %s\n", + gpg_strerror (rc)); + return rc; +} + + + +/* Read the certificate identified by CERTIDSTR which is the + hexadecimal encoded ID of the certificate, prefixed with the string + "3F005015.". The certificate is return in DER encoded form in CERT + and NCERT. */ +int +card_read_cert (CARD card, const char *certidstr, + unsigned char **cert, size_t *ncert) +{ + int rc; + + if (!card || !certidstr || !cert || !ncert) + return gpg_error (GPG_ERR_INV_VALUE); + if (!card->fnc.initialized) + return gpg_error (GPG_ERR_CARD_NOT_INITIALIZED); + if (!card->fnc.read_cert) + return gpg_error (GPG_ERR_UNSUPPORTED_OPERATION); + rc = card->fnc.read_cert (card, certidstr, cert, ncert); + if (opt.verbose) + log_info ("card operation read_cert result: %s\n", gpg_strerror (rc)); + return rc; +} + + +/* Create the signature and return the allocated result in OUTDATA. + If a PIN is required the PINCB will be used to ask for the PIN; it + should return the PIN in an allocated buffer and put it into PIN. */ +int +card_sign (CARD card, const char *keyidstr, int hashalgo, + int (pincb)(void*, const char *, char **), + void *pincb_arg, + const void *indata, size_t indatalen, + unsigned char **outdata, size_t *outdatalen ) +{ + int rc; + + if (!card || !indata || !indatalen || !outdata || !outdatalen || !pincb) + return gpg_error (GPG_ERR_INV_VALUE); + if (!card->fnc.initialized) + return gpg_error (GPG_ERR_CARD_NOT_INITIALIZED); + if (!card->fnc.sign) + return gpg_error (GPG_ERR_UNSUPPORTED_OPERATION); + rc = card->fnc.sign (card, keyidstr, hashalgo, + pincb, pincb_arg, + indata, indatalen, + outdata, outdatalen); + if (opt.verbose) + log_info ("card operation sign result: %s\n", gpg_strerror (rc)); + return rc; +} + + +/* Create the signature and return the allocated result in OUTDATA. + If a PIN is required the PINCB will be used to ask for the PIN; it + should return the PIN in an allocated buffer and put it into PIN. */ +int +card_decipher (CARD card, const char *keyidstr, + int (pincb)(void*, const char *, char **), + void *pincb_arg, + const void *indata, size_t indatalen, + unsigned char **outdata, size_t *outdatalen ) +{ + int rc; + + if (!card || !indata || !indatalen || !outdata || !outdatalen || !pincb) + return gpg_error (GPG_ERR_INV_VALUE); + if (!card->fnc.initialized) + return gpg_error (GPG_ERR_CARD_NOT_INITIALIZED); + if (!card->fnc.decipher) + return gpg_error (GPG_ERR_UNSUPPORTED_OPERATION); + rc = card->fnc.decipher (card, keyidstr, + pincb, pincb_arg, + indata, indatalen, + outdata, outdatalen); + if (opt.verbose) + log_info ("card operation decipher result: %s\n", gpg_strerror (rc)); + return rc; +} + diff --git a/g10/ccid-driver.c b/scd/ccid-driver.c similarity index 99% rename from g10/ccid-driver.c rename to scd/ccid-driver.c index 1e87ae578..e990f757a 100644 --- a/g10/ccid-driver.c +++ b/scd/ccid-driver.c @@ -989,7 +989,12 @@ scan_or_find_devices (int readerno, const char *readerid, fd = open (transports[i].name, O_RDWR); if (fd == -1) - continue; + { + log_debug ("failed to open `%s': %s\n", + transports[i].name, strerror (errno)); + continue; + } + log_debug ("opened `%s': fd=%d\n", transports[i].name, fd); rid = malloc (strlen (transports[i].name) + 30 + 10); if (!rid) @@ -1042,6 +1047,7 @@ scan_or_find_devices (int readerno, const char *readerid, } free (rid); close (fd); + log_debug ("closed fd %d\n", fd); } if (scan_mode) @@ -1202,7 +1208,10 @@ ccid_open_reader (ccid_driver_t *handle, const char *readerid) if (idev) usb_close (idev); if (dev_fd != -1) - close (dev_fd); + { + close (dev_fd); + log_debug ("closed fd %d\n", dev_fd); + } free (*handle); *handle = NULL; } @@ -1245,6 +1254,7 @@ do_close_reader (ccid_driver_t handle) if (handle->dev_fd != -1) { close (handle->dev_fd); + log_debug ("closed fd %d\n", handle->dev_fd); handle->dev_fd = -1; } } @@ -1314,7 +1324,10 @@ ccid_shutdown_reader (ccid_driver_t handle) usb_close (handle->idev); handle->idev = NULL; if (handle->dev_fd != -1) - close (handle->dev_fd); + { + close (handle->dev_fd); + log_debug ("closed fd %d\n", handle->dev_fd); + } handle->dev_fd = -1; } diff --git a/g10/ccid-driver.h b/scd/ccid-driver.h similarity index 100% rename from g10/ccid-driver.h rename to scd/ccid-driver.h diff --git a/scd/command.c b/scd/command.c new file mode 100644 index 000000000..4629d9edf --- /dev/null +++ b/scd/command.c @@ -0,0 +1,1787 @@ +/* command.c - SCdaemon command handler + * 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 <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> +#include <unistd.h> +#include <signal.h> +#ifdef USE_GNU_PTH +# include <pth.h> +#endif + +#include <assuan.h> + +#include "scdaemon.h" +#include <ksba.h> +#include "app-common.h" +#include "apdu.h" /* Required for apdu_*_reader (). */ + +/* Maximum length allowed as a PIN; used for INQUIRE NEEDPIN */ +#define MAXLEN_PIN 100 + +/* Maximum allowed size of key data as used in inquiries. */ +#define MAXLEN_KEYDATA 4096 + + +#define set_error(e,t) assuan_set_error (ctx, ASSUAN_ ## e, (t)) + + +/* Macro to flag a removed card. */ +#define TEST_CARD_REMOVAL(c,r) \ + do { \ + int _r = (r); \ + if (gpg_err_code (_r) == GPG_ERR_CARD_NOT_PRESENT \ + || gpg_err_code (_r) == GPG_ERR_CARD_REMOVED) \ + update_card_removed ((c)->reader_slot, 1); \ + } while (0) + +#define IS_LOCKED(c) \ + (locked_session && locked_session != (c)->server_local \ + && (c)->reader_slot != -1 && locked_session->ctrl_backlink \ + && (c)->reader_slot == locked_session->ctrl_backlink->reader_slot) + + +/* This structure is used to keep track of open readers (slots). */ +struct slot_status_s +{ + int valid; /* True if the other objects are valid. */ + int slot; /* Slot number of the reader or -1 if not open. */ + + int reset_failed; /* A reset failed. */ + + int any; /* Flag indicating whether any status check has been + done. This is set once to indicate that the status + tracking for the slot has been initialized. */ + unsigned int status; /* Last status of the slot. */ + unsigned int changed; /* Last change counter of teh slot. */ +}; + + +/* Data used to associate an Assuan context with local server data. + This object describes the local properties of one session. */ +struct server_local_s +{ + /* We keep a list of all active sessions with the anchor at + SESSION_LIST (see below). This field is used for linking. */ + struct server_local_s *next_session; + + /* This object is usually assigned to a CTRL object (which is + globally visible). While enumerating all sessions we sometimes + need to access data of the CTRL object; thus we keep a + backpointer here. */ + ctrl_t ctrl_backlink; + + /* The Assuan context used by this session/server. */ + assuan_context_t assuan_ctx; + + int event_signal; /* Or 0 if not used. */ + + /* True if the card has been removed and a reset is required to + continue operation. */ + int card_removed; +}; + + +/* The table with information on all used slots. */ +static struct slot_status_s slot_table[10]; + + +/* To keep track of all running sessions, we link all active server + contexts and the anchor in this variable. */ +static struct server_local_s *session_list; + +/* If a session has been locked we store a link to its server object + in this variable. */ +static struct server_local_s *locked_session; + +/* While doing a reset we need to make sure that the ticker does not + call scd_update_reader_status_file while we are using it. */ +static pth_mutex_t status_file_update_lock = PTH_MUTEX_INIT; + + +/*-- Local prototypes --*/ +static void update_reader_status_file (void); + + + +/* Update the CARD_REMOVED element of all sessions using the reader + given by SLOT to VALUE */ +static void +update_card_removed (int slot, int value) +{ + struct server_local_s *sl; + + for (sl=session_list; sl; sl = sl->next_session) + if (sl->ctrl_backlink + && sl->ctrl_backlink->reader_slot == slot) + { + sl->card_removed = value; + } + if (value) + application_notify_card_removed (slot); +} + + + +/* Check whether the option NAME appears in LINE */ +static int +has_option (const char *line, const char *name) +{ + const char *s; + int n = strlen (name); + + s = strstr (line, name); + return (s && (s == line || spacep (s-1)) && (!s[n] || spacep (s+n))); +} + + +/* Convert the STRING into a newly allocated buffer while translating + the hex numbers. Stops at the first invalid character. Blanks and + colons are allowed to separate the hex digits. Returns NULL on + error or a newly malloced buffer and its length in LENGTH. */ +static unsigned char * +hex_to_buffer (const char *string, size_t *r_length) +{ + unsigned char *buffer; + const char *s; + size_t n; + + buffer = xtrymalloc (strlen (string)+1); + if (!buffer) + return NULL; + for (s=string, n=0; *s; s++) + { + if (spacep (s) || *s == ':') + continue; + if (hexdigitp (s) && hexdigitp (s+1)) + { + buffer[n++] = xtoi_2 (s); + s++; + } + else + break; + } + *r_length = n; + return buffer; +} + + + +/* Reset the card and free the application context. With SEND_RESET + set to true actually send a RESET to the reader. */ +static void +do_reset (ctrl_t ctrl, int send_reset) +{ + int slot = ctrl->reader_slot; + + if (!(slot == -1 || (slot >= 0 && slot < DIM(slot_table)))) + BUG (); + + if (ctrl->app_ctx) + { + release_application (ctrl->app_ctx); + ctrl->app_ctx = NULL; + } + + if (slot != -1 && send_reset && !IS_LOCKED (ctrl) ) + { + if (apdu_reset (slot)) + { + slot_table[slot].reset_failed = 1; + } + } + ctrl->reader_slot = -1; + + /* If we hold a lock, unlock now. */ + if (locked_session && ctrl->server_local == locked_session) + { + locked_session = NULL; + log_info ("implicitly unlocking due to RESET\n"); + } + + /* Reset card removed flag for the current reader. We need to take + the lock here so that the ticker thread won't concurrently try to + update the file. Note that the update function will set the card + removed flag and we will later reset it - not a particualar nice + way of implementing it but it works. */ + if (!pth_mutex_acquire (&status_file_update_lock, 0, NULL)) + { + log_error ("failed to acquire status_fle_update lock\n"); + return; + } + update_reader_status_file (); + update_card_removed (slot, 0); + if (!pth_mutex_release (&status_file_update_lock)) + log_error ("failed to release status_file_update lock\n"); +} + + +static void +reset_notify (assuan_context_t ctx) +{ + ctrl_t ctrl = assuan_get_pointer (ctx); + + do_reset (ctrl, 1); +} + + +static int +option_handler (assuan_context_t ctx, const char *key, const char *value) +{ + ctrl_t ctrl = assuan_get_pointer (ctx); + + if (!strcmp (key, "event-signal")) + { + /* A value of 0 is allowed to reset the event signal. */ + int i = *value? atoi (value) : -1; + if (i < 0) + return ASSUAN_Parameter_Error; + ctrl->server_local->event_signal = i; + } + + return 0; +} + + +/* Return the slot of the current reader or open the reader if no + other sessions are using a reader. Note, that we currently support + only one reader but most of the code (except for this function) + should be able to cope with several readers. */ +static int +get_reader_slot (void) +{ + struct slot_status_s *ss; + + ss = &slot_table[0]; /* One reader for now. */ + + /* Initialize the item if needed. */ + if (!ss->valid) + { + ss->slot = -1; + ss->valid = 1; + } + + /* Try to open the reader. */ + if (ss->slot == -1) + ss->slot = apdu_open_reader (opt.reader_port); + + return ss->slot; +} + +/* If the card has not yet been opened, do it. Note that this + function returns an Assuan error, so don't map the error a second + time */ +static assuan_error_t +open_card (ctrl_t ctrl, const char *apptype) +{ + gpg_error_t err; + int slot; + + /* If we ever got a card not present error code, return that. Only + the SERIALNO command and a reset are able to clear from that + state. */ + if (ctrl->server_local->card_removed) + return map_to_assuan_status (gpg_error (GPG_ERR_CARD_REMOVED)); + + if ( IS_LOCKED (ctrl) ) + return gpg_error (GPG_ERR_LOCKED); + + if (ctrl->app_ctx) + { + /* Already initialized for one specific application. Need to + check that the client didn't requested a specific application + different from the one in use. */ + return check_application_conflict (ctrl, apptype); + } + + if (ctrl->reader_slot != -1) + slot = ctrl->reader_slot; + else + slot = get_reader_slot (); + ctrl->reader_slot = slot; + if (slot == -1) + err = gpg_error (GPG_ERR_CARD); + else + err = select_application (ctrl, slot, apptype, &ctrl->app_ctx); + + TEST_CARD_REMOVAL (ctrl, err); + return map_to_assuan_status (err); +} + + +/* Do the percent and plus/space unescaping in place and return the + length of the valid buffer. */ +static size_t +percent_plus_unescape (unsigned char *string) +{ + unsigned char *p = string; + size_t n = 0; + + while (*string) + { + if (*string == '%' && string[1] && string[2]) + { + string++; + *p++ = xtoi_2 (string); + n++; + string+= 2; + } + else if (*string == '+') + { + *p++ = ' '; + n++; + string++; + } + else + { + *p++ = *string++; + n++; + } + } + + return n; +} + + + +/* SERIALNO [APPTYPE] + + Return the serial number of the card using a status reponse. This + functon should be used to check for the presence of a card. + + If APPTYPE is given, an application of that type is selected and an + error is returned if the application is not supported or available. + The default is to auto-select the application using a hardwired + preference system. Note, that a future extension to this function + may allow to specify a list and order of applications to try. + + This function is special in that it can be used to reset the card. + Most other functions will return an error when a card change has + been detected and the use of this function is therefore required. + + Background: We want to keep the client clear of handling card + changes between operations; i.e. the client can assume that all + operations are done on the same card unless he calls this function. + */ +static int +cmd_serialno (assuan_context_t ctx, char *line) +{ + ctrl_t ctrl = assuan_get_pointer (ctx); + int rc = 0; + char *serial_and_stamp; + char *serial; + time_t stamp; + + /* Clear the remove flag so that the open_card is able to reread it. */ + if (ctrl->server_local->card_removed) + { + if ( IS_LOCKED (ctrl) ) + return gpg_error (GPG_ERR_LOCKED); + do_reset (ctrl, 1); + } + + if ((rc = open_card (ctrl, *line? line:NULL))) + return rc; + + rc = app_get_serial_and_stamp (ctrl->app_ctx, &serial, &stamp); + if (rc) + return map_to_assuan_status (rc); + + rc = asprintf (&serial_and_stamp, "%s %lu", serial, (unsigned long)stamp); + xfree (serial); + if (rc < 0) + return ASSUAN_Out_Of_Core; + rc = 0; + assuan_write_status (ctx, "SERIALNO", serial_and_stamp); + free (serial_and_stamp); + return 0; +} + + + + +/* LEARN [--force] + + Learn all useful information of the currently inserted card. When + used without the force options, the command might do an INQUIRE + like this: + + INQUIRE KNOWNCARDP <hexstring_with_serialNumber> <timestamp> + + The client should just send an "END" if the processing should go on + or a "CANCEL" to force the function to terminate with a Cancel + error message. The response of this command is a list of status + lines formatted as this: + + S APPTYPE <apptype> + + This returns the type of the application, currently the strings: + + P15 = PKCS-15 structure used + DINSIG = DIN SIG + OPENPGP = OpenPGP card + + are implemented. These strings are aliases for the AID + + S KEYPAIRINFO <hexstring_with_keygrip> <hexstring_with_id> + + If there is no certificate yet stored on the card a single "X" is + returned as the keygrip. In addition to the keypair info, information + about all certificates stored on the card is also returned: + + S CERTINFO <certtype> <hexstring_with_id> + + Where CERTTYPE is a number indicating the type of certificate: + 0 := Unknown + 100 := Regular X.509 cert + 101 := Trusted X.509 cert + 102 := Useful X.509 cert + 110 := Root CA cert (DINSIG) + + For certain cards, more information will be returned: + + S KEY-FPR <no> <hexstring> + + For OpenPGP cards this returns the stored fingerprints of the + keys. This can be used check whether a key is available on the + card. NO may be 1, 2 or 3. + + S CA-FPR <no> <hexstring> + + Similar to above, these are the fingerprints of keys assumed to be + ultimately trusted. + + S DISP-NAME <name_of_card_holder> + + The name of the card holder as stored on the card; percent + escaping takes place, spaces are encoded as '+' + + S PUBKEY-URL <url> + + The URL to be used for locating the entire public key. + + Note, that this function may be even be used on a locked card. +*/ +static int +cmd_learn (assuan_context_t ctx, char *line) +{ + ctrl_t ctrl = assuan_get_pointer (ctx); + int rc = 0; + + if ((rc = open_card (ctrl, NULL))) + return rc; + + /* Unless the force option is used we try a shortcut by identifying + the card using a serial number and inquiring the client with + that. The client may choose to cancel the operation if he already + knows about this card */ + { + char *serial_and_stamp; + char *serial; + time_t stamp; + + rc = app_get_serial_and_stamp (ctrl->app_ctx, &serial, &stamp); + if (rc) + return map_to_assuan_status (rc); + rc = asprintf (&serial_and_stamp, "%s %lu", serial, (unsigned long)stamp); + xfree (serial); + if (rc < 0) + return ASSUAN_Out_Of_Core; + rc = 0; + assuan_write_status (ctx, "SERIALNO", serial_and_stamp); + + if (!has_option (line, "--force")) + { + char *command; + + rc = asprintf (&command, "KNOWNCARDP %s", serial_and_stamp); + if (rc < 0) + { + free (serial_and_stamp); + return ASSUAN_Out_Of_Core; + } + rc = 0; + rc = assuan_inquire (ctx, command, NULL, NULL, 0); + free (command); /* (must use standard free here) */ + if (rc) + { + if (rc != ASSUAN_Canceled) + log_error ("inquire KNOWNCARDP failed: %s\n", + assuan_strerror (rc)); + free (serial_and_stamp); + return rc; + } + /* not canceled, so we have to proceeed */ + } + free (serial_and_stamp); + } + + /* Let the application print out its collection of useful status + information. */ + if (!rc) + rc = app_write_learn_status (ctrl->app_ctx, ctrl); + + TEST_CARD_REMOVAL (ctrl, rc); + return map_to_assuan_status (rc); +} + + + +/* READCERT <hexified_certid> + + Note, that this function may even be used on a locked card. + */ +static int +cmd_readcert (assuan_context_t ctx, char *line) +{ + ctrl_t ctrl = assuan_get_pointer (ctx); + int rc; + unsigned char *cert; + size_t ncert; + + if ((rc = open_card (ctrl, NULL))) + return rc; + + line = xstrdup (line); /* Need a copy of the line. */ + rc = app_readcert (ctrl->app_ctx, line, &cert, &ncert); + if (rc) + log_error ("app_readcert failed: %s\n", gpg_strerror (rc)); + xfree (line); + line = NULL; + if (!rc) + { + rc = assuan_send_data (ctx, cert, ncert); + xfree (cert); + if (rc) + return rc; + } + + TEST_CARD_REMOVAL (ctrl, rc); + return map_to_assuan_status (rc); +} + + +/* READKEY <keyid> + + Return the public key for the given cert or key ID as an standard + S-Expression. + + Note, that this function may even be used on a locked card. + */ +static int +cmd_readkey (assuan_context_t ctx, char *line) +{ + ctrl_t ctrl = assuan_get_pointer (ctx); + int rc; + unsigned char *cert = NULL; + size_t ncert, n; + ksba_cert_t kc = NULL; + ksba_sexp_t p; + unsigned char *pk; + size_t pklen; + + if ((rc = open_card (ctrl, NULL))) + return rc; + + line = xstrdup (line); /* Need a copy of the line. */ + /* If the application supports the READKEY function we use that. + Otherwise we use the old way by extracting it from the + certificate. */ + rc = app_readkey (ctrl->app_ctx, line, &pk, &pklen); + if (!rc) + { /* Yeah, got that key - send it back. */ + rc = assuan_send_data (ctx, pk, pklen); + xfree (pk); + rc = map_assuan_err (rc); + xfree (line); + line = NULL; + goto leave; + } + + if (gpg_err_code (rc) != GPG_ERR_UNSUPPORTED_OPERATION) + log_error ("app_readkey failed: %s\n", gpg_strerror (rc)); + else + { + rc = app_readcert (ctrl->app_ctx, line, &cert, &ncert); + if (rc) + log_error ("app_readcert failed: %s\n", gpg_strerror (rc)); + } + xfree (line); + line = NULL; + if (rc) + goto leave; + + rc = ksba_cert_new (&kc); + if (rc) + { + xfree (cert); + goto leave; + } + rc = ksba_cert_init_from_mem (kc, cert, ncert); + if (rc) + { + log_error ("failed to parse the certificate: %s\n", gpg_strerror (rc)); + goto leave; + } + + p = ksba_cert_get_public_key (kc); + if (!p) + { + rc = gpg_error (GPG_ERR_NO_PUBKEY); + goto leave; + } + + n = gcry_sexp_canon_len (p, 0, NULL, NULL); + rc = assuan_send_data (ctx, p, n); + rc = map_assuan_err (rc); + xfree (p); + + + leave: + ksba_cert_release (kc); + xfree (cert); + TEST_CARD_REMOVAL (ctrl, rc); + return map_to_assuan_status (rc); +} + + + + +/* SETDATA <hexstring> + + The client should use this command to tell us the data he want to + sign. */ +static int +cmd_setdata (assuan_context_t ctx, char *line) +{ + ctrl_t ctrl = assuan_get_pointer (ctx); + int n; + char *p; + unsigned char *buf; + + if (locked_session && locked_session != ctrl->server_local) + return gpg_error (GPG_ERR_LOCKED); + + /* Parse the hexstring. */ + for (p=line,n=0; hexdigitp (p); p++, n++) + ; + if (*p) + return set_error (Parameter_Error, "invalid hexstring"); + if (!n) + return set_error (Parameter_Error, "no data given"); + if ((n&1)) + return set_error (Parameter_Error, "odd number of digits"); + n /= 2; + buf = xtrymalloc (n); + if (!buf) + return ASSUAN_Out_Of_Core; + + ctrl->in_data.value = buf; + ctrl->in_data.valuelen = n; + for (p=line, n=0; n < ctrl->in_data.valuelen; p += 2, n++) + buf[n] = xtoi_2 (p); + return 0; +} + + + +static gpg_error_t +pin_cb (void *opaque, const char *info, char **retstr) +{ + assuan_context_t ctx = opaque; + char *command; + int rc; + unsigned char *value; + size_t valuelen; + + *retstr = NULL; + log_debug ("asking for PIN '%s'\n", info); + + rc = asprintf (&command, "NEEDPIN %s", info); + if (rc < 0) + return gpg_error (gpg_err_code_from_errno (errno)); + + /* Fixme: Write an inquire function which returns the result in + secure memory and check all further handling of the PIN. */ + rc = assuan_inquire (ctx, command, &value, &valuelen, MAXLEN_PIN); + free (command); + if (rc) + return map_assuan_err (rc); + + if (!valuelen || value[valuelen-1]) + { + /* We require that the returned value is an UTF-8 string */ + xfree (value); + return gpg_error (GPG_ERR_INV_RESPONSE); + } + *retstr = (char*)value; + return 0; +} + + +/* PKSIGN [--hash=[rmd160|sha1|md5]] <hexified_id> + + The --hash option is optional; the default is SHA1. + + */ +static int +cmd_pksign (assuan_context_t ctx, char *line) +{ + ctrl_t ctrl = assuan_get_pointer (ctx); + int rc; + unsigned char *outdata; + size_t outdatalen; + char *keyidstr; + int hash_algo; + + if (has_option (line, "--hash=rmd160")) + hash_algo = GCRY_MD_RMD160; + else if (has_option (line, "--hash=sha1")) + hash_algo = GCRY_MD_SHA1; + else if (has_option (line, "--hash=md5")) + hash_algo = GCRY_MD_MD5; + else if (!strstr (line, "--")) + hash_algo = GCRY_MD_SHA1; + else + return set_error (Parameter_Error, "invalid hash algorithm"); + /* Skip over options. */ + while ( *line == '-' && line[1] == '-' ) + { + while (*line && !spacep (line)) + line++; + while (spacep (line)) + line++; + } + + if ( IS_LOCKED (ctrl) ) + return gpg_error (GPG_ERR_LOCKED); + + if ((rc = open_card (ctrl, NULL))) + return rc; + + /* We have to use a copy of the key ID because the function may use + the pin_cb which in turn uses the assuan line buffer and thus + overwriting the original line with the keyid */ + keyidstr = xtrystrdup (line); + if (!keyidstr) + return ASSUAN_Out_Of_Core; + + rc = app_sign (ctrl->app_ctx, + keyidstr, hash_algo, + pin_cb, ctx, + ctrl->in_data.value, ctrl->in_data.valuelen, + &outdata, &outdatalen); + + xfree (keyidstr); + if (rc) + { + log_error ("card_sign failed: %s\n", gpg_strerror (rc)); + } + else + { + rc = assuan_send_data (ctx, outdata, outdatalen); + xfree (outdata); + if (rc) + return rc; /* that is already an assuan error code */ + } + + TEST_CARD_REMOVAL (ctrl, rc); + return map_to_assuan_status (rc); +} + +/* PKAUTH <hexified_id> + + */ +static int +cmd_pkauth (assuan_context_t ctx, char *line) +{ + ctrl_t ctrl = assuan_get_pointer (ctx); + int rc; + unsigned char *outdata; + size_t outdatalen; + char *keyidstr; + + if ( IS_LOCKED (ctrl) ) + return gpg_error (GPG_ERR_LOCKED); + + if ((rc = open_card (ctrl, NULL))) + return rc; + + if (!ctrl->app_ctx) + return gpg_error (GPG_ERR_UNSUPPORTED_OPERATION); + + /* We have to use a copy of the key ID because the function may use + the pin_cb which in turn uses the assuan line buffer and thus + overwriting the original line with the keyid */ + keyidstr = xtrystrdup (line); + if (!keyidstr) + return ASSUAN_Out_Of_Core; + + rc = app_auth (ctrl->app_ctx, + keyidstr, + pin_cb, ctx, + ctrl->in_data.value, ctrl->in_data.valuelen, + &outdata, &outdatalen); + xfree (keyidstr); + if (rc) + { + log_error ("app_auth_sign failed: %s\n", gpg_strerror (rc)); + } + else + { + rc = assuan_send_data (ctx, outdata, outdatalen); + xfree (outdata); + if (rc) + return rc; /* that is already an assuan error code */ + } + + TEST_CARD_REMOVAL (ctrl, rc); + return map_to_assuan_status (rc); +} + +/* PKDECRYPT <hexified_id> + + */ +static int +cmd_pkdecrypt (assuan_context_t ctx, char *line) +{ + ctrl_t ctrl = assuan_get_pointer (ctx); + int rc; + unsigned char *outdata; + size_t outdatalen; + char *keyidstr; + + if ( IS_LOCKED (ctrl) ) + return gpg_error (GPG_ERR_LOCKED); + + if ((rc = open_card (ctrl, NULL))) + return rc; + + keyidstr = xtrystrdup (line); + if (!keyidstr) + return ASSUAN_Out_Of_Core; + rc = app_decipher (ctrl->app_ctx, + keyidstr, + pin_cb, ctx, + ctrl->in_data.value, ctrl->in_data.valuelen, + &outdata, &outdatalen); + + xfree (keyidstr); + if (rc) + { + log_error ("card_create_signature failed: %s\n", gpg_strerror (rc)); + } + else + { + rc = assuan_send_data (ctx, outdata, outdatalen); + xfree (outdata); + if (rc) + return rc; /* that is already an assuan error code */ + } + + TEST_CARD_REMOVAL (ctrl, rc); + return map_to_assuan_status (rc); +} + + +/* GETATTR <name> + + This command is used to retrieve data from a smartcard. The + allowed names depend on the currently selected smartcard + application. NAME must be percent and '+' escaped. The value is + returned through status message, see the LEARN command for details. + + However, the current implementation assumes that Name is not escaped; + this works as long as noone uses arbitrary escaping. + + Note, that this function may even be used on a locked card. +*/ +static int +cmd_getattr (assuan_context_t ctx, char *line) +{ + ctrl_t ctrl = assuan_get_pointer (ctx); + int rc; + const char *keyword; + + if ((rc = open_card (ctrl, NULL))) + return rc; + + keyword = line; + for (; *line && !spacep (line); line++) + ; + if (*line) + *line++ = 0; + + /* (We ignore any garbage for now.) */ + + /* FIXME: Applications should not return sensistive data if the card + is locked. */ + rc = app_getattr (ctrl->app_ctx, ctrl, keyword); + + TEST_CARD_REMOVAL (ctrl, rc); + return map_to_assuan_status (rc); +} + + +/* SETATTR <name> <value> + + This command is used to store data on a a smartcard. The allowed + names and values are depend on the currently selected smartcard + application. NAME and VALUE must be percent and '+' escaped. + + However, the curent implementation assumes that Name is not escaped; + this works as long as noone uses arbitrary escaping. + + A PIN will be requested for most NAMEs. See the corresponding + setattr function of the actually used application (app-*.c) for + details. */ +static int +cmd_setattr (assuan_context_t ctx, char *orig_line) +{ + ctrl_t ctrl = assuan_get_pointer (ctx); + int rc; + char *keyword; + int keywordlen; + size_t nbytes; + char *line, *linebuf; + + if ( IS_LOCKED (ctrl) ) + return gpg_error (GPG_ERR_LOCKED); + + if ((rc = open_card (ctrl, NULL))) + return rc; + + /* We need to use a copy of LINE, because PIN_CB uses the same + context and thus reuses the Assuan provided LINE. */ + line = linebuf = xtrystrdup (orig_line); + if (!line) + return ASSUAN_Out_Of_Core; + + keyword = line; + for (keywordlen=0; *line && !spacep (line); line++, keywordlen++) + ; + if (*line) + *line++ = 0; + while (spacep (line)) + line++; + nbytes = percent_plus_unescape ((unsigned char*)line); + + rc = app_setattr (ctrl->app_ctx, keyword, pin_cb, ctx, + (const unsigned char*)line, nbytes); + xfree (linebuf); + + TEST_CARD_REMOVAL (ctrl, rc); + return map_to_assuan_status (rc); +} + + + +/* WRITEKEY [--force] <keyid> + + This command is used to store a secret key on a a smartcard. The + allowed keyids depend on the currently selected smartcard + application. The actual keydata is requested using the inquiry + "KETDATA" and need to be provided without any protection. With + --force set an existing key under this KEYID will get overwritten. + The keydata is expected to be the usual canonical encoded + S-expression. + + A PIN will be requested for most NAMEs. See the corresponding + writekey function of the actually used application (app-*.c) for + details. */ +static int +cmd_writekey (assuan_context_t ctx, char *line) +{ + ctrl_t ctrl = assuan_get_pointer (ctx); + int rc; + char *keyid; + int force = has_option (line, "--force"); + unsigned char *keydata; + size_t keydatalen; + + if ( IS_LOCKED (ctrl) ) + return gpg_error (GPG_ERR_LOCKED); + + /* Skip over options. */ + while ( *line == '-' && line[1] == '-' ) + { + while (*line && !spacep (line)) + line++; + while (spacep (line)) + line++; + } + if (!*line) + return set_error (Parameter_Error, "no keyid given"); + keyid = line; + while (*line && !spacep (line)) + line++; + *line = 0; + + if ((rc = open_card (ctrl, NULL))) + return rc; + + if (!ctrl->app_ctx) + return gpg_error (GPG_ERR_UNSUPPORTED_OPERATION); + + keyid = xtrystrdup (keyid); + if (!keyid) + return ASSUAN_Out_Of_Core; + + /* Now get the actual keydata. */ + rc = assuan_inquire (ctx, "KEYDATA", &keydata, &keydatalen, MAXLEN_KEYDATA); + if (rc) + { + xfree (keyid); + return rc; + } + + /* Write the key to the card. */ + rc = app_writekey (ctrl->app_ctx, ctrl, keyid, force? 1:0, + pin_cb, ctx, keydata, keydatalen); + xfree (keyid); + xfree (keydata); + + TEST_CARD_REMOVAL (ctrl, rc); + return map_to_assuan_status (rc); +} + + + +/* GENKEY [--force] <no> + + Generate a key on-card identified by NO, which is application + specific. Return values are application specific. For OpenPGP + cards 2 status lines are returned: + + S KEY-FPR <hexstring> + S KEY-CREATED-AT <seconds_since_epoch> + S KEY-DATA [p|n] <hexdata> + + + --force is required to overwrite an already existing key. The + KEY-CREATED-AT is required for further processing because it is + part of the hashed key material for the fingerprint. + + The public part of the key can also later be retrieved using the + READKEY command. + + */ +static int +cmd_genkey (assuan_context_t ctx, char *line) +{ + ctrl_t ctrl = assuan_get_pointer (ctx); + int rc; + char *keyno; + int force = has_option (line, "--force"); + + if ( IS_LOCKED (ctrl) ) + return gpg_error (GPG_ERR_LOCKED); + + /* Skip over options. */ + while ( *line == '-' && line[1] == '-' ) + { + while (*line && !spacep (line)) + line++; + while (spacep (line)) + line++; + } + if (!*line) + return set_error (Parameter_Error, "no key number given"); + keyno = line; + while (*line && !spacep (line)) + line++; + *line = 0; + + if ((rc = open_card (ctrl, NULL))) + return rc; + + if (!ctrl->app_ctx) + return gpg_error (GPG_ERR_UNSUPPORTED_OPERATION); + + keyno = xtrystrdup (keyno); + if (!keyno) + return ASSUAN_Out_Of_Core; + rc = app_genkey (ctrl->app_ctx, ctrl, keyno, force? 1:0, pin_cb, ctx); + xfree (keyno); + + TEST_CARD_REMOVAL (ctrl, rc); + return map_to_assuan_status (rc); +} + + +/* RANDOM <nbytes> + + Get NBYTES of random from the card and send them back as data. + + Note, that this function may be even be used on a locked card. +*/ +static int +cmd_random (assuan_context_t ctx, char *line) +{ + ctrl_t ctrl = assuan_get_pointer (ctx); + int rc; + size_t nbytes; + unsigned char *buffer; + + if (!*line) + return set_error (Parameter_Error, "number of requested bytes missing"); + nbytes = strtoul (line, NULL, 0); + + if ((rc = open_card (ctrl, NULL))) + return rc; + + if (!ctrl->app_ctx) + return gpg_error (GPG_ERR_UNSUPPORTED_OPERATION); + + buffer = xtrymalloc (nbytes); + if (!buffer) + return ASSUAN_Out_Of_Core; + + rc = app_get_challenge (ctrl->app_ctx, nbytes, buffer); + if (!rc) + { + rc = assuan_send_data (ctx, buffer, nbytes); + xfree (buffer); + return rc; /* that is already an assuan error code */ + } + xfree (buffer); + + TEST_CARD_REMOVAL (ctrl, rc); + return map_to_assuan_status (rc); +} + + +/* PASSWD [--reset] <chvno> + + Change the PIN or reset the retry counter of the card holder + verfication vector CHVNO. */ +static int +cmd_passwd (assuan_context_t ctx, char *line) +{ + ctrl_t ctrl = assuan_get_pointer (ctx); + int rc; + char *chvnostr; + int reset_mode = has_option (line, "--reset"); + + if ( IS_LOCKED (ctrl) ) + return gpg_error (GPG_ERR_LOCKED); + + /* Skip over options. */ + while (*line == '-' && line[1] == '-') + { + while (*line && !spacep (line)) + line++; + while (spacep (line)) + line++; + } + if (!*line) + return set_error (Parameter_Error, "no CHV number given"); + chvnostr = line; + while (*line && !spacep (line)) + line++; + *line = 0; + + if ((rc = open_card (ctrl, NULL))) + return rc; + + if (!ctrl->app_ctx) + return gpg_error (GPG_ERR_UNSUPPORTED_OPERATION); + + chvnostr = xtrystrdup (chvnostr); + if (!chvnostr) + return ASSUAN_Out_Of_Core; + rc = app_change_pin (ctrl->app_ctx, ctrl, chvnostr, reset_mode, pin_cb, ctx); + if (rc) + log_error ("command passwd failed: %s\n", gpg_strerror (rc)); + xfree (chvnostr); + + TEST_CARD_REMOVAL (ctrl, rc); + return map_to_assuan_status (rc); +} + + +/* CHECKPIN <idstr> + + Perform a VERIFY operation without doing anything else. This may + be used to initialize a the PIN cache earlier to long lasting + operations. Its use is highly application dependent. + + For OpenPGP: + + 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. IDSTR is the usual card's serial number in hex + notation; an optional fingerprint part will get ignored. There + is however a special mode if the IDSTR is sffixed with the + literal string "[CHV3]": In this case the Admin PIN is checked + if and only if the retry counter is still at 3. + + */ +static int +cmd_checkpin (assuan_context_t ctx, char *line) +{ + ctrl_t ctrl = assuan_get_pointer (ctx); + int rc; + char *keyidstr; + + if ( IS_LOCKED (ctrl) ) + return gpg_error (GPG_ERR_LOCKED); + + if ((rc = open_card (ctrl, NULL))) + return rc; + + if (!ctrl->app_ctx) + return gpg_error (GPG_ERR_UNSUPPORTED_OPERATION); + + /* We have to use a copy of the key ID because the function may use + the pin_cb which in turn uses the assuan line buffer and thus + overwriting the original line with the keyid. */ + keyidstr = xtrystrdup (line); + if (!keyidstr) + return ASSUAN_Out_Of_Core; + + rc = app_check_pin (ctrl->app_ctx, + keyidstr, + pin_cb, ctx); + xfree (keyidstr); + if (rc) + log_error ("app_check_pin failed: %s\n", gpg_strerror (rc)); + + TEST_CARD_REMOVAL (ctrl, rc); + return map_to_assuan_status (rc); +} + + +/* LOCK [--wait] + + Grant exclusive card access to this session. Note that there is + no lock counter used and a second lock from the same session will + be ignored. A single unlock (or RESET) unlocks the session. + Return GPG_ERR_LOCKED if another session has locked the reader. + + If the option --wait is given the command will wait until a + lock has been released. + */ +static int +cmd_lock (assuan_context_t ctx, char *line) +{ + ctrl_t ctrl = assuan_get_pointer (ctx); + int rc = 0; + + retry: + if (locked_session) + { + if (locked_session != ctrl->server_local) + rc = gpg_error (GPG_ERR_LOCKED); + } + else + locked_session = ctrl->server_local; + +#ifdef USE_GNU_PTH + if (rc && has_option (line, "--wait")) + { + rc = 0; + pth_sleep (1); /* Better implement an event mechanism. However, + for card operations this should be + sufficient. */ + /* FIXME: Need to check that the connection is still alive. + This can be done by issuing status messages. */ + goto retry; + } +#endif /*USE_GNU_PTH*/ + + if (rc) + log_error ("cmd_lock failed: %s\n", gpg_strerror (rc)); + return map_to_assuan_status (rc); +} + + +/* UNLOCK + + Release exclusive card access. + */ +static int +cmd_unlock (assuan_context_t ctx, char *line) +{ + ctrl_t ctrl = assuan_get_pointer (ctx); + int rc = 0; + + if (locked_session) + { + if (locked_session != ctrl->server_local) + rc = gpg_error (GPG_ERR_LOCKED); + else + locked_session = NULL; + } + else + rc = gpg_error (GPG_ERR_NOT_LOCKED); + + if (rc) + log_error ("cmd_unlock failed: %s\n", gpg_strerror (rc)); + return map_to_assuan_status (rc); +} + + +/* GETINFO <what> + + Multi purpose command to return certain information. + Supported values of WHAT are: + + socket_name - Return the name of the socket. + +*/ + +static int +cmd_getinfo (assuan_context_t ctx, char *line) +{ + int rc = 0; + + if (!strcmp (line, "socket_name")) + { + const char *s = scd_get_socket_name (); + + if (s) + rc = assuan_send_data (ctx, s, strlen (s)); + else + rc = gpg_error (GPG_ERR_NO_DATA); + } + else + rc = set_error (Parameter_Error, "unknown value for WHAT"); + return rc; +} + + +/* RESTART + + Restart the current connection; this is a kind of warm reset. It + deletes the context used by this connection but does not send a + RESET to the card. Thus the card itself won't get reset. + + This is used by gpg-agent to reuse a primary pipe connection and + may be used by clients to backup from a conflict in the serial + command; i.e. to select another application. +*/ + +static int +cmd_restart (assuan_context_t ctx, char *line) +{ + ctrl_t ctrl = assuan_get_pointer (ctx); + + if (ctrl->app_ctx) + { + release_application (ctrl->app_ctx); + ctrl->app_ctx = NULL; + } + if (locked_session && ctrl->server_local == locked_session) + { + locked_session = NULL; + log_info ("implicitly unlocking due to RESTART\n"); + } + return 0; +} + + +/* APDU [--atr] [--more] [hexstring] + + Send an APDU to the current reader. This command bypasses the high + level functions and sends the data directly to the card. HEXSTRING + is expected to be a proper APDU. If HEXSTRING is not given no + commands are set to the card but the command will implictly check + whether the card is ready for use. + + Using the option "--atr" returns the ATR of the card as a status + message before any data like this: + S CARD-ATR 3BFA1300FF813180450031C173C00100009000B1 + + Using the option --more handles the card status word MORE_DATA + (61xx) and concatenate all reponses to one block. + + */ +static int +cmd_apdu (assuan_context_t ctx, char *line) +{ + ctrl_t ctrl = assuan_get_pointer (ctx); + int rc; + int rc_is_assuan = 0; + unsigned char *apdu; + size_t apdulen; + int with_atr; + int handle_more; + + with_atr = has_option (line, "--atr"); + handle_more = has_option (line, "--more"); + + /* Skip over options. */ + while ( *line == '-' && line[1] == '-' ) + { + while (*line && !spacep (line)) + line++; + while (spacep (line)) + line++; + } + + if ( IS_LOCKED (ctrl) ) + return gpg_error (GPG_ERR_LOCKED); + + if ((rc = open_card (ctrl, NULL))) + return rc; + + if (with_atr) + { + unsigned char *atr; + size_t atrlen; + int i; + char hexbuf[400]; + + atr = apdu_get_atr (ctrl->reader_slot, &atrlen); + if (!atr || atrlen > sizeof hexbuf - 2 ) + { + rc = gpg_error (GPG_ERR_INV_CARD); + goto leave; + } + for (i=0; i < atrlen; i++) + sprintf (hexbuf+2*i, "%02X", atr[i]); + xfree (atr); + send_status_info (ctrl, "CARD-ATR", hexbuf, strlen (hexbuf), NULL, 0); + } + + apdu = hex_to_buffer (line, &apdulen); + if (!apdu) + { + rc = gpg_error_from_errno (errno); + goto leave; + } + if (apdulen) + { + unsigned char *result = NULL; + size_t resultlen; + + rc = apdu_send_direct (ctrl->reader_slot, apdu, apdulen, handle_more, + &result, &resultlen); + if (rc) + log_error ("apdu_send_direct failed: %s\n", gpg_strerror (rc)); + else + { + rc_is_assuan = 1; + rc = assuan_send_data (ctx, result, resultlen); + xfree (result); + } + } + xfree (apdu); + + leave: + TEST_CARD_REMOVAL (ctrl, rc); + return rc_is_assuan? rc : map_to_assuan_status (rc); +} + + + + + +/* Tell the assuan library about our commands */ +static int +register_commands (assuan_context_t ctx) +{ + static struct { + const char *name; + int (*handler)(assuan_context_t, char *line); + } table[] = { + { "SERIALNO", cmd_serialno }, + { "LEARN", cmd_learn }, + { "READCERT", cmd_readcert }, + { "READKEY", cmd_readkey }, + { "SETDATA", cmd_setdata }, + { "PKSIGN", cmd_pksign }, + { "PKAUTH", cmd_pkauth }, + { "PKDECRYPT", cmd_pkdecrypt }, + { "INPUT", NULL }, + { "OUTPUT", NULL }, + { "GETATTR", cmd_getattr }, + { "SETATTR", cmd_setattr }, + { "WRITEKEY", cmd_writekey }, + { "GENKEY", cmd_genkey }, + { "RANDOM", cmd_random }, + { "PASSWD", cmd_passwd }, + { "CHECKPIN", cmd_checkpin }, + { "LOCK", cmd_lock }, + { "UNLOCK", cmd_unlock }, + { "GETINFO", cmd_getinfo }, + { "RESTART", cmd_restart }, + { "APDU", cmd_apdu }, + { NULL } + }; + int i, rc; + + for (i=0; table[i].name; i++) + { + rc = assuan_register_command (ctx, table[i].name, table[i].handler); + if (rc) + return rc; + } + assuan_set_hello_line (ctx, "GNU Privacy Guard's Smartcard server ready"); + + assuan_register_reset_notify (ctx, reset_notify); + assuan_register_option_handler (ctx, option_handler); + return 0; +} + + +/* Startup the server. If FD is given as -1 this is simple pipe + server, otherwise it is a regular server. */ +void +scd_command_handler (int fd) +{ + int rc; + assuan_context_t ctx; + struct server_control_s ctrl; + + memset (&ctrl, 0, sizeof ctrl); + scd_init_default_ctrl (&ctrl); + + if (fd == -1) + { + int filedes[2]; + + filedes[0] = 0; + filedes[1] = 1; + rc = assuan_init_pipe_server (&ctx, filedes); + } + else + { + rc = assuan_init_connected_socket_server (&ctx, fd); + } + if (rc) + { + log_error ("failed to initialize the server: %s\n", + assuan_strerror(rc)); + scd_exit (2); + } + rc = register_commands (ctx); + if (rc) + { + log_error ("failed to register commands with Assuan: %s\n", + assuan_strerror(rc)); + scd_exit (2); + } + assuan_set_pointer (ctx, &ctrl); + + /* Allocate and initialize the server object. Put it into the list + of active sessions. */ + ctrl.server_local = xcalloc (1, sizeof *ctrl.server_local); + ctrl.server_local->next_session = session_list; + session_list = ctrl.server_local; + ctrl.server_local->ctrl_backlink = &ctrl; + ctrl.server_local->assuan_ctx = ctx; + + if (DBG_ASSUAN) + assuan_set_log_stream (ctx, log_get_stream ()); + + /* We open the reader right at startup so that the ticker is able to + update the status file. */ + if (ctrl.reader_slot == -1) + { + ctrl.reader_slot = get_reader_slot (); + } + + /* Command processing loop. */ + for (;;) + { + rc = assuan_accept (ctx); + if (rc == -1) + { + break; + } + else if (rc) + { + log_info ("Assuan accept problem: %s\n", assuan_strerror (rc)); + break; + } + + rc = assuan_process (ctx); + if (rc) + { + log_info ("Assuan processing failed: %s\n", assuan_strerror (rc)); + continue; + } + } + + /* Cleanup. */ + do_reset (&ctrl, 0); + + /* Release the server object. */ + if (session_list == ctrl.server_local) + session_list = ctrl.server_local->next_session; + else + { + struct server_local_s *sl; + + for (sl=session_list; sl->next_session; sl = sl->next_session) + if (sl->next_session == ctrl.server_local) + break; + if (!sl->next_session) + BUG (); + sl->next_session = ctrl.server_local->next_session; + } + xfree (ctrl.server_local); + + /* Release the Assuan context. */ + assuan_deinit_server (ctx); +} + + +/* 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; + assuan_context_t ctx = ctrl->server_local->assuan_ctx; + + va_start (arg_ptr, keyword); + + p = buf; + n = 0; + 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; + assuan_write_status (ctx, keyword, buf); + + va_end (arg_ptr); +} + + +/* This is the core of scd_update_reader_status_file but the caller + needs to take care of the locking. */ +static void +update_reader_status_file (void) +{ + int idx; + unsigned int status, changed; + + /* Note, that we only try to get the status, because it does not + make sense to wait here for a operation to complete. If we are + busy working with a card, delays in the status file update should + be acceptable. */ + for (idx=0; idx < DIM(slot_table); idx++) + { + struct slot_status_s *ss = slot_table + idx; + + if (!ss->valid || ss->slot == -1) + continue; /* Not valid or reader not yet open. */ + + if ( apdu_get_status (ss->slot, 0, &status, &changed) ) + continue; /* Get status failed. */ + + if (!ss->any || ss->status != status || ss->changed != changed ) + { + char *fname; + char templ[50]; + FILE *fp; + struct server_local_s *sl; + + log_info ("updating status of slot %d to 0x%04X\n", + ss->slot, status); + + sprintf (templ, "reader_%d.status", ss->slot); + fname = make_filename (opt.homedir, templ, NULL ); + fp = fopen (fname, "w"); + if (fp) + { + fprintf (fp, "%s\n", + (status & 1)? "USABLE": + (status & 4)? "ACTIVE": + (status & 2)? "PRESENT": "NOCARD"); + fclose (fp); + } + xfree (fname); + + /* Set the card removed flag for all current sessions. We + will set this on any card change because a reset or + SERIALNO request must be done in any case. */ + if (ss->any) + update_card_removed (ss->slot, 1); + + ss->any = 1; + ss->status = status; + ss->changed = changed; + + /* Send a signal to all clients who applied for it. */ + for (sl=session_list; sl; sl = sl->next_session) + if (sl->event_signal && sl->assuan_ctx) + { + pid_t pid = assuan_get_pid (sl->assuan_ctx); + int signo = sl->event_signal; + + log_info ("client pid is %d, sending signal %d\n", + pid, signo); +#ifndef HAVE_W32_SYSTEM + if (pid != (pid_t)(-1) && pid && signo > 0) + kill (pid, signo); +#endif + } + } + } +} + +/* This function is called by the ticker thread to check for changes + of the reader stati. It updates the reader status files and if + requested by the caller also send a signal to the caller. */ +void +scd_update_reader_status_file (void) +{ + if (!pth_mutex_acquire (&status_file_update_lock, 1, NULL)) + return; /* locked - give up. */ + update_reader_status_file (); + if (!pth_mutex_release (&status_file_update_lock)) + log_error ("failed to release status_file_update lock\n"); +} diff --git a/g10/iso7816.c b/scd/iso7816.c similarity index 83% rename from g10/iso7816.c rename to scd/iso7816.c index 5b985324f..5c62e1371 100644 --- a/g10/iso7816.c +++ b/scd/iso7816.c @@ -47,9 +47,9 @@ #define CMD_SELECT_FILE 0xA4 -#define CMD_VERIFY 0x20 -#define CMD_CHANGE_REFERENCE_DATA 0x24 -#define CMD_RESET_RETRY_COUNTER 0x2C +#define CMD_VERIFY ISO7816_VERIFY +#define CMD_CHANGE_REFERENCE_DATA ISO7816_CHANGE_REFERENCE_DATA +#define CMD_RESET_RETRY_COUNTER ISO7816_RESET_RETRY_COUNTER #define CMD_GET_DATA 0xCA #define CMD_PUT_DATA 0xDA #define CMD_MSE 0x22 @@ -95,6 +95,7 @@ map_sw (int sw) 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; + case SW_HOST_NO_KEYPAD: ec = GPG_ERR_NOT_SUPPORTED; break; default: if ((sw & 0x010000)) @@ -124,12 +125,15 @@ iso7816_map_sw (int sw) 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. */ + internally mapped. Bit 0 of FLAGS should be set if the card does + not understand P2=0xC0. */ gpg_error_t -iso7816_select_application (int slot, const char *aid, size_t aidlen) +iso7816_select_application (int slot, const char *aid, size_t aidlen, + unsigned int flags) { int sw; - sw = apdu_send_simple (slot, 0x00, CMD_SELECT_FILE, 4, 0, aidlen, aid); + sw = apdu_send_simple (slot, 0x00, CMD_SELECT_FILE, 4, + (flags&1)? 0 :0x0c, aidlen, aid); return map_sw (sw); } @@ -221,27 +225,59 @@ iso7816_list_directory (int slot, int list_dirs, } +/* Check whether the reader supports the ISO command code COMMAND on + the keypad. Returns 0 on success. */ +gpg_error_t +iso7816_check_keypad (int slot, int command, iso7816_pininfo_t *pininfo) +{ + int sw; + + sw = apdu_check_keypad (slot, command, + pininfo->mode, pininfo->minlen, pininfo->maxlen, + pininfo->padlen); + return map_sw (sw); +} + + +/* Perform a VERIFY command on SLOT using the card holder verification + vector CHVNO with a CHV of lenght CHVLEN. With PININFO non-NULL + the keypad of the reader will be used. Returns 0 on success. */ +gpg_error_t +iso7816_verify_kp (int slot, int chvno, const char *chv, size_t chvlen, + iso7816_pininfo_t *pininfo) +{ + int sw; + + if (pininfo && pininfo->mode) + sw = apdu_send_simple_kp (slot, 0x00, CMD_VERIFY, 0, chvno, chvlen, chv, + pininfo->mode, + pininfo->minlen, + pininfo->maxlen, + pininfo->padlen); + else + sw = apdu_send_simple (slot, 0x00, CMD_VERIFY, 0, chvno, chvlen, chv); + 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); + return iso7816_verify_kp (slot, chvno, chv, chvlen, NULL); } /* 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. */ + length NEWCHVLEN. With PININFO non-NULL the keypad of the reader + will be used. */ gpg_error_t -iso7816_change_reference_data (int slot, int chvno, - const char *oldchv, size_t oldchvlen, - const char *newchv, size_t newchvlen) +iso7816_change_reference_data_kp (int slot, int chvno, + const char *oldchv, size_t oldchvlen, + const char *newchv, size_t newchvlen, + iso7816_pininfo_t *pininfo) { int sw; char *buf; @@ -258,28 +294,69 @@ iso7816_change_reference_data (int slot, int chvno, 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); + if (pininfo && pininfo->mode) + sw = apdu_send_simple_kp (slot, 0x00, CMD_CHANGE_REFERENCE_DATA, + oldchvlen? 0 : 1, chvno, oldchvlen+newchvlen, buf, + pininfo->mode, + pininfo->minlen, + pininfo->maxlen, + pininfo->padlen); + else + sw = apdu_send_simple (slot, 0x00, CMD_CHANGE_REFERENCE_DATA, + oldchvlen? 0 : 1, chvno, oldchvlen+newchvlen, buf); xfree (buf); 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_reset_retry_counter (int slot, int chvno, - const char *newchv, size_t newchvlen) +iso7816_change_reference_data (int slot, int chvno, + const char *oldchv, size_t oldchvlen, + const char *newchv, size_t newchvlen) +{ + return iso7816_change_reference_data_kp (slot, chvno, oldchv, oldchvlen, + newchv, newchvlen, NULL); +} + + +gpg_error_t +iso7816_reset_retry_counter_kp (int slot, int chvno, + const char *newchv, size_t newchvlen, + iso7816_pininfo_t *pininfo) { 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); + if (pininfo && pininfo->mode) + sw = apdu_send_simple_kp (slot, 0x00, CMD_RESET_RETRY_COUNTER, + 2, chvno, newchvlen, newchv, + pininfo->mode, + pininfo->minlen, + pininfo->maxlen, + pininfo->padlen); + else + sw = apdu_send_simple (slot, 0x00, CMD_RESET_RETRY_COUNTER, + 2, chvno, newchvlen, newchv); return map_sw (sw); } +gpg_error_t +iso7816_reset_retry_counter (int slot, int chvno, + const char *newchv, size_t newchvlen) +{ + return iso7816_reset_retry_counter_kp (slot, chvno, newchv, newchvlen, NULL); +} + + + /* 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. */ diff --git a/g10/iso7816.h b/scd/iso7816.h similarity index 74% rename from g10/iso7816.h rename to scd/iso7816.h index 04c7ae63e..8f7907405 100644 --- a/g10/iso7816.h +++ b/scd/iso7816.h @@ -28,10 +28,30 @@ #include "cardglue.h" #endif +/* Command codes used by iso7816_check_keypad. */ +#define ISO7816_VERIFY 0x20 +#define ISO7816_CHANGE_REFERENCE_DATA 0x24 +#define ISO7816_RESET_RETRY_COUNTER 0x2C + + +/* Information to be passed to keypad equipped readers. See + ccid-driver.c for details. */ +struct iso7816_pininfo_s +{ + int mode; /* A mode of 0 means: Do not use the keypad. */ + int minlen; + int maxlen; + int padlen; + int padchar; +}; +typedef struct iso7816_pininfo_s iso7816_pininfo_t; + + gpg_error_t iso7816_map_sw (int sw); gpg_error_t iso7816_select_application (int slot, - const char *aid, size_t aidlen); + const char *aid, size_t aidlen, + unsigned int flags); 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, @@ -39,13 +59,26 @@ gpg_error_t iso7816_select_path (int slot, 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_check_keypad (int slot, int command, + iso7816_pininfo_t *pininfo); gpg_error_t iso7816_verify (int slot, int chvno, const char *chv, size_t chvlen); +gpg_error_t iso7816_verify_kp (int slot, + int chvno, const char *chv, size_t chvlen, + iso7816_pininfo_t *pininfo); 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_change_reference_data_kp (int slot, int chvno, + const char *oldchv, size_t oldchvlen, + const char *newchv, size_t newchvlen, + iso7816_pininfo_t *pininfo); gpg_error_t iso7816_reset_retry_counter (int slot, int chvno, const char *newchv, size_t newchvlen); +gpg_error_t iso7816_reset_retry_counter_kp (int slot, int chvno, + const char *newchv, + size_t newchvlen, + iso7816_pininfo_t *pininfo); 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, diff --git a/scd/pcsc-wrapper.c b/scd/pcsc-wrapper.c new file mode 100644 index 000000000..23e8442f7 --- /dev/null +++ b/scd/pcsc-wrapper.c @@ -0,0 +1,832 @@ +/* pcsc-wrapper.c - Wrapper for ccessing the PC/SC service + * 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. + */ + +/* + This wrapper is required to handle problems with the libpscslite + library. That library assumes that pthreads are used and fails + badly if one tries to use it with a procerss using Pth. + + The operation model is pretty simple: It reads requests from stdin + and returns the answer on stdout. There is no direct mapping to the + pcsc interface but to a higher level one which resembles the code + used in scdaemon (apdu.c) when not using Pth or while running under + Windows. + + The interface is binary consisting of a command tag and the length + of the parameter list. The calling process needs to pass the + version number of the interface on the command line to make sure + that both agree on the same interface. For each port a separate + instance of this process needs to be started. + +*/ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif +#include <stdio.h> +#include <stdlib.h> +#include <stddef.h> +#include <string.h> +#include <errno.h> +#include <stdarg.h> +#include <assert.h> +#include <dlfcn.h> + + +#define PGM "pcsc-wrapper" + +/* Allow for a standalone build. */ +#ifdef VERSION +#define MYVERSION_LINE PGM " (GnuPG) " VERSION +#define BUGREPORT_LINE "\nReport bugs to <bug-gnupg@gnu.org>.\n" +#else +#define MYVERSION_LINE PGM +#define BUGREPORT_LINE "" +#endif + +#define DEFAULT_PCSC_DRIVER "libpcsclite.so" + + +static int verbose; + + +/* 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. */ + +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; + + +static int driver_is_open; /* True if the PC/SC driver has been + initialzied and is ready for + operations. The following variables + are then valid. */ +static unsigned long pcsc_context; /* The current PC/CS context. */ +static char *current_rdrname; +static unsigned long pcsc_card; +static unsigned long pcsc_protocol; +static unsigned char current_atr[33]; +static size_t current_atrlen; + +long (* pcsc_establish_context) (unsigned long scope, + const void *reserved1, + const void *reserved2, + unsigned long *r_context); +long (* pcsc_release_context) (unsigned long context); +long (* pcsc_list_readers) (unsigned long context, + const char *groups, + char *readers, unsigned long*readerslen); +long (* pcsc_get_status_change) (unsigned long context, + unsigned long timeout, + pcsc_readerstate_t readerstates, + unsigned long nreaderstates); +long (* 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 (* pcsc_reconnect) (unsigned long card, + unsigned long share_mode, + unsigned long preferred_protocols, + unsigned long initialization, + unsigned long *r_active_protocol); +long (* pcsc_disconnect) (unsigned long card, + unsigned long disposition); +long (* 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 (* pcsc_begin_transaction) (unsigned long card); +long (* pcsc_end_transaction) (unsigned long card); +long (* 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 (* pcsc_set_timeout) (unsigned long context, + unsigned long timeout); + + + +static void +bad_request (const char *type) +{ + fprintf (stderr, PGM ": bad `%s' request\n", type); + exit (1); +} + +static void +request_failed (int err) +{ + if (!err) + err = -1; + + putchar (0x81); /* Simple error/success response. */ + + putchar (0); + putchar (0); + putchar (0); + putchar (4); + + putchar ((err >> 24) & 0xff); + putchar ((err >> 16) & 0xff); + putchar ((err >> 8) & 0xff); + putchar ((err ) & 0xff); + + fflush (stdout); +} + + +static void +request_succeeded (const void *buffer, size_t buflen) +{ + size_t len; + + putchar (0x81); /* Simple error/success response. */ + + len = 4 + buflen; + putchar ((len >> 24) & 0xff); + putchar ((len >> 16) & 0xff); + putchar ((len >> 8) & 0xff); + putchar ((len ) & 0xff); + + /* Error code. */ + putchar (0); + putchar (0); + putchar (0); + putchar (0); + + /* Optional reponse string. */ + if (buffer) + fwrite (buffer, buflen, 1, stdout); + + fflush (stdout); +} + + + +static unsigned long +read_32 (FILE *fp) +{ + int c1, c2, c3, c4; + + c1 = getc (stdin); + c2 = getc (stdin); + c3 = getc (stdin); + c4 = getc (stdin); + if (c1 == EOF || c2 == EOF || c3 == EOF || c4 == EOF) + { + fprintf (stderr, PGM ": premature EOF while parsing request\n"); + exit (1); + } + return (c1 << 24) | (c2 << 16) | (c3 << 8) | c4; +} + + + +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; +} + +static void +load_pcsc_driver (const char *libname) +{ + void *handle; + + handle = dlopen (libname, RTLD_LAZY); + if (!handle) + { + fprintf (stderr, PGM ": failed to open driver `%s': %s", + libname, dlerror ()); + exit (1); + } + + pcsc_establish_context = dlsym (handle, "SCardEstablishContext"); + pcsc_release_context = dlsym (handle, "SCardReleaseContext"); + pcsc_list_readers = dlsym (handle, "SCardListReaders"); + pcsc_get_status_change = dlsym (handle, "SCardGetStatusChange"); + pcsc_connect = dlsym (handle, "SCardConnect"); + pcsc_reconnect = dlsym (handle, "SCardReconnect"); + pcsc_disconnect = dlsym (handle, "SCardDisconnect"); + pcsc_status = dlsym (handle, "SCardStatus"); + 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. */ + fprintf (stderr, + "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); + exit (1); + } +} + + + + +/* Handle a open request. The argument is expected to be a string + with the port identification. ARGBUF is always guaranteed to be + terminted by a 0 which is not counted in ARGLEN. We may modifiy + ARGBUF. */ +static void +handle_open (unsigned char *argbuf, size_t arglen) +{ + long err; + const char * portstr; + char *list = NULL; + unsigned long nreader, listlen, atrlen; + char *p; + unsigned long card_state, card_protocol; + unsigned char atr[33]; + + /* Make sure there is only the port string */ + if (arglen != strlen ((char*)argbuf)) + bad_request ("OPEN"); + portstr = (char*)argbuf; + + if (driver_is_open) + { + fprintf (stderr, PGM ": PC/SC has already been opened\n"); + request_failed (-1); + return; + } + + err = pcsc_establish_context (PCSC_SCOPE_SYSTEM, NULL, NULL, &pcsc_context); + if (err) + { + fprintf (stderr, PGM": pcsc_establish_context failed: %s (0x%lx)\n", + pcsc_error_string (err), err); + request_failed (err); + return; + } + + err = pcsc_list_readers (pcsc_context, NULL, NULL, &nreader); + if (!err) + { + list = malloc (nreader+1); /* Better add 1 for safety reasons. */ + if (!list) + { + fprintf (stderr, PGM": error allocating memory for reader list\n"); + exit (1); + } + err = pcsc_list_readers (pcsc_context, NULL, list, &nreader); + } + if (err) + { + fprintf (stderr, PGM": pcsc_list_readers failed: %s (0x%lx)\n", + pcsc_error_string (err), err); + pcsc_release_context (pcsc_context); + free (list); + request_failed (err); + return; + } + + listlen = nreader; + p = list; + while (nreader) + { + if (!*p && !p[1]) + break; + fprintf (stderr, PGM": detected reader `%s'\n", p); + if (nreader < (strlen (p)+1)) + { + fprintf (stderr, PGM": invalid response from pcsc_list_readers\n"); + break; + } + nreader -= strlen (p)+1; + p += strlen (p) + 1; + } + + current_rdrname = malloc (strlen (portstr && *portstr? portstr:list)+1); + if (!current_rdrname) + { + fprintf (stderr, PGM": error allocating memory for reader name\n"); + exit (1); + } + strcpy (current_rdrname, portstr && *portstr? portstr:list); + free (list); + + err = pcsc_connect (pcsc_context, + current_rdrname, + PCSC_SHARE_EXCLUSIVE, + PCSC_PROTOCOL_T0|PCSC_PROTOCOL_T1, + &pcsc_card, + &pcsc_protocol); + if (err == 0x8010000c) /* No smartcard. */ + { + pcsc_card = 0; + } + else if (err) + { + fprintf (stderr, PGM": pcsc_connect failed: %s (0x%lx)\n", + pcsc_error_string (err), err); + pcsc_release_context (pcsc_context); + free (current_rdrname); + current_rdrname = NULL; + request_failed (err); + return; + } + + current_atrlen = 0; + if (!err) + { + char reader[250]; + unsigned long readerlen; + + atrlen = 33; + readerlen = sizeof reader -1; + err = pcsc_status (pcsc_card, + reader, &readerlen, + &card_state, &card_protocol, + atr, &atrlen); + if (err) + fprintf (stderr, PGM": pcsc_status failed: %s (0x%lx)\n", + pcsc_error_string (err), err); + else + { + if (atrlen >= sizeof atr || atrlen >= sizeof current_atr) + { + fprintf (stderr, PGM": ATR returned by pcsc_status" + " is too large\n"); + exit (4); + } + memcpy (current_atr, atr, atrlen); + current_atrlen = atrlen; + } + } + + driver_is_open = 1; + request_succeeded (current_atr, current_atrlen); +} + + + +/* Handle a close request. We expect no arguments. We may modifiy + ARGBUF. */ +static void +handle_close (unsigned char *argbuf, size_t arglen) +{ + if (!driver_is_open) + { + fprintf (stderr, PGM ": PC/SC has not yet been opened\n"); + request_failed (-1); + return; + } + + free (current_rdrname); + current_rdrname = NULL; + pcsc_release_context (pcsc_context); + + request_succeeded (NULL, 0); +} + + + +/* Handle a status request. We expect no arguments. We may modifiy + ARGBUF. */ +static void +handle_status (unsigned char *argbuf, size_t arglen) +{ + long err; + struct pcsc_readerstate_s rdrstates[1]; + int status; + unsigned char buf[20]; + + if (!driver_is_open) + { + fprintf (stderr, PGM ": PC/SC has not yet been opened\n"); + request_failed (-1); + return; + } + + memset (rdrstates, 0, sizeof *rdrstates); + rdrstates[0].reader = current_rdrname; + rdrstates[0].current_state = PCSC_STATE_UNAWARE; + err = pcsc_get_status_change (pcsc_context, + 0, + rdrstates, 1); + if (err == 0x8010000a) /* Timeout. */ + err = 0; + if (err) + { + fprintf (stderr, PGM": pcsc_get_status_change failed: %s (0x%lx)\n", + pcsc_error_string (err), err); + request_failed (err); + return; + } + + 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; + + /* First word is identical to the one used by apdu.c. */ + buf[0] = 0; + buf[1] = 0; + buf[2] = 0; + buf[3] = status; + /* The second word is the native PCSC state. */ + buf[4] = (rdrstates[0].event_state >> 24); + buf[5] = (rdrstates[0].event_state >> 16); + buf[6] = (rdrstates[0].event_state >> 8); + buf[7] = (rdrstates[0].event_state >> 0); + /* The third word is the protocol. */ + buf[8] = (pcsc_protocol >> 24); + buf[9] = (pcsc_protocol >> 16); + buf[10] = (pcsc_protocol >> 8); + buf[11] = (pcsc_protocol); + + request_succeeded (buf, 8); +} + + +/* Handle a reset request. We expect no arguments. We may modifiy + ARGBUF. */ +static void +handle_reset (unsigned char *argbuf, size_t arglen) +{ + long err; + char reader[250]; + unsigned long nreader, atrlen; + unsigned long card_state, card_protocol; + + if (!driver_is_open) + { + fprintf (stderr, PGM ": PC/SC has not yet been opened\n"); + request_failed (-1); + return; + } + + if (pcsc_card) + { + err = pcsc_disconnect (pcsc_card, PCSC_LEAVE_CARD); + if (err) + { + fprintf (stderr, PGM": pcsc_disconnect failed: %s (0x%lx)\n", + pcsc_error_string (err), err); + request_failed (err); + return; + } + pcsc_card = 0; + } + + err = pcsc_connect (pcsc_context, + current_rdrname, + PCSC_SHARE_EXCLUSIVE, + PCSC_PROTOCOL_T0|PCSC_PROTOCOL_T1, + &pcsc_card, + &pcsc_protocol); + if (err) + { + fprintf (stderr, PGM": pcsc_connect failed: %s (0x%lx)\n", + pcsc_error_string (err), err); + pcsc_card = 0; + request_failed (err); + return; + } + + + atrlen = 33; + nreader = sizeof reader - 1; + err = pcsc_status (pcsc_card, + reader, &nreader, + &card_state, &card_protocol, + current_atr, &atrlen); + if (err) + { + fprintf (stderr, PGM": pcsc_status failed: %s (0x%lx)\n", + pcsc_error_string (err), err); + current_atrlen = 0; + request_failed (err); + return; + } + + request_succeeded (current_atr, current_atrlen); +} + + + +/* Handle a transmit request. The argument is expected to be a buffer + with the APDU. We may modifiy ARGBUF. */ +static void +handle_transmit (unsigned char *argbuf, size_t arglen) +{ + long err; + struct pcsc_io_request_s send_pci; + unsigned long recv_len; + unsigned char buffer[1024]; + + /* The apdu should at least be one byte. */ + if (!arglen) + bad_request ("TRANSMIT"); + + if (!driver_is_open) + { + fprintf (stderr, PGM ": PC/SC has not yet been opened\n"); + request_failed (-1); + return; + } + if ((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 = sizeof (buffer); + err = pcsc_transmit (pcsc_card, &send_pci, argbuf, arglen, + NULL, buffer, &recv_len); + if (err) + { + if (verbose) + fprintf (stderr, PGM": pcsc_transmit failed: %s (0x%lx)\n", + pcsc_error_string (err), err); + request_failed (err); + return; + } + request_succeeded (buffer, recv_len); +} + + + +static void +print_version (int with_help) +{ + fputs (MYVERSION_LINE "\n" + "Copyright (C) 2004 Free Software Foundation, Inc.\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.\n", + stdout); + + if (with_help) + fputs ("\n" + "Usage: " PGM " [OPTIONS] API-NUMBER [LIBNAME]\n" + "Helper to connect scdaemon to the PC/SC library\n" + "\n" + " --verbose enable extra informational output\n" + " --version print version of the program and exit\n" + " --help display this help and exit\n" + BUGREPORT_LINE, stdout ); + + exit (0); +} + + +int +main (int argc, char **argv) +{ + int last_argc = -1; + int api_number = 0; + int c; + + if (argc) + { + argc--; argv++; + } + while (argc && last_argc != argc ) + { + last_argc = argc; + if (!strcmp (*argv, "--")) + { + argc--; argv++; + break; + } + else if (!strcmp (*argv, "--version")) + print_version (0); + else if (!strcmp (*argv, "--help")) + print_version (1); + else if (!strcmp (*argv, "--verbose")) + { + verbose = 1; + argc--; argv++; + } + } + if (argc != 1 && argc != 2) + { + fprintf (stderr, "usage: " PGM " API-NUMBER [LIBNAME]\n"); + exit (1); + } + + api_number = atoi (*argv); + argv++; argc--; + if (api_number != 1) + { + fprintf (stderr, PGM ": api-number %d is not valid\n", api_number); + exit (1); + } + + load_pcsc_driver (argc? *argv : DEFAULT_PCSC_DRIVER); + + while ((c = getc (stdin)) != EOF) + { + size_t arglen; + unsigned char argbuffer[2048]; + + arglen = read_32 (stdin); + if (arglen >= sizeof argbuffer - 1) + { + fprintf (stderr, PGM ": request too long\n"); + exit (1); + } + if (arglen && fread (argbuffer, arglen, 1, stdin) != 1) + { + fprintf (stderr, PGM ": error reading request: %s\n", + strerror (errno)); + exit (1); + } + argbuffer[arglen] = 0; + switch (c) + { + case 1: + handle_open (argbuffer, arglen); + break; + + case 2: + handle_close (argbuffer, arglen); + exit (0); + break; + + case 3: + handle_transmit (argbuffer, arglen); + break; + + case 4: + handle_status (argbuffer, arglen); + break; + + case 5: + handle_reset (argbuffer, arglen); + break; + + default: + fprintf (stderr, PGM ": invalid request 0x%02X\n", c); + exit (1); + } + } + return 0; +} + + + +/* +Local Variables: +compile-command: "gcc -Wall -g -o pcsc-wrapper pcsc-wrapper.c -ldl" +End: +*/ diff --git a/scd/sc-copykeys.c b/scd/sc-copykeys.c new file mode 100644 index 000000000..395b4625a --- /dev/null +++ b/scd/sc-copykeys.c @@ -0,0 +1,736 @@ +/* sc-copykeys.c - A tool to store keys on a smartcard. + * 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 <stdlib.h> +#include <string.h> +#include <assert.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> + +#define JNLIB_NEED_LOG_LOGV +#include "scdaemon.h" +#include <gcrypt.h> + +#include "../common/ttyio.h" +#include "../common/simple-pwquery.h" +#include "apdu.h" /* for open_reader */ +#include "atr.h" +#include "app-common.h" + +#define _(a) (a) + + +enum cmd_and_opt_values +{ oVerbose = 'v', + oReaderPort = 500, + octapiDriver, + oDebug, + oDebugAll, + +aTest }; + + +static ARGPARSE_OPTS opts[] = { + + { 301, NULL, 0, "@Options:\n " }, + + { oVerbose, "verbose", 0, "verbose" }, + { oReaderPort, "reader-port", 2, "|N|connect to reader at port N"}, + { octapiDriver, "ctapi-driver", 2, "NAME|use NAME as ctAPI driver"}, + { oDebug, "debug" ,4|16, "set debugging flags"}, + { oDebugAll, "debug-all" ,0, "enable full debugging"}, + {0} +}; + + +static void copykeys (APP app, const char *fname); + + +static const char * +my_strusage (int level) +{ + const char *p; + switch (level) + { + case 11: p = "sc-copykeys (GnuPG)"; + break; + case 13: p = VERSION; break; + case 17: p = PRINTABLE_OS_NAME; break; + case 19: p = _("Please report bugs to <" PACKAGE_BUGREPORT ">.\n"); + break; + case 1: + case 40: p = _("Usage: sc-copykeys [options] (-h for help)\n"); + break; + case 41: p = _("Syntax: sc-copykeys [options] " + "file-with-key\n" + "Copy keys to a smartcards\n"); + break; + + default: p = NULL; + } + return p; +} + +/* Used by gcry for logging */ +static void +my_gcry_logger (void *dummy, int level, const char *fmt, va_list arg_ptr) +{ + /* translate the log levels */ + switch (level) + { + case GCRY_LOG_CONT: level = JNLIB_LOG_CONT; break; + case GCRY_LOG_INFO: level = JNLIB_LOG_INFO; break; + case GCRY_LOG_WARN: level = JNLIB_LOG_WARN; break; + case GCRY_LOG_ERROR:level = JNLIB_LOG_ERROR; break; + case GCRY_LOG_FATAL:level = JNLIB_LOG_FATAL; break; + case GCRY_LOG_BUG: level = JNLIB_LOG_BUG; break; + case GCRY_LOG_DEBUG:level = JNLIB_LOG_DEBUG; break; + default: level = JNLIB_LOG_ERROR; break; + } + log_logv (level, fmt, arg_ptr); +} + + +int +main (int argc, char **argv ) +{ + ARGPARSE_ARGS pargs; + int slot, rc; + const char *reader_port = NULL; + struct app_ctx_s appbuf; + + memset (&appbuf, 0, sizeof appbuf); + + set_strusage (my_strusage); + gcry_control (GCRYCTL_SUSPEND_SECMEM_WARN); + log_set_prefix ("sc-copykeys", 1); + + /* check that the libraries are suitable. Do it here because + the option parsing may need services of the library */ + if (!gcry_check_version (NEED_LIBGCRYPT_VERSION) ) + { + log_fatal( _("libgcrypt is too old (need %s, have %s)\n"), + NEED_LIBGCRYPT_VERSION, gcry_check_version (NULL) ); + } + + gcry_set_log_handler (my_gcry_logger, NULL); + gcry_control (GCRYCTL_DISABLE_SECMEM, 0); /* FIXME - we want to use it */ + /* FIXME? gcry_control (GCRYCTL_USE_SECURE_RNDPOOL);*/ + + pargs.argc = &argc; + pargs.argv = &argv; + pargs.flags= 1; /* do not remove the args */ + while (arg_parse (&pargs, opts) ) + { + switch (pargs.r_opt) + { + case oVerbose: opt.verbose++; break; + case oDebug: opt.debug |= pargs.r.ret_ulong; break; + case oDebugAll: opt.debug = ~0; break; + case oReaderPort: reader_port = pargs.r.ret_str; break; + case octapiDriver: opt.ctapi_driver = pargs.r.ret_str; break; + default : pargs.err = 2; break; + } + } + if (log_get_errorcount(0)) + exit(2); + + if (argc != 1) + usage (1); + + slot = apdu_open_reader (reader_port); + if (slot == -1) + exit (1); + + /* FIXME: Use select_application. */ + appbuf.slot = slot; + rc = app_select_openpgp (&appbuf); + if (rc) + { + log_error ("selecting openpgp failed: %s\n", gpg_strerror (rc)); + exit (1); + } + appbuf.initialized = 1; + log_info ("openpgp application selected\n"); + + copykeys (&appbuf, *argv); + + + return 0; +} + + + +void +send_status_info (CTRL ctrl, const char *keyword, ...) +{ + /* DUMMY */ +} + + + +static char * +read_file (const char *fname, size_t *r_length) +{ + FILE *fp; + struct stat st; + char *buf; + size_t buflen; + + fp = fname? fopen (fname, "rb") : stdin; + if (!fp) + { + log_error ("can't open `%s': %s\n", + fname? fname: "[stdin]", strerror (errno)); + return NULL; + } + + if (fstat (fileno(fp), &st)) + { + log_error ("can't stat `%s': %s\n", + fname? fname: "[stdin]", strerror (errno)); + if (fname) + fclose (fp); + return NULL; + } + + buflen = st.st_size; + buf = xmalloc (buflen+1); + if (fread (buf, buflen, 1, fp) != 1) + { + log_error ("error reading `%s': %s\n", + fname? fname: "[stdin]", strerror (errno)); + if (fname) + fclose (fp); + xfree (buf); + return NULL; + } + if (fname) + fclose (fp); + + *r_length = buflen; + return buf; +} + + +static gcry_sexp_t +read_key (const char *fname) +{ + char *buf; + size_t buflen; + gcry_sexp_t private; + int rc; + + buf = read_file (fname, &buflen); + if (!buf) + return NULL; + + rc = gcry_sexp_new (&private, buf, buflen, 1); + if (rc) + { + log_error ("gcry_sexp_new failed: %s\n", gpg_strerror (rc)); + return NULL; + } + xfree (buf); + + return private; +} + + + +static gcry_mpi_t * +sexp_to_kparms (gcry_sexp_t sexp, unsigned long *created) +{ + gcry_sexp_t list, l2; + const char *name; + const char *s; + size_t n; + int i, idx; + const char *elems; + gcry_mpi_t *array; + + *created = 0; + list = gcry_sexp_find_token (sexp, "private-key", 0 ); + if(!list) + return NULL; + + /* quick hack to get the creation time. */ + l2 = gcry_sexp_find_token (list, "created", 0); + if (l2 && (name = gcry_sexp_nth_data (l2, 1, &n))) + { + char *tmp = xmalloc (n+1); + memcpy (tmp, name, n); + tmp[n] = 0; + *created = strtoul (tmp, NULL, 10); + xfree (tmp); + } + gcry_sexp_release (l2); + l2 = gcry_sexp_cadr (list); + gcry_sexp_release (list); + list = l2; + name = gcry_sexp_nth_data (list, 0, &n); + if(!name || n != 3 || memcmp (name, "rsa", 3)) + { + gcry_sexp_release (list); + return NULL; + } + + /* Parameter names used with RSA. */ + elems = "nedpqu"; + array = xcalloc (strlen(elems) + 1, sizeof *array); + for (idx=0, s=elems; *s; s++, idx++ ) + { + l2 = gcry_sexp_find_token (list, s, 1); + if (!l2) + { + for (i=0; i<idx; i++) + gcry_mpi_release (array[i]); + xfree (array); + gcry_sexp_release (list); + return NULL; /* required parameter not found */ + } + array[idx] = gcry_sexp_nth_mpi (l2, 1, GCRYMPI_FMT_USG); + gcry_sexp_release (l2); + if (!array[idx]) + { + for (i=0; i<idx; i++) + gcry_mpi_release (array[i]); + xfree (array); + gcry_sexp_release (list); + return NULL; /* required parameter is invalid */ + } + } + + gcry_sexp_release (list); + return array; +} + + +/* 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); +} + + +static void +show_sha1_fpr (const unsigned char *fpr) +{ + int i; + + if (fpr) + { + for (i=0; i < 20 ; i+=2, fpr += 2 ) + { + if (i == 10 ) + tty_printf (" "); + tty_printf (" %02X%02X", *fpr, fpr[1]); + } + } + else + tty_printf (" [none]"); + tty_printf ("\n"); +} + +/* Query the card, show a list of already stored keys and ask the user + where to store the key. Returns the key number or 0 for cancel + operation. */ +static int +query_card (APP app) +{ + int keyno = 0; + char *serialno, *disp_name, *pubkey_url; + unsigned char *fpr1, *fpr2, *fpr3; + + + if (app_openpgp_cardinfo (app, + &serialno, + &disp_name, + &pubkey_url, + &fpr1, &fpr2, &fpr3)) + return 0; + + + for (;;) + { + char *answer; + + tty_printf ("\n"); + + tty_printf ("Serial number ....: %s\n", + serialno? serialno : "[none]"); + tty_printf ("Name of cardholder: %s\n", + disp_name && *disp_name? disp_name : "[not set]"); + tty_printf ("URL of public key : %s\n", + pubkey_url && *pubkey_url? pubkey_url : "[not set]"); + tty_printf ("Signature key ....:"); + show_sha1_fpr (fpr1); + tty_printf ("Encryption key....:"); + show_sha1_fpr (fpr2); + tty_printf ("Authentication key:"); + show_sha1_fpr (fpr3); + + tty_printf ("\n" + "1 - store as signature key and reset usage counter\n" + "2 - store as encryption key\n" + "3 - store as authentication key\n" + "Q - quit\n" + "\n"); + + answer = tty_get("Your selection? "); + tty_kill_prompt(); + if (strlen (answer) != 1) + ; + else if ( *answer == '1' ) + { + if ( (fpr1 && !fpr_is_zero (fpr1)) ) + { + tty_printf ("\n"); + log_error ("WARNING: signature key does already exists!\n"); + tty_printf ("\n"); + if ( tty_get_answer_is_yes ("Replace existing key? ") ) + { + keyno = 1; + break; + } + } + else + { + keyno = 1; + break; + } + } + else if ( *answer == '2' ) + { + if ( (fpr2 && !fpr_is_zero (fpr2)) ) + { + tty_printf ("\n"); + log_error ("WARNING: encryption key does already exists!\n"); + tty_printf ("\n"); + if ( tty_get_answer_is_yes ("Replace existing key? ") ) + { + keyno = 2; + break; + } + } + else + { + keyno = 2; + break; + } + } + else if ( *answer == '3' ) + { + if ( (fpr3 && !fpr_is_zero (fpr3)) ) + { + tty_printf ("\n"); + log_error ("WARNING: authentication key does already exists!\n"); + tty_printf ("\n"); + if ( tty_get_answer_is_yes ("Replace existing key? ") ) + { + keyno = 3; + break; + } + } + else + { + keyno = 3; + break; + } + } + else if ( *answer == 'q' || *answer == 'Q') + { + keyno = 0; + break; + } + } + + xfree (serialno); + xfree (disp_name); + xfree (pubkey_url); + xfree (fpr1); + xfree (fpr2); + xfree (fpr3); + + return keyno; +} + + +/* Callback function to ask for a PIN. */ +static gpg_error_t +pincb (void *arg, const char *prompt, char **pinvalue) +{ + char *pin = xstrdup ("12345678"); + +/* pin = simple_pwquery (NULL, NULL, prompt, */ +/* "We need the admin's PIN to store the key on the card", */ +/* NULL); */ +/* if (!pin) */ +/* return gpg_error (GPG_ERR_CANCELED); */ + + + + *pinvalue = pin; + return 0; +} + + +/* This function expects a file (or NULL for stdin) with the secret + and public key parameters. This file should consist of an + S-expression as used by gpg-agent. Only the unprotected format is + supported. Example: + + (private-key + (rsa + (n #00e0ce9..[some bytes not shown]..51#) + (e #010001#) + (d #046129F..[some bytes not shown]..81#) + (p #00e861b..[some bytes not shown]..f1#) + (q #00f7a7c..[some bytes not shown]..61#) + (u #304559a..[some bytes not shown]..9b#)) + (uri http://foo.bar x-foo:whatever_you_want)) + +*/ +static void +copykeys (APP app, const char *fname) +{ + int rc; + gcry_sexp_t private; + gcry_mpi_t *mpis, rsa_n, rsa_e, rsa_p, rsa_q; + unsigned int nbits; + size_t n; + unsigned char *template, *tp; + unsigned char m[128], e[4]; + size_t mlen, elen; + unsigned long creation_date; + time_t created_at; + int keyno; + + if (!strcmp (fname, "-")) + fname = NULL; + + private = read_key (fname); + if (!private) + exit (1); + + mpis = sexp_to_kparms (private, &creation_date); + if (!creation_date) + { + log_info ("no creation date found - assuming current date\n"); + created_at = time (NULL); + } + else + created_at = creation_date; + gcry_sexp_release (private); + if (!mpis) + { + log_error ("invalid structure of key file or not RSA\n"); + exit (1); + } + /* MPIS is now an array with the key parameters as defined by OpenPGP. */ + rsa_n = mpis[0]; + rsa_e = mpis[1]; + gcry_mpi_release (mpis[2]); + rsa_p = mpis[3]; + rsa_q = mpis[4]; + gcry_mpi_release (mpis[5]); + xfree (mpis); + + nbits = gcry_mpi_get_nbits (rsa_e); + if (nbits < 2 || nbits > 32) + { + log_error ("public exponent too large (more than 32 bits)\n"); + goto failure; + } + nbits = gcry_mpi_get_nbits (rsa_p); + if (nbits != 512) + { + log_error ("length of first RSA prime is not 512\n"); + goto failure; + } + nbits = gcry_mpi_get_nbits (rsa_q); + if (nbits != 512) + { + log_error ("length of second RSA prime is not 512\n"); + goto failure; + } + + nbits = gcry_mpi_get_nbits (rsa_n); + if (nbits != 1024) + { + log_error ("length of RSA modulus is not 1024\n"); + goto failure; + } + + keyno = query_card (app); + if (!keyno) + goto failure; + + /* Build the private key template as described in section 4.3.3.6 of + the specs. + 0xC0 <length> public exponent + 0xC1 <length> prime p + 0xC2 <length> prime q */ + template = tp = xmalloc (1+2 + 1+1+4 + 1+1+64 + 1+1+64); + *tp++ = 0xC0; + *tp++ = 4; + rc = gcry_mpi_print (GCRYMPI_FMT_USG, tp, 4, &n, rsa_e); + if (rc) + { + log_error ("mpi_print failed: %s\n", gpg_strerror (rc)); + goto failure; + } + assert (n <= 4); + memcpy (e, tp, n); + elen = n; + if (n != 4) + { + memmove (tp+4-n, tp, 4-n); + memset (tp, 0, 4-n); + } + tp += 4; + + *tp++ = 0xC1; + *tp++ = 64; + rc = gcry_mpi_print (GCRYMPI_FMT_USG, tp, 64, &n, rsa_p); + if (rc) + { + log_error ("mpi_print failed: %s\n", gpg_strerror (rc)); + goto failure; + } + assert (n == 64); + tp += 64; + + *tp++ = 0xC2; + *tp++ = 64; + rc = gcry_mpi_print (GCRYMPI_FMT_USG, tp, 64, &n, rsa_q); + if (rc) + { + log_error ("mpi_print failed: %s\n", gpg_strerror (rc)); + goto failure; + } + assert (n == 64); + tp += 64; + assert (tp - template == 138); + + /* (we need the modulus to calculate the fingerprint) */ + rc = gcry_mpi_print (GCRYMPI_FMT_USG, m, 128, &n, rsa_n); + if (rc) + { + log_error ("mpi_print failed: %s\n", gpg_strerror (rc)); + goto failure; + } + assert (n == 128); + mlen = 128; + + + rc = app_openpgp_storekey (app, keyno, + template, tp - template, + created_at, + m, mlen, + e, elen, + pincb, NULL); + + if (rc) + { + log_error ("error storing key: %s\n", gpg_strerror (rc)); + goto failure; + } + log_info ("key successfully stored\n"); + { + unsigned char *mm, *ee; + size_t mmlen, eelen; + int i; + + rc = app_openpgp_readkey (app, keyno, &mm, &mmlen, &ee, &eelen); + if (rc) + { + log_error ("error reading key back: %s\n", gpg_strerror (rc)); + goto failure; + } + + /* Strip leading zeroes. */ + for (i=0; i < mmlen && !mm[i]; i++) + ; + mmlen -= i; + memmove (mm, mm+i, mmlen); + for (i=0; i < eelen && !ee[i]; i++) + ; + eelen -= i; + memmove (ee, ee+i, eelen); + + if (eelen != elen || mmlen != mlen) + { + log_error ("key parameter length mismatch (n=%u/%u, e=%u/%u)\n", + (unsigned int)mlen, (unsigned int)mmlen, + (unsigned int)elen, (unsigned int)eelen); + xfree (mm); + xfree (ee); + goto failure; + } + + if (memcmp (m, mm, mlen)) + { + log_error ("key parameter n mismatch\n"); + log_printhex ("original n: ", m, mlen); + log_printhex (" copied n: ", mm, mlen); + xfree (mm); + xfree (ee); + goto failure; + } + if (memcmp (e, ee, elen)) + { + log_error ("key parameter e mismatch\n"); + log_printhex ("original e: ", e, elen); + log_printhex (" copied e: ", ee, elen); + xfree (mm); + xfree (ee); + goto failure; + } + xfree (mm); + xfree (ee); + } + + + gcry_mpi_release (rsa_e); + gcry_mpi_release (rsa_p); + gcry_mpi_release (rsa_q); + gcry_mpi_release (rsa_n); + return; + + failure: + gcry_mpi_release (rsa_e); + gcry_mpi_release (rsa_p); + gcry_mpi_release (rsa_q); + gcry_mpi_release (rsa_n); + exit (1); +} + + diff --git a/scd/scdaemon.c b/scd/scdaemon.c new file mode 100644 index 000000000..b11cc7a91 --- /dev/null +++ b/scd/scdaemon.c @@ -0,0 +1,1168 @@ +/* scdaemon.c - The GnuPG Smartcard Daemon + * Copyright (C) 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 <stddef.h> +#include <stdarg.h> +#include <string.h> +#include <errno.h> +#include <assert.h> +#include <time.h> +#include <fcntl.h> +#ifndef HAVE_W32_SYSTEM +#include <sys/socket.h> +#include <sys/un.h> +#endif /*HAVE_W32_SYSTEM*/ +#include <unistd.h> +#include <signal.h> +#include <pth.h> + +#define JNLIB_NEED_LOG_LOGV +#include "scdaemon.h" +#include <ksba.h> +#include <gcrypt.h> + +#include <assuan.h> /* malloc hooks */ + +#include "i18n.h" +#include "sysutils.h" +#include "app-common.h" +#ifdef HAVE_W32_SYSTEM +#include "../jnlib/w32-afunix.h" +#endif +#include "ccid-driver.h" +#include "mkdtemp.h" + +enum cmd_and_opt_values +{ aNull = 0, + oCsh = 'c', + oQuiet = 'q', + oSh = 's', + oVerbose = 'v', + + oNoVerbose = 500, + aGPGConfList, + oOptions, + oDebug, + oDebugAll, + oDebugLevel, + oDebugWait, + oDebugAllowCoreDump, + oDebugCCIDDriver, + oNoGreeting, + oNoOptions, + oHomedir, + oNoDetach, + oNoGrab, + oLogFile, + oServer, + oMultiServer, + oDaemon, + oBatch, + oReaderPort, + octapiDriver, + opcscDriver, + oDisableCCID, + oDisableOpenSC, + oDisableKeypad, + oAllowAdmin, + oDenyAdmin, + oDisableApplication, + oDebugDisableTicker +}; + + + +static ARGPARSE_OPTS opts[] = { + + { aGPGConfList, "gpgconf-list", 256, "@" }, + + { 301, NULL, 0, N_("@Options:\n ") }, + + { oServer, "server", 0, N_("run in server mode (foreground)") }, + { oMultiServer, "multi-server", 0, + N_("run in multi server mode (foreground)") }, + { oDaemon, "daemon", 0, N_("run in daemon mode (background)") }, + { oVerbose, "verbose", 0, N_("verbose") }, + { oQuiet, "quiet", 0, N_("be somewhat more quiet") }, + { oSh, "sh", 0, N_("sh-style command output") }, + { oCsh, "csh", 0, N_("csh-style command output") }, + { oOptions, "options" , 2, N_("read options from file")}, + { oDebug, "debug" ,4|16, "@"}, + { oDebugAll, "debug-all" ,0, "@"}, + { oDebugLevel, "debug-level" ,2, "@"}, + { oDebugWait,"debug-wait",1, "@"}, + { oDebugAllowCoreDump, "debug-allow-core-dump", 0, "@" }, + { oDebugCCIDDriver, "debug-ccid-driver", 0, "@"}, + { oDebugDisableTicker, "debug-disable-ticker", 0, "@"}, + { oNoDetach, "no-detach" ,0, N_("do not detach from the console")}, + { oLogFile, "log-file" ,2, N_("use a log file for the server")}, + { oReaderPort, "reader-port", 2, N_("|N|connect to reader at port N")}, + { octapiDriver, "ctapi-driver", 2, N_("|NAME|use NAME as ct-API driver")}, + { opcscDriver, "pcsc-driver", 2, N_("|NAME|use NAME as PC/SC driver")}, + { oDisableCCID, "disable-ccid", 0, +#ifdef HAVE_LIBUSB + N_("do not use the internal CCID driver") +#else + "@" +#endif + /* end --disable-ccid */}, + { oDisableKeypad, "disable-keypad", 0, N_("do not use a reader's keypad")}, + { oAllowAdmin, "allow-admin", 0, N_("allow the use of admin card commands")}, + { oDenyAdmin, "deny-admin", 0, "@" }, + { oDisableApplication, "disable-application", 2, "@"}, + + {0} +}; + + +/* The card dirver we use by default for PC/SC. */ +#if defined(HAVE_W32_SYSTEM) || defined(__CYGWIN__) +#define DEFAULT_PCSC_DRIVER "winscard.dll" +#elif defined(__GLIBC__) +#define DEFAULT_PCSC_DRIVER "libpcsclite.so.1" +#else +#define DEFAULT_PCSC_DRIVER "libpcsclite.so" +#endif + + +/* Flag to indicate that a shutdown was requested. */ +static int shutdown_pending; + +/* It is possible that we are currently running under setuid permissions */ +static int maybe_setuid = 1; + +/* Name of the communication socket */ +static char *socket_name; + + +/* Debug flag to disable the ticker. The ticker is in fact not + disabled but it won't perform any ticker specific actions. */ +static int ticker_disabled; + + + +static char *create_socket_name (int use_standard_socket, + char *standard_name, char *template); +static int create_server_socket (int is_standard_name, const char *name); + +static void *start_connection_thread (void *arg); +static void handle_connections (int listen_fd); + +/* Pth wrapper function definitions. */ +GCRY_THREAD_OPTION_PTH_IMPL; + + + +static const char * +my_strusage (int level) +{ + const char *p; + switch (level) + { + case 11: p = "scdaemon (GnuPG)"; + break; + case 13: p = VERSION; break; + case 17: p = PRINTABLE_OS_NAME; break; + case 19: p = _("Please report bugs to <" PACKAGE_BUGREPORT ">.\n"); + break; + case 1: + case 40: p = _("Usage: scdaemon [options] (-h for help)"); + break; + case 41: p = _("Syntax: scdaemon [options] [command [args]]\n" + "Smartcard daemon for GnuPG\n"); + break; + + default: p = NULL; + } + return p; +} + + + +static void +i18n_init (void) +{ +#ifdef USE_SIMPLE_GETTEXT + set_gettext_file( PACKAGE_GT ); +#else +#ifdef ENABLE_NLS + setlocale (LC_ALL, ""); + bindtextdomain (PACKAGE_GT, LOCALEDIR); + textdomain (PACKAGE_GT); +#endif +#endif +} + + + +/* Used by gcry for logging */ +static void +my_gcry_logger (void *dummy, int level, const char *fmt, va_list arg_ptr) +{ + /* translate the log levels */ + switch (level) + { + case GCRY_LOG_CONT: level = JNLIB_LOG_CONT; break; + case GCRY_LOG_INFO: level = JNLIB_LOG_INFO; break; + case GCRY_LOG_WARN: level = JNLIB_LOG_WARN; break; + case GCRY_LOG_ERROR:level = JNLIB_LOG_ERROR; break; + case GCRY_LOG_FATAL:level = JNLIB_LOG_FATAL; break; + case GCRY_LOG_BUG: level = JNLIB_LOG_BUG; break; + case GCRY_LOG_DEBUG:level = JNLIB_LOG_DEBUG; break; + default: level = JNLIB_LOG_ERROR; break; + } + log_logv (level, fmt, arg_ptr); +} + + +/* Setup the debugging. With a LEVEL of NULL only the active debug + flags are propagated to the subsystems. With LEVEL set, a specific + set of debug flags is set; thus overriding all flags already + set. */ +static void +set_debug (const char *level) +{ + if (!level) + ; + else if (!strcmp (level, "none")) + opt.debug = 0; + else if (!strcmp (level, "basic")) + opt.debug = DBG_ASSUAN_VALUE; + else if (!strcmp (level, "advanced")) + opt.debug = DBG_ASSUAN_VALUE|DBG_COMMAND_VALUE; + else if (!strcmp (level, "expert")) + opt.debug = (DBG_ASSUAN_VALUE|DBG_COMMAND_VALUE + |DBG_CACHE_VALUE|DBG_CARD_IO_VALUE); + else if (!strcmp (level, "guru")) + opt.debug = ~0; + else + { + log_error (_("invalid debug-level `%s' given\n"), level); + scd_exit(2); + } + + + if (opt.debug && !opt.verbose) + opt.verbose = 1; + if (opt.debug && opt.quiet) + opt.quiet = 0; + + if (opt.debug & DBG_MPI_VALUE) + gcry_control (GCRYCTL_SET_DEBUG_FLAGS, 2); + if (opt.debug & DBG_CRYPTO_VALUE ) + gcry_control (GCRYCTL_SET_DEBUG_FLAGS, 1); + gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose); +} + + + +static void +cleanup (void) +{ + if (socket_name && *socket_name) + { + char *p; + + remove (socket_name); + p = strrchr (socket_name, '/'); + if (p) + { + *p = 0; + rmdir (socket_name); + *p = '/'; + } + *socket_name = 0; + } +} + + + +int +main (int argc, char **argv ) +{ + ARGPARSE_ARGS pargs; + int orig_argc; + gpg_error_t err; + int may_coredump; + char **orig_argv; + FILE *configfp = NULL; + char *configname = NULL; + const char *shell; + unsigned configlineno; + int parse_debug = 0; + const char *debug_level = NULL; + int default_config =1; + int greeting = 0; + int nogreeting = 0; + int pipe_server = 0; + int multi_server = 0; + int is_daemon = 0; + int nodetach = 0; + int csh_style = 0; + char *logfile = NULL; + int debug_wait = 0; + int gpgconf_list = 0; + const char *config_filename = NULL; + int allow_coredump = 0; + + set_strusage (my_strusage); + gcry_control (GCRYCTL_SUSPEND_SECMEM_WARN); + /* Please note that we may running SUID(ROOT), so be very CAREFUL + when adding any stuff between here and the call to INIT_SECMEM() + somewhere after the option parsing */ + log_set_prefix ("scdaemon", 1|4); + /* Try to auto set the character set. */ + set_native_charset (NULL); + + i18n_init (); + + /* Libgcrypt requires us to register the threading model first. + Note that this will also do the pth_init. */ + err = gcry_control (GCRYCTL_SET_THREAD_CBS, &gcry_threads_pth); + if (err) + { + log_fatal ("can't register GNU Pth with Libgcrypt: %s\n", + gpg_strerror (err)); + } + + /* Check that the libraries are suitable. Do it here because + the option parsing may need services of the library */ + if (!gcry_check_version (NEED_LIBGCRYPT_VERSION) ) + { + log_fatal( _("libgcrypt is too old (need %s, have %s)\n"), + NEED_LIBGCRYPT_VERSION, gcry_check_version (NULL) ); + } + + ksba_set_malloc_hooks (gcry_malloc, gcry_realloc, gcry_free); + + assuan_set_malloc_hooks (gcry_malloc, gcry_realloc, gcry_free); + assuan_set_assuan_log_stream (log_get_stream ()); + assuan_set_assuan_log_prefix (log_get_prefix (NULL)); + + gcry_set_log_handler (my_gcry_logger, NULL); + gcry_control (GCRYCTL_USE_SECURE_RNDPOOL); + + may_coredump = disable_core_dumps (); + + /* Set default options. */ + opt.pcsc_driver = DEFAULT_PCSC_DRIVER; + + + shell = getenv ("SHELL"); + if (shell && strlen (shell) >= 3 && !strcmp (shell+strlen (shell)-3, "csh") ) + csh_style = 1; + + opt.homedir = default_homedir (); + + /* 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) + opt.homedir = pargs.r.ret_str; + } + + /* initialize the secure memory. */ + gcry_control (GCRYCTL_INIT_SECMEM, 16384, 0); + maybe_setuid = 0; + + /* + Now we are working under our real uid + */ + + + if (default_config) + configname = make_filename (opt.homedir, "scdaemon.conf", NULL ); + + + argc = orig_argc; + argv = orig_argv; + pargs.argc = &argc; + pargs.argv = &argv; + pargs.flags= 1; /* do not remove the args */ + next_pass: + if (configname) + { + configlineno = 0; + configfp = fopen (configname, "r"); + 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) ); + 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 aGPGConfList: gpgconf_list = 1; break; + case oQuiet: opt.quiet = 1; break; + case oVerbose: opt.verbose++; break; + case oBatch: opt.batch=1; break; + + case oDebug: opt.debug |= pargs.r.ret_ulong; break; + case oDebugAll: opt.debug = ~0; break; + case oDebugLevel: debug_level = pargs.r.ret_str; break; + case oDebugWait: debug_wait = pargs.r.ret_int; break; + case oDebugAllowCoreDump: + enable_core_dumps (); + allow_coredump = 1; + break; + case oDebugCCIDDriver: +#ifdef HAVE_LIBUSB + ccid_set_debug_level (ccid_set_debug_level (-1)+1); +#endif /*HAVE_LIBUSB*/ + break; + case oDebugDisableTicker: ticker_disabled = 1; 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 oNoGreeting: nogreeting = 1; break; + case oNoVerbose: opt.verbose = 0; break; + case oNoOptions: break; /* no-options */ + case oHomedir: opt.homedir = pargs.r.ret_str; break; + case oNoDetach: nodetach = 1; break; + case oLogFile: logfile = pargs.r.ret_str; break; + case oCsh: csh_style = 1; break; + case oSh: csh_style = 0; break; + case oServer: pipe_server = 1; break; + case oMultiServer: pipe_server = 1; multi_server = 1; break; + case oDaemon: is_daemon = 1; break; + + case oReaderPort: opt.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; + case oDisableOpenSC: break; + + case oDisableKeypad: opt.disable_keypad = 1; break; + + case oAllowAdmin: opt.allow_admin = 1; break; + case oDenyAdmin: opt.allow_admin = 0; break; + + case oDisableApplication: + add_to_strlist (&opt.disabled_applications, pargs.r.ret_str); + break; + + default : pargs.err = configfp? 1:2; break; + } + } + if (configfp) + { + fclose( configfp ); + configfp = NULL; + /* Keep a copy of the config name for use by --gpgconf-list. */ + config_filename = configname; + configname = NULL; + goto next_pass; + } + xfree (configname); + configname = NULL; + if (log_get_errorcount(0)) + exit(2); + 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 + log_info ("NOTE: this is a development version!\n"); +#endif + + + if (atexit (cleanup)) + { + log_error ("atexit failed\n"); + cleanup (); + exit (1); + } + + set_debug (debug_level); + + if (debug_wait && pipe_server) + { + log_debug ("waiting for debugger - my pid is %u .....\n", + (unsigned int)getpid()); + sleep (debug_wait); + log_debug ("... okay\n"); + } + + if (gpgconf_list) + { + /* List options and default values in the GPG Conf format. */ + + /* The following list is taken from gnupg/tools/gpgconf-comp.c. */ + /* Option flags. YOU MUST NOT CHANGE THE NUMBERS OF THE EXISTING + FLAGS, AS THEY ARE PART OF THE EXTERNAL INTERFACE. */ +#define GC_OPT_FLAG_NONE 0UL + /* The RUNTIME flag for an option indicates that the option can be + changed at runtime. */ +#define GC_OPT_FLAG_RUNTIME (1UL << 3) + /* The DEFAULT flag for an option indicates that the option has a + default value. */ +#define GC_OPT_FLAG_DEFAULT (1UL << 4) + /* The DEF_DESC flag for an option indicates that the option has a + default, which is described by the value of the default field. */ +#define GC_OPT_FLAG_DEF_DESC (1UL << 5) + /* The NO_ARG_DESC flag for an option indicates that the argument has + a default, which is described by the value of the ARGDEF field. */ +#define GC_OPT_FLAG_NO_ARG_DESC (1UL << 6) + if (!config_filename) + config_filename = make_filename (opt.homedir, "scdaemon.conf", NULL ); + + printf ("gpgconf-scdaemon.conf:%lu:\"%s\n", + GC_OPT_FLAG_DEFAULT, config_filename); + + printf ("verbose:%lu:\n" + "quiet:%lu:\n" + "debug-level:%lu:\"none:\n" + "log-file:%lu:\n", + GC_OPT_FLAG_NONE, + GC_OPT_FLAG_NONE, + GC_OPT_FLAG_DEFAULT, + GC_OPT_FLAG_NONE ); + + printf ("reader-port:%lu:\n", GC_OPT_FLAG_NONE ); + printf ("ctapi-driver:%lu:\n", GC_OPT_FLAG_NONE ); + printf ("pcsc-driver:%lu:\"%s:\n", + GC_OPT_FLAG_DEFAULT, DEFAULT_PCSC_DRIVER ); +#ifdef HAVE_LIBUSB + printf ("disable-ccid:%lu:\n", GC_OPT_FLAG_NONE ); +#endif + printf ("allow-admin:%lu:\n", GC_OPT_FLAG_NONE ); + + + scd_exit (0); + } + + /* now start with logging to a file if this is desired */ + if (logfile) + { + log_set_file (logfile); + log_set_prefix (NULL, 1|2|4); + } + + if (pipe_server) + { + /* This is the simple pipe based server */ + pth_attr_t tattr; + int fd = -1; + + { + struct sigaction sa; + + sa.sa_handler = SIG_IGN; + sigemptyset (&sa.sa_mask); + sa.sa_flags = 0; + sigaction (SIGPIPE, &sa, NULL); + } + + /* If --debug-allow-core-dump has been given we also need to + switch the working directory to a place where we can actually + write. */ + if (allow_coredump) + { + if (chdir("/tmp")) + log_debug ("chdir to `/tmp' failed: %s\n", strerror (errno)); + else + log_debug ("changed working directory to `/tmp'\n"); + } + + /* In multi server mode we need to listen on an additional + socket. Create that socket now before starting the handler + for the pipe connection. This allows that handler to send + back the name of that socket. */ + if (multi_server) + { + socket_name = create_socket_name (0, + "S.scdaemon", + "/tmp/gpg-XXXXXX/S.scdaemon"); + + fd = create_server_socket (0, socket_name); + } + + tattr = pth_attr_new(); + pth_attr_set (tattr, PTH_ATTR_JOINABLE, 0); + pth_attr_set (tattr, PTH_ATTR_STACK_SIZE, 512*1024); + pth_attr_set (tattr, PTH_ATTR_NAME, "pipe-connection"); + + if (!pth_spawn (tattr, start_connection_thread, (void*)(-1))) + { + log_error ("error spawning pipe connection handler: %s\n", + strerror (errno) ); + scd_exit (2); + } + + handle_connections (fd); + if (fd != -1) + close (fd); + } + else if (!is_daemon) + { + log_info (_("please use the option `--daemon'" + " to run the program in the background\n")); + } + else + { /* Regular server mode */ + int fd; + pid_t pid; + int i; + + /* Create the socket. */ + socket_name = create_socket_name (0, + "S.scdaemon", + "/tmp/gpg-XXXXXX/S.scdaemon"); + + fd = create_server_socket (0, socket_name); + + + fflush (NULL); +#ifndef HAVE_W32_SYSTEM + pid = fork (); + if (pid == (pid_t)-1) + { + log_fatal ("fork failed: %s\n", strerror (errno) ); + exit (1); + } + else if (pid) + { /* we are the parent */ + char *infostr; + + close (fd); + + /* create the info string: <name>:<pid>:<protocol_version> */ + if (asprintf (&infostr, "SCDAEMON_INFO=%s:%lu:1", + socket_name, (ulong)pid ) < 0) + { + log_error ("out of core\n"); + kill (pid, SIGTERM); + exit (1); + } + *socket_name = 0; /* don't let cleanup() remove the socket - + the child should do this from now on */ + if (argc) + { /* run the program given on the commandline */ + if (putenv (infostr)) + { + log_error ("failed to set environment: %s\n", + strerror (errno) ); + kill (pid, SIGTERM ); + exit (1); + } + execvp (argv[0], argv); + log_error ("failed to run the command: %s\n", strerror (errno)); + kill (pid, SIGTERM); + exit (1); + } + else + { + /* Print the environment string, so that the caller can use + shell's eval to set it */ + if (csh_style) + { + *strchr (infostr, '=') = ' '; + printf ( "setenv %s\n", infostr); + } + else + { + printf ( "%s; export SCDAEMON_INFO;\n", infostr); + } + free (infostr); + exit (0); + } + /* NOTREACHED */ + } /* end parent */ + + /* This is the child. */ + + /* Detach from tty and put process into a new session. */ + if (!nodetach ) + { + /* Close stdin, stdout and stderr unless it is the log stream. */ + for (i=0; i <= 2; i++) + { + if ( log_test_fd (i) && i != fd) + close (i); + } + if (setsid() == -1) + { + log_error ("setsid() failed: %s\n", strerror(errno) ); + cleanup (); + exit (1); + } + } + + { + struct sigaction sa; + + sa.sa_handler = SIG_IGN; + sigemptyset (&sa.sa_mask); + sa.sa_flags = 0; + sigaction (SIGPIPE, &sa, NULL); + } + + if (chdir("/")) + { + log_error ("chdir to / failed: %s\n", strerror (errno)); + exit (1); + } + +#endif /*!HAVE_W32_SYSTEM*/ + + handle_connections (fd); + + close (fd); + } + + return 0; +} + +void +scd_exit (int rc) +{ +#if 0 +#warning no update_random_seed_file + update_random_seed_file(); +#endif +#if 0 + /* at this time a bit annoying */ + if (opt.debug & DBG_MEMSTAT_VALUE) + { + gcry_control( GCRYCTL_DUMP_MEMORY_STATS ); + gcry_control( GCRYCTL_DUMP_RANDOM_STATS ); + } + if (opt.debug) + gcry_control (GCRYCTL_DUMP_SECMEM_STATS ); +#endif + gcry_control (GCRYCTL_TERM_SECMEM ); + rc = rc? rc : log_get_errorcount(0)? 2 : 0; + exit (rc); +} + + +void +scd_init_default_ctrl (ctrl_t ctrl) +{ + ctrl->reader_slot = -1; +} + + +/* Return the name of the socket to be used to connect to this + process. If no socket is available, return NULL. */ +const char * +scd_get_socket_name () +{ + if (socket_name && *socket_name) + return socket_name; + return NULL; +} + + +static void +handle_signal (int signo) +{ + switch (signo) + { +#ifndef HAVE_W32_SYSTEM + case SIGHUP: + log_info ("SIGHUP received - " + "re-reading configuration and resetting cards\n"); +/* reread_configuration (); */ + break; + + case SIGUSR1: + log_info ("SIGUSR1 received - printing internal information:\n"); + pth_ctrl (PTH_CTRL_DUMPSTATE, log_get_stream ()); + app_dump_state (); + break; + + case SIGUSR2: + log_info ("SIGUSR2 received - no action defined\n"); + break; + + case SIGTERM: + if (!shutdown_pending) + log_info ("SIGTERM received - shutting down ...\n"); + else + log_info ("SIGTERM received - still %ld running threads\n", + pth_ctrl( PTH_CTRL_GETTHREADS )); + shutdown_pending++; + if (shutdown_pending > 2) + { + log_info ("shutdown forced\n"); + log_info ("%s %s stopped\n", strusage(11), strusage(13) ); + cleanup (); + scd_exit (0); + } + break; + + case SIGINT: + log_info ("SIGINT received - immediate shutdown\n"); + log_info( "%s %s stopped\n", strusage(11), strusage(13)); + cleanup (); + scd_exit (0); + break; +#endif /*!HAVE_W32_SYSTEM*/ + + default: + log_info ("signal %d received - no action defined\n", signo); + } +} + + +static void +handle_tick (void) +{ + if (!ticker_disabled) + scd_update_reader_status_file (); +} + + +/* Create a name for the socket. With USE_STANDARD_SOCKET given as + true using STANDARD_NAME in the home directory or if given has + false from the mkdir type name TEMPLATE. In the latter case a + unique name in a unique new directory will be created. In both + cases check for valid characters as well as against a maximum + allowed length for a unix domain socket is done. The function + terminates the process in case of an error. Retunrs: Pointer to an + allcoated string with the absolute name of the socket used. */ +static char * +create_socket_name (int use_standard_socket, + char *standard_name, char *template) +{ + char *name, *p; + + if (use_standard_socket) + name = make_filename (opt.homedir, standard_name, NULL); + else + { + name = xstrdup (template); + p = strrchr (name, '/'); + if (!p) + BUG (); + *p = 0; + if (!mkdtemp (name)) + { + log_error (_("can't create directory `%s': %s\n"), + name, strerror (errno)); + scd_exit (2); + } + *p = '/'; + } + + if (strchr (name, PATHSEP_C)) + { + log_error (("`%s' are not allowed in the socket name\n"), PATHSEP_S); + scd_exit (2); + } + if (strlen (name) + 1 >= DIMof (struct sockaddr_un, sun_path) ) + { + log_error (_("name of socket too long\n")); + scd_exit (2); + } + return name; +} + + + +/* Create a Unix domain socket with NAME. IS_STANDARD_NAME indicates + whether a non-random socket is used. Returns the file descriptor + or terminates the process in case of an error. */ +static int +create_server_socket (int is_standard_name, const char *name) +{ + struct sockaddr_un *serv_addr; + socklen_t len; + int fd; + int rc; + +#ifdef HAVE_W32_SYSTEM + fd = _w32_sock_new (AF_UNIX, SOCK_STREAM, 0); +#else + fd = socket (AF_UNIX, SOCK_STREAM, 0); +#endif + if (fd == -1) + { + log_error (_("can't create socket: %s\n"), strerror (errno)); + scd_exit (2); + } + + serv_addr = xmalloc (sizeof (*serv_addr)); + memset (serv_addr, 0, sizeof *serv_addr); + serv_addr->sun_family = AF_UNIX; + assert (strlen (name) + 1 < sizeof (serv_addr->sun_path)); + strcpy (serv_addr->sun_path, name); + len = (offsetof (struct sockaddr_un, sun_path) + + strlen (serv_addr->sun_path) + 1); + +#ifdef HAVE_W32_SYSTEM + rc = _w32_sock_bind (fd, (struct sockaddr*) serv_addr, len); + if (is_standard_name && rc == -1 ) + { + remove (name); + rc = bind (fd, (struct sockaddr*) serv_addr, len); + } +#else + rc = bind (fd, (struct sockaddr*) serv_addr, len); + if (is_standard_name && rc == -1 && errno == EADDRINUSE) + { + remove (name); + rc = bind (fd, (struct sockaddr*) serv_addr, len); + } +#endif + if (rc == -1) + { + log_error (_("error binding socket to `%s': %s\n"), + serv_addr->sun_path, strerror (errno)); + close (fd); + scd_exit (2); + } + + if (listen (fd, 5 ) == -1) + { + log_error (_("listen() failed: %s\n"), strerror (errno)); + close (fd); + scd_exit (2); + } + + if (opt.verbose) + log_info (_("listening on socket `%s'\n"), serv_addr->sun_path); + + return fd; +} + + + +/* This is the standard connection thread's main function. */ +static void * +start_connection_thread (void *arg) +{ + int fd = (int)arg; + + if (opt.verbose) + log_info (_("handler for fd %d started\n"), fd); + + scd_command_handler (fd); + + if (opt.verbose) + log_info (_("handler for fd %d terminated\n"), fd); + + /* If this thread is the pipe connection thread, flag that a + shutdown is required. With the next ticker event and given that + no other connections are running the shutdown will then + happen. */ + if (fd == -1) + shutdown_pending = 1; + + return NULL; +} + + +/* Connection handler loop. Wait for connection requests and spawn a + thread after accepting a connection. LISTEN_FD is allowed to be -1 + in which case this code will only do regular timeouts and handle + signals. */ +static void +handle_connections (int listen_fd) +{ + pth_attr_t tattr; + pth_event_t ev, time_ev; + sigset_t sigs; + int signo; + struct sockaddr_un paddr; + socklen_t plen; + fd_set fdset, read_fdset; + int ret; + int fd; + + tattr = pth_attr_new(); + pth_attr_set (tattr, PTH_ATTR_JOINABLE, 0); + pth_attr_set (tattr, PTH_ATTR_STACK_SIZE, 512*1024); + +#ifndef HAVE_W32_SYSTEM /* fixme */ + sigemptyset (&sigs ); + sigaddset (&sigs, SIGHUP); + sigaddset (&sigs, SIGUSR1); + sigaddset (&sigs, SIGUSR2); + sigaddset (&sigs, SIGINT); + sigaddset (&sigs, SIGTERM); + pth_sigmask (SIG_UNBLOCK, &sigs, NULL); + ev = pth_event (PTH_EVENT_SIGS, &sigs, &signo); +#else + ev = NULL; +#endif + time_ev = NULL; + + FD_ZERO (&fdset); + if (listen_fd != -1) + FD_SET (listen_fd, &fdset); + + for (;;) + { + sigset_t oldsigs; + + if (shutdown_pending) + { + if (pth_ctrl (PTH_CTRL_GETTHREADS) == 1) + break; /* ready */ + + /* Do not accept anymore connections but wait for existing + connections to terminate. We do this by clearing out all + file descriptors to wait for, so that the select will be + used to just wait on a signal or timeout event. */ + FD_ZERO (&fdset); + } + + /* Create a timeout event if needed. */ + if (!time_ev) + time_ev = pth_event (PTH_EVENT_TIME, pth_timeout (2, 0)); + + /* POSIX says that fd_set should be implemented as a structure, + thus a simple assignment is fine to copy the entire set. */ + read_fdset = fdset; + + if (time_ev) + pth_event_concat (ev, time_ev, NULL); + ret = pth_select_ev (FD_SETSIZE, &read_fdset, NULL, NULL, NULL, ev); + if (time_ev) + pth_event_isolate (time_ev); + + if (ret == -1) + { + if (pth_event_occurred (ev) + || (time_ev && pth_event_occurred (time_ev))) + { + if (pth_event_occurred (ev)) + handle_signal (signo); + if (time_ev && pth_event_occurred (time_ev)) + { + pth_event_free (time_ev, PTH_FREE_ALL); + time_ev = NULL; + handle_tick (); + } + continue; + } + log_error (_("pth_select failed: %s - waiting 1s\n"), + strerror (errno)); + pth_sleep (1); + continue; + } + + if (pth_event_occurred (ev)) + { + handle_signal (signo); + } + + if (time_ev && pth_event_occurred (time_ev)) + { + pth_event_free (time_ev, PTH_FREE_ALL); + time_ev = NULL; + handle_tick (); + } + + /* We now might create new threads and because we don't want any + signals - we are handling here - to be delivered to a new + thread. Thus we need to block those signals. */ + pth_sigmask (SIG_BLOCK, &sigs, &oldsigs); + + if (listen_fd != -1 && FD_ISSET (listen_fd, &read_fdset)) + { + plen = sizeof paddr; + fd = pth_accept (listen_fd, (struct sockaddr *)&paddr, &plen); + if (fd == -1) + { + log_error ("accept failed: %s\n", strerror (errno)); + } + else + { + char threadname[50]; + snprintf (threadname, sizeof threadname-1, "conn fd=%d", fd); + threadname[sizeof threadname -1] = 0; + pth_attr_set (tattr, PTH_ATTR_NAME, threadname); + + if (!pth_spawn (tattr, start_connection_thread, (void*)fd)) + { + log_error ("error spawning connection handler: %s\n", + strerror (errno) ); + close (fd); + } + } + fd = -1; + } + + /* Restore the signal mask. */ + pth_sigmask (SIG_SETMASK, &oldsigs, NULL); + + } + + pth_event_free (ev, PTH_FREE_ALL); + if (time_ev) + pth_event_free (time_ev, PTH_FREE_ALL); + cleanup (); + log_info (_("%s %s stopped\n"), strusage(11), strusage(13)); +} + + diff --git a/scd/scdaemon.h b/scd/scdaemon.h new file mode 100644 index 000000000..f9689ee09 --- /dev/null +++ b/scd/scdaemon.h @@ -0,0 +1,122 @@ +/* scdaemon.h - Global definitions for the SCdaemon + * 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. + */ + +#ifndef SCDAEMON_H +#define SCDAEMON_H + +#ifdef GPG_ERR_SOURCE_DEFAULT +#error GPG_ERR_SOURCE_DEFAULT already defined +#endif +#define GPG_ERR_SOURCE_DEFAULT GPG_ERR_SOURCE_SCD +#include <gpg-error.h> +#define map_assuan_err(a) \ + map_assuan_err_with_source (GPG_ERR_SOURCE_DEFAULT, (a)) + +#include <errno.h> + +#include <time.h> +#include <gcrypt.h> +#include "../common/util.h" +#include "../common/errors.h" + + +#define MAX_DIGEST_LEN 24 + +/* A large struct name "opt" to keep global flags. */ +struct { + unsigned int debug; /* Debug flags (DBG_foo_VALUE). */ + int verbose; /* Verbosity level. */ + int quiet; /* Be as quiet as possible. */ + int dry_run; /* Don't change any persistent data. */ + int batch; /* Batch mode. */ + const char *homedir; /* Configuration directory name. */ + const char *ctapi_driver; /* Library to access the ctAPI. */ + const char *pcsc_driver; /* Library to access the PC/SC system. */ + const char *reader_port; /* NULL or reder port to use. */ + int disable_ccid; /* Disable the use of the internal CCID driver. */ + int disable_keypad; /* Do not use a keypad. */ + int allow_admin; /* Allow the use of admin commands for certain + cards. */ + strlist_t disabled_applications; /* Card applications we do not + want to use. */ +} opt; + + +#define DBG_COMMAND_VALUE 1 /* debug commands i/o */ +#define DBG_MPI_VALUE 2 /* debug mpi details */ +#define DBG_CRYPTO_VALUE 4 /* debug low level crypto */ +#define DBG_MEMORY_VALUE 32 /* debug memory allocation stuff */ +#define DBG_CACHE_VALUE 64 /* debug the caching */ +#define DBG_MEMSTAT_VALUE 128 /* show memory statistics */ +#define DBG_HASHING_VALUE 512 /* debug hashing operations */ +#define DBG_ASSUAN_VALUE 1024 +#define DBG_CARD_IO_VALUE 2048 + +#define DBG_COMMAND (opt.debug & DBG_COMMAND_VALUE) +#define DBG_CRYPTO (opt.debug & DBG_CRYPTO_VALUE) +#define DBG_MEMORY (opt.debug & DBG_MEMORY_VALUE) +#define DBG_CACHE (opt.debug & DBG_CACHE_VALUE) +#define DBG_HASHING (opt.debug & DBG_HASHING_VALUE) +#define DBG_ASSUAN (opt.debug & DBG_ASSUAN_VALUE) +#define DBG_CARD_IO (opt.debug & DBG_CARD_IO_VALUE) + +struct server_local_s; +struct app_ctx_s; + +struct server_control_s +{ + /* Local data of the server; used only in command.c. */ + struct server_local_s *server_local; + + /* Slot of the open reader or -1 if not open. */ + int reader_slot; + + /* The application context used with this connection or NULL if none + associated. Note that this is shared with the other connections: + All connections accessing the same reader are using the same + application context. */ + struct app_ctx_s *app_ctx; + + /* Helper to store the value we are going to sign */ + struct + { + unsigned char *value; + int valuelen; + } in_data; +}; + +typedef struct server_control_s *CTRL; +typedef struct server_control_s *ctrl_t; +typedef struct app_ctx_s *APP; +typedef struct app_ctx_s *app_t; + +/*-- scdaemon.c --*/ +void scd_exit (int rc); +void scd_init_default_ctrl (ctrl_t ctrl); +const char *scd_get_socket_name (void); + +/*-- command.c --*/ +void scd_command_handler (int); +void send_status_info (CTRL ctrl, const char *keyword, ...); +void scd_update_reader_status_file (void); + + +#endif /*SCDAEMON_H*/ diff --git a/g10/tlv.c b/scd/tlv.c similarity index 99% rename from g10/tlv.c rename to scd/tlv.c index c7233e076..6ddbeaf1f 100644 --- a/g10/tlv.c +++ b/scd/tlv.c @@ -36,7 +36,6 @@ typedef int gpg_error_t; #include <gpg-error.h> #endif - #include "tlv.h" static const unsigned char * diff --git a/g10/tlv.h b/scd/tlv.h similarity index 100% rename from g10/tlv.h rename to scd/tlv.h diff --git a/scripts/ChangeLog b/scripts/ChangeLog index 9c768fe5c..5c8b95c8c 100644 --- a/scripts/ChangeLog +++ b/scripts/ChangeLog @@ -1,485 +1,9 @@ -2006-04-03 Werner Koch <wk@g10code.com> +2004-09-30 Werner Koch <wk@g10code.com> - * w32installer.nsi: Install curl and not http keyserver helper. + * config.guess, config.sub: Updated. -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. + Copyright 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 @@ -488,3 +12,5 @@ Wed Oct 14 09:55:25 1998 Werner Koch (wk@isil.d.shuttle.de) 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 deleted file mode 100755 index c39471eb6..000000000 --- a/scripts/autogen.sh +++ /dev/null @@ -1,278 +0,0 @@ -#!/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` - - # See whether we have the Debian cross compiler package or the - # old mingw32/cpd system - if i586-mingw32msvc-gcc --version >/dev/null 2>&1 ; then - host=i586-mingw32msvc - crossbindir=/usr/$host/bin - conf_CC="CC=${host}-gcc" - else - host=i386--mingw32 - if ! mingw32 --version >/dev/null; then - echo "We need at least version 0.3 of MingW32/CPD" >&2 - exit 1 - fi - echo "MingW32/CPD is no longer supported" >&2 - exit 1 - # crossbindir=`mingw32 --install-dir`/bin - # # Old autoconf version required us to setup the environment - # # with the proper tool names. - # CC=`mingw32 --get-path gcc` - # CPP=`mingw32 --get-path cpp` - # AR=`mingw32 --get-path ar` - # RANLIB=`mingw32 --get-path ranlib` - # export CC CPP AR RANLIB - # conf_CC="" - fi - - if [ -f "$tsdir/config.log" ]; then - if ! head $tsdir/config.log | grep "$host" >/dev/null; then - echo "Pease 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-riscos b/scripts/build-riscos deleted file mode 100644 index 47b38bd3d..000000000 --- a/scripts/build-riscos +++ /dev/null @@ -1,9 +0,0 @@ -| This is an RISC OS Obey file (filetype &feb) that copies handcrafted files -| for the RISC OS version into the correct places. -| It won't run on anything other than RISC OS -- I think ;-) - -copy <obey$dir>.conf-riscos.include.h.config <obey$dir>.^.include.h.config ~cf~v -copy <obey$dir>.conf-riscos.include.h.g10defs <obey$dir>.^.include.h.g10defs ~cf~v -copy <obey$dir>.conf-riscos.Makefile <obey$dir>.^.Makefile ~cf~v -settype <obey$dir>.^.Makefile &fe1 -echo Done. diff --git a/scripts/build-w32 b/scripts/build-w32 deleted file mode 100755 index 9995a4865..000000000 --- a/scripts/build-w32 +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh - -exec scripts/autogen.sh --build-w32 - - - diff --git a/scripts/commit b/scripts/commit deleted file mode 100755 index 6bfa0a615..000000000 --- a/scripts/commit +++ /dev/null @@ -1,63 +0,0 @@ -#!/bin/bash -# need a Posix shell, so we simply use bash - -set -e - -uid=`id -u` -date=`date` -name=$(awk -F: "\$3==$uid { print \$5 }" /etc/passwd ) -addr="<`id -un`@`hostname -d`>" - -for i in `find . -name Changes -print`; do - dir=`dirname $i` - if [ -s $dir/Changes ]; then - awk ' - state == 0 && /^[ \t]*$/ { next } - state == 0 { state = 1 } - /^[ \t]*$/ { empty++; next } - { while ( empty > 0 ) { print ""; empty--; }; print } - ' < $dir/Changes > $dir/Changes.tmp - if [ -s $dir/Changes.tmp ]; then - lines=`wc -l <$dir/Changes.tmp` - echo "$date $name $addr" >$dir/ChangeLog.new - echo >>$dir/ChangeLog.new - cat $dir/Changes.tmp >>$dir/ChangeLog.new - echo >>$dir/ChangeLog.new - [ -f $dir/ChangeLog ] && cat $dir/ChangeLog >>$dir/ChangeLog.new - echo -n > $dir/Changes - [ -f $dir/ChangeLog ] && rm $dir/ChangeLog - mv $dir/ChangeLog.new $dir/ChangeLog - echo "$lines new lines in $dir/ChangeLog" - fi - rm $dir/Changes.tmp || true - fi -done - -# Execute canned cvs remove commands -for i in `find . -name cvs-remove -print`; do - dir=`dirname $i` - if [ -s $dir/cvs-remove ]; then - here=`pwd` - cd $dir - if cvs remove -f `cat cvs-remove`; then - rm cvs-remove - fi - cd $here - fi -done - -# Execute canned cvs add commands -for i in `find . -name cvs-add -print`; do - dir=`dirname $i` - if [ -s $dir/cvs-add ]; then - here=`pwd` - cd $dir - if cvs add `cat cvs-add`; then - rm cvs-add - fi - cd $here - fi -done - -cvs -z3 commit -m "See ChangeLog: $date $name" $* - diff --git a/scripts/compile b/scripts/compile index 3d2170320..b6e6dcb0f 100755 --- a/scripts/compile +++ b/scripts/compile @@ -1,9 +1,8 @@ #! /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. +# Copyright 1999, 2000 Free Software Foundation, Inc. # Written by Tom Tromey <tromey@cygnus.com>. # # This program is free software; you can redistribute it and/or modify @@ -18,125 +17,92 @@ scriptversion=2004-10-12.08 # # You 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. +# 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. -# This file is maintained in Automake, please report -# bugs to <bug-automake@gnu.org> or send patches to -# <automake-patches@gnu.org>. +# Usage: +# compile PROGRAM [ARGS]... +# `-o FOO.o' is removed from the args passed to the actual compile. -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] +# Usage statement added by Billy Biggs <vektor@dumbterm.net>. +if [ -z $1 ]; then + echo "Wrapper for compilers which do not understand '-c -o'." + echo "usage: compile PROGRAM [ARGS]..." + echo "'-o FOO.o' is removed from the args passed to the actual compile." + exit 1 +fi -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 +prog=$1 +shift 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 +args= +while test $# -gt 0; do + case "$1" in + -o) + # configure might choose to run compile as `compile cc -o foo foo.c'. + # So we do something ugly here. + ofile=$2 + shift + case "$ofile" in + *.o | *.obj) + ;; + *) + args="$args -o $ofile" + ofile= + ;; + esac + ;; + *.c) + cfile=$1 + args="$args $1" + ;; + *) + args="$args $1" + ;; + esac + 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 "$@" + # 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 "$prog" $args fi # Name of file we expect compiler to create. -cofile=`echo "$cfile" | sed -e 's|^.*/||' -e 's/\.c$/.o/'` +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 +lockdir=`echo $cofile | sed -e 's|[/.-]|_|g'`.d while true; do - if mkdir "$lockdir" >/dev/null 2>&1; then - break - fi - sleep 1 + 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 +trap "rmdir $lockdir; exit 1" 1 2 15 # Run the compile. -"$@" -ret=$? +"$prog" $args +status=$? if test -f "$cofile"; then - mv "$cofile" "$ofile" -elif test -f "${cofile}bj"; then - mv "${cofile}bj" "$ofile" + mv "$cofile" "$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: +rmdir $lockdir +exit $status diff --git a/scripts/conf-riscos/Makefile b/scripts/conf-riscos/Makefile deleted file mode 100644 index 2a20e08fb..000000000 --- a/scripts/conf-riscos/Makefile +++ /dev/null @@ -1,509 +0,0 @@ -# Makefile for the RISC OS development version of GnuPG -BRANCH=devel - -CC=cc -LINK=link -AR=libfile -AS=objasm -MAKE=amu -DEPEND=-depend !Depend -LIBLDAP=^.^.openldap-2/0/27 -ZLIB=zlib.zlib - -CC_FLAGS=-Wdp -throwback -Otime -Iinclude,mpi,intl,util,zlib,$(LIBLDAP).include,^.^.regex-0/12,Unix: -JUnix: -D__riscos__ -DHAVE_CONFIG_H -DNO_ASM -UIS_MODULE -DVERSION="\"$(GnuPG$Version)\"" -DSAFE_VERSION="\"$(GnuPG$SafeVersion)\"" -DIS_DEVELOPMENT_VERSION -AR_FLAGS= -AS_FLAGS=-throwback -predefine "ARMv4 SETA 0" -LD_FLAGS= -UNIXLIB=Unix:o.UnixLib - -CIPHER_OBJS=cipher.o.blowfish \ - cipher.o.cast5 \ - cipher.o.cipher \ - cipher.o.des \ - cipher.o.dsa \ - cipher.o.dynload \ - cipher.o.elgamal \ - cipher.o.g10c \ - cipher.o.md \ - cipher.o.md5 \ - cipher.o.primegen \ - cipher.o.pubkey \ - cipher.o.random \ - cipher.o.rijndael \ - cipher.o.rmd160 \ - cipher.o.rndriscos \ - cipher.o.rsa \ - cipher.o.sha1 \ - cipher.o.sha256 \ - cipher.o.sha512 \ - cipher.o.smallprime \ - cipher.o.twofish -GETTEXT_OBJS=intl.o.bindtextdom \ - intl.o.dcgettext \ - intl.o.dcigettext \ - intl.o.dcngettext \ - intl.o.dgettext \ - intl.o.dngettext \ - intl.o.explodename \ - intl.o.finddomain \ - intl.o.gettext \ - intl.o.intl-compat \ - intl.o.l10nflist \ - intl.o.loadmsgcat \ - intl.o.localealias \ - intl.o.ngettext \ - intl.o.plural \ - intl.o.textdomain -MPI_OBJS=mpi.o.mpi-add \ - mpi.o.mpi-bit \ - mpi.o.mpi-cmp \ - mpi.o.mpi-div \ - mpi.o.mpi-gcd \ - mpi.o.mpi-inline \ - mpi.o.mpi-inv \ - mpi.o.mpi-mul \ - mpi.o.mpi-pow \ - mpi.o.mpi-mpow \ - mpi.o.mpi-scan \ - mpi.o.mpicoder \ - mpi.o.mpih-div \ - mpi.o.mpih-mul \ - mpi.o.mpiutil \ - mpi.o.g10m \ - mpi.arm.o.mpih -UTIL_OBJS=util.o.argparse \ - util.o.dotlock \ - util.o.errors \ - util.o.fileutil \ - util.o.g10u \ - util.o.http \ - util.o.iobuf \ - util.o.logger \ - util.o.memory \ - util.o.miscutil \ - util.o.secmem \ - util.o.srv \ - util.o.strgutil \ - util.o.ttyio \ - util.o.riscos -ZLIB_OBJS=zlib.o.adler32 \ - zlib.o.compress \ - zlib.o.crc32 \ - zlib.o.deflate \ - zlib.o.infblock \ - zlib.o.infcodes \ - zlib.o.inffast \ - zlib.o.inflate \ - zlib.o.inftrees \ - zlib.o.infutil \ - zlib.o.trees \ - zlib.o.uncompr \ - zlib.o.zutil -G10_OBJS=g10.o.armor \ - g10.o.build-packet \ - g10.o.cipher \ - g10.o.comment \ - g10.o.compress \ - g10.o.dearmor \ - g10.o.decrypt \ - g10.o.delkey \ - g10.o.encode \ - g10.o.encr-data \ - g10.o.exec \ - g10.o.export \ - g10.o.free-packet \ - g10.o.getkey \ - g10.o.helptext \ - g10.o.import \ - g10.o.kbnode \ - g10.o.keydb \ - g10.o.keyedit \ - g10.o.keygen \ - g10.o.keyid \ - g10.o.keylist \ - g10.o.keyring \ - g10.o.keyserver \ - g10.o.mainproc \ - g10.o.mdfilter \ - g10.o.misc \ - g10.o.mkdtemp \ - g10.o.openfile \ - g10.o.parse-packet \ - g10.o.passphrase \ - g10.o.photoid \ - g10.o.pipemode \ - g10.o.pkclist \ - g10.o.plaintext \ - g10.o.progress \ - g10.o.pubkey-enc \ - g10.o.revoke \ - g10.o.seckey-cert \ - g10.o.seskey \ - g10.o.sig-check \ - g10.o.sign \ - g10.o.signal \ - g10.o.skclist \ - g10.o.status \ - g10.o.tdbdump \ - g10.o.tdbio \ - g10.o.textfilter \ - g10.o.trustdb \ - g10.o.verify -GPGV_OBJS=g10.o.armor \ - g10.o.build-packet \ - g10.o.compress \ - g10.o.free-packet \ - g10.o.getkey \ - g10.o.gpgv \ - g10.o.keydb \ - g10.o.keylist \ - g10.o.kbnode \ - g10.o.keyid \ - g10.o.keyring \ - g10.o.mainproc \ - g10.o.mdfilter \ - g10.o.misc \ - g10.o.openfile \ - g10.o.parse-packet \ - g10.o.plaintext \ - g10.o.progress \ - g10.o.seskey \ - g10.o.sig-check \ - g10.o.signal \ - g10.o.status \ - g10.o.textfilter \ - g10.o.verify \ - util.o.argparse \ - util.o.errors \ - util.o.fileutil \ - util.o.g10u \ - util.o.iobuf \ - util.o.logger \ - util.o.memory \ - util.o.miscutil \ - util.o.secmem \ - util.o.strgutil \ - util.o.riscos \ - cipher.o.dsa \ - cipher.o.dynload \ - cipher.o.elgamal \ - cipher.o.g10c \ - cipher.o.md \ - cipher.o.md5 \ - cipher.o.pubkey \ - cipher.o.rmd160 \ - cipher.o.rsa \ - cipher.o.sha1 \ - cipher.o.sha256 \ - cipher.o.sha512 \ - mpi.mpi -GPGKEYS_OBJS=util.util \ - intl.gettext - -## Rule Patterns ## - -.SUFFIXES: .c .o .s - -.c.o: - $(CC) $(CC_FLAGS) $(DEPEND) -c -o $@ $< - -.s.o: - $(AS) $(AS_FLAGS) $(DEPEND) $< $@ - -# Static dependencies: - -all: - @echo Use one of the following as target: - @echo | dev to build the development version - @echo | dist to build the distribution with all archives - @echo All other targets are internal and shouldn't be used! - -cipher.cipher: $(CIPHER_OBJS) - $(AR) $(AR_FLAGS) -c -o cipher.cipher $(CIPHER_OBJS) - -intl.gettext: $(GETTEXT_OBJS) - $(AR) $(AR_FLAGS) -c -o intl.gettext $(GETTEXT_OBJS) - -mpi.mpi: $(MPI_OBJS) - $(AR) $(AR_FLAGS) -c -o mpi.mpi $(MPI_OBJS) - -tools.gpgsplit: tools.o.gpgsplit util.util intl.gettext $(ZLIB) - $(LINK) $(LD_FLAGS) -o tools.gpgsplit tools.o.gpgsplit util.util intl.gettext $(ZLIB) $(UNIXLIB) - -squeeze tools.gpgsplit - -copy tools.gpgsplit ADFS::A4.$.tmp.!GnuPG.gpgsplit ~CF~V - -keyserver.gpgkeys_ldap: keyserver.o.gpgkeys_ldap $(GPGKEYS_OBJS) $(LIBLDAP).libraries.libldap.libldap - $(LINK) $(LD_FLAGS) -o keyserver.gpgkeys_ldap keyserver.o.gpgkeys_ldap $(GPGKEYS_OBJS) $(LIBLDAP).libraries.libldap.libldap $(UNIXLIB) - -squeeze keyserver.gpgkeys_ldap - -copy keyserver.gpgkeys_ldap ADFS::A4.$.tmp.!GnuPG.gpgkeys_ldap ~CF~V - -keyserver.gpgkeys_hkp: keyserver.o.gpgkeys_hkp $(GPGKEYS_OBJS) - $(LINK) $(LD_FLAGS) -o keyserver.gpgkeys_hkp keyserver.o.gpgkeys_hkp $(GPGKEYS_OBJS) $(UNIXLIB) - -squeeze keyserver.gpgkeys_hkp - -copy keyserver.gpgkeys_hkp ADFS::A4.$.tmp.!GnuPG.gpgkeys_hkp ~CF~V - -riscos.jpegview.jpegview: - -dir riscos.jpegview - -$(MAKE) - -back - -util.util: $(UTIL_OBJS) - $(AR) $(AR_FLAGS) -c -o util.util $(UTIL_OBJS) - -zlib.zlib: $(ZLIB_OBJS) - $(AR) $(AR_FLAGS) -c -o zlib.zlib $(ZLIB_OBJS) - -g10.gpg: g10.o.g10 $(G10_OBJS) cipher.o.idea cipher.cipher intl.gettext mpi.mpi util.util $(ZLIB) BUILD - $(LINK) $(LD_FLAGS) -o g10.gpg g10.o.g10 $(G10_OBJS) cipher.o.idea cipher.cipher intl.gettext mpi.mpi util.util $(ZLIB) $(UNIXLIB) - -copy g10.gpg ADFS::A4.$.tmp.!GnuPG.gpg ~CFR~V - -g10.gpgv: $(GPGV_OBJS) intl.gettext $(ZLIB) BUILD - $(LINK) $(LD_FLAGS) -o g10.gpgv $(GPGV_OBJS) intl.gettext $(ZLIB) $(UNIXLIB) - -copy g10.gpgv ADFS::A4.$.tmp.!GnuPG.gpgv ~CFR~V - -g10.gpgpart: $(G10_OBJS) BUILD - copy $(UNIXLIB) g10.gpgpart ~CF~V - $(AR) $(AR_FLAGS) -i g10.gpgpart $(CIPHER_OBJS) - $(AR) $(AR_FLAGS) -i g10.gpgpart $(GETTEXT_OBJS) - $(AR) $(AR_FLAGS) -i g10.gpgpart $(MPI_OBJS) - $(AR) $(AR_FLAGS) -i g10.gpgpart $(UTIL_OBJS) -ifdef ZLIB - $(AR) $(AR_FLAGS) -i g10.gpgpart $(ZLIB_OBJS) -endif - $(AR) $(AR_FLAGS) -i g10.gpgpart $(G10_OBJS) - -select-idea-src: - -copy distrib.idea-addon.cipher.c.idea cipher.c.idea ~CF~NR~V - $(CC) $(CC_FLAGS) $(DEPEND) -c -o cipher.o.idea cipher.c.idea - -select-gpl-src: - -copy distrib.non-idea.cipher.c.idea cipher.c.idea ~CF~NR~V - $(CC) $(CC_FLAGS) $(DEPEND) -c -o cipher.o.idea cipher.c.idea - -distrib.gnupgsrc/zip: select-gpl-src - -zip -9@ distrib.gnupgsrc/zip < distrib.resources.distfiles - -distrib.gnupg/zip: distrib.gpl-bin.!GnuPG.JPEGview distrib.gpl-bin.!GnuPG.gpgsplit distrib.gpl-bin.!GnuPG.gpgkeys_hkp distrib.gpl-bin.!GnuPG.gpg distrib.gpl-bin.!GnuPG.gpgv select-gpl-src - -copy distrib.resources.History distrib.gpl-bin.History ~CFR~V - -copy distrib.resources.Upgrading distrib.gpl-bin.Upgrading ~CFR~V - -copy distrib.resources.ReadMe_bin distrib.gpl-bin.!ReadMe1st ~CFR~V - -copy distrib.resources.!GnuPG distrib.gpl-bin.!GnuPG ~CFR~V - -copy distrib.resources.!GnuPGUser distrib.gpl-bin.!GnuPGUser ~CFR~V - -copy distrib.resources.orig_docs distrib.gpl-bin.orig_docs ~CFR~V - -dir distrib.gpl-bin - -zip -r9 ^.gnupg/zip * - -back - -distrib.gnupgdev/zip: distrib.private.!GnuPG.JPEGview distrib.private.!GnuPG.gpgsplit distrib.private.!GnuPG.gpgkeys_ldap distrib.private.!GnuPG.gpgkeys_hkp distrib.private.!GnuPG.gpg distrib.private.!GnuPG.gpgv select-idea-src - -ifthere distrib.private.!GnuPG.locale then wipe distrib.private.!GnuPG.locale ~CFR~V - -copy distrib.intl.!GnuPG.locale distrib.private.!GnuPG.locale ~CFR~V - -copy distrib.resources.History distrib.private.History ~CFR~V - -copy distrib.resources.Upgrading distrib.private.Upgrading ~CFR~V - -copy distrib.resources.ReadMe_bin distrib.private.!ReadMe1st ~CFR~V - -copy distrib.resources.!GnuPG distrib.private.!GnuPG ~CFR~V - -copy distrib.resources.!GnuPGUser distrib.private.!GnuPGUser ~CFR~V - -copy distrib.resources.orig_docs distrib.private.orig_docs ~CFR~V - -dir distrib.private - -zip -r9 ^.gnupgdev/zip * - -back - -distrib.gnupgidea/zip: cipher.o.idea select-idea-src - -copy distrib.resources.ReadMe_idea distrib.idea-addon.!ReadMe ~CFR~V - -copy cipher.o.idea distrib.idea-addon.cipher.o.idea ~CFR~V - -dir distrib.idea-addon - -zip -r9 ^.gnupgidea/zip * - -back - -distrib.gnupgpart/zip: g10.o.g10 g10.gpgpart select-idea-src - -copy distrib.resources.ReadMe_part distrib.part.!ReadMe1st ~CFR~V - -copy g10.gpgpart distrib.part.g10.gpgpart ~CFR~V - -copy g10.o.g10 distrib.part.g10.g10 ~CFR~V - -dir distrib.part - -zip -r9 ^.gnupgpart/zip * - -back - -distrib.gnupgldap/zip: keyserver.gpgkeys_ldap - -copy distrib.resources.ReadMe_ldap distrib.ldap.!ReadMe ~CFR~V - -copy keyserver.gpgkeys_ldap distrib.ldap.!GnuPG.gpgkeys_ldap ~CFR~V - -dir distrib.ldap - -zip -r9 ^.gnupgldap/zip * - -back - -distrib.gnupgintl/zip: - -dir distrib.intl - -zip -r9 ^.gnupgintl/zip * - -back - -distrib.gpl-bin.!GnuPG.gpg: g10.gpg - -copy g10.gpg distrib.gpl-bin.!GnuPG.gpg ~CFR~V - -squeeze distrib.gpl-bin.!GnuPG.gpg - -distrib.gpl-bin.!GnuPG.gpgv: g10.gpgv - -copy g10.gpgv distrib.gpl-bin.!GnuPG.gpgv ~CFR~V - -squeeze distrib.gpl-bin.!GnuPG.gpgv - -distrib.gpl-bin.!GnuPG.gpgsplit: tools.gpgsplit - -copy tools.gpgsplit distrib.gpl-bin.!GnuPG.gpgsplit ~CFR~V - -squeeze distrib.gpl-bin.!GnuPG.gpgsplit - -distrib.gpl-bin.!GnuPG.gpgkeys_hkp: keyserver.gpgkeys_hkp - -copy keyserver.gpgkeys_hkp distrib.gpl-bin.!GnuPG.gpgkeys_hkp ~CFR~V - -squeeze distrib.gpl-bin.!GnuPG.gpgkeys_hkp - -distrib.gpl-bin.!GnuPG.JPEGview: riscos.jpegview.jpegview - -copy riscos.jpegview.jpegview distrib.gpl-bin.!GnuPG.JPEGview ~CFR~V - -distrib.private.!GnuPG.gpg: g10.gpg - -copy g10.gpg distrib.private.!GnuPG.gpg ~CFR~V - -squeeze distrib.private.!GnuPG.gpg - -distrib.private.!GnuPG.gpgv: g10.gpgv - -copy g10.gpgv distrib.private.!GnuPG.gpgv ~CFR~V - -squeeze distrib.private.!GnuPG.gpgv - -distrib.private.!GnuPG.gpgsplit: tools.gpgsplit - -copy tools.gpgsplit distrib.private.!GnuPG.gpgsplit ~CFR~V - -squeeze distrib.private.!GnuPG.gpgsplit - -distrib.private.!GnuPG.gpgkeys_ldap: keyserver.gpgkeys_ldap - -copy keyserver.gpgkeys_ldap distrib.private.!GnuPG.gpgkeys_ldap ~CFR~V - -squeeze distrib.private.!GnuPG.gpgkeys_ldap - -distrib.private.!GnuPG.gpgkeys_hkp: keyserver.gpgkeys_hkp - -copy keyserver.gpgkeys_hkp distrib.private.!GnuPG.gpgkeys_hkp ~CFR~V - -squeeze distrib.private.!GnuPG.gpgkeys_hkp - -distrib.private.!GnuPG.JPEGview: riscos.jpegview.jpegview - -copy riscos.jpegview.jpegview distrib.private.!GnuPG.JPEGview ~CFR~V - -clean-cipher: - -ifthere cipher.o.* then wipe cipher.o.* ~CFR~V - -ifthere cipher.cipher then wipe cipher.cipher ~CFR~V - -clean-intl: - -ifthere intl.o.* then wipe intl.o.* ~CFR~V - -ifthere intl.gettext then wipe intl.gettext ~CFR~V - -clean-mpi: - -ifthere mpi.o.* then wipe mpi.o.* ~CFR~V - -ifthere mpi.arm.o.* then wipe mpi.arm.o.* ~CFR~V - -ifthere mpi.mpi then wipe mpi.mpi ~CFR~V - -clean-util: - -ifthere util.o.* then wipe util.o.* ~CFR~V - -ifthere util.util then wipe util.util ~CFR~V - -clean-zlib: - -ifthere zlib.o.* then wipe zlib.o.* ~CFR~V - -ifthere zlib.zlib then wipe zlib.zlib ~CFR~V - -clean-dist: - -ifthere distrib.*/zip then wipe distrib.*/zip ~CFR~V - -clean-g10: - -ifthere g10.gpg then wipe g10.gpg ~CFR~V - -ifthere g10.gpgv then wipe g10.gpgv ~CFR~V - -ifthere g10.gpgpart then wipe g10.gpgpart ~CFR~V - -ifthere g10.o.* then wipe g10.o.* ~CFR~V - -clean-keyserver: - -ifthere keyserver.gpgkeys_ldap then wipe keyserver.gpgkeys_ldap ~CFR~V - -ifthere keyserver.gpgkeys_hkp then wipe keyserver.gpgkeys_hkp ~CFR~V - -ifthere keyserver.o.* then wipe keyserver.o.* ~CFR~V - -clean-tools: - -ifthere tools.gpgsplit then wipe tools.gpgsplit ~CFR~V - -ifthere tools.o.* then wipe tools.o.* ~CFR~V - -clean-riscos: - -ifthere riscos.jpegview.jpegview then wipe riscos.jpegview.jpegview ~CFR~V - -clean-version: - -ifthere g10.o.armor then wipe g10.o.armor ~CFR~V - -ifthere g10.o.encode then wipe g10.o.encode ~CFR~V - -ifthere g10.o.g10 then wipe g10.o.g10 ~CFR~V - -ifthere g10.o.gpgv then wipe g10.o.gpgv ~CFR~V - -ifthere g10.o.keygen then wipe g10.o.keygen ~CFR~V - -ifthere g10.o.keyserver then wipe g10.o.keyserver ~CFR~V - -ifthere g10.gpg then wipe g10.gpg ~CFR~V - -ifthere g10.gpgv then wipe g10.gpgv ~CFR~V - -ifthere g10.gpgpart then wipe g10.gpgpart ~CFR~V - -clean: clean-dist clean-cipher clean-intl clean-mpi clean-util clean-zlib clean-g10 clean-keyserver clean-tools clean-riscos - -g10.o.armor: BUILD - $(CC) $(CC_FLAGS) $(DEPEND) -c -o g10.o.armor g10.c.armor - -g10.o.encode: BUILD - $(CC) $(CC_FLAGS) $(DEPEND) -c -o g10.o.encode g10.c.encode - -g10.o.g10: BUILD - $(CC) $(CC_FLAGS) $(DEPEND) -c -o g10.o.g10 g10.c.g10 - -g10.o.gpgv: BUILD - $(CC) $(CC_FLAGS) $(DEPEND) -c -o g10.o.gpgv g10.c.gpgv - -g10.o.keygen: BUILD - $(CC) $(CC_FLAGS) $(DEPEND) -c -o g10.o.keygen g10.c.keygen - -g10.o.keyserver: BUILD - $(CC) $(CC_FLAGS) $(DEPEND) -c -o g10.o.keyserver g10.c.keyserver - -dev: clean-version - $(MAKE) fast-dev - -fast-dev: BUILD -ifdef USE_ZLIBRISCOS - zlib-riscos-use -else - zlib-riscos-nouse -endif - setver configure/ac AC_INIT(gnupg, , dev - wipe distrib.private.!GnuPG.gpg* ~CFR~V - -$(MAKE) keyserver.gpgkeys_ldap - $(MAKE) tools.gpgsplit - $(MAKE) distrib.gnupgdev/zip - ifthere <WebServe$ServeRoot>.private.gnupgdev/zip then wipe <WebServe$ServeRoot>.private.gnupgdev/zip ~CFR~V - rename distrib.gnupgdev/zip <WebServe$ServeRoot>.private.gnupgdev/zip - -dist: BUILD clean-version tools.gpgsplit -ifdef USE_ZLIBRISCOS - zlib-riscos-use -else - zlib-riscos-nouse -endif - setver configure/ac AC_INIT(gnupg, , dist - wipe distrib.gpl-bin.!GnuPG.gpg* ~CFR~V - $(MAKE) distrib.gnupg/zip - $(MAKE) distrib.gnupgidea/zip - $(MAKE) distrib.gnupgpart/zip - wipe distrib.private.!GnuPG.gpg* ~CFR~V - $(MAKE) distrib.gnupgdev/zip - $(MAKE) distrib.gnupgsrc/zip - $(MAKE) distrib.gnupgintl/zip - $(MAKE) distrib.gnupgldap/zip - $(MAKE) select-idea-src - ifthere <WebServe$ServeRoot>.archives.gnupg-$(BRANCH).gnupg/zip then wipe <WebServe$ServeRoot>.archives.gnupg-$(BRANCH).gnupg/zip ~CFR~V - ifthere <WebServe$ServeRoot>.private.gnupgdev/zip then wipe <WebServe$ServeRoot>.private.gnupgdev/zip ~CFR~V - ifthere <WebServe$ServeRoot>.archives.gnupg-$(BRANCH).gnupgidea/zip then wipe <WebServe$ServeRoot>.archives.gnupg-$(BRANCH).gnupgidea/zip ~CFR~V - ifthere <WebServe$ServeRoot>.archives.gnupg-$(BRANCH).gnupgpart/zip then wipe <WebServe$ServeRoot>.archives.gnupg-$(BRANCH).gnupgpart/zip ~CFR~V - ifthere <WebServe$ServeRoot>.archives.gnupg-$(BRANCH).gnupgsrc/zip then wipe <WebServe$ServeRoot>.archives.gnupg-$(BRANCH).gnupgsrc/zip ~CFR~V - ifthere <WebServe$ServeRoot>.archives.gnupg-$(BRANCH).gnupgintl/zip then wipe <WebServe$ServeRoot>.archives.gnupg-$(BRANCH).gnupgintl/zip ~CFR~V - ifthere <WebServe$ServeRoot>.archives.gnupg-$(BRANCH).gnupgldap/zip then wipe <WebServe$ServeRoot>.archives.gnupg-$(BRANCH).gnupgldap/zip ~CFR~V - ifthere <WebServe$ServeRoot>.archives.gnupg-$(BRANCH).gnupg_history/txt then wipe <WebServe$ServeRoot>.archives.gnupg-$(BRANCH).gnupg_history/txt ~CFR~V - ifthere <WebServe$ServeRoot>.archives.gnupg-$(BRANCH).gnupg_news/txt then wipe <WebServe$ServeRoot>.archives.gnupg-$(BRANCH).gnupg_news/txt ~CFR~V - rename distrib.gnupgdev/zip <WebServe$ServeRoot>.private.gnupgdev/zip - rename distrib.gnupg/zip <WebServe$ServeRoot>.archives.gnupg-$(BRANCH).gnupg/zip - rename distrib.gnupgidea/zip <WebServe$ServeRoot>.archives.gnupg-$(BRANCH).gnupgidea/zip - rename distrib.gnupgpart/zip <WebServe$ServeRoot>.archives.gnupg-$(BRANCH).gnupgpart/zip - rename distrib.gnupgsrc/zip <WebServe$ServeRoot>.archives.gnupg-$(BRANCH).gnupgsrc/zip - rename distrib.gnupgintl/zip <WebServe$ServeRoot>.archives.gnupg-$(BRANCH).gnupgintl/zip - rename distrib.gnupgldap/zip <WebServe$ServeRoot>.archives.gnupg-$(BRANCH).gnupgldap/zip - copy distrib.resources.History <WebServe$ServeRoot>.archives.gnupg-$(BRANCH).gnupg_history/txt ~CFR~V - copy distrib.resources.orig_docs.NEWS <WebServe$ServeRoot>.archives.gnupg-$(BRANCH).gnupg_news/txt ~CFR~V - unset GnuPG$DevDefine - unset GnuPG$Version - unset GnuPG$SafeVersion - updatesigs <WebServe$ServeRoot>.archives.gnupg-$(BRANCH) --secring adfs::pgp.$.secring/gpg - -# Dynamic dependencies: diff --git a/scripts/conf-riscos/include/config.h b/scripts/conf-riscos/include/config.h deleted file mode 100644 index 208796bc6..000000000 --- a/scripts/conf-riscos/include/config.h +++ /dev/null @@ -1,427 +0,0 @@ -/* config.h - hand edited by Stefan Bellon to suit RISC OS needs - * 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 G10_CONFIG_H -#define G10_CONFIG_H - -/* need this, because some autoconf tests rely on this (e.g. stpcpy) - * and it should be used for new programs - */ -#define _GNU_SOURCE 1 - - -/* Define if using alloca.c. */ -#undef C_ALLOCA - -/* Define to empty if the keyword does not work. */ -/* #undef const */ - -/* 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 if you have alloca, as a function or macro. */ -/* #undef HAVE_ALLOCA */ -#define HAVE_ALLOCA 1 - -/* Define if you have <alloca.h> and it should be used (not on Ultrix). */ -/* #undef HAVE_ALLOCA_H */ -#define HAVE_ALLOCA_H 1 - -/* #undef _LIBC */ - -/* Define if you don't have vprintf but do have _doprnt. */ -#undef HAVE_DOPRNT - -/* Define if you have the vprintf function. */ -#define HAVE_VPRINTF 1 - -/* Define to `long' if <sys/types.h> doesn't define. */ -#undef off_t - -/* Define if you need to in order for stat and other things to work. */ -#undef _POSIX_SOURCE - -/* Define as the return type of signal handlers (int or void). */ -#define RETSIGTYPE void - -/* Define to `unsigned' if <sys/types.h> doesn't define. */ -#define size_t unsigned int - -/* 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 run-time. - 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 if you have the ANSI C header files. */ -#define STDC_HEADERS 1 - -/* Define if `sys_siglist' is declared by <signal.h>. */ -#define SYS_SIGLIST_DECLARED 1 - -#undef M_DEBUG -#undef M_GUARD -#define PRINTABLE_OS_NAME "RISC OS" - -/* Define if your locale.h file contains LC_MESSAGES. */ -#define HAVE_LC_MESSAGES 1 - -#define LOCALEDIR "" - -/* Define to 1 if NLS is requested. */ -#define ENABLE_NLS 1 - -/* Define as 1 if you have catgets and don't want to use GNU gettext. */ -#undef HAVE_CATGETS - -/* Define as 1 if you have gettext and don't want to use GNU gettext. */ -#undef HAVE_GETTEXT - -#undef BIG_ENDIAN_HOST -#define LITTLE_ENDIAN_HOST 1 - -#undef HAVE_BYTE_TYPEDEF -#undef HAVE_USHORT_TYPEDEF -#undef HAVE_ULONG_TYPEDEF -#undef HAVE_U16_TYPEDEF -#undef HAVE_U32_TYPEDEF - -#undef HAVE_BROKEN_MLOCK - -/* defined if we have a /dev/random and /dev/urandom */ -#undef HAVE_DEV_RANDOM -/* and the real names of the random devices */ -#undef NAME_OF_DEV_RANDOM -#undef NAME_OF_DEV_URANDOM -/* Linux has an ioctl */ -#undef HAVE_DEV_RANDOM_IOCTL - -/* see cipher/rndegd.c */ -#undef EGD_SOCKET_NAME - -#undef USE_DYNAMIC_LINKING -#undef HAVE_DL_DLOPEN -#undef HAVE_DL_SHL_LOAD -#undef HAVE_DLD_DLD_LINK - -#undef USE_SHM_COPROCESSING - -#undef IPC_HAVE_SHM_LOCK -#undef IPC_RMID_DEFERRED_RELEASE - -/* set this to limit filenames to the 8.3 format */ -#undef USE_ONLY_8DOT3 -/* defined if we must run on a stupid file system */ -#undef HAVE_DRIVE_LETTERS -/* 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 -/* because the Unix gettext has to much overhead on MingW32 systems - * and these systems lack Posix functions, we use a simplified version - * of gettext */ -#undef USE_SIMPLE_GETTEXT -/* At some point in the system we need to know that we use the Windows - * random module. */ -#undef USE_STATIC_RNDW32 - -#undef USE_CAPABILITIES - -/* Some systems have mkdir that takes a single argument. */ -#undef MKDIR_TAKES_ONE_ARG - -/* The number of bytes in a unsigned int. */ -#define SIZEOF_UNSIGNED_INT 4 - -/* The number of bytes in a unsigned long. */ -#define SIZEOF_UNSIGNED_LONG 4 - -/* The number of bytes in a unsigned long long. */ -/* Is defined later on */ -/* #define SIZEOF_UNSIGNED_LONG_LONG 0 */ - -/* The number of bytes in a unsigned short. */ -#define SIZEOF_UNSIGNED_SHORT 2 - -/* Define if you have the __argz_count function. */ -#undef HAVE___ARGZ_COUNT - -/* Define if you have the __argz_next function. */ -#undef HAVE___ARGZ_NEXT - -/* Define if you have the __argz_stringify function. */ -#undef HAVE___ARGZ_STRINGIFY - -/* Define if you have the atexit function. */ -#define HAVE_ATEXIT 1 - -/* Define if you have the clock_gettime function. */ -#undef HAVE_CLOCK_GETTIME - -/* Define if you have the dcgettext function. */ -#undef HAVE_DCGETTEXT - -/* Define if you have the dlopen function. */ -#undef HAVE_DLOPEN - -/* Define if you have the fopen64 function. */ -#undef HAVE_FOPEN64 - -/* Define if you have the fstat64 function. */ -#undef HAVE_FSTAT64 - -/* Define if you have the getcwd function. */ -#define HAVE_GETCWD 1 - -/* Define if you have the gethrtime function. */ -#undef HAVE_GETHRTIME - -/* Define if you have the getpagesize function. */ -#define HAVE_GETPAGESIZE 1 - -/* Define if you have the getrusage function. */ -#define HAVE_GETRUSAGE 1 - -/* Define if you have the gettimeofday function. */ -#define HAVE_GETTIMEOFDAY 1 - -/* Define if you have the memicmp function. */ -#undef HAVE_MEMICMP - -/* Define if you have the memmove function. */ -#define HAVE_MEMMOVE 1 - -/* Define if you have the mlock function. */ -#undef HAVE_MLOCK - -/* Define if you have the mmap function. */ -#undef HAVE_MMAP - -/* Define if you have the munmap function. */ -#undef HAVE_MUNMAP - -/* Define if you have the nl_langinfo function. */ -#undef HAVE_NL_LANGINFO - -/* Define if you have the putenv function. */ -#define HAVE_PUTENV 1 - -/* Define if you have the raise function. */ -#define HAVE_RAISE 1 - -/* Define if you have the rand function. */ -#define HAVE_RAND 1 - -/* Define if you have the setenv function. */ -#define HAVE_SETENV 1 - -/* Define if you have the setlocale function. */ -#define HAVE_SETLOCALE 1 - -/* Define if you have the setrlimit function. */ -#define HAVE_SETRLIMIT 1 - -/* Define if you have the sigaction function. */ -#define HAVE_SIGACTION 1 - -/* Define if you have the sigprocmask function. */ -#define HAVE_SIGPROCMASK 1 - -/* Define if you have the stpcpy function. */ -#define HAVE_STPCPY 1 - -/* Define if you have the strcasecmp function. */ -#define HAVE_STRCASECMP 1 - -/* Define if you have the strchr function. */ -#define HAVE_STRCHR 1 - -/* Define if you have the strdup function. */ -#define HAVE_STRDUP 1 - -/* Define if you have the strerror function. */ -#define HAVE_STRERROR 1 - -/* Define if you have the strftime function. */ -#define HAVE_STRFTIME 1 - -/* Define if you have the stricmp function. */ -#define HAVE_STRICMP 1 - -/* Define if you have the strlwr function. */ -#undef HAVE_STRLWR - -/* Define if you have the strtoul function. */ -#define HAVE_STRTOUL 1 - -/* Define if you have the strsep function. */ -#define HAVE_STRSEP 1 - -/* Define if you have the tcgetattr function. */ -#undef HAVE_TCGETATTR - -/* Define if you have the wait4 function. */ -#define HAVE_WAIT4 1 - -/* Define if you have the waitpid function. */ -#define HAVE_WAITPID 1 - -/* Define if you have the <argz.h> header file. */ -#undef HAVE_ARGZ_H - -/* Define if you have the <direct.h> header file. */ -#undef HAVE_DIRECT_H - -/* Define if you have the <gdbm.h> header file. */ -#undef HAVE_GDBM_H - -/* Define if you have the <langinfo.h> header file. */ -#undef HAVE_LANGINFO_H - -/* Define if you have the <limits.h> header file. */ -#define HAVE_LIMITS_H 1 - -/* Define if you have the <linux/random.h> header file. */ -#undef HAVE_LINUX_RANDOM_H - -/* Define if you have the <locale.h> header file. */ -#define HAVE_LOCALE_H 1 - -/* Define if you have the <malloc.h> header file. */ -#define HAVE_MALLOC_H 1 - -/* Define if you have the <nl_types.h> header file. */ -#undef HAVE_NL_TYPES_H - -/* Define if you have the <string.h> header file. */ -#define HAVE_STRING_H 1 - -/* Define if you have the <sys/capability.h> header file. */ -#undef HAVE_SYS_CAPABILITY_H - -/* Define if you have the <sys/ipc.h> header file. */ -#undef HAVE_SYS_IPC_H - -/* Define if you have the <sys/mman.h> header file. */ -#define HAVE_SYS_MMAN_H 1 - -/* Define if you have the <sys/param.h> header file. */ -#define HAVE_SYS_PARAM_H 1 - -/* Define if you have the <sys/shm.h> header file. */ -#undef HAVE_SYS_SHM_H - -/* Define if you have the <sys/stat.h> header file. */ -#define HAVE_SYS_STAT_H 1 - -/* Define if you have the <termio.h> header file. */ -#undef HAVE_TERMIO_H - -/* Define if you have the <unistd.h> header file. */ -#define HAVE_UNISTD_H 1 - -/* Define if you have the <zlib.h> header file. */ -#define HAVE_ZLIB_H 1 - -/* Define if you have the dl library (-ldl). */ -#undef HAVE_LIBDL - -/* Define if you have the dld library (-ldld). */ -#undef HAVE_LIBDLD - -/* Define if you have the gdbm library (-lgdbm). */ -#undef HAVE_LIBGDBM - -/* Define if you have the i library (-li). */ -#undef HAVE_LIBI - -/* Define if you have the nsl library (-lnsl). */ -#undef HAVE_LIBNSL - -/* Define if you have the rt library (-lrt). */ -#undef HAVE_LIBRT - -/* Name of package */ -#define PACKAGE "GnuPG" - - -/* define if compiled symbols have a leading underscore */ -#define WITH_SYMBOL_UNDERSCORE 1 - -#define HAVE_BUILTIN_EXPECT 1 -#define HAVE_ULONG_TYPEDEF 1 -#define HAVE_USHORT_TYPEDEF 1 -#define HAVE_TIMES 1 -#define HAVE_INTTYPES_H1 -#define HAVE_FSEEKO 1 -#define HAVE_GETOPT_H 1 -#define HAVE_SIGSET_T 1 -#define HAVE_STRUCT_SIGACTION 1 -#define HAVE_ICONV 0 - -#ifndef __set_errno -#define __set_errno(val) (errno = (val), -1) -#endif - -/* RISC OS specifica */ -#if (__CC_NORCROFT == 1) /* Norcroft */ -# undef __GNUC__ -# define __GNUC_MINOR__ 0 -# define __GLIBC__ 0 - -# if (__CC_NORCROFT_VERSION < 544) /* old version of Norcroft */ -# define inline __inline -# define STR(a) #a -# define __func__ "[" __FILE__ ":" STR(__LINE__) "]" -# define SIZEOF_UNSIGNED_LONG_LONG 0 -# else -# define SIZEOF_UNSIGNED_LONG_LONG 8 -# endif -#else /* gcc */ -# define SIZEOF_UNSIGNED_LONG_LONG 8 -#endif - -#define HAVE_LDAP_GET_OPTION 1 -#undef USE_ZLIBRISCOS -#define USE_DNS_SRV 1 -#define USE_RNDRISCOS 1 -#define USE_RSA 1 -#define USE_CAST5 1 -#define USE_BLOWFISH 1 -#define USE_AES 1 -#define USE_TWOFISH 1 -#define USE_SHA256 1 -#if SIZEOF_UNSIGNED_LONG_LONG == 8 -# define USE_SHA512 -#endif - -#ifdef IS_DEVELOPMENT_VERSION -# define DEBUG 1 -/*# define M_DEBUG */ -# define M_GUARD 1 -# define USE_IDEA 1 -#endif - -#include "g10defs.h" - -#endif /*G10_CONFIG_H*/ diff --git a/scripts/conf-riscos/include/g10defs.h b/scripts/conf-riscos/include/g10defs.h deleted file mode 100644 index 679969751..000000000 --- a/scripts/conf-riscos/include/g10defs.h +++ /dev/null @@ -1,45 +0,0 @@ -/* g10defs.h - hand edited by Stefan Bellon to suit RISC OS needs - * 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. - */ - -/* Path variables and filing system constants for RISC OS */ -#define G10_LOCALEDIR "<GnuPG$Dir>.locale" -#define GNUPG_LIBDIR "<GnuPG$Dir>" -#define GNUPG_LIBEXECDIR "<GnuPG$Dir>" -#define GNUPG_DATADIR "<GnuPG$Dir>" -#define GNUPG_HOMEDIR "<GnuPGUser$Dir>" -#define LOCALE_ALIAS_PATH "<GnuPG$Dir>.locale" -#define GNULOCALEDIR "<GnuPG$Dir>.locale" -#define DIRSEP_C '.' -#define EXTSEP_C '/' -#define DIRSEP_S "." -#define EXTSEP_S "/" -#define SAFE_VERSION_DOT '/' -#define SAFE_VERSION_DASH '-' - -/* 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) - -/* External process spawning mechanism */ -#if !(defined(HAVE_FORK) && defined(HAVE_PIPE) && defined(HAVE_WAITPID)) -#define EXEC_TEMPFILE_ONLY 1 -#endif diff --git a/scripts/conf-w32/README b/scripts/conf-w32/README deleted file mode 100644 index 12b89c06d..000000000 --- a/scripts/conf-w32/README +++ /dev/null @@ -1,2 +0,0 @@ -Files useful for building W32 versions. - diff --git a/scripts/conf-w32/bzip2-1.diff b/scripts/conf-w32/bzip2-1.diff deleted file mode 100644 index 60036d07f..000000000 --- a/scripts/conf-w32/bzip2-1.diff +++ /dev/null @@ -1,39 +0,0 @@ -To include support for BZIP2 compression in GunPG for W32, the patch -below should be applied to a stock bzip2-1.0.2 source. The Build as -usual using the mingw32 cross compiler package from Debian and install -the library and header file on top of the cross compiler installation -(/usr/i586-mingw32msvc/lib/). Note that for ease of maintenance we -don't use a DLL. [wk 2005-03-14] - - -diff -u orig/bzip2-1.0.2/Makefile bzip2-1.0.2/Makefile ---- orig/bzip2-1.0.2/Makefile 2002-01-26 00:34:53.000000000 +0100 -+++ bzip2-1.0.2/Makefile 2004-11-03 14:10:45.000000000 +0100 -@@ -2,9 +2,9 @@ - SHELL=/bin/sh - - # To assist in cross-compiling --CC=gcc --AR=ar --RANLIB=ranlib -+CC=i586-mingw32msvc-gcc -+AR=i586-mingw32msvc-ar -+RANLIB=i586-mingw32msvc-ranlib - LDFLAGS= - - # Suitably paranoid flags to avoid bugs in gcc-2.7 -diff -u orig/bzip2-1.0.2/bzlib.h bzip2-1.0.2/bzlib.h ---- orig/bzip2-1.0.2/bzlib.h 2001-12-30 03:19:45.000000000 +0100 -+++ bzip2-1.0.2/bzlib.h 2004-11-03 14:32:41.000000000 +0100 -@@ -113,7 +114,7 @@ - /* Need a definitition for FILE */ - #include <stdio.h> - --#ifdef _WIN32 -+#if defined( _WIN32 ) && 0 - # include <windows.h> - # ifdef small - /* windows.h define small to char */ - - - diff --git a/scripts/config.guess b/scripts/config.guess index c38553dc7..a4929a979 100755 --- a/scripts/config.guess +++ b/scripts/config.guess @@ -1,9 +1,9 @@ #! /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. +# 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. -timestamp='2006-02-23' +timestamp='2004-08-13' # 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 @@ -17,15 +17,14 @@ timestamp='2006-02-23' # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA -# 02110-1301, USA. +# 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. @@ -55,7 +54,7 @@ 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 +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO @@ -68,11 +67,11 @@ Try \`$me --help' for more information." while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) - echo "$timestamp" ; exit ;; + echo "$timestamp" ; exit 0 ;; --version | -v ) - echo "$version" ; exit ;; + echo "$version" ; exit 0 ;; --help | --h* | -h ) - echo "$usage"; exit ;; + echo "$usage"; exit 0 ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. @@ -106,7 +105,7 @@ 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" ; } || + { tmp=`(umask 077 && mktemp -d -q "$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 ; } ; @@ -125,7 +124,7 @@ case $CC_FOR_BUILD,$HOST_CC,$CC in ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; -esac ; set_cc_for_build= ;' +esac ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) @@ -198,23 +197,55 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" - exit ;; + exit 0 ;; + amd64:OpenBSD:*:*) + echo x86_64-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + amiga:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + cats:OpenBSD:*:*) + echo arm-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + hp300:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + luna88k:OpenBSD:*:*) + echo m88k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mac68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + macppc:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme88k:OpenBSD:*:*) + echo m88k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvmeppc:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sgi:OpenBSD:*:*) + echo mips64-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sun3:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; *:OpenBSD:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` - echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} - exit ;; + echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} - exit ;; - *:SolidBSD:*:*) - echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} - exit ;; + exit 0 ;; macppc:MirBSD:*:*) echo powerppc-unknown-mirbsd${UNAME_RELEASE} - exit ;; + exit 0 ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} - exit ;; + exit 0 ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) @@ -267,43 +298,37 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in # 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 ;; + exit 0 ;; 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 ;; + exit 0 ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 - exit ;; + exit 0 ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 - exit ;; + exit 0;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos - exit ;; + exit 0 ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos - exit ;; + exit 0 ;; *:OS/390:*:*) echo i370-ibm-openedition - exit ;; - *:z/VM:*:*) - echo s390-ibm-zvmoe - exit ;; + exit 0 ;; *:OS400:*:*) echo powerpc-ibm-os400 - exit ;; + exit 0 ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} - exit ;; - arm:riscos:*:*|arm:RISCOS:*:*) - echo arm-unknown-riscos - exit ;; + exit 0;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp - exit ;; + exit 0;; 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 @@ -311,32 +336,32 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in else echo pyramid-pyramid-bsd fi - exit ;; + exit 0 ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 - exit ;; + exit 0 ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 - exit ;; - DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + exit 0 ;; + DRS?6000:UNIX_SV:4.2*:7*) case `/usr/bin/uname -p` in - sparc) echo sparc-icl-nx7; exit ;; + sparc) echo sparc-icl-nx7 && exit 0 ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; + exit 0 ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; + exit 0 ;; i86pc:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; + exit 0 ;; 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 ;; + exit 0 ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) @@ -345,10 +370,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` - exit ;; + exit 0 ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} - exit ;; + exit 0 ;; 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 @@ -360,10 +385,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in echo sparc-sun-sunos${UNAME_RELEASE} ;; esac - exit ;; + exit 0 ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} - exit ;; + exit 0 ;; # 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 @@ -374,40 +399,40 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} - exit ;; + exit 0 ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} - exit ;; + exit 0 ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} - exit ;; + exit 0 ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} - exit ;; + exit 0 ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} - exit ;; + exit 0 ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} - exit ;; + exit 0 ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} - exit ;; + exit 0 ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} - exit ;; + exit 0 ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 - exit ;; + exit 0 ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} - exit ;; + exit 0 ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} - exit ;; + exit 0 ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} - exit ;; + exit 0 ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c @@ -431,33 +456,32 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in 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; } + $CC_FOR_BUILD -o $dummy $dummy.c \ + && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ + && exit 0 echo mips-mips-riscos${UNAME_RELEASE} - exit ;; + exit 0 ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax - exit ;; + exit 0 ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax - exit ;; + exit 0 ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax - exit ;; + exit 0 ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix - exit ;; + exit 0 ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 - exit ;; + exit 0 ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 - exit ;; + exit 0 ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 - exit ;; + exit 0 ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` @@ -473,29 +497,29 @@ EOF else echo i586-dg-dgux${UNAME_RELEASE} fi - exit ;; + exit 0 ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 - exit ;; + exit 0 ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 - exit ;; + exit 0 ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 - exit ;; + exit 0 ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd - exit ;; + exit 0 ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` - exit ;; + exit 0 ;; ????????: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 ' + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix - exit ;; + exit 0 ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` @@ -503,7 +527,7 @@ EOF IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} - exit ;; + exit 0 ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build @@ -518,18 +542,14 @@ EOF 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 + $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 + echo rs6000-ibm-aix3.2.5 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 ;; + exit 0 ;; *: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 @@ -543,28 +563,28 @@ EOF IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} - exit ;; + exit 0 ;; *:AIX:*:*) echo rs6000-ibm-aix - exit ;; + exit 0 ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 - exit ;; + exit 0 ;; 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 + exit 0 ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx - exit ;; + exit 0 ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 - exit ;; + exit 0 ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd - exit ;; + exit 0 ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 - exit ;; + exit 0 ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in @@ -626,19 +646,9 @@ EOF 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 + # avoid double evaluation of $set_cc_for_build + test -n "$CC_FOR_BUILD" || eval $set_cc_for_build + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else @@ -646,11 +656,11 @@ EOF fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} - exit ;; + exit 0 ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} - exit ;; + exit 0 ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c @@ -678,177 +688,152 @@ EOF exit (0); } EOF - $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } + $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 echo unknown-hitachi-hiuxwe2 - exit ;; + exit 0 ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd - exit ;; + exit 0 ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd - exit ;; + exit 0 ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix - exit ;; + exit 0 ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf - exit ;; + exit 0 ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf - exit ;; + exit 0 ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi - exit ;; + exit 0 ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites - exit ;; + exit 0 ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd - exit ;; + exit 0 ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi - exit ;; + exit 0 ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd - exit ;; + exit 0 ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd - exit ;; + exit 0 ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd - exit ;; + exit 0 ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; + exit 0 ;; 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 ;; + exit 0 ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; + exit 0 ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; + exit 0 ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; + exit 0 ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; + exit 0 ;; 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 ;; + exit 0 ;; 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 ;; + exit 0 ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} - exit ;; + exit 0 ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} - exit ;; + exit 0 ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} - exit ;; + exit 0 ;; *: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 ;; + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit 0 ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin - exit ;; + exit 0 ;; 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 ;; + exit 0 ;; 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 ;; + exit 0 ;; + x86:Interix*:[34]*) + echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' + exit 0 ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks - exit ;; + exit 0 ;; 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 ;; + exit 0 ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin - exit ;; - amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) - echo x86_64-unknown-cygwin - exit ;; + exit 0 ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin - exit ;; + exit 0 ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; + exit 0 ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` - exit ;; + exit 0 ;; *: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 ;; + exit 0 ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix - exit ;; + exit 0 ;; arm*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + exit 0 ;; cris:Linux:*:*) echo cris-axis-linux-gnu - exit ;; - crisv32:Linux:*:*) - echo crisv32-axis-linux-gnu - exit ;; - frv:Linux:*:*) - echo frv-unknown-linux-gnu - exit ;; + exit 0 ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + exit 0 ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + exit 0 ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + exit 0 ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c @@ -865,12 +850,8 @@ EOF #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; } + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` + test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 ;; mips64:Linux:*:*) eval $set_cc_for_build @@ -888,22 +869,15 @@ EOF #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; } + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` + test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 ;; - or32:Linux:*:*) - echo or32-unknown-linux-gnu - exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu - exit ;; + exit 0 ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu - exit ;; + exit 0 ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; @@ -917,7 +891,7 @@ EOF 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 ;; + exit 0 ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in @@ -925,28 +899,25 @@ EOF PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac - exit ;; + exit 0 ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu - exit ;; + exit 0 ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux - exit ;; + exit 0 ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + exit 0 ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + exit 0 ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - vax:Linux:*:*) - echo ${UNAME_MACHINE}-dec-linux-gnu - exit ;; + exit 0 ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu - exit ;; + exit 0 ;; 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 @@ -964,15 +935,15 @@ EOF ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" - exit ;; + exit 0 ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-gnucoff" - exit ;; + exit 0 ;; "") # 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 ;; + exit 0 ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build @@ -989,7 +960,7 @@ EOF LIBC=gnulibc1 # endif #else - #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__sun) + #ifdef __INTEL_COMPILER LIBC=gnu #else LIBC=gnuaout @@ -999,23 +970,16 @@ EOF 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; } + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` + test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0 + test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 ;; 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 ;; + exit 0 ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... @@ -1023,27 +987,27 @@ EOF # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} - exit ;; + exit 0 ;; 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 ;; + exit 0 ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop - exit ;; + exit 0 ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos - exit ;; - i*86:syllable:*:*) + exit 0 ;; + i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable - exit ;; + exit 0 ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} - exit ;; + exit 0 ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp - exit ;; + exit 0 ;; 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 @@ -1051,16 +1015,15 @@ EOF else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi - exit ;; - i*86:*:5:[678]*) - # UnixWare 7.x, OpenUNIX and OpenServer 6. + exit 0 ;; + i*86:*:5:[78]*) 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 ;; + exit 0 ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name` @@ -1078,73 +1041,73 @@ EOF else echo ${UNAME_MACHINE}-pc-sysv32 fi - exit ;; + exit 0 ;; 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 ;; + exit 0 ;; Intel:Mach:3*:*) echo i386-pc-mach3 - exit ;; + exit 0 ;; paragon:*:*:*) echo i860-intel-osf1 - exit ;; + exit 0 ;; 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 ;; + exit 0 ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv - exit ;; + exit 0 ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv - exit ;; + exit 0 ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix - exit ;; + exit 0 ;; M68*:*:R3V[5678]*:*) - test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; 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; } + && echo i486-ncr-sysv4.3${OS_REL} && exit 0 /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4; exit; } ;; + && echo i486-ncr-sysv4 && exit 0 ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} - exit ;; + exit 0 ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 - exit ;; + exit 0 ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} - exit ;; + exit 0 ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} - exit ;; + exit 0 ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} - exit ;; + exit 0 ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} - exit ;; + exit 0 ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 - exit ;; + exit 0 ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 - exit ;; + exit 0 ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` @@ -1152,72 +1115,69 @@ EOF else echo ns32k-sni-sysv fi - exit ;; + exit 0 ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says <Richard.M.Bartel@ccMail.Census.GOV> echo i586-unisys-sysv4 - exit ;; + exit 0 ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes <hewes@openmarket.com>. # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 - exit ;; + exit 0 ;; *:*:*: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 ;; + exit 0 ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos - exit ;; + exit 0 ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} - exit ;; + exit 0 ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 - exit ;; + exit 0 ;; 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 ;; + exit 0 ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos - exit ;; + exit 0 ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos - exit ;; + exit 0 ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos - exit ;; + exit 0 ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} - exit ;; + exit 0 ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} - exit ;; + exit 0 ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} - exit ;; + exit 0 ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} - exit ;; + exit 0 ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} - exit ;; + exit 0 ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in + *86) UNAME_PROCESSOR=i686 ;; unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} - exit ;; + exit 0 ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then @@ -1225,25 +1185,22 @@ EOF UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} - exit ;; + exit 0 ;; *:QNX:*:4*) echo i386-pc-qnx - exit ;; - NSE-?:NONSTOP_KERNEL:*:*) - echo nse-tandem-nsk${UNAME_RELEASE} - exit ;; + exit 0 ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} - exit ;; + exit 0 ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux - exit ;; + exit 0 ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv - exit ;; + exit 0 ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} - exit ;; + exit 0 ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 @@ -1254,47 +1211,38 @@ EOF UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 - exit ;; + exit 0 ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 - exit ;; + exit 0 ;; *:TENEX:*:*) echo pdp10-unknown-tenex - exit ;; + exit 0 ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 - exit ;; + exit 0 ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 - exit ;; + exit 0 ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 - exit ;; + exit 0 ;; *:ITS:*:*) echo pdp10-unknown-its - exit ;; + exit 0 ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} - exit ;; + exit 0 ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` - exit ;; + exit 0 ;; *:*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 ;; + A*) echo alpha-dec-vms && exit 0 ;; + I*) echo ia64-dec-vms && exit 0 ;; + V*) echo vax-dec-vms && exit 0 ;; + esac esac #echo '(No uname command or uname output not recognized.)' 1>&2 @@ -1326,7 +1274,7 @@ main () #endif #if defined (__arm) && defined (__acorn) && defined (__unix) - printf ("arm-acorn-riscix\n"); exit (0); + printf ("arm-acorn-riscix"); exit (0); #endif #if defined (hp300) && !defined (hpux) @@ -1415,12 +1363,11 @@ main () } EOF -$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0 # Apollos put the system type in the environment. -test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } # Convex versions that predate uname can use getsysinfo(1) @@ -1429,22 +1376,22 @@ then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd - exit ;; + exit 0 ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi - exit ;; + exit 0 ;; c34*) echo c34-convex-bsd - exit ;; + exit 0 ;; c38*) echo c38-convex-bsd - exit ;; + exit 0 ;; c4*) echo c4-convex-bsd - exit ;; + exit 0 ;; esac fi @@ -1455,9 +1402,7 @@ 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 + ftp://ftp.gnu.org/pub/gnu/config/ If the version you run ($0) is already up to date, please send the following data and any information you think might be diff --git a/scripts/config.rpath b/scripts/config.rpath index 3f1bef34a..4db13e50f 100755 --- a/scripts/config.rpath +++ b/scripts/config.rpath @@ -2,13 +2,28 @@ # 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. +# Copyright 1996-2003 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. +# 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., 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. # # The first argument passed to this file is the canonical host specification, # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM @@ -35,8 +50,6 @@ 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= @@ -47,13 +60,6 @@ else aix*) wl='-Wl,' ;; - darwin*) - case "$cc_basename" in - xlc*) - wl='-Wl,' - ;; - esac - ;; mingw* | pw32* | os2*) ;; hpux9* | hpux10* | hpux11*) @@ -65,19 +71,13 @@ else newsos6) ;; linux*) - case $cc_basename in - icc* | ecc*) + case $CC in + icc|ecc) wl='-Wl,' ;; - pgcc | pgf77 | pgf90) + ccc) wl='-Wl,' ;; - ccc*) - wl='-Wl,' - ;; - como) - wl='-lopt=' - ;; esac ;; osf3* | osf4* | osf5*) @@ -96,9 +96,6 @@ else ;; sysv4*MP*) ;; - unicos*) - wl='-Wl,' - ;; uts4*) ;; esac @@ -141,7 +138,7 @@ if test "$with_gnu_ld" = yes; then # 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 + # behavior of shared libraries on other platforms, we can use # them. ld_shlibs=no ;; @@ -176,13 +173,6 @@ if test "$with_gnu_ld" = yes; then 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 : @@ -276,7 +266,7 @@ else # see comment about different semantics on the GNU ld section ld_shlibs=no ;; - bsdi[45]*) + bsdi4*) ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using @@ -287,17 +277,8 @@ else libext=lib ;; darwin* | rhapsody*) - hardcode_direct=no - if test "$GCC" = yes ; then - : - else - case "$cc_basename" in - xlc*) - ;; - *) - ld_shlibs=no - ;; - esac + if $CC -v 2>&1 | grep 'Apple' >/dev/null ; then + hardcode_direct=no fi ;; dgux*) @@ -314,7 +295,7 @@ else hardcode_direct=yes hardcode_minus_L=yes ;; - freebsd* | kfreebsd*-gnu | dragonfly*) + freebsd*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; @@ -457,7 +438,7 @@ case "$host_os" in ;; beos*) ;; - bsdi[45]*) + bsdi4*) ;; cygwin* | mingw* | pw32*) shrext=.dll @@ -469,8 +450,6 @@ case "$host_os" in ;; freebsd1*) ;; - kfreebsd*-gnu) - ;; freebsd*) ;; gnu*) @@ -507,13 +486,11 @@ case "$host_os" in ;; linux*) ;; - knetbsd*-gnu) - ;; netbsd*) ;; newsos6) ;; - nto-qnx*) + nto-qnx) ;; openbsd*) ;; @@ -542,7 +519,7 @@ 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 +sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF # How to pass a linker flag through the compiler. wl="$escaped_wl" diff --git a/scripts/config.sub b/scripts/config.sub index ad9f39571..ac6de9869 100755 --- a/scripts/config.sub +++ b/scripts/config.sub @@ -1,9 +1,9 @@ #! /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. +# 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. -timestamp='2006-02-23' +timestamp='2004-06-24' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software @@ -21,15 +21,14 @@ timestamp='2006-02-23' # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA -# 02110-1301, USA. -# +# 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. - # Please send patches to <config-patches@gnu.org>. Submit a context # diff and a properly formatted ChangeLog entry. # @@ -71,7 +70,7 @@ 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 +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO @@ -84,11 +83,11 @@ Try \`$me --help' for more information." while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) - echo "$timestamp" ; exit ;; + echo "$timestamp" ; exit 0 ;; --version | -v ) - echo "$version" ; exit ;; + echo "$version" ; exit 0 ;; --help | --h* | -h ) - echo "$usage"; exit ;; + echo "$usage"; exit 0 ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. @@ -100,7 +99,7 @@ while test $# -gt 0 ; do *local*) # First pass through any local machine types. echo $1 - exit ;; + exit 0;; * ) break ;; @@ -119,9 +118,8 @@ esac # 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*) + nto-qnx* | linux-gnu* | linux-dietlibc | 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/'` ;; @@ -172,10 +170,6 @@ case $os in -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/'` @@ -192,10 +186,6 @@ case $os in # 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/'` @@ -241,14 +231,13 @@ case $basic_machine in | 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 \ + | m32r | m32rle | m68000 | m68k | m88k | mcore \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ @@ -257,7 +246,6 @@ case $basic_machine in | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ - | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ @@ -266,29 +254,23 @@ case $basic_machine in | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ - | mt \ | msp430 \ - | nios | nios2 \ | ns16k | ns32k \ - | or32 \ + | openrisc | 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 \ + | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ - | sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \ - | sparcv8 | sparcv9 | sparcv9b \ + | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv8 | sparcv9 | sparcv9b \ | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ - | x86 | xscale | xscalee[bl] | xstormy16 | xtensa \ + | x86 | xscale | 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 @@ -296,9 +278,6 @@ case $basic_machine in ;; 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 @@ -319,7 +298,7 @@ case $basic_machine in | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* \ - | bfin-* | bs2000-* \ + | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ @@ -331,7 +310,7 @@ case $basic_machine in | ip2k-* | iq2000-* \ | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | maxq-* | mcore-* \ + | m88110-* | m88k-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ @@ -340,7 +319,6 @@ case $basic_machine in | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ - | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ @@ -349,32 +327,27 @@ case $basic_machine in | 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-* \ + | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ - | sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \ - | sparclite-* \ + | sparc-* | sparc64-* | 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-* \ + | x86-* | x86_64-* | xps100-* | xscale-* | 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) @@ -484,9 +457,6 @@ case $basic_machine in crds | unos) basic_machine=m68k-crds ;; - crisv32 | crisv32-* | etraxfs*) - basic_machine=crisv32-axis - ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; @@ -516,10 +486,6 @@ case $basic_machine in basic_machine=m88k-motorola os=-sysv3 ;; - djgpp) - basic_machine=i586-pc - os=-msdosdjgpp - ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx @@ -710,9 +676,6 @@ case $basic_machine in basic_machine=i386-pc os=-msdos ;; - ms1-*) - basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` - ;; mvs) basic_machine=i370-ibm os=-mvs @@ -788,8 +751,9 @@ case $basic_machine in basic_machine=hppa1.1-oki os=-proelf ;; - openrisc | openrisc-*) + or32 | or32-*) basic_machine=or32-unknown + os=-coff ;; os400) basic_machine=powerpc-ibm @@ -820,12 +784,6 @@ case $basic_machine in 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 ;; @@ -882,10 +840,6 @@ case $basic_machine in basic_machine=i586-unknown os=-pw32 ;; - rdos) - basic_machine=i386-pc - os=-rdos - ;; rom68k) basic_machine=m68k-rom68k os=-coff @@ -1072,10 +1026,6 @@ case $basic_machine in basic_machine=hppa1.1-winbond os=-proelf ;; - xbox) - basic_machine=i686-pc - os=-mingw32 - ;; xps | xps100) basic_machine=xps100-honeywell ;; @@ -1125,9 +1075,12 @@ case $basic_machine in we32k) basic_machine=we32k-att ;; - sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) + sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; + sh64) + basic_machine=sh64-unknown + ;; sparc | sparcv8 | sparcv9 | sparcv9b) basic_machine=sparc-sun ;; @@ -1201,23 +1154,20 @@ case $os in | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ - | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ - | -openbsd* | -solidbsd* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \ | -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* \ + | -mingw32* | -linux-gnu* | -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*) + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) @@ -1235,7 +1185,7 @@ case $os in os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ - | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) @@ -1344,9 +1294,6 @@ case $os in -kaos*) os=-kaos ;; - -zvmoe) - os=-zvmoe - ;; -none) ;; *) @@ -1424,9 +1371,6 @@ case $basic_machine in *-be) os=-beos ;; - *-haiku) - os=-haiku - ;; *-ibm) os=-aix ;; @@ -1598,7 +1542,7 @@ case $basic_machine in esac echo $basic_machine$os -exit +exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) diff --git a/scripts/depcomp b/scripts/depcomp index eed3cc9f8..aea3d0078 100755 --- a/scripts/depcomp +++ b/scripts/depcomp @@ -1,9 +1,7 @@ #! /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. +# Copyright 1999, 2000 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 @@ -17,8 +15,8 @@ scriptversion=2004-05-31.23 # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301, USA. +# 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 @@ -27,45 +25,22 @@ scriptversion=2004-05-31.23 # 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 +# `libtool' can also be set to `yes' or `no'. + +if test -z "$depfile"; then + base=`echo "$object" | sed -e 's,^.*/,,' -e 's,\.\([^.]*\)$,.P\1,'` + dir=`echo "$object" | sed 's,/.*$,/,'` + if test "$dir" = "$object"; then + dir= + fi + # FIXME: should be _deps on DOS. + depfile="$dir.deps/$base" +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" @@ -197,25 +172,19 @@ sgi) 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/'` + # in a .u file. 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. + stripped=`echo "$object" | sed -e 's,^.*/,,' -e 's/\(.*\)\..*$/\1/'` tmpdepfile="$stripped.u" + outname="$stripped.o" 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" @@ -223,7 +192,6 @@ aix) 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:'. @@ -287,40 +255,31 @@ tru64) 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" + tmpdepfile2="$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" + rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi if test -f "$tmpdepfile1"; then tmpdepfile="$tmpdepfile1" - elif test -f "$tmpdepfile2"; then - tmpdepfile="$tmpdepfile2" else - tmpdepfile="$tmpdepfile3" + tmpdepfile="$tmpdepfile2" 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" + # That's a space and a tab in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi @@ -333,7 +292,7 @@ tru64) dashmstdout) # Important note: in order to support this mode, a compiler *must* - # always write the preprocessed file to stdout, regardless of -o. + # always write the proprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. @@ -429,7 +388,7 @@ makedepend) cpp) # Important note: in order to support this mode, a compiler *must* - # always write the preprocessed file to stdout. + # always write the proprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. @@ -471,7 +430,7 @@ cpp) msvisualcpp) # Important note: in order to support this mode, a compiler *must* - # always write the preprocessed file to stdout, regardless of -o, + # always write the proprocessed file to stdout, regardless of -o, # because we must use -o when running libtool. "$@" || exit $? IFS=" " @@ -511,12 +470,3 @@ none) 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 deleted file mode 100644 index 39c3a9146..000000000 --- a/scripts/distfiles +++ /dev/null @@ -1,7 +0,0 @@ -mkdiff -build-w32 -gnupg.spec.in -autogen.sh -mk-gpg-texi -mk-w32-dist -w32installer.nsi diff --git a/scripts/gnupg.spec.in b/scripts/gnupg.spec.in deleted file mode 100644 index d4457cb12..000000000 --- a/scripts/gnupg.spec.in +++ /dev/null @@ -1,212 +0,0 @@ -# -# 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 nstroj pro ifrovanou komunikaci a bezpen ukldn dat -Summary(fr): Utilitaire GNU de chiffrement et d'authentification des communications et des donnes -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/ifrovn -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 Gal Quri - <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 Kritof <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 Gal Quri <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 donnes et crer -des signatures lectroniques. Il a des capacits avances de gestion de -cls et il est conforme la norme propose OpenPGP dcrite 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 nstroj pro bezpenou komunikaci a ukldn dat. Me bt -pouit na ifrovn dat a vytven digitlnch podpis. Obsahuje -funkce pro pokroilou sprvu kl a vyhovuje navrhovanmu OpenPGP -Internet standardu podle RFC2440. Byl vytvoen jako kompletn -nhrada za PGP. Protoe neobsahuje ifrovac algoritmy IDEA nebo RSA, -me bt pouvn bez omezen. -Protoe GnuPG nepouv dn patentovan algoritmus, neme bt pln -kompatibiln s PGP verze 2. PGP 2.x pouv algoritmy IDEA (patentovno -celosvtov) a RSA (patentovno ve Spojench sttech do 20. z -2000). Tyto algoritmy lze zavst do GnuPG pomoc externch modul. - -%description -l pl -GnuPG (GNU Privacy Guard) jest nazedziem do szfrowania danych i tworzenia -cyfrowych podpisw. GnuPG posiada zaawansowane mozliwosci obslugi kluczy -i jest zgodne z OpenPGP, proponowanym standardem internetowym opisanym -w RFC2440. Poniewaz GnuPG nie uzywa zadnych opatentowanych algorytmw -nie jest wiec zgodne z jaka kolwiek wersja PGP2 (PGP2.x kozysta jedynie -z algorytmw: IDEA, opatentowanego na calym swiecie, oraz RSA, ktrego -patent na terenie Stanw 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/gnupgbug b/scripts/gnupgbug deleted file mode 100644 index 52efc2ab4..000000000 --- a/scripts/gnupgbug +++ /dev/null @@ -1,185 +0,0 @@ -#!/bin/sh - -# -# File a bug against the GNU Privacy Guard. -# - -# -# Copyright (c) 2000 Thomas Roessler <roessler@guug.de> -# -# -# 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. -# - -SUBMIT="submit@bugs.guug.de" -DEBIAN_SUBMIT="submit@bugs.debian.org" - - -include_file () -{ - echo - echo "--- Begin $1" - sed -e 's/^-/- -/' $1 | egrep -v '^[ ]*(#|$)' - echo "--- End $1" - echo -} - -case `echo -n` in -"") n=-n; c= ;; - *) n=; c='\c' ;; -esac - - -exec > /dev/tty -exec < /dev/tty - -SCRATCH=${TMPDIR-/tmp}/`basename $0`.`hostname`.$$ - -mkdir ${SCRATCH} || \ -{ - echo "`basename $0`: Can't create temporary directory." >& 2 ; - exit 1 ; -} - -trap "rm -r -f ${SCRATCH} ; trap '' 0 ; exit" 0 1 2 - -TEMPLATE=${SCRATCH}/template.txt - -echo "Please enter a one-line description of the problem you experience:" -echo $n "> $c" -read SUBJECT - -echo $n "Do you want to include your personal GnuPG configuration files? [Y|n]$c" -read personal -case "$personal" in -[nN]*) personal=no ;; - *) personal=yes ;; -esac - -if test -f /etc/debian_version ; then - DEBIAN=yes - echo $n "Checking whether GnuPG has been installed as a package... $c" - GNUPGVERSION="`dpkg -l gnupg | grep ^i | awk '{print $3}'`" 2> /dev/null - if test "$GNUPGVERSION" ; then - DPKG=yes - else - DPKG=no - fi - echo "$DPKG" - if test "$DPKG" = "no" ; then - echo $n "File this bug with Debian? [Y|n]$c" - read $DPKG - case "$DPKG" in - [nN]) DPKG=no ;; - *) DPKG=yes ;; - esac - fi -else - DEBIAN=no - DPKG=no -fi - -test "$MUTTVERSION" || MUTTVERSION="`mutt -v | head -1 | awk '{print $2}' | tr -d i`" -test "$DPKG" = "yes" && SUBMIT="$SUBMIT, $DEBIAN_SUBMIT" - - -exec > ${TEMPLATE} - -echo "Subject: mutt-$MUTTVERSION: $SUBJECT" -echo "To: $SUBMIT" -echo "Cc: $LOGNAME" -echo -echo "Package: mutt" -echo "Version: $MUTTVERSION" -echo -echo "-- Please type your report below this line" -echo -echo -echo - -if test "$DEBIAN" = "yes" ; then - echo "Obtaining Debian-specific information..." > /dev/tty - bug -p -s dummy mutt | \ - sed -n -e "/^-- System Information/,/^---/p" | \ - grep -v '^---' -fi - -echo -echo "-- Mutt Version Information" -echo -mutt -v - -if test "$personal" = "yes" ; then - CANDIDATES=".muttrc-${MUTTVERSION} .muttrc .mutt/muttrc-${MUTTVERSION} .mutt/muttrc" - MATCHED="none" - for f in $CANDIDATES; do - if test -f "${HOME}/$f" ; then - MATCHED="${HOME}/$f" - break - fi - done - - if test "$MATCHED" = "none" ; then - echo "WARNING: Can't find your personal .muttrc." >&2 - else - include_file $MATCHED - fi -fi - -if test "$global" = "yes" ; then - CANDIDATES="Muttrc-${MUTTVERSION} Muttrc" - DIRECTORIES="/etc /usr/local/share/mutt" - MATCHED="none" - for d in $DIRECTORIES ; do - for f in $CANDIDATES; do - if test -f $d/$f ; then - MATCHED="$d/$f" - break - fi - done - test "$MATCHED" = "none" || break - done - - if test "$MATCHED" = "none" ; then - echo "WARNING: Can't find global Muttrc." >&2 - else - include_file $MATCHED - fi -fi - -exec > /dev/tty - -cp $TEMPLATE $SCRATCH/mutt-bug.txt - -input="e" -while : ; do - if test "$input" = "e" ; then - ${VISUAL-vi} $SCRATCH/mutt-bug.txt - if cmp $SCRATCH/mutt-bug.txt ${TEMPLATE} > /dev/null ; then - echo "WARNING: Bug report was not modified!" - fi - fi - - echo $n "Submit, Edit, Print, Quit? [S|e|p|q]$c" - read _input - input="`echo $_input | tr EPSQ epsq`" - case $input in - e*) ;; - p*) ${PAGER-more} $SCRATCH/mutt-bug.txt ;; - s*|"") /usr/sbin/sendmail -t < $SCRATCH/mutt-bug.txt ; exit ;; - q*) exit - esac -done - diff --git a/scripts/install-sh b/scripts/install-sh index 0b65ee871..6ce63b9f7 100755 --- a/scripts/install-sh +++ b/scripts/install-sh @@ -1,8 +1,7 @@ #!/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. @@ -42,11 +41,13 @@ scriptversion=2004-10-22.00 # 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}" @@ -58,266 +59,236 @@ stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" +transformbasename="" +transform_arg="" +instcmd="$mvprog" chmodcmd="$chmodprog 0755" -chowncmd= -chgrpcmd= -stripcmd= +chowncmd="" +chgrpcmd="" +stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" -src= -dst= -dir_arg= -dstarg= -no_target_directory= +src="" +dst="" +dir_arg="" -usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE - or: $0 [OPTION]... SRCFILES... DIRECTORY - or: $0 [OPTION]... -t DIRECTORY SRCFILES... - or: $0 [OPTION]... -d DIRECTORIES... +while [ x"$1" != x ]; do + case $1 in + -c) instcmd=$cpprog + shift + continue;; -In the 1st form, copy SRCFILE to DSTFILE. -In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. -In the 4th, create DIRECTORIES. + -d) dir_arg=true + shift + continue;; -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. + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; -Environment variables override the default commands: - CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG -" + -o) chowncmd="$chownprog $2" + shift + shift + continue;; -while test -n "$1"; do - case $1 in - -c) shift - continue;; + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; - -d) dir_arg=true - shift - continue;; + -s) stripcmd=$stripprog + shift + continue;; - -g) chgrpcmd="$chgrpprog $2" - shift - shift - continue;; + -t=*) transformarg=`echo $1 | sed 's/-t=//'` + shift + continue;; - --help) echo "$usage"; exit 0;; + -b=*) transformbasename=`echo $1 | sed 's/-b=//'` + shift + continue;; - -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 + *) if [ x"$src" = x ] + then + src=$1 + else + # this colon is to work around a 386BSD /bin/sh bug + : + dst=$1 + fi + shift + continue;; + 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 +if [ x"$src" = x ] +then + echo "$0: no input file specified" >&2 + exit 1 +else + : fi -for src -do - # Protect names starting with `-'. - case $src in - -*) src=./$src ;; - esac +if [ x"$dir_arg" != x ]; then + dst=$src + src="" - if test -n "$dir_arg"; then - dst=$src - src= + if [ -d "$dst" ]; then + instcmd=: + chmodcmd="" + else + instcmd=$mkdirprog + fi +else - 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 +# Waiting for this to be detected by the "$instcmd $src $dsttmp" command +# might cause directories to be created, which would be especially bad +# if $src (and thus $dsttmp) contains '*'. - if test -z "$dstarg"; then - echo "$0: no destination specified." >&2 - exit 1 - fi + if [ -f "$src" ] || [ -d "$src" ] + then + : + else + echo "$0: $src does not exist" >&2 + exit 1 + fi - dst=$dstarg - # Protect names starting with `-'. - case $dst in - -*) dst=./$dst ;; - esac + if [ x"$dst" = x ] + then + echo "$0: no destination specified" >&2 + exit 1 + else + : + fi - # 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 +# If destination is a directory, append the input filename; if your system +# does not like double slashes in filenames, you may need to add some logic - # This sed command emulates the dirname command. - dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'` + if [ -d "$dst" ] + then + dst=$dst/`basename "$src"` + else + : + fi +fi - # Make sure that the destination directory exists. +## this sed command emulates the dirname command +dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` - # Skip lots of stat calls in the usual case. - if test ! -d "$dstdir"; then - defaultIFS=' - ' - IFS="${IFS-$defaultIFS}" +# Make sure that the destination directory exists. +# this part is taken from Noah Friedman's mkinstalldirs script - 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 +# Skip lots of stat calls in the usual case. +if [ ! -d "$dstdir" ]; then +defaultIFS=' + ' +IFS="${IFS-$defaultIFS}" - pathcomp= +oIFS=$IFS +# Some sh's can't handle IFS=/ for some reason. +IFS='%' +set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` +IFS=$oIFS - 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 +pathcomp='' - 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"; } +while [ $# -ne 0 ] ; do + pathcomp=$pathcomp$1 + shift - else - dstfile=`basename "$dst"` + if [ ! -d "$pathcomp" ] ; + then + $mkdirprog "$pathcomp" + else + : + fi - # 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; } + pathcomp=$pathcomp/ done +fi + +if [ x"$dir_arg" != x ] +then + $doit $instcmd "$dst" && + + if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dst"; else : ; fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dst"; else : ; fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dst"; else : ; fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dst"; else : ; fi +else + +# If we're going to rename the final executable, determine the name now. + + if [ x"$transformarg" = x ] + then + dstfile=`basename "$dst"` + else + dstfile=`basename "$dst" $transformbasename | + sed $transformarg`$transformbasename + fi + +# don't allow the sed command to completely eliminate the filename + + if [ x"$dstfile" = x ] + then + dstfile=`basename "$dst"` + else + : + fi + +# Make a couple of temp file names in the proper directory. + + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + +# Trap to clean up temp files at exit. + + trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0 + trap '(exit $?); exit' 1 2 13 15 + +# Move or copy the file name to the temp name + + $doit $instcmd "$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 $instcmd $src $dsttmp" command. + + if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp"; else :;fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp"; else :;fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dsttmp"; else :;fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; else :;fi && + +# 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 [ -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 && # 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: +{ + (exit 0); exit +} diff --git a/scripts/log_accum b/scripts/log_accum deleted file mode 100755 index 0629abb48..000000000 --- a/scripts/log_accum +++ /dev/null @@ -1,595 +0,0 @@ -#! /usr/bin/perl -# -*-Perl-*- -# -# Perl filter to handle the log messages from the checkin of files in -# a directory. This script will group the lists of files by log -# message, and mail a single consolidated log message at the end of -# the commit. -# -# This file assumes a pre-commit checking program that leaves the -# names of the first and last commit directories in a temporary file. -# -# Contributed by David Hampton <hampton@cisco.com> -# -# hacked greatly by Greg A. Woods <woods@planix.com> -# -# Modified by werner.koch@guug.de to add support for -# automagically extraction of ChangeLog entries 1998-12-29 - -# Usage: log_accum.pl [-d] [-s] [-M module] [[-m mailto] ...] [[-R replyto] ...] [-f logfile] -# -d - turn on debugging -# -m mailto - send mail to "mailto" (multiple) -# -R replyto - set the "Reply-To:" to "replyto" (multiple) -# -M modulename - set module name to "modulename" -# -f logfile - write commit messages to logfile too -# -s - *don't* run "cvs status -v" for each file -# -w - show working directory with log message - -# -# Configurable options -# - -# set this to something that takes a whole message on stdin -$MAILER = "/usr/lib/sendmail -t"; - -# -# End user configurable options. -# - -# Constants (don't change these!) -# -$STATE_NONE = 0; -$STATE_CHANGED = 1; -$STATE_ADDED = 2; -$STATE_REMOVED = 3; -$STATE_LOG = 4; - -$LAST_FILE = "/tmp/#cvs.lastdir"; - -$CHANGED_FILE = "/tmp/#cvs.files.changed"; -$ADDED_FILE = "/tmp/#cvs.files.added"; -$REMOVED_FILE = "/tmp/#cvs.files.removed"; -$LOG_FILE = "/tmp/#cvs.files.log"; - -$FILE_PREFIX = "#cvs.files"; - -# -# Subroutines -# - -sub cleanup_tmpfiles { - local($wd, @files); - - $wd = `pwd`; - chdir("/tmp") || die("Can't chdir('/tmp')\n"); - opendir(DIR, "."); - push(@files, grep(/^$FILE_PREFIX\..*\.$id$/, readdir(DIR))); - closedir(DIR); - foreach (@files) { - unlink $_; - } - unlink $LAST_FILE . "." . $id; - - chdir($wd); -} - -sub write_logfile { - local($filename, @lines) = @_; - - open(FILE, ">$filename") || die("Cannot open log file $filename.\n"); - print FILE join("\n", @lines), "\n"; - close(FILE); -} - -sub append_to_logfile { - local($filename, @lines) = @_; - - open(FILE, ">$filename") || die("Cannot open log file $filename.\n"); - print FILE join("\n", @lines), "\n"; - close(FILE); -} - -sub format_names { - local($dir, @files) = @_; - local(@lines); - - $format = "\t%-" . sprintf("%d", length($dir)) . "s%s "; - - $lines[0] = sprintf($format, $dir, ":"); - - if ($debug) { - print STDERR "format_names(): dir = ", $dir, "; files = ", join(":", @files), ".\n"; - } - foreach $file (@files) { - if (length($lines[$#lines]) + length($file) > 65) { - $lines[++$#lines] = sprintf($format, " ", " "); - } - $lines[$#lines] .= $file . " "; - } - - @lines; -} - -sub format_lists { - local(@lines) = @_; - local(@text, @files, $lastdir); - - if ($debug) { - print STDERR "format_lists(): ", join(":", @lines), "\n"; - } - @text = (); - @files = (); - $lastdir = shift @lines; # first thing is always a directory - if ($lastdir !~ /.*\/$/) { - die("Damn, $lastdir doesn't look like a directory!\n"); - } - foreach $line (@lines) { - if ($line =~ /.*\/$/) { - push(@text, &format_names($lastdir, @files)); - $lastdir = $line; - @files = (); - } else { - push(@files, $line); - } - } - push(@text, &format_names($lastdir, @files)); - - @text; -} - -sub append_names_to_file { - local($filename, $dir, @files) = @_; - - if (@files) { - open(FILE, ">>$filename") || die("Cannot open file $filename.\n"); - print FILE $dir, "\n"; - print FILE join("\n", @files), "\n"; - close(FILE); - } -} - -sub read_line { - local($line); - local($filename) = @_; - - open(FILE, "<$filename") || die("Cannot open file $filename.\n"); - $line = <FILE>; - close(FILE); - chop($line); - $line; -} - -sub read_logfile { - local(@text); - local($filename, $leader) = @_; - - open(FILE, "<$filename"); - while (<FILE>) { - chop; - push(@text, $leader.$_); - } - close(FILE); - @text; -} - -sub build_header { - local($header); - local($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); - $header = sprintf("CVSROOT:\t%s\nModule name:\t%s\nRepository:\t%s\nChanges by:\t%s@%s\t%02d/%02d/%02d %02d:%02d:%02d", - $cvsroot, - $modulename, - $dir, - $login, $hostdomain, - $year%100, $mon+1, $mday, - $hour, $min, $sec); -} - -sub mail_notification { - local(@text) = @_; - - # if only we had strftime()... stuff stolen from perl's ctime.pl: - local($[) = 0; - - @DoW = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); - @MoY = ('Jan','Feb','Mar','Apr','May','Jun', - 'Jul','Aug','Sep','Oct','Nov','Dec'); - - # Determine what time zone is in effect. - # Use GMT if TZ is defined as null, local time if TZ undefined. - # There's no portable way to find the system default timezone. - # - $TZ = defined($ENV{'TZ'}) ? ( $ENV{'TZ'} ? $ENV{'TZ'} : 'GMT' ) : ''; - - # Hack to deal with 'PST8PDT' format of TZ - # Note that this can't deal with all the esoteric forms, but it - # does recognize the most common: [:]STDoff[DST[off][,rule]] - # - if ($TZ =~ /^([^:\d+\-,]{3,})([+-]?\d{1,2}(:\d{1,2}){0,2})([^\d+\-,]{3,})?/) { - $TZ = $isdst ? $4 : $1; - $tzoff = sprintf("%05d", -($2) * 100); - } - - # perl-4.036 doesn't have the $zone or $gmtoff... - ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst, $zone, $gmtoff) = - ($TZ eq 'GMT') ? gmtime(time) : localtime(time); - - $year += ($year < 70) ? 2000 : 1900; - - if ($gmtoff != 0) { - $tzoff = sprintf("%05d", ($gmtoff / 60) * 100); - } - if ($zone ne '') { - $TZ = $zone; - } - - # ok, let's try.... - $rfc822date = sprintf("%s, %2d %s %4d %2d:%02d:%02d %s (%s)", - $DoW[$wday], $mday, $MoY[$mon], $year, - $hour, $min, $sec, $tzoff, $TZ); - - open(MAIL, "| $MAILER"); - print MAIL "Date: " . $rfc822date . "\n"; - print MAIL "Subject: CVS Update: " . $modulename . "\n"; - print MAIL "To: " . $mailto . "\n"; - print MAIL "Reply-To: " . $replyto . "\n"; - print MAIL "\n"; - print MAIL join("\n", @text), "\n"; - close(MAIL); -} - -sub write_commitlog { - local($logfile, @text) = @_; - - open(FILE, ">>$logfile"); - print FILE join("\n", @text), "\n"; - close(FILE); -} - -# -# Main Body -# - -# Initialize basic variables -# -$debug = 0; -$id = getpgrp(); # note, you *must* use a shell which does setpgrp() -$state = $STATE_NONE; -$login = getlogin || (getpwuid($<))[0] || "nobody"; -chop($hostname = `hostname`); -chop($domainname = `domainname`); -if ($domainname !~ '^\..*') { - $domainname = '.' . $domainname; -} -$hostdomain = $hostname . $domainname; -$cvsroot = $ENV{'CVSROOT'}; -$do_status = 1; # moderately useful -$show_wd = 0; # useless in client/server -$modulename = ""; - -# parse command line arguments (file list is seen as one arg) -# -while (@ARGV) { - $arg = shift @ARGV; - - if ($arg eq '-d') { - $debug = 1; - print STDERR "Debug turned on...\n"; - } elsif ($arg eq '-m') { - if ($mailto eq '') { - $mailto = shift @ARGV; - } else { - $mailto = $mailto . ", " . shift @ARGV; - } - } elsif ($arg eq '-R') { - if ($replyto eq '') { - $replyto = shift @ARGV; - } else { - $replyto = $replyto . ", " . shift @ARGV; - } - } elsif ($arg eq '-M') { - $modulename = shift @ARGV; - } elsif ($arg eq '-s') { - $do_status = 0; - } elsif ($arg eq '-w') { - $show_wd = 1; - } elsif ($arg eq '-f') { - ($commitlog) && die("Too many '-f' args\n"); - $commitlog = shift @ARGV; - } else { - ($donefiles) && die("Too many arguments! Check usage.\n"); - $donefiles = 1; - @files = split(/ /, $arg); - } -} -($mailto) || die("No mail recipient specified (use -m)\n"); -if ($replyto eq '') { - $replyto = $login; -} - -# for now, the first "file" is the repository directory being committed, -# relative to the $CVSROOT location -# -@path = split('/', $files[0]); - -# XXX There are some ugly assumptions in here about module names and -# XXX directories relative to the $CVSROOT location -- really should -# XXX read $CVSROOT/CVSROOT/modules, but that's not so easy to do, since -# XXX we have to parse it backwards. -# XXX -# XXX Fortunately it's relatively easy for the user to specify the -# XXX module name as appropriate with a '-M' via the directory -# XXX matching in loginfo. -# -if ($modulename eq "") { - $modulename = $path[0]; # I.e. the module name == top-level dir -} -if ($#path == 0) { - $dir = "."; -} else { - $dir = join('/', @path); -} -$dir = $dir . "/"; - -if ($debug) { - print STDERR "module - ", $modulename, "\n"; - print STDERR "dir - ", $dir, "\n"; - print STDERR "path - ", join(":", @path), "\n"; - print STDERR "files - ", join(":", @files), "\n"; - print STDERR "id - ", $id, "\n"; -} - -# Check for a new directory first. This appears with files set as follows: -# -# files[0] - "path/name/newdir" -# files[1] - "-" -# files[2] - "New" -# files[3] - "directory" -# -if ($files[2] =~ /New/ && $files[3] =~ /directory/) { - local(@text); - - @text = (); - push(@text, &build_header()); - push(@text, ""); - push(@text, $files[0]); - push(@text, ""); - - while (<STDIN>) { - chop; # Drop the newline - push(@text, $_); - } - - &mail_notification($mailto, @text); - - exit 0; -} - -# Check for an import command. This appears with files set as follows: -# -# files[0] - "path/name" -# files[1] - "-" -# files[2] - "Imported" -# files[3] - "sources" -# -if ($files[2] =~ /Imported/ && $files[3] =~ /sources/) { - local(@text); - - @text = (); - push(@text, &build_header()); - push(@text, ""); - push(@text, $files[0]); - push(@text, ""); - - while (<STDIN>) { - chop; # Drop the newline - push(@text, $_); - } - - &mail_notification(@text); - - exit 0; -} - -# Iterate over the body of the message collecting information. -# -while (<STDIN>) { - chop; # Drop the newline - - if (/^In directory/) { - if ($show_wd) { # useless in client/server mode - push(@log_lines, $_); - push(@log_lines, ""); - } - next; - } - - if (/^Modified Files/) { $state = $STATE_CHANGED; next; } - if (/^Added Files/) { $state = $STATE_ADDED; next; } - if (/^Removed Files/) { $state = $STATE_REMOVED; next; } - if (/^Log Message/) { $state = $STATE_LOG; next; } - - s/^[ \t\n]+//; # delete leading whitespace - s/[ \t\n]+$//; # delete trailing whitespace - - if ($state == $STATE_CHANGED) { push(@changed_files, split); } - if ($state == $STATE_ADDED) { push(@added_files, split); } - if ($state == $STATE_REMOVED) { push(@removed_files, split); } - if ($state == $STATE_LOG) { - if( /^See[ ]ChangeLog:[ ](.*)/ ) { - $changelog = $1; - $okay = false; - open(RCS, "-|") || exec 'cvs', '-Qn', 'update', '-p', 'ChangeLog'; - while (<RCS>) { - if( /^$changelog .*/ ) { - $okay = true; - push(@log_lines, $_); - } - elsif( $okay ) { - last if( /^[A-Z]+.*/ ); - push(@log_lines, $_); - } - } - while (<RCS>) { ; } - close(RCS); - } - else { - push(@log_lines, $_); - } - } -} - -# Strip leading and trailing blank lines from the log message. Also -# compress multiple blank lines in the body of the message down to a -# single blank line. -# -while ($#log_lines > -1) { - last if ($log_lines[0] ne ""); - shift(@log_lines); -} -while ($#log_lines > -1) { - last if ($log_lines[$#log_lines] ne ""); - pop(@log_lines); -} -for ($i = $#log_lines; $i > 0; $i--) { - if (($log_lines[$i - 1] eq "") && ($log_lines[$i] eq "")) { - splice(@log_lines, $i, 1); - } -} - -if ($debug) { - print STDERR "Searching for log file index..."; -} -# Find an index to a log file that matches this log message -# -for ($i = 0; ; $i++) { - local(@text); - - last if (! -e "$LOG_FILE.$i.$id"); # the next available one - @text = &read_logfile("$LOG_FILE.$i.$id", ""); - last if ($#text == -1); # nothing in this file, use it - last if (join(" ", @log_lines) eq join(" ", @text)); # it's the same log message as another -} -if ($debug) { - print STDERR " found log file at $i.$id, now writing tmp files.\n"; -} - -# Spit out the information gathered in this pass. -# -&append_names_to_file("$CHANGED_FILE.$i.$id", $dir, @changed_files); -&append_names_to_file("$ADDED_FILE.$i.$id", $dir, @added_files); -&append_names_to_file("$REMOVED_FILE.$i.$id", $dir, @removed_files); -&write_logfile("$LOG_FILE.$i.$id", @log_lines); - -# Check whether this is the last directory. If not, quit. -# -if ($debug) { - print STDERR "Checking current dir against last dir.\n"; -} -$_ = &read_line("$LAST_FILE.$id"); - -if ($_ ne $cvsroot . "/" . $files[0]) { - if ($debug) { - print STDERR sprintf("Current directory %s is not last directory %s.\n", $cvsroot . "/" .$files[0], $_); - } - exit 0; -} -if ($debug) { - print STDERR sprintf("Current directory %s is last directory %s -- all commits done.\n", $files[0], $_); -} - -# -# End Of Commits! -# - -# This is it. The commits are all finished. Lump everything together -# into a single message, fire a copy off to the mailing list, and drop -# it on the end of the Changes file. -# - -# -# Produce the final compilation of the log messages -# -@text = (); -@status_txt = (); -push(@text, &build_header()); -push(@text, ""); - -for ($i = 0; ; $i++) { - last if (! -e "$LOG_FILE.$i.$id"); # we're done them all! - @lines = &read_logfile("$CHANGED_FILE.$i.$id", ""); - if ($#lines >= 0) { - push(@text, "Modified files:"); - push(@text, &format_lists(@lines)); - } - @lines = &read_logfile("$ADDED_FILE.$i.$id", ""); - if ($#lines >= 0) { - push(@text, "Added files:"); - push(@text, &format_lists(@lines)); - } - @lines = &read_logfile("$REMOVED_FILE.$i.$id", ""); - if ($#lines >= 0) { - push(@text, "Removed files:"); - push(@text, &format_lists(@lines)); - } - if ($#text >= 0) { - push(@text, ""); - } - @lines = &read_logfile("$LOG_FILE.$i.$id", "\t"); - if ($#lines >= 0) { - push(@text, "Log message:"); - push(@text, @lines); - push(@text, ""); - } - if ($do_status) { - local(@changed_files); - - @changed_files = (); - push(@changed_files, &read_logfile("$CHANGED_FILE.$i.$id", "")); - push(@changed_files, &read_logfile("$ADDED_FILE.$i.$id", "")); - push(@changed_files, &read_logfile("$REMOVED_FILE.$i.$id", "")); - - if ($debug) { - print STDERR "main: pre-sort changed_files = ", join(":", @changed_files), ".\n"; - } - sort(@changed_files); - if ($debug) { - print STDERR "main: post-sort changed_files = ", join(":", @changed_files), ".\n"; - } - - foreach $dofile (@changed_files) { - if ($dofile =~ /\/$/) { - next; # ignore the silly "dir" entries - } - if ($debug) { - print STDERR "main(): doing 'cvs -nQq status -v $dofile'\n"; - } - open(STATUS, "-|") || exec 'cvs', '-nQq', 'status', '-v', $dofile; - while (<STATUS>) { - chop; - push(@status_txt, $_); - } - } - } -} - -# Write to the commitlog file -# -if ($commitlog) { - &write_commitlog($commitlog, @text); -} - -if ($#status_txt >= 0) { - push(@text, @status_txt); -} - -# Mailout the notification. -# -&mail_notification(@text); - -# cleanup -# -if (! $debug) { - &cleanup_tmpfiles(); -} - -exit 0; diff --git a/scripts/mail-to-translators b/scripts/mail-to-translators deleted file mode 100755 index 7aac1606b..000000000 --- a/scripts/mail-to-translators +++ /dev/null @@ -1,78 +0,0 @@ -#!/bin/sh -# mail a compressed version of the current translation to the Last-Translator -# - -# remove the colon to armor this script. -SENDMAIL=": /usr/sbin/sendmail" - -for file in *.po; do - addr=$(head -100 $file | awk '/^# ?Designated-Translator:/ { printf "%s", $0; exit 0}' | sed 's/.*\(<.*>\).*/\1/') - if [ -z "$addr" ]; then - addr=$(awk '/Last-Translator:/ { printf "%s", $0; exit 0}' $file | sed 's/.*\(<.*>\).*/\1/') - fi - ll=$(basename $file .po) - - if ! msgfmt -vc $file 2>&1| egrep -q 'fuzzy|untranslated|error'; then - echo "$file: okay" >&2 - continue; - fi - - if ! echo "$addr" | grep -q @ ; then - echo "$file: no translator known" >&2 - continue; - fi - - echo "$file: sending to $addr" - ( cat <<EOF -From: translations@gnupg.org -To: $addr -Mail-Followup-To: translations@gnupg.org -Subject: GnuPG translation ($ll) -Mime-Version: 1.0 -Content-Type: multipart/mixed; boundary="=-=-=" - ---=-=-= - -Hi! - -We are preparing for a new 1.4 release of GnuPG and like you to ask to -update your translation. - -Please find attached the very latest version of the PO file for your -GnuPG translation ($file). - -IMHO it is important to have a basic understanding of GnuPG's -functionality to do a correct translation. A false translation might -lead to security problems. Furthermore the TP Robot is not able to -handle more than one version of a project (we have 1.2, 1.4 and also -1.9) and thus I'd ask you *not to use the TP Robot* for GnuPG. - -Output of msgfmt is: -$(msgfmt --check --statistics $file 2>&1 | head) - -If you are not able to continue the translation work, I suggest to -pass this message on to another translator and drop a a short note to -gnupg-hackers@gnupg.org . - - -Thanks, - - Werner - - ---=-=-= -Content-Type: application/octet-stream -Content-Disposition: attachment; filename=gnupg-${file}.gz -Content-Transfer-Encoding: base64 - -EOF - -gzip <$file | mimencode - -echo "" -echo "--=-=-=--" -echo "" - ) | $SENDMAIL -oi "$addr" - -done - diff --git a/scripts/mdate-sh b/scripts/mdate-sh new file mode 100755 index 000000000..b610b47a6 --- /dev/null +++ b/scripts/mdate-sh @@ -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 index 3392b9e70..6a37006e8 100755 --- a/scripts/missing +++ b/scripts/missing @@ -1,10 +1,6 @@ #! /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. +# Copyright (C) 1996, 1997, 1999, 2000, 2002 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 @@ -19,8 +15,8 @@ scriptversion=2004-09-07.08 # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301, USA. +# 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 @@ -42,24 +38,18 @@ 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 ;; +esac + +# If it does not exist, or fails to run (possibly an outdated version), +# try to emulate it. +case "$1" in -h|--h|--he|--hel|--help) echo "\ @@ -84,15 +74,11 @@ Supported PROGRAM values: 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 + yacc create \`y.tab.[ch]', if possible, from existing .[ch]" ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) - echo "missing $scriptversion (GNU Automake)" - exit 0 + echo "missing 0.4 - GNU automake" ;; -*) @@ -101,44 +87,14 @@ Send bug reports to <bug-automake@gnu.org>." 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 - ;; - - *) + aclocal*) 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 +WARNING: \`$1' is missing on your system. 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." @@ -146,8 +102,13 @@ WARNING: \`$1' is $msg. You should only need it if ;; autoconf) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if +WARNING: \`$1' is missing on your system. 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." @@ -155,8 +116,13 @@ WARNING: \`$1' is $msg. You should only need it if ;; autoheader) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if +WARNING: \`$1' is missing on your system. 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." @@ -174,8 +140,13 @@ WARNING: \`$1' is $msg. You should only need it if ;; automake*) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if +WARNING: \`$1' is missing on your system. 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." @@ -185,11 +156,16 @@ WARNING: \`$1' is $msg. You should only need it if ;; autom4te) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + echo 1>&2 "\ -WARNING: \`$1' is needed, but is $msg. - You might have modified some files without having the +WARNING: \`$1' is needed, and you do not seem to have it handy on your + system. 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 + You can get \`$1Help2man' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` @@ -209,7 +185,7 @@ WARNING: \`$1' is needed, but is $msg. bison|yacc) echo 1>&2 "\ -WARNING: \`$1' $msg. You should only need it if +WARNING: \`$1' is missing on your system. 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." @@ -239,7 +215,7 @@ WARNING: \`$1' $msg. You should only need it if lex|flex) echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if +WARNING: \`$1' is missing on your system. 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." @@ -261,8 +237,13 @@ WARNING: \`$1' is $msg. You should only need it if ;; help2man) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if +WARNING: \`$1' is missing on your system. 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." @@ -281,8 +262,13 @@ WARNING: \`$1' is $msg. You should only need it if ;; makeinfo) + if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then + # We have makeinfo, but it failed. + exit 1 + fi + echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if +WARNING: \`$1' is missing on your system. 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, @@ -298,6 +284,10 @@ WARNING: \`$1' is $msg. You should only need it if tar) shift + if test -n "$run"; then + echo 1>&2 "ERROR: \`tar' requires --run" + exit 1 + fi # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error @@ -333,10 +323,10 @@ WARNING: I can't seem to be able to run \`tar' with the given arguments. *) echo 1>&2 "\ -WARNING: \`$1' is needed, and is $msg. - You might have modified some files without having the +WARNING: \`$1' is needed, and you do not seem to have it handy on your + system. 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 + it often tells you about the needed prerequirements 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 @@ -344,10 +334,3 @@ WARNING: \`$1' is needed, and is $msg. 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-gpg-texi b/scripts/mk-gpg-texi deleted file mode 100755 index e269b5493..000000000 --- a/scripts/mk-gpg-texi +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/sh -# Helper to create the texinfo versions from gpg.sgml -# -# Copyright (C) 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 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 - -for file in gpg gpgv; do - sgml2xml -x lower ${file}.sgml >${file}.xml -# docbook2texi ${file}.xml | sed 's,--,---,' | ( - docbook2x-texi --to-stdout ${file}.xml | \ - sed '/^@setfilename/,/^@end direntry/d' | ( - case "$file" in - *gpgv) - sed '/\\input texinfo/a \ -@setfilename gpgv.info\ -@dircategory GnuPG\ -@direntry\ -* gpgv: (gpgv). GnuPG signature verification tool.\ -@end direntry -' - ;; - - gpg) - sed '/\\input texinfo/a \ -@setfilename gpg.info\ -@dircategory GnuPG\ -@direntry\ -* gpg: (gpg). GnuPG encryption and signing tool.\ -@end direntry -' - ;; - - *) - cat - ;; - esac - ) >${file}.texi - -done - - - - diff --git a/scripts/mk-w32-dist b/scripts/mk-w32-dist deleted file mode 100755 index 3f687cafd..000000000 --- a/scripts/mk-w32-dist +++ /dev/null @@ -1,301 +0,0 @@ -#!/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 deleted file mode 100755 index f17979383..000000000 --- a/scripts/mkdiff +++ /dev/null @@ -1,115 +0,0 @@ -#!/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 index 6fbe5e117..d2d5f21b6 100755 --- a/scripts/mkinstalldirs +++ b/scripts/mkinstalldirs @@ -1,32 +1,20 @@ #! /bin/sh # mkinstalldirs --- make directory hierarchy - -scriptversion=2004-02-15.20 - -# Original author: Noah Friedman <friedman@prep.ai.mit.edu> +# 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>. +# Public domain 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>." +Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..." # process command line arguments while test $# -gt 0 ; do case $1 in -h | --help | --h*) # -h for help - echo "$usage" + echo "$usage" 1>&2 exit 0 ;; -m) # -m PERM arg @@ -35,10 +23,6 @@ while test $# -gt 0 ; do dirmode=$1 shift ;; - --version) - echo "$0 $scriptversion" - exit 0 - ;; --) # stop option processing shift break @@ -66,37 +50,17 @@ 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 + if mkdir -p -- . 2>/dev/null; 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 + if mkdir -m "$dirmode" -p -- . 2>/dev/null; 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 @@ -120,17 +84,17 @@ do mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then - errstatus=$lasterr + errstatus=$lasterr else - if test ! -z "$dirmode"; then + if test ! -z "$dirmode"; then echo "chmod $dirmode $pathcomp" - lasterr="" - chmod "$dirmode" "$pathcomp" || lasterr=$? + lasterr="" + chmod "$dirmode" "$pathcomp" || lasterr=$? - if test ! -z "$lasterr"; then - errstatus=$lasterr - fi - fi + if test ! -z "$lasterr"; then + errstatus=$lasterr + fi + fi fi fi @@ -143,8 +107,5 @@ 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: +# mkinstalldirs ends here diff --git a/scripts/mksnapshot b/scripts/mksnapshot deleted file mode 100755 index cca19d98d..000000000 --- a/scripts/mksnapshot +++ /dev/null @@ -1,79 +0,0 @@ -#!/bin/sh -# Make a snapshot of the CVS head revision - -exec >>/home/koch/mksnapshot.log 2>&1 - -echo "Started at `date`." -set -e - -ftp_dir=$1 - -cd $HOME/pub -PATH="$HOME/bin:$PATH" - -fix_version () { - version=$(cat $1/VERSION) - echo "$version-snap$(date +%Y-%m-%d)" >$1/VERSION - cat <<EOF >$1/SNAPSHOT - WARNING! - -This is a snapshot of the current CVS head branch! - -It may not compile or not work. Please don't report -bugs about this snapshot release it is just for your -convenience and to reduce the load of out CVS server. - -Thanks, - - Werner -EOF -} - -build_dist () { - set +e - nice scripts/autogen.sh && nice ./configure && nice make dist - if ! awk ' -/^diff gnupg-snapshot\/VERSION/ { getline; getline; getline; getline; next } -/^Common subdirectories:/ { next } -/~$/ { next } -{ exit 1 } -' ; then - # Okay, we have some changes and it is not only the version number - rm $ftp_dir/gnupg-*snap*-*-*.tar.gz - mv gnupg-*.tar.gz $ftp_dir/ - fi - make distclean - set -e -} - - - -do_export () { - pgm=$1 - mod=$2 - - rm -rf $pgm.new || true - rm -rf $pgm.old || true - cvs -Q export -r HEAD -d $pgm.new $mod - fix_version $pgm.new - if [ -n "$ftp_dir" ]; then - here=$(pwd) - cd $pgm.new - build_dist - cd $here - fi - [ -d $pgm ] && mv $pgm $pgm.old - if ! mv $pgm.new $pgm ; then - echo "rename failed - restoring" >&2 - mv $pgm.old $pgm - exit 1 - fi - rm -rf $pgm.old || true -} - - -do_export gnupg-snapshot gnupg - -echo "Ended at `date`." -exit 0 - diff --git a/scripts/mkwebpage b/scripts/mkwebpage deleted file mode 100755 index b39feb176..000000000 --- a/scripts/mkwebpage +++ /dev/null @@ -1,105 +0,0 @@ -#!/bin/sh -# Make a snapshot of the CVS head revision for the gnupg webpages - - -set -e - -cd $HOME/pub - -extract_date () { - # This strange construct is to speed up things. Grouping a "s" and a "q" - # does not work. Anyway we should use awk instead. - # Have to quote the I from $Id so that CVS does not expand it - sed '/^.*\$[I]d:.*\$.*$/q' $1 | - sed -n 's!^.*\$[I]d: [^ ]\+ [^ ]\+ \([0-9]*\)/\([0-9]*\)/\([0-9]*\) [^ ]\+ \([^ ]\+\).*$!\1-\2-\3 \4!p' -} - -# We have to edit most files -sed_it () { - src=$1 - dst=$2 - - for srcdir in `find $src -type d -print` ; do - dstdir=`echo "$srcdir" | sed "s/^$src/$dst/g"` - mkdir $dstdir || true - for sf in `find $srcdir -type f -maxdepth 1 -print`; do - updated=`extract_date $sf` - df="$dstdir/`basename $sf`" - case "$df" in - *.html) - sed "/@FOOTER@/ { - r $src/footer.html.inc - d - } - /^<body>$/ { - r $src/body-tag.html.inc - d - } - /@UPDATED@/c\\ -Updated: $updated \\ -<hr> - /@INSERT_BUGLIST_HERE@/ { - r $src/BUGS - d - } - /@HOSTEDBY@/ { - r $src/hostedby.html.inc - d - } - " $sf > $df - ;; - *.html.inc | *~ | *.tmp | */BUGS ) - : - ;; - *) - cat $sf > $df - ;; - esac - done - done -} - - -do_export () { - pgm=$1 - mod=$2 - - rm -rf $pgm.tmp 2>/dev/null || true - rm -rf $pgm.new || true - rm -rf $pgm.old || true - cvs -Q export -r HEAD -d $pgm.tmp $mod - cat <<EOF >$pgm.tmp/NEWS -[ This is a snapshot of the NEWS file from the CVS head revision. - You will find the NEWS for the latest revision below the line - "Noteworthy changes in version 0.x.y". - (wk $(date +%Y-%m-%d)) ] - - -EOF - cvs -Q checkout -p gnupg/NEWS >>$pgm.tmp/NEWS - cvs -Q checkout -p gnupg/BUGS | sed '1,/^~~~~~~~~~~~/ d' > $pgm.tmp/BUGS - echo "(List generated from CVS: " $(date +%Y-%m-%d) ")" >> $pgm.tmp/BUGS - sed_it $pgm.tmp $pgm.new - rm -rf $pgm.tmp || true - ln -sf gnupg.html $pgm.new/index.html - - rm -rf $pgm.old || true - [ -d $pgm ] && mv $pgm $pgm.old - if ! mv $pgm.new $pgm ; then - echo "rename failed - restoring" >&2 - mv $pgm.old $pgm - exit 1 - fi - rm -rf $pgm.old || true -} - - -do_export gnupg-www gnupg-www - -#cd gnupg-www -#tar czf /home/ftp/pub/gcrypt/.old/webpages.tmp * -#mv /home/ftp/pub/gcrypt/old/webpages.tmp /home/ftp/pub/gcrypt/old/webpages.tar.gz - - -exit 0 - diff --git a/scripts/texinfo.tex b/scripts/texinfo.tex new file mode 100644 index 000000000..e9293f3b9 --- /dev/null +++ b/scripts/texinfo.tex @@ -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 deleted file mode 100644 index 5a3266408..000000000 --- a/scripts/w32installer.nsi +++ /dev/null @@ -1,674 +0,0 @@ -; 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" - 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" - - 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 Krze: Sie haben das Recht, die Software zu jedem Zweck \ - einzusetzen. Sie knnen die Software weitergeben, sofern Sie dem \ - Empfnger dieselben Rechte einrumen, 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 fr eine erfolgreiche \ - Installation bentigt." - - -; 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 fr 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} \ - "Untersttzung fr 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/sm/ChangeLog b/sm/ChangeLog new file mode 100644 index 000000000..55a539ad6 --- /dev/null +++ b/sm/ChangeLog @@ -0,0 +1,1631 @@ +2006-07-03 Werner Koch <wk@g10code.com> + + * certreqgen.c (proc_parameters): Print the component label of a + faulty DN. + +2006-06-26 Werner Koch <wk@g10code.com> + + * certdump.c (gpgsm_cert_log_name): New. + * certchain.c (is_cert_still_valid): Log the name of the certificate. + +2006-06-20 Werner Koch <wk@g10code.com> + + * gpgsm.c (gpgsm_init_default_ctrl): Take care of the command line + option --include-certs. + + * keylist.c (list_cert_raw): Print the certid. + +2006-05-23 Werner Koch <wk@g10code.com> + + * keydb.c (hextobyte): Deleted as it is now defined in jnlib. + + * Makefile.am (gpgsm_LDADD): Include ZLIBS. + +2006-05-19 Marcus Brinkmann <marcus@g10code.de> + + * keydb.c (keydb_insert_cert): Do not lock here, but only check if + it is locked. + (keydb_store_cert): Lock here. + + * keydb.h (keydb_delete): Accept new argument UNLOCK. + * keydb.c (keydb_delete): Likewise. Only unlock if this is set. + * delete.c (delete_one): Add new argument to invocation of + keydb_delete. + +2006-05-15 Werner Koch <wk@g10code.com> + + * keylist.c (print_names_raw): Sanitize URI. + +2006-03-21 Werner Koch <wk@g10code.com> + + * certchain.c (get_regtp_ca_info): New. + (allowed_ca): Use it. + +2006-03-20 Werner Koch <wk@g10code.com> + + * qualified.c (gpgsm_is_in_qualified_list): New optional arg COUNTRY. + +2006-02-17 Werner Koch <wk@g10code.com> + + * call-dirmngr.c (start_dirmngr): Print name of dirmngr to be started. + +2005-11-23 Werner Koch <wk@g10code.com> + + * gpgsm.h: New member QUALSIG_APPROVAL. + * sign.c (gpgsm_sign): Print a warning if a certificate is not + qualified. + * qualified.c (gpgsm_qualified_consent): Include a note that this + is not approved software. + (gpgsm_not_qualified_warning): New. + * gpgsm.c (main): Prepared to print a note whether the software + has been approved. + +2005-11-13 Werner Koch <wk@g10code.com> + + * call-agent.c (gpgsm_agent_get_confirmation): New. + + * keylist.c (list_cert_std): Print qualified status. + * qualified.c: New. + * certchain.c (gpgsm_validate_chain): Check for qualified + certificates. + + * certchain.c (gpgsm_basic_cert_check): Release keydb handle when + no-chain-validation is used. + +2005-11-11 Werner Koch <wk@g10code.com> + + * keylist.c (print_capabilities): Print is_qualified status. + +2005-10-28 Werner Koch <wk@g10code.com> + + * certdump.c (pretty_print_sexp): New. + (gpgsm_print_name2): Use it here. This allows proper printing of + DNS names as used with server certificates. + +2005-10-10 Werner Koch <wk@g10code.com> + + * keylist.c: Add pkaAdress OID as reference. + +2005-10-08 Marcus Brinkmann <marcus@g10code.de> + + * Makefile.am (gpgsm_LDADD): Add ../gl/libgnu.a after + ../common/libcommon.a. + +2005-09-13 Werner Koch <wk@g10code.com> + + * verify.c (gpgsm_verify): Print a note if the unknown algorithm + is MD2. + * sign.c (gpgsm_sign): Ditto. + * certcheck.c (gpgsm_check_cert_sig): Ditto. + +2005-09-08 Werner Koch <wk@g10code.com> + + * export.c (popen_protect_tool): Add option --have-cert. We + probably lost this option with 1.9.14 due to restructuring of + export.c. + +2005-07-21 Werner Koch <wk@g10code.com> + + * gpgsm.c (main): New options --no-log-file and --debug-none. + + * certreqgen.c (get_parameter, get_parameter_value): Add SEQ arg + to allow enumeration. Changed all callers. + (create_request): Process DNS and URI parameters. + +2005-07-20 Werner Koch <wk@g10code.com> + + * keylist.c (email_kludge): Reworked. + + * certdump.c (gpgsm_print_serial, gpgsm_dump_serial): Cast printf + arg to unsigned. + * call-dirmngr.c (gpgsm_dirmngr_run_command): Ditto + +2005-07-19 Werner Koch <wk@g10code.com> + + * fingerprint.c (gpgsm_get_certid): Cast printf arg to unsigned. + Bug accidently introduced while solving the #$%^& gcc + signed/unsigned char* warnings. + +2005-06-15 Werner Koch <wk@g10code.com> + + * delete.c (delete_one): Changed FPR to unsigned. + * encrypt.c (encrypt_dek): Made ENCVAL unsigned. + (gpgsm_encrypt): Ditto. + * sign.c (gpgsm_sign): Made SIGVAL unsigned. + * base64.c (base64_reader_cb): Need to use some casting to get + around signed/unsigned char* warnings. + * certcheck.c (gpgsm_check_cms_signature): Ditto. + (gpgsm_create_cms_signature): Changed arg R_SIGVAL to unsigned char*. + (do_encode_md): Made NFRAME a size_t. + * certdump.c (gpgsm_print_serial): Fixed signed/unsigned warning. + (gpgsm_dump_serial): Ditto. + (gpgsm_format_serial): Ditto. + (gpgsm_dump_string): Ditto. + (gpgsm_dump_cert): Ditto. + (parse_dn_part): Ditto. + (gpgsm_print_name2): Ditto. + * keylist.c (email_kludge): Ditto. + * certreqgen.c (proc_parameters, create_request): Ditto. + (create_request): Ditto. + * call-agent.c (gpgsm_agent_pksign): Made arg R_BUF unsigned. + (struct cipher_parm_s): Made CIPHERTEXT unsigned. + (struct genkey_parm_s): Ditto. + * server.c (strcpy_escaped_plus): Made arg S signed char*. + * fingerprint.c (gpgsm_get_fingerprint): Made ARRAY unsigned. + (gpgsm_get_keygrip): Ditto. + * keydb.c (keydb_insert_cert): Made DIGEST unsigned. + (keydb_update_cert): Ditto. + (classify_user_id): Apply cast to signed/unsigned assignment. + (hextobyte): Ditto. + +2005-06-01 Werner Koch <wk@g10code.com> + + * misc.c: Include setenv.h. + +2005-04-21 Werner Koch <wk@g10code.com> + + * gpgsm.c: New options --{enable,disable}-trusted-cert-crl-check. + * certchain.c (gpgsm_validate_chain): Make use of it. + + * certchain.c (gpgsm_validate_chain): Check revocations even for + expired certificates. This is required because on signature + verification an expired key is fine whereas a revoked one is not. + +2005-04-20 Werner Koch <wk@g10code.com> + + * Makefile.am (AM_CFLAGS): Add PTH_CFLAGS as noted by several folks. + +2005-04-19 Werner Koch <wk@g10code.com> + + * certchain.c (check_cert_policy): Print the diagnostic for a open + failure of policies.txt only in verbose mode or when it is not + ENOENT. + +2005-04-17 Werner Koch <wk@g10code.com> + + * call-dirmngr.c (inq_certificate): Add new inquire SENDCERT_SKI. + * certlist.c (gpgsm_find_cert): Add new arg KEYID and implement + this filter. Changed all callers. + + * certchain.c (find_up_search_by_keyid): New helper. + (find_up): Also try using the AKI.keyIdentifier. + (find_up_external): Ditto. + +2005-04-15 Werner Koch <wk@g10code.com> + + * keylist.c (list_cert_raw): Print the subjectKeyIdentifier as + well as the keyIdentifier part of the authorityKeyIdentifier. + +2005-03-31 Werner Koch <wk@g10code.com> + + * call-dirmngr.c (start_dirmngr): Use PATHSEP_C instead of ':'. + * call-agent.c (start_agent): Ditto. + +2005-03-17 Werner Koch <wk@g10code.com> + + * certcheck.c: Fixed use of DBG_CRYPTO and DBG_X509. + + * certchain.c (gpgsm_basic_cert_check): Dump certificates after a + failed gcry_pk_verify. + (find_up): Do an external lookup also for an authorityKeyIdentifier + lookup. Factored external lookup code out to .. + (find_up_external): .. new. + +2005-03-03 Werner Koch <wk@g10code.com> + + * Makefile.am (gpgsm_LDADD): Added PTH_LIBS. Noted by Kazu Yamamoto. + +2005-01-13 Werner Koch <wk@g10code.com> + + * certreqgen.c (proc_parameters): Cast printf arg. + +2004-12-22 Werner Koch <wk@g10code.com> + + * gpgsm.c (set_binary): New. + (main, open_read, open_fwrite): Use it. + +2004-12-21 Werner Koch <wk@g10code.com> + + * gpgsm.c (main): Use default_homedir(). + (main) [W32]: Default to disabled CRL checks. + +2004-12-20 Werner Koch <wk@g10code.com> + + * call-agent.c (start_agent): Before starting a pipe server start + to connect to a server on the standard socket. Use PATHSEP + * call-dirmngr.c (start_dirmngr): Use PATHSEP. + + * import.c: Include unistd.h for dup and close. + +2004-12-18 Werner Koch <wk@g10code.com> + + * gpgsm.h (map_assuan_err): Define in terms of + map_assuan_err_with_source. + * call-agent.c (start_agent): Pass error source to + send_pinentry_environment. + +2004-12-17 Werner Koch <wk@g10code.com> + + * call-dirmngr.c (isvalid_status_cb, lookup_status_cb) + (run_command_status_cb): Return cancel status if gpgsm_status + returned an error. + + * server.c (gpgsm_status, gpgsm_status2) + (gpgsm_status_with_err_code): Return an error code. + (gpgsm_status2): Always call va_end(). + +2004-12-15 Werner Koch <wk@g10code.com> + + * call-dirmngr.c (lookup_status_cb): Send progress messages + upstream. + (isvalid_status_cb): Ditto. + (gpgsm_dirmngr_isvalid): Put CTRL into status CB parameters. + (gpgsm_dirmngr_run_command, run_command_status_cb): Pass CTRL to + status callback and handle PROGRESS. + + * misc.c (setup_pinentry_env) [W32]: Don't use it. + + * gpgsm.c (main) [W32]: Init Pth because we need it for the socket + operations and to resolve libassuan symbols. + (run_protect_tool) [W32]: Disable it. + + * Makefile.am (gpgsm_LDADD): Move LIBASSUAN_LIBS more to the end. + +2004-12-07 Werner Koch <wk@g10code.com> + + * Makefile.am (gpgsm_LDADD): Put libassuan before jnlib because + under W32 we need the w32 pth code from jnlib. + + * misc.c (setup_pinentry_env) [W32]: Disabled. + +2004-12-06 Werner Koch <wk@g10code.com> + + * gpgsm.c (run_protect_tool) [_WIN32]: Disabled. + + * import.c (popen_protect_tool): Simplified by making use of + gnupg_spawn_process. + (parse_p12): Likewise, using gnupg_wait_process. + * export.c (popen_protect_tool): Ditto. + (export_p12): Ditto. + + * keydb.c: Don't define DIRSEP_S here. + +2004-12-02 Werner Koch <wk@g10code.com> + + * certchain.c (gpgsm_basic_cert_check): Dump certs with bad + signature for debugging. + (gpgsm_validate_chain): Ditto. + +2004-11-29 Werner Koch <wk@g10code.com> + + * gpgsm.c (set_debug): Changed to use a globals DEBUG_LEVEL and + DEBUG_VALUE. + (main): Made DEBUG_LEVEL global and introduced DEBUG_VALUE. This + now allows to add debug flags on top of a debug-level setting. + +2004-11-23 Werner Koch <wk@g10code.com> + + * gpgsm.c: New option --prefer-system-dirmngr. + * call-dirmngr.c (start_dirmngr): Implement this option. + +2004-10-22 Werner Koch <wk@g10code.com> + + * certreqgen.c (gpgsm_genkey): Remove the NEW from the certificate + request PEM header. This is according to the Sphinx standard. + +2004-10-08 Moritz Schulte <moritz@g10code.com> + + * certchain.c (gpgsm_validate_chain): Do not use keydb_new() in + case the no_chain_validation-return-short-cut is used (fixes + memory leak). + +2004-10-04 Werner Koch <wk@g10code.com> + + * misc.c (setup_pinentry_env): Try hard to set a default for GPG_TTY. + +2004-09-30 Werner Koch <wk@g10code.com> + + * gpgsm.c (i18n_init): Always use LC_ALL. + + * certdump.c (gpgsm_format_name): Factored code out to .. + (gpgsm_format_name2): .. new. + (gpgsm_print_name): Factored code out to .. + (gpgsm_print_name2): .. new. + (print_dn_part): New arg TRANSLATE. Changed all callers. + (print_dn_parts): Ditto. + (gpgsm_format_keydesc): Do not translate the SUBJECT; we require + it to stay UTF-8 but we still want to filter out bad control + characters. + + * Makefile.am: Adjusted for gettext 0.14. + + * keylist.c (list_cert_colon): Make sure that the expired flag has + a higher precedence than the invalid flag. + +2004-09-29 Werner Koch <wk@g10code.com> + + * import.c (parse_p12): Write an error status line for bad + passphrases. Add new arg CTRL and changed caller. + * export.c (export_p12): Likewise. + +2004-09-14 Werner Koch <wk@g10code.com> + + * certchain.c (gpgsm_validate_chain): Give expired certificates a + higher error precedence and don't bother to check any CRL in that + case. + +2004-08-24 Werner Koch <wk@g10code.de> + + * certlist.c: Fixed typo in ocsp OID. + +2004-08-18 Werner Koch <wk@g10code.de> + + * certlist.c (gpgsm_cert_use_ocsp_p): New. + (cert_usage_p): Support it here. + * call-dirmngr.c (gpgsm_dirmngr_isvalid): Use it here. + +2004-08-17 Marcus Brinkmann <marcus@g10code.de> + + * import.c: Fix typo in last change. + +2004-08-17 Werner Koch <wk@g10code.de> + + * import.c (check_and_store): Do a full validation if + --with-validation is set. + + * certchain.c (gpgsm_basic_cert_check): Print more detailed error + messages. + + * certcheck.c (do_encode_md): Partly support DSA. Add new arg + PKALGO. Changed all callers to pass it. + (pk_algo_from_sexp): New. + +2004-08-16 Werner Koch <wk@g10code.de> + + * gpgsm.c: New option --fixed-passphrase. + * import.c (popen_protect_tool): Pass it to the protect-tool. + + * server.c (cmd_encrypt): Use DEFAULT_RECPLIST and not recplist + for encrypt-to keys. + +2004-08-06 Werner Koch <wk@g10code.com> + + * gpgsm.c: New option --with-ephemeral-keys. + * keylist.c (list_internal_keys): Set it here. + (list_cert_raw): And indicate those keys. Changed all our callers + to pass the new arg HD through. + +2004-07-23 Werner Koch <wk@g10code.de> + + * certreqgen.c (proc_parameters): Do not allow key length below + 1024. + +2004-07-22 Werner Koch <wk@g10code.de> + + * keylist.c (list_cert_raw): Print the keygrip. + +2004-07-20 Werner Koch <wk@gnupg.org> + + * certchain.c (gpgsm_validate_chain): The trust check didn't + worked anymore, probably due to the changes at 2003-03-04. Fixed. + +2004-06-06 Werner Koch <wk@gnupg.org> + + * certreqgen.c (get_parameter_uint, create_request): Create + an extension for key usage when requested. + +2004-05-12 Werner Koch <wk@gnupg.org> + + * gpgsm.c (main): Install emergency_cleanup also as an atexit + handler. + + * verify.c (gpgsm_verify): Removed the separate error code + handling for KSBA. We use shared error codes anyway. + + * export.c (export_p12): Removed debugging code. + + * encrypt.c (gpgsm_encrypt): Put the session key in to secure memory. + +2004-05-11 Werner Koch <wk@gnupg.org> + + * sign.c (gpgsm_sign): Include the error source in the final error + message. + * decrypt.c (gpgsm_decrypt): Ditto. + + * fingerprint.c (gpgsm_get_key_algo_info): New. + * sign.c (gpgsm_sign): Don't assume RSA in the status line. + * keylist.c (list_cert_colon): Really print the algorithm and key + length. + (list_cert_raw, list_cert_std): Ditto. + (list_cert_colon): Reorganized to be able to tell whether a root + certificate is trusted. + + * gpgsm.c: New option --debug-allow-core-dump. + + * gpgsm.h (opt): Add member CONFIG_FILENAME. + * gpgsm.c (main): Use it here instead of the local var. + + * server.c (gpgsm_server): Print some additional information with + the hello in verbose mode. + +2004-04-30 Werner Koch <wk@gnupg.org> + + * import.c (check_and_store): Do not update the stats for hidden + imports of issuer certs. + (popen_protect_tool): Request statusmessages from the protect-tool. + (parse_p12): Detect status messages. Add new arg STATS and update them. + (print_imported_summary): Include secret key stats. + +2004-04-28 Werner Koch <wk@gnupg.org> + + * gpgsm.c: New command --keydb-clear-some-cert-flags. + * keydb.c (keydb_clear_some_cert_flags): New. + (keydb_update_keyblock, keydb_set_flags): Change error code + CONFLICT to NOT_LOCKED. + +2004-04-26 Werner Koch <wk@gnupg.org> + + * gpgsm.c (main) <gpgconf>: Do not use /dev/null as default config + filename. + + * call-agent.c (gpgsm_agent_pksign, gpgsm_agent_pkdecrypt) + (gpgsm_agent_genkey, gpgsm_agent_istrusted) + (gpgsm_agent_marktrusted, gpgsm_agent_havekey) + (gpgsm_agent_passwd): Add new arg CTRL and changed all callers. + (start_agent): New arg CTRL. Send progress item when starting a + new agent. + * sign.c (gpgsm_get_default_cert, get_default_signer): New arg + CTRL to be passed down to the agent function. + * decrypt.c (prepare_decryption): Ditto. + * certreqgen.c (proc_parameters, read_parameters): Ditto. + * certcheck.c (gpgsm_create_cms_signature): Ditto. + +2004-04-23 Werner Koch <wk@gnupg.org> + + * keydb.c (keydb_add_resource): Try to compress the file on init. + + * keylist.c (oidtranstbl): New. OIDs collected from several sources. + (print_name_raw, print_names_raw, list_cert_raw): New. + (gpgsm_list_keys): Check the dump mode and pass it down as + necessary. + +2004-04-22 Werner Koch <wk@gnupg.org> + + * gpgsm.c (main): New commands --dump-keys, --dump-external-keys, + --dump-secret-keys. + +2004-04-13 Werner Koch <wk@gnupg.org> + + * misc.c (setup_pinentry_env): New. + * import.c (popen_protect_tool): Call it. + * export.c (popen_protect_tool): Call it. + +2004-04-08 Werner Koch <wk@gnupg.org> + + * decrypt.c (gpgsm_decrypt): Return GPG_ERR_NO_DATA if it is not a + encrypted message. + +2004-04-07 Werner Koch <wk@gnupg.org> + + * gpgsm.c: New option --force-crl-refresh. + * call-dirmngr.c (gpgsm_dirmngr_isvalid): Pass option to dirmngr. + +2004-04-05 Werner Koch <wk@gnupg.org> + + * server.c (get_status_string): Add STATUS_NEWSIG. + * verify.c (gpgsm_verify): Print STATUS_NEWSIG for each signature. + + * certchain.c (gpgsm_validate_chain) <gpgsm_cert_use_cer_p>: Do + not just warn if a cert is not suitable; bail out immediately. + +2004-04-01 Werner Koch <wk@gnupg.org> + + * call-dirmngr.c (isvalid_status_cb): New. + (unhexify_fpr): New. Taken from ../g10/call-agent.c + (gpgsm_dirmngr_isvalid): Add new arg CTRL, changed caller to pass + it thru. Detect need to check the respondert cert and do that. + * certchain.c (gpgsm_validate_chain): Add new arg FLAGS. Changed + all callers. + +2004-03-24 Werner Koch <wk@gnupg.org> + + * sign.c (gpgsm_sign): Include a short list of capabilities. + +2004-03-17 Werner Koch <wk@gnupg.org> + + * gpgsm.c (main) <gpgconf>: Fixed default value quoting. + +2004-03-16 Werner Koch <wk@gnupg.org> + + * gpgsm.c (main): Implemented --gpgconf-list. + +2004-03-15 Werner Koch <wk@gnupg.org> + + * keylist.c (list_cert_colon): Hack to set the expired flag. + +2004-03-09 Werner Koch <wk@gnupg.org> + + * gpgsm.c (main): Correctly intitialze USE_OCSP flag. + + * keydb.c (keydb_delete): s/GPG_ERR_CONFLICT/GPG_ERR_NOT_LOCKED/ + +2004-03-04 Werner Koch <wk@gnupg.org> + + * call-dirmngr.c (gpgsm_dirmngr_isvalid): New arg ISSUER_CERT. + + * certchain.c (is_cert_still_valid): New. Code moved from ... + (gpgsm_validate_chain): ... here because we now need to check at + two places and at a later stage, so that we can pass the issuer + cert down to the dirmngr. + +2004-03-03 Werner Koch <wk@gnupg.org> + + * call-agent.c (start_agent): Replaced pinentry setup code by a + call to a new common function. + + * certdump.c (gpgsm_format_keydesc): Make sure the string is + returned as utf-8. + + * export.c (gpgsm_export): Make sure that we don't export more + than one certificate. + +2004-03-02 Werner Koch <wk@gnupg.org> + + * export.c (create_duptable, destroy_duptable) + (insert_duptable): New. + (gpgsm_export): Avoid duplicates. + +2004-02-26 Werner Koch <wk@gnupg.org> + + * certchain.c (compare_certs): New. + (gpgsm_validate_chain): Fixed infinite certificate checks after + bad signatures. + +2004-02-24 Werner Koch <wk@gnupg.org> + + * keylist.c (list_cert_colon): Print the fingerprint as the + cert-id for root certificates. + +2004-02-21 Werner Koch <wk@gnupg.org> + + * keylist.c (list_internal_keys): Return error codes. + (list_external_keys, gpgsm_list_keys): Ditto. + * server.c (do_listkeys): Ditto. + + * gpgsm.c (main): Display a key description for --passwd. + * call-agent.c (gpgsm_agent_passwd): New arg DESC. + +2004-02-20 Werner Koch <wk@gnupg.org> + + * gpgsm.c (main): New option --debug-ignore-expiration. + * certchain.c (gpgsm_validate_chain): Use it here. + + * certlist.c (cert_usage_p): Apply extKeyUsage. + +2004-02-19 Werner Koch <wk@gnupg.org> + + * export.c (export_p12, popen_protect_tool) + (gpgsm_p12_export): New. + * gpgsm.c (main): New command --export-secret-key-p12. + +2004-02-18 Werner Koch <wk@gnupg.org> + + * gpgsm.c (set_debug): Set the new --debug-level flags. + (main): New option --gpgconf-list. + (main): Do not setup -u and -r keys when not required. + (main): Setup the used character set. + + * keydb.c (keydb_add_resource): Print a hint to start the + gpg-agent. + +2004-02-17 Werner Koch <wk@gnupg.org> + + * gpgsm.c: Fixed value parsing for --with-validation. + * call-agent.c (start_agent): Ignore an empty GPG_AGENT_INFO. + * call-dirmngr.c (start_dirmngr): Likewise for DIRMNGR_INFO. + + * gpgsm.c: New option --with-md5-fingerprint. + * keylist.c (list_cert_std): Print MD5 fpr. + + * gpgsm.c: New options --with-validation. + * server.c (option_handler): New option "with-validation". + * keylist.c (list_cert_std, list_internal_keys): New args CTRL and + WITH_VALIDATION. Changed callers to set it. + (list_external_cb, list_external_keys): Pass CTRL to the callback. + (list_cert_colon): Add arg CTRL. Check validation if requested. + * certchain.c (unknown_criticals, allowed_ca, check_cert_policy) + (gpgsm_validate_chain): New args LISTMODE and FP. + (do_list): New helper for info output. + (find_up): New arg FIND_NEXT. + (gpgsm_validate_chain): After a bad signature try again with other + CA certificates. + + * import.c (print_imported_status): New arg NEW_CERT. Print + additional STATUS_IMPORT_OK becuase that is what gpgme expects. + (check_and_store): Always call above function after import. + * server.c (get_status_string): Added STATUS_IMPORT_OK. + +2004-02-13 Werner Koch <wk@gnupg.org> + + * certcheck.c (gpgsm_create_cms_signature): Format a description + for use by the pinentry. + * decrypt.c (gpgsm_decrypt): Ditto. Free HEXKEYGRIP. + * certdump.c (format_name_cookie, format_name_writer) + (gpgsm_format_name): New. + (gpgsm_format_serial): New. + (gpgsm_format_keydesc): New. + * call-agent.c (gpgsm_agent_pksign): New arg DESC. + (gpgsm_agent_pkdecrypt): Ditto. + + * encrypt.c (init_dek): Check for too weak algorithms. + + * import.c (parse_p12, popen_protect_tool): New. + + * base64.c (gpgsm_create_reader): New arg ALLOW_MULTI_PEM. + Changed all callers. + (base64_reader_cb): Handle it here. + (gpgsm_reader_eof_seen): New. + (base64_reader_cb): Set a flag for EOF. + (simple_reader_cb): Ditto. + +2004-02-12 Werner Koch <wk@gnupg.org> + + * gpgsm.h, gpgsm.c: New option --protect-tool-program. + * gpgsm.c (run_protect_tool): Use it. + +2004-02-11 Werner Koch <wk@gnupg.org> + + * Makefile.am (AM_CPPFLAGS): Pass directory constants via -D; this + will allow to override directory names at make time. + +2004-02-02 Werner Koch <wk@gnupg.org> + + * import.c (check_and_store): Import certificates even with + missing issuer's cert. Fixed an "depending on the verbose + setting" bug. + + * certchain.c (gpgsm_validate_chain): Mark revoked certs in the + keybox. + + * keylist.c (list_cert_colon): New arg VALIDITY; use it to print a + revoked flag. + (list_internal_keys): Retrieve validity flag. + (list_external_cb): Pass 0 as validity flag. + * keydb.c (keydb_get_flags, keydb_set_flags): New. + (keydb_set_cert_flags): New. + (lock_all): Return a proper error code. + (keydb_lock): New. + (keydb_delete): Don't lock but check that it has been locked. + (keydb_update_keyblock): Ditto. + * delete.c (delete_one): Take a lock. + +2004-01-30 Werner Koch <wk@gnupg.org> + + * certchain.c (check_cert_policy): Fixed read error checking. + (check_cert_policy): With no critical policies issue only a + warning if the policy file does not exists. + + * sign.c (add_certificate_list): Decrement N for the first cert. + +2004-01-29 Werner Koch <wk@gnupg.org> + + * certdump.c (parse_dn_part): Map common OIDs to human readable + labels. Make sure that a value won't get truncated if it includes + a Nul. + +2004-01-28 Werner Koch <wk@gnupg.org> + + * certchain.c (gpgsm_validate_chain): Changed the message printed + for an untrusted root certificate. + +2004-01-27 Werner Koch <wk@gnupg.org> + + * certdump.c (parse_dn_part): Pretty print the nameDistinguisher OID. + (print_dn_part): Do not delimit multiple RDN by " + ". Handle + multi-valued RDNs in a special way, i.e. in the order specified by + the certificate. + (print_dn_parts): Simplified. + +2004-01-16 Werner Koch <wk@gnupg.org> + + * sign.c (gpgsm_sign): Print an error message on all failures. + * decrypt.c (gpgsm_decrypt): Ditto. + +2003-12-17 Werner Koch <wk@gnupg.org> + + * server.c (gpgsm_server): Add arg DEFAULT_RECPLIST. + (cmd_encrypt): Add all enrypt-to marked certs to the list. + * encrypt.c (gpgsm_encrypt): Check that real recipients are + available. + * gpgsm.c (main): Make the --encrypt-to and --no-encrypt-to + options work. Pass the list of recients to gpgsm_server. + * gpgsm.h (certlist_s): Add field IS_ENCRYPT_TO. + (opt): Add NO_ENCRYPT_TO. + * certlist.c (gpgsm_add_to_certlist): New arg IS_ENCRYPT_TO. + Changed all callers and ignore duplicate entries. + (is_cert_in_certlist): New. + (gpgsm_add_cert_to_certlist): New. + + * certdump.c (gpgsm_print_serial): Cleaned up cast use in strtoul. + (gpgsm_dump_serial): Ditto. + + * decrypt.c (gpgsm_decrypt): Replaced ERR by RC. + +2003-12-16 Werner Koch <wk@gnupg.org> + + * gpgsm.c (main): Set the prefixes for assuan logging. + + * sign.c (gpgsm_sign): Add validation checks for the default + certificate. + + * gpgsm.c: Add -k as alias for --list-keys and -K for + --list-secret-keys. + +2003-12-15 Werner Koch <wk@gnupg.org> + + * encrypt.c (init_dek): Use gry_create_nonce for the IV; there is + not need for real strong random here and it even better protect + the random bits used for the key. + +2003-12-01 Werner Koch <wk@gnupg.org> + + * gpgsm.c, gpgsm.h: New options --{enable,disable}-ocsp. + (gpgsm_init_default_ctrl): Set USE_OCSP to the default value. + * certchain.c (gpgsm_validate_chain): Handle USE_OCSP. + * call-dirmngr.c (gpgsm_dirmngr_isvalid): Add arg USE_OCSP and + proceed accordingly. + +2003-11-19 Werner Koch <wk@gnupg.org> + + * verify.c (gpgsm_verify): Use "0" instead of an empty string for + the VALIDSIG status. + +2003-11-18 Werner Koch <wk@gnupg.org> + + * verify.c (gpgsm_verify): Fixed for changes API of gcry_md_info. + + * certchain.c (unknown_criticals): Fixed an error code test. + +2003-11-12 Werner Koch <wk@gnupg.org> + + Adjusted for API changes in Libksba. + +2003-10-31 Werner Koch <wk@gnupg.org> + + * certchain.c (gpgsm_validate_chain): Changed to use ksba_isotime_t. + * verify.c (strtimestamp_r, gpgsm_verify): Ditto. + * sign.c (gpgsm_sign): Ditto. + * keylist.c (print_time, list_cert_std, list_cert_colon): Ditto. + * certdump.c (gpgsm_print_time, gpgsm_dump_time, gpgsm_dump_cert): + Ditto. + +2003-10-25 Werner Koch <wk@gnupg.org> + + * certreqgen.c (read_parameters): Fixed faulty of !spacep(). + +2003-08-20 Marcus Brinkmann <marcus@g10code.de> + + * encrypt.c (encode_session_key): Allocate enough space. Cast key + byte to unsigned char to prevent sign extension. + (encrypt_dek): Check return value before error. + +2003-08-14 Timo Schulz <twoaday@freakmail.de> + + * encrypt.c (encode_session_key): Use new Libgcrypt interface. + +2003-07-31 Werner Koch <wk@gnupg.org> + + * Makefile.am (gpgsm_LDADD): Added INTLLIBS. + +2003-07-29 Werner Koch <wk@gnupg.org> + + * gpgsm.c (main): Add secmem features and set the random seed file. + (gpgsm_exit): Update the random seed file and enable debug output. + +2003-07-27 Werner Koch <wk@gnupg.org> + + Adjusted for gcry_mpi_print and gcry_mpi_scan API change. + +2003-06-24 Werner Koch <wk@gnupg.org> + + * server.c (gpgsm_status_with_err_code): New. + * verify.c (gpgsm_verify): Use it here instead of the old + tokenizing version. + + * verify.c (strtimestamp): Renamed to strtimestamp_r + + Adjusted for changes in the libgcrypt API. Some more fixes for the + libgpg-error stuff. + +2003-06-04 Werner Koch <wk@gnupg.org> + + * call-agent.c (init_membuf,put_membuf,get_membuf): Removed. + Include new membuf header and changed used type. + + Renamed error codes from INVALID to INV and removed _ERROR suffixes. + +2003-06-03 Werner Koch <wk@gnupg.org> + + Changed all error codes in all files to the new libgpg-error scheme. + + * gpgsm.h: Include gpg-error.h . + * Makefile.am: Link with libgpg-error. + +2003-04-29 Werner Koch <wk@gnupg.org> + + * Makefile.am: Use libassuan. Don't override LDFLAGS anymore. + * server.c (register_commands): Adjust for new Assuan semantics. + +2002-12-03 Werner Koch <wk@gnupg.org> + + * call-agent.c (gpgsm_agent_passwd): New. + * gpgsm.c (main): New command --passwd and --call-protect-tool + (run_protect_tool): New. + +2002-11-25 Werner Koch <wk@gnupg.org> + + * verify.c (gpgsm_verify): Handle content-type attribute. + +2002-11-13 Werner Koch <wk@gnupg.org> + + * call-agent.c (start_agent): Try to use $GPG_TTY instead of + ttyname. Changed ttyname to test stdin becuase it can be assumed + that output redirection is more common that input redirection. + +2002-11-12 Werner Koch <wk@gnupg.org> + + * gpgsm.c: New command --call-dirmngr. + * call-dirmngr.c (gpgsm_dirmngr_run_command) + (run_command_inq_cb,run_command_cb) + (run_command_status_cb): New. + +2002-11-11 Werner Koch <wk@gnupg.org> + + * certcheck.c (gpgsm_check_cms_signature): Don't double free + s_sig but free s_pkey at leave. + +2002-11-10 Werner Koch <wk@gnupg.org> + + * gpgsm.c: Removed duplicate --list-secret-key entry. + +2002-09-19 Werner Koch <wk@gnupg.org> + + * certcheck.c (gpgsm_check_cert_sig): Add cert hash debugging. + + * certchain.c (find_up): Print info when the cert was not found + by the autorithyKeyIdentifier. + +2002-09-03 Werner Koch <wk@gnupg.org> + + * gpgsm.c (main): Disable the internal libgcrypt locking. + +2002-08-21 Werner Koch <wk@gnupg.org> + + * import.c (print_imported_summary): Cleaned up. Print new + not_imported value. + (check_and_store): Update non_imported counter. + (print_import_problem): New. + (check_and_store): Print error status message. + * server.c (get_status_string): Added STATUS_IMPORT_PROBLEM. + +2002-08-20 Werner Koch <wk@gnupg.org> + + * gpgsm.c (main): Use the log file only in server mode. + + * import.c (print_imported_summary): New. + (check_and_store): Update the counters, take new argument. + (import_one): Factored out core of gpgsm_import. + (gpgsm_import): Print counters. + (gpgsm_import_files): New. + * gpgsm.c (main): Use the new function for import. + +2002-08-19 Werner Koch <wk@gnupg.org> + + * decrypt.c (gpgsm_decrypt): Return a better error status token. + * verify.c (gpgsm_verify): Don't error on messages with no signing + time or no message digest. This is only the case for messages + without any signed attributes. + +2002-08-16 Werner Koch <wk@gnupg.org> + + * certpath.c: Renamed to .. + * certchain.c: this. Renamed all all other usages of "path" in the + context of certificates to "chain". + + * call-agent.c (learn_cb): Special treatment when the issuer + certificate is missing. + +2002-08-10 Werner Koch <wk@gnupg.org> + + * Makefile.am (INCLUDES): Add definition for localedir. + + * keylist.c (list_cert_colon): Print the short fingerprint in the + key ID field. + * fingerprint.c (gpgsm_get_short_fingerprint): New. + * verify.c (gpgsm_verify): Print more verbose info for a good + signature. + +2002-08-09 Werner Koch <wk@gnupg.org> + + * decrypt.c (prepare_decryption): Hack to detected already + unpkcsedone keys. + + * gpgsm.c (emergency_cleanup): New. + (main): Initialize the signal handler. + + * sign.c (gpgsm_sign): Reset the hash context for subsequent + signers and release it at the end. + +2002-08-05 Werner Koch <wk@gnupg.org> + + * server.c (cmd_signer): New command "SIGNER" + (register_commands): Register it. + (cmd_sign): Pass the signer list to gpgsm_sign. + * certlist.c (gpgsm_add_to_certlist): Add SECRET argument, check + for secret key if set and changed all callers. + * sign.c (gpgsm_sign): New argument SIGNERLIST and implemt + multiple signers. + * gpgsm.c (main): Support more than one -u. + + * server.c (cmd_recipient): Return reason code 1 for No_Public_Key + which is actually what gets returned from add_to_certlist. + +2002-07-26 Werner Koch <wk@gnupg.org> + + * certcheck.c (gpgsm_check_cert_sig): Implement proper cleanup. + (gpgsm_check_cms_signature): Ditto. + +2002-07-22 Werner Koch <wk@gnupg.org> + + * keydb.c (keydb_add_resource): Register a lock file. + (lock_all, unlock_all): Implemented. + + * delete.c: New. + * gpgsm.c: Made --delete-key work. + * server.c (cmd_delkeys): New. + (register_commands): New command DELKEYS. + + * decrypt.c (gpgsm_decrypt): Print a convenience note when RC2 is + used and a STATUS_ERROR with the algorithm oid. + +2002-07-03 Werner Koch <wk@gnupg.org> + + * server.c (gpgsm_status2): Insert a blank between all optional + arguments when using assuan. + * server.c (cmd_recipient): No more need for extra blank in constants. + * import.c (print_imported_status): Ditto. + * gpgsm.c (main): Ditto. + +2002-07-02 Werner Koch <wk@gnupg.org> + + * verify.c (gpgsm_verify): Extend the STATUS_BADSIG line with + the fingerprint. + + * certpath.c (check_cert_policy): Don't use log_error to print a + warning. + + * keydb.c (keydb_store_cert): Add optional ar EXISTED and changed + all callers. + * call-agent.c (learn_cb): Print info message only for real imports. + + * import.c (gpgsm_import): Moved duplicated code to ... + (check_and_store): new function. Added magic to import the entire + chain. Print status only for real imports and moved printing code + to .. + (print_imported_status): New. + + * call-dirmngr.c (gpgsm_dirmngr_isvalid): print status of dirmngr + call in very verbose mode. + + * gpgsm.c (main): Use the same error codes for STATUS_INV_RECP as + with the server mode. + +2002-06-29 Werner Koch <wk@gnupg.org> + + * gpgsm.c: New option --auto-issuer-key-retrieve. + * certpath.c (find_up): Try to retrieve an issuer key from an + external source and from the ephemeral key DB. + (find_up_store_certs_cb): New. + + * keydb.c (keydb_set_ephemeral): Does now return the old + state. Call the backend only when required. + + * call-dirmngr.c (start_dirmngr): Use GNUPG_DEFAULT_DIRMNGR. + (lookup_status_cb): Issue status only when CTRL is not NULL. + (gpgsm_dirmngr_lookup): Document that CTRL is optional. + + * call-agent.c (start_agent): Use GNUPG_DEFAULT_AGENT. + +2002-06-28 Werner Koch <wk@gnupg.org> + + * server.c (cmd_recipient): Add more reason codes. + +2002-06-27 Werner Koch <wk@gnupg.org> + + * certpath.c (gpgsm_basic_cert_check): Use + --debug-no-path-validation to also bypass this basic check. + + * gpgsm.c (main): Use GNUPG_DEFAULT_HOMEDIR constant. + + * call-agent.c (start_agent): Create and pass the list of FD to + keep in the child to assuan. + * call-dirmngr.c (start_dirmngr): Ditto. + +2002-06-26 Werner Koch <wk@gnupg.org> + + * import.c (gpgsm_import): Print an STATUS_IMPORTED. + + * gpgsm.c: --debug-no-path-validation does not take an argument. + +2002-06-25 Werner Koch <wk@gnupg.org> + + * certdump.c (print_dn_part): Always print a leading slash, + removed NEED_DELIM arg and changed caller. + + * export.c (gpgsm_export): Print LFs to FP and not stdout. + (print_short_info): Ditto. Make use of gpgsm_print_name. + + * server.c (cmd_export): Use output-fd instead of data lines; this + was actually the specified way. + +2002-06-24 Werner Koch <wk@gnupg.org> + + * gpgsm.c: Removed duped help entry for --list-keys. + + * gpgsm.c, gpgsm.h: New option --debug-no-path-validation. + + * certpath.c (gpgsm_validate_path): Use it here instead of the + debug flag hack. + + * certpath.c (check_cert_policy): Return No_Policy_Match if the + policy file could not be opened. + +2002-06-20 Werner Koch <wk@gnupg.org> + + * certlist.c (gpgsm_add_to_certlist): Fixed locating of a + certificate with the required key usage. + + * gpgsm.c (main): Fixed a segv when using --outfile without an + argument. + + * keylist.c (print_capabilities): Also check for non-repudiation + and data encipherment. + * certlist.c (cert_usage_p): Test for signing and encryption was + swapped. Add a case for certification usage, handle + non-repudiation and data encipherment. + (gpgsm_cert_use_cert_p): New. + (gpgsm_add_to_certlist): Added a CTRL argument and changed all + callers to pass it. + * certpath.c (gpgsm_validate_path): Use it here to print a status + message. Added a CTRL argument and changed all callers to pass it. + * decrypt.c (gpgsm_decrypt): Print a status message for wrong key + usage. + * verify.c (gpgsm_verify): Ditto. + * keydb.c (classify_user_id): Allow a colon delimited fingerprint. + +2002-06-19 Werner Koch <wk@gnupg.org> + + * call-agent.c (learn_cb): Use log_info instead of log_error on + successful import. + + * keydb.c (keydb_set_ephemeral): New. + (keydb_store_cert): New are ephemeral, changed all callers. + * keylist.c (list_external_cb): Store cert as ephemeral. + * export.c (gpgsm_export): Kludge to export epehmeral certificates. + + * gpgsm.c (main): New command --list-external-keys. + +2002-06-17 Werner Koch <wk@gnupg.org> + + * certreqgen.c (read_parameters): Improved error handling. + (gpgsm_genkey): Print error message. + +2002-06-13 Werner Koch <wk@gnupg.org> + + * gpgsm.c (main): New option --log-file. + +2002-06-12 Werner Koch <wk@gnupg.org> + + * call-dirmngr.c (lookup_status_cb): New. + (gpgsm_dirmngr_lookup): Use the status CB. Add new arg CTRL and + changed caller to pass it. + + * gpgsm.c (open_fwrite): New. + (main): Allow --output for --verify. + + * sign.c (hash_and_copy_data): New. + (gpgsm_sign): Implemented normal (non-detached) signatures. + * gpgsm.c (main): Ditto. + + * certpath.c (gpgsm_validate_path): Special error handling for + no policy match. + +2002-06-10 Werner Koch <wk@gnupg.org> + + * server.c (get_status_string): Add STATUS_ERROR. + + * certpath.c (gpgsm_validate_path): Tweaked the error checking to + return error codes in a more sensitive way. + * verify.c (gpgsm_verify): Send status TRUST_NEVER also for a bad + CA certificate and when the certificate has been revoked. Issue + TRUST_FULLY even when the cert has expired. Append an error token + to these status lines. Issue the new generic error status when a + cert was not found and when leaving the function. + +2002-06-04 Werner Koch <wk@gnupg.org> + + * gpgsm.c (main): New command --list-sigs + * keylist.c (list_cert_std): New. Use it whenever colon mode is + not used. + (list_cert_chain): New. + +2002-05-31 Werner Koch <wk@gnupg.org> + + * gpgsm.c (main): Don't print the "go ahead" message for an + invalid command. + +2002-05-23 Werner Koch <wk@gnupg.org> + + * import.c (gpgsm_import): Add error messages. + +2002-05-21 Werner Koch <wk@gnupg.org> + + * keylist.c (list_internal_keys): Renamed from gpgsm_list_keys. + (list_external_keys): New. + (gpgsm_list_keys): Dispatcher for above. + * call-dirmngr.c (lookup_cb,pattern_from_strlist) + (gpgsm_dirmngr_lookup): New. + * server.c (option_handler): Handle new option --list-mode. + (do_listkeys): Handle options and actually use the mode argument. + (get_status_string): New code TRUNCATED. + + * import.c (gpgsm_import): Try to identify the type of input and + handle certs-only messages. + +2002-05-14 Werner Koch <wk@gnupg.org> + + * gpgsm.c: New option --faked-system-time + * sign.c (gpgsm_sign): And use it here. + * certpath.c (gpgsm_validate_path): Ditto. + +2002-05-03 Werner Koch <wk@gnupg.org> + + * certpath.c (gpgsm_validate_path): Added EXPTIME arg and changed + all callers. + * verify.c (gpgsm_verify): Tweaked usage of log_debug and + log_error. Return EXPSIG status and add expiretime to VALIDSIG. + +2002-04-26 Werner Koch <wk@gnupg.org> + + * gpgsm.h (DBG_AGENT,DBG_AGENT_VALUE): Replaced by DBG_ASSUAN_*. + Changed all users. + + * call-agent.c (start_agent): Be more silent without -v. + * call-dirmngr.c (start_dirmngr): Ditto. + +2002-04-25 Werner Koch <wk@gnupg.org> + + * call-agent.c (start_agent): Make copies of old locales and check + for setlocale. + +2002-04-25 Marcus Brinkmann <marcus@g10code.de> + + * call-agent.c (start_agent): Fix error handling logic so the + locale is always correctly reset. + +2002-04-25 Marcus Brinkmann <marcus@g10code.de> + + * server.c (option_handler): Accept display, ttyname, ttytype, + lc_ctype and lc_messages options. + * gpgsm.c (main): Allocate memory for these options. + * gpgsm.h (struct opt): Make corresponding members non-const. + +2002-04-24 Marcus Brinkmann <marcus@g10code.de> + + * gpgsm.h (struct opt): New members display, ttyname, ttytype, + lc_ctype, lc_messages. + * gpgsm.c (enum cmd_and_opt_values): New members oDisplay, + oTTYname, oTTYtype, oLCctype, oLCmessages. + (opts): New entries for these options. + (main): Handle these new options. + * call-agent.c (start_agent): Set the various display and tty + parameter after resetting. + +2002-04-18 Werner Koch <wk@gnupg.org> + + * certreqgen.c (gpgsm_genkey): Write status output on success. + +2002-04-15 Werner Koch <wk@gnupg.org> + + * gpgsm.c (main): Check ksba version. + + * certpath.c (find_up): New to use the authorithKeyIdentifier. + Use it in all other functions to locate the signing cert.. + +2002-04-11 Werner Koch <wk@gnupg.org> + + * certlist.c (cert_usable_p): New. + (gpgsm_cert_use_sign_p,gpgsm_cert_use_encrypt_p): New. + (gpgsm_cert_use_verify_p,gpgsm_cert_use_decrypt_p): New. + (gpgsm_add_to_certlist): Check the key usage. + * sign.c (gpgsm_sign): Ditto. + * verify.c (gpgsm_verify): Print a message wehn an unsuitable + certificate was used. + * decrypt.c (gpgsm_decrypt): Ditto + * keylist.c (print_capabilities): Determine values from the cert. + +2002-03-28 Werner Koch <wk@gnupg.org> + + * keylist.c (list_cert_colon): Fixed listing of crt record; the + issuer is not at the right place. Print a chainingID. + * certpath.c (gpgsm_walk_cert_chain): Be a bit more silent on + common errors. + +2002-03-21 Werner Koch <wk@gnupg.org> + + * export.c: New. + * gpgsm.c: Add command --export. + * server.c (cmd_export): New. + +2002-03-13 Werner Koch <wk@gnupg.org> + + * decrypt.c (gpgsm_decrypt): Allow multiple recipients. + +2002-03-12 Werner Koch <wk@gnupg.org> + + * certpath.c (check_cert_policy): Print the policy list. + + * verify.c (gpgsm_verify): Detect certs-only message. + +2002-03-11 Werner Koch <wk@gnupg.org> + + * import.c (gpgsm_import): Print a notice about imported certificates + when in verbose mode. + + * gpgsm.c (main): Print INV_RECP status. + * server.c (cmd_recipient): Ditto. + + * server.c (gpgsm_status2): New. Allows for a list of strings. + (gpgsm_status): Divert to gpgsm_status2. + + * encrypt.c (gpgsm_encrypt): Don't use a default key when no + recipients are given. Print a NO_RECP status. + +2002-03-06 Werner Koch <wk@gnupg.org> + + * server.c (cmd_listkeys, cmd_listsecretkeys): Divert to + (do_listkeys): new. Add pattern parsing. + + * keylist.c (gpgsm_list_keys): Handle selection pattern. + + * gpgsm.c: New command --learn-card + * call-agent.c (learn_cb,gpgsm_agent_learn): New. + + * gpgsm.c (main): Print error messages for non-implemented commands. + + * base64.c (base64_reader_cb): Use case insensitive compare of the + Content-Type string to detect plain base-64. + +2002-03-05 Werner Koch <wk@gnupg.org> + + * gpgsm.c, gpgsm.h: Add local_user. + * sign.c (gpgsm_get_default_cert): New. + (get_default_signer): Use the new function if local_user is not + set otherwise used that value. + * encrypt.c (get_default_recipient): Removed. + (gpgsm_encrypt): Use gpgsm_get_default_cert. + + * verify.c (gpgsm_verify): Better error text for a bad signature + found by comparing the hashs. + +2002-02-27 Werner Koch <wk@gnupg.org> + + * call-dirmngr.c, call-agent.c: Add 2 more arguments to all uses + of assuan_transact. + +2002-02-25 Werner Koch <wk@gnupg.org> + + * server.c (option_handler): Allow to use -2 for "send all certs + except the root cert". + * sign.c (add_certificate_list): Implement it here. + * certpath.c (gpgsm_is_root_cert): New. + +2002-02-19 Werner Koch <wk@gnupg.org> + + * certpath.c (check_cert_policy): New. + (gpgsm_validate_path): And call it from here. + * gpgsm.c (main): New options --policy-file, + --disable-policy-checks and --enable-policy-checks. + * gpgsm.h (opt): Added policy_file, no_policy_checks. + +2002-02-18 Werner Koch <wk@gnupg.org> + + * certpath.c (gpgsm_validate_path): Ask the agent to add the + certificate into the trusted list. + * call-agent.c (gpgsm_agent_marktrusted): New. + +2002-02-07 Werner Koch <wk@gnupg.org> + + * certlist.c (gpgsm_add_to_certlist): Check that the specified + name identifies a certificate unambiguously. + (gpgsm_find_cert): Ditto. + + * server.c (cmd_listkeys): Check that the data stream is available. + (cmd_listsecretkeys): Ditto. + (has_option): New. + (cmd_sign): Fix ambiguousity in option recognition. + + * gpgsm.c (main): Enable --logger-fd. + + * encrypt.c (gpgsm_encrypt): Increased buffer size for better + performance. + + * call-agent.c (gpgsm_agent_pksign): Check the S-Exp received from + the agent. + + * keylist.c (list_cert_colon): Filter out control characters. + +2002-02-06 Werner Koch <wk@gnupg.org> + + * decrypt.c (gpgsm_decrypt): Bail out after an decryption error. + + * server.c (reset_notify): Close input and output FDs. + (cmd_encrypt,cmd_decrypt,cmd_verify,cmd_sign.cmd_import) + (cmd_genkey): Close the FDs and release the recipient list even in + the error case. + +2002-02-01 Marcus Brinkmann <marcus@g10code.de> + + * sign.c (gpgsm_sign): Do not release certificate twice. + +2002-01-29 Werner Koch <wk@gnupg.org> + + * call-agent.c (gpgsm_agent_havekey): New. + * keylist.c (list_cert_colon): New arg HAVE_SECRET, print "crs" + when we know that the secret key is available. + (gpgsm_list_keys): New arg MODE, check whether a secret key is + available. Changed all callers. + * gpgsm.c (main): New command --list-secret-keys. + * server.c (cmd_listsecretkeys): New. + (cmd_listkeys): Return secret keys with "crs" record. + +2002-01-28 Werner Koch <wk@gnupg.org> + + * certreqgen.c (create_request): Store the email address in the req. + +2002-01-25 Werner Koch <wk@gnupg.org> + + * gpgsm.c (main): Disable core dumps. + + * sign.c (add_certificate_list): New. + (gpgsm_sign): Add the certificates to the CMS object. + * certpath.c (gpgsm_walk_cert_chain): New. + * gpgsm.h (server_control_s): Add included_certs. + * gpgsm.c: Add option --include-certs. + (gpgsm_init_default_ctrl): New. + (main): Call it. + * server.c (gpgsm_server): Ditto. + (option_handler): Support --include-certs. + +2002-01-23 Werner Koch <wk@gnupg.org> + + * certpath.c (gpgsm_validate_path): Print the DN of a missing issuer. + * certdump.c (gpgsm_dump_string): New. + (print_dn): Replaced by above. + +2002-01-22 Werner Koch <wk@gnupg.org> + + * certpath.c (unknown_criticals): New. + (allowed_ca): New. + (gpgsm_validate_path): Check validity, CA attribute, path length + and unknown critical extensions. + +2002-01-21 Werner Koch <wk@gnupg.org> + + * gpgsm.c: Add option --enable-crl-checks. + + * call-agent.c (start_agent): Implemented socket based access. + * call-dirmngr.c (start_dirmngr): Ditto. + +2002-01-20 Werner Koch <wk@gnupg.org> + + * server.c (option_handler): New. + (gpgsm_server): Register it with assuan. + +2002-01-19 Werner Koch <wk@gnupg.org> + + * server.c (gpgsm_server): Use assuan_deinit_server and setup + assuan logging if enabled. + * call-agent.c (inq_ciphertext_cb): Don't show the session key in + an Assuan log file. + + * gpgsm.c (my_strusage): Take bugreport address from configure.ac + +2002-01-15 Werner Koch <wk@gnupg.org> + + * import.c (gpgsm_import): Just do a basic cert check before + storing it. + * certpath.c (gpgsm_basic_cert_check): New. + + * keydb.c (keydb_store_cert): New. + * import.c (store_cert): Removed and change all caller to use + the new function. + * verify.c (store_cert): Ditto. + + * certlist.c (gpgsm_add_to_certlist): Validate the path + + * certpath.c (gpgsm_validate_path): Check the trust list. + * call-agent.c (gpgsm_agent_istrusted): New. + +2002-01-14 Werner Koch <wk@gnupg.org> + + * call-dirmngr.c (inq_certificate): Changed for new interface semantic. + * certlist.c (gpgsm_find_cert): New. + +2002-01-13 Werner Koch <wk@gnupg.org> + + * fingerprint.c (gpgsm_get_certid): Print the serial and not the + hash after the dot. + +2002-01-11 Werner Koch <wk@gnupg.org> + + * call-dirmngr.c: New. + * certpath.c (gpgsm_validate_path): Check the CRL here. + * fingerprint.c (gpgsm_get_certid): New. + * gpgsm.c: New options --dirmngr-program and --disable-crl-checks. + +2002-01-10 Werner Koch <wk@gnupg.org> + + * base64.c (gpgsm_create_writer): Allow to set the object name + +2002-01-08 Werner Koch <wk@gnupg.org> + + * keydb.c (spacep): Removed because it is now in util.c + + * server.c (cmd_genkey): New. + * certreqgen.c: New. The parameter handling code has been taken + from gnupg/g10/keygen.c version 1.0.6. + * call-agent.c (gpgsm_agent_genkey): New. + +2002-01-02 Werner Koch <wk@gnupg.org> + + * server.c (rc_to_assuan_status): Removed and changed all callers + to use map_to_assuan_status. + +2001-12-20 Werner Koch <wk@gnupg.org> + + * verify.c (gpgsm_verify): Implemented non-detached signature + verification. Add OUT_FP arg, initialize a writer and changed all + callers. + * server.c (cmd_verify): Pass an out_fp if one has been set. + + * base64.c (base64_reader_cb): Try to detect an S/MIME body part. + + * certdump.c (print_sexp): Renamed to gpgsm_dump_serial, made + global. + (print_time): Renamed to gpgsm_dump_time, made global. + (gpgsm_dump_serial): Take a real S-Expression as argument and + print the first item. + * keylist.c (list_cert_colon): Ditto. + * keydb.c (keydb_search_issuer_sn): Ditto. + * decrypt.c (print_integer_sexp): Removed and made callers + use gpgsm_dump_serial. + * verify.c (print_time): Removed, made callers use gpgsm_dump_time. + +2001-12-19 Marcus Brinkmann <marcus@g10code.de> + + * call-agent.c (start_agent): Add new argument to assuan_pipe_connect. + +2001-12-18 Werner Koch <wk@gnupg.org> + + * verify.c (print_integer_sexp): Renamed from print_integer and + print the serial number according to the S-Exp rules. + * decrypt.c (print_integer_sexp): Ditto. + +2001-12-17 Werner Koch <wk@gnupg.org> + + * keylist.c (list_cert_colon): Changed for new return value of + get_serial. + * keydb.c (keydb_search_issuer_sn): Ditto. + * certcheck.c (gpgsm_check_cert_sig): Likewise for other S-Exp + returingin functions. + * fingerprint.c (gpgsm_get_keygrip): Ditto. + * encrypt.c (encrypt_dek): Ditto + * certcheck.c (gpgsm_check_cms_signature): Ditto + * decrypt.c (prepare_decryption): Ditto. + * call-agent.c (gpgsm_agent_pkdecrypt): Removed arg ciphertextlen, + use KsbaSexp type and calculate the length. + + * certdump.c (print_sexp): Remaned from print_integer, changed caller. + + * Makefile.am: Use the LIBGCRYPT and LIBKSBA variables. + + * fingerprint.c (gpgsm_get_keygrip): Use the new + gcry_pk_get_keygrip to calculate the grip - note the algorithm and + therefore the grip values changed. + +2001-12-15 Werner Koch <wk@gnupg.org> + + * certcheck.c (gpgsm_check_cms_signature): Removed the faked-key + kludge. + (gpgsm_create_cms_signature): Removed the commented fake key + code. This makes the function pretty simple. + + * gpgsm.c (main): Renamed the default key database to "keyring.kbx". + + * decrypt.c (gpgsm_decrypt): Write STATUS_DECRYPTION_*. + * sign.c (gpgsm_sign): Write a STATUS_SIG_CREATED. + +2001-12-14 Werner Koch <wk@gnupg.org> + + * keylist.c (list_cert_colon): Kludge to show an email address + encoded in the subject's DN. + + * verify.c (gpgsm_verify): Add hash debug helpers + * sign.c (gpgsm_sign): Ditto. + + * base64.c (base64_reader_cb): Reset the linelen when we need to + skip the line and adjusted test; I somehow forgot about DeMorgan. + + * server.c (cmd_encrypt,cmd_decrypt,cmd_sign,cmd_verify) + (cmd_import): Close the FDs on success. + (close_message_fd): New. + (input_notify): Setting autodetect_encoding to 0 after initializing + it to 0 is pretty pointless. Easy to fix. + + * gpgsm.c (main): New option --debug-wait n, so that it is + possible to attach gdb when used in server mode. + + * sign.c (get_default_signer): Use keydb_classify_name here. + +2001-12-14 Marcus Brinkmann <marcus@g10code.de> + + * call-agent.c (LINELENGTH): Removed. + (gpgsm_agent_pksign): Use ASSUAN_LINELENGTH, not LINELENGTH. + (gpgsm_agent_pkdecrypt): Likewise. + +2001-12-13 Werner Koch <wk@gnupg.org> + + * keylist.c (list_cert_colon): Print alternative names of subject + and a few other values. + +2001-12-12 Werner Koch <wk@gnupg.org> + + * gpgsm.c (main): New options --assume-{armor,base64,binary}. + * base64.c (base64_reader_cb): Fixed non-autodetection mode. + +2001-12-04 Werner Koch <wk@gnupg.org> + + * call-agent.c (read_from_agent): Check for inquire responses. + (request_reply): Handle them using a new callback arg, changed all + callers. + (gpgsm_agent_pkdecrypt): New. + +2001-11-27 Werner Koch <wk@gnupg.org> + + * base64.c: New. Changed all other functions to use this instead + of direct creation of ksba_reader/writer. + * gpgsm.c (main): Set ctrl.auto_encoding unless --no-armor is used. + +2001-11-26 Werner Koch <wk@gnupg.org> + + * gpgsm.c: New option --agent-program + * call-agent.c (start_agent): Allow to override the default path + to the agent. + + * keydb.c (keydb_add_resource): Create keybox + + * keylist.c (gpgsm_list_keys): Fixed non-server keylisting. + + * server.c (rc_to_assuan_status): New. Use it for all commands. + + + Copyright 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/sm/Makefile.am b/sm/Makefile.am new file mode 100644 index 000000000..be53e8d25 --- /dev/null +++ b/sm/Makefile.am @@ -0,0 +1,62 @@ +# 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. + +## Process this file with automake to produce Makefile.in + + +bin_PROGRAMS = gpgsm + +AM_CFLAGS = $(LIBGCRYPT_CFLAGS) $(LIBASSUAN_CFLAGS) $(KSBA_CFLAGS) \ + $(PTH_CFLAGS) + +AM_CPPFLAGS = -I$(top_srcdir)/gl -I$(top_srcdir)/common -I$(top_srcdir)/intl +include $(top_srcdir)/am/cmacros.am + + +gpgsm_SOURCES = \ + gpgsm.c gpgsm.h \ + misc.c \ + keydb.c keydb.h \ + server.c \ + call-agent.c \ + call-dirmngr.c \ + fingerprint.c \ + base64.c \ + certlist.c \ + certdump.c \ + certcheck.c \ + certchain.c \ + keylist.c \ + verify.c \ + sign.c \ + encrypt.c \ + decrypt.c \ + import.c \ + export.c \ + delete.c \ + certreqgen.c \ + qualified.c + + +gpgsm_LDADD = ../jnlib/libjnlib.a ../kbx/libkeybox.a \ + ../common/libcommon.a ../gl/libgnu.a \ + $(LIBGCRYPT_LIBS) $(KSBA_LIBS) $(LIBASSUAN_LIBS) -lgpg-error \ + $(LIBINTL) $(PTH_LIBS) $(ZLIBS) + + diff --git a/sm/base64.c b/sm/base64.c new file mode 100644 index 000000000..59ab6f24b --- /dev/null +++ b/sm/base64.c @@ -0,0 +1,658 @@ +/* base64.c + * 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 <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include <unistd.h> +#include <time.h> +#include <assert.h> + +#include "gpgsm.h" + +#include <ksba.h> + +#include "i18n.h" + +#ifdef HAVE_DOSISH_SYSTEM + #define LF "\r\n" +#else + #define LF "\n" +#endif + +/* data used by the reader callbacks */ +struct reader_cb_parm_s { + FILE *fp; + unsigned char line[1024]; + int linelen; + int readpos; + int have_lf; + unsigned long line_counter; + + int allow_multi_pem; /* Allow processing of multiple PEM objects. */ + int autodetect; /* Try to detect the input encoding. */ + int assume_pem; /* Assume input encoding is PEM. */ + int assume_base64; /* Assume input is base64 encoded. */ + + int identified; + int is_pem; + int is_base64; + int stop_seen; + int might_be_smime; + + int eof_seen; + + struct { + int idx; + unsigned char val; + int stop_seen; + } base64; +}; + +/* data used by the writer callbacks */ +struct writer_cb_parm_s { + FILE *fp; + const char *pem_name; + + int wrote_begin; + int did_finish; + + struct { + int idx; + int quad_count; + unsigned char radbuf[4]; + } base64; + +}; + + +/* context for this module's functions */ +struct base64_context_s { + union { + struct reader_cb_parm_s rparm; + struct writer_cb_parm_s wparm; + } u; +}; + + +/* The base-64 character list */ +static char bintoasc[64] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789+/"; +/* The reverse base-64 list */ +static unsigned char asctobin[256] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3e, 0xff, 0xff, 0xff, 0x3f, + 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, + 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, + 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, + 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, + 0x31, 0x32, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff +}; + + +static int +has_only_base64 (const unsigned char *line, int linelen) +{ + if (linelen < 20) + return 0; + for (; linelen; line++, linelen--) + { + if (*line == '\n' || (linelen > 1 && *line == '\r' && line[1] == '\n')) + break; + if ( !strchr (bintoasc, *line) ) + return 0; + } + return 1; /* yes */ +} + +static int +is_empty_line (const unsigned char *line, int linelen) +{ + if (linelen >= 2 && *line == '\r' && line[1] == '\n') + return 1; + if (linelen >= 1 && *line == '\n') + return 1; + return 0; +} + + +static int +base64_reader_cb (void *cb_value, char *buffer, size_t count, size_t *nread) +{ + struct reader_cb_parm_s *parm = cb_value; + size_t n; + int c, c2; + + *nread = 0; + if (!buffer) + return -1; /* not supported */ + + next: + if (!parm->linelen) + { + /* read an entire line or up to the size of the buffer */ + parm->line_counter++; + parm->have_lf = 0; + for (n=0; n < DIM(parm->line);) + { + c = getc (parm->fp); + if (c == EOF) + { + parm->eof_seen = 1; + if (ferror (parm->fp)) + return -1; + break; + } + parm->line[n++] = c; + if (c == '\n') + { + parm->have_lf = 1; + /* Fixme: we need to skip overlong lines while detecting + the dashed lines */ + break; + } + } + parm->linelen = n; + if (!n) + return -1; /* eof */ + parm->readpos = 0; + } + + if (!parm->identified) + { + if (!parm->autodetect) + { + if (parm->assume_pem) + { + /* wait for the header line */ + parm->linelen = parm->readpos = 0; + if (!parm->have_lf + || strncmp ((char*)parm->line, "-----BEGIN ", 11) + || !strncmp ((char*)parm->line+11, "PGP ", 4)) + goto next; + parm->is_pem = 1; + } + else if (parm->assume_base64) + parm->is_base64 = 1; + } + else if (parm->line_counter == 1 && !parm->have_lf) + { + /* first line too long - assume DER encoding */ + parm->is_pem = 0; + } + else if (parm->line_counter == 1 && parm->linelen && *parm->line == 0x30) + { + /* the very first byte does pretty much look like a SEQUENCE tag*/ + parm->is_pem = 0; + } + else if ( parm->have_lf + && !strncmp ((char*)parm->line, "-----BEGIN ", 11) + && strncmp ((char *)parm->line+11, "PGP ", 4) ) + { + /* Fixme: we must only compare if the line really starts at + the beginning */ + parm->is_pem = 1; + parm->linelen = parm->readpos = 0; + } + else if ( parm->have_lf && parm->line_counter == 1 + && parm->linelen >= 13 + && !ascii_memcasecmp (parm->line, "Content-Type:", 13)) + { /* might be a S/MIME body */ + parm->might_be_smime = 1; + parm->linelen = parm->readpos = 0; + goto next; + } + else if (parm->might_be_smime == 1 + && is_empty_line (parm->line, parm->linelen)) + { + parm->might_be_smime = 2; + parm->linelen = parm->readpos = 0; + goto next; + } + else if (parm->might_be_smime == 2) + { + parm->might_be_smime = 0; + if ( !has_only_base64 (parm->line, parm->linelen)) + { + parm->linelen = parm->readpos = 0; + goto next; + } + parm->is_pem = 1; + } + else + { + parm->linelen = parm->readpos = 0; + goto next; + } + parm->identified = 1; + parm->base64.stop_seen = 0; + parm->base64.idx = 0; + } + + + n = 0; + if (parm->is_pem || parm->is_base64) + { + if (parm->is_pem && parm->have_lf + && !strncmp ((char*)parm->line, "-----END ", 9)) + { + parm->identified = 0; + parm->linelen = parm->readpos = 0; + + /* If the caller want to read multiple PEM objects from one + file, we have to reset our internal state and return a + EOF immediately. The caller is the expected to use + ksba_reader_clear to clear the EOF condition and continue + to read. If we don't want to do that we just return 0 + bytes which will force the ksba_reader to skip until + EOF. */ + if (parm->allow_multi_pem) + { + parm->identified = 0; + parm->autodetect = 0; + parm->assume_pem = 1; + parm->stop_seen = 0; + return -1; /* Send EOF now. */ + } + } + else if (parm->stop_seen) + { /* skip the rest of the line */ + parm->linelen = parm->readpos = 0; + } + else + { + int idx = parm->base64.idx; + unsigned char val = parm->base64.val; + + while (n < count && parm->readpos < parm->linelen ) + { + c = parm->line[parm->readpos++]; + if (c == '\n' || c == ' ' || c == '\r' || c == '\t') + continue; + if (c == '=') + { /* pad character: stop */ + if (idx == 1) + buffer[n++] = val; + parm->stop_seen = 1; + break; + } + 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; + buffer[n++] = val; + val = (c<<4)&0xf0; + break; + case 2: + val |= (c>>2)&15; + buffer[n++] = val; + val = (c<<6)&0xc0; + break; + case 3: + val |= c&0x3f; + buffer[n++] = val; + break; + } + idx = (idx+1) % 4; + } + if (parm->readpos == parm->linelen) + parm->linelen = parm->readpos = 0; + + parm->base64.idx = idx; + parm->base64.val = val; + } + } + else + { /* DER encoded */ + while (n < count && parm->readpos < parm->linelen) + buffer[n++] = parm->line[parm->readpos++]; + if (parm->readpos == parm->linelen) + parm->linelen = parm->readpos = 0; + } + + *nread = n; + return 0; +} + + + +static int +simple_reader_cb (void *cb_value, char *buffer, size_t count, size_t *nread) +{ + struct reader_cb_parm_s *parm = cb_value; + size_t n; + int c = 0; + + *nread = 0; + if (!buffer) + return -1; /* not supported */ + + for (n=0; n < count; n++) + { + c = getc (parm->fp); + if (c == EOF) + { + parm->eof_seen = 1; + if ( ferror (parm->fp) ) + return -1; + if (n) + break; /* return what we have before an EOF */ + return -1; + } + *(byte *)buffer++ = c; + } + + *nread = n; + return 0; +} + + + + +static int +base64_writer_cb (void *cb_value, const void *buffer, size_t count) +{ + struct writer_cb_parm_s *parm = cb_value; + unsigned char radbuf[4]; + int i, c, idx, quad_count; + const unsigned char *p; + FILE *fp = parm->fp; + + if (!count) + return 0; + + if (!parm->wrote_begin) + { + if (parm->pem_name) + { + fputs ("-----BEGIN ", fp); + fputs (parm->pem_name, fp); + fputs ("-----\n", fp); + } + parm->wrote_begin = 1; + parm->base64.idx = 0; + parm->base64.quad_count = 0; + } + + idx = parm->base64.idx; + quad_count = parm->base64.quad_count; + for (i=0; i < idx; i++) + radbuf[i] = parm->base64.radbuf[i]; + + for (p=buffer; count; p++, count--) + { + radbuf[idx++] = *p; + if (idx > 2) + { + idx = 0; + c = bintoasc[(*radbuf >> 2) & 077]; + putc (c, fp); + c = bintoasc[(((*radbuf<<4)&060)|((radbuf[1] >> 4)&017))&077]; + putc (c, fp); + c = bintoasc[(((radbuf[1]<<2)&074)|((radbuf[2]>>6)&03))&077]; + putc (c, fp); + c = bintoasc[radbuf[2]&077]; + putc (c, fp); + if (++quad_count >= (64/4)) + { + fputs (LF, fp); + quad_count = 0; + } + } + } + for (i=0; i < idx; i++) + parm->base64.radbuf[i] = radbuf[i]; + parm->base64.idx = idx; + parm->base64.quad_count = quad_count; + + return ferror (fp) ? gpg_error_from_errno (errno) : 0; +} + +static int +base64_finish_write (struct writer_cb_parm_s *parm) +{ + unsigned char radbuf[4]; + int i, c, idx, quad_count; + FILE *fp = parm->fp; + + if (!parm->wrote_begin) + return 0; /* nothing written */ + + /* flush the base64 encoding */ + idx = parm->base64.idx; + quad_count = parm->base64.quad_count; + for (i=0; i < idx; i++) + radbuf[i] = parm->base64.radbuf[i]; + + if (idx) + { + c = bintoasc[(*radbuf>>2)&077]; + putc (c, fp); + if (idx == 1) + { + c = bintoasc[((*radbuf << 4) & 060) & 077]; + putc (c, fp); + putc ('=', fp); + putc ('=', fp); + } + else + { + c = bintoasc[(((*radbuf<<4)&060)|((radbuf[1]>>4)&017))&077]; + putc (c, fp); + c = bintoasc[((radbuf[1] << 2) & 074) & 077]; + putc (c, fp); + putc ('=', fp); + + } + if (++quad_count >= (64/4)) + { + fputs (LF, fp); + quad_count = 0; + } + } + + if (quad_count) + fputs (LF, fp); + + if (parm->pem_name) + { + fputs ("-----END ", fp); + fputs (parm->pem_name, fp); + fputs ("-----\n", fp); + } + return ferror (fp)? gpg_error (gpg_err_code_from_errno (errno)) : 0; +} + + + + +/* Create a reader for the given file descriptor. Depending on the + control information an input decoding is automagically choosen. + The function returns a Base64Context object which must be passed to + the gpgme_destroy_reader function. The created KsbaReader object + is also returned, but the caller must not call the + ksba_reader_release function on. If ALLOW_MULTI_PEM is true, the + reader expects that the caller uses ksba_reader_clear after EOF + until no more objects were found. */ +int +gpgsm_create_reader (Base64Context *ctx, + CTRL ctrl, FILE *fp, int allow_multi_pem, + ksba_reader_t *r_reader) +{ + int rc; + ksba_reader_t r; + + *r_reader = NULL; + *ctx = xtrycalloc (1, sizeof **ctx); + if (!*ctx) + return OUT_OF_CORE (errno); + (*ctx)->u.rparm.allow_multi_pem = allow_multi_pem; + + rc = ksba_reader_new (&r); + if (rc) + { + xfree (*ctx); *ctx = NULL; + return rc; + } + + (*ctx)->u.rparm.fp = fp; + if (ctrl->is_pem) + { + (*ctx)->u.rparm.assume_pem = 1; + (*ctx)->u.rparm.assume_base64 = 1; + rc = ksba_reader_set_cb (r, base64_reader_cb, &(*ctx)->u.rparm); + } + else if (ctrl->is_base64) + { + (*ctx)->u.rparm.assume_base64 = 1; + rc = ksba_reader_set_cb (r, base64_reader_cb, &(*ctx)->u.rparm); + } + else if (ctrl->autodetect_encoding) + { + (*ctx)->u.rparm.autodetect = 1; + rc = ksba_reader_set_cb (r, base64_reader_cb, &(*ctx)->u.rparm); + } + else + rc = ksba_reader_set_cb (r, simple_reader_cb, &(*ctx)->u.rparm); + + if (rc) + { + ksba_reader_release (r); + xfree (*ctx); *ctx = NULL; + return rc; + } + + *r_reader = r; + return 0; +} + + +int +gpgsm_reader_eof_seen (Base64Context ctx) +{ + return ctx && ctx->u.rparm.eof_seen; +} + +void +gpgsm_destroy_reader (Base64Context ctx) +{ + xfree (ctx); +} + + + +/* Create a writer for the given stream. Depending on the control + information an output encoding is automagically choosen. The + function returns a Base64Context object which must be passed to the + gpgme_destroy_writer function. The created KsbaWriter object is + also returned, but the caller must not call the ksba_reader_release + function on. */ +int +gpgsm_create_writer (Base64Context *ctx, + CTRL ctrl, FILE *fp, ksba_writer_t *r_writer) +{ + int rc; + ksba_writer_t w; + + *r_writer = NULL; + *ctx = xtrycalloc (1, sizeof **ctx); + if (!*ctx) + return OUT_OF_CORE (errno); + + rc = ksba_writer_new (&w); + if (rc) + { + xfree (*ctx); *ctx = NULL; + return rc; + } + + if (ctrl->create_pem || ctrl->create_base64) + { + (*ctx)->u.wparm.fp = fp; + if (ctrl->create_pem) + (*ctx)->u.wparm.pem_name = ctrl->pem_name? ctrl->pem_name + : "CMS OBJECT"; + rc = ksba_writer_set_cb (w, base64_writer_cb, &(*ctx)->u.wparm); + } + else + rc = ksba_writer_set_file (w, fp); + + if (rc) + { + ksba_writer_release (w); + xfree (*ctx); *ctx = NULL; + return rc; + } + + *r_writer = w; + return 0; +} + + +int +gpgsm_finish_writer (Base64Context ctx) +{ + struct writer_cb_parm_s *parm; + + if (!ctx) + return gpg_error (GPG_ERR_INV_VALUE); + parm = &ctx->u.wparm; + if (parm->did_finish) + return 0; /* already done */ + parm->did_finish = 1; + if (!parm->fp) + return 0; /* callback was not used */ + return base64_finish_write (parm); +} + +void +gpgsm_destroy_writer (Base64Context ctx) +{ + xfree (ctx); +} diff --git a/sm/call-agent.c b/sm/call-agent.c new file mode 100644 index 000000000..85ec78c63 --- /dev/null +++ b/sm/call-agent.c @@ -0,0 +1,716 @@ +/* call-agent.c - divert operations to the agent + * Copyright (C) 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 <errno.h> +#include <unistd.h> +#include <time.h> +#include <assert.h> +#ifdef HAVE_LOCALE_H +#include <locale.h> +#endif + +#include "gpgsm.h" +#include <gcrypt.h> +#include <assuan.h> +#include "i18n.h" +#include "asshelp.h" +#include "keydb.h" /* fixme: Move this to import.c */ +#include "../common/membuf.h" + + +static assuan_context_t agent_ctx = NULL; +static int force_pipe_server = 0; + +struct cipher_parm_s +{ + assuan_context_t ctx; + const unsigned char *ciphertext; + size_t ciphertextlen; +}; + +struct genkey_parm_s +{ + assuan_context_t ctx; + const unsigned char *sexp; + size_t sexplen; +}; + +struct learn_parm_s +{ + int error; + assuan_context_t ctx; + membuf_t *data; +}; + + + +/* Try to connect to the agent via socket or fork it off and work by + pipes. Handle the server's initial greeting */ +static int +start_agent (ctrl_t ctrl) +{ + int rc = 0; + char *infostr, *p; + assuan_context_t ctx; + + if (agent_ctx) + return 0; /* fixme: We need a context for each thread or serialize + the access to the agent (which is suitable given that + the agent is not MT. */ + + infostr = force_pipe_server? NULL : getenv ("GPG_AGENT_INFO"); + if (!infostr || !*infostr) + { + const char *pgmname; + const char *argv[3]; + char *sockname; + int no_close_list[3]; + int i; + + /* First check whether we can connect at the standard + socket. */ + sockname = make_filename (opt.homedir, "S.gpg-agent", NULL); + rc = assuan_socket_connect (&ctx, sockname, 0); + xfree (sockname); + + if (rc) + { + /* With no success start a new server. */ + if (opt.verbose) + log_info (_("no running gpg-agent - starting one\n")); + + gpgsm_status (ctrl, STATUS_PROGRESS, "starting_agent ? 0 0"); + + if (fflush (NULL)) + { + gpg_error_t tmperr = gpg_error (gpg_err_code_from_errno (errno)); + log_error ("error flushing pending output: %s\n", + strerror (errno)); + return tmperr; + } + + if (!opt.agent_program || !*opt.agent_program) + opt.agent_program = GNUPG_DEFAULT_AGENT; + if ( !(pgmname = strrchr (opt.agent_program, '/'))) + pgmname = opt.agent_program; + else + pgmname++; + + argv[0] = pgmname; + argv[1] = "--server"; + argv[2] = NULL; + + i=0; + if (log_get_fd () != -1) + no_close_list[i++] = log_get_fd (); + no_close_list[i++] = fileno (stderr); + no_close_list[i] = -1; + + /* Connect to the agent and perform initial handshaking. */ + rc = assuan_pipe_connect (&ctx, opt.agent_program, (char**)argv, + no_close_list); + } + } + else + { + int prot; + int pid; + + infostr = xstrdup (infostr); + if ( !(p = strchr (infostr, PATHSEP_C)) || p == infostr) + { + log_error (_("malformed GPG_AGENT_INFO environment variable\n")); + xfree (infostr); + force_pipe_server = 1; + return start_agent (ctrl); + } + *p++ = 0; + pid = atoi (p); + while (*p && *p != PATHSEP_C) + p++; + prot = *p? atoi (p+1) : 0; + if (prot != 1) + { + log_error (_("gpg-agent protocol version %d is not supported\n"), + prot); + xfree (infostr); + force_pipe_server = 1; + return start_agent (ctrl); + } + + rc = assuan_socket_connect (&ctx, infostr, pid); + xfree (infostr); + if (rc == ASSUAN_Connect_Failed) + { + log_error (_("can't connect to the agent - trying fall back\n")); + force_pipe_server = 1; + return start_agent (ctrl); + } + } + + if (rc) + { + log_error ("can't connect to the agent: %s\n", assuan_strerror (rc)); + return gpg_error (GPG_ERR_NO_AGENT); + } + agent_ctx = ctx; + + if (DBG_ASSUAN) + log_debug ("connection to agent established\n"); + + rc = assuan_transact (agent_ctx, "RESET", NULL, NULL, NULL, NULL, NULL, NULL); + if (rc) + return map_assuan_err (rc); + + return send_pinentry_environment (agent_ctx, GPG_ERR_SOURCE_DEFAULT, + opt.display, opt.ttyname, opt.ttytype, + opt.lc_ctype, opt.lc_messages); +} + + +static AssuanError +membuf_data_cb (void *opaque, const void *buffer, size_t length) +{ + membuf_t *data = opaque; + + if (buffer) + put_membuf (data, buffer, length); + return 0; +} + + + + +/* Call the agent to do a sign operation using the key identified by + the hex string KEYGRIP. */ +int +gpgsm_agent_pksign (ctrl_t ctrl, const char *keygrip, const char *desc, + unsigned char *digest, size_t digestlen, int digestalgo, + unsigned char **r_buf, size_t *r_buflen ) +{ + int rc, i; + char *p, line[ASSUAN_LINELENGTH]; + membuf_t data; + size_t len; + + *r_buf = NULL; + rc = start_agent (ctrl); + if (rc) + return rc; + + if (digestlen*2 + 50 > DIM(line)) + return gpg_error (GPG_ERR_GENERAL); + + rc = assuan_transact (agent_ctx, "RESET", NULL, NULL, NULL, NULL, NULL, NULL); + if (rc) + return map_assuan_err (rc); + + snprintf (line, DIM(line)-1, "SIGKEY %s", keygrip); + line[DIM(line)-1] = 0; + rc = assuan_transact (agent_ctx, line, NULL, NULL, NULL, NULL, NULL, NULL); + if (rc) + return map_assuan_err (rc); + + if (desc) + { + snprintf (line, DIM(line)-1, "SETKEYDESC %s", desc); + line[DIM(line)-1] = 0; + rc = assuan_transact (agent_ctx, line, + NULL, NULL, NULL, NULL, NULL, NULL); + if (rc) + return map_assuan_err (rc); + } + + sprintf (line, "SETHASH %d ", digestalgo); + p = line + strlen (line); + for (i=0; i < digestlen ; i++, p += 2 ) + sprintf (p, "%02X", digest[i]); + rc = assuan_transact (agent_ctx, line, NULL, NULL, NULL, NULL, NULL, NULL); + if (rc) + return map_assuan_err (rc); + + init_membuf (&data, 1024); + rc = assuan_transact (agent_ctx, "PKSIGN", + membuf_data_cb, &data, NULL, NULL, NULL, NULL); + if (rc) + { + xfree (get_membuf (&data, &len)); + return map_assuan_err (rc); + } + *r_buf = get_membuf (&data, r_buflen); + + if (!gcry_sexp_canon_len (*r_buf, *r_buflen, NULL, NULL)) + { + xfree (*r_buf); *r_buf = NULL; + return gpg_error (GPG_ERR_INV_VALUE); + } + + return *r_buf? 0 : OUT_OF_CORE (errno); +} + + + + +/* Handle a CIPHERTEXT inquiry. Note, we only send the data, + assuan_transact talkes care of flushing and writing the end */ +static AssuanError +inq_ciphertext_cb (void *opaque, const char *keyword) +{ + struct cipher_parm_s *parm = opaque; + AssuanError rc; + + assuan_begin_confidential (parm->ctx); + rc = assuan_send_data (parm->ctx, parm->ciphertext, parm->ciphertextlen); + assuan_end_confidential (parm->ctx); + return rc; +} + + +/* Call the agent to do a decrypt operation using the key identified by + the hex string KEYGRIP. */ +int +gpgsm_agent_pkdecrypt (ctrl_t ctrl, const char *keygrip, const char *desc, + ksba_const_sexp_t ciphertext, + char **r_buf, size_t *r_buflen ) +{ + int rc; + char line[ASSUAN_LINELENGTH]; + membuf_t data; + struct cipher_parm_s cipher_parm; + size_t n, len; + char *buf, *endp; + size_t ciphertextlen; + + if (!keygrip || strlen(keygrip) != 40 || !ciphertext || !r_buf || !r_buflen) + return gpg_error (GPG_ERR_INV_VALUE); + *r_buf = NULL; + + ciphertextlen = gcry_sexp_canon_len (ciphertext, 0, NULL, NULL); + if (!ciphertextlen) + return gpg_error (GPG_ERR_INV_VALUE); + + rc = start_agent (ctrl); + if (rc) + return rc; + + rc = assuan_transact (agent_ctx, "RESET", NULL, NULL, NULL, NULL, NULL, NULL); + if (rc) + return map_assuan_err (rc); + + assert ( DIM(line) >= 50 ); + snprintf (line, DIM(line)-1, "SETKEY %s", keygrip); + line[DIM(line)-1] = 0; + rc = assuan_transact (agent_ctx, line, NULL, NULL, NULL, NULL, NULL, NULL); + if (rc) + return map_assuan_err (rc); + + if (desc) + { + snprintf (line, DIM(line)-1, "SETKEYDESC %s", desc); + line[DIM(line)-1] = 0; + rc = assuan_transact (agent_ctx, line, + NULL, NULL, NULL, NULL, NULL, NULL); + if (rc) + return map_assuan_err (rc); + } + + init_membuf (&data, 1024); + cipher_parm.ctx = agent_ctx; + cipher_parm.ciphertext = ciphertext; + cipher_parm.ciphertextlen = ciphertextlen; + rc = assuan_transact (agent_ctx, "PKDECRYPT", + membuf_data_cb, &data, + inq_ciphertext_cb, &cipher_parm, NULL, NULL); + if (rc) + { + xfree (get_membuf (&data, &len)); + return map_assuan_err (rc); + } + + put_membuf (&data, "", 1); /* make sure it is 0 terminated */ + buf = get_membuf (&data, &len); + if (!buf) + return gpg_error (GPG_ERR_ENOMEM); + /* FIXME: We would better a return a full S-exp and not just a part */ + assert (len); + len--; /* remove the terminating 0 */ + n = strtoul (buf, &endp, 10); + if (!n || *endp != ':') + return gpg_error (GPG_ERR_INV_SEXP); + endp++; + if (endp-buf+n > len) + return gpg_error (GPG_ERR_INV_SEXP); /* oops len does not + match internal len*/ + memmove (buf, endp, n); + *r_buflen = n; + *r_buf = buf; + return 0; +} + + + + + +/* Handle a KEYPARMS inquiry. Note, we only send the data, + assuan_transact takes care of flushing and writing the end */ +static AssuanError +inq_genkey_parms (void *opaque, const char *keyword) +{ + struct genkey_parm_s *parm = opaque; + AssuanError rc; + + rc = assuan_send_data (parm->ctx, parm->sexp, parm->sexplen); + return rc; +} + + + +/* Call the agent to generate a newkey */ +int +gpgsm_agent_genkey (ctrl_t ctrl, + ksba_const_sexp_t keyparms, ksba_sexp_t *r_pubkey) +{ + int rc; + struct genkey_parm_s gk_parm; + membuf_t data; + size_t len; + unsigned char *buf; + + *r_pubkey = NULL; + rc = start_agent (ctrl); + if (rc) + return rc; + + rc = assuan_transact (agent_ctx, "RESET", NULL, NULL, NULL, NULL, NULL, NULL); + if (rc) + return map_assuan_err (rc); + + init_membuf (&data, 1024); + gk_parm.ctx = agent_ctx; + gk_parm.sexp = keyparms; + gk_parm.sexplen = gcry_sexp_canon_len (keyparms, 0, NULL, NULL); + if (!gk_parm.sexplen) + return gpg_error (GPG_ERR_INV_VALUE); + rc = assuan_transact (agent_ctx, "GENKEY", + membuf_data_cb, &data, + inq_genkey_parms, &gk_parm, NULL, NULL); + if (rc) + { + xfree (get_membuf (&data, &len)); + return map_assuan_err (rc); + } + buf = get_membuf (&data, &len); + if (!buf) + return gpg_error (GPG_ERR_ENOMEM); + if (!gcry_sexp_canon_len (buf, len, NULL, NULL)) + { + xfree (buf); + return gpg_error (GPG_ERR_INV_SEXP); + } + *r_pubkey = buf; + return 0; +} + + +/* Call the agent to read the public key part for a given keygrip. */ +int +gpgsm_agent_readkey (ctrl_t ctrl, const char *hexkeygrip, + ksba_sexp_t *r_pubkey) +{ + int rc; + membuf_t data; + size_t len; + unsigned char *buf; + char line[ASSUAN_LINELENGTH]; + + *r_pubkey = NULL; + rc = start_agent (ctrl); + if (rc) + return rc; + + rc = assuan_transact (agent_ctx, "RESET",NULL, NULL, NULL, NULL, NULL, NULL); + if (rc) + return map_assuan_err (rc); + + snprintf (line, DIM(line)-1, "READKEY %s", hexkeygrip); + line[DIM(line)-1] = 0; + + init_membuf (&data, 1024); + rc = assuan_transact (agent_ctx, line, + membuf_data_cb, &data, + NULL, NULL, NULL, NULL); + if (rc) + { + xfree (get_membuf (&data, &len)); + return map_assuan_err (rc); + } + buf = get_membuf (&data, &len); + if (!buf) + return gpg_error (GPG_ERR_ENOMEM); + if (!gcry_sexp_canon_len (buf, len, NULL, NULL)) + { + xfree (buf); + return gpg_error (GPG_ERR_INV_SEXP); + } + *r_pubkey = buf; + return 0; +} + + +/* Ask the agent whether the certificate is in the list of trusted + keys */ +int +gpgsm_agent_istrusted (ctrl_t ctrl, ksba_cert_t cert) +{ + int rc; + char *fpr; + char line[ASSUAN_LINELENGTH]; + + rc = start_agent (ctrl); + if (rc) + return rc; + + fpr = gpgsm_get_fingerprint_hexstring (cert, GCRY_MD_SHA1); + if (!fpr) + { + log_error ("error getting the fingerprint\n"); + return gpg_error (GPG_ERR_GENERAL); + } + + snprintf (line, DIM(line)-1, "ISTRUSTED %s", fpr); + line[DIM(line)-1] = 0; + xfree (fpr); + + rc = assuan_transact (agent_ctx, line, NULL, NULL, NULL, NULL, NULL, NULL); + return map_assuan_err (rc); +} + +/* Ask the agent to mark CERT as a trusted Root-CA one */ +int +gpgsm_agent_marktrusted (ctrl_t ctrl, ksba_cert_t cert) +{ + int rc; + char *fpr, *dn; + char line[ASSUAN_LINELENGTH]; + + rc = start_agent (ctrl); + if (rc) + return rc; + + fpr = gpgsm_get_fingerprint_hexstring (cert, GCRY_MD_SHA1); + if (!fpr) + { + log_error ("error getting the fingerprint\n"); + return gpg_error (GPG_ERR_GENERAL); + } + + dn = ksba_cert_get_issuer (cert, 0); + if (!dn) + { + xfree (fpr); + return gpg_error (GPG_ERR_GENERAL); + } + snprintf (line, DIM(line)-1, "MARKTRUSTED %s S %s", fpr, dn); + line[DIM(line)-1] = 0; + ksba_free (dn); + xfree (fpr); + + rc = assuan_transact (agent_ctx, line, NULL, NULL, NULL, NULL, NULL, NULL); + return map_assuan_err (rc); +} + + + +/* Ask the agent whether the a corresponding secret key is available + for the given keygrip */ +int +gpgsm_agent_havekey (ctrl_t ctrl, const char *hexkeygrip) +{ + int rc; + char line[ASSUAN_LINELENGTH]; + + rc = start_agent (ctrl); + if (rc) + return rc; + + if (!hexkeygrip || strlen (hexkeygrip) != 40) + return gpg_error (GPG_ERR_INV_VALUE); + + snprintf (line, DIM(line)-1, "HAVEKEY %s", hexkeygrip); + line[DIM(line)-1] = 0; + + rc = assuan_transact (agent_ctx, line, NULL, NULL, NULL, NULL, NULL, NULL); + return map_assuan_err (rc); +} + + +static AssuanError +learn_cb (void *opaque, const void *buffer, size_t length) +{ + struct learn_parm_s *parm = opaque; + size_t len; + char *buf; + ksba_cert_t cert; + int rc; + + if (parm->error) + return 0; + + if (buffer) + { + put_membuf (parm->data, buffer, length); + return 0; + } + /* END encountered - process what we have */ + buf = get_membuf (parm->data, &len); + if (!buf) + { + parm->error = gpg_error (GPG_ERR_ENOMEM); + return 0; + } + + + /* FIXME: this should go into import.c */ + rc = ksba_cert_new (&cert); + if (rc) + { + parm->error = rc; + return 0; + } + rc = ksba_cert_init_from_mem (cert, buf, len); + if (rc) + { + log_error ("failed to parse a certificate: %s\n", gpg_strerror (rc)); + ksba_cert_release (cert); + parm->error = rc; + return 0; + } + + rc = gpgsm_basic_cert_check (cert); + if (gpg_err_code (rc) == GPG_ERR_MISSING_CERT) + { /* For later use we store it in the ephemeral database. */ + log_info ("issuer certificate missing - storing as ephemeral\n"); + keydb_store_cert (cert, 1, NULL); + } + else if (rc) + log_error ("invalid certificate: %s\n", gpg_strerror (rc)); + else + { + int existed; + + if (!keydb_store_cert (cert, 0, &existed)) + { + if (opt.verbose > 1 && existed) + log_info ("certificate already in DB\n"); + else if (opt.verbose && !existed) + log_info ("certificate imported\n"); + } + } + + ksba_cert_release (cert); + init_membuf (parm->data, 4096); + return 0; +} + +/* Call the agent to learn about a smartcard */ +int +gpgsm_agent_learn (ctrl_t ctrl) +{ + int rc; + struct learn_parm_s learn_parm; + membuf_t data; + size_t len; + + rc = start_agent (ctrl); + if (rc) + return rc; + + init_membuf (&data, 4096); + learn_parm.error = 0; + learn_parm.ctx = agent_ctx; + learn_parm.data = &data; + rc = assuan_transact (agent_ctx, "LEARN --send", + learn_cb, &learn_parm, + NULL, NULL, NULL, NULL); + xfree (get_membuf (&data, &len)); + if (rc) + return map_assuan_err (rc); + return learn_parm.error; +} + + +/* Ask the agent to change the passphrase of the key identified by + HEXKEYGRIP. If DESC is not NULL, display instead of the default + description message. */ +int +gpgsm_agent_passwd (ctrl_t ctrl, const char *hexkeygrip, const char *desc) +{ + int rc; + char line[ASSUAN_LINELENGTH]; + + rc = start_agent (ctrl); + if (rc) + return rc; + + if (!hexkeygrip || strlen (hexkeygrip) != 40) + return gpg_error (GPG_ERR_INV_VALUE); + + if (desc) + { + snprintf (line, DIM(line)-1, "SETKEYDESC %s", desc); + line[DIM(line)-1] = 0; + rc = assuan_transact (agent_ctx, line, + NULL, NULL, NULL, NULL, NULL, NULL); + if (rc) + return map_assuan_err (rc); + } + + snprintf (line, DIM(line)-1, "PASSWD %s", hexkeygrip); + line[DIM(line)-1] = 0; + + rc = assuan_transact (agent_ctx, line, NULL, NULL, NULL, NULL, NULL, NULL); + return map_assuan_err (rc); +} + + + +/* Ask the agent to pop up a confirmation dialog with the text DESC + and an okay and cancel button. */ +gpg_error_t +gpgsm_agent_get_confirmation (ctrl_t ctrl, const char *desc) +{ + int rc; + char line[ASSUAN_LINELENGTH]; + + rc = start_agent (ctrl); + if (rc) + return rc; + + snprintf (line, DIM(line)-1, "GET_CONFIRMATION %s", desc); + line[DIM(line)-1] = 0; + + rc = assuan_transact (agent_ctx, line, NULL, NULL, NULL, NULL, NULL, NULL); + return map_assuan_err (rc); +} diff --git a/sm/call-dirmngr.c b/sm/call-dirmngr.c new file mode 100644 index 000000000..0de09a9ba --- /dev/null +++ b/sm/call-dirmngr.c @@ -0,0 +1,848 @@ +/* call-dirmngr.c - communication with the dromngr + * Copyright (C) 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 <errno.h> +#include <unistd.h> +#include <time.h> +#include <assert.h> +#include <ctype.h> + +#include "gpgsm.h" +#include <gcrypt.h> +#include <assuan.h> + +#include "i18n.h" +#include "keydb.h" + +/* The name of the socket for a system daemon. */ +#define DEFAULT_SOCKET_NAME "/var/run/dirmngr/socket" + +struct membuf { + size_t len; + size_t size; + char *buf; + int out_of_core; +}; + + + +static ASSUAN_CONTEXT dirmngr_ctx = NULL; +static int force_pipe_server = 0; + +struct inq_certificate_parm_s { + ASSUAN_CONTEXT ctx; + ksba_cert_t cert; + ksba_cert_t issuer_cert; +}; + +struct isvalid_status_parm_s { + CTRL ctrl; + int seen; + unsigned char fpr[20]; +}; + + +struct lookup_parm_s { + CTRL ctrl; + ASSUAN_CONTEXT ctx; + void (*cb)(void *, ksba_cert_t); + void *cb_value; + struct membuf data; + int error; +}; + +struct run_command_parm_s { + ASSUAN_CONTEXT ctx; +}; + + +/* 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. */ + +static void +init_membuf (struct membuf *mb, int initiallen) +{ + mb->len = 0; + mb->size = initiallen; + mb->out_of_core = 0; + mb->buf = xtrymalloc (initiallen); + if (!mb->buf) + mb->out_of_core = 1; +} + +static void +put_membuf (struct membuf *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 = xtryrealloc (mb->buf, mb->size); + if (!p) + { + mb->out_of_core = 1; + return; + } + mb->buf = p; + } + memcpy (mb->buf + mb->len, buf, len); + mb->len += len; +} + +static void * +get_membuf (struct membuf *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 = 1; /* don't allow a reuse */ + return p; +} + + + + + +/* Try to connect to the agent via socket or fork it off and work by + pipes. Handle the server's initial greeting */ +static int +start_dirmngr (void) +{ + int rc; + char *infostr, *p; + ASSUAN_CONTEXT ctx; + int try_default = 0; + + if (dirmngr_ctx) + return 0; /* fixme: We need a context for each thread or serialize + the access to the dirmngr */ + /* Note: if you change this to multiple connections, you also need + to take care of the implicit option sending caching. */ + + infostr = force_pipe_server? NULL : getenv ("DIRMNGR_INFO"); + if (opt.prefer_system_dirmngr && !force_pipe_server + &&(!infostr || !*infostr)) + { + infostr = DEFAULT_SOCKET_NAME; + try_default = 1; + } + if (!infostr || !*infostr) + { + const char *pgmname; + const char *argv[3]; + int no_close_list[3]; + int i; + + if (!opt.dirmngr_program || !*opt.dirmngr_program) + opt.dirmngr_program = GNUPG_DEFAULT_DIRMNGR; + if ( !(pgmname = strrchr (opt.dirmngr_program, '/'))) + pgmname = opt.dirmngr_program; + else + pgmname++; + + if (opt.verbose) + log_info (_("no running dirmngr - starting `%s'\n"), + opt.dirmngr_program); + + if (fflush (NULL)) + { + gpg_error_t tmperr = gpg_error (gpg_err_code_from_errno (errno)); + log_error ("error flushing pending output: %s\n", strerror (errno)); + return tmperr; + } + + argv[0] = pgmname; + argv[1] = "--server"; + argv[2] = NULL; + + i=0; + if (log_get_fd () != -1) + no_close_list[i++] = log_get_fd (); + no_close_list[i++] = fileno (stderr); + no_close_list[i] = -1; + + /* connect to the agent and perform initial handshaking */ + rc = assuan_pipe_connect (&ctx, opt.dirmngr_program, (char**)argv, + no_close_list); + } + else + { + int prot; + int pid; + + infostr = xstrdup (infostr); + if (!try_default && *infostr) + { + if ( !(p = strchr (infostr, PATHSEP_C)) || p == infostr) + { + log_error (_("malformed DIRMNGR_INFO environment variable\n")); + xfree (infostr); + force_pipe_server = 1; + return start_dirmngr (); + } + *p++ = 0; + pid = atoi (p); + while (*p && *p != PATHSEP_C) + p++; + prot = *p? atoi (p+1) : 0; + if (prot != 1) + { + log_error (_("dirmngr protocol version %d is not supported\n"), + prot); + xfree (infostr); + force_pipe_server = 1; + return start_dirmngr (); + } + } + else + pid = -1; + + rc = assuan_socket_connect (&ctx, infostr, pid); + xfree (infostr); + if (rc == ASSUAN_Connect_Failed) + { + log_error (_("can't connect to the dirmngr - trying fall back\n")); + force_pipe_server = 1; + return start_dirmngr (); + } + } + + if (rc) + { + log_error ("can't connect to the dirmngr: %s\n", assuan_strerror (rc)); + return gpg_error (GPG_ERR_NO_DIRMNGR); + } + dirmngr_ctx = ctx; + + if (DBG_ASSUAN) + log_debug ("connection to dirmngr established\n"); + return 0; +} + + + +/* Handle a SENDCERT inquiry. */ +static AssuanError +inq_certificate (void *opaque, const char *line) +{ + struct inq_certificate_parm_s *parm = opaque; + AssuanError rc; + const unsigned char *der; + size_t derlen; + int issuer_mode = 0; + ksba_sexp_t ski = NULL; + + if (!strncmp (line, "SENDCERT", 8) && (line[8] == ' ' || !line[8])) + { + line += 8; + } + else if (!strncmp (line, "SENDCERT_SKI", 12) && (line[12]==' ' || !line[12])) + { + size_t n; + + /* Send a certificate where a sourceKeyIdentifier is included. */ + line += 12; + while (*line == ' ') + line++; + ski = make_simple_sexp_from_hexstr (line, &n); + line += n; + while (*line == ' ') + line++; + } + else if (!strncmp (line, "SENDISSUERCERT", 14) + && (line[14] == ' ' || !line[14])) + { + line += 14; + issuer_mode = 1; + } + else + { + log_error ("unsupported inquiry `%s'\n", line); + return ASSUAN_Inquire_Unknown; + } + + if (!*line) + { /* Send the current certificate. */ + der = ksba_cert_get_image (issuer_mode? parm->issuer_cert : parm->cert, + &derlen); + if (!der) + rc = ASSUAN_Inquire_Error; + else + rc = assuan_send_data (parm->ctx, der, derlen); + } + else if (issuer_mode) + { + log_error ("sending specific issuer certificate back " + "is not yet implemented\n"); + rc = ASSUAN_Inquire_Error; + } + else + { /* Send the given certificate. */ + int err; + ksba_cert_t cert; + + + err = gpgsm_find_cert (line, ski, &cert); + if (err) + { + log_error ("certificate not found: %s\n", gpg_strerror (err)); + rc = ASSUAN_Inquire_Error; + } + else + { + der = ksba_cert_get_image (cert, &derlen); + if (!der) + rc = ASSUAN_Inquire_Error; + else + rc = assuan_send_data (parm->ctx, der, derlen); + ksba_cert_release (cert); + } + } + + xfree (ski); + return rc; +} + + +/* 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 */ +} + + +static assuan_error_t +isvalid_status_cb (void *opaque, const char *line) +{ + struct isvalid_status_parm_s *parm = opaque; + + if (!strncmp (line, "PROGRESS", 8) && (line[8]==' ' || !line[8])) + { + if (parm->ctrl) + { + for (line += 8; *line == ' '; line++) + ; + if (gpgsm_status (parm->ctrl, STATUS_PROGRESS, line)) + return ASSUAN_Canceled; + } + } + else if (!strncmp (line, "ONLY_VALID_IF_CERT_VALID", 24) + && (line[24]==' ' || !line[24])) + { + parm->seen++; + if (!line[24] || !unhexify_fpr (line+25, parm->fpr)) + parm->seen++; /* Bumb it to indicate an error. */ + } + return 0; +} + + + + +/* Call the directory manager to check whether the certificate is valid + Returns 0 for valid or usually one of the errors: + + GPG_ERR_CERTIFICATE_REVOKED + GPG_ERR_NO_CRL_KNOWN + GPG_ERR_CRL_TOO_OLD + + With USE_OCSP set to true, the dirmngr is asked to do an OCSP + request first. + */ +int +gpgsm_dirmngr_isvalid (ctrl_t ctrl, + ksba_cert_t cert, ksba_cert_t issuer_cert, int use_ocsp) +{ + static int did_options; + int rc; + char *certid; + char line[ASSUAN_LINELENGTH]; + struct inq_certificate_parm_s parm; + struct isvalid_status_parm_s stparm; + + + rc = start_dirmngr (); + if (rc) + return rc; + + if (use_ocsp) + { + certid = gpgsm_get_fingerprint_hexstring (cert, GCRY_MD_SHA1); + } + else + { + certid = gpgsm_get_certid (cert); + if (!certid) + { + log_error ("error getting the certificate ID\n"); + return gpg_error (GPG_ERR_GENERAL); + } + } + + if (opt.verbose > 1) + { + char *fpr = gpgsm_get_fingerprint_string (cert, GCRY_MD_SHA1); + log_info ("asking dirmngr about %s%s\n", fpr, + use_ocsp? " (using OCSP)":""); + xfree (fpr); + } + + parm.ctx = dirmngr_ctx; + parm.cert = cert; + parm.issuer_cert = issuer_cert; + + stparm.ctrl = ctrl; + stparm.seen = 0; + memset (stparm.fpr, 0, 20); + + /* FIXME: If --disable-crl-checks has been set, we should pass an + option to dirmngr, so that no fallback CRL check is done after an + ocsp check. */ + + /* It is sufficient to send the options only once because we have + one connection per process only. */ + if (!did_options) + { + if (opt.force_crl_refresh) + assuan_transact (dirmngr_ctx, "OPTION force-crl-refresh=1", + NULL, NULL, NULL, NULL, NULL, NULL); + did_options = 1; + } + snprintf (line, DIM(line)-1, "ISVALID %s", certid); + line[DIM(line)-1] = 0; + xfree (certid); + + rc = assuan_transact (dirmngr_ctx, line, NULL, NULL, + inq_certificate, &parm, + isvalid_status_cb, &stparm); + if (opt.verbose > 1) + log_info ("response of dirmngr: %s\n", rc? assuan_strerror (rc): "okay"); + rc = map_assuan_err (rc); + + if (!rc && stparm.seen) + { + /* Need to also check the certificate validity. */ + if (stparm.seen != 1) + { + log_error ("communication problem with dirmngr detected\n"); + rc = gpg_error (GPG_ERR_INV_CRL); + } + else + { + KEYDB_HANDLE kh; + ksba_cert_t rspcert = NULL; + + /* Fixme: First try to get the certificate from the + dirmngr's cache - it should be there. */ + kh = keydb_new (0); + if (!kh) + rc = gpg_error (GPG_ERR_ENOMEM); + if (!rc) + rc = keydb_search_fpr (kh, stparm.fpr); + if (!rc) + rc = keydb_get_cert (kh, &rspcert); + if (rc) + { + log_error ("unable to find the certificate used " + "by the dirmngr: %s\n", gpg_strerror (rc)); + rc = gpg_error (GPG_ERR_INV_CRL); + } + keydb_release (kh); + + if (!rc) + { + rc = gpgsm_cert_use_ocsp_p (rspcert); + if (rc) + rc = gpg_error (GPG_ERR_INV_CRL); + else + { + /* Note, the flag = 1: This avoids checking this + certificate over and over again. */ + rc = gpgsm_validate_chain (ctrl, rspcert, NULL, 0, NULL, 1); + if (rc) + { + log_error ("invalid certificate used for CRL/OCSP: %s\n", + gpg_strerror (rc)); + rc = gpg_error (GPG_ERR_INV_CRL); + } + } + } + ksba_cert_release (rspcert); + } + } + return rc; +} + + + +/* Lookup helpers*/ +static AssuanError +lookup_cb (void *opaque, const void *buffer, size_t length) +{ + struct lookup_parm_s *parm = opaque; + size_t len; + char *buf; + ksba_cert_t cert; + int rc; + + if (parm->error) + return 0; + + if (buffer) + { + put_membuf (&parm->data, buffer, length); + return 0; + } + /* END encountered - process what we have */ + buf = get_membuf (&parm->data, &len); + if (!buf) + { + parm->error = gpg_error (GPG_ERR_ENOMEM); + return 0; + } + + rc = ksba_cert_new (&cert); + if (rc) + { + parm->error = rc; + return 0; + } + rc = ksba_cert_init_from_mem (cert, buf, len); + if (rc) + { + log_error ("failed to parse a certificate: %s\n", gpg_strerror (rc)); + } + else + { + parm->cb (parm->cb_value, cert); + } + + ksba_cert_release (cert); + init_membuf (&parm->data, 4096); + return 0; +} + +/* Return a properly escaped pattern from NAMES. The only error + return is NULL to indicate a malloc failure. */ +static char * +pattern_from_strlist (STRLIST names) +{ + STRLIST sl; + int n; + const char *s; + char *pattern, *p; + + for (n=0, sl=names; sl; sl = sl->next) + { + for (s=sl->d; *s; s++, n++) + { + if (*s == '%' || *s == ' ' || *s == '+') + n += 2; + } + n++; + } + + p = pattern = xtrymalloc (n+1); + if (!pattern) + return NULL; + + for (n=0, sl=names; sl; sl = sl->next) + { + for (s=sl->d; *s; s++) + { + switch (*s) + { + case '%': + *p++ = '%'; + *p++ = '2'; + *p++ = '5'; + break; + case ' ': + *p++ = '%'; + *p++ = '2'; + *p++ = '0'; + break; + case '+': + *p++ = '%'; + *p++ = '2'; + *p++ = 'B'; + break; + default: + *p++ = *s; + break; + } + } + *p++ = ' '; + } + if (p == pattern) + *pattern = 0; /* is empty */ + else + p[-1] = '\0'; /* remove trailing blank */ + + return pattern; +} + +static AssuanError +lookup_status_cb (void *opaque, const char *line) +{ + struct lookup_parm_s *parm = opaque; + + if (!strncmp (line, "PROGRESS", 8) && (line[8]==' ' || !line[8])) + { + if (parm->ctrl) + { + for (line += 8; *line == ' '; line++) + ; + if (gpgsm_status (parm->ctrl, STATUS_PROGRESS, line)) + return ASSUAN_Canceled; + } + } + else if (!strncmp (line, "TRUNCATED", 9) && (line[9]==' ' || !line[9])) + { + if (parm->ctrl) + { + for (line +=9; *line == ' '; line++) + ; + gpgsm_status (parm->ctrl, STATUS_TRUNCATED, line); + } + } + return 0; +} + + +/* Run the Directroy Managers lookup command using the pattern + compiled from the strings given in NAMES. The caller must provide + the callback CB which will be passed cert by cert. Note that CTRL + is optional. */ +int +gpgsm_dirmngr_lookup (CTRL ctrl, STRLIST names, + void (*cb)(void*, ksba_cert_t), void *cb_value) +{ + int rc; + char *pattern; + char line[ASSUAN_LINELENGTH]; + struct lookup_parm_s parm; + size_t len; + + rc = start_dirmngr (); + if (rc) + return rc; + + pattern = pattern_from_strlist (names); + if (!pattern) + return OUT_OF_CORE (errno); + snprintf (line, DIM(line)-1, "LOOKUP %s", pattern); + line[DIM(line)-1] = 0; + xfree (pattern); + + parm.ctrl = ctrl; + parm.ctx = dirmngr_ctx; + parm.cb = cb; + parm.cb_value = cb_value; + parm.error = 0; + init_membuf (&parm.data, 4096); + + rc = assuan_transact (dirmngr_ctx, line, lookup_cb, &parm, + NULL, NULL, lookup_status_cb, &parm); + xfree (get_membuf (&parm.data, &len)); + if (rc) + return map_assuan_err (rc); + return parm.error; +} + + + +/* Run Command helpers*/ + +/* Fairly simple callback to write all output of dirmngr to stdout. */ +static AssuanError +run_command_cb (void *opaque, const void *buffer, size_t length) +{ + if (buffer) + { + if ( fwrite (buffer, length, 1, stdout) != 1 ) + log_error ("error writing to stdout: %s\n", strerror (errno)); + } + return 0; +} + +/* Handle inquiries from the dirmngr COMMAND. */ +static AssuanError +run_command_inq_cb (void *opaque, const char *line) +{ + struct run_command_parm_s *parm = opaque; + AssuanError rc = 0; + + if ( !strncmp (line, "SENDCERT", 8) && (line[8] == ' ' || !line[8]) ) + { /* send the given certificate */ + int err; + ksba_cert_t cert; + const unsigned char *der; + size_t derlen; + + line += 8; + if (!*line) + return ASSUAN_Inquire_Error; + + err = gpgsm_find_cert (line, NULL, &cert); + if (err) + { + log_error ("certificate not found: %s\n", gpg_strerror (err)); + rc = ASSUAN_Inquire_Error; + } + else + { + der = ksba_cert_get_image (cert, &derlen); + if (!der) + rc = ASSUAN_Inquire_Error; + else + rc = assuan_send_data (parm->ctx, der, derlen); + ksba_cert_release (cert); + } + } + else if ( !strncmp (line, "PRINTINFO", 9) && (line[9] == ' ' || !line[9]) ) + { /* Simply show the message given in the argument. */ + line += 9; + log_info ("dirmngr: %s\n", line); + } + else + { + log_error ("unsupported inquiry `%s'\n", line); + rc = ASSUAN_Inquire_Unknown; + } + + return rc; +} + +static AssuanError +run_command_status_cb (void *opaque, const char *line) +{ + ctrl_t ctrl = opaque; + + if (opt.verbose) + { + log_info ("dirmngr status: %s\n", line); + } + if (!strncmp (line, "PROGRESS", 8) && (line[8]==' ' || !line[8])) + { + if (ctrl) + { + for (line += 8; *line == ' '; line++) + ; + if (gpgsm_status (ctrl, STATUS_PROGRESS, line)) + return ASSUAN_Canceled; + } + } + return 0; +} + + + +/* Pass COMMAND to dirmngr and print all output generated by Dirmngr + to stdout. A couple of inquiries are defined (see above). ARGC + arguments in ARGV are given to the Dirmngr. Spaces, plus and + percent characters within the argument strings are percent escaped + so that blanks can act as delimiters. */ +int +gpgsm_dirmngr_run_command (CTRL ctrl, const char *command, + int argc, char **argv) +{ + int rc; + int i; + const char *s; + char *line, *p; + size_t len; + struct run_command_parm_s parm; + + rc = start_dirmngr (); + if (rc) + return rc; + + parm.ctx = dirmngr_ctx; + + len = strlen (command) + 1; + for (i=0; i < argc; i++) + len += 1 + 3*strlen (argv[i]); /* enough space for percent escaping */ + line = xtrymalloc (len); + if (!line) + return OUT_OF_CORE (errno); + + p = stpcpy (line, command); + for (i=0; i < argc; i++) + { + *p++ = ' '; + for (s=argv[i]; *s; s++) + { + if (!isascii (*s)) + *p++ = *s; + else if (*s == ' ') + *p++ = '+'; + else if (!isprint (*s) || *s == '+') + { + sprintf (p, "%%%02X", *(const unsigned char *)s); + p += 3; + } + else + *p++ = *s; + } + } + *p = 0; + + rc = assuan_transact (dirmngr_ctx, line, + run_command_cb, NULL, + run_command_inq_cb, &parm, + run_command_status_cb, ctrl); + xfree (line); + log_info ("response of dirmngr: %s\n", rc? assuan_strerror (rc): "okay"); + return map_assuan_err (rc); +} diff --git a/sm/certchain.c b/sm/certchain.c new file mode 100644 index 000000000..647adc030 --- /dev/null +++ b/sm/certchain.c @@ -0,0 +1,1303 @@ +/* certchain.c - certificate chain validation + * 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 <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include <unistd.h> +#include <time.h> +#include <stdarg.h> +#include <assert.h> + +#define JNLIB_NEED_LOG_LOGV /* We need log_logv. */ + +#include "gpgsm.h" +#include <gcrypt.h> +#include <ksba.h> + +#include "keydb.h" +#include "../kbx/keybox.h" /* for KEYBOX_FLAG_* */ +#include "i18n.h" + + +static int get_regtp_ca_info (ksba_cert_t cert, int *chainlen); + + + +/* If LISTMODE is true, print FORMAT using LISTMODE to FP. If + LISTMODE is false, use the string to print an log_info or, if + IS_ERROR is true, and log_error. */ +static void +do_list (int is_error, int listmode, FILE *fp, const char *format, ...) +{ + va_list arg_ptr; + + va_start (arg_ptr, format) ; + if (listmode) + { + if (fp) + { + fputs (" [", fp); + vfprintf (fp, format, arg_ptr); + fputs ("]\n", fp); + } + } + else + { + log_logv (is_error? JNLIB_LOG_ERROR: JNLIB_LOG_INFO, format, arg_ptr); + log_printf ("\n"); + } + va_end (arg_ptr); +} + +/* Return 0 if A and B are equal. */ +static int +compare_certs (ksba_cert_t a, ksba_cert_t b) +{ + const unsigned char *img_a, *img_b; + size_t len_a, len_b; + + img_a = ksba_cert_get_image (a, &len_a); + if (!img_a) + return 1; + img_b = ksba_cert_get_image (b, &len_b); + if (!img_b) + return 1; + return !(len_a == len_b && !memcmp (img_a, img_b, len_a)); +} + + +static int +unknown_criticals (ksba_cert_t cert, int listmode, FILE *fp) +{ + static const char *known[] = { + "2.5.29.15", /* keyUsage */ + "2.5.29.19", /* basic Constraints */ + "2.5.29.32", /* certificatePolicies */ + "2.5.29.37", /* extendedKeyUsage - handled by certlist.c */ + NULL + }; + int rc = 0, i, idx, crit; + const char *oid; + gpg_error_t err; + + for (idx=0; !(err=ksba_cert_get_extension (cert, idx, + &oid, &crit, NULL, NULL));idx++) + { + if (!crit) + continue; + for (i=0; known[i] && strcmp (known[i],oid); i++) + ; + if (!known[i]) + { + do_list (1, listmode, fp, + _("critical certificate extension %s is not supported"), + oid); + rc = gpg_error (GPG_ERR_UNSUPPORTED_CERT); + } + } + if (err && gpg_err_code (err) != GPG_ERR_EOF) + rc = err; + + return rc; +} + +static int +allowed_ca (ksba_cert_t cert, int *chainlen, int listmode, FILE *fp) +{ + gpg_error_t err; + int flag; + + err = ksba_cert_is_ca (cert, &flag, chainlen); + if (err) + return err; + if (!flag) + { + if (get_regtp_ca_info (cert, chainlen)) + { + return 0; /* RegTP issued certificate. */ + } + + do_list (1, listmode, fp,_("issuer certificate is not marked as a CA")); + return gpg_error (GPG_ERR_BAD_CA_CERT); + } + return 0; +} + + +static int +check_cert_policy (ksba_cert_t cert, int listmode, FILE *fplist) +{ + gpg_error_t err; + char *policies; + FILE *fp; + int any_critical; + + err = ksba_cert_get_cert_policies (cert, &policies); + if (gpg_err_code (err) == GPG_ERR_NO_DATA) + return 0; /* no policy given */ + if (err) + return err; + + /* STRING is a line delimited list of certifiate policies as stored + in the certificate. The line itself is colon delimited where the + first field is the OID of the policy and the second field either + N or C for normal or critical extension */ + + if (opt.verbose > 1 && !listmode) + log_info ("certificate's policy list: %s\n", policies); + + /* The check is very minimal but won't give false positives */ + any_critical = !!strstr (policies, ":C"); + + if (!opt.policy_file) + { + xfree (policies); + if (any_critical) + { + do_list (1, listmode, fplist, + _("critical marked policy without configured policies")); + return gpg_error (GPG_ERR_NO_POLICY_MATCH); + } + return 0; + } + + fp = fopen (opt.policy_file, "r"); + if (!fp) + { + if (opt.verbose || errno != ENOENT) + log_info (_("failed to open `%s': %s\n"), + opt.policy_file, strerror (errno)); + xfree (policies); + /* With no critical policies this is only a warning */ + if (!any_critical) + { + do_list (0, listmode, fplist, + _("note: non-critical certificate policy not allowed")); + return 0; + } + do_list (1, listmode, fplist, + _("certificate policy not allowed")); + return gpg_error (GPG_ERR_NO_POLICY_MATCH); + } + + for (;;) + { + int c; + char *p, line[256]; + char *haystack, *allowed; + + /* read line */ + do + { + if (!fgets (line, DIM(line)-1, fp) ) + { + gpg_error_t tmperr = gpg_error (gpg_err_code_from_errno (errno)); + + xfree (policies); + if (feof (fp)) + { + fclose (fp); + /* With no critical policies this is only a warning */ + if (!any_critical) + { + do_list (0, listmode, fplist, + _("note: non-critical certificate policy not allowed")); + return 0; + } + do_list (1, listmode, fplist, + _("certificate policy not allowed")); + return gpg_error (GPG_ERR_NO_POLICY_MATCH); + } + fclose (fp); + return tmperr; + } + + if (!*line || line[strlen(line)-1] != '\n') + { + /* eat until end of line */ + while ( (c=getc (fp)) != EOF && c != '\n') + ; + fclose (fp); + xfree (policies); + return gpg_error (*line? GPG_ERR_LINE_TOO_LONG + : GPG_ERR_INCOMPLETE_LINE); + } + + /* Allow for empty lines and spaces */ + for (p=line; spacep (p); p++) + ; + } + while (!*p || *p == '\n' || *p == '#'); + + /* parse line */ + for (allowed=line; spacep (allowed); allowed++) + ; + p = strpbrk (allowed, " :\n"); + if (!*p || p == allowed) + { + fclose (fp); + xfree (policies); + return gpg_error (GPG_ERR_CONFIGURATION); + } + *p = 0; /* strip the rest of the line */ + /* See whether we find ALLOWED (which is an OID) in POLICIES */ + for (haystack=policies; (p=strstr (haystack, allowed)); haystack = p+1) + { + if ( !(p == policies || p[-1] == '\n') ) + continue; /* Does not match the begin of a line. */ + if (p[strlen (allowed)] != ':') + continue; /* The length does not match. */ + /* Yep - it does match so return okay. */ + fclose (fp); + xfree (policies); + return 0; + } + } +} + + +/* Helper function for find_up. This resets the key handle and search + for an issuer ISSUER with a subjectKeyIdentifier of KEYID. Returns + 0 obn success or -1 when not found. */ +static int +find_up_search_by_keyid (KEYDB_HANDLE kh, + const char *issuer, ksba_sexp_t keyid) +{ + int rc; + ksba_cert_t cert = NULL; + ksba_sexp_t subj = NULL; + + keydb_search_reset (kh); + while (!(rc = keydb_search_subject (kh, issuer))) + { + ksba_cert_release (cert); cert = NULL; + rc = keydb_get_cert (kh, &cert); + if (rc) + { + log_error ("keydb_get_cert() failed: rc=%d\n", rc); + rc = -1; + break; + } + xfree (subj); + if (!ksba_cert_get_subj_key_id (cert, NULL, &subj)) + { + if (!cmp_simple_canon_sexp (keyid, subj)) + break; /* Found matching cert. */ + } + } + + ksba_cert_release (cert); + xfree (subj); + return rc? -1:0; +} + + +static void +find_up_store_certs_cb (void *cb_value, ksba_cert_t cert) +{ + if (keydb_store_cert (cert, 1, NULL)) + log_error ("error storing issuer certificate as ephemeral\n"); + ++*(int*)cb_value; +} + + +/* Helper for find_up(). Locate the certificate for ISSUER using an + external lookup. KH is the keydb context we are currently using. + On success 0 is returned and the certificate may be retrieved from + the keydb using keydb_get_cert(). KEYID is the keyIdentifier from + the AKI or NULL. */ +static int +find_up_external (KEYDB_HANDLE kh, const char *issuer, ksba_sexp_t keyid) +{ + int rc; + strlist_t names = NULL; + int count = 0; + char *pattern; + const char *s; + + if (opt.verbose) + log_info (_("looking up issuer at external location\n")); + /* The DIRMNGR process is confused about unknown attributes. As a + quick and ugly hack we locate the CN and use the issuer string + starting at this attribite. Fixme: we should have far better + parsing in the dirmngr. */ + s = strstr (issuer, "CN="); + if (!s || s == issuer || s[-1] != ',') + s = issuer; + + pattern = xtrymalloc (strlen (s)+2); + if (!pattern) + return gpg_error_from_errno (errno); + strcpy (stpcpy (pattern, "/"), s); + add_to_strlist (&names, pattern); + xfree (pattern); + + rc = gpgsm_dirmngr_lookup (NULL, names, find_up_store_certs_cb, &count); + free_strlist (names); + + if (opt.verbose) + log_info (_("number of issuers matching: %d\n"), count); + if (rc) + { + log_error ("external key lookup failed: %s\n", gpg_strerror (rc)); + rc = -1; + } + else if (!count) + rc = -1; + else + { + int old; + /* The issuers are currently stored in the ephemeral key DB, so + we temporary switch to ephemeral mode. */ + old = keydb_set_ephemeral (kh, 1); + if (keyid) + rc = find_up_search_by_keyid (kh, issuer, keyid); + else + { + keydb_search_reset (kh); + rc = keydb_search_subject (kh, issuer); + } + keydb_set_ephemeral (kh, old); + } + return rc; +} + + +/* Locate issuing certificate for CERT. ISSUER is the name of the + issuer used as a fallback if the other methods don't work. If + FIND_NEXT is true, the function shall return the next possible + issuer. The certificate itself is not directly returned but a + keydb_get_cert on the keyDb context KH will return it. Returns 0 + on success, -1 if not found or an error code. */ +static int +find_up (KEYDB_HANDLE kh, ksba_cert_t cert, const char *issuer, int find_next) +{ + ksba_name_t authid; + ksba_sexp_t authidno; + ksba_sexp_t keyid; + int rc = -1; + + if (!ksba_cert_get_auth_key_id (cert, &keyid, &authid, &authidno)) + { + const char *s = ksba_name_enum (authid, 0); + if (s && *authidno) + { + rc = keydb_search_issuer_sn (kh, s, authidno); + if (rc) + keydb_search_reset (kh); + + /* In case of an error try the ephemeral DB. We can't do + that in find_next mode because we can't keep the search + state then. */ + if (rc == -1 && !find_next) + { + int old = keydb_set_ephemeral (kh, 1); + if (!old) + { + rc = keydb_search_issuer_sn (kh, s, authidno); + if (rc) + keydb_search_reset (kh); + } + keydb_set_ephemeral (kh, old); + } + + } + + if (rc == -1 && keyid && !find_next) + { + /* Not found by AIK.issuer_sn. Lets try the AIY.ki + instead. Loop over all certificates with that issuer as + subject and stop for the one with a matching + subjectKeyIdentifier. */ + rc = find_up_search_by_keyid (kh, issuer, keyid); + if (rc) + { + int old = keydb_set_ephemeral (kh, 1); + if (!old) + rc = find_up_search_by_keyid (kh, issuer, keyid); + keydb_set_ephemeral (kh, old); + } + if (rc) + rc = -1; /* Need to make sure to have this error code. */ + } + + /* If we still didn't found it, try an external lookup. */ + if (rc == -1 && opt.auto_issuer_key_retrieve && !find_next) + rc = find_up_external (kh, issuer, keyid); + + /* Print a note so that the user does not feel too helpless when + an issuer certificate was found and gpgsm prints BAD + signature because it is not the correct one. */ + if (rc == -1) + { + log_info ("%sissuer certificate ", find_next?"next ":""); + if (keyid) + { + log_printf ("{"); + gpgsm_dump_serial (keyid); + log_printf ("} "); + } + if (authidno) + { + log_printf ("(#"); + gpgsm_dump_serial (authidno); + log_printf ("/"); + gpgsm_dump_string (s); + log_printf (") "); + } + log_printf ("not found using authorityKeyIdentifier\n"); + } + else if (rc) + log_error ("failed to find authorityKeyIdentifier: rc=%d\n", rc); + xfree (keyid); + ksba_name_release (authid); + xfree (authidno); + } + + if (rc) /* Not found via authorithyKeyIdentifier, try regular issuer name. */ + rc = keydb_search_subject (kh, issuer); + if (rc == -1 && !find_next) + { + /* Not found, lets see whether we have one in the ephemeral key DB. */ + int old = keydb_set_ephemeral (kh, 1); + if (!old) + { + keydb_search_reset (kh); + rc = keydb_search_subject (kh, issuer); + } + keydb_set_ephemeral (kh, old); + } + + /* Still not found. If enabled, try an external lookup. */ + if (rc == -1 && opt.auto_issuer_key_retrieve && !find_next) + rc = find_up_external (kh, issuer, NULL); + + return rc; +} + + +/* Return the next certificate up in the chain starting at START. + Returns -1 when there are no more certificates. */ +int +gpgsm_walk_cert_chain (ksba_cert_t start, ksba_cert_t *r_next) +{ + int rc = 0; + char *issuer = NULL; + char *subject = NULL; + KEYDB_HANDLE kh = keydb_new (0); + + *r_next = NULL; + if (!kh) + { + log_error (_("failed to allocated keyDB handle\n")); + rc = gpg_error (GPG_ERR_GENERAL); + goto leave; + } + + issuer = ksba_cert_get_issuer (start, 0); + subject = ksba_cert_get_subject (start, 0); + if (!issuer) + { + log_error ("no issuer found in certificate\n"); + rc = gpg_error (GPG_ERR_BAD_CERT); + goto leave; + } + if (!subject) + { + log_error ("no subject found in certificate\n"); + rc = gpg_error (GPG_ERR_BAD_CERT); + goto leave; + } + + if (!strcmp (issuer, subject)) + { + rc = -1; /* we are at the root */ + goto leave; + } + + rc = find_up (kh, start, issuer, 0); + if (rc) + { + /* it is quite common not to have a certificate, so better don't + print an error here */ + if (rc != -1 && opt.verbose > 1) + log_error ("failed to find issuer's certificate: rc=%d\n", rc); + rc = gpg_error (GPG_ERR_MISSING_CERT); + goto leave; + } + + rc = keydb_get_cert (kh, r_next); + if (rc) + { + log_error ("keydb_get_cert() failed: rc=%d\n", rc); + rc = gpg_error (GPG_ERR_GENERAL); + } + + leave: + xfree (issuer); + xfree (subject); + keydb_release (kh); + return rc; +} + + +/* Check whether the CERT is a root certificate. Returns True if this + is the case. */ +int +gpgsm_is_root_cert (ksba_cert_t cert) +{ + char *issuer; + char *subject; + int yes; + + issuer = ksba_cert_get_issuer (cert, 0); + subject = ksba_cert_get_subject (cert, 0); + yes = (issuer && subject && !strcmp (issuer, subject)); + xfree (issuer); + xfree (subject); + return yes; +} + + +/* This is a helper for gpgsm_validate_chain. */ +static gpg_error_t +is_cert_still_valid (ctrl_t ctrl, int lm, FILE *fp, + ksba_cert_t subject_cert, ksba_cert_t issuer_cert, + int *any_revoked, int *any_no_crl, int *any_crl_too_old) +{ + if (!opt.no_crl_check || ctrl->use_ocsp) + { + gpg_error_t err; + + err = gpgsm_dirmngr_isvalid (ctrl, + subject_cert, issuer_cert, ctrl->use_ocsp); + if (err) + { + /* Fixme: We should change the wording because we may + have used OCSP. */ + if (!lm) + gpgsm_cert_log_name (NULL, subject_cert); + switch (gpg_err_code (err)) + { + case GPG_ERR_CERT_REVOKED: + do_list (1, lm, fp, _("certificate has been revoked")); + *any_revoked = 1; + /* Store that in the keybox so that key listings are + able to return the revoked flag. We don't care + about error, though. */ + keydb_set_cert_flags (subject_cert, KEYBOX_FLAG_VALIDITY, 0, + VALIDITY_REVOKED); + break; + case GPG_ERR_NO_CRL_KNOWN: + do_list (1, lm, fp, _("no CRL found for certificate")); + *any_no_crl = 1; + break; + case GPG_ERR_CRL_TOO_OLD: + do_list (1, lm, fp, _("the available CRL is too old")); + if (!lm) + log_info (_("please make sure that the " + "\"dirmngr\" is properly installed\n")); + *any_crl_too_old = 1; + break; + default: + do_list (1, lm, fp, _("checking the CRL failed: %s"), + gpg_strerror (err)); + return err; + } + } + } + return 0; +} + + + +/* Validate a chain and optionally return the nearest expiration time + in R_EXPTIME. With LISTMODE set to 1 a special listmode is + activated where only information about the certificate is printed + to FP and no output is send to the usual log stream. + + Defined flag bits: 0 - do not do any dirmngr isvalid checks. +*/ +int +gpgsm_validate_chain (ctrl_t ctrl, ksba_cert_t cert, ksba_isotime_t r_exptime, + int listmode, FILE *fp, unsigned int flags) +{ + int rc = 0, depth = 0, maxdepth; + char *issuer = NULL; + char *subject = NULL; + KEYDB_HANDLE kh = NULL; + ksba_cert_t subject_cert = NULL, issuer_cert = NULL; + ksba_isotime_t current_time; + ksba_isotime_t exptime; + int any_expired = 0; + int any_revoked = 0; + int any_no_crl = 0; + int any_crl_too_old = 0; + int any_no_policy_match = 0; + int is_qualified = -1; /* Indicates whether the certificate stems + from a qualified root certificate. + -1 = unknown, 0 = no, 1 = yes. */ + int lm = listmode; + + gnupg_get_isotime (current_time); + if (r_exptime) + *r_exptime = 0; + *exptime = 0; + + if (opt.no_chain_validation && !listmode) + { + log_info ("WARNING: bypassing certificate chain validation\n"); + return 0; + } + + kh = keydb_new (0); + if (!kh) + { + log_error (_("failed to allocated keyDB handle\n")); + rc = gpg_error (GPG_ERR_GENERAL); + goto leave; + } + + if (DBG_X509 && !listmode) + gpgsm_dump_cert ("target", cert); + + subject_cert = cert; + maxdepth = 50; + + for (;;) + { + xfree (issuer); + xfree (subject); + issuer = ksba_cert_get_issuer (subject_cert, 0); + subject = ksba_cert_get_subject (subject_cert, 0); + + if (!issuer) + { + do_list (1, lm, fp, _("no issuer found in certificate")); + rc = gpg_error (GPG_ERR_BAD_CERT); + goto leave; + } + + { + ksba_isotime_t not_before, not_after; + + rc = ksba_cert_get_validity (subject_cert, 0, not_before); + if (!rc) + rc = ksba_cert_get_validity (subject_cert, 1, not_after); + if (rc) + { + do_list (1, lm, fp, _("certificate with invalid validity: %s"), + gpg_strerror (rc)); + rc = gpg_error (GPG_ERR_BAD_CERT); + goto leave; + } + + if (*not_after) + { + if (!*exptime) + gnupg_copy_time (exptime, not_after); + else if (strcmp (not_after, exptime) < 0 ) + gnupg_copy_time (exptime, not_after); + } + + if (*not_before && strcmp (current_time, not_before) < 0 ) + { + do_list (1, lm, fp, _("certificate not yet valid")); + if (!lm) + { + log_info ("(valid from "); + gpgsm_dump_time (not_before); + log_printf (")\n"); + } + rc = gpg_error (GPG_ERR_CERT_TOO_YOUNG); + goto leave; + } + if (*not_after && strcmp (current_time, not_after) > 0 ) + { + do_list (opt.ignore_expiration?0:1, lm, fp, + _("certificate has expired")); + if (!lm) + { + log_info ("(expired at "); + gpgsm_dump_time (not_after); + log_printf (")\n"); + } + if (opt.ignore_expiration) + log_info ("WARNING: ignoring expiration\n"); + else + any_expired = 1; + } + } + + rc = unknown_criticals (subject_cert, listmode, fp); + if (rc) + goto leave; + + if (!opt.no_policy_check) + { + rc = check_cert_policy (subject_cert, listmode, fp); + if (gpg_err_code (rc) == GPG_ERR_NO_POLICY_MATCH) + { + any_no_policy_match = 1; + rc = 1; + } + else if (rc) + goto leave; + } + + + /* Is this a self-issued certificate? */ + if (subject && !strcmp (issuer, subject)) + { /* Yes. */ + if (gpgsm_check_cert_sig (subject_cert, subject_cert) ) + { + do_list (1, lm, fp, + _("self-signed certificate has a BAD signature")); + if (DBG_X509) + { + gpgsm_dump_cert ("self-signing cert", subject_cert); + } + rc = gpg_error (depth? GPG_ERR_BAD_CERT_CHAIN + : GPG_ERR_BAD_CERT); + goto leave; + } + rc = allowed_ca (subject_cert, NULL, listmode, fp); + if (rc) + goto leave; + + + /* Set the flag for qualified signatures. This flag is + deduced from a list of root certificates allowed for + qualified signatures. */ + if (is_qualified == -1) + { + gpg_error_t err; + size_t buflen; + char buf[1]; + + if (!ksba_cert_get_user_data (cert, "is_qualified", + &buf, sizeof (buf), + &buflen) && buflen) + { + /* We already checked this for this certificate, + thus we simply take it from the user data. */ + is_qualified = !!*buf; + } + else + { + /* Need to consult the list of root certificates for + qualified signatures. */ + err = gpgsm_is_in_qualified_list (ctrl, subject_cert, NULL); + if (!err) + is_qualified = 1; + else if ( gpg_err_code (err) == GPG_ERR_NOT_FOUND) + is_qualified = 0; + else + log_error ("checking the list of qualified " + "root certificates failed: %s\n", + gpg_strerror (err)); + if ( is_qualified != -1 ) + { + /* Cache the result but don't care too much + about an error. */ + buf[0] = !!is_qualified; + err = ksba_cert_set_user_data (subject_cert, + "is_qualified", buf, 1); + if (err) + log_error ("set_user_data(is_qualified) failed: %s\n", + gpg_strerror (err)); + } + } + } + + + /* Check whether we really trust this root certificate. */ + rc = gpgsm_agent_istrusted (ctrl, subject_cert); + if (!rc) + ; + else if (gpg_err_code (rc) == GPG_ERR_NOT_TRUSTED) + { + do_list (0, lm, fp, _("root certificate is not marked trusted")); + /* If we already figured out that the certificate is + expired it does not make much sense to ask the user + whether we wants to trust the root certificate. He + should do this only if the certificate under question + will then be usable. */ + if (!lm && !any_expired) + { + int rc2; + char *fpr = gpgsm_get_fingerprint_string (subject_cert, + GCRY_MD_SHA1); + log_info (_("fingerprint=%s\n"), fpr? fpr : "?"); + xfree (fpr); + rc2 = gpgsm_agent_marktrusted (ctrl, subject_cert); + if (!rc2) + { + log_info (_("root certificate has now" + " been marked as trusted\n")); + rc = 0; + } + else + { + gpgsm_dump_cert ("issuer", subject_cert); + log_info ("after checking the fingerprint, you may want " + "to add it manually to the list of trusted " + "certificates.\n"); + } + } + } + else + { + log_error (_("checking the trust list failed: %s\n"), + gpg_strerror (rc)); + } + + if (rc) + goto leave; + + /* Check for revocations etc. */ + if ((flags & 1)) + ; + else if (opt.no_trusted_cert_crl_check) + ; + else + rc = is_cert_still_valid (ctrl, lm, fp, + subject_cert, subject_cert, + &any_revoked, &any_no_crl, + &any_crl_too_old); + if (rc) + goto leave; + + break; /* Okay: a self-signed certicate is an end-point. */ + } + + depth++; + if (depth > maxdepth) + { + do_list (1, lm, fp, _("certificate chain too long\n")); + rc = gpg_error (GPG_ERR_BAD_CERT_CHAIN); + goto leave; + } + + /* find the next cert up the tree */ + keydb_search_reset (kh); + rc = find_up (kh, subject_cert, issuer, 0); + if (rc) + { + if (rc == -1) + { + do_list (0, lm, fp, _("issuer certificate not found")); + if (!lm) + { + log_info ("issuer certificate: #/"); + gpgsm_dump_string (issuer); + log_printf ("\n"); + } + } + else + log_error ("failed to find issuer's certificate: rc=%d\n", rc); + rc = gpg_error (GPG_ERR_MISSING_CERT); + goto leave; + } + + ksba_cert_release (issuer_cert); issuer_cert = NULL; + rc = keydb_get_cert (kh, &issuer_cert); + if (rc) + { + log_error ("keydb_get_cert() failed: rc=%d\n", rc); + rc = gpg_error (GPG_ERR_GENERAL); + goto leave; + } + + try_another_cert: + if (DBG_X509) + { + log_debug ("got issuer's certificate:\n"); + gpgsm_dump_cert ("issuer", issuer_cert); + } + + rc = gpgsm_check_cert_sig (issuer_cert, subject_cert); + if (rc) + { + do_list (0, lm, fp, _("certificate has a BAD signature")); + if (DBG_X509) + { + gpgsm_dump_cert ("signing issuer", issuer_cert); + gpgsm_dump_cert ("signed subject", subject_cert); + } + if (gpg_err_code (rc) == GPG_ERR_BAD_SIGNATURE) + { + /* We now try to find other issuer certificates which + might have been used. This is required because some + CAs are reusing the issuer and subject DN for new + root certificates. */ + /* FIXME: Do this only if we don't have an + AKI.keyIdentifier */ + rc = find_up (kh, subject_cert, issuer, 1); + if (!rc) + { + ksba_cert_t tmp_cert; + + rc = keydb_get_cert (kh, &tmp_cert); + if (rc || !compare_certs (issuer_cert, tmp_cert)) + { + /* The find next did not work or returned an + identical certificate. We better stop here + to avoid infinite checks. */ + rc = gpg_error (GPG_ERR_BAD_SIGNATURE); + ksba_cert_release (tmp_cert); + } + else + { + do_list (0, lm, fp, _("found another possible matching " + "CA certificate - trying again")); + ksba_cert_release (issuer_cert); + issuer_cert = tmp_cert; + goto try_another_cert; + } + } + } + + /* We give a more descriptive error code than the one + returned from the signature checking. */ + rc = gpg_error (GPG_ERR_BAD_CERT_CHAIN); + goto leave; + } + + { + int chainlen; + rc = allowed_ca (issuer_cert, &chainlen, listmode, fp); + if (rc) + goto leave; + if (chainlen >= 0 && (depth - 1) > chainlen) + { + do_list (1, lm, fp, + _("certificate chain longer than allowed by CA (%d)"), + chainlen); + rc = gpg_error (GPG_ERR_BAD_CERT_CHAIN); + goto leave; + } + } + + if (!listmode) + { + rc = gpgsm_cert_use_cert_p (issuer_cert); + if (rc) + { + char numbuf[50]; + sprintf (numbuf, "%d", rc); + gpgsm_status2 (ctrl, STATUS_ERROR, "certcert.issuer.keyusage", + numbuf, NULL); + goto leave; + } + } + + /* Check for revocations etc. */ + if ((flags & 1)) + rc = 0; + else + rc = is_cert_still_valid (ctrl, lm, fp, + subject_cert, issuer_cert, + &any_revoked, &any_no_crl, &any_crl_too_old); + if (rc) + goto leave; + + + if (opt.verbose && !listmode) + log_info ("certificate is good\n"); + + keydb_search_reset (kh); + subject_cert = issuer_cert; + issuer_cert = NULL; + } /* End chain traversal. */ + + if (!listmode) + { + if (opt.no_policy_check) + log_info ("policies not checked due to %s option\n", + "--disable-policy-checks"); + if (opt.no_crl_check && !ctrl->use_ocsp) + log_info ("CRLs not checked due to %s option\n", + "--disable-crl-checks"); + } + + if (!rc) + { /* If we encountered an error somewhere during the checks, set + the error code to the most critical one */ + if (any_revoked) + rc = gpg_error (GPG_ERR_CERT_REVOKED); + else if (any_expired) + rc = gpg_error (GPG_ERR_CERT_EXPIRED); + else if (any_no_crl) + rc = gpg_error (GPG_ERR_NO_CRL_KNOWN); + else if (any_crl_too_old) + rc = gpg_error (GPG_ERR_CRL_TOO_OLD); + else if (any_no_policy_match) + rc = gpg_error (GPG_ERR_NO_POLICY_MATCH); + } + + leave: + if (is_qualified != -1) + { + /* We figured something about the qualified signature capability + of the certificate under question. Store the result as user + data in the certificate object. We do this even if the + validation itself failed. */ + /* Fixme: We should set this flag for all certificates in the + chain for optimizing reasons. */ + char buf[1]; + gpg_error_t err; + + buf[0] = !!is_qualified; + err = ksba_cert_set_user_data (cert, "is_qualified", buf, 1); + if (err) + { + log_error ("set_user_data(is_qualified) failed: %s\n", + gpg_strerror (err)); + if (!rc) + rc = err; + } + } + if (r_exptime) + gnupg_copy_time (r_exptime, exptime); + xfree (issuer); + keydb_release (kh); + ksba_cert_release (issuer_cert); + if (subject_cert != cert) + ksba_cert_release (subject_cert); + return rc; +} + + +/* Check that the given certificate is valid but DO NOT check any + constraints. We assume that the issuers certificate is already in + the DB and that this one is valid; which it should be because it + has been checked using this function. */ +int +gpgsm_basic_cert_check (ksba_cert_t cert) +{ + int rc = 0; + char *issuer = NULL; + char *subject = NULL; + KEYDB_HANDLE kh; + ksba_cert_t issuer_cert = NULL; + + if (opt.no_chain_validation) + { + log_info ("WARNING: bypassing basic certificate checks\n"); + return 0; + } + + kh = keydb_new (0); + if (!kh) + { + log_error (_("failed to allocated keyDB handle\n")); + rc = gpg_error (GPG_ERR_GENERAL); + goto leave; + } + + issuer = ksba_cert_get_issuer (cert, 0); + subject = ksba_cert_get_subject (cert, 0); + if (!issuer) + { + log_error ("no issuer found in certificate\n"); + rc = gpg_error (GPG_ERR_BAD_CERT); + goto leave; + } + + if (subject && !strcmp (issuer, subject)) + { + rc = gpgsm_check_cert_sig (cert, cert); + if (rc) + { + log_error ("self-signed certificate has a BAD signature: %s\n", + gpg_strerror (rc)); + if (DBG_X509) + { + gpgsm_dump_cert ("self-signing cert", cert); + } + rc = gpg_error (GPG_ERR_BAD_CERT); + goto leave; + } + } + else + { + /* Find the next cert up the tree. */ + keydb_search_reset (kh); + rc = find_up (kh, cert, issuer, 0); + if (rc) + { + if (rc == -1) + { + log_info ("issuer certificate (#/"); + gpgsm_dump_string (issuer); + log_printf (") not found\n"); + } + else + log_error ("failed to find issuer's certificate: rc=%d\n", rc); + rc = gpg_error (GPG_ERR_MISSING_CERT); + goto leave; + } + + ksba_cert_release (issuer_cert); issuer_cert = NULL; + rc = keydb_get_cert (kh, &issuer_cert); + if (rc) + { + log_error ("keydb_get_cert() failed: rc=%d\n", rc); + rc = gpg_error (GPG_ERR_GENERAL); + goto leave; + } + + rc = gpgsm_check_cert_sig (issuer_cert, cert); + if (rc) + { + log_error ("certificate has a BAD signature: %s\n", + gpg_strerror (rc)); + if (DBG_X509) + { + gpgsm_dump_cert ("signing issuer", issuer_cert); + gpgsm_dump_cert ("signed subject", cert); + } + rc = gpg_error (GPG_ERR_BAD_CERT); + goto leave; + } + if (opt.verbose) + log_info ("certificate is good\n"); + } + + leave: + xfree (issuer); + keydb_release (kh); + ksba_cert_release (issuer_cert); + return rc; +} + + + +/* Check whether the certificate CERT has been issued by the German + authority for qualified signature. They do not set the + basicConstraints and thus we need this workaround. It works by + looking up the root certificate and checking whether that one is + listed as a qualified certificate for Germany. + + We also try to cache this data but as long as don't keep a + reference to the certificate this won't be used. + + Returns: True if CERT is a RegTP issued CA cert (i.e. the root + certificate itself or one of the CAs). In that case CHAINLEN will + receive the length of the chain which is either 0 or 1. +*/ +static int +get_regtp_ca_info (ksba_cert_t cert, int *chainlen) +{ + gpg_error_t err; + ksba_cert_t next; + int rc = 0; + int i, depth; + char country[3]; + ksba_cert_t array[4]; + char buf[2]; + size_t buflen; + int dummy_chainlen; + + if (!chainlen) + chainlen = &dummy_chainlen; + + *chainlen = 0; + err = ksba_cert_get_user_data (cert, "regtp_ca_chainlen", + &buf, sizeof (buf), &buflen); + if (!err) + { + /* Got info. */ + if (buflen < 2 || !*buf) + return 0; /* Nothing found. */ + *chainlen = buf[1]; + return 1; /* This is a regtp CA. */ + } + else if (gpg_err_code (err) != GPG_ERR_NOT_FOUND) + { + log_error ("ksba_cert_get_user_data(%s) failed: %s\n", + "regtp_ca_chainlen", gpg_strerror (err)); + return 0; /* Nothing found. */ + } + + /* Need to gather the info. This requires to walk up the chain + until we have found the root. Because we are only interested in + German Bundesnetzagentur (former RegTP) derived certificates 3 + levels are enough. (The German signature law demands a 3 tier + hierachy; thus there is only one CA between the EE and the Root + CA.) */ + memset (&array, 0, sizeof array); + + depth = 0; + ksba_cert_ref (cert); + array[depth++] = cert; + ksba_cert_ref (cert); + while (depth < DIM(array) && !(rc=gpgsm_walk_cert_chain (cert, &next))) + { + ksba_cert_release (cert); + ksba_cert_ref (next); + array[depth++] = next; + cert = next; + } + ksba_cert_release (cert); + if (rc != -1 || !depth || depth == DIM(array) ) + { + /* We did not reached the root. */ + goto leave; + } + + /* If this is a German signature law issued certificate, we store + additional additional information. */ + if (!gpgsm_is_in_qualified_list (NULL, array[depth-1], country) + && !strcmp (country, "de")) + { + /* Setting the pathlen for the root CA and the CA flag for the + next one is all what we need to do. */ + err = ksba_cert_set_user_data (array[depth-1], "regtp_ca_chainlen", + "\x01\x01", 2); + if (!err && depth > 1) + err = ksba_cert_set_user_data (array[depth-2], "regtp_ca_chainlen", + "\x01\x00", 2); + if (err) + log_error ("ksba_set_user_data(%s) failed: %s\n", + "regtp_ca_chainlen", gpg_strerror (err)); + for (i=0; i < depth; i++) + ksba_cert_release (array[i]); + *chainlen = (depth>1? 0:1); + return 1; + } + + leave: + /* Nothing special with this certificate. Mark the target + certificate anyway to avoid duplicate lookups. */ + err = ksba_cert_set_user_data (cert, "regtp_ca_chainlen", "", 1); + if (err) + log_error ("ksba_set_user_data(%s) failed: %s\n", + "regtp_ca_chainlen", gpg_strerror (err)); + for (i=0; i < depth; i++) + ksba_cert_release (array[i]); + return 0; +} diff --git a/sm/certcheck.c b/sm/certcheck.c new file mode 100644 index 000000000..732356149 --- /dev/null +++ b/sm/certcheck.c @@ -0,0 +1,364 @@ +/* certcheck.c - check one certificate + * Copyright (C) 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 <unistd.h> +#include <time.h> +#include <assert.h> + +#include "gpgsm.h" +#include <gcrypt.h> +#include <ksba.h> + +#include "keydb.h" +#include "i18n.h" + + +static int +do_encode_md (gcry_md_hd_t md, int algo, int pkalgo, unsigned int nbits, + gcry_mpi_t *r_val) +{ + int n; + size_t nframe; + unsigned char *frame; + + if (pkalgo == GCRY_PK_DSA) + { + nframe = gcry_md_get_algo_dlen (algo); + if (nframe != 20) + { + log_error (_("DSA requires the use of a 160 bit hash algorithm\n")); + return gpg_error (GPG_ERR_INTERNAL); + } + frame = xtrymalloc (nframe); + if (!frame) + return OUT_OF_CORE (errno); + memcpy (frame, gcry_md_read (md, algo), nframe); + n = nframe; + } + else + { + int i; + unsigned char asn[100]; + size_t asnlen; + size_t len; + + nframe = (nbits+7) / 8; + + asnlen = DIM(asn); + if (gcry_md_algo_info (algo, GCRYCTL_GET_ASNOID, asn, &asnlen)) + { + log_error ("no object identifier for algo %d\n", algo); + return gpg_error (GPG_ERR_INTERNAL); + } + + len = gcry_md_get_algo_dlen (algo); + + if ( len + asnlen + 4 > nframe ) + { + log_error ("can't encode a %d bit MD into a %d bits frame\n", + (int)(len*8), (int)nbits); + return gpg_error (GPG_ERR_INTERNAL); + } + + /* We encode the MD in this way: + * + * 0 A PAD(n bytes) 0 ASN(asnlen bytes) MD(len bytes) + * + * PAD consists of FF bytes. + */ + frame = xtrymalloc (nframe); + if (!frame) + return OUT_OF_CORE (errno); + 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, gcry_md_read(md, algo), len ); n += len; + assert ( n == nframe ); + } + if (DBG_CRYPTO) + { + int j; + log_debug ("encoded hash:"); + for (j=0; j < nframe; j++) + log_printf (" %02X", frame[j]); + log_printf ("\n"); + } + + gcry_mpi_scan (r_val, GCRYMPI_FMT_USG, frame, n, &nframe); + xfree (frame); + return 0; +} + +/* Return the public key algorithm id from the S-expression PKEY. + FIXME: libgcrypt should provide such a function. Note that this + implementation uses the names as used by libksba. */ +static int +pk_algo_from_sexp (gcry_sexp_t pkey) +{ + gcry_sexp_t l1, l2; + const char *name; + size_t n; + int algo; + + l1 = gcry_sexp_find_token (pkey, "public-key", 0); + if (!l1) + return 0; /* Not found. */ + l2 = gcry_sexp_cadr (l1); + gcry_sexp_release (l1); + + name = gcry_sexp_nth_data (l2, 0, &n); + if (!name) + algo = 0; /* Not found. */ + else if (n==3 && !memcmp (name, "rsa", 3)) + algo = GCRY_PK_RSA; + else if (n==3 && !memcmp (name, "dsa", 3)) + algo = GCRY_PK_DSA; + else if (n==13 && !memcmp (name, "ambiguous-rsa", 13)) + algo = GCRY_PK_RSA; + else + algo = 0; + gcry_sexp_release (l2); + return algo; +} + + +/* + Check the signature on CERT using the ISSUER-CERT. This function + does only test the cryptographic signature and nothing else. It is + assumed that the ISSUER_CERT is valid. */ +int +gpgsm_check_cert_sig (ksba_cert_t issuer_cert, ksba_cert_t cert) +{ + const char *algoid; + gcry_md_hd_t md; + int rc, algo; + gcry_mpi_t frame; + ksba_sexp_t p; + size_t n; + gcry_sexp_t s_sig, s_hash, s_pkey; + + algo = gcry_md_map_name ( (algoid=ksba_cert_get_digest_algo (cert))); + if (!algo) + { + log_error ("unknown hash algorithm `%s'\n", algoid? algoid:"?"); + if (algoid + && ( !strcmp (algoid, "1.2.840.113549.1.1.2") + ||!strcmp (algoid, "1.2.840.113549.2.2"))) + log_info (_("(this is the MD2 algorithm)\n")); + return gpg_error (GPG_ERR_GENERAL); + } + rc = gcry_md_open (&md, algo, 0); + if (rc) + { + log_error ("md_open failed: %s\n", gpg_strerror (rc)); + return rc; + } + if (DBG_HASHING) + gcry_md_start_debug (md, "hash.cert"); + + rc = ksba_cert_hash (cert, 1, HASH_FNC, md); + if (rc) + { + log_error ("ksba_cert_hash failed: %s\n", gpg_strerror (rc)); + gcry_md_close (md); + return rc; + } + gcry_md_final (md); + + p = ksba_cert_get_sig_val (cert); + n = gcry_sexp_canon_len (p, 0, NULL, NULL); + if (!n) + { + log_error ("libksba did not return a proper S-Exp\n"); + gcry_md_close (md); + ksba_free (p); + return gpg_error (GPG_ERR_BUG); + } + if (DBG_CRYPTO) + { + int j; + log_debug ("signature value:"); + for (j=0; j < n; j++) + log_printf (" %02X", p[j]); + log_printf ("\n"); + } + + rc = gcry_sexp_sscan ( &s_sig, NULL, (char*)p, n); + ksba_free (p); + if (rc) + { + log_error ("gcry_sexp_scan failed: %s\n", gpg_strerror (rc)); + gcry_md_close (md); + return rc; + } + + p = ksba_cert_get_public_key (issuer_cert); + n = gcry_sexp_canon_len (p, 0, NULL, NULL); + if (!n) + { + log_error ("libksba did not return a proper S-Exp\n"); + gcry_md_close (md); + ksba_free (p); + gcry_sexp_release (s_sig); + return gpg_error (GPG_ERR_BUG); + } + rc = gcry_sexp_sscan ( &s_pkey, NULL, (char*)p, n); + ksba_free (p); + if (rc) + { + log_error ("gcry_sexp_scan failed: %s\n", gpg_strerror (rc)); + gcry_md_close (md); + gcry_sexp_release (s_sig); + return rc; + } + + rc = do_encode_md (md, algo, pk_algo_from_sexp (s_pkey), + gcry_pk_get_nbits (s_pkey), &frame); + if (rc) + { + gcry_md_close (md); + gcry_sexp_release (s_sig); + gcry_sexp_release (s_pkey); + return rc; + } + + /* put hash into the S-Exp s_hash */ + if ( gcry_sexp_build (&s_hash, NULL, "%m", frame) ) + BUG (); + gcry_mpi_release (frame); + + + rc = gcry_pk_verify (s_sig, s_hash, s_pkey); + if (DBG_X509) + log_debug ("gcry_pk_verify: %s\n", gpg_strerror (rc)); + gcry_md_close (md); + gcry_sexp_release (s_sig); + gcry_sexp_release (s_hash); + gcry_sexp_release (s_pkey); + return rc; +} + + + +int +gpgsm_check_cms_signature (ksba_cert_t cert, ksba_const_sexp_t sigval, + gcry_md_hd_t md, int algo) +{ + int rc; + ksba_sexp_t p; + gcry_mpi_t frame; + gcry_sexp_t s_sig, s_hash, s_pkey; + size_t n; + + n = gcry_sexp_canon_len (sigval, 0, NULL, NULL); + if (!n) + { + log_error ("libksba did not return a proper S-Exp\n"); + return gpg_error (GPG_ERR_BUG); + } + rc = gcry_sexp_sscan (&s_sig, NULL, (char*)sigval, n); + if (rc) + { + log_error ("gcry_sexp_scan failed: %s\n", gpg_strerror (rc)); + return rc; + } + + p = ksba_cert_get_public_key (cert); + n = gcry_sexp_canon_len (p, 0, NULL, NULL); + if (!n) + { + log_error ("libksba did not return a proper S-Exp\n"); + ksba_free (p); + gcry_sexp_release (s_sig); + return gpg_error (GPG_ERR_BUG); + } + if (DBG_CRYPTO) + log_printhex ("public key: ", p, n); + + rc = gcry_sexp_sscan ( &s_pkey, NULL, (char*)p, n); + ksba_free (p); + if (rc) + { + log_error ("gcry_sexp_scan failed: %s\n", gpg_strerror (rc)); + gcry_sexp_release (s_sig); + return rc; + } + + + rc = do_encode_md (md, algo, pk_algo_from_sexp (s_pkey), + gcry_pk_get_nbits (s_pkey), &frame); + if (rc) + { + gcry_sexp_release (s_sig); + gcry_sexp_release (s_pkey); + return rc; + } + /* put hash into the S-Exp s_hash */ + if ( gcry_sexp_build (&s_hash, NULL, "%m", frame) ) + BUG (); + gcry_mpi_release (frame); + + rc = gcry_pk_verify (s_sig, s_hash, s_pkey); + if (DBG_X509) + log_debug ("gcry_pk_verify: %s\n", gpg_strerror (rc)); + gcry_sexp_release (s_sig); + gcry_sexp_release (s_hash); + gcry_sexp_release (s_pkey); + return rc; +} + + + +int +gpgsm_create_cms_signature (ctrl_t ctrl, ksba_cert_t cert, + gcry_md_hd_t md, int mdalgo, + unsigned char **r_sigval) +{ + int rc; + char *grip, *desc; + size_t siglen; + + grip = gpgsm_get_keygrip_hexstring (cert); + if (!grip) + return gpg_error (GPG_ERR_BAD_CERT); + + desc = gpgsm_format_keydesc (cert); + + rc = gpgsm_agent_pksign (ctrl, grip, desc, gcry_md_read(md, mdalgo), + gcry_md_get_algo_dlen (mdalgo), mdalgo, + r_sigval, &siglen); + xfree (desc); + xfree (grip); + return rc; +} + + + diff --git a/sm/certdump.c b/sm/certdump.c new file mode 100644 index 000000000..2f7c1fd54 --- /dev/null +++ b/sm/certdump.c @@ -0,0 +1,802 @@ +/* certdump.c - Dump a certificate for debugging + * 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 <unistd.h> +#include <time.h> +#include <assert.h> +#ifdef HAVE_LOCALE_H +#include <locale.h> +#endif +#ifdef HAVE_LANGINFO_CODESET +#include <langinfo.h> +#endif + +#include "gpgsm.h" +#include <gcrypt.h> +#include <ksba.h> + +#include "keydb.h" +#include "i18n.h" + +struct dn_array_s { + char *key; + char *value; + int multivalued; + int done; +}; + + +/* print the first element of an S-Expression */ +void +gpgsm_print_serial (FILE *fp, ksba_const_sexp_t sn) +{ + const char *p = (const char *)sn; + unsigned long n; + char *endp; + + if (!p) + fputs (_("none"), fp); + else if (*p != '(') + fputs ("[Internal error - not an S-expression]", fp); + else + { + p++; + n = strtoul (p, &endp, 10); + p = endp; + if (*p!=':') + fputs ("[Internal Error - invalid S-expression]", fp); + else + { + for (p++; n; n--, p++) + fprintf (fp, "%02X", *(const unsigned char*)p); + } + } +} + + +/* Dump the serial number or any other simple S-expression. */ +void +gpgsm_dump_serial (ksba_const_sexp_t sn) +{ + const char *p = (const char *)sn; + unsigned long n; + char *endp; + + if (!p) + log_printf ("none"); + else if (*p != '(') + log_printf ("ERROR - not an S-expression"); + else + { + p++; + n = strtoul (p, &endp, 10); + p = endp; + if (*p!=':') + log_printf ("ERROR - invalid S-expression"); + else + { + for (p++; n; n--, p++) + log_printf ("%02X", *(const unsigned char *)p); + } + } +} + + +char * +gpgsm_format_serial (ksba_const_sexp_t sn) +{ + const char *p = (const char *)sn; + unsigned long n; + char *endp; + char *buffer; + int i; + + if (!p) + return NULL; + + if (*p != '(') + BUG (); /* Not a valid S-expression. */ + + p++; + n = strtoul (p, &endp, 10); + p = endp; + if (*p!=':') + BUG (); /* Not a valid S-expression. */ + p++; + + buffer = xtrymalloc (n*2+1); + if (buffer) + { + for (i=0; n; n--, p++, i+=2) + sprintf (buffer+i, "%02X", *(unsigned char *)p); + buffer[i] = 0; + } + return buffer; +} + + + + +void +gpgsm_print_time (FILE *fp, ksba_isotime_t t) +{ + if (!t || !*t) + fputs (_("none"), fp); + else + fprintf (fp, "%.4s-%.2s-%.2s %.2s:%.2s:%s", t, t+4, t+6, t+9, t+11, t+13); +} + +void +gpgsm_dump_time (ksba_isotime_t t) +{ + if (!t || !*t) + log_printf (_("[none]")); + else + log_printf ("%.4s-%.2s-%.2s %.2s:%.2s:%s", + t, t+4, t+6, t+9, t+11, t+13); +} + + + + +void +gpgsm_dump_string (const char *string) +{ + + if (!string) + log_printf ("[error]"); + else + { + const unsigned char *s; + + for (s=(const unsigned char*)string; *s; s++) + { + if (*s < ' ' || (*s >= 0x7f && *s <= 0xa0)) + break; + } + if (!*s && *string != '[') + log_printf ("%s", string); + else + { + log_printf ( "[ "); + log_printhex (NULL, string, strlen (string)); + log_printf ( " ]"); + } + } +} + + +/* This simple dump function is mainly used for debugging purposes. */ +void +gpgsm_dump_cert (const char *text, ksba_cert_t cert) +{ + ksba_sexp_t sexp; + char *p; + char *dn; + ksba_isotime_t t; + + log_debug ("BEGIN Certificate `%s':\n", text? text:""); + if (cert) + { + sexp = ksba_cert_get_serial (cert); + log_debug (" serial: "); + gpgsm_dump_serial (sexp); + ksba_free (sexp); + log_printf ("\n"); + + ksba_cert_get_validity (cert, 0, t); + log_debug (" notBefore: "); + gpgsm_dump_time (t); + log_printf ("\n"); + ksba_cert_get_validity (cert, 1, t); + log_debug (" notAfter: "); + gpgsm_dump_time (t); + log_printf ("\n"); + + dn = ksba_cert_get_issuer (cert, 0); + log_debug (" issuer: "); + gpgsm_dump_string (dn); + ksba_free (dn); + log_printf ("\n"); + + dn = ksba_cert_get_subject (cert, 0); + log_debug (" subject: "); + gpgsm_dump_string (dn); + ksba_free (dn); + log_printf ("\n"); + + log_debug (" hash algo: %s\n", ksba_cert_get_digest_algo (cert)); + + p = gpgsm_get_fingerprint_string (cert, 0); + log_debug (" SHA1 Fingerprint: %s\n", p); + xfree (p); + } + log_debug ("END Certificate\n"); +} + + +/* Log the certificate's name in "#SN/ISSUERDN" format along with + TEXT. */ +void +gpgsm_cert_log_name (const char *text, ksba_cert_t cert) +{ + log_info ("%s", text? text:"certificate" ); + if (cert) + { + ksba_sexp_t sn; + char *p; + + p = ksba_cert_get_issuer (cert, 0); + sn = ksba_cert_get_serial (cert); + if (p && sn) + { + log_printf (" #"); + gpgsm_dump_serial (sn); + log_printf ("/"); + gpgsm_dump_string (p); + } + else + log_printf (" [invalid]"); + ksba_free (sn); + xfree (p); + } + log_printf ("\n"); +} + + + + +/* helper for the rfc2253 string parser */ +static const unsigned char * +parse_dn_part (struct dn_array_s *array, const unsigned char *string) +{ + static struct { + const char *label; + const char *oid; + } label_map[] = { + /* Warning: When adding new labels, make sure that the buffer + below we be allocated large enough. */ + {"EMail", "1.2.840.113549.1.9.1" }, + {"T", "2.5.4.12" }, + {"GN", "2.5.4.42" }, + {"SN", "2.5.4.4" }, + {"NameDistinguisher", "0.2.262.1.10.7.20"}, + {"ADDR", "2.5.4.16" }, + {"BC", "2.5.4.15" }, + {"D", "2.5.4.13" }, + {"PostalCode", "2.5.4.17" }, + {"Pseudo", "2.5.4.65" }, + {"SerialNumber", "2.5.4.5" }, + {NULL, NULL} + }; + const unsigned char *s, *s1; + size_t n; + char *p; + int i; + + /* Parse attributeType */ + for (s = string+1; *s && *s != '='; s++) + ; + if (!*s) + return NULL; /* error */ + n = s - string; + if (!n) + return NULL; /* empty key */ + + /* We need to allocate a few bytes more due to the possible mapping + from the shorter OID to the longer label. */ + array->key = p = xtrymalloc (n+10); + if (!array->key) + return NULL; + memcpy (p, string, n); + p[n] = 0; + trim_trailing_spaces (p); + + if (digitp (p)) + { + for (i=0; label_map[i].label; i++ ) + if ( !strcmp (p, label_map[i].oid) ) + { + strcpy (p, label_map[i].label); + break; + } + } + string = s + 1; + + if (*string == '#') + { /* hexstring */ + string++; + for (s=string; hexdigitp (s); s++) + s++; + n = s - string; + if (!n || (n & 1)) + return NULL; /* Empty or odd number of digits. */ + n /= 2; + array->value = p = xtrymalloc (n+1); + if (!p) + return NULL; + for (s1=string; n; s1 += 2, n--, p++) + { + *(unsigned char *)p = xtoi_2 (s1); + if (!*p) + *p = 0x01; /* Better print a wrong value than truncating + the string. */ + } + *p = 0; + } + else + { /* regular v3 quoted string */ + for (n=0, s=string; *s; s++) + { + if (*s == '\\') + { /* pair */ + s++; + if (*s == ',' || *s == '=' || *s == '+' + || *s == '<' || *s == '>' || *s == '#' || *s == ';' + || *s == '\\' || *s == '\"' || *s == ' ') + n++; + else if (hexdigitp (s) && hexdigitp (s+1)) + { + s++; + n++; + } + else + return NULL; /* invalid escape sequence */ + } + else if (*s == '\"') + return NULL; /* invalid encoding */ + else if (*s == ',' || *s == '=' || *s == '+' + || *s == '<' || *s == '>' || *s == '#' || *s == ';' ) + break; + else + n++; + } + + array->value = p = xtrymalloc (n+1); + if (!p) + return NULL; + for (s=string; n; s++, n--) + { + if (*s == '\\') + { + s++; + if (hexdigitp (s)) + { + *(unsigned char *)p++ = xtoi_2 (s); + s++; + } + else + *p++ = *s; + } + else + *p++ = *s; + } + *p = 0; + } + return s; +} + + +/* Parse a DN and return an array-ized one. This is not a validating + parser and it does not support any old-stylish syntax; KSBA is + expected to return only rfc2253 compatible strings. */ +static struct dn_array_s * +parse_dn (const unsigned char *string) +{ + struct dn_array_s *array; + size_t arrayidx, arraysize; + int i; + + arraysize = 7; /* C,ST,L,O,OU,CN,email */ + arrayidx = 0; + array = xtrymalloc ((arraysize+1) * sizeof *array); + if (!array) + return NULL; + while (*string) + { + while (*string == ' ') + string++; + if (!*string) + break; /* ready */ + if (arrayidx >= arraysize) + { + struct dn_array_s *a2; + + arraysize += 5; + a2 = xtryrealloc (array, (arraysize+1) * sizeof *array); + if (!a2) + goto failure; + array = a2; + } + array[arrayidx].key = NULL; + array[arrayidx].value = NULL; + string = parse_dn_part (array+arrayidx, string); + if (!string) + goto failure; + while (*string == ' ') + string++; + array[arrayidx].multivalued = (*string == '+'); + array[arrayidx].done = 0; + arrayidx++; + if (*string && *string != ',' && *string != ';' && *string != '+') + goto failure; /* invalid delimiter */ + if (*string) + string++; + } + array[arrayidx].key = NULL; + array[arrayidx].value = NULL; + return array; + + failure: + for (i=0; i < arrayidx; i++) + { + xfree (array[i].key); + xfree (array[i].value); + } + xfree (array); + return NULL; +} + + +static void +print_dn_part (FILE *fp, struct dn_array_s *dn, const char *key, int translate) +{ + struct dn_array_s *first_dn = dn; + + for (; dn->key; dn++) + { + if (!dn->done && !strcmp (dn->key, key)) + { + /* Forward to the last multi-valued RDN, so that we can + print them all in reverse in the correct order. Note + that this overrides the the standard sequence but that + seems to a reasonable thing to do with multi-valued + RDNs. */ + while (dn->multivalued && dn[1].key) + dn++; + next: + if (!dn->done && dn->value && *dn->value) + { + fprintf (fp, "/%s=", dn->key); + if (translate) + print_sanitized_utf8_string (fp, dn->value, '/'); + else + print_sanitized_string (fp, dn->value, '/'); + } + dn->done = 1; + if (dn > first_dn && dn[-1].multivalued) + { + dn--; + goto next; + } + } + } +} + +/* Print all parts of a DN in a "standard" sequence. We first print + all the known parts, followed by the uncommon ones */ +static void +print_dn_parts (FILE *fp, struct dn_array_s *dn, int translate) +{ + const char *stdpart[] = { + "CN", "OU", "O", "STREET", "L", "ST", "C", "EMail", NULL + }; + int i; + + for (i=0; stdpart[i]; i++) + print_dn_part (fp, dn, stdpart[i], translate); + + /* Now print the rest without any specific ordering */ + for (; dn->key; dn++) + print_dn_part (fp, dn, dn->key, translate); +} + + +/* Print the S-Expression in BUF, which has a valid length of BUFLEN, + as a human readable string in one line to FP. */ +static void +pretty_print_sexp (FILE *fp, const unsigned char *buf, size_t buflen) +{ + size_t len; + gcry_sexp_t sexp; + char *result, *p; + + if ( gcry_sexp_sscan (&sexp, NULL, (const char*)buf, buflen) ) + { + fputs (_("[Error - invalid encoding]"), fp); + return; + } + len = gcry_sexp_sprint (sexp, GCRYSEXP_FMT_ADVANCED, NULL, 0); + assert (len); + result = xtrymalloc (len); + if (!result) + { + fputs (_("[Error - out of core]"), fp); + gcry_sexp_release (sexp); + return; + } + len = gcry_sexp_sprint (sexp, GCRYSEXP_FMT_ADVANCED, result, len); + assert (len); + for (p = result; len; len--, p++) + { + if (*p == '\n') + { + if (len > 1) /* Avoid printing the trailing LF. */ + fputs ("\\n", fp); + } + else if (*p == '\r') + fputs ("\\r", fp); + else if (*p == '\v') + fputs ("\\v", fp); + else if (*p == '\t') + fputs ("\\t", fp); + else + putc (*p, fp); + } + xfree (result); + gcry_sexp_release (sexp); +} + + +void +gpgsm_print_name2 (FILE *fp, const char *name, int translate) +{ + const unsigned char *s = (const unsigned char *)name; + int i; + + if (!s) + { + fputs (_("[Error - No name]"), fp); + } + else if (*s == '<') + { + const char *s2 = strchr ( (char*)s+1, '>'); + if (s2) + { + if (translate) + print_sanitized_utf8_buffer (fp, s + 1, s2 - (char*)s - 1, 0); + else + print_sanitized_buffer (fp, s + 1, s2 - (char*)s - 1, 0); + } + } + else if (*s == '(') + { + pretty_print_sexp (fp, s, gcry_sexp_canon_len (s, 0, NULL, NULL)); + } + else if (!((*s >= '0' && *s < '9') + || (*s >= 'A' && *s <= 'Z') + || (*s >= 'a' && *s <= 'z'))) + fputs (_("[Error - invalid encoding]"), fp); + else + { + struct dn_array_s *dn = parse_dn (s); + if (!dn) + fputs (_("[Error - invalid DN]"), fp); + else + { + print_dn_parts (fp, dn, translate); + for (i=0; dn[i].key; i++) + { + xfree (dn[i].key); + xfree (dn[i].value); + } + xfree (dn); + } + } +} + + +void +gpgsm_print_name (FILE *fp, const char *name) +{ + gpgsm_print_name2 (fp, name, 1); +} + + +/* A cookie structure used for the memory stream. */ +struct format_name_cookie +{ + char *buffer; /* Malloced buffer with the data to deliver. */ + size_t size; /* Allocated size of this buffer. */ + size_t len; /* strlen (buffer). */ + int error; /* system error code if any. */ +}; + +/* The writer function for the memory stream. */ +static int +format_name_writer (void *cookie, const char *buffer, size_t size) +{ + struct format_name_cookie *c = cookie; + char *p; + + if (c->buffer) + p = xtryrealloc (c->buffer, c->size + size + 1); + else + p = xtrymalloc (size + 1); + if (!p) + { + c->error = errno; + xfree (c->buffer); + errno = c->error; + return -1; + } + c->buffer = p; + memcpy (p + c->len, buffer, size); + c->len += size; + p[c->len] = 0; /* Terminate string. */ + + return size; +} + +/* Format NAME which is expected to be in rfc2253 format into a better + human readable format. Caller must free the returned string. NULL + is returned in case of an error. With TRANSLATE set to true the + name will be translated to the native encoding. Note that NAME is + internally always UTF-8 encoded. */ +char * +gpgsm_format_name2 (const char *name, int translate) +{ +#if defined (HAVE_FOPENCOOKIE) || defined (HAVE_FUNOPEN) + FILE *fp; + struct format_name_cookie cookie; + + memset (&cookie, 0, sizeof cookie); + +#ifdef HAVE_FOPENCOOKIE + { + cookie_io_functions_t io = { NULL }; + io.write = format_name_writer; + + fp = fopencookie (&cookie, "w", io); + } +#else /*!HAVE_FOPENCOOKIE*/ + { + fp = funopen (&cookie, NULL, format_name_writer, NULL, NULL); + } +#endif /*!HAVE_FOPENCOOKIE*/ + if (!fp) + { + int save_errno = errno; + log_error ("error creating memory stream: %s\n", strerror (errno)); + errno = save_errno; + return NULL; + } + gpgsm_print_name2 (fp, name, translate); + fclose (fp); + if (cookie.error || !cookie.buffer) + { + xfree (cookie.buffer); + errno = cookie.error; + return NULL; + } + return cookie.buffer; +#else /* No fun - use the name verbatim. */ + return xtrystrdup (name); +#endif /* No fun. */ +} + +char * +gpgsm_format_name (const char *name) +{ + return gpgsm_format_name2 (name, 1); +} + + +/* Create a key description for the CERT, this may be passed to the + pinentry. The caller must free the returned string. NULL may be + returned on error. */ +char * +gpgsm_format_keydesc (ksba_cert_t cert) +{ + int rc; + char *name, *subject, *buffer, *p; + const char *s; + ksba_isotime_t t; + char created[20]; + char *sn; + ksba_sexp_t sexp; + char *orig_codeset = NULL; + + name = ksba_cert_get_subject (cert, 0); + subject = name? gpgsm_format_name2 (name, 0) : NULL; + ksba_free (name); name = NULL; + + sexp = ksba_cert_get_serial (cert); + sn = sexp? gpgsm_format_serial (sexp) : NULL; + ksba_free (sexp); + + ksba_cert_get_validity (cert, 0, t); + if (t && *t) + sprintf (created, "%.4s-%.2s-%.2s", t, t+4, t+6); + else + *created = 0; + + +#ifdef ENABLE_NLS + /* The Assuan agent protocol requires us to transmit utf-8 strings */ + orig_codeset = bind_textdomain_codeset (PACKAGE_GT, 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. + Note that bind_textdomain_codeset does only return on memory + errors but not if a codeset is not available. Thus we don't + bother printing a diagnostic here. */ + orig_codeset = xstrdup (orig_codeset); + if (!bind_textdomain_codeset (PACKAGE_GT, "utf-8")) + orig_codeset = NULL; + } +#endif + + + rc = asprintf (&name, + _("Please enter the passphrase to unlock the" + " secret key for:\n" + "\"%s\"\n" + "S/N %s, ID %08lX, created %s" ), + subject? subject:"?", + sn? sn: "?", + gpgsm_get_short_fingerprint (cert), + created); + +#ifdef ENABLE_NLS + if (orig_codeset) + bind_textdomain_codeset (PACKAGE_GT, orig_codeset); +#endif + xfree (orig_codeset); + + if (rc < 0) + { + int save_errno = errno; + xfree (subject); + xfree (sn); + errno = save_errno; + return NULL; + } + + xfree (subject); + xfree (sn); + + buffer = p = xtrymalloc (strlen (name) * 3 + 1); + for (s=name; *s; s++) + { + if (*s < ' ' || *s == '+') + { + sprintf (p, "%%%02X", *(unsigned char *)s); + p += 3; + } + else if (*s == ' ') + *p++ = '+'; + else + *p++ = *s; + } + *p = 0; + free (name); + + return buffer; +} diff --git a/sm/certlist.c b/sm/certlist.c new file mode 100644 index 000000000..cde2930ec --- /dev/null +++ b/sm/certlist.c @@ -0,0 +1,485 @@ +/* certlist.c - build list of certificates + * Copyright (C) 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 <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include <unistd.h> +#include <time.h> +#include <assert.h> + +#include "gpgsm.h" +#include <gcrypt.h> +#include <ksba.h> + +#include "keydb.h" +#include "i18n.h" + + +static const char oid_kp_serverAuth[] = "1.3.6.1.5.5.7.3.1"; +static const char oid_kp_clientAuth[] = "1.3.6.1.5.5.7.3.2"; +static const char oid_kp_codeSigning[] = "1.3.6.1.5.5.7.3.3"; +static const char oid_kp_emailProtection[]= "1.3.6.1.5.5.7.3.4"; +static const char oid_kp_timeStamping[] = "1.3.6.1.5.5.7.3.8"; +static const char oid_kp_ocspSigning[] = "1.3.6.1.5.5.7.3.9"; + +/* Return 0 if the cert is usable for encryption. A MODE of 0 checks + for signing a MODE of 1 checks for encryption, a MODE of 2 checks + for verification and a MODE of 3 for decryption (just for + debugging). MODE 4 is for certificate signing, MODE for COSP + response signing. */ +static int +cert_usage_p (ksba_cert_t cert, int mode) +{ + gpg_error_t err; + unsigned int use; + char *extkeyusages; + int have_ocsp_signing = 0; + + err = ksba_cert_get_ext_key_usages (cert, &extkeyusages); + if (gpg_err_code (err) == GPG_ERR_NO_DATA) + err = 0; /* no policy given */ + if (!err) + { + unsigned int extusemask = ~0; /* Allow all. */ + + if (extkeyusages) + { + char *p, *pend; + int any_critical = 0; + + extusemask = 0; + + p = extkeyusages; + while (p && (pend=strchr (p, ':'))) + { + *pend++ = 0; + /* Only care about critical flagged usages. */ + if ( *pend == 'C' ) + { + any_critical = 1; + if ( !strcmp (p, oid_kp_serverAuth)) + extusemask |= (KSBA_KEYUSAGE_DIGITAL_SIGNATURE + | KSBA_KEYUSAGE_KEY_ENCIPHERMENT + | KSBA_KEYUSAGE_KEY_AGREEMENT); + else if ( !strcmp (p, oid_kp_clientAuth)) + extusemask |= (KSBA_KEYUSAGE_DIGITAL_SIGNATURE + | KSBA_KEYUSAGE_KEY_AGREEMENT); + else if ( !strcmp (p, oid_kp_codeSigning)) + extusemask |= (KSBA_KEYUSAGE_DIGITAL_SIGNATURE); + else if ( !strcmp (p, oid_kp_emailProtection)) + extusemask |= (KSBA_KEYUSAGE_DIGITAL_SIGNATURE + | KSBA_KEYUSAGE_NON_REPUDIATION + | KSBA_KEYUSAGE_KEY_ENCIPHERMENT + | KSBA_KEYUSAGE_KEY_AGREEMENT); + else if ( !strcmp (p, oid_kp_timeStamping)) + extusemask |= (KSBA_KEYUSAGE_DIGITAL_SIGNATURE + | KSBA_KEYUSAGE_NON_REPUDIATION); + } + + /* This is a hack to cope with OCSP. Note that we do + not yet fully comply with the requirements and that + the entire CRL/OCSP checking thing should undergo a + thorough review and probably redesign. */ + if ( !strcmp (p, oid_kp_ocspSigning)) + have_ocsp_signing = 1; + + if ((p = strchr (pend, '\n'))) + p++; + } + xfree (extkeyusages); + extkeyusages = NULL; + + if (!any_critical) + extusemask = ~0; /* Reset to the don't care mask. */ + } + + + err = ksba_cert_get_key_usage (cert, &use); + if (gpg_err_code (err) == GPG_ERR_NO_DATA) + { + err = 0; + if (opt.verbose && mode < 2) + log_info (_("no key usage specified - assuming all usages\n")); + use = ~0; + } + + /* Apply extKeyUsage. */ + use &= extusemask; + + } + if (err) + { + log_error (_("error getting key usage information: %s\n"), + gpg_strerror (err)); + xfree (extkeyusages); + return err; + } + + if (mode == 4) + { + if ((use & (KSBA_KEYUSAGE_KEY_CERT_SIGN))) + return 0; + log_info (_("certificate should have not " + "been used for certification\n")); + return gpg_error (GPG_ERR_WRONG_KEY_USAGE); + } + + if (mode == 5) + { + if (use != ~0 + && (have_ocsp_signing + || (use & (KSBA_KEYUSAGE_KEY_CERT_SIGN + |KSBA_KEYUSAGE_CRL_SIGN)))) + return 0; + log_info (_("certificate should have not " + "been used for OCSP response signing\n")); + return gpg_error (GPG_ERR_WRONG_KEY_USAGE); + } + + if ((use & ((mode&1)? + (KSBA_KEYUSAGE_KEY_ENCIPHERMENT|KSBA_KEYUSAGE_DATA_ENCIPHERMENT): + (KSBA_KEYUSAGE_DIGITAL_SIGNATURE|KSBA_KEYUSAGE_NON_REPUDIATION))) + ) + return 0; + + log_info (mode==3? _("certificate should have not been used for encryption\n"): + mode==2? _("certificate should have not been used for signing\n"): + mode==1? _("certificate is not usable for encryption\n"): + _("certificate is not usable for signing\n")); + return gpg_error (GPG_ERR_WRONG_KEY_USAGE); +} + + +/* Return 0 if the cert is usable for signing */ +int +gpgsm_cert_use_sign_p (ksba_cert_t cert) +{ + return cert_usage_p (cert, 0); +} + + +/* Return 0 if the cert is usable for encryption */ +int +gpgsm_cert_use_encrypt_p (ksba_cert_t cert) +{ + return cert_usage_p (cert, 1); +} + +int +gpgsm_cert_use_verify_p (ksba_cert_t cert) +{ + return cert_usage_p (cert, 2); +} + +int +gpgsm_cert_use_decrypt_p (ksba_cert_t cert) +{ + return cert_usage_p (cert, 3); +} + +int +gpgsm_cert_use_cert_p (ksba_cert_t cert) +{ + return cert_usage_p (cert, 4); +} + +int +gpgsm_cert_use_ocsp_p (ksba_cert_t cert) +{ + return cert_usage_p (cert, 5); +} + + +static int +same_subject_issuer (const char *subject, const char *issuer, ksba_cert_t cert) +{ + char *subject2 = ksba_cert_get_subject (cert, 0); + char *issuer2 = ksba_cert_get_subject (cert, 0); + int tmp; + + tmp = (subject && subject2 + && !strcmp (subject, subject2) + && issuer && issuer2 + && !strcmp (issuer, issuer2)); + xfree (subject2); + xfree (issuer2); + return tmp; +} + +/* Return true if CERT is already contained in CERTLIST. */ +static int +is_cert_in_certlist (ksba_cert_t cert, certlist_t certlist) +{ + const unsigned char *img_a, *img_b; + size_t len_a, len_b; + + img_a = ksba_cert_get_image (cert, &len_a); + if (img_a) + { + for ( ; certlist; certlist = certlist->next) + { + img_b = ksba_cert_get_image (certlist->cert, &len_b); + if (img_b && len_a == len_b && !memcmp (img_a, img_b, len_a)) + return 1; /* Already contained. */ + } + } + return 0; +} + + +/* Add CERT to the list of certificates at CERTADDR but avoid + duplicates. */ +int +gpgsm_add_cert_to_certlist (ctrl_t ctrl, ksba_cert_t cert, + certlist_t *listaddr, int is_encrypt_to) +{ + if (!is_cert_in_certlist (cert, *listaddr)) + { + certlist_t cl = xtrycalloc (1, sizeof *cl); + if (!cl) + return OUT_OF_CORE (errno); + cl->cert = cert; + ksba_cert_ref (cert); + cl->next = *listaddr; + cl->is_encrypt_to = is_encrypt_to; + *listaddr = cl; + } + return 0; +} + +/* Add a certificate to a list of certificate and make sure that it is + a valid certificate. With SECRET set to true a secret key must be + available for the certificate. IS_ENCRYPT_TO sets the corresponding + flag in the new create LISTADDR item. */ +int +gpgsm_add_to_certlist (ctrl_t ctrl, const char *name, int secret, + CERTLIST *listaddr, int is_encrypt_to) +{ + int rc; + KEYDB_SEARCH_DESC desc; + KEYDB_HANDLE kh = NULL; + ksba_cert_t cert = NULL; + + rc = keydb_classify_name (name, &desc); + if (!rc) + { + kh = keydb_new (0); + if (!kh) + rc = gpg_error (GPG_ERR_ENOMEM); + else + { + int wrong_usage = 0; + char *subject = NULL; + char *issuer = NULL; + + get_next: + rc = keydb_search (kh, &desc, 1); + if (!rc) + rc = keydb_get_cert (kh, &cert); + if (!rc) + { + rc = secret? gpgsm_cert_use_sign_p (cert) + : gpgsm_cert_use_encrypt_p (cert); + if (gpg_err_code (rc) == GPG_ERR_WRONG_KEY_USAGE) + { + /* There might be another certificate with the + correct usage, so we try again */ + if (!wrong_usage) + { /* save the first match */ + wrong_usage = rc; + subject = ksba_cert_get_subject (cert, 0); + issuer = ksba_cert_get_subject (cert, 0); + ksba_cert_release (cert); + cert = NULL; + goto get_next; + } + else if (same_subject_issuer (subject, issuer, cert)) + { + wrong_usage = rc; + ksba_cert_release (cert); + cert = NULL; + goto get_next; + } + else + wrong_usage = rc; + + } + } + /* We want the error code from the first match in this case. */ + if (rc && wrong_usage) + rc = wrong_usage; + + if (!rc) + { + next_ambigious: + rc = keydb_search (kh, &desc, 1); + if (rc == -1) + rc = 0; + else if (!rc) + { + ksba_cert_t cert2 = NULL; + + /* We have to ignore ambigious names as long as + there only fault is a bad key usage */ + if (!keydb_get_cert (kh, &cert2)) + { + int tmp = (same_subject_issuer (subject, issuer, cert2) + && ((gpg_err_code ( + secret? gpgsm_cert_use_sign_p (cert2) + : gpgsm_cert_use_encrypt_p (cert2) + ) + ) == GPG_ERR_WRONG_KEY_USAGE)); + ksba_cert_release (cert2); + if (tmp) + goto next_ambigious; + } + rc = gpg_error (GPG_ERR_AMBIGUOUS_NAME); + } + } + xfree (subject); + xfree (issuer); + + if (!rc && !is_cert_in_certlist (cert, *listaddr)) + { + if (!rc && secret) + { + char *p; + + rc = gpg_error (GPG_ERR_NO_SECKEY); + p = gpgsm_get_keygrip_hexstring (cert); + if (p) + { + if (!gpgsm_agent_havekey (ctrl, p)) + rc = 0; + xfree (p); + } + } + if (!rc) + rc = gpgsm_validate_chain (ctrl, cert, NULL, 0, NULL, 0); + if (!rc) + { + CERTLIST cl = xtrycalloc (1, sizeof *cl); + if (!cl) + rc = OUT_OF_CORE (errno); + else + { + cl->cert = cert; cert = NULL; + cl->next = *listaddr; + cl->is_encrypt_to = is_encrypt_to; + *listaddr = cl; + } + } + } + } + } + + keydb_release (kh); + ksba_cert_release (cert); + return rc == -1? gpg_error (GPG_ERR_NO_PUBKEY): rc; +} + +void +gpgsm_release_certlist (CERTLIST list) +{ + while (list) + { + CERTLIST cl = list->next; + ksba_cert_release (list->cert); + xfree (list); + list = cl; + } +} + + +/* Like gpgsm_add_to_certlist, but look only for one certificate. No + chain validation is done. If KEYID is not NULL it is take as an + additional filter value which must match the + subjectKeyIdentifier. */ +int +gpgsm_find_cert (const char *name, ksba_sexp_t keyid, ksba_cert_t *r_cert) +{ + int rc; + KEYDB_SEARCH_DESC desc; + KEYDB_HANDLE kh = NULL; + + *r_cert = NULL; + rc = keydb_classify_name (name, &desc); + if (!rc) + { + kh = keydb_new (0); + if (!kh) + rc = gpg_error (GPG_ERR_ENOMEM); + else + { + nextone: + rc = keydb_search (kh, &desc, 1); + if (!rc) + { + rc = keydb_get_cert (kh, r_cert); + if (!rc && keyid) + { + ksba_sexp_t subj; + + rc = ksba_cert_get_subj_key_id (*r_cert, NULL, &subj); + if (!rc) + { + if (cmp_simple_canon_sexp (keyid, subj)) + { + xfree (subj); + goto nextone; + } + xfree (subj); + /* Okay: Here we know that the certificate's + subjectKeyIdentifier matches the requested + one. */ + } + else if (gpg_err_code (rc) == GPG_ERR_NO_DATA) + goto nextone; + } + } + + /* If we don't have the KEYID filter we need to check for + ambigious search results. Note, that it is somehwat + reasonable to assume that a specification of a KEYID + won't lead to ambiguous names. */ + if (!rc && !keyid) + { + rc = keydb_search (kh, &desc, 1); + if (rc == -1) + rc = 0; + else + { + if (!rc) + rc = gpg_error (GPG_ERR_AMBIGUOUS_NAME); + ksba_cert_release (*r_cert); + *r_cert = NULL; + } + } + } + } + + keydb_release (kh); + return rc == -1? gpg_error (GPG_ERR_NO_PUBKEY): rc; +} + diff --git a/sm/certreqgen.c b/sm/certreqgen.c new file mode 100644 index 000000000..205ca0e40 --- /dev/null +++ b/sm/certreqgen.c @@ -0,0 +1,845 @@ +/* certreqgen.c - Generate a key and a certification request + * Copyright (C) 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. + */ + +/* +The format of the native parameter file is 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 is 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 + controlstatement "%commit" + o Control statements: + %echo <text> + Print <text>. + %dry-run + Suppress actual key generation (useful for syntax checking). + %commit + Perform the key generation. Note that an implicit commit is done + at the next "Key-Type" parameter. + %certfile <filename> + Do not write the certificate to the keyDB 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> + 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. For now the only supported + algorithm is "rsa". + Key-Length: <length-in-bits> + Length of the key in bits. Default is 1024. + Key-Grip: hexstring + This is optional and used to generate a request for an already + existsing key. Key-Length will be ignored when given, + Key-Usage: <usage-list> + Space or comma delimited list of key usage, allowed values are + "encrypt" and "sign". This is used to generate the KeyUsage extension. + Please make sure that the algorithm is capable of this usage. Default + is to allow encrypt and sign. + Name-DN: subject name + This is the DN name of the subject in rfc2253 format. + Name-Email: <string> + The is an email address for the altSubjectName + Name-DNS: <string> + The is an DNS name for the altSubjectName + Name-URI: <string> + The is an URI for the altSubjectName + +Here is an example: +$ cat >foo <<EOF +%echo Generating a standard key +Key-Type: RSA +Key-Length: 1024 +Name-DN: CN=test cert 1,OU=Aegypten Project,O=g10 Code GmbH,L=Düsseldorf,C=DE +Name-Email: joe@foo.bar +# Do a commit here, so that we can later print "done" :-) +%commit +%echo done +EOF +*/ + + +#include <config.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include <unistd.h> +#include <time.h> +#include <assert.h> + +#include "gpgsm.h" +#include <gcrypt.h> +#include <ksba.h> + +#include "keydb.h" +#include "i18n.h" + + +enum para_name { + pKEYTYPE, + pKEYLENGTH, + pKEYGRIP, + pKEYUSAGE, + pNAMEDN, + pNAMEEMAIL, + pNAMEDNS, + pNAMEURI +}; + +struct para_data_s { + struct para_data_s *next; + int lnr; + enum para_name key; + union { + unsigned int usage; + char value[1]; + } u; +}; + +struct reqgen_ctrl_s { + int lnr; + int dryrun; + ksba_writer_t writer; +}; + + +static const char oidstr_keyUsage[] = "2.5.29.15"; + + +static int proc_parameters (ctrl_t ctrl, + struct para_data_s *para, + struct reqgen_ctrl_s *outctrl); +static int create_request (ctrl_t ctrl, + struct para_data_s *para, + ksba_const_sexp_t public, + struct reqgen_ctrl_s *outctrl); + + + +static void +release_parameter_list (struct para_data_s *r) +{ + struct para_data_s *r2; + + for (; r ; r = r2) + { + r2 = r->next; + xfree(r); + } +} + +static struct para_data_s * +get_parameter (struct para_data_s *para, enum para_name key, int seq) +{ + struct para_data_s *r; + + for (r = para; r ; r = r->next) + if ( r->key == key && !seq--) + return r; + return NULL; +} + +static const char * +get_parameter_value (struct para_data_s *para, enum para_name key, int seq) +{ + struct para_data_s *r = get_parameter (para, key, seq); + return (r && *r->u.value)? r->u.value : NULL; +} + +static int +get_parameter_algo (struct para_data_s *para, enum para_name key) +{ + struct para_data_s *r = get_parameter (para, key, 0); + if (!r) + return -1; + if (digitp (r->u.value)) + return atoi( r->u.value ); + return gcry_pk_map_name (r->u.value); +} + +/* Parse the usage parameter. Returns 0 on success. Note that we + only care about sign and encrypt and don't (yet) allow all the + other X.509 usage to be specified; instead we will use a fixed + mapping to the X.509 usage flags. */ +static int +parse_parameter_usage (struct para_data_s *para, enum para_name key) +{ + struct para_data_s *r = get_parameter (para, key, 0); + 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 |= GCRY_PK_USAGE_SIGN; + else if ( !ascii_strcasecmp (p, "encrypt") ) + use |= GCRY_PK_USAGE_ENCR; + else + { + log_error ("line %d: invalid usage list\n", r->lnr); + return -1; /* error */ + } + } + r->u.usage = use; + return 0; +} + + +static unsigned int +get_parameter_uint (struct para_data_s *para, enum para_name key) +{ + struct para_data_s *r = get_parameter (para, key, 0); + + if (!r) + return 0; + + if (r->key == pKEYUSAGE) + return r->u.usage; + + return (unsigned int)strtoul (r->u.value, NULL, 10); +} + + + +/* Read the certificate generation parameters from FP and generate + (all) certificate requests. */ +static int +read_parameters (ctrl_t ctrl, FILE *fp, ksba_writer_t writer) +{ + static struct { + const char *name; + enum para_name key; + int allow_dups; + } keywords[] = { + { "Key-Type", pKEYTYPE}, + { "Key-Length", pKEYLENGTH }, + { "Key-Grip", pKEYGRIP }, + { "Key-Usage", pKEYUSAGE }, + { "Name-DN", pNAMEDN }, + { "Name-Email", pNAMEEMAIL, 1 }, + { "Name-DNS", pNAMEDNS, 1 }, + { "Name-URI", pNAMEURI, 1 }, + { NULL, 0 } + }; + char line[1024], *p; + const char *err = NULL; + struct para_data_s *para, *r; + int i, rc = 0, any = 0; + struct reqgen_ctrl_s outctrl; + + memset (&outctrl, 0, sizeof (outctrl)); + outctrl.writer = writer; + + err = NULL; + para = NULL; + while (fgets (line, DIM(line)-1, fp) ) + { + char *keyword, *value; + + outctrl.lnr++; + if (*line && line[strlen(line)-1] != '\n') + { + err = "line too long"; + break; + } + for (p=line; spacep (p); p++) + ; + if (!*p || *p == '#') + continue; + + keyword = p; + if (*keyword == '%') + { + for (; *p && !spacep (p); p++) + ; + if (*p) + *p++ = 0; + for (; spacep (p); p++) + ; + value = p; + trim_trailing_spaces (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")) + { + rc = proc_parameters (ctrl, para, &outctrl); + if (rc) + goto leave; + any = 1; + release_parameter_list (para); + para = NULL; + } + 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 (; spacep (p); p++) + ; + if (!*p) + { + err = "missing argument"; + break; + } + value = p; + trim_trailing_spaces (value); + + for (i=0; (keywords[i].name + && ascii_strcasecmp (keywords[i].name, keyword)); i++) + ; + 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) + { + rc = proc_parameters (ctrl, para, &outctrl); + if (rc) + goto leave; + any = 1; + release_parameter_list (para); + para = NULL; + } + else if (!keywords[i].allow_dups) + { + for (r = para; r && r->key != keywords[i].key; r = r->next) + ; + if (r) + { + err = "duplicate keyword"; + break; + } + } + + r = xtrycalloc (1, sizeof *r + strlen( value )); + if (!r) + { + err = "out of core"; + break; + } + r->lnr = outctrl.lnr; + r->key = keywords[i].key; + strcpy (r->u.value, value); + r->next = para; + para = r; + } + + if (err) + { + log_error ("line %d: %s\n", outctrl.lnr, err); + rc = gpg_error (GPG_ERR_GENERAL); + } + else if (ferror(fp)) + { + log_error ("line %d: read error: %s\n", outctrl.lnr, strerror(errno) ); + rc = gpg_error (GPG_ERR_GENERAL); + } + else if (para) + { + rc = proc_parameters (ctrl, para, &outctrl); + if (rc) + goto leave; + any = 1; + } + + if (!rc && !any) + rc = gpg_error (GPG_ERR_NO_DATA); + + leave: + release_parameter_list (para); + return rc; +} + +/* check whether there are invalid characters in the email address S */ +static int +has_invalid_email_chars (const char *s) +{ + int at_seen=0; + static char valid_chars[] = "01234567890_-." + "abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + for (; *s; s++) + { + if (*s & 0x80) + return 1; + if (*s == '@') + at_seen++; + else if (!at_seen && !( !!strchr (valid_chars, *s) || *s == '+')) + return 1; + else if (at_seen && !strchr (valid_chars, *s)) + return 1; + } + return at_seen != 1; +} + + +/* Check that all required parameters are given and perform the action */ +static int +proc_parameters (ctrl_t ctrl, + struct para_data_s *para, struct reqgen_ctrl_s *outctrl) +{ + gpg_error_t err; + struct para_data_s *r; + const char *s; + int i; + unsigned int nbits; + char numbuf[20]; + unsigned char keyparms[100]; + int rc; + ksba_sexp_t public; + int seq; + size_t erroff, errlen; + + /* Check that we have all required parameters; */ + assert (get_parameter (para, pKEYTYPE, 0)); + + /* We can only use RSA for now. There is a with pkcs-10 on how to + use ElGamal because it is expected that a PK algorithm can always + be used for signing. */ + i = get_parameter_algo (para, pKEYTYPE); + if (i < 1 || i != GCRY_PK_RSA ) + { + r = get_parameter (para, pKEYTYPE, 0); + log_error (_("line %d: invalid algorithm\n"), r->lnr); + return gpg_error (GPG_ERR_INV_PARAMETER); + } + + /* check the keylength */ + if (!get_parameter (para, pKEYLENGTH, 0)) + nbits = 1024; + else + nbits = get_parameter_uint (para, pKEYLENGTH); + if (nbits < 1024 || nbits > 4096) + { + /* The BSI specs dated 2002-11-25 don't allow lengths below 1024. */ + r = get_parameter (para, pKEYLENGTH, 0); + log_error (_("line %d: invalid key length %u (valid are %d to %d)\n"), + r->lnr, nbits, 1024, 4096); + return gpg_error (GPG_ERR_INV_PARAMETER); + } + + /* check the usage */ + if (parse_parameter_usage (para, pKEYUSAGE)) + return gpg_error (GPG_ERR_INV_PARAMETER); + + /* Check that there is a subject name and that this DN fits our + requirements. */ + if (!(s=get_parameter_value (para, pNAMEDN, 0))) + { + r = get_parameter (para, pNAMEDN, 0); + log_error (_("line %d: no subject name given\n"), r->lnr); + return gpg_error (GPG_ERR_INV_PARAMETER); + } +#if HAVE_KSBA_DN_TESTSTR + err = ksba_dn_teststr (s, 0, &erroff, &errlen); + if (err) + { + r = get_parameter (para, pNAMEDN, 0); + if (gpg_err_code (err) == GPG_ERR_UNKNOWN_NAME) + log_error (_("line %d: invalid subject name label `%.*s'\n"), + r->lnr, (int)errlen, s+erroff); + else + log_error (_("line %d: invalid subject name `%s' at pos %d\n"), + r->lnr, s, erroff); + + return gpg_error (GPG_ERR_INV_PARAMETER); + } +#endif /*HAVE_KSBA_DN_TESTSTR*/ + + /* Check that the optional email address is okay. */ + for (seq=0; (s=get_parameter_value (para, pNAMEEMAIL, seq)); seq++) + { + if (has_invalid_email_chars (s) + || *s == '@' + || s[strlen(s)-1] == '@' + || s[strlen(s)-1] == '.' + || strstr(s, "..")) + { + r = get_parameter (para, pNAMEEMAIL, seq); + log_error (_("line %d: not a valid email address\n"), r->lnr); + return gpg_error (GPG_ERR_INV_PARAMETER); + } + } + + s = get_parameter_value (para, pKEYGRIP, 0); + if (s) /* Use existing key. */ + { + rc = gpgsm_agent_readkey (ctrl, s, &public); + if (rc) + { + r = get_parameter (para, pKEYTYPE, 0); + log_error (_("line %d: error getting key by keygrip `%s': %s\n"), + r->lnr, s, gpg_strerror (rc)); + return rc; + } + } + else /* Generate new key. */ + { + sprintf (numbuf, "%u", nbits); + snprintf ((char*)keyparms, DIM (keyparms)-1, + "(6:genkey(3:rsa(5:nbits%d:%s)))", + (int)strlen (numbuf), numbuf); + rc = gpgsm_agent_genkey (ctrl, keyparms, &public); + if (rc) + { + r = get_parameter (para, pKEYTYPE, 0); + log_error (_("line %d: key generation failed: %s\n"), + r->lnr, gpg_strerror (rc)); + return rc; + } + } + + rc = create_request (ctrl, para, public, outctrl); + xfree (public); + + return rc; +} + + +/* Parameters are checked, the key pair has been created. Now + generate the request and write it out */ +static int +create_request (ctrl_t ctrl, + struct para_data_s *para, ksba_const_sexp_t public, + struct reqgen_ctrl_s *outctrl) +{ + ksba_certreq_t cr; + gpg_error_t err; + gcry_md_hd_t md; + ksba_stop_reason_t stopreason; + int rc = 0; + const char *s; + unsigned int use; + int seq; + char *buf, *p; + size_t len; + char numbuf[30]; + + err = ksba_certreq_new (&cr); + if (err) + return err; + + rc = gcry_md_open (&md, GCRY_MD_SHA1, 0); + if (rc) + { + log_error ("md_open failed: %s\n", gpg_strerror (rc)); + goto leave; + } + if (DBG_HASHING) + gcry_md_start_debug (md, "cr.cri"); + + ksba_certreq_set_hash_function (cr, HASH_FNC, md); + ksba_certreq_set_writer (cr, outctrl->writer); + + err = ksba_certreq_add_subject (cr, get_parameter_value (para, pNAMEDN, 0)); + if (err) + { + log_error ("error setting the subject's name: %s\n", + gpg_strerror (err)); + rc = err; + goto leave; + } + + for (seq=0; (s = get_parameter_value (para, pNAMEEMAIL, seq)); seq++) + { + buf = xtrymalloc (strlen (s) + 3); + if (!buf) + { + rc = OUT_OF_CORE (errno); + goto leave; + } + *buf = '<'; + strcpy (buf+1, s); + strcat (buf+1, ">"); + err = ksba_certreq_add_subject (cr, buf); + xfree (buf); + if (err) + { + log_error ("error setting the subject's alternate name: %s\n", + gpg_strerror (err)); + rc = err; + goto leave; + } + } + + for (seq=0; (s = get_parameter_value (para, pNAMEDNS, seq)); seq++) + { + len = strlen (s); + assert (len); + snprintf (numbuf, DIM(numbuf), "%u:", (unsigned int)len); + buf = p = xtrymalloc (11 + strlen (numbuf) + len + 3); + if (!buf) + { + rc = OUT_OF_CORE (errno); + goto leave; + } + p = stpcpy (p, "(8:dns-name"); + p = stpcpy (p, numbuf); + p = stpcpy (p, s); + strcpy (p, ")"); + + err = ksba_certreq_add_subject (cr, buf); + xfree (buf); + if (err) + { + log_error ("error setting the subject's alternate name: %s\n", + gpg_strerror (err)); + rc = err; + goto leave; + } + } + + for (seq=0; (s = get_parameter_value (para, pNAMEURI, seq)); seq++) + { + len = strlen (s); + assert (len); + snprintf (numbuf, DIM(numbuf), "%u:", (unsigned int)len); + buf = p = xtrymalloc (6 + strlen (numbuf) + len + 3); + if (!buf) + { + rc = OUT_OF_CORE (errno); + goto leave; + } + p = stpcpy (p, "(3:uri"); + p = stpcpy (p, numbuf); + p = stpcpy (p, s); + strcpy (p, ")"); + + err = ksba_certreq_add_subject (cr, buf); + xfree (buf); + if (err) + { + log_error ("error setting the subject's alternate name: %s\n", + gpg_strerror (err)); + rc = err; + goto leave; + } + } + + + err = ksba_certreq_set_public_key (cr, public); + if (err) + { + log_error ("error setting the public key: %s\n", + gpg_strerror (err)); + rc = err; + goto leave; + } + + + use = get_parameter_uint (para, pKEYUSAGE); + if (use == GCRY_PK_USAGE_SIGN) + { + /* For signing only we encode the bits: + KSBA_KEYUSAGE_DIGITAL_SIGNATURE + KSBA_KEYUSAGE_NON_REPUDIATION */ + err = ksba_certreq_add_extension (cr, oidstr_keyUsage, 1, + "\x03\x02\x06\xC0", 4); + } + else if (use == GCRY_PK_USAGE_ENCR) + { + /* For encrypt only we encode the bits: + KSBA_KEYUSAGE_KEY_ENCIPHERMENT + KSBA_KEYUSAGE_DATA_ENCIPHERMENT */ + err = ksba_certreq_add_extension (cr, oidstr_keyUsage, 1, + "\x03\x02\x04\x30", 4); + } + else + err = 0; /* Both or none given: don't request one. */ + if (err) + { + log_error ("error setting the key usage: %s\n", + gpg_strerror (err)); + rc = err; + goto leave; + } + + + do + { + err = ksba_certreq_build (cr, &stopreason); + if (err) + { + log_error ("ksba_certreq_build failed: %s\n", gpg_strerror (err)); + rc = err; + goto leave; + } + if (stopreason == KSBA_SR_NEED_SIG) + { + gcry_sexp_t s_pkey; + size_t n; + unsigned char grip[20]; + char hexgrip[41]; + unsigned char *sigval; + size_t siglen; + + n = gcry_sexp_canon_len (public, 0, NULL, NULL); + if (!n) + { + log_error ("libksba did not return a proper S-Exp\n"); + err = gpg_error (GPG_ERR_BUG); + goto leave; + } + rc = gcry_sexp_sscan (&s_pkey, NULL, (const char*)public, n); + if (rc) + { + log_error ("gcry_sexp_scan failed: %s\n", gpg_strerror (rc)); + goto leave; + } + if ( !gcry_pk_get_keygrip (s_pkey, grip) ) + { + rc = gpg_error (GPG_ERR_GENERAL); + log_error ("can't figure out the keygrip\n"); + gcry_sexp_release (s_pkey); + goto leave; + } + gcry_sexp_release (s_pkey); + for (n=0; n < 20; n++) + sprintf (hexgrip+n*2, "%02X", grip[n]); + + rc = gpgsm_agent_pksign (ctrl, hexgrip, NULL, + gcry_md_read(md, GCRY_MD_SHA1), + gcry_md_get_algo_dlen (GCRY_MD_SHA1), + GCRY_MD_SHA1, + &sigval, &siglen); + if (rc) + { + log_error ("signing failed: %s\n", gpg_strerror (rc)); + goto leave; + } + + err = ksba_certreq_set_sig_val (cr, sigval); + xfree (sigval); + if (err) + { + log_error ("failed to store the sig_val: %s\n", + gpg_strerror (err)); + rc = err; + goto leave; + } + } + } + while (stopreason != KSBA_SR_READY); + + + leave: + gcry_md_close (md); + ksba_certreq_release (cr); + return rc; +} + + + +/* Create a new key by reading the parameters from in_fd. Multiple + keys may be created */ +int +gpgsm_genkey (ctrl_t ctrl, int in_fd, FILE *out_fp) +{ + int rc; + FILE *in_fp; + Base64Context b64writer = NULL; + ksba_writer_t writer; + + in_fp = fdopen (dup (in_fd), "rb"); + if (!in_fp) + { + gpg_error_t tmperr = gpg_error (gpg_err_code_from_errno (errno)); + log_error ("fdopen() failed: %s\n", strerror (errno)); + return tmperr; + } + + ctrl->pem_name = "CERTIFICATE REQUEST"; + rc = gpgsm_create_writer (&b64writer, ctrl, out_fp, &writer); + if (rc) + { + log_error ("can't create writer: %s\n", gpg_strerror (rc)); + goto leave; + } + + rc = read_parameters (ctrl, in_fp, writer); + if (rc) + { + log_error ("error creating certificate request: %s\n", + gpg_strerror (rc)); + goto leave; + } + + rc = gpgsm_finish_writer (b64writer); + if (rc) + { + log_error ("write failed: %s\n", gpg_strerror (rc)); + goto leave; + } + + gpgsm_status (ctrl, STATUS_KEY_CREATED, "P"); + log_info ("certificate request created\n"); + + leave: + gpgsm_destroy_writer (b64writer); + fclose (in_fp); + return rc; +} + diff --git a/sm/decrypt.c b/sm/decrypt.c new file mode 100644 index 000000000..70d48c983 --- /dev/null +++ b/sm/decrypt.c @@ -0,0 +1,513 @@ +/* decrypt.c - Decrypt a message + * 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 <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include <unistd.h> +#include <time.h> +#include <assert.h> + +#include "gpgsm.h" +#include <gcrypt.h> +#include <ksba.h> + +#include "keydb.h" +#include "i18n.h" + +struct decrypt_filter_parm_s { + int algo; + int mode; + int blklen; + gcry_cipher_hd_t hd; + char iv[16]; + size_t ivlen; + int any_data; /* dod we push anything through the filter at all? */ + unsigned char lastblock[16]; /* to strip the padding we have to + keep this one */ + char helpblock[16]; /* needed because there is no block buffering in + libgcrypt (yet) */ + int helpblocklen; +}; + + + +/* Decrypt the session key and fill in the parm structure. The + algo and the IV is expected to be already in PARM. */ +static int +prepare_decryption (ctrl_t ctrl, const char *hexkeygrip, const char *desc, + ksba_const_sexp_t enc_val, + struct decrypt_filter_parm_s *parm) +{ + char *seskey = NULL; + size_t n, seskeylen; + int rc; + + rc = gpgsm_agent_pkdecrypt (ctrl, hexkeygrip, desc, enc_val, + &seskey, &seskeylen); + if (rc) + { + log_error ("error decrypting session key: %s\n", gpg_strerror (rc)); + goto leave; + } + + if (DBG_CRYPTO) + log_printhex ("pkcs1 encoded session key:", seskey, seskeylen); + + n=0; + if (seskeylen == 24) + { + /* Smells like a 3-des key. This might happen because a SC has + already done the unpacking. */ + } + else + { + if (n + 7 > seskeylen ) + { + rc = gpg_error (GPG_ERR_INV_SESSION_KEY); + goto leave; + } + + /* FIXME: Actually the leading zero is required but due to the way + we encode the output in libgcrypt as an MPI we are not able to + encode that leading zero. However, when using a Smartcard we are + doing it the right way and therefore we have to skip the zero. This + should be fixed in gpg-agent of course. */ + if (!seskey[n]) + n++; + + if (seskey[n] != 2 ) /* Wrong block type version. */ + { + rc = gpg_error (GPG_ERR_INV_SESSION_KEY); + goto leave; + } + + for (n++; n < seskeylen && seskey[n]; n++) /* Skip the random bytes. */ + ; + n++; /* and the zero byte */ + if (n >= seskeylen ) + { + rc = gpg_error (GPG_ERR_INV_SESSION_KEY); + goto leave; + } + } + + if (DBG_CRYPTO) + log_printhex ("session key:", seskey+n, seskeylen-n); + + rc = gcry_cipher_open (&parm->hd, parm->algo, parm->mode, 0); + if (rc) + { + log_error ("error creating decryptor: %s\n", gpg_strerror (rc)); + goto leave; + } + + rc = gcry_cipher_setkey (parm->hd, seskey+n, seskeylen-n); + if (gpg_err_code (rc) == GPG_ERR_WEAK_KEY) + { + log_info (_("WARNING: message was encrypted with " + "a weak key in the symmetric cipher.\n")); + rc = 0; + } + if (rc) + { + log_error("key setup failed: %s\n", gpg_strerror(rc) ); + goto leave; + } + + gcry_cipher_setiv (parm->hd, parm->iv, parm->ivlen); + + leave: + xfree (seskey); + return rc; +} + + +/* This function is called by the KSBA writer just before the actual + write is done. The function must take INLEN bytes from INBUF, + decrypt it and store it inoutbuf which has a maximum size of + maxoutlen. The valid bytes in outbuf should be return in outlen. + Due to different buffer sizes or different length of input and + output, it may happen that fewer bytes are process or fewer bytes + are written. */ +static gpg_error_t +decrypt_filter (void *arg, + const void *inbuf, size_t inlen, size_t *inused, + void *outbuf, size_t maxoutlen, size_t *outlen) +{ + struct decrypt_filter_parm_s *parm = arg; + int blklen = parm->blklen; + size_t orig_inlen = inlen; + + /* fixme: Should we issue an error when we have not seen one full block? */ + if (!inlen) + return gpg_error (GPG_ERR_BUG); + + if (maxoutlen < 2*parm->blklen) + return gpg_error (GPG_ERR_BUG); + /* make some space becuase we will later need an extra block at the end */ + maxoutlen -= blklen; + + if (parm->helpblocklen) + { + int i, j; + + for (i=parm->helpblocklen,j=0; i < blklen && j < inlen; i++, j++) + parm->helpblock[i] = ((const char*)inbuf)[j]; + inlen -= j; + if (blklen > maxoutlen) + return gpg_error (GPG_ERR_BUG); + if (i < blklen) + { + parm->helpblocklen = i; + *outlen = 0; + } + else + { + parm->helpblocklen = 0; + if (parm->any_data) + { + memcpy (outbuf, parm->lastblock, blklen); + *outlen =blklen; + } + else + *outlen = 0; + gcry_cipher_decrypt (parm->hd, parm->lastblock, blklen, + parm->helpblock, blklen); + parm->any_data = 1; + } + *inused = orig_inlen - inlen; + return 0; + } + + + if (inlen > maxoutlen) + inlen = maxoutlen; + if (inlen % blklen) + { /* store the remainder away */ + parm->helpblocklen = inlen%blklen; + inlen = inlen/blklen*blklen; + memcpy (parm->helpblock, (const char*)inbuf+inlen, parm->helpblocklen); + } + + *inused = inlen + parm->helpblocklen; + if (inlen) + { + assert (inlen >= blklen); + if (parm->any_data) + { + gcry_cipher_decrypt (parm->hd, (char*)outbuf+blklen, inlen, + inbuf, inlen); + memcpy (outbuf, parm->lastblock, blklen); + memcpy (parm->lastblock,(char*)outbuf+inlen, blklen); + *outlen = inlen; + } + else + { + gcry_cipher_decrypt (parm->hd, outbuf, inlen, inbuf, inlen); + memcpy (parm->lastblock, (char*)outbuf+inlen-blklen, blklen); + *outlen = inlen - blklen; + parm->any_data = 1; + } + } + else + *outlen = 0; + return 0; +} + + + +/* Perform a decrypt operation. */ +int +gpgsm_decrypt (ctrl_t ctrl, int in_fd, FILE *out_fp) +{ + int rc; + Base64Context b64reader = NULL; + Base64Context b64writer = NULL; + ksba_reader_t reader; + ksba_writer_t writer; + ksba_cms_t cms = NULL; + ksba_stop_reason_t stopreason; + KEYDB_HANDLE kh; + int recp; + FILE *in_fp = NULL; + struct decrypt_filter_parm_s dfparm; + + memset (&dfparm, 0, sizeof dfparm); + + kh = keydb_new (0); + if (!kh) + { + log_error (_("failed to allocated keyDB handle\n")); + rc = gpg_error (GPG_ERR_GENERAL); + goto leave; + } + + + in_fp = fdopen ( dup (in_fd), "rb"); + if (!in_fp) + { + rc = gpg_error (gpg_err_code_from_errno (errno)); + log_error ("fdopen() failed: %s\n", strerror (errno)); + goto leave; + } + + rc = gpgsm_create_reader (&b64reader, ctrl, in_fp, 0, &reader); + if (rc) + { + log_error ("can't create reader: %s\n", gpg_strerror (rc)); + goto leave; + } + + rc = gpgsm_create_writer (&b64writer, ctrl, out_fp, &writer); + if (rc) + { + log_error ("can't create writer: %s\n", gpg_strerror (rc)); + goto leave; + } + + rc = ksba_cms_new (&cms); + if (rc) + goto leave; + + rc = ksba_cms_set_reader_writer (cms, reader, writer); + if (rc) + { + log_debug ("ksba_cms_set_reader_writer failed: %s\n", + gpg_strerror (rc)); + goto leave; + } + + /* parser loop */ + do + { + rc = ksba_cms_parse (cms, &stopreason); + if (rc) + { + log_debug ("ksba_cms_parse failed: %s\n", gpg_strerror (rc)); + goto leave; + } + + if (stopreason == KSBA_SR_BEGIN_DATA + || stopreason == KSBA_SR_DETACHED_DATA) + { + int algo, mode; + const char *algoid; + int any_key = 0; + + algoid = ksba_cms_get_content_oid (cms, 2/* encryption algo*/); + algo = gcry_cipher_map_name (algoid); + mode = gcry_cipher_mode_from_oid (algoid); + if (!algo || !mode) + { + rc = gpg_error (GPG_ERR_UNSUPPORTED_ALGORITHM); + log_error ("unsupported algorithm `%s'\n", algoid? algoid:"?"); + if (algoid && !strcmp (algoid, "1.2.840.113549.3.2")) + log_info (_("(this is the RC2 algorithm)\n")); + else if (!algoid) + log_info (_("(this does not seem to be an encrypted" + " message)\n")); + { + char numbuf[50]; + sprintf (numbuf, "%d", rc); + gpgsm_status2 (ctrl, STATUS_ERROR, "decrypt.algorithm", + numbuf, algoid?algoid:"?", NULL); + } + + /* If it seems that this is not an encrypted message we + return a more sensible error code. */ + if (!algoid) + rc = gpg_error (GPG_ERR_NO_DATA); + + goto leave; + } + dfparm.algo = algo; + dfparm.mode = mode; + dfparm.blklen = gcry_cipher_get_algo_blklen (algo); + if (dfparm.blklen > sizeof (dfparm.helpblock)) + return gpg_error (GPG_ERR_BUG); + + rc = ksba_cms_get_content_enc_iv (cms, + dfparm.iv, + sizeof (dfparm.iv), + &dfparm.ivlen); + if (rc) + { + log_error ("error getting IV: %s\n", gpg_strerror (rc)); + goto leave; + } + + for (recp=0; !any_key; recp++) + { + char *issuer; + ksba_sexp_t serial; + ksba_sexp_t enc_val; + char *hexkeygrip = NULL; + char *desc = NULL; + + rc = ksba_cms_get_issuer_serial (cms, recp, &issuer, &serial); + if (rc == -1 && recp) + break; /* no more recipients */ + if (rc) + log_error ("recp %d - error getting info: %s\n", + recp, gpg_strerror (rc)); + else + { + ksba_cert_t cert = NULL; + + log_debug ("recp %d - issuer: `%s'\n", + recp, issuer? issuer:"[NONE]"); + log_debug ("recp %d - serial: ", recp); + gpgsm_dump_serial (serial); + log_printf ("\n"); + + keydb_search_reset (kh); + rc = keydb_search_issuer_sn (kh, issuer, serial); + if (rc) + { + log_error ("failed to find the certificate: %s\n", + gpg_strerror(rc)); + goto oops; + } + + rc = keydb_get_cert (kh, &cert); + if (rc) + { + log_error ("failed to get cert: %s\n", gpg_strerror (rc)); + goto oops; + } + /* Just in case there is a problem with the own + certificate we print this message - should never + happen of course */ + rc = gpgsm_cert_use_decrypt_p (cert); + if (rc) + { + char numbuf[50]; + sprintf (numbuf, "%d", rc); + gpgsm_status2 (ctrl, STATUS_ERROR, "decrypt.keyusage", + numbuf, NULL); + rc = 0; + } + + hexkeygrip = gpgsm_get_keygrip_hexstring (cert); + desc = gpgsm_format_keydesc (cert); + + oops: + xfree (issuer); + xfree (serial); + ksba_cert_release (cert); + } + + if (!hexkeygrip) + ; + else if (!(enc_val = ksba_cms_get_enc_val (cms, recp))) + log_error ("recp %d - error getting encrypted session key\n", + recp); + else + { + rc = prepare_decryption (ctrl, + hexkeygrip, desc, enc_val, &dfparm); + xfree (enc_val); + if (rc) + { + log_info ("decrypting session key failed: %s\n", + gpg_strerror (rc)); + } + else + { /* setup the bulk decrypter */ + any_key = 1; + ksba_writer_set_filter (writer, + decrypt_filter, + &dfparm); + } + } + xfree (hexkeygrip); + xfree (desc); + } + if (!any_key) + { + rc = gpg_error (GPG_ERR_NO_SECKEY); + goto leave; + } + } + else if (stopreason == KSBA_SR_END_DATA) + { + ksba_writer_set_filter (writer, NULL, NULL); + if (dfparm.any_data) + { /* write the last block with padding removed */ + int i, npadding = dfparm.lastblock[dfparm.blklen-1]; + if (!npadding || npadding > dfparm.blklen) + { + log_error ("invalid padding with value %d\n", npadding); + rc = gpg_error (GPG_ERR_INV_DATA); + goto leave; + } + rc = ksba_writer_write (writer, + dfparm.lastblock, + dfparm.blklen - npadding); + if (rc) + goto leave; + + for (i=dfparm.blklen - npadding; i < dfparm.blklen; i++) + { + if (dfparm.lastblock[i] != npadding) + { + log_error ("inconsistent padding\n"); + rc = gpg_error (GPG_ERR_INV_DATA); + goto leave; + } + } + } + } + + } + while (stopreason != KSBA_SR_READY); + + rc = gpgsm_finish_writer (b64writer); + if (rc) + { + log_error ("write failed: %s\n", gpg_strerror (rc)); + goto leave; + } + gpgsm_status (ctrl, STATUS_DECRYPTION_OKAY, NULL); + + + leave: + if (rc) + { + gpgsm_status (ctrl, STATUS_DECRYPTION_FAILED, NULL); + log_error ("message decryption failed: %s <%s>\n", + gpg_strerror (rc), gpg_strsource (rc)); + } + ksba_cms_release (cms); + gpgsm_destroy_reader (b64reader); + gpgsm_destroy_writer (b64writer); + keydb_release (kh); + if (in_fp) + fclose (in_fp); + if (dfparm.hd) + gcry_cipher_close (dfparm.hd); + return rc; +} + + diff --git a/sm/delete.c b/sm/delete.c new file mode 100644 index 000000000..0d2f1fd9d --- /dev/null +++ b/sm/delete.c @@ -0,0 +1,173 @@ +/* delete.c + * 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. + */ + +#include <config.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include <unistd.h> +#include <time.h> +#include <assert.h> + +#include "gpgsm.h" +#include <gcrypt.h> +#include <ksba.h> + +#include "keydb.h" +#include "i18n.h" + + +/* Delete a certificate or an secret key from a key database. */ +static int +delete_one (CTRL ctrl, const char *username) +{ + int rc = 0; + KEYDB_SEARCH_DESC desc; + KEYDB_HANDLE kh = NULL; + ksba_cert_t cert = NULL; + int duplicates = 0; + + rc = keydb_classify_name (username, &desc); + if (rc) + { + log_error (_("certificate `%s' not found: %s\n"), + username, gpg_strerror (rc)); + gpgsm_status2 (ctrl, STATUS_DELETE_PROBLEM, "1", NULL); + goto leave; + } + + kh = keydb_new (0); + if (!kh) + { + log_error ("keydb_new failed\n"); + goto leave; + } + + + rc = keydb_search (kh, &desc, 1); + if (!rc) + rc = keydb_get_cert (kh, &cert); + if (!rc) + { + unsigned char fpr[20]; + + gpgsm_get_fingerprint (cert, 0, fpr, NULL); + + next_ambigious: + rc = keydb_search (kh, &desc, 1); + if (rc == -1) + rc = 0; + else if (!rc) + { + ksba_cert_t cert2 = NULL; + unsigned char fpr2[20]; + + /* We ignore all duplicated certificates which might have + been inserted due to program bugs. */ + if (!keydb_get_cert (kh, &cert2)) + { + gpgsm_get_fingerprint (cert2, 0, fpr2, NULL); + ksba_cert_release (cert2); + if (!memcmp (fpr, fpr2, 20)) + { + duplicates++; + goto next_ambigious; + } + } + rc = gpg_error (GPG_ERR_AMBIGUOUS_NAME); + } + } + if (rc) + { + if (rc == -1) + rc = gpg_error (GPG_ERR_NO_PUBKEY); + log_error (_("certificate `%s' not found: %s\n"), + username, gpg_strerror (rc)); + gpgsm_status2 (ctrl, STATUS_DELETE_PROBLEM, "3", NULL); + goto leave; + } + + /* We need to search again to get back to the right position. */ + rc = keydb_lock (kh); + if (rc) + { + log_error (_("error locking keybox: %s\n"), gpg_strerror (rc)); + goto leave; + } + + do + { + keydb_search_reset (kh); + rc = keydb_search (kh, &desc, 1); + if (rc) + { + log_error ("problem re-searching certificate: %s\n", + gpg_strerror (rc)); + goto leave; + } + + rc = keydb_delete (kh, duplicates ? 0 : 1); + if (rc) + goto leave; + if (opt.verbose) + { + if (duplicates) + log_info (_("duplicated certificate `%s' deleted\n"), username); + else + log_info (_("certificate `%s' deleted\n"), username); + } + } + while (duplicates--); + + leave: + keydb_release (kh); + ksba_cert_release (cert); + return rc; +} + + + +/* Delete the certificates specified by NAMES. */ +int +gpgsm_delete (CTRL ctrl, STRLIST names) +{ + int rc; + + if (!names) + { + log_error ("nothing to delete\n"); + return gpg_error (GPG_ERR_NO_DATA); + } + + for (; names; names=names->next ) + { + rc = delete_one (ctrl, names->d); + if (rc) + { + log_error (_("deleting certificate \"%s\" failed: %s\n"), + names->d, gpg_strerror (rc) ); + return rc; + } + } + + return 0; +} diff --git a/sm/encrypt.c b/sm/encrypt.c new file mode 100644 index 000000000..07c2ba8ce --- /dev/null +++ b/sm/encrypt.c @@ -0,0 +1,512 @@ +/* encrypt.c - Encrypt a message + * Copyright (C) 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 <unistd.h> +#include <time.h> +#include <assert.h> + +#include "gpgsm.h" +#include <gcrypt.h> +#include <ksba.h> + +#include "keydb.h" +#include "i18n.h" + + +struct dek_s { + const char *algoid; + int algo; + gcry_cipher_hd_t chd; + char key[32]; + int keylen; + char iv[32]; + int ivlen; +}; +typedef struct dek_s *DEK; + +struct encrypt_cb_parm_s { + FILE *fp; + DEK dek; + int eof_seen; + int ready; + int readerror; + int bufsize; + unsigned char *buffer; + int buflen; +}; + + + + + +/* Initialize the data encryption key (session key). */ +static int +init_dek (DEK dek) +{ + int rc=0, mode, i; + + dek->algo = gcry_cipher_map_name (dek->algoid); + mode = gcry_cipher_mode_from_oid (dek->algoid); + if (!dek->algo || !mode) + { + log_error ("unsupported algorithm `%s'\n", dek->algoid); + return gpg_error (GPG_ERR_UNSUPPORTED_ALGORITHM); + } + + /* Extra check for algorithms we considere to be to weak for + encryption, qlthough we suppor them fro decryption. Note that + there is another check below discriminating on the key length. */ + switch (dek->algo) + { + case GCRY_CIPHER_DES: + case GCRY_CIPHER_RFC2268_40: + log_error ("cipher algorithm `%s' not allowed: too weak\n", + gcry_cipher_algo_name (dek->algo)); + return gpg_error (GPG_ERR_UNSUPPORTED_ALGORITHM); + default: + break; + } + + dek->keylen = gcry_cipher_get_algo_keylen (dek->algo); + if (!dek->keylen || dek->keylen > sizeof (dek->key)) + return gpg_error (GPG_ERR_BUG); + + dek->ivlen = gcry_cipher_get_algo_blklen (dek->algo); + if (!dek->ivlen || dek->ivlen > sizeof (dek->iv)) + return gpg_error (GPG_ERR_BUG); + + /* Make sure we don't use weak keys. */ + if (dek->keylen < 100/8) + { + log_error ("key length of `%s' too small\n", dek->algoid); + return gpg_error (GPG_ERR_UNSUPPORTED_ALGORITHM); + } + + rc = gcry_cipher_open (&dek->chd, dek->algo, mode, GCRY_CIPHER_SECURE); + if (rc) + { + log_error ("failed to create cipher context: %s\n", gpg_strerror (rc)); + return rc; + } + + for (i=0; i < 8; i++) + { + gcry_randomize (dek->key, dek->keylen, GCRY_STRONG_RANDOM ); + rc = gcry_cipher_setkey (dek->chd, dek->key, dek->keylen); + if (gpg_err_code (rc) != GPG_ERR_WEAK_KEY) + break; + log_info(_("weak key created - retrying\n") ); + } + if (rc) + { + log_error ("failed to set the key: %s\n", gpg_strerror (rc)); + gcry_cipher_close (dek->chd); + dek->chd = NULL; + return rc; + } + + gcry_create_nonce (dek->iv, dek->ivlen); + rc = gcry_cipher_setiv (dek->chd, dek->iv, dek->ivlen); + if (rc) + { + log_error ("failed to set the IV: %s\n", gpg_strerror (rc)); + gcry_cipher_close (dek->chd); + dek->chd = NULL; + return rc; + } + + return 0; +} + + +static int +encode_session_key (DEK dek, gcry_sexp_t * r_data) +{ + gcry_sexp_t data; + char * p, tmp[3]; + int i; + int rc; + + p = xmalloc (64 + 2 * dek->keylen); + strcpy (p, "(data\n (flags pkcs1)\n (value #"); + for (i=0; i < dek->keylen; i++) + { + sprintf (tmp, "%02x", (unsigned char) dek->key[i]); + strcat (p, tmp); + } + strcat (p, "#))\n"); + rc = gcry_sexp_sscan (&data, NULL, p, strlen (p)); + xfree (p); + *r_data = data; + return rc; +} + + +/* Encrypt the DEK under the key contained in CERT and return it as a + canonical S-Exp in encval. */ +static int +encrypt_dek (const DEK dek, ksba_cert_t cert, unsigned char **encval) +{ + gcry_sexp_t s_ciph, s_data, s_pkey; + int rc; + ksba_sexp_t buf; + size_t len; + + *encval = NULL; + + /* get the key from the cert */ + buf = ksba_cert_get_public_key (cert); + if (!buf) + { + log_error ("no public key for recipient\n"); + return gpg_error (GPG_ERR_NO_PUBKEY); + } + len = gcry_sexp_canon_len (buf, 0, NULL, NULL); + if (!len) + { + log_error ("libksba did not return a proper S-Exp\n"); + return gpg_error (GPG_ERR_BUG); + } + rc = gcry_sexp_sscan (&s_pkey, NULL, (char*)buf, len); + xfree (buf); buf = NULL; + if (rc) + { + log_error ("gcry_sexp_scan failed: %s\n", gpg_strerror (rc)); + return rc; + } + + /* put the encoded cleartext into a simple list */ + rc = encode_session_key (dek, &s_data); + if (rc) + { + log_error ("encode_session_key failed: %s\n", gpg_strerror (rc)); + return rc; + } + + /* pass it to libgcrypt */ + rc = gcry_pk_encrypt (&s_ciph, s_data, s_pkey); + gcry_sexp_release (s_data); + gcry_sexp_release (s_pkey); + + /* reformat it */ + len = gcry_sexp_sprint (s_ciph, GCRYSEXP_FMT_CANON, NULL, 0); + assert (len); + buf = xtrymalloc (len); + if (!buf) + { + gpg_error_t tmperr = OUT_OF_CORE (errno); + gcry_sexp_release (s_ciph); + return tmperr; + } + len = gcry_sexp_sprint (s_ciph, GCRYSEXP_FMT_CANON, (char*)buf, len); + assert (len); + + *encval = buf; + return 0; +} + + + +/* do the actual encryption */ +static int +encrypt_cb (void *cb_value, char *buffer, size_t count, size_t *nread) +{ + struct encrypt_cb_parm_s *parm = cb_value; + int blklen = parm->dek->ivlen; + unsigned char *p; + size_t n; + + *nread = 0; + if (!buffer) + return -1; /* not supported */ + + if (parm->ready) + return -1; + + if (count < blklen) + BUG (); + + if (!parm->eof_seen) + { /* fillup the buffer */ + p = parm->buffer; + for (n=parm->buflen; n < parm->bufsize; n++) + { + int c = getc (parm->fp); + if (c == EOF) + { + if (ferror (parm->fp)) + { + parm->readerror = errno; + return -1; + } + parm->eof_seen = 1; + break; + } + p[n] = c; + } + parm->buflen = n; + } + + n = parm->buflen < count? parm->buflen : count; + n = n/blklen * blklen; + if (n) + { /* encrypt the stuff */ + gcry_cipher_encrypt (parm->dek->chd, buffer, n, parm->buffer, n); + *nread = n; + /* Who cares about cycles, take the easy way and shift the buffer */ + parm->buflen -= n; + memmove (parm->buffer, parm->buffer+n, parm->buflen); + } + else if (parm->eof_seen) + { /* no complete block but eof: add padding */ + /* fixme: we should try to do this also in the above code path */ + int i, npad = blklen - (parm->buflen % blklen); + p = parm->buffer; + for (n=parm->buflen, i=0; n < parm->bufsize && i < npad; n++, i++) + p[n] = npad; + gcry_cipher_encrypt (parm->dek->chd, buffer, n, parm->buffer, n); + *nread = n; + parm->ready = 1; + } + + return 0; +} + + + + +/* Perform an encrypt operation. + + Encrypt the data received on DATA-FD and write it to OUT_FP. The + recipients are take from the certificate given in recplist; if this + is NULL it will be encrypted for a default recipient */ +int +gpgsm_encrypt (CTRL ctrl, CERTLIST recplist, int data_fd, FILE *out_fp) +{ + int rc = 0; + Base64Context b64writer = NULL; + gpg_error_t err; + ksba_writer_t writer; + ksba_reader_t reader = NULL; + ksba_cms_t cms = NULL; + ksba_stop_reason_t stopreason; + KEYDB_HANDLE kh = NULL; + struct encrypt_cb_parm_s encparm; + DEK dek = NULL; + int recpno; + FILE *data_fp = NULL; + CERTLIST cl; + + memset (&encparm, 0, sizeof encparm); + + /* Check that the certificate list is not empty and that at least + one certificate is not flagged as encrypt_to; i.e. is a real + recipient. */ + for (cl = recplist; cl; cl = cl->next) + if (!cl->is_encrypt_to) + break; + if (!cl) + { + log_error(_("no valid recipients given\n")); + gpgsm_status (ctrl, STATUS_NO_RECP, "0"); + rc = gpg_error (GPG_ERR_NO_PUBKEY); + goto leave; + } + + kh = keydb_new (0); + if (!kh) + { + log_error (_("failed to allocated keyDB handle\n")); + rc = gpg_error (GPG_ERR_GENERAL); + goto leave; + } + + data_fp = fdopen ( dup (data_fd), "rb"); + if (!data_fp) + { + rc = gpg_error (gpg_err_code_from_errno (errno)); + log_error ("fdopen() failed: %s\n", strerror (errno)); + goto leave; + } + + err = ksba_reader_new (&reader); + if (err) + rc = err; + if (!rc) + rc = ksba_reader_set_cb (reader, encrypt_cb, &encparm); + if (rc) + goto leave; + + encparm.fp = data_fp; + + ctrl->pem_name = "ENCRYPTED MESSAGE"; + rc = gpgsm_create_writer (&b64writer, ctrl, out_fp, &writer); + if (rc) + { + log_error ("can't create writer: %s\n", gpg_strerror (rc)); + goto leave; + } + + err = ksba_cms_new (&cms); + if (err) + { + rc = err; + goto leave; + } + + err = ksba_cms_set_reader_writer (cms, reader, writer); + if (err) + { + log_debug ("ksba_cms_set_reader_writer failed: %s\n", + gpg_strerror (err)); + rc = err; + goto leave; + } + + /* We are going to create enveloped data with uninterpreted data as + inner content */ + err = ksba_cms_set_content_type (cms, 0, KSBA_CT_ENVELOPED_DATA); + if (!err) + err = ksba_cms_set_content_type (cms, 1, KSBA_CT_DATA); + if (err) + { + log_debug ("ksba_cms_set_content_type failed: %s\n", + gpg_strerror (err)); + rc = err; + goto leave; + } + + /* Create a session key */ + dek = xtrycalloc_secure (1, sizeof *dek); + if (!dek) + rc = OUT_OF_CORE (errno); + else + { + dek->algoid = opt.def_cipher_algoid; + rc = init_dek (dek); + } + if (rc) + { + log_error ("failed to create the session key: %s\n", + gpg_strerror (rc)); + goto leave; + } + + err = ksba_cms_set_content_enc_algo (cms, dek->algoid, dek->iv, dek->ivlen); + if (err) + { + log_error ("ksba_cms_set_content_enc_algo failed: %s\n", + gpg_strerror (err)); + rc = err; + goto leave; + } + + encparm.dek = dek; + /* Use a ~8k (AES) or ~4k (3DES) buffer */ + encparm.bufsize = 500 * dek->ivlen; + encparm.buffer = xtrymalloc (encparm.bufsize); + if (!encparm.buffer) + { + rc = OUT_OF_CORE (errno); + goto leave; + } + + /* Gather certificates of recipients, encrypt the session key for + each and store them in the CMS object */ + for (recpno = 0, cl = recplist; cl; recpno++, cl = cl->next) + { + unsigned char *encval; + + rc = encrypt_dek (dek, cl->cert, &encval); + if (rc) + { + log_error ("encryption failed for recipient no. %d: %s\n", + recpno, gpg_strerror (rc)); + goto leave; + } + + err = ksba_cms_add_recipient (cms, cl->cert); + if (err) + { + log_error ("ksba_cms_add_recipient failed: %s\n", + gpg_strerror (err)); + rc = err; + xfree (encval); + goto leave; + } + + err = ksba_cms_set_enc_val (cms, recpno, encval); + xfree (encval); + if (err) + { + log_error ("ksba_cms_set_enc_val failed: %s\n", + gpg_strerror (err)); + rc = err; + goto leave; + } + } + + /* Main control loop for encryption. */ + recpno = 0; + do + { + err = ksba_cms_build (cms, &stopreason); + if (err) + { + log_debug ("ksba_cms_build failed: %s\n", gpg_strerror (err)); + rc = err; + goto leave; + } + } + while (stopreason != KSBA_SR_READY); + + if (encparm.readerror) + { + log_error ("error reading input: %s\n", strerror (encparm.readerror)); + rc = gpg_error (gpg_err_code_from_errno (encparm.readerror)); + goto leave; + } + + + rc = gpgsm_finish_writer (b64writer); + if (rc) + { + log_error ("write failed: %s\n", gpg_strerror (rc)); + goto leave; + } + log_info ("encrypted data created\n"); + + leave: + ksba_cms_release (cms); + gpgsm_destroy_writer (b64writer); + ksba_reader_release (reader); + keydb_release (kh); + xfree (dek); + if (data_fp) + fclose (data_fp); + xfree (encparm.buffer); + return rc; +} diff --git a/sm/export.c b/sm/export.c new file mode 100644 index 000000000..b08a017d2 --- /dev/null +++ b/sm/export.c @@ -0,0 +1,672 @@ +/* export.c + * Copyright (C) 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 <time.h> +#include <assert.h> + +#include "gpgsm.h" +#include <gcrypt.h> +#include <ksba.h> + +#include "keydb.h" +#include "exechelp.h" +#include "i18n.h" + + + +/* A table to store a fingerprint as used in a duplicates table. We + don't need to hash here because a fingerprint is alrady a perfect + hash value. This we use the most significant bits to index the + table and then use a linked list for the overflow. Possible + enhancement for very large number of certictates: Add a second + level table and then resort to a linked list. */ +struct duptable_s +{ + struct duptable_s *next; + + /* Note that we only need to store 19 bytes because the first byte + is implictly given by the table index (we require at least 8 + bits). */ + unsigned char fpr[19]; +}; +typedef struct duptable_s *duptable_t; +#define DUPTABLE_BITS 12 +#define DUPTABLE_SIZE (1 << DUPTABLE_BITS) + + +static void print_short_info (ksba_cert_t cert, FILE *fp); +static gpg_error_t export_p12 (ctrl_t ctrl, + const unsigned char *certimg, size_t certimglen, + const char *prompt, const char *keygrip, + FILE **retfp); + + +/* Create a table used to indetify duplicated certificates. */ +static duptable_t * +create_duptable (void) +{ + return xtrycalloc (DUPTABLE_SIZE, sizeof (duptable_t)); +} + +static void +destroy_duptable (duptable_t *table) +{ + int idx; + duptable_t t, t2; + + if (table) + { + for (idx=0; idx < DUPTABLE_SIZE; idx++) + for (t = table[idx]; t; t = t2) + { + t2 = t->next; + xfree (t); + } + xfree (table); + } +} + +/* Insert the 20 byte fingerprint FPR into TABLE. Sets EXITS to true + if the fingerprint already exists in the table. */ +static gpg_error_t +insert_duptable (duptable_t *table, unsigned char *fpr, int *exists) +{ + size_t idx; + duptable_t t; + + *exists = 0; + idx = fpr[0]; +#if DUPTABLE_BITS > 16 || DUPTABLE_BITS < 8 +#error cannot handle a table larger than 16 bits or smaller than 8 bits +#elif DUPTABLE_BITS > 8 + idx <<= (DUPTABLE_BITS - 8); + idx |= (fpr[1] & ~(~0 << 4)); +#endif + + for (t = table[idx]; t; t = t->next) + if (!memcmp (t->fpr, fpr+1, 19)) + break; + if (t) + { + *exists = 1; + return 0; + } + /* Insert that fingerprint. */ + t = xtrymalloc (sizeof *t); + if (!t) + return gpg_error_from_errno (errno); + memcpy (t->fpr, fpr+1, 19); + t->next = table[idx]; + table[idx] = t; + return 0; +} + + + + +/* Export all certificates or just those given in NAMES. */ +void +gpgsm_export (CTRL ctrl, STRLIST names, FILE *fp) +{ + KEYDB_HANDLE hd = NULL; + KEYDB_SEARCH_DESC *desc = NULL; + int ndesc; + Base64Context b64writer = NULL; + ksba_writer_t writer; + STRLIST sl; + ksba_cert_t cert = NULL; + int rc=0; + int count = 0; + int i; + duptable_t *dtable; + + + dtable = create_duptable (); + if (!dtable) + { + log_error ("creating duplicates table failed: %s\n", strerror (errno)); + goto leave; + } + + hd = keydb_new (0); + if (!hd) + { + log_error ("keydb_new failed\n"); + goto leave; + } + + if (!names) + ndesc = 1; + else + { + for (sl=names, ndesc=0; sl; sl = sl->next, ndesc++) + ; + } + + desc = xtrycalloc (ndesc, sizeof *desc); + if (!ndesc) + { + log_error ("allocating memory for export failed: %s\n", + gpg_strerror (OUT_OF_CORE (errno))); + goto leave; + } + + if (!names) + desc[0].mode = KEYDB_SEARCH_MODE_FIRST; + else + { + for (ndesc=0, sl=names; sl; sl = sl->next) + { + rc = keydb_classify_name (sl->d, desc+ndesc); + if (rc) + { + log_error ("key `%s' not found: %s\n", + sl->d, gpg_strerror (rc)); + rc = 0; + } + else + ndesc++; + } + } + + /* If all specifications are done by fingerprint, we switch to + ephemeral mode so that _all_ currently available and matching + certificates are exported. + + fixme: we should in this case keep a list of certificates to + avoid accidential export of duplicate certificates. */ + if (names && ndesc) + { + for (i=0; (i < ndesc + && (desc[i].mode == KEYDB_SEARCH_MODE_FPR + || desc[i].mode == KEYDB_SEARCH_MODE_FPR20 + || desc[i].mode == KEYDB_SEARCH_MODE_FPR16)); i++) + ; + if (i == ndesc) + keydb_set_ephemeral (hd, 1); + } + + while (!(rc = keydb_search (hd, desc, ndesc))) + { + unsigned char fpr[20]; + int exists; + + if (!names) + desc[0].mode = KEYDB_SEARCH_MODE_NEXT; + + rc = keydb_get_cert (hd, &cert); + if (rc) + { + log_error ("keydb_get_cert failed: %s\n", gpg_strerror (rc)); + goto leave; + } + + gpgsm_get_fingerprint (cert, 0, fpr, NULL); + rc = insert_duptable (dtable, fpr, &exists); + if (rc) + { + log_error ("inserting into duplicates table fauiled: %s\n", + gpg_strerror (rc)); + goto leave; + } + + if (!exists && count && !ctrl->create_pem) + { + log_info ("exporting more than one certificate " + "is not possible in binary mode\n"); + log_info ("ignoring other certificates\n"); + break; + } + + if (!exists) + { + const unsigned char *image; + size_t imagelen; + + image = ksba_cert_get_image (cert, &imagelen); + if (!image) + { + log_error ("ksba_cert_get_image failed\n"); + goto leave; + } + + + if (ctrl->create_pem) + { + if (count) + putc ('\n', fp); + print_short_info (cert, fp); + putc ('\n', fp); + } + count++; + + if (!b64writer) + { + ctrl->pem_name = "CERTIFICATE"; + rc = gpgsm_create_writer (&b64writer, ctrl, fp, &writer); + if (rc) + { + log_error ("can't create writer: %s\n", gpg_strerror (rc)); + goto leave; + } + } + + rc = ksba_writer_write (writer, image, imagelen); + if (rc) + { + log_error ("write error: %s\n", gpg_strerror (rc)); + goto leave; + } + + if (ctrl->create_pem) + { + /* We want one certificate per PEM block */ + rc = gpgsm_finish_writer (b64writer); + if (rc) + { + log_error ("write failed: %s\n", gpg_strerror (rc)); + goto leave; + } + gpgsm_destroy_writer (b64writer); + b64writer = NULL; + } + } + + ksba_cert_release (cert); + cert = NULL; + } + if (rc && rc != -1) + log_error ("keydb_search failed: %s\n", gpg_strerror (rc)); + else if (b64writer) + { + rc = gpgsm_finish_writer (b64writer); + if (rc) + { + log_error ("write failed: %s\n", gpg_strerror (rc)); + goto leave; + } + } + + leave: + gpgsm_destroy_writer (b64writer); + ksba_cert_release (cert); + xfree (desc); + keydb_release (hd); + destroy_duptable (dtable); +} + + +/* Export a certificates and its private key. */ +void +gpgsm_p12_export (ctrl_t ctrl, const char *name, FILE *fp) +{ + KEYDB_HANDLE hd; + KEYDB_SEARCH_DESC *desc = NULL; + Base64Context b64writer = NULL; + ksba_writer_t writer; + ksba_cert_t cert = NULL; + int rc=0; + const unsigned char *image; + size_t imagelen; + char *keygrip = NULL; + char *prompt; + char buffer[1024]; + int nread; + FILE *datafp = NULL; + + + hd = keydb_new (0); + if (!hd) + { + log_error ("keydb_new failed\n"); + goto leave; + } + + desc = xtrycalloc (1, sizeof *desc); + if (!desc) + { + log_error ("allocating memory for export failed: %s\n", + gpg_strerror (OUT_OF_CORE (errno))); + goto leave; + } + + rc = keydb_classify_name (name, desc); + if (rc) + { + log_error ("key `%s' not found: %s\n", + name, gpg_strerror (rc)); + goto leave; + } + + /* Lookup the certificate an make sure that it is unique. */ + rc = keydb_search (hd, desc, 1); + if (!rc) + { + rc = keydb_get_cert (hd, &cert); + if (rc) + { + log_error ("keydb_get_cert failed: %s\n", gpg_strerror (rc)); + goto leave; + } + + rc = keydb_search (hd, desc, 1); + if (!rc) + rc = gpg_error (GPG_ERR_AMBIGUOUS_NAME); + else if (rc == -1 || gpg_err_code (rc) == GPG_ERR_EOF) + rc = 0; + if (rc) + { + log_error ("key `%s' not found: %s\n", + name, gpg_strerror (rc)); + goto leave; + } + } + + keygrip = gpgsm_get_keygrip_hexstring (cert); + if (!keygrip || gpgsm_agent_havekey (ctrl, keygrip)) + { + /* Note, that the !keygrip case indicates a bad certificate. */ + rc = gpg_error (GPG_ERR_NO_SECKEY); + log_error ("can't export key `%s': %s\n", name, gpg_strerror (rc)); + goto leave; + } + + image = ksba_cert_get_image (cert, &imagelen); + if (!image) + { + log_error ("ksba_cert_get_image failed\n"); + goto leave; + } + + if (ctrl->create_pem) + { + print_short_info (cert, fp); + putc ('\n', fp); + } + + ctrl->pem_name = "PKCS12"; + rc = gpgsm_create_writer (&b64writer, ctrl, fp, &writer); + if (rc) + { + log_error ("can't create writer: %s\n", gpg_strerror (rc)); + goto leave; + } + + + prompt = gpgsm_format_keydesc (cert); + rc = export_p12 (ctrl, image, imagelen, prompt, keygrip, &datafp); + xfree (prompt); + if (rc) + goto leave; + rewind (datafp); + while ( (nread = fread (buffer, 1, sizeof buffer, datafp)) > 0 ) + if ((rc = ksba_writer_write (writer, buffer, nread))) + { + log_error ("write failed: %s\n", gpg_strerror (rc)); + goto leave; + } + if (ferror (datafp)) + { + rc = gpg_error_from_errno (rc); + log_error ("error reading temporary file: %s\n", gpg_strerror (rc)); + goto leave; + } + + if (ctrl->create_pem) + { + /* We want one certificate per PEM block */ + rc = gpgsm_finish_writer (b64writer); + if (rc) + { + log_error ("write failed: %s\n", gpg_strerror (rc)); + goto leave; + } + gpgsm_destroy_writer (b64writer); + b64writer = NULL; + } + + ksba_cert_release (cert); + cert = NULL; + + leave: + if (datafp) + fclose (datafp); + gpgsm_destroy_writer (b64writer); + ksba_cert_release (cert); + xfree (desc); + keydb_release (hd); +} + + +/* Print some info about the certifciate CERT to FP */ +static void +print_short_info (ksba_cert_t cert, FILE *fp) +{ + char *p; + ksba_sexp_t sexp; + int idx; + + for (idx=0; (p = ksba_cert_get_issuer (cert, idx)); idx++) + { + fputs (!idx? "Issuer ...: " + : "\n aka ...: ", fp); + gpgsm_print_name (fp, p); + xfree (p); + } + putc ('\n', fp); + + fputs ("Serial ...: ", fp); + sexp = ksba_cert_get_serial (cert); + if (sexp) + { + int len; + const unsigned char *s = sexp; + + if (*s == '(') + { + s++; + for (len=0; *s && *s != ':' && digitp (s); s++) + len = len*10 + atoi_1 (s); + if (*s == ':') + for (s++; len; len--, s++) + fprintf (fp, "%02X", *s); + } + xfree (sexp); + } + putc ('\n', fp); + + for (idx=0; (p = ksba_cert_get_subject (cert, idx)); idx++) + { + fputs (!idx? "Subject ..: " + : "\n aka ..: ", fp); + gpgsm_print_name (fp, p); + xfree (p); + } + putc ('\n', fp); +} + + +static gpg_error_t +popen_protect_tool (const char *pgmname, + FILE *infile, FILE *outfile, FILE **statusfile, + const char *prompt, const char *keygrip, + pid_t *pid) +{ + const char *argv[20]; + int i=0; + + argv[i++] = "--homedir"; + argv[i++] = opt.homedir; + argv[i++] = "--p12-export"; + argv[i++] = "--have-cert"; + argv[i++] = "--prompt"; + argv[i++] = prompt?prompt:""; + argv[i++] = "--enable-status-msg"; + argv[i++] = "--", + argv[i++] = keygrip, + argv[i] = NULL; + assert (i < sizeof argv); + + return gnupg_spawn_process (pgmname, argv, infile, outfile, + setup_pinentry_env, + statusfile, pid); +} + + +static gpg_error_t +export_p12 (ctrl_t ctrl, const unsigned char *certimg, size_t certimglen, + const char *prompt, const char *keygrip, + FILE **retfp) +{ + const char *pgmname; + gpg_error_t err = 0, child_err = 0; + int c, cont_line; + unsigned int pos; + FILE *infp = NULL, *outfp = NULL, *fp = NULL; + char buffer[1024]; + pid_t pid = -1; + int bad_pass = 0; + + if (!opt.protect_tool_program || !*opt.protect_tool_program) + pgmname = GNUPG_DEFAULT_PROTECT_TOOL; + else + pgmname = opt.protect_tool_program; + + infp = tmpfile (); + if (!infp) + { + err = gpg_error_from_errno (errno); + log_error (_("error creating temporary file: %s\n"), strerror (errno)); + goto cleanup; + } + + if (fwrite (certimg, certimglen, 1, infp) != 1) + { + err = gpg_error_from_errno (errno); + log_error (_("error writing to temporary file: %s\n"), + strerror (errno)); + goto cleanup; + } + + outfp = tmpfile (); + if (!outfp) + { + err = gpg_error_from_errno (errno); + log_error (_("error creating temporary file: %s\n"), strerror (errno)); + goto cleanup; + } + + err = popen_protect_tool (pgmname, infp, outfp, &fp, prompt, keygrip, &pid); + if (err) + { + pid = -1; + goto cleanup; + } + fclose (infp); + infp = NULL; + + /* Read stderr of the protect tool. */ + pos = 0; + cont_line = 0; + while ((c=getc (fp)) != EOF) + { + /* fixme: We could here grep for status information of the + protect tool to figure out better error codes for + CHILD_ERR. */ + buffer[pos++] = c; + if (pos >= sizeof buffer - 5 || c == '\n') + { + buffer[pos - (c == '\n')] = 0; + if (cont_line) + log_printf ("%s", buffer); + else + { + if (!strncmp (buffer, "gpg-protect-tool: [PROTECT-TOOL:] ",34)) + { + char *p, *pend; + + p = buffer + 34; + pend = strchr (p, ' '); + if (pend) + *pend = 0; + if ( !strcmp (p, "bad-passphrase")) + bad_pass++; + } + else + log_info ("%s", buffer); + } + pos = 0; + cont_line = (c != '\n'); + } + } + + if (pos) + { + buffer[pos] = 0; + if (cont_line) + log_printf ("%s\n", buffer); + else + log_info ("%s\n", buffer); + } + else if (cont_line) + log_printf ("\n"); + + /* If we found no error in the output of the child, setup a suitable + error code, which will later be reset if the exit status of the + child is 0. */ + if (!child_err) + child_err = gpg_error (GPG_ERR_DECRYPT_FAILED); + + cleanup: + if (infp) + fclose (infp); + if (fp) + fclose (fp); + if (pid != -1) + { + if (!gnupg_wait_process (pgmname, pid)) + child_err = 0; + } + if (!err) + err = child_err; + if (err) + { + if (outfp) + fclose (outfp); + } + else + *retfp = outfp; + if (bad_pass) + { + /* During export this is the passphrase used to unprotect the + key and not the pkcs#12 thing as in export. Therefore we can + issue the regular passphrase status. FIXME: replace the all + zero keyid by a regular one. */ + gpgsm_status (ctrl, STATUS_BAD_PASSPHRASE, "0000000000000000"); + } + return err; +} + diff --git a/sm/fingerprint.c b/sm/fingerprint.c new file mode 100644 index 000000000..d6a3900f0 --- /dev/null +++ b/sm/fingerprint.c @@ -0,0 +1,331 @@ +/* fingerprint.c - Get the fingerprint + * 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. + */ + +#include <config.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include <unistd.h> +#include <time.h> +#include <assert.h> + + +#include "gpgsm.h" +#include <gcrypt.h> +#include <ksba.h> + +/* Return the fingerprint of the certificate (we can't put this into + libksba because we need libgcrypt support). The caller must + provide an array of sufficient length or NULL so that the function + allocates the array. If r_len is not NULL, the length of the + digest is returned; well, this can also be done by using + gcry_md_get_algo_dlen(). If algo is 0, a SHA-1 will be used. + + If there is a problem , the function does never return NULL but a + digest of all 0xff. + */ +unsigned char * +gpgsm_get_fingerprint (ksba_cert_t cert, int algo, + unsigned char *array, int *r_len) +{ + gcry_md_hd_t md; + int rc, len; + + if (!algo) + algo = GCRY_MD_SHA1; + + len = gcry_md_get_algo_dlen (algo); + assert (len); + if (!array) + array = xmalloc (len); + + if (r_len) + *r_len = len; + + rc = gcry_md_open (&md, algo, 0); + if (rc) + { + log_error ("md_open failed: %s\n", gpg_strerror (rc)); + memset (array, 0xff, len); /* better return an invalid fpr than NULL */ + return array; + } + + rc = ksba_cert_hash (cert, 0, HASH_FNC, md); + if (rc) + { + log_error ("ksba_cert_hash failed: %s\n", gpg_strerror (rc)); + gcry_md_close (md); + memset (array, 0xff, len); /* better return an invalid fpr than NULL */ + return array; + } + gcry_md_final (md); + memcpy (array, gcry_md_read(md, algo), len ); + return array; +} + + +/* Return an allocated buffer with the formatted fingerprint */ +char * +gpgsm_get_fingerprint_string (ksba_cert_t cert, int algo) +{ + unsigned char digest[MAX_DIGEST_LEN]; + char *buf; + int len, i; + + if (!algo) + algo = GCRY_MD_SHA1; + + len = gcry_md_get_algo_dlen (algo); + assert (len <= MAX_DIGEST_LEN ); + gpgsm_get_fingerprint (cert, algo, digest, NULL); + buf = xmalloc (len*3+1); + *buf = 0; + for (i=0; i < len; i++ ) + sprintf (buf+strlen(buf), i? ":%02X":"%02X", digest[i]); + return buf; +} + +/* Return an allocated buffer with the formatted fingerprint as one + large hexnumber */ +char * +gpgsm_get_fingerprint_hexstring (ksba_cert_t cert, int algo) +{ + unsigned char digest[MAX_DIGEST_LEN]; + char *buf; + int len, i; + + if (!algo) + algo = GCRY_MD_SHA1; + + len = gcry_md_get_algo_dlen (algo); + assert (len <= MAX_DIGEST_LEN ); + gpgsm_get_fingerprint (cert, algo, digest, NULL); + buf = xmalloc (len*3+1); + *buf = 0; + for (i=0; i < len; i++ ) + sprintf (buf+strlen(buf), "%02X", digest[i]); + return buf; +} + +/* Return a certificate ID. These are the last 4 bytes of the SHA-1 + fingerprint. */ +unsigned long +gpgsm_get_short_fingerprint (ksba_cert_t cert) +{ + unsigned char digest[20]; + + gpgsm_get_fingerprint (cert, GCRY_MD_SHA1, digest, NULL); + return ((digest[16]<<24)|(digest[17]<<16)|(digest[18]<< 8)|digest[19]); +} + + +/* Return the so called KEYGRIP which is the SHA-1 hash of the public + key parameters expressed as an canoncial encoded S-Exp. array must + be 20 bytes long. returns the array or a newly allocated one if the + passed one was NULL */ +unsigned char * +gpgsm_get_keygrip (ksba_cert_t cert, unsigned char *array) +{ + gcry_sexp_t s_pkey; + int rc; + ksba_sexp_t p; + size_t n; + + p = ksba_cert_get_public_key (cert); + if (!p) + return NULL; /* oops */ + + if (DBG_X509) + log_debug ("get_keygrip for public key\n"); + n = gcry_sexp_canon_len (p, 0, NULL, NULL); + if (!n) + { + log_error ("libksba did not return a proper S-Exp\n"); + return NULL; + } + rc = gcry_sexp_sscan ( &s_pkey, NULL, (char*)p, n); + xfree (p); + if (rc) + { + log_error ("gcry_sexp_scan failed: %s\n", gpg_strerror (rc)); + return NULL; + } + array = gcry_pk_get_keygrip (s_pkey, array); + gcry_sexp_release (s_pkey); + if (!array) + { + rc = gpg_error (GPG_ERR_GENERAL); + log_error ("can't calculate keygrip\n"); + return NULL; + } + if (DBG_X509) + log_printhex ("keygrip=", array, 20); + + return array; +} + +/* Return an allocated buffer with the keygrip of CERT in from of an + hexstring. NULL is returned in case of error */ +char * +gpgsm_get_keygrip_hexstring (ksba_cert_t cert) +{ + unsigned char grip[20]; + char *buf, *p; + int i; + + gpgsm_get_keygrip (cert, grip); + buf = p = xmalloc (20*2+1); + for (i=0; i < 20; i++, p += 2 ) + sprintf (p, "%02X", grip[i]); + return buf; +} + + +/* Return the PK algorithm used by CERT as well as the length in bits + of the public key at NBITS. */ +int +gpgsm_get_key_algo_info (ksba_cert_t cert, unsigned int *nbits) +{ + gcry_sexp_t s_pkey; + int rc; + ksba_sexp_t p; + size_t n; + gcry_sexp_t l1, l2; + const char *name; + char namebuf[128]; + + if (nbits) + *nbits = 0; + + p = ksba_cert_get_public_key (cert); + if (!p) + return 0; + n = gcry_sexp_canon_len (p, 0, NULL, NULL); + if (!n) + { + xfree (p); + return 0; + } + rc = gcry_sexp_sscan (&s_pkey, NULL, (char *)p, n); + xfree (p); + if (rc) + return 0; + + if (nbits) + *nbits = gcry_pk_get_nbits (s_pkey); + + /* Breaking the algorithm out of the S-exp is a bit of a challenge ... */ + l1 = gcry_sexp_find_token (s_pkey, "public-key", 0); + if (!l1) + { + gcry_sexp_release (s_pkey); + return 0; + } + l2 = gcry_sexp_cadr (l1); + gcry_sexp_release (l1); + l1 = l2; + name = gcry_sexp_nth_data (l1, 0, &n); + if (name) + { + if (n > sizeof namebuf -1) + n = sizeof namebuf -1; + memcpy (namebuf, name, n); + namebuf[n] = 0; + } + else + *namebuf = 0; + gcry_sexp_release (l1); + gcry_sexp_release (s_pkey); + return gcry_pk_map_name (namebuf); +} + + + + +/* For certain purposes we need a certificate id which has an upper + limit of the size. We use the hash of the issuer name and the + serial number for this. In most cases the serial number is not + that large and the resulting string can be passed on an assuan + command line. Everything is hexencoded with the serialnumber + delimited from the hash by a dot. + + The caller must free the string. +*/ +char * +gpgsm_get_certid (ksba_cert_t cert) +{ + ksba_sexp_t serial; + char *p; + char *endp; + unsigned char hash[20]; + unsigned long n; + char *certid; + int i; + + p = ksba_cert_get_issuer (cert, 0); + if (!p) + return NULL; /* Ooops: No issuer */ + gcry_md_hash_buffer (GCRY_MD_SHA1, hash, p, strlen (p)); + xfree (p); + + serial = ksba_cert_get_serial (cert); + if (!serial) + return NULL; /* oops: no serial number */ + p = (char *)serial; + if (*p != '(') + { + log_error ("Ooops: invalid serial number\n"); + xfree (serial); + return NULL; + } + p++; + n = strtoul (p, &endp, 10); + p = endp; + if (*p != ':') + { + log_error ("Ooops: invalid serial number (no colon)\n"); + xfree (serial); + return NULL; + } + p++; + + certid = xtrymalloc ( 40 + 1 + n*2 + 1); + if (!certid) + { + xfree (serial); + return NULL; /* out of core */ + } + + for (i=0, endp = certid; i < 20; i++, endp += 2 ) + sprintf (endp, "%02X", hash[i]); + *endp++ = '.'; + for (i=0; i < n; i++, endp += 2) + sprintf (endp, "%02X", ((unsigned char*)p)[i]); + *endp = 0; + + xfree (serial); + return certid; +} + + + + diff --git a/sm/gpgsm.c b/sm/gpgsm.c new file mode 100644 index 000000000..5363b8ad6 --- /dev/null +++ b/sm/gpgsm.c @@ -0,0 +1,1781 @@ +/* gpgsm.c - GnuPG for S/MIME + * 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 <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> +#include <unistd.h> +#include <fcntl.h> +#ifdef USE_GNU_PTH +# include <pth.h> +#endif + +#include "gpgsm.h" +#include <gcrypt.h> +#include <assuan.h> /* malloc hooks */ + +#include "../kbx/keybox.h" /* malloc hooks */ +#include "i18n.h" +#include "keydb.h" +#include "sysutils.h" + + +#ifndef O_BINARY +#define O_BINARY 0 +#endif + +enum cmd_and_opt_values { + aNull = 0, + oArmor = 'a', + aDetachedSign = 'b', + aSym = 'c', + aDecrypt = 'd', + aEncr = 'e', + oInteractive = 'i', + aListKeys = 'k', + aListSecretKeys = 'K', + oDryRun = 'n', + oOutput = 'o', + oQuiet = 'q', + oRecipient = 'r', + aSign = 's', + oTextmodeShort= 't', + oUser = 'u', + oVerbose = 'v', + oCompress = 'z', + oNotation = 'N', + oBatch = 500, + aClearsign, + aStore, + aKeygen, + aSignEncr, + aSignKey, + aLSignKey, + aListPackets, + aEditKey, + aDeleteKey, + aImport, + aVerify, + aVerifyFiles, + aListExternalKeys, + aListSigs, + aSendKeys, + aRecvKeys, + aExport, + aExportSecretKeyP12, + aCheckKeys, /* nyi */ + aServer, + aLearnCard, + aCallDirmngr, + aCallProtectTool, + aPasswd, + aGPGConfList, + aDumpKeys, + aDumpSecretKeys, + aDumpExternalKeys, + aKeydbClearSomeCertFlags, + + oOptions, + oDebug, + oDebugLevel, + oDebugAll, + oDebugNone, + oDebugWait, + oDebugAllowCoreDump, + oDebugNoChainValidation, + oDebugIgnoreExpiration, + oFixedPassphrase, + oLogFile, + oNoLogFile, + + oEnableSpecialFilenames, + + oAgentProgram, + oDisplay, + oTTYname, + oTTYtype, + oLCctype, + oLCmessages, + + oPreferSystemDirmngr, + oDirmngrProgram, + oProtectToolProgram, + oFakedSystemTime, + + + oAssumeArmor, + oAssumeBase64, + oAssumeBinary, + + oBase64, + oNoArmor, + + oDisableCRLChecks, + oEnableCRLChecks, + oDisableTrustedCertCRLCheck, + oEnableTrustedCertCRLCheck, + oForceCRLRefresh, + + oDisableOCSP, + oEnableOCSP, + + oIncludeCerts, + oPolicyFile, + oDisablePolicyChecks, + oEnablePolicyChecks, + oAutoIssuerKeyRetrieve, + + + oTextmode, + oFingerprint, + oWithFingerprint, + oWithMD5Fingerprint, + oAnswerYes, + oAnswerNo, + oKeyring, + oSecretKeyring, + oDefaultKey, + oDefRecipient, + oDefRecipientSelf, + oNoDefRecipient, + oStatusFD, + oNoComment, + oNoVersion, + oEmitVersion, + oCompletesNeeded, + oMarginalsNeeded, + oMaxCertDepth, + oLoadExtension, + oRFC1991, + oOpenPGP, + oCipherAlgo, + oDigestAlgo, + oCompressAlgo, + oCommandFD, + oNoVerbose, + oTrustDBName, + oNoSecmemWarn, + oNoDefKeyring, + oNoGreeting, + oNoTTY, + oNoOptions, + oNoBatch, + oHomedir, + oWithColons, + oWithKeyData, + oWithValidation, + oWithEphemeralKeys, + oSkipVerify, + oCompressKeys, + oCompressSigs, + oAlwaysTrust, + oRunAsShmCP, + oSetFilename, + oSetPolicyURL, + oUseEmbeddedFilename, + oComment, + oDefaultComment, + oThrowKeyid, + oForceV3Sigs, + oForceMDC, + oS2KMode, + oS2KDigest, + oS2KCipher, + oCharset, + oNotDashEscaped, + oEscapeFrom, + oLockOnce, + oLockMultiple, + oLockNever, + oKeyServer, + oEncryptTo, + oNoEncryptTo, + oLoggerFD, + oUtf8Strings, + oNoUtf8Strings, + oDisableCipherAlgo, + oDisablePubkeyAlgo, + oAllowNonSelfsignedUID, + oAllowFreeformUID, + oNoLiteral, + oSetFilesize, + oHonorHttpProxy, + oFastListMode, + oListOnly, + oIgnoreTimeConflict, + oNoRandomSeedFile, + oNoAutoKeyRetrieve, + oUseAgent, + oMergeOnly, + oTryAllSecrets, + oTrustedKey, + oEmuMDEncodeBug, + aDummy + }; + + +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")}, + { aSym, "symmetric", 256, N_("encryption only with symmetric cipher")}, + { aDecrypt, "decrypt", 256, N_("decrypt data (default)")}, + { aVerify, "verify" , 256, N_("verify a signature")}, + { aVerifyFiles, "verify-files" , 256, "@" }, + { aListKeys, "list-keys", 256, N_("list keys")}, + { aListExternalKeys, "list-external-keys", 256, N_("list external keys")}, + { aListSecretKeys, "list-secret-keys", 256, N_("list secret keys")}, + { aListSigs, "list-sigs", 256, N_("list certificate chain")}, + { aListSigs, "check-sigs",256, "@"}, + { oFingerprint, "fingerprint", 256, N_("list keys and fingerprints")}, + { aKeygen, "gen-key", 256, N_("generate a new key pair")}, + { aDeleteKey, "delete-key",256, N_("remove key from the public keyring")}, + { aSendKeys, "send-keys" , 256, N_("export keys to a key server") }, + { aRecvKeys, "recv-keys" , 256, N_("import keys from a key server") }, + { aImport, "import", 256 , N_("import certificates")}, + { aExport, "export", 256 , N_("export certificates")}, + { aLearnCard, "learn-card", 256 ,N_("register a smartcard")}, + { aServer, "server", 256, N_("run in server mode")}, + { aCallDirmngr, "call-dirmngr", 256, N_("pass a command to the dirmngr")}, + { aCallProtectTool, "call-protect-tool", 256, + N_("invoke gpg-protect-tool")}, + { aPasswd, "passwd", 256, N_("change a passphrase")}, + { aGPGConfList, "gpgconf-list", 256, "@" }, + + { aDumpKeys, "dump-keys", 256, "@"}, + { aDumpExternalKeys, "dump-external-keys", 256, "@"}, + { aDumpSecretKeys, "dump-secret-keys", 256, "@"}, + { aKeydbClearSomeCertFlags, "keydb-clear-some-cert-flags", 256, "@"}, + + { 301, NULL, 0, N_("@\nOptions:\n ") }, + + { oArmor, "armor", 0, N_("create ascii armored output")}, + { oArmor, "armour", 0, "@" }, + { oBase64, "base64", 0, N_("create base-64 encoded output")}, + + { oAssumeArmor, "assume-armor", 0, N_("assume input is in PEM format")}, + { oAssumeBase64, "assume-base64", 0, + N_("assume input is in base-64 format")}, + { oAssumeBinary, "assume-binary", 0, + N_("assume input is in binary format")}, + + { oRecipient, "recipient", 2, N_("|NAME|encrypt for NAME")}, + + { oPreferSystemDirmngr,"prefer-system-dirmngr", 0, + N_("use system's dirmngr if available")}, + { oDisableCRLChecks, "disable-crl-checks", 0, N_("never consult a CRL")}, + { oEnableCRLChecks, "enable-crl-checks", 0, "@"}, + { oDisableTrustedCertCRLCheck, "disable-trusted-cert-crl-check", 0, "@"}, + { oEnableTrustedCertCRLCheck, "enable-trusted-cert-crl-check", 0, "@"}, + { oForceCRLRefresh, "force-crl-refresh", 0, "@"}, + + { oDisableOCSP, "disable-ocsp", 0, "@" }, + { oEnableOCSP, "enable-ocsp", 0, N_("check validity using OCSP")}, + + { oIncludeCerts, "include-certs", 1, + N_("|N|number of certificates to include") }, + + { oPolicyFile, "policy-file", 2, + N_("|FILE|take policy information from FILE") }, + + { oDisablePolicyChecks, "disable-policy-checks", 0, + N_("do not check certificate policies")}, + { oEnablePolicyChecks, "enable-policy-checks", 0, "@"}, + + { oAutoIssuerKeyRetrieve, "auto-issuer-key-retrieve", 0, + N_("fetch missing issuer certificates")}, + +#if 0 + { oDefRecipient, "default-recipient" ,2, + N_("|NAME|use NAME as default recipient")}, + { oDefRecipientSelf, "default-recipient-self" ,0, + N_("use the default key as default recipient")}, + { oNoDefRecipient, "no-default-recipient", 0, "@" }, +#endif + { oEncryptTo, "encrypt-to", 2, "@" }, + { oNoEncryptTo, "no-encrypt-to", 0, "@" }, + + { oUser, "local-user",2, N_("use this user-id to sign or decrypt")}, + +#if 0 + { oCompress, NULL, 1, N_("|N|set compress level N (0 disables)") }, + { oTextmodeShort, NULL, 0, "@"}, + { oTextmode, "textmode", 0, N_("use canonical text mode")}, +#endif + + { oOutput, "output", 2, N_("use as output file")}, + { oVerbose, "verbose", 0, N_("verbose") }, + { oQuiet, "quiet", 0, N_("be somewhat more quiet") }, + { oNoTTY, "no-tty", 0, N_("don't use the terminal at all") }, + { oLogFile, "log-file" ,2, N_("use a log file for the server")}, + { oNoLogFile, "no-log-file" ,0, "@"}, +#if 0 + { oForceV3Sigs, "force-v3-sigs", 0, N_("force v3 signatures") }, + { oForceMDC, "force-mdc", 0, N_("always use a MDC for encryption") }, +#endif + { oDryRun, "dry-run", 0, N_("do not make any changes") }, + /*{ oInteractive, "interactive", 0, N_("prompt before overwriting") }, */ + /*{ oUseAgent, "use-agent",0, N_("use the gpg-agent")},*/ + { oBatch, "batch", 0, N_("batch mode: never ask")}, + { oAnswerYes, "yes", 0, N_("assume yes on most questions")}, + { oAnswerNo, "no", 0, N_("assume no on most questions")}, + + { oKeyring, "keyring" ,2, N_("add this keyring to the list of keyrings")}, + { oSecretKeyring, "secret-keyring" ,2, N_("add this secret keyring to the list")}, + { oDefaultKey, "default-key" ,2, N_("|NAME|use NAME as default secret key")}, + { oKeyServer, "keyserver",2, N_("|HOST|use this keyserver to lookup keys")}, + { oCharset, "charset" , 2, N_("|NAME|set terminal charset to NAME") }, + { oOptions, "options" , 2, N_("read options from file")}, + + { oDebug, "debug" ,4|16, "@"}, + { oDebugLevel, "debug-level" ,2, N_("|LEVEL|set the debugging level to LEVEL")}, + { oDebugAll, "debug-all" ,0, "@"}, + { oDebugNone, "debug-none" ,0, "@"}, + { oDebugWait, "debug-wait" ,1, "@"}, + { oDebugAllowCoreDump, "debug-allow-core-dump", 0, "@" }, + { oDebugNoChainValidation, "debug-no-chain-validation", 0, "@"}, + { oDebugIgnoreExpiration, "debug-ignore-expiration", 0, "@"}, + { oFixedPassphrase, "fixed-passphrase", 2, "@"}, + { oStatusFD, "status-fd" ,1, N_("|FD|write status info to this FD") }, + { aDummy, "no-comment", 0, "@"}, + { aDummy, "completes-needed", 1, "@"}, + { aDummy, "marginals-needed", 1, "@"}, + { oMaxCertDepth, "max-cert-depth", 1, "@" }, + { aDummy, "trusted-key", 2, "@"}, + { oLoadExtension, "load-extension" ,2, + N_("|FILE|load extension module FILE")}, + { aDummy, "rfc1991", 0, "@"}, + { aDummy, "openpgp", 0, "@"}, + { aDummy, "s2k-mode", 1, "@"}, + { aDummy, "s2k-digest-algo",2, "@"}, + { aDummy, "s2k-cipher-algo",2, "@"}, + { oCipherAlgo, "cipher-algo", 2 , N_("|NAME|use cipher algorithm NAME")}, + { oDigestAlgo, "digest-algo", 2 , + N_("|NAME|use message digest algorithm NAME")}, +#if 0 + { oCompressAlgo, "compress-algo", 1 , N_("|N|use compress algorithm N")}, +#endif + { aDummy, "throw-keyid", 0, "@"}, + { aDummy, "notation-data", 2, "@"}, + { aExportSecretKeyP12, "export-secret-key-p12", 256, "@"}, + + + { 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 */ + { oNoVerbose, "no-verbose", 0, "@"}, + + { oEnableSpecialFilenames, "enable-special-filenames", 0, "@" }, + + + { oTrustDBName, "trustdb-name", 2, "@" }, + { oNoSecmemWarn, "no-secmem-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" */ + { oAgentProgram, "agent-program", 2 , "@" }, + { oDisplay, "display", 2, "@" }, + { oTTYname, "ttyname", 2, "@" }, + { oTTYtype, "ttytype", 2, "@" }, + { oLCctype, "lc-ctype", 2, "@" }, + { oLCmessages, "lc-messages", 2, "@" }, + { oDirmngrProgram, "dirmngr-program", 2 , "@" }, + { oProtectToolProgram, "protect-tool-program", 2 , "@" }, + { oFakedSystemTime, "faked-system-time", 4, "@" }, /* (epoch time) */ + + + { oNoBatch, "no-batch", 0, "@" }, + { oWithColons, "with-colons", 0, "@"}, + { oWithKeyData,"with-key-data", 0, "@"}, + { oWithValidation, "with-validation", 0, "@"}, + { oWithMD5Fingerprint, "with-md5-fingerprint", 0, "@"}, + { oWithEphemeralKeys, "with-ephemeral-keys", 0, "@"}, + { aListKeys, "list-key", 0, "@" }, /* alias */ + { aListSigs, "list-sig", 0, "@" }, /* alias */ + { aListSigs, "check-sig",0, "@" }, /* alias */ + { oSkipVerify, "skip-verify",0, "@" }, + { oCompressKeys, "compress-keys",0, "@"}, + { oCompressSigs, "compress-sigs",0, "@"}, + { oAlwaysTrust, "always-trust", 0, "@"}, + { oNoVersion, "no-version", 0, "@"}, + { oLockOnce, "lock-once", 0, "@" }, + { oLockMultiple, "lock-multiple", 0, "@" }, + { oLockNever, "lock-never", 0, "@" }, + { oLoggerFD, "logger-fd",1, "@" }, + { oWithFingerprint, "with-fingerprint", 0, "@" }, + { oDisableCipherAlgo, "disable-cipher-algo", 2, "@" }, + { oDisablePubkeyAlgo, "disable-pubkey-algo", 2, "@" }, + { oHonorHttpProxy,"honor-http-proxy", 0, "@" }, + { oListOnly, "list-only", 0, "@"}, + { oIgnoreTimeConflict, "ignore-time-conflict", 0, "@" }, + { oNoRandomSeedFile, "no-random-seed-file", 0, "@" }, +{0} }; + + + +int gpgsm_errors_seen = 0; + +/* It is possible that we are currentlu running under setuid permissions */ +static int maybe_setuid = 1; + +/* Helper to implement --debug-level and --debug*/ +static const char *debug_level; +static unsigned int debug_value; + +/* Option --enable-special-filenames */ +static int allow_special_filenames; + +/* Default value for include-certs. */ +static int default_include_certs = 1; /* Only include the signer's cert. */ + + + +static char *build_list (const char *text, + 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 emergency_cleanup (void); +static int check_special_filename (const char *fname); +static int open_read (const char *filename); +static FILE *open_fwrite (const char *filename); +static void run_protect_tool (int argc, char **argv); + + +static int +our_pk_test_algo (int algo) +{ + return 1; +} + +static int +our_cipher_test_algo (int algo) +{ + return 1; +} + +static int +our_md_test_algo (int algo) +{ + return 1; +} + +static const char * +my_strusage( int level ) +{ + static char *digests, *pubkeys, *ciphers; + const char *p; + + switch (level) + { + case 11: p = "gpgsm (GnuPG)"; + break; + case 13: p = VERSION; break; + case 17: p = PRINTABLE_OS_NAME; break; + case 19: p = _("Please report bugs to <" PACKAGE_BUGREPORT ">.\n"); + break; + case 1: + case 40: p = _("Usage: gpgsm [options] [files] (-h for help)"); + break; + case 41: + p = _("Syntax: gpgsm [options] [files]\n" + "sign, check, encrypt or decrypt using the S/MIME protocol\n" + "default operation depends on the input data\n"); + break; + + case 31: p = "\nHome: "; break; + case 32: p = opt.homedir; break; + case 33: p = _("\nSupported algorithms:\n"); break; + case 34: + if (!ciphers) + ciphers = build_list ("Cipher: ", gcry_cipher_algo_name, + our_cipher_test_algo ); + p = ciphers; + break; + case 35: + if (!pubkeys) + pubkeys = build_list ("Pubkey: ", gcry_pk_algo_name, + our_pk_test_algo ); + p = pubkeys; + break; + case 36: + if (!digests) + digests = build_list("Hash: ", gcry_md_algo_name, our_md_test_algo ); + p = digests; + break; + + default: p = NULL; break; + } + return p; +} + + +static char * +build_list (const char *text, const char * (*mapf)(int), int (*chkf)(int)) +{ + int i; + size_t n=strlen(text)+2; + char *list, *p; + + if (maybe_setuid) { + gcry_control (GCRYCTL_DROP_PRIVS); /* drop setuid */ + } + + for (i=1; i < 110; i++ ) + if (!chkf(i)) + n += strlen(mapf(i)) + 2; + list = xmalloc (21 + n); + *list = 0; + for (p=NULL, i=1; i < 110; i++) + { + if (!chkf(i)) + { + if( !p ) + p = stpcpy (list, text ); + else + p = stpcpy (p, ", "); + p = stpcpy (p, mapf(i) ); + } + } + if (p) + p = stpcpy(p, "\n" ); + return list; +} + + +/* Set the file pointer into binary mode if required. */ +static void +set_binary (FILE *fp) +{ +#ifdef HAVE_DOSISH_SYSTEM + setmode (fileno (fp), O_BINARY); +#endif +} + + + +static void +i18n_init(void) +{ +#ifdef USE_SIMPLE_GETTEXT + set_gettext_file (PACKAGE_GT); +#else +# ifdef ENABLE_NLS + setlocale (LC_ALL, "" ); + bindtextdomain (PACKAGE_GT, LOCALEDIR); + textdomain (PACKAGE_GT); +# endif +#endif +} + + +static void +wrong_args (const char *text) +{ + fputs (_("usage: gpgsm [options] "), stderr); + fputs (text, stderr); + putc ('\n', stderr); + gpgsm_exit (2); +} + + +/* Setup the debugging. With a DEBUG_LEVEL of NULL only the active + debug flags are propagated to the subsystems. With DEBUG_LEVEL + set, a specific set of debug flags is set; and individual debugging + flags will be added on top. */ +static void +set_debug (void) +{ + if (!debug_level) + ; + else if (!strcmp (debug_level, "none")) + opt.debug = 0; + else if (!strcmp (debug_level, "basic")) + opt.debug = DBG_ASSUAN_VALUE; + else if (!strcmp (debug_level, "advanced")) + opt.debug = DBG_ASSUAN_VALUE|DBG_X509_VALUE; + else if (!strcmp (debug_level, "expert")) + opt.debug = (DBG_ASSUAN_VALUE|DBG_X509_VALUE + |DBG_CACHE_VALUE|DBG_CRYPTO_VALUE); + else if (!strcmp (debug_level, "guru")) + opt.debug = ~0; + else + { + log_error (_("invalid debug-level `%s' given\n"), debug_level); + gpgsm_exit(2); + } + + opt.debug |= debug_value; + + if (opt.debug && !opt.verbose) + opt.verbose = 1; + if (opt.debug) + opt.quiet = 0; + + if (opt.debug & DBG_MPI_VALUE) + gcry_control (GCRYCTL_SET_DEBUG_FLAGS, 2); + if (opt.debug & DBG_CRYPTO_VALUE ) + gcry_control (GCRYCTL_SET_DEBUG_FLAGS, 1); + gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose); +} + + + +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 == aClearsign) + || (cmd == aClearsign && new_cmd == aSign) ) + cmd = aClearsign; + else + { + log_error(_("conflicting commands\n")); + gpgsm_exit(2); + } + + *ret_cmd = cmd; +} + + +/* Helper to add recipients to a list. */ +static void +do_add_recipient (ctrl_t ctrl, const char *name, + certlist_t *recplist, int is_encrypt_to) +{ + int rc = gpgsm_add_to_certlist (ctrl, name, 0, recplist, is_encrypt_to); + if (rc) + { + log_error (_("can't encrypt to `%s': %s\n"), name, gpg_strerror (rc)); + gpgsm_status2 (ctrl, STATUS_INV_RECP, + gpg_err_code (rc) == -1? "1": + gpg_err_code (rc) == GPG_ERR_NO_PUBKEY? "1": + gpg_err_code (rc) == GPG_ERR_AMBIGUOUS_NAME? "2": + gpg_err_code (rc) == GPG_ERR_WRONG_KEY_USAGE? "3": + gpg_err_code (rc) == GPG_ERR_CERT_REVOKED? "4": + gpg_err_code (rc) == GPG_ERR_CERT_EXPIRED? "5": + gpg_err_code (rc) == GPG_ERR_NO_CRL_KNOWN? "6": + gpg_err_code (rc) == GPG_ERR_CRL_TOO_OLD? "7": + gpg_err_code (rc) == GPG_ERR_NO_POLICY_MATCH? "8": + "0", + name, NULL); + } +} + + +int +main ( int argc, char **argv) +{ + ARGPARSE_ARGS pargs; + int orig_argc; + char **orig_argv; + const char *fname; + /* char *username;*/ + int may_coredump; + STRLIST sl, remusr= NULL, locusr=NULL; + STRLIST nrings=NULL; + int detached_sig = 0; + FILE *configfp = NULL; + char *configname = NULL; + unsigned configlineno; + int parse_debug = 0; + int no_more_options = 0; + int default_config =1; + int default_keyring = 1; + char *logfile = NULL; + int greeting = 0; + int nogreeting = 0; + int debug_wait = 0; + int use_random_seed = 1; + int with_fpr = 0; + char *def_digest_string = NULL; + enum cmd_and_opt_values cmd = 0; + struct server_control_s ctrl; + CERTLIST recplist = NULL; + CERTLIST signerlist = NULL; + int do_not_setup_keys = 0; + + + /* trap_unaligned ();*/ + set_strusage (my_strusage); + gcry_control (GCRYCTL_SUSPEND_SECMEM_WARN); + /* We don't need any locking in libgcrypt unless we use any kind of + threading. */ + gcry_control (GCRYCTL_DISABLE_INTERNAL_LOCKING); + + /* 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_prefix ("gpgsm", 1); + + /* Try to auto set the character set. */ + set_native_charset (NULL); + + /* Check that the libraries are suitable. Do it here because the + option parse may need services of the library */ + if (!gcry_check_version (NEED_LIBGCRYPT_VERSION) ) + { + log_fatal( _("libgcrypt is too old (need %s, have %s)\n"), + NEED_LIBGCRYPT_VERSION, gcry_check_version (NULL) ); + } + if (!ksba_check_version (NEED_KSBA_VERSION) ) + { + log_fatal( _("libksba is too old (need %s, have %s)\n"), + NEED_KSBA_VERSION, ksba_check_version (NULL) ); + } + +#ifdef HAVE_W32_SYSTEM + /* For W32 we need pth. */ + pth_init (); +#endif + + + gcry_control (GCRYCTL_USE_SECURE_RNDPOOL); + + may_coredump = disable_core_dumps (); + + gnupg_init_signals (0, emergency_cleanup); + + create_dotlock (NULL); /* register locking cleanup */ + i18n_init(); + + opt.def_cipher_algoid = "1.2.840.113549.3.7"; /*des-EDE3-CBC*/ + + opt.homedir = default_homedir (); +#ifdef HAVE_W32_SYSTEM + opt.no_crl_check = 1; +#endif + + /* First 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 config 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) + opt.homedir = pargs.r.ret_str; + else if (pargs.r_opt == aCallProtectTool) + break; /* This break makes sure that --version and --help are + passed to the protect-tool. */ + } + + + /* initialize the secure memory. */ + gcry_control (GCRYCTL_INIT_SECMEM, 16384, 0); + maybe_setuid = 0; + + /* + Now we are now working under our real uid + */ + + ksba_set_malloc_hooks (gcry_malloc, gcry_realloc, gcry_free ); + + assuan_set_malloc_hooks (gcry_malloc, gcry_realloc, gcry_free); + assuan_set_assuan_log_stream (log_get_stream ()); + assuan_set_assuan_log_prefix (log_get_prefix (NULL)); + + keybox_set_malloc_hooks (gcry_malloc, gcry_realloc, gcry_free); + + /* Setup a default control structure for command line mode */ + memset (&ctrl, 0, sizeof ctrl); + gpgsm_init_default_ctrl (&ctrl); + ctrl.no_server = 1; + ctrl.status_fd = -1; /* not status output */ + ctrl.autodetect_encoding = 1; + + /* Set the default option file */ + if (default_config ) + configname = make_filename (opt.homedir, "gpgsm.conf", NULL); + /* Set the default policy file */ + opt.policy_file = make_filename (opt.homedir, "policies.txt", NULL); + + argc = orig_argc; + argv = orig_argv; + pargs.argc = &argc; + pargs.argv = &argv; + pargs.flags = 1; /* do not remove the args */ + + next_pass: + if (configname) { + configlineno = 0; + configfp = fopen (configname, "r"); + 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)); + gpgsm_exit(2); + } + xfree(configname); + configname = NULL; + } + if (parse_debug && configname) + log_info (_("reading options from `%s'\n"), configname); + default_config = 0; + } + + while (!no_more_options + && optfile_parse (configfp, configname, &configlineno, &pargs, opts)) + { + switch (pargs.r_opt) + { + case aGPGConfList: + set_cmd (&cmd, pargs.r_opt); + do_not_setup_keys = 1; + nogreeting = 1; + break; + + case aServer: + opt.batch = 1; + set_cmd (&cmd, aServer); + break; + + case aCallDirmngr: + opt.batch = 1; + set_cmd (&cmd, aCallDirmngr); + do_not_setup_keys = 1; + break; + + case aCallProtectTool: + opt.batch = 1; + set_cmd (&cmd, aCallProtectTool); + no_more_options = 1; /* Stop parsing. */ + do_not_setup_keys = 1; + break; + + case aDeleteKey: + set_cmd (&cmd, aDeleteKey); + /*greeting=1;*/ + do_not_setup_keys = 1; + break; + + case aDetachedSign: + detached_sig = 1; + set_cmd (&cmd, aSign ); + break; + + case aKeygen: + set_cmd (&cmd, aKeygen); + greeting=1; + do_not_setup_keys = 1; + break; + + case aCheckKeys: + case aImport: + case aSendKeys: + case aRecvKeys: + case aExport: + case aExportSecretKeyP12: + case aDumpKeys: + case aDumpExternalKeys: + case aDumpSecretKeys: + case aListKeys: + case aListExternalKeys: + case aListSecretKeys: + case aListSigs: + case aLearnCard: + case aPasswd: + case aKeydbClearSomeCertFlags: + do_not_setup_keys = 1; + set_cmd (&cmd, pargs.r_opt); + break; + + case aSym: + case aDecrypt: + case aEncr: + case aSign: + case aClearsign: + case aVerify: + set_cmd (&cmd, pargs.r_opt); + break; + + /* output encoding selection */ + case oArmor: + ctrl.create_pem = 1; + break; + case oBase64: + ctrl.create_pem = 0; + ctrl.create_base64 = 1; + break; + case oNoArmor: + ctrl.create_pem = 0; + ctrl.create_base64 = 0; + break; + + /* Input encoding selection */ + case oAssumeArmor: + ctrl.autodetect_encoding = 0; + ctrl.is_pem = 1; + ctrl.is_base64 = 0; + break; + case oAssumeBase64: + ctrl.autodetect_encoding = 0; + ctrl.is_pem = 0; + ctrl.is_base64 = 1; + break; + case oAssumeBinary: + ctrl.autodetect_encoding = 0; + ctrl.is_pem = 0; + ctrl.is_base64 = 0; + break; + + case oDisableCRLChecks: + opt.no_crl_check = 1; + break; + case oEnableCRLChecks: + opt.no_crl_check = 0; + break; + case oDisableTrustedCertCRLCheck: + opt.no_trusted_cert_crl_check = 1; + break; + case oEnableTrustedCertCRLCheck: + opt.no_trusted_cert_crl_check = 0; + break; + case oForceCRLRefresh: + opt.force_crl_refresh = 1; + break; + + case oDisableOCSP: + ctrl.use_ocsp = opt.enable_ocsp = 0; + break; + case oEnableOCSP: + ctrl.use_ocsp = opt.enable_ocsp = 1; + break; + + case oIncludeCerts: + ctrl.include_certs = default_include_certs = pargs.r.ret_int; + break; + + case oPolicyFile: + xfree (opt.policy_file); + if (*pargs.r.ret_str) + opt.policy_file = xstrdup (pargs.r.ret_str); + else + opt.policy_file = NULL; + break; + + case oDisablePolicyChecks: + opt.no_policy_check = 1; + break; + case oEnablePolicyChecks: + opt.no_policy_check = 0; + break; + + case oAutoIssuerKeyRetrieve: + opt.auto_issuer_key_retrieve = 1; + break; + + case oOutput: opt.outfile = pargs.r.ret_str; break; + + + case oQuiet: opt.quiet = 1; break; + case oNoTTY: /* fixme:tty_no_terminal(1);*/ break; + case oDryRun: opt.dry_run = 1; break; + + case oVerbose: + opt.verbose++; + gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose); + break; + case oNoVerbose: + opt.verbose = 0; + gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose); + break; + + case oLogFile: logfile = pargs.r.ret_str; break; + case oNoLogFile: logfile = NULL; break; + + case oBatch: + opt.batch = 1; + greeting = 0; + break; + case oNoBatch: opt.batch = 0; 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 oDebug: debug_value |= pargs.r.ret_ulong; break; + case oDebugAll: debug_value = ~0; break; + case oDebugNone: debug_value = 0; break; + case oDebugLevel: debug_level = pargs.r.ret_str; break; + case oDebugWait: debug_wait = pargs.r.ret_int; break; + case oDebugAllowCoreDump: + may_coredump = enable_core_dumps (); + break; + case oDebugNoChainValidation: opt.no_chain_validation = 1; break; + case oDebugIgnoreExpiration: opt.ignore_expiration = 1; break; + case oFixedPassphrase: opt.fixed_passphrase = pargs.r.ret_str; break; + + case oStatusFD: ctrl.status_fd = pargs.r.ret_int; break; + case oLoggerFD: log_set_fd (pargs.r.ret_int ); break; + case oWithMD5Fingerprint: + opt.with_md5_fingerprint=1; /*fall thru*/ + case oWithFingerprint: + with_fpr=1; /*fall thru*/ + case oFingerprint: + opt.fingerprint++; + 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 oNoOptions: break; /* no-options */ + case oHomedir: opt.homedir = pargs.r.ret_str; break; + case oAgentProgram: opt.agent_program = pargs.r.ret_str; break; + case oDisplay: opt.display = xstrdup (pargs.r.ret_str); break; + case oTTYname: opt.ttyname = xstrdup (pargs.r.ret_str); break; + case oTTYtype: opt.ttytype = xstrdup (pargs.r.ret_str); break; + case oLCctype: opt.lc_ctype = xstrdup (pargs.r.ret_str); break; + case oLCmessages: opt.lc_messages = xstrdup (pargs.r.ret_str); break; + case oDirmngrProgram: opt.dirmngr_program = pargs.r.ret_str; break; + case oPreferSystemDirmngr: opt.prefer_system_dirmngr = 1; break; + case oProtectToolProgram: + opt.protect_tool_program = pargs.r.ret_str; + break; + + case oFakedSystemTime: + gnupg_set_time ( (time_t)pargs.r.ret_ulong, 0); + break; + + case oNoDefKeyring: default_keyring = 0; break; + case oNoGreeting: nogreeting = 1; break; + + case oDefaultKey: + /* fixme:opt.def_secret_key = pargs.r.ret_str;*/ + log_info ("WARNING: --default-key has not yet been implemented\n"); + break; + case oDefRecipient: + if (*pargs.r.ret_str) + opt.def_recipient = xstrdup (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 oWithKeyData: opt.with_key_data=1; /* fall thru */ + case oWithColons: ctrl.with_colons = 1; break; + case oWithValidation: ctrl.with_validation=1; break; + case oWithEphemeralKeys: opt.with_ephemeral_keys=1; break; + + case oSkipVerify: opt.skip_verify=1; break; + + case oNoEncryptTo: opt.no_encrypt_to = 1; break; + case oEncryptTo: /* Store the recipient in the second list */ + sl = add_to_strlist (&remusr, pargs.r.ret_str); + sl->flags = 1; + break; + + case oRecipient: /* store the recipient */ + add_to_strlist ( &remusr, pargs.r.ret_str); + break; + + case oTextmodeShort: /*fixme:opt.textmode = 2;*/ break; + case oTextmode: /*fixme:opt.textmode=1;*/ break; + + case oUser: /* store the local users, the first one is the default */ + if (!opt.local_user) + opt.local_user = pargs.r.ret_str; + add_to_strlist (&locusr, pargs.r.ret_str); + break; + + case oNoSecmemWarn: + gcry_control (GCRYCTL_DISABLE_SECMEM_WARN); + break; + + case oCipherAlgo: + opt.def_cipher_algoid = pargs.r.ret_str; + break; + + case oDisableCipherAlgo: + { + int algo = gcry_cipher_map_name (pargs.r.ret_str); + gcry_cipher_ctl (NULL, GCRYCTL_DISABLE_ALGO, &algo, sizeof algo); + } + break; + case oDisablePubkeyAlgo: + { + int algo = gcry_pk_map_name (pargs.r.ret_str); + gcry_pk_ctl (GCRYCTL_DISABLE_ALGO,&algo, sizeof algo ); + } + break; + + case oIgnoreTimeConflict: opt.ignore_time_conflict = 1; break; + case oNoRandomSeedFile: use_random_seed = 0; break; + + case oEnableSpecialFilenames: allow_special_filenames =1; break; + + + case aDummy: + break; + default: + pargs.err = configfp? 1:2; + break; + } + } + + if (configfp) + { + fclose (configfp); + configfp = NULL; + /* Keep a copy of the config filename. */ + opt.config_filename = configname; + configname = NULL; + goto next_pass; + } + xfree (configname); + configname = NULL; + + if (!opt.config_filename) + opt.config_filename = make_filename (opt.homedir, "gpgsm.conf", NULL); + + if (log_get_errorcount(0)) + gpgsm_exit(2); + + 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) + { + log_info ("NOTE: THIS IS A DEVELOPMENT VERSION!\n"); + log_info ("It is only intended for test purposes and should NOT be\n"); + log_info ("used in a production environment or with production keys!\n"); + } +# endif + + if (may_coredump && !opt.quiet) + log_info (_("WARNING: program may create a core file!\n")); + +/* if (opt.qualsig_approval && !opt.quiet) */ +/* log_info (_("This software has offically been approved to " */ +/* "create and verify\n" */ +/* "qualified signatures according to German law.\n")); */ + + if (logfile && cmd == aServer) + { + log_set_file (logfile); + log_set_prefix (NULL, 1|2|4); + } + + if (gnupg_faked_time_p ()) + { + gnupg_isotime_t tbuf; + + log_info (_("WARNING: running with faked system time: ")); + gnupg_get_isotime (tbuf); + gpgsm_dump_time (tbuf); + log_printf ("\n"); + } + +/*FIXME if (opt.batch) */ +/* tty_batchmode (1); */ + + gcry_control (GCRYCTL_RESUME_SECMEM_WARN); + + set_debug (); + + /* Although we alwasy use gpgsm_exit, we better install a regualr + exit handler so that at least the secure memory gets wiped + out. */ + if (atexit (emergency_cleanup)) + { + log_error ("atexit failed\n"); + gpgsm_exit (2); + } + + /* Must do this after dropping setuid, because the mapping functions + may try to load an module and we may have disabled an algorithm. */ + if ( !gcry_cipher_map_name (opt.def_cipher_algoid) + || !gcry_cipher_mode_from_oid (opt.def_cipher_algoid)) + log_error (_("selected cipher algorithm is invalid\n")); + + if (def_digest_string) + { + opt.def_digest_algo = gcry_md_map_name (def_digest_string); + xfree (def_digest_string); + def_digest_string = NULL; + if (our_md_test_algo(opt.def_digest_algo) ) + log_error (_("selected digest algorithm is invalid\n")); + } + + if (log_get_errorcount(0)) + gpgsm_exit(2); + + /* Set the random seed file. */ + if (use_random_seed) { + char *p = make_filename (opt.homedir, "random_seed", NULL); + gcry_control (GCRYCTL_SET_RANDOM_SEED_FILE, p); + xfree(p); + } + + + if (!cmd && opt.fingerprint && !with_fpr) + set_cmd (&cmd, aListKeys); + + if (!nrings && default_keyring) /* add default keybox */ + keydb_add_resource ("pubring.kbx", 0, 0); + for (sl = nrings; sl; sl = sl->next) + keydb_add_resource (sl->d, 0, 0); + FREE_STRLIST(nrings); + + if (!do_not_setup_keys) + { + for (sl = locusr; sl ; sl = sl->next) + { + int rc = gpgsm_add_to_certlist (&ctrl, sl->d, 1, &signerlist, 0); + if (rc) + { + log_error (_("can't sign using `%s': %s\n"), + sl->d, gpg_strerror (rc)); + gpgsm_status2 (&ctrl, STATUS_INV_RECP, + gpg_err_code (rc) == -1? "1": + gpg_err_code (rc) == GPG_ERR_NO_PUBKEY? "1": + gpg_err_code (rc) == GPG_ERR_AMBIGUOUS_NAME? "2": + gpg_err_code (rc) == GPG_ERR_WRONG_KEY_USAGE? "3": + gpg_err_code (rc) == GPG_ERR_CERT_REVOKED? "4": + gpg_err_code (rc) == GPG_ERR_CERT_EXPIRED? "5": + gpg_err_code (rc) == GPG_ERR_NO_CRL_KNOWN? "6": + gpg_err_code (rc) == GPG_ERR_CRL_TOO_OLD? "7": + gpg_err_code (rc) == GPG_ERR_NO_POLICY_MATCH? "8": + gpg_err_code (rc) == GPG_ERR_NO_SECKEY? "9": + "0", + sl->d, NULL); + } + } + + /* Build the recipient list. We first add the regular ones and then + the encrypt-to ones because the underlying function will silenty + ignore duplicates and we can't allow to keep a duplicate which is + flagged as encrypt-to as the actually encrypt function would then + complain about no (regular) recipients. */ + for (sl = remusr; sl; sl = sl->next) + if (!(sl->flags & 1)) + do_add_recipient (&ctrl, sl->d, &recplist, 0); + if (!opt.no_encrypt_to) + { + for (sl = remusr; sl; sl = sl->next) + if ((sl->flags & 1)) + do_add_recipient (&ctrl, sl->d, &recplist, 1); + } + } + + if (log_get_errorcount(0)) + gpgsm_exit(1); /* must stop for invalid recipients */ + + fname = argc? *argv : NULL; + + switch (cmd) + { + case aGPGConfList: + { /* List options and default values in the GPG Conf format. */ + + /* The following list is taken from gnupg/tools/gpgconf-comp.c. */ + /* Option flags. YOU MUST NOT CHANGE THE NUMBERS OF THE EXISTING + FLAGS, AS THEY ARE PART OF THE EXTERNAL INTERFACE. */ +#define GC_OPT_FLAG_NONE 0UL + /* The RUNTIME flag for an option indicates that the option can be + changed at runtime. */ +#define GC_OPT_FLAG_RUNTIME (1UL << 3) + /* The DEFAULT flag for an option indicates that the option has a + default value. */ +#define GC_OPT_FLAG_DEFAULT (1UL << 4) + /* The DEF_DESC flag for an option indicates that the option has a + default, which is described by the value of the default field. */ +#define GC_OPT_FLAG_DEF_DESC (1UL << 5) + /* The NO_ARG_DESC flag for an option indicates that the argument has + a default, which is described by the value of the ARGDEF field. */ +#define GC_OPT_FLAG_NO_ARG_DESC (1UL << 6) + + printf ("gpgconf-gpgsm.conf:%lu:\"%s\n", + GC_OPT_FLAG_DEFAULT, opt.config_filename); + + printf ("verbose:%lu:\n" + "quiet:%lu:\n" + "debug-level:%lu:\"none:\n" + "log-file:%lu:\n", + GC_OPT_FLAG_NONE, + GC_OPT_FLAG_NONE, + GC_OPT_FLAG_DEFAULT, + GC_OPT_FLAG_NONE ); + printf ("disable-crl-checks:%lu:\n", + GC_OPT_FLAG_NONE ); + printf ("disable-trusted-cert-crl-check:%lu:\n", + GC_OPT_FLAG_NONE ); + printf ("enable-ocsp:%lu:\n", + GC_OPT_FLAG_NONE ); + printf ("include-certs:%lu:1:\n", + GC_OPT_FLAG_DEFAULT ); + printf ("disable-policy-checks:%lu:\n", + GC_OPT_FLAG_NONE ); + printf ("auto-issuer-key-retrieve:%lu:\n", + GC_OPT_FLAG_NONE ); + printf ("prefer-system-dirmngr:%lu:\n", + GC_OPT_FLAG_NONE ); + + } + break; + + case aServer: + if (debug_wait) + { + log_debug ("waiting for debugger - my pid is %u .....\n", + (unsigned int)getpid()); + sleep (debug_wait); + log_debug ("... okay\n"); + } + gpgsm_server (recplist); + break; + + case aCallDirmngr: + if (!argc) + wrong_args ("--call-dirmngr <command> {args}"); + else + if (gpgsm_dirmngr_run_command (&ctrl, *argv, argc-1, argv+1)) + gpgsm_exit (1); + break; + + case aCallProtectTool: + run_protect_tool (argc, argv); + break; + + case aEncr: /* encrypt the given file */ + set_binary (stdin); + set_binary (stdout); + if (!argc) + gpgsm_encrypt (&ctrl, recplist, 0, stdout); /* from stdin */ + else if (argc == 1) + gpgsm_encrypt (&ctrl, recplist, open_read (*argv), stdout); /* from file */ + else + wrong_args ("--encrypt [datafile]"); + break; + + case aSign: /* sign the given file */ + /* FIXME: We don't handle --output yet. We should also allow + to concatenate multiple files for signing because that is + what gpg does.*/ + set_binary (stdin); + set_binary (stdout); + if (!argc) + gpgsm_sign (&ctrl, signerlist, + 0, detached_sig, stdout); /* create from stdin */ + else if (argc == 1) + gpgsm_sign (&ctrl, signerlist, + open_read (*argv), detached_sig, stdout); /* from file */ + else + wrong_args ("--sign [datafile]"); + break; + + case aSignEncr: /* sign and encrypt the given file */ + log_error ("this command has not yet been implemented\n"); + break; + + case aClearsign: /* make a clearsig */ + log_error ("this command has not yet been implemented\n"); + break; + + case aVerify: + { + FILE *fp = NULL; + + set_binary (stdin); + if (argc == 2 && opt.outfile) + log_info ("option --output ignored for a detached signature\n"); + else if (opt.outfile) + fp = open_fwrite (opt.outfile); + + if (!argc) + gpgsm_verify (&ctrl, 0, -1, fp); /* normal signature from stdin */ + else if (argc == 1) + gpgsm_verify (&ctrl, open_read (*argv), -1, fp); /* std signature */ + else if (argc == 2) /* detached signature (sig, detached) */ + gpgsm_verify (&ctrl, open_read (*argv), open_read (argv[1]), NULL); + else + wrong_args ("--verify [signature [detached_data]]"); + + if (fp && fp != stdout) + fclose (fp); + } + break; + + case aVerifyFiles: + log_error (_("this command has not yet been implemented\n")); + break; + + case aDecrypt: + set_binary (stdin); + set_binary (stdout); + if (!argc) + gpgsm_decrypt (&ctrl, 0, stdout); /* from stdin */ + else if (argc == 1) + gpgsm_decrypt (&ctrl, open_read (*argv), stdout); /* from file */ + else + wrong_args ("--decrypt [filename]"); + break; + + case aDeleteKey: + for (sl=NULL; argc; argc--, argv++) + add_to_strlist (&sl, *argv); + gpgsm_delete (&ctrl, sl); + free_strlist(sl); + break; + + case aListSigs: + ctrl.with_chain = 1; + case aListKeys: + for (sl=NULL; argc; argc--, argv++) + add_to_strlist (&sl, *argv); + gpgsm_list_keys (&ctrl, sl, stdout, (0 | (1<<6))); + free_strlist(sl); + break; + + case aDumpKeys: + for (sl=NULL; argc; argc--, argv++) + add_to_strlist (&sl, *argv); + gpgsm_list_keys (&ctrl, sl, stdout, (256 | (1<<6))); + free_strlist(sl); + break; + + case aListExternalKeys: + for (sl=NULL; argc; argc--, argv++) + add_to_strlist (&sl, *argv); + gpgsm_list_keys (&ctrl, sl, stdout, + (0 | (1<<7))); + free_strlist(sl); + break; + + case aDumpExternalKeys: + for (sl=NULL; argc; argc--, argv++) + add_to_strlist (&sl, *argv); + gpgsm_list_keys (&ctrl, sl, stdout, + (256 | (1<<7))); + free_strlist(sl); + break; + + case aListSecretKeys: + for (sl=NULL; argc; argc--, argv++) + add_to_strlist (&sl, *argv); + gpgsm_list_keys (&ctrl, sl, stdout, (2 | (1<<6))); + free_strlist(sl); + break; + + case aDumpSecretKeys: + for (sl=NULL; argc; argc--, argv++) + add_to_strlist (&sl, *argv); + gpgsm_list_keys (&ctrl, sl, stdout, (256 | 2 | (1<<6))); + free_strlist(sl); + break; + + case aKeygen: /* generate a key */ + log_error ("this function is not yet available from the commandline\n"); + break; + + case aImport: + gpgsm_import_files (&ctrl, argc, argv, open_read); + break; + + case aExport: + set_binary (stdout); + for (sl=NULL; argc; argc--, argv++) + add_to_strlist (&sl, *argv); + gpgsm_export (&ctrl, sl, stdout); + free_strlist(sl); + break; + + case aExportSecretKeyP12: + set_binary (stdout); + if (argc == 1) + gpgsm_p12_export (&ctrl, *argv, stdout); + else + wrong_args ("--export-secret-key-p12 KEY-ID"); + break; + + case aSendKeys: + case aRecvKeys: + log_error ("this command has not yet been implemented\n"); + break; + + + case aLearnCard: + if (argc) + wrong_args ("--learn-card"); + else + { + int rc = gpgsm_agent_learn (&ctrl); + if (rc) + log_error ("error learning card: %s\n", gpg_strerror (rc)); + } + break; + + case aPasswd: + if (argc != 1) + wrong_args ("--passwd <key-Id>"); + else + { + int rc; + ksba_cert_t cert = NULL; + char *grip = NULL; + + rc = gpgsm_find_cert (*argv, NULL, &cert); + if (rc) + ; + else if (!(grip = gpgsm_get_keygrip_hexstring (cert))) + rc = gpg_error (GPG_ERR_BUG); + else + { + char *desc = gpgsm_format_keydesc (cert); + rc = gpgsm_agent_passwd (&ctrl, grip, desc); + xfree (desc); + } + if (rc) + log_error ("error changing passphrase: %s\n", gpg_strerror (rc)); + xfree (grip); + ksba_cert_release (cert); + } + break; + + case aKeydbClearSomeCertFlags: + for (sl=NULL; argc; argc--, argv++) + add_to_strlist (&sl, *argv); + keydb_clear_some_cert_flags (&ctrl, sl); + free_strlist(sl); + break; + + + default: + log_error ("invalid command (there is no implicit command)\n"); + break; + } + + /* cleanup */ + gpgsm_release_certlist (recplist); + gpgsm_release_certlist (signerlist); + FREE_STRLIST(remusr); + FREE_STRLIST(locusr); + gpgsm_exit(0); + return 8; /*NEVER REACHED*/ +} + +/* Note: This function is used by signal handlers!. */ +static void +emergency_cleanup (void) +{ + gcry_control (GCRYCTL_TERM_SECMEM ); +} + + +void +gpgsm_exit (int rc) +{ + gcry_control (GCRYCTL_UPDATE_RANDOM_SEED_FILE); + if (opt.debug & DBG_MEMSTAT_VALUE) + { + gcry_control( GCRYCTL_DUMP_MEMORY_STATS ); + gcry_control( GCRYCTL_DUMP_RANDOM_STATS ); + } + if (opt.debug) + gcry_control (GCRYCTL_DUMP_SECMEM_STATS ); + emergency_cleanup (); + rc = rc? rc : log_get_errorcount(0)? 2 : gpgsm_errors_seen? 1 : 0; + exit (rc); +} + + +void +gpgsm_init_default_ctrl (struct server_control_s *ctrl) +{ + ctrl->include_certs = default_include_certs; + ctrl->use_ocsp = opt.enable_ocsp; +} + + + +/* Check whether the filename has the form "-&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 (allow_special_filenames + && fname && *fname == '-' && fname[1] == '&' ) { + int i; + + fname += 2; + for (i=0; isdigit (fname[i]); i++ ) + ; + if ( !fname[i] ) + return atoi (fname); + } + return -1; +} + + + +/* Open the FILENAME for read and return the filedescriptor. Stop + with an error message in case of problems. "-" denotes stdin and + if special filenames are allowed the given fd is opened instead. */ +static int +open_read (const char *filename) +{ + int fd; + + if (filename[0] == '-' && !filename[1]) + { + set_binary (stdin); + return 0; /* stdin */ + } + fd = check_special_filename (filename); + if (fd != -1) + return fd; + fd = open (filename, O_RDONLY | O_BINARY); + if (fd == -1) + { + log_error (_("can't open `%s': %s\n"), filename, strerror (errno)); + gpgsm_exit (2); + } + return fd; +} + +/* Open FILENAME for fwrite and return the stream. Stop with an error + message in case of problems. "-" denotes stdout and if special + filenames are allowed the given fd is opened instead. Caller must + close the returned stream unless it is stdout. */ +static FILE * +open_fwrite (const char *filename) +{ + int fd; + FILE *fp; + + if (filename[0] == '-' && !filename[1]) + { + set_binary (stdout); + return stdout; + } + + fd = check_special_filename (filename); + if (fd != -1) + { + fp = fdopen (dup (fd), "wb"); + if (!fp) + { + log_error ("fdopen(%d) failed: %s\n", fd, strerror (errno)); + gpgsm_exit (2); + } + set_binary (fp); + return fp; + } + fp = fopen (filename, "wb"); + if (!fp) + { + log_error (_("can't open `%s': %s\n"), filename, strerror (errno)); + gpgsm_exit (2); + } + return fp; +} + + +static void +run_protect_tool (int argc, char **argv) +{ +#ifndef HAVE_W32_SYSTEM + const char *pgm; + char **av; + int i; + + if (!opt.protect_tool_program || !*opt.protect_tool_program) + pgm = GNUPG_DEFAULT_PROTECT_TOOL; + else + pgm = opt.protect_tool_program; + + av = xcalloc (argc+2, sizeof *av); + av[0] = strrchr (pgm, '/'); + if (!av[0]) + av[0] = xstrdup (pgm); + for (i=1; argc; i++, argc--, argv++) + av[i] = *argv; + av[i] = NULL; + execv (pgm, av); + log_error ("error executing `%s': %s\n", pgm, strerror (errno)); +#endif /*HAVE_W32_SYSTEM*/ + gpgsm_exit (2); +} diff --git a/sm/gpgsm.h b/sm/gpgsm.h new file mode 100644 index 000000000..0d9bac560 --- /dev/null +++ b/sm/gpgsm.h @@ -0,0 +1,342 @@ +/* gpgsm.h - Global definitions for GpgSM + * Copyright (C) 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. + */ + +#ifndef GPGSM_H +#define GPGSM_H + +#ifdef GPG_ERR_SOURCE_DEFAULT +#error GPG_ERR_SOURCE_DEFAULT already defined +#endif +#define GPG_ERR_SOURCE_DEFAULT GPG_ERR_SOURCE_GPGSM +#include <gpg-error.h> +#define map_assuan_err(a) \ + map_assuan_err_with_source (GPG_ERR_SOURCE_DEFAULT, (a)) + + +#include <ksba.h> +#include "../common/util.h" +#include "../common/errors.h" + +#define OUT_OF_CORE(a) (gpg_error (gpg_err_code_from_errno ((a)))) + +#define MAX_DIGEST_LEN 24 + +/* A large struct named "opt" to keep global flags */ +struct { + unsigned int debug; /* debug flags (DBG_foo_VALUE) */ + int verbose; /* verbosity level */ + int quiet; /* be as quiet as possible */ + int batch; /* run in batch mode, i.e w/o any user interaction */ + int answer_yes; /* assume yes on most questions */ + int answer_no; /* assume no on most questions */ + int dry_run; /* don't change any persistent data */ + + const char *homedir; /* Configuration directory name */ + const char *config_filename; /* Name of the used config file. */ + const char *agent_program; + char *display; + char *ttyname; + char *ttytype; + char *lc_ctype; + char *lc_messages; + + const char *dirmngr_program; + int prefer_system_dirmngr; /* Prefer using a system wide drimngr. */ + const char *protect_tool_program; + char *outfile; /* name of output file */ + + int with_key_data;/* include raw key in the column delimted output */ + + int fingerprint; /* list fingerprints in all key listings */ + + int with_md5_fingerprint; /* Also print an MD5 fingerprint for + standard key listings. */ + + int with_ephemeral_keys; /* Include ephemeral flagged keys in the + keylisting. */ + + int armor; /* force base64 armoring (see also ctrl.with_base64) */ + int no_armor; /* don't try to figure out whether data is base64 armored*/ + + const char *def_cipher_algoid; /* cipher algorithm to use if + nothing else is specified */ + + int def_digest_algo; /* Ditto for hash algorithm */ + int def_compress_algo; /* Ditto for compress algorithm */ + + char *def_recipient; /* userID of the default recipient */ + int def_recipient_self; /* The default recipient is the default key */ + + int no_encrypt_to; /* Ignore all as encrypt to marked recipients. */ + + char *local_user; /* NULL or argument to -u */ + + int always_trust; /* Trust the given keys even if there is no + valid certification chain */ + int skip_verify; /* do not check signatures on data */ + + int lock_once; /* Keep lock once they are set */ + + int ignore_time_conflict; /* Ignore certain time conflicts */ + + int no_crl_check; /* Don't do a CRL check */ + int no_trusted_cert_crl_check; /* Don't run a CRL check for trusted certs. */ + int force_crl_refresh; /* Force refreshing the CRL. */ + int enable_ocsp; /* Default to use OCSP checks. */ + + char *policy_file; /* full pathname of policy file */ + int no_policy_check; /* ignore certificate policies */ + int no_chain_validation; /* Bypass all cert chain validity tests */ + int ignore_expiration; /* Ignore the notAfter validity checks. */ + char *fixed_passphrase; /* Passphrase used by regression tests. */ + + int auto_issuer_key_retrieve; /* try to retrieve a missing issuer key. */ + + int qualsig_approval; /* Set to true if this software has + officially been approved to create an + verify qualified signatures. This is a + runtime option in case we want to check + the integrity of the software at + runtime. */ +} opt; + + +#define DBG_X509_VALUE 1 /* debug x.509 data reading/writing */ +#define DBG_MPI_VALUE 2 /* debug mpi details */ +#define DBG_CRYPTO_VALUE 4 /* debug low level crypto */ +#define DBG_MEMORY_VALUE 32 /* debug memory allocation stuff */ +#define DBG_CACHE_VALUE 64 /* debug the caching */ +#define DBG_MEMSTAT_VALUE 128 /* show memory statistics */ +#define DBG_HASHING_VALUE 512 /* debug hashing operations */ +#define DBG_ASSUAN_VALUE 1024 /* debug assuan communication */ + +#define DBG_X509 (opt.debug & DBG_X509_VALUE) +#define DBG_CRYPTO (opt.debug & DBG_CRYPTO_VALUE) +#define DBG_MEMORY (opt.debug & DBG_MEMORY_VALUE) +#define DBG_CACHE (opt.debug & DBG_CACHE_VALUE) +#define DBG_HASHING (opt.debug & DBG_HASHING_VALUE) +#define DBG_ASSUAN (opt.debug & DBG_ASSUAN_VALUE) + +struct server_local_s; + +/* Note that the default values for this are set by + gpgsm_init_default_ctrl() */ +struct server_control_s { + int no_server; /* We are not running under server control */ + int status_fd; /* Only for non-server mode */ + struct server_local_s *server_local; + int with_colons; /* Use column delimited output format */ + int with_chain; /* Include the certifying certs in a listing */ + int with_validation;/* Validate each key while listing. */ + + int autodetect_encoding; /* Try to detect the input encoding */ + int is_pem; /* Is in PEM format */ + int is_base64; /* is in plain base-64 format */ + + int create_base64; /* Create base64 encoded output */ + int create_pem; /* create PEM output */ + const char *pem_name; /* PEM name to use */ + + int include_certs; /* -1 to send all certificates in the chain + along with a signature or the number of + certificates up the chain (0 = none, 1 = only + signer) */ + int use_ocsp; /* Set to true if OCSP should be used. */ +}; +typedef struct server_control_s *CTRL; +typedef struct server_control_s *ctrl_t; + +/* data structure used in base64.c */ +typedef struct base64_context_s *Base64Context; + + +struct certlist_s { + struct certlist_s *next; + ksba_cert_t cert; + int is_encrypt_to; /* True if the certificate has been set through + the --encrypto-to option. */ +}; +typedef struct certlist_s *CERTLIST; +typedef struct certlist_s *certlist_t; + +/*-- gpgsm.c --*/ +void gpgsm_exit (int rc); +void gpgsm_init_default_ctrl (struct server_control_s *ctrl); + +/*-- server.c --*/ +void gpgsm_server (certlist_t default_recplist); +gpg_error_t gpgsm_status (ctrl_t ctrl, int no, const char *text); +gpg_error_t gpgsm_status2 (ctrl_t ctrl, int no, ...); +gpg_error_t gpgsm_status_with_err_code (ctrl_t ctrl, int no, const char *text, + gpg_err_code_t ec); + +/*-- fingerprint --*/ +unsigned char *gpgsm_get_fingerprint (ksba_cert_t cert, int algo, + unsigned char *array, int *r_len); +char *gpgsm_get_fingerprint_string (ksba_cert_t cert, int algo); +char *gpgsm_get_fingerprint_hexstring (ksba_cert_t cert, int algo); +unsigned long gpgsm_get_short_fingerprint (ksba_cert_t cert); +unsigned char *gpgsm_get_keygrip (ksba_cert_t cert, unsigned char *array); +char *gpgsm_get_keygrip_hexstring (ksba_cert_t cert); +int gpgsm_get_key_algo_info (ksba_cert_t cert, unsigned int *nbits); +char *gpgsm_get_certid (ksba_cert_t cert); + + +/*-- base64.c --*/ +int gpgsm_create_reader (Base64Context *ctx, + ctrl_t ctrl, FILE *fp, int allow_multi_pem, + ksba_reader_t *r_reader); +int gpgsm_reader_eof_seen (Base64Context ctx); +void gpgsm_destroy_reader (Base64Context ctx); +int gpgsm_create_writer (Base64Context *ctx, + ctrl_t ctrl, FILE *fp, ksba_writer_t *r_writer); +int gpgsm_finish_writer (Base64Context ctx); +void gpgsm_destroy_writer (Base64Context ctx); + + +/*-- certdump.c --*/ +void gpgsm_print_serial (FILE *fp, ksba_const_sexp_t p); +void gpgsm_print_time (FILE *fp, ksba_isotime_t t); +void gpgsm_print_name2 (FILE *fp, const char *string, int translate); +void gpgsm_print_name (FILE *fp, const char *string); + +void gpgsm_cert_log_name (const char *text, ksba_cert_t cert); + +void gpgsm_dump_cert (const char *text, ksba_cert_t cert); +void gpgsm_dump_serial (ksba_const_sexp_t p); +void gpgsm_dump_time (ksba_isotime_t t); +void gpgsm_dump_string (const char *string); + +char *gpgsm_format_serial (ksba_const_sexp_t p); +char *gpgsm_format_name2 (const char *name, int translate); +char *gpgsm_format_name (const char *name); + +char *gpgsm_format_keydesc (ksba_cert_t cert); + + +/*-- certcheck.c --*/ +int gpgsm_check_cert_sig (ksba_cert_t issuer_cert, ksba_cert_t cert); +int gpgsm_check_cms_signature (ksba_cert_t cert, ksba_const_sexp_t sigval, + gcry_md_hd_t md, int hash_algo); +/* fixme: move create functions to another file */ +int gpgsm_create_cms_signature (ctrl_t ctrl, + ksba_cert_t cert, gcry_md_hd_t md, int mdalgo, + unsigned char **r_sigval); + + +/*-- certchain.c --*/ +int gpgsm_walk_cert_chain (ksba_cert_t start, ksba_cert_t *r_next); +int gpgsm_is_root_cert (ksba_cert_t cert); +int gpgsm_validate_chain (ctrl_t ctrl, ksba_cert_t cert, + ksba_isotime_t r_exptime, + int listmode, FILE *listfp, + unsigned int flags); +int gpgsm_basic_cert_check (ksba_cert_t cert); + +/*-- certlist.c --*/ +int gpgsm_cert_use_sign_p (ksba_cert_t cert); +int gpgsm_cert_use_encrypt_p (ksba_cert_t cert); +int gpgsm_cert_use_verify_p (ksba_cert_t cert); +int gpgsm_cert_use_decrypt_p (ksba_cert_t cert); +int gpgsm_cert_use_cert_p (ksba_cert_t cert); +int gpgsm_cert_use_ocsp_p (ksba_cert_t cert); +int gpgsm_add_cert_to_certlist (ctrl_t ctrl, ksba_cert_t cert, + certlist_t *listaddr, int is_encrypt_to); +int gpgsm_add_to_certlist (ctrl_t ctrl, const char *name, int secret, + certlist_t *listaddr, int is_encrypt_to); +void gpgsm_release_certlist (certlist_t list); +int gpgsm_find_cert (const char *name, ksba_sexp_t keyid, ksba_cert_t *r_cert); + +/*-- keylist.c --*/ +gpg_error_t gpgsm_list_keys (ctrl_t ctrl, STRLIST names, + FILE *fp, unsigned int mode); + +/*-- import.c --*/ +int gpgsm_import (ctrl_t ctrl, int in_fd); +int gpgsm_import_files (ctrl_t ctrl, int nfiles, char **files, + int (*of)(const char *fname)); + +/*-- export.c --*/ +void gpgsm_export (ctrl_t ctrl, STRLIST names, FILE *fp); +void gpgsm_p12_export (ctrl_t ctrl, const char *name, FILE *fp); + +/*-- delete.c --*/ +int gpgsm_delete (ctrl_t ctrl, STRLIST names); + +/*-- verify.c --*/ +int gpgsm_verify (ctrl_t ctrl, int in_fd, int data_fd, FILE *out_fp); + +/*-- sign.c --*/ +int gpgsm_get_default_cert (ctrl_t ctrl, ksba_cert_t *r_cert); +int gpgsm_sign (ctrl_t ctrl, CERTLIST signerlist, + int data_fd, int detached, FILE *out_fp); + +/*-- encrypt.c --*/ +int gpgsm_encrypt (ctrl_t ctrl, CERTLIST recplist, int in_fd, FILE *out_fp); + +/*-- decrypt.c --*/ +int gpgsm_decrypt (ctrl_t ctrl, int in_fd, FILE *out_fp); + +/*-- certreqgen.c --*/ +int gpgsm_genkey (ctrl_t ctrl, int in_fd, FILE *out_fp); + +/*-- qualified.c --*/ +gpg_error_t gpgsm_is_in_qualified_list (ctrl_t ctrl, ksba_cert_t cert, + char *country); +gpg_error_t gpgsm_qualified_consent (ctrl_t ctrl, ksba_cert_t cert); +gpg_error_t gpgsm_not_qualified_warning (ctrl_t ctrl, ksba_cert_t cert); + +/*-- call-agent.c --*/ +int gpgsm_agent_pksign (ctrl_t ctrl, const char *keygrip, const char *desc, + unsigned char *digest, + size_t digestlen, + int digestalgo, + unsigned char **r_buf, size_t *r_buflen); +int gpgsm_agent_pkdecrypt (ctrl_t ctrl, const char *keygrip, const char *desc, + ksba_const_sexp_t ciphertext, + char **r_buf, size_t *r_buflen); +int gpgsm_agent_genkey (ctrl_t ctrl, + ksba_const_sexp_t keyparms, ksba_sexp_t *r_pubkey); +int gpgsm_agent_readkey (ctrl_t ctrl, const char *hexkeygrip, + ksba_sexp_t *r_pubkey); +int gpgsm_agent_istrusted (ctrl_t ctrl, ksba_cert_t cert); +int gpgsm_agent_havekey (ctrl_t ctrl, const char *hexkeygrip); +int gpgsm_agent_marktrusted (ctrl_t ctrl, ksba_cert_t cert); +int gpgsm_agent_learn (ctrl_t ctrl); +int gpgsm_agent_passwd (ctrl_t ctrl, const char *hexkeygrip, const char *desc); +gpg_error_t gpgsm_agent_get_confirmation (ctrl_t ctrl, const char *desc); + +/*-- call-dirmngr.c --*/ +int gpgsm_dirmngr_isvalid (ctrl_t ctrl, + ksba_cert_t cert, ksba_cert_t issuer_cert, + int use_ocsp); +int gpgsm_dirmngr_lookup (ctrl_t ctrl, STRLIST names, + void (*cb)(void*, ksba_cert_t), void *cb_value); +int gpgsm_dirmngr_run_command (ctrl_t ctrl, const char *command, + int argc, char **argv); + + +/*-- misc.c --*/ +void setup_pinentry_env (void); + + + +#endif /*GPGSM_H*/ diff --git a/sm/import.c b/sm/import.c new file mode 100644 index 000000000..b56014a1a --- /dev/null +++ b/sm/import.c @@ -0,0 +1,663 @@ +/* import.c - Import certificates + * Copyright (C) 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 <unistd.h> + +#include "gpgsm.h" +#include <gcrypt.h> +#include <ksba.h> + +#include "keydb.h" +#include "exechelp.h" +#include "i18n.h" + +struct stats_s { + unsigned long count; + unsigned long imported; + unsigned long unchanged; + unsigned long not_imported; + unsigned long secret_read; + unsigned long secret_imported; + unsigned long secret_dups; + }; + + +static gpg_error_t parse_p12 (ctrl_t ctrl, ksba_reader_t reader, FILE **retfp, + struct stats_s *stats); + + + +static void +print_imported_status (CTRL ctrl, ksba_cert_t cert, int new_cert) +{ + char *fpr; + + fpr = gpgsm_get_fingerprint_hexstring (cert, GCRY_MD_SHA1); + if (new_cert) + gpgsm_status2 (ctrl, STATUS_IMPORTED, fpr, "[X.509]", NULL); + + gpgsm_status2 (ctrl, STATUS_IMPORT_OK, + new_cert? "1":"0", fpr, NULL); + + xfree (fpr); +} + + +/* Print an IMPORT_PROBLEM status. REASON is one of: + 0 := "No specific reason given". + 1 := "Invalid Certificate". + 2 := "Issuer Certificate missing". + 3 := "Certificate Chain too long". + 4 := "Error storing certificate". +*/ +static void +print_import_problem (CTRL ctrl, ksba_cert_t cert, int reason) +{ + char *fpr = NULL; + char buf[25]; + int i; + + sprintf (buf, "%d", reason); + if (cert) + { + fpr = gpgsm_get_fingerprint_hexstring (cert, GCRY_MD_SHA1); + /* detetect an error (all high) value */ + for (i=0; fpr[i] == 'F'; i++) + ; + if (!fpr[i]) + { + xfree (fpr); + fpr = NULL; + } + } + gpgsm_status2 (ctrl, STATUS_IMPORT_PROBLEM, buf, fpr, NULL); + xfree (fpr); +} + + +void +print_imported_summary (CTRL ctrl, struct stats_s *stats) +{ + char buf[14*25]; + + if (!opt.quiet) + { + log_info (_("total number processed: %lu\n"), stats->count); + if (stats->imported) + { + log_info (_(" imported: %lu"), stats->imported ); + log_printf ("\n"); + } + if (stats->unchanged) + log_info (_(" unchanged: %lu\n"), stats->unchanged); + 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); + } + + sprintf(buf, "%lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu", + stats->count, + 0l /*stats->no_user_id*/, + stats->imported, + 0l /*stats->imported_rsa*/, + stats->unchanged, + 0l /*stats->n_uids*/, + 0l /*stats->n_subk*/, + 0l /*stats->n_sigs*/, + 0l /*stats->n_revoc*/, + stats->secret_read, + stats->secret_imported, + stats->secret_dups, + 0l /*stats->skipped_new_keys*/, + stats->not_imported + ); + gpgsm_status (ctrl, STATUS_IMPORT_RES, buf); +} + + + +static void +check_and_store (CTRL ctrl, struct stats_s *stats, ksba_cert_t cert, int depth) +{ + int rc; + + if (stats) + stats->count++; + if ( depth >= 50 ) + { + log_error (_("certificate chain too long\n")); + if (stats) + stats->not_imported++; + print_import_problem (ctrl, cert, 3); + return; + } + + /* Some basic checks, but don't care about missing certificates; + this is so that we are able to import entire certificate chains + w/o requiring a special order (i.e. root-CA first). This used + to be different but because gpgsm_verify even imports + certificates without any checks, it doesn't matter much and the + code gets much cleaner. A housekeeping function to remove + certificates w/o an anchor would be nice, though. + + Optionally we do a full validation in addition to the basic test. + */ + rc = gpgsm_basic_cert_check (cert); + if (!rc && ctrl->with_validation) + rc = gpgsm_validate_chain (ctrl, cert, NULL, 0, NULL, 0); + if (!rc || (!ctrl->with_validation + && gpg_err_code (rc) == GPG_ERR_MISSING_CERT) ) + { + int existed; + + if (!keydb_store_cert (cert, 0, &existed)) + { + ksba_cert_t next = NULL; + + if (!existed) + { + print_imported_status (ctrl, cert, 1); + if (stats) + stats->imported++; + } + else + { + print_imported_status (ctrl, cert, 0); + if (stats) + stats->unchanged++; + } + + if (opt.verbose > 1 && existed) + { + if (depth) + log_info ("issuer certificate already in DB\n"); + else + log_info ("certificate already in DB\n"); + } + else if (opt.verbose && !existed) + { + if (depth) + log_info ("issuer certificate imported\n"); + else + log_info ("certificate imported\n"); + } + + /* Now lets walk up the chain and import all certificates up + the chain. This is required in case we already stored + parent certificates in the ephemeral keybox. Do not + update the statistics, though. */ + if (!gpgsm_walk_cert_chain (cert, &next)) + { + check_and_store (ctrl, NULL, next, depth+1); + ksba_cert_release (next); + } + } + else + { + log_error (_("error storing certificate\n")); + if (stats) + stats->not_imported++; + print_import_problem (ctrl, cert, 4); + } + } + else + { + log_error (_("basic certificate checks failed - not imported\n")); + if (stats) + stats->not_imported++; + print_import_problem (ctrl, cert, + gpg_err_code (rc) == GPG_ERR_MISSING_CERT? 2 : + gpg_err_code (rc) == GPG_ERR_BAD_CERT? 1 : 0); + } +} + + + + +static int +import_one (CTRL ctrl, struct stats_s *stats, int in_fd) +{ + int rc; + Base64Context b64reader = NULL; + ksba_reader_t reader; + ksba_cert_t cert = NULL; + ksba_cms_t cms = NULL; + FILE *fp = NULL; + ksba_content_type_t ct; + int any = 0; + + fp = fdopen ( dup (in_fd), "rb"); + if (!fp) + { + rc = gpg_error (gpg_err_code_from_errno (errno)); + log_error ("fdopen() failed: %s\n", strerror (errno)); + goto leave; + } + + rc = gpgsm_create_reader (&b64reader, ctrl, fp, 1, &reader); + if (rc) + { + log_error ("can't create reader: %s\n", gpg_strerror (rc)); + goto leave; + } + + + /* We need to loop here to handle multiple PEM objects in one + file. */ + do + { + ksba_cms_release (cms); cms = NULL; + ksba_cert_release (cert); cert = NULL; + + ct = ksba_cms_identify (reader); + if (ct == KSBA_CT_SIGNED_DATA) + { /* This is probably a signed-only message - import the certs */ + ksba_stop_reason_t stopreason; + int i; + + rc = ksba_cms_new (&cms); + if (rc) + goto leave; + + rc = ksba_cms_set_reader_writer (cms, reader, NULL); + if (rc) + { + log_error ("ksba_cms_set_reader_writer failed: %s\n", + gpg_strerror (rc)); + goto leave; + } + + do + { + rc = ksba_cms_parse (cms, &stopreason); + if (rc) + { + log_error ("ksba_cms_parse failed: %s\n", gpg_strerror (rc)); + goto leave; + } + + if (stopreason == KSBA_SR_BEGIN_DATA) + log_info ("not a certs-only message\n"); + } + while (stopreason != KSBA_SR_READY); + + for (i=0; (cert=ksba_cms_get_cert (cms, i)); i++) + { + check_and_store (ctrl, stats, cert, 0); + ksba_cert_release (cert); + cert = NULL; + } + if (!i) + log_error ("no certificate found\n"); + else + any = 1; + } + else if (ct == KSBA_CT_PKCS12) + { /* This seems to be a pkcs12 message. We use an external + tool to parse the message and to store the private keys. + We need to use a another reader here to parse the + certificate we included in the p12 file; then we continue + to look for other pkcs12 files (works only if they are in + PEM format. */ + FILE *certfp; + Base64Context b64p12rdr; + ksba_reader_t p12rdr; + + rc = parse_p12 (ctrl, reader, &certfp, stats); + if (!rc) + { + any = 1; + + rewind (certfp); + rc = gpgsm_create_reader (&b64p12rdr, ctrl, certfp, 1, &p12rdr); + if (rc) + { + log_error ("can't create reader: %s\n", gpg_strerror (rc)); + fclose (certfp); + goto leave; + } + + do + { + ksba_cert_release (cert); cert = NULL; + rc = ksba_cert_new (&cert); + if (!rc) + { + rc = ksba_cert_read_der (cert, p12rdr); + if (!rc) + check_and_store (ctrl, stats, cert, 0); + } + ksba_reader_clear (p12rdr, NULL, NULL); + } + while (!rc && !gpgsm_reader_eof_seen (b64p12rdr)); + + if (gpg_err_code (rc) == GPG_ERR_EOF) + rc = 0; + gpgsm_destroy_reader (b64p12rdr); + fclose (certfp); + if (rc) + goto leave; + } + } + else if (ct == KSBA_CT_NONE) + { /* Failed to identify this message - assume a certificate */ + + rc = ksba_cert_new (&cert); + if (rc) + goto leave; + + rc = ksba_cert_read_der (cert, reader); + if (rc) + goto leave; + + check_and_store (ctrl, stats, cert, 0); + any = 1; + } + else + { + log_error ("can't extract certificates from input\n"); + rc = gpg_error (GPG_ERR_NO_DATA); + } + + ksba_reader_clear (reader, NULL, NULL); + } + while (!gpgsm_reader_eof_seen (b64reader)); + + leave: + if (any && gpg_err_code (rc) == GPG_ERR_EOF) + rc = 0; + ksba_cms_release (cms); + ksba_cert_release (cert); + gpgsm_destroy_reader (b64reader); + if (fp) + fclose (fp); + return rc; +} + + +int +gpgsm_import (CTRL ctrl, int in_fd) +{ + int rc; + struct stats_s stats; + + memset (&stats, 0, sizeof stats); + rc = import_one (ctrl, &stats, in_fd); + print_imported_summary (ctrl, &stats); + /* If we never printed an error message do it now so that a command + line invocation will return with an error (log_error keeps a + global errorcount) */ + if (rc && !log_get_errorcount (0)) + log_error (_("error importing certificate: %s\n"), gpg_strerror (rc)); + return rc; +} + + +int +gpgsm_import_files (CTRL ctrl, int nfiles, char **files, + int (*of)(const char *fname)) +{ + int rc = 0; + struct stats_s stats; + + memset (&stats, 0, sizeof stats); + + if (!nfiles) + rc = import_one (ctrl, &stats, 0); + else + { + for (; nfiles && !rc ; nfiles--, files++) + { + int fd = of (*files); + rc = import_one (ctrl, &stats, fd); + close (fd); + if (rc == -1) + rc = 0; + } + } + print_imported_summary (ctrl, &stats); + /* If we never printed an error message do it now so that a command + line invocation will return with an error (log_error keeps a + global errorcount) */ + if (rc && !log_get_errorcount (0)) + log_error (_("error importing certificate: %s\n"), gpg_strerror (rc)); + return rc; +} + + +/* Fork and exec the protecttool, connect the file descriptor of + INFILE to stdin, return a new stream in STATUSFILE, write the + output to OUTFILE and the pid of the process in PID. Returns 0 on + success or an error code. */ +static gpg_error_t +popen_protect_tool (const char *pgmname, + FILE *infile, FILE *outfile, FILE **statusfile, pid_t *pid) +{ + const char *argv[20]; + int i=0; + + argv[i++] = "--homedir"; + argv[i++] = opt.homedir; + argv[i++] = "--p12-import"; + argv[i++] = "--store"; + argv[i++] = "--no-fail-on-exist"; + argv[i++] = "--enable-status-msg"; + if (opt.fixed_passphrase) + { + argv[i++] = "--passphrase"; + argv[i++] = opt.fixed_passphrase; + } + argv[i++] = "--", + argv[i] = NULL; + assert (i < sizeof argv); + + return gnupg_spawn_process (pgmname, argv, infile, outfile, + setup_pinentry_env, + statusfile, pid); +} + + +/* Assume that the reader is at a pkcs#12 message and try to import + certificates from that stupid format. We will also store secret + keys. All of the pkcs#12 parsing and key storing is handled by the + gpg-protect-tool, we merely have to take care of receiving the + certificates. On success RETFP returns a temporary file with + certificates. */ +static gpg_error_t +parse_p12 (ctrl_t ctrl, ksba_reader_t reader, + FILE **retfp, struct stats_s *stats) +{ + const char *pgmname; + gpg_error_t err = 0, child_err = 0; + int c, cont_line; + unsigned int pos; + FILE *tmpfp, *certfp = NULL, *fp = NULL; + char buffer[1024]; + size_t nread; + pid_t pid = -1; + int bad_pass = 0; + + if (!opt.protect_tool_program || !*opt.protect_tool_program) + pgmname = GNUPG_DEFAULT_PROTECT_TOOL; + else + pgmname = opt.protect_tool_program; + + *retfp = NULL; + + /* To avoid an extra feeder process or doing selects and because + gpg-protect-tool will anyway parse the entire pkcs#12 message in + memory, we simply use tempfiles here and pass them to + the gpg-protect-tool. */ + tmpfp = tmpfile (); + if (!tmpfp) + { + err = gpg_error_from_errno (errno); + log_error (_("error creating temporary file: %s\n"), strerror (errno)); + goto cleanup; + } + while (!(err = ksba_reader_read (reader, buffer, sizeof buffer, &nread))) + { + if (nread && fwrite (buffer, nread, 1, tmpfp) != 1) + { + err = gpg_error_from_errno (errno); + log_error (_("error writing to temporary file: %s\n"), + strerror (errno)); + goto cleanup; + } + } + if (gpg_err_code (err) == GPG_ERR_EOF) + err = 0; + if (err) + { + log_error (_("error reading input: %s\n"), gpg_strerror (err)); + goto cleanup; + } + + certfp = tmpfile (); + if (!certfp) + { + err = gpg_error_from_errno (errno); + log_error (_("error creating temporary file: %s\n"), strerror (errno)); + goto cleanup; + } + + err = popen_protect_tool (pgmname, tmpfp, certfp, &fp, &pid); + if (err) + { + pid = -1; + goto cleanup; + } + fclose (tmpfp); + tmpfp = NULL; + + /* Read stderr of the protect tool. */ + pos = 0; + cont_line = 0; + while ((c=getc (fp)) != EOF) + { + /* fixme: We could here grep for status information of the + protect tool to figure out better error codes for + CHILD_ERR. */ + buffer[pos++] = c; + if (pos >= sizeof buffer - 5 || c == '\n') + { + buffer[pos - (c == '\n')] = 0; + if (cont_line) + log_printf ("%s", buffer); + else + { + if (!strncmp (buffer, "gpg-protect-tool: [PROTECT-TOOL:] ",34)) + { + char *p, *pend; + + p = buffer + 34; + pend = strchr (p, ' '); + if (pend) + *pend = 0; + if ( !strcmp (p, "secretkey-stored")) + { + stats->count++; + stats->secret_read++; + stats->secret_imported++; + } + else if ( !strcmp (p, "secretkey-exists")) + { + stats->count++; + stats->secret_read++; + stats->secret_dups++; + } + else if ( !strcmp (p, "bad-passphrase")) + ; + } + else + { + log_info ("%s", buffer); + if (!strncmp (buffer, "gpg-protect-tool: " + "possibly bad passphrase given",46)) + bad_pass++; + } + } + pos = 0; + cont_line = (c != '\n'); + } + } + + if (pos) + { + buffer[pos] = 0; + if (cont_line) + log_printf ("%s\n", buffer); + else + log_info ("%s\n", buffer); + } + + + /* If we found no error in the output of the cild, setup a suitable + error code, which will later be reset if the exit status of the + child is 0. */ + if (!child_err) + child_err = gpg_error (GPG_ERR_DECRYPT_FAILED); + + cleanup: + if (tmpfp) + fclose (tmpfp); + if (fp) + fclose (fp); + if (pid != -1) + { + if (!gnupg_wait_process (pgmname, pid)) + child_err = 0; + } + if (!err) + err = child_err; + if (err) + { + if (certfp) + fclose (certfp); + } + else + *retfp = certfp; + + if (bad_pass) + { + /* We only write a plain error code and not direct + BAD_PASSPHRASE because the pkcs12 parser might issue this + message multiple times, BAd_PASSPHRASE in general requires a + keyID and parts of the import might actually succeed so that + IMPORT_PROBLEM is also not appropriate. */ + gpgsm_status_with_err_code (ctrl, STATUS_ERROR, + "import.parsep12", GPG_ERR_BAD_PASSPHRASE); + } + + return err; +} diff --git a/sm/keydb.c b/sm/keydb.c new file mode 100644 index 000000000..81936cf6a --- /dev/null +++ b/sm/keydb.c @@ -0,0 +1,1509 @@ +/* keydb.c - key database dispatcher + * Copyright (C) 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 <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> + +#include "gpgsm.h" +#include "../kbx/keybox.h" +#include "keydb.h" +#include "i18n.h" + +static int active_handles; + +typedef enum { + KEYDB_RESOURCE_TYPE_NONE = 0, + KEYDB_RESOURCE_TYPE_KEYBOX +} KeydbResourceType; +#define MAX_KEYDB_RESOURCES 20 + +struct resource_item { + KeydbResourceType type; + union { + KEYBOX_HANDLE kr; + } u; + void *token; + int secret; + DOTLOCK lockhandle; +}; + +static struct resource_item all_resources[MAX_KEYDB_RESOURCES]; +static int used_resources; + +struct keydb_handle { + int locked; + int found; + int current; + int is_ephemeral; + 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); + + +/* + * Register a resource (which currently may only be a keybox file). + * The first keybox which is added by this function is + * created if it does not exist. + * Note: this function may be called before secure memory is + * available. + */ +int +keydb_add_resource (const char *url, int force, int secret) +{ + static int any_secret, any_public; + const char *resname = url; + char *filename = NULL; + int rc = 0; + FILE *fp; + KeydbResourceType rt = KEYDB_RESOURCE_TYPE_NONE; + const char *created_fname = NULL; + + /* Do we have an URL? + gnupg-kbx:filename := this is a plain keybox + filename := See what is is, but create as plain keybox. + */ + if (strlen (resname) > 10) + { + if (!strncmp (resname, "gnupg-kbx:", 10) ) + { + rt = KEYDB_RESOURCE_TYPE_KEYBOX; + resname += 10; + } +#if !defined(HAVE_DRIVE_LETTERS) && !defined(__riscos__) + else if (strchr (resname, ':')) + { + log_error ("invalid key resource URL `%s'\n", url ); + rc = gpg_error (GPG_ERR_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 *fp2 = fopen( filename, "rb" ); + + if (fp2) { + u32 magic; + + /* FIXME: check for the keybox magic */ + if (fread( &magic, 4, 1, fp2) == 1 ) + { + if (magic == 0x13579ace || magic == 0xce9a5713) + ; /* GDBM magic - no more support */ + else + rt = KEYDB_RESOURCE_TYPE_KEYBOX; + } + else /* maybe empty: assume ring */ + rt = KEYDB_RESOURCE_TYPE_KEYBOX; + fclose (fp2); + } + else /* no file yet: create ring */ + rt = KEYDB_RESOURCE_TYPE_KEYBOX; + } + + switch (rt) + { + case KEYDB_RESOURCE_TYPE_NONE: + log_error ("unknown type of key resource `%s'\n", url ); + rc = gpg_error (GPG_ERR_GENERAL); + goto leave; + + case KEYDB_RESOURCE_TYPE_KEYBOX: + fp = fopen (filename, "rb"); + if (!fp && !force) + { + rc = gpg_error (gpg_err_code_from_errno (errno)); + goto leave; + } + + if (!fp) + { /* no file */ +#if 0 /* no autocreate of the homedirectory yet */ + { + char *last_slash_in_filename; + + last_slash_in_filename = strrchr (filename, DIRSEP_C); + *last_slash_in_filename = 0; + if (access (filename, F_OK)) + { /* on the first time we try to create the default + homedir and in this case the process will be + terminated, so that on the next invocation can + read the options file in on startup */ + try_make_homedir (filename); + rc = gpg_error (GPG_ERR_FILE_OPEN_ERROR); + *last_slash_in_filename = DIRSEP_C; + goto leave; + } + *last_slash_in_filename = DIRSEP_C; + } +#endif + fp = fopen (filename, "w"); + if (!fp) + { + rc = gpg_error (gpg_err_code_from_errno (errno)); + log_error (_("error creating keybox `%s': %s\n"), + filename, strerror(errno)); + if (errno == ENOENT) + log_info (_("you may want to start the gpg-agent first\n")); + goto leave; + } + + if (!opt.quiet) + log_info (_("keybox `%s' created\n"), filename); + created_fname = filename; + } + fclose (fp); + fp = NULL; + /* now register the file */ + { + + void *token = keybox_register_file (filename, secret); + if (!token) + ; /* already registered - ignore it */ + else if (used_resources >= MAX_KEYDB_RESOURCES) + rc = gpg_error (GPG_ERR_RESOURCE_LIMIT); + else + { + 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; + + all_resources[used_resources].lockhandle + = create_dotlock (filename); + if (!all_resources[used_resources].lockhandle) + log_fatal ( _("can't create lock for `%s'\n"), filename); + + /* Do a compress run if needed and the file is not locked. */ + if (!make_dotlock (all_resources[used_resources].lockhandle, 0)) + { + KEYBOX_HANDLE kbxhd = keybox_new (token, secret); + + if (kbxhd) + { + keybox_compress (kbxhd); + keybox_release (kbxhd); + } + release_dotlock (all_resources[used_resources].lockhandle); + } + + used_resources++; + } + } + + + break; + default: + log_error ("resource type of `%s' not supported\n", url); + rc = gpg_error (GPG_ERR_NOT_SUPPORTED); + goto leave; + } + + /* fixme: check directory permissions and print a warning */ + + leave: + if (rc) + log_error ("keyblock resource `%s': %s\n", filename, gpg_strerror(rc)); + 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 = xcalloc (1, 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_KEYBOX: + 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].lockhandle = all_resources[i].lockhandle; + hd->active[j].u.kr = keybox_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_KEYBOX: + keybox_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_KEYBOX: + s = keybox_get_resource_name (hd->active[idx].u.kr); + break; + } + + return s? s: ""; +} + +/* Switch the handle into ephemeral mode and return the orginal value. */ +int +keydb_set_ephemeral (KEYDB_HANDLE hd, int yes) +{ + int i; + + if (!hd) + return 0; + + yes = !!yes; + if (hd->is_ephemeral != yes) + { + for (i=0; i < hd->used; i++) + { + switch (hd->active[i].type) + { + case KEYDB_RESOURCE_TYPE_NONE: + break; + case KEYDB_RESOURCE_TYPE_KEYBOX: + keybox_set_ephemeral (hd->active[i].u.kr, yes); + break; + } + } + } + + i = hd->is_ephemeral; + hd->is_ephemeral = yes; + return i; +} + + +/* If the keyring has not yet been locked, lock it now. This + operation is required before any update opeations; it is optionaly + for an insert operation. The lock is released with + keydb_released. */ +gpg_error_t +keydb_lock (KEYDB_HANDLE hd) +{ + if (!hd) + return gpg_error (GPG_ERR_INV_HANDLE); + if (hd->locked) + return 0; /* Already locked. */ + return lock_all (hd); +} + + + +static int +lock_all (KEYDB_HANDLE hd) +{ + int i, rc = 0; + + /* Fixme: This locking scheme may lead to deadlock if the resources + are not added in the same order by all processes. We are + currently only allowing one resource so it is not a problem. */ + for (i=0; i < hd->used; i++) + { + switch (hd->active[i].type) + { + case KEYDB_RESOURCE_TYPE_NONE: + break; + case KEYDB_RESOURCE_TYPE_KEYBOX: + if (hd->active[i].lockhandle) + rc = make_dotlock (hd->active[i].lockhandle, -1); + break; + } + if (rc) + 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_KEYBOX: + if (hd->active[i].lockhandle) + release_dotlock (hd->active[i].lockhandle); + break; + } + } + } + else + hd->locked = 1; + + /* make_dotlock () does not yet guarantee that errno is set, thus + we can't rely on the error reason and will simply use + EACCES. */ + return rc? gpg_error (GPG_ERR_EACCES) : 0; +} + +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_KEYBOX: + if (hd->active[i].lockhandle) + release_dotlock (hd->active[i].lockhandle); + break; + } + } + hd->locked = 0; +} + + +#if 0 +/* + * Return the last found keybox. 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_KEYBOX: + rc = keybox_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; + + if (!hd->locked) + return gpg_error (GPG_ERR_NOT_LOCKED); + + switch (hd->active[hd->found].type) { + case KEYDB_RESOURCE_TYPE_NONE: + rc = G10ERR_GENERAL; /* oops */ + break; + case KEYDB_RESOURCE_TYPE_KEYBOX: + rc = keybox_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_KEYBOX: + rc = keybox_insert_keyblock (hd->active[idx].u.kr, kb); + break; + } + + unlock_all (hd); + return rc; +} + +#endif /*disabled code*/ + + + +/* + Return the last found object. 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_cert (KEYDB_HANDLE hd, ksba_cert_t *r_cert) +{ + int rc = 0; + + if (!hd) + return gpg_error (GPG_ERR_INV_VALUE); + + if ( hd->found < 0 || hd->found >= hd->used) + return -1; /* nothing found */ + + switch (hd->active[hd->found].type) + { + case KEYDB_RESOURCE_TYPE_NONE: + rc = gpg_error (GPG_ERR_GENERAL); /* oops */ + break; + case KEYDB_RESOURCE_TYPE_KEYBOX: + rc = keybox_get_cert (hd->active[hd->found].u.kr, r_cert); + break; + } + + return rc; +} + +/* Return a flag of the last found object. WHICH is the flag requested; + it should be one of the KEYBOX_FLAG_ values. If the operation is + successful, the flag value will be stored at the address given by + VALUE. Return 0 on success or an error code. */ +gpg_error_t +keydb_get_flags (KEYDB_HANDLE hd, int which, int idx, unsigned int *value) +{ + int err = 0; + + if (!hd) + return gpg_error (GPG_ERR_INV_VALUE); + + if ( hd->found < 0 || hd->found >= hd->used) + return gpg_error (GPG_ERR_NOTHING_FOUND); + + switch (hd->active[hd->found].type) + { + case KEYDB_RESOURCE_TYPE_NONE: + err = gpg_error (GPG_ERR_GENERAL); /* oops */ + break; + case KEYDB_RESOURCE_TYPE_KEYBOX: + err = keybox_get_flags (hd->active[hd->found].u.kr, which, idx, value); + break; + } + + return err; +} + +/* Set a flag of the last found object. WHICH is the flag to be set; it + should be one of the KEYBOX_FLAG_ values. If the operation is + successful, the flag value will be stored in the keybox. Note, + that some flag values can't be updated and thus may return an + error, some other flag values may be masked out before an update. + Returns 0 on success or an error code. */ +gpg_error_t +keydb_set_flags (KEYDB_HANDLE hd, int which, int idx, unsigned int value) +{ + int err = 0; + + if (!hd) + return gpg_error (GPG_ERR_INV_VALUE); + + if ( hd->found < 0 || hd->found >= hd->used) + return gpg_error (GPG_ERR_NOTHING_FOUND); + + if (!hd->locked) + return gpg_error (GPG_ERR_NOT_LOCKED); + + switch (hd->active[hd->found].type) + { + case KEYDB_RESOURCE_TYPE_NONE: + err = gpg_error (GPG_ERR_GENERAL); /* oops */ + break; + case KEYDB_RESOURCE_TYPE_KEYBOX: + err = keybox_set_flags (hd->active[hd->found].u.kr, which, idx, value); + break; + } + + return err; +} + +/* + * Insert a new Certificate into one of the resources. + */ +int +keydb_insert_cert (KEYDB_HANDLE hd, ksba_cert_t cert) +{ + int rc = -1; + int idx; + unsigned char digest[20]; + + if (!hd) + return gpg_error (GPG_ERR_INV_VALUE); + + 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 gpg_error (GPG_ERR_GENERAL); + + if (!hd->locked) + return gpg_error (GPG_ERR_NOT_LOCKED); + + gpgsm_get_fingerprint (cert, GCRY_MD_SHA1, digest, NULL); /* kludge*/ + + switch (hd->active[idx].type) + { + case KEYDB_RESOURCE_TYPE_NONE: + rc = gpg_error (GPG_ERR_GENERAL); + break; + case KEYDB_RESOURCE_TYPE_KEYBOX: + rc = keybox_insert_cert (hd->active[idx].u.kr, cert, digest); + break; + } + + unlock_all (hd); + return rc; +} + + + +/* update the current keyblock with KB */ +int +keydb_update_cert (KEYDB_HANDLE hd, ksba_cert_t cert) +{ + int rc = 0; + unsigned char digest[20]; + + if (!hd) + return gpg_error (GPG_ERR_INV_VALUE); + + 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; + + gpgsm_get_fingerprint (cert, GCRY_MD_SHA1, digest, NULL); /* kludge*/ + + switch (hd->active[hd->found].type) + { + case KEYDB_RESOURCE_TYPE_NONE: + rc = gpg_error (GPG_ERR_GENERAL); /* oops */ + break; + case KEYDB_RESOURCE_TYPE_KEYBOX: + rc = keybox_update_cert (hd->active[hd->found].u.kr, cert, digest); + break; + } + + unlock_all (hd); + return rc; +} + + +/* + * The current keyblock or cert will be deleted. + */ +int +keydb_delete (KEYDB_HANDLE hd, int unlock) +{ + int rc = -1; + + if (!hd) + return gpg_error (GPG_ERR_INV_VALUE); + + if ( hd->found < 0 || hd->found >= hd->used) + return -1; /* nothing found */ + + if( opt.dry_run ) + return 0; + + if (!hd->locked) + return gpg_error (GPG_ERR_NOT_LOCKED); + + switch (hd->active[hd->found].type) + { + case KEYDB_RESOURCE_TYPE_NONE: + rc = gpg_error (GPG_ERR_GENERAL); + break; + case KEYDB_RESOURCE_TYPE_KEYBOX: + rc = keybox_delete (hd->active[hd->found].u.kr); + break; + } + + if (unlock) + unlock_all (hd); + return rc; +} + + + +/* + * 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 gpg_error (GPG_ERR_INV_VALUE); + + 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_KEYBOX: + if (keybox_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 (void) +{ + int i; + + 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_KEYBOX: +/* rc = keybox_rebuild_cache (all_resources[i].token); */ +/* if (rc) */ +/* log_error (_("failed to rebuild keybox 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 gpg_error (GPG_ERR_INV_VALUE); + + 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_KEYBOX: + rc = keybox_search_reset (hd->active[i].u.kr); + break; + } + } + return rc; /* fixme: we need to map error codes or share them with + all modules*/ +} + +/* + * 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_search (KEYDB_HANDLE hd, KEYDB_SEARCH_DESC *desc, size_t ndesc) +{ + int rc = -1; + + if (!hd) + return gpg_error (GPG_ERR_INV_VALUE); + + 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_KEYBOX: + rc = keybox_search (hd->active[hd->current].u.kr, desc, ndesc); + 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, 20); + return keydb_search (hd, &desc, 1); +} + +int +keydb_search_issuer (KEYDB_HANDLE hd, const char *issuer) +{ + KEYDB_SEARCH_DESC desc; + int rc; + + memset (&desc, 0, sizeof desc); + desc.mode = KEYDB_SEARCH_MODE_ISSUER; + desc.u.name = issuer; + rc = keydb_search (hd, &desc, 1); + return rc; +} + +int +keydb_search_issuer_sn (KEYDB_HANDLE hd, + const char *issuer, ksba_const_sexp_t serial) +{ + KEYDB_SEARCH_DESC desc; + int rc; + const unsigned char *s; + + memset (&desc, 0, sizeof desc); + desc.mode = KEYDB_SEARCH_MODE_ISSUER_SN; + s = serial; + if (*s !='(') + return gpg_error (GPG_ERR_INV_VALUE); + s++; + for (desc.snlen = 0; digitp (s); s++) + desc.snlen = 10*desc.snlen + atoi_1 (s); + if (*s !=':') + return gpg_error (GPG_ERR_INV_VALUE); + desc.sn = s+1; + desc.u.name = issuer; + rc = keydb_search (hd, &desc, 1); + return rc; +} + +int +keydb_search_subject (KEYDB_HANDLE hd, const char *name) +{ + KEYDB_SEARCH_DESC desc; + int rc; + + memset (&desc, 0, sizeof desc); + desc.mode = KEYDB_SEARCH_MODE_SUBJECT; + desc.u.name = name; + rc = keydb_search (hd, &desc, 1); + return rc; +} + + +static int +classify_user_id (const char *name, + KEYDB_SEARCH_DESC *desc, + int *force_exact ) +{ + const char *s; + int hexprefix = 0; + int hexlength; + int mode = 0; + + /* 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); + *force_exact = 0; + /* Skip leading spaces. Fixme: what about trailing white space? */ + for(s = name; *s && spacep (s); s++ ) + ; + + switch (*s) + { + case 0: /* empty string is an error */ + return 0; + + case '.': /* an email address, compare from end */ + mode = KEYDB_SEARCH_MODE_MAILEND; + s++; + desc->u.name = s; + break; + + case '<': /* an email address */ + mode = KEYDB_SEARCH_MODE_MAIL; + s++; + 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; + + case '+': /* compare individual words */ + mode = KEYDB_SEARCH_MODE_WORDS; + s++; + desc->u.name = s; + break; + + case '/': /* subject's DN */ + s++; + if (!*s || spacep (s)) + return 0; /* no DN or prefixed with a space */ + desc->u.name = s; + mode = KEYDB_SEARCH_MODE_SUBJECT; + break; + + case '#': + { + const char *si; + + s++; + if ( *s == '/') + { /* "#/" indicates an issuer's DN */ + s++; + if (!*s || spacep (s)) + return 0; /* no DN or prefixed with a space */ + desc->u.name = s; + mode = KEYDB_SEARCH_MODE_ISSUER; + } + else + { /* serialnumber + optional issuer ID */ + for (si=s; *si && *si != '/'; si++) + { + if (!strchr("01234567890abcdefABCDEF", *si)) + return 0; /* invalid digit in serial number*/ + } + desc->sn = (const unsigned char*)s; + desc->snlen = -1; + if (!*si) + mode = KEYDB_SEARCH_MODE_SN; + else + { + s = si+1; + if (!*s || spacep (s)) + return 0; /* no DN or prefixed with a space */ + desc->u.name = s; + mode = KEYDB_SEARCH_MODE_ISSUER_SN; + } + } + } + break; + + 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] =='!') + { + *force_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 */ + /* The first chars looked like a hex number, but really is + not */ + hexlength = 0; + } + + if (*force_exact) + hexlength--; /* remove the bang */ + + if (hexlength == 8 + || (!hexprefix && hexlength == 9 && *s == '0')) + { /* short keyid */ + unsigned long kid; + if (hexlength == 9) + s++; + kid = strtoul( s, NULL, 16 ); + desc->u.kid[4] = kid >> 24; + desc->u.kid[5] = kid >> 16; + desc->u.kid[6] = kid >> 8; + desc->u.kid[7] = kid; + mode = KEYDB_SEARCH_MODE_SHORT_KID; + } + else if (hexlength == 16 + || (!hexprefix && hexlength == 17 && *s == '0')) + { /* complete keyid */ + unsigned long kid0, kid1; + char buf[9]; + if (hexlength == 17) + s++; + mem2str(buf, s, 9 ); + kid0 = strtoul (buf, NULL, 16); + kid1 = strtoul (s+8, NULL, 16); + desc->u.kid[0] = kid0 >> 24; + desc->u.kid[1] = kid0 >> 16; + desc->u.kid[2] = kid0 >> 8; + desc->u.kid[3] = kid0; + desc->u.kid[4] = kid1 >> 24; + desc->u.kid[5] = kid1 >> 16; + desc->u.kid[6] = kid1 >> 8; + desc->u.kid[7] = kid1; + 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) + { + /* The fingerprint in an X.509 listing is often delimited by + colons, so we try to single this case out. */ + mode = 0; + hexlength = strspn (s, ":0123456789abcdefABCDEF"); + if (hexlength == 59 && (!s[hexlength] || spacep (s+hexlength))) + { + int i; + + for (i=0; i < 20; i++, s += 3) + { + int c = hextobyte(s); + if (c == -1 || (i < 19 && s[2] != ':')) + break; + desc->u.fpr[i] = c; + } + if (i == 20) + mode = KEYDB_SEARCH_MODE_FPR20; + } + if (!mode) /* default is substring search */ + { + *force_exact = 0; + desc->u.name = s; + mode = KEYDB_SEARCH_MODE_SUBSTR; + } + } + else + { /* hex number with a prefix but a wrong length */ + return 0; + } + } + + desc->mode = mode; + return mode; +} + + +int +keydb_classify_name (const char *name, KEYDB_SEARCH_DESC *desc) +{ + int dummy; + KEYDB_SEARCH_DESC dummy_desc; + + if (!desc) + desc = &dummy_desc; + + if (!classify_user_id (name, desc, &dummy)) + return gpg_error (GPG_ERR_INV_NAME); + return 0; +} + + +/* Store the certificate in the key DB but make sure that it does not + already exists. We do this simply by comparing the fingerprint. + If EXISTED is not NULL it will be set to true if the certificate + was already in the DB. */ +int +keydb_store_cert (ksba_cert_t cert, int ephemeral, int *existed) +{ + KEYDB_HANDLE kh; + int rc; + unsigned char fpr[20]; + + if (existed) + *existed = 0; + + if (!gpgsm_get_fingerprint (cert, 0, fpr, NULL)) + { + log_error (_("failed to get the fingerprint\n")); + return gpg_error (GPG_ERR_GENERAL); + } + + kh = keydb_new (0); + if (!kh) + { + log_error (_("failed to allocate keyDB handle\n")); + return gpg_error (GPG_ERR_ENOMEM);; + } + + if (ephemeral) + keydb_set_ephemeral (kh, 1); + + rc = lock_all (kh); + if (rc) + return rc; + + rc = keydb_search_fpr (kh, fpr); + if (rc != -1) + { + keydb_release (kh); + if (!rc) + { + if (existed) + *existed = 1; + return 0; /* okay */ + } + log_error (_("problem looking for existing certificate: %s\n"), + gpg_strerror (rc)); + return rc; + } + + rc = keydb_locate_writable (kh, 0); + if (rc) + { + log_error (_("error finding writable keyDB: %s\n"), gpg_strerror (rc)); + keydb_release (kh); + return rc; + } + + rc = keydb_insert_cert (kh, cert); + if (rc) + { + log_error (_("error storing certificate: %s\n"), gpg_strerror (rc)); + keydb_release (kh); + return rc; + } + keydb_release (kh); + return 0; +} + + +/* This is basically keydb_set_flags but it implements a complete + transaction by locating the certificate in the DB and updating the + flags. */ +gpg_error_t +keydb_set_cert_flags (ksba_cert_t cert, int which, int idx, unsigned int value) +{ + KEYDB_HANDLE kh; + gpg_error_t err; + unsigned char fpr[20]; + unsigned int old_value; + + if (!gpgsm_get_fingerprint (cert, 0, fpr, NULL)) + { + log_error (_("failed to get the fingerprint\n")); + return gpg_error (GPG_ERR_GENERAL); + } + + kh = keydb_new (0); + if (!kh) + { + log_error (_("failed to allocate keyDB handle\n")); + return gpg_error (GPG_ERR_ENOMEM);; + } + + err = keydb_lock (kh); + if (err) + { + log_error (_("error locking keybox: %s\n"), gpg_strerror (err)); + keydb_release (kh); + return err; + } + + err = keydb_search_fpr (kh, fpr); + if (err) + { + log_error (_("problem re-searching certificate: %s\n"), + gpg_strerror (err)); + keydb_release (kh); + return err; + } + + err = keydb_get_flags (kh, which, idx, &old_value); + if (err) + { + log_error (_("error getting stored flags: %s\n"), gpg_strerror (err)); + keydb_release (kh); + return err; + } + if (value != old_value) + { + err = keydb_set_flags (kh, which, idx, value); + if (err) + { + log_error (_("error storing flags: %s\n"), gpg_strerror (err)); + keydb_release (kh); + return err; + } + } + keydb_release (kh); + return 0; +} + + +/* Reset all the certificate flags we have stored with the certificates + for performance reasons. */ +void +keydb_clear_some_cert_flags (ctrl_t ctrl, STRLIST names) +{ + gpg_error_t err; + KEYDB_HANDLE hd = NULL; + KEYDB_SEARCH_DESC *desc = NULL; + int ndesc; + STRLIST sl; + int rc=0; + unsigned int old_value, value; + + hd = keydb_new (0); + if (!hd) + { + log_error ("keydb_new failed\n"); + goto leave; + } + + if (!names) + ndesc = 1; + else + { + for (sl=names, ndesc=0; sl; sl = sl->next, ndesc++) + ; + } + + desc = xtrycalloc (ndesc, sizeof *desc); + if (!ndesc) + { + log_error ("allocating memory failed: %s\n", + gpg_strerror (OUT_OF_CORE (errno))); + goto leave; + } + + if (!names) + desc[0].mode = KEYDB_SEARCH_MODE_FIRST; + else + { + for (ndesc=0, sl=names; sl; sl = sl->next) + { + rc = keydb_classify_name (sl->d, desc+ndesc); + if (rc) + { + log_error ("key `%s' not found: %s\n", + sl->d, gpg_strerror (rc)); + rc = 0; + } + else + ndesc++; + } + } + + err = keydb_lock (hd); + if (err) + { + log_error (_("error locking keybox: %s\n"), gpg_strerror (err)); + goto leave; + } + + while (!(rc = keydb_search (hd, desc, ndesc))) + { + if (!names) + desc[0].mode = KEYDB_SEARCH_MODE_NEXT; + + err = keydb_get_flags (hd, KEYBOX_FLAG_VALIDITY, 0, &old_value); + if (err) + { + log_error (_("error getting stored flags: %s\n"), + gpg_strerror (err)); + goto leave; + } + + value = (old_value & ~VALIDITY_REVOKED); + if (value != old_value) + { + err = keydb_set_flags (hd, KEYBOX_FLAG_VALIDITY, 0, value); + if (err) + { + log_error (_("error storing flags: %s\n"), gpg_strerror (err)); + goto leave; + } + } + } + if (rc && rc != -1) + log_error ("keydb_search failed: %s\n", gpg_strerror (rc)); + + leave: + xfree (desc); + keydb_release (hd); +} + + diff --git a/sm/keydb.h b/sm/keydb.h new file mode 100644 index 000000000..814ae9f1e --- /dev/null +++ b/sm/keydb.h @@ -0,0 +1,86 @@ +/* keydb.h - Key database + * 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 GNUPG_KEYDB_H +#define GNUPG_KEYDB_H + +#include <ksba.h> + +#include "../kbx/keybox-search-desc.h" + +typedef struct keydb_handle *KEYDB_HANDLE; + +/* Flag value used with KEYBOX_FLAG_VALIDITY. */ +#define VALIDITY_REVOKED (1<<5) + + +/*-- keydb.c --*/ +int keydb_add_resource (const char *url, int force, int secret); +KEYDB_HANDLE keydb_new (int secret); +void keydb_release (KEYDB_HANDLE hd); +int keydb_set_ephemeral (KEYDB_HANDLE hd, int yes); +const char *keydb_get_resource_name (KEYDB_HANDLE hd); +gpg_error_t keydb_lock (KEYDB_HANDLE hd); + +#if 0 /* pgp stuff */ +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); +#endif + +gpg_error_t keydb_get_flags (KEYDB_HANDLE hd, int which, int idx, + unsigned int *value); +gpg_error_t keydb_set_flags (KEYDB_HANDLE hd, int which, int idx, + unsigned int value); +int keydb_get_cert (KEYDB_HANDLE hd, ksba_cert_t *r_cert); +int keydb_insert_cert (KEYDB_HANDLE hd, ksba_cert_t cert); +int keydb_update_cert (KEYDB_HANDLE hd, ksba_cert_t cert); + +int keydb_delete (KEYDB_HANDLE hd, int unlock); + +int keydb_locate_writable (KEYDB_HANDLE hd, const char *reserved); +void keydb_rebuild_caches (void); + +int keydb_search_reset (KEYDB_HANDLE hd); +int keydb_search (KEYDB_HANDLE hd, KEYDB_SEARCH_DESC *desc, size_t ndesc); +int keydb_search_first (KEYDB_HANDLE hd); +int keydb_search_next (KEYDB_HANDLE hd); +int keydb_search_kid (KEYDB_HANDLE hd, u32 *kid); +int keydb_search_fpr (KEYDB_HANDLE hd, const byte *fpr); +int keydb_search_issuer (KEYDB_HANDLE hd, const char *issuer); +int keydb_search_issuer_sn (KEYDB_HANDLE hd, + const char *issuer, const unsigned char *serial); +int keydb_search_subject (KEYDB_HANDLE hd, const char *issuer); + +int keydb_classify_name (const char *name, KEYDB_SEARCH_DESC *desc); + +int keydb_store_cert (ksba_cert_t cert, int ephemeral, int *existed); +gpg_error_t keydb_set_cert_flags (ksba_cert_t cert, int which, int idx, + unsigned int value); + +void keydb_clear_some_cert_flags (ctrl_t ctrl, STRLIST names); + + +#endif /*GNUPG_KEYDB_H*/ + + + + diff --git a/sm/keylist.c b/sm/keylist.c new file mode 100644 index 000000000..c44d62102 --- /dev/null +++ b/sm/keylist.c @@ -0,0 +1,1361 @@ +/* keylist.c - Print certificates in various formats. + * 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 <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include <unistd.h> +#include <time.h> +#include <assert.h> + +#include "gpgsm.h" + +#include <gcrypt.h> +#include <ksba.h> + +#include "keydb.h" +#include "../kbx/keybox.h" /* for KEYBOX_FLAG_* */ +#include "i18n.h" + +struct list_external_parm_s { + ctrl_t ctrl; + FILE *fp; + int print_header; + int with_colons; + int with_chain; + int raw_mode; +}; + + +/* This table is to map Extended Key Usage OIDs to human readable + names. */ +struct { + const char *oid; + const char *name; +} key_purpose_map[] = { + { "1.3.6.1.5.5.7.3.1", "serverAuth" }, + { "1.3.6.1.5.5.7.3.2", "clientAuth" }, + { "1.3.6.1.5.5.7.3.3", "codeSigning" }, + { "1.3.6.1.5.5.7.3.4", "emailProtection" }, + { "1.3.6.1.5.5.7.3.5", "ipsecEndSystem" }, + { "1.3.6.1.5.5.7.3.6", "ipsecTunnel" }, + { "1.3.6.1.5.5.7.3.7", "ipsecUser" }, + { "1.3.6.1.5.5.7.3.8", "timeStamping" }, + { "1.3.6.1.5.5.7.3.9", "ocspSigning" }, + { "1.3.6.1.5.5.7.3.10", "dvcs" }, + { "1.3.6.1.5.5.7.3.11", "sbgpCertAAServerAuth" }, + { "1.3.6.1.5.5.7.3.13", "eapOverPPP" }, + { "1.3.6.1.5.5.7.3.14", "wlanSSID" }, + + { "2.16.840.1.113730.4.1", "serverGatedCrypto.ns" }, /* Netscape. */ + { "1.3.6.1.4.1.311.10.3.3", "serverGatedCrypto.ms"}, /* Microsoft. */ + { NULL, NULL } +}; + + +/* A table mapping OIDs to a descriptive string. */ +static struct { + char *oid; + char *name; + unsigned int flag; +} oidtranstbl[] = { + + /* Algorithms. */ + { "1.2.840.10040.4.1", "dsa" }, + { "1.2.840.10040.4.3", "dsaWithSha1" }, + + { "1.2.840.113549.1.1.1", "rsaEncryption" }, + { "1.2.840.113549.1.1.2", "md2WithRSAEncryption" }, + { "1.2.840.113549.1.1.3", "md4WithRSAEncryption" }, + { "1.2.840.113549.1.1.4", "md5WithRSAEncryption" }, + { "1.2.840.113549.1.1.5", "sha1WithRSAEncryption" }, + { "1.2.840.113549.1.1.7", "rsaOAEP" }, + { "1.2.840.113549.1.1.8", "rsaOAEP-MGF" }, + { "1.2.840.113549.1.1.9", "rsaOAEP-pSpecified" }, + { "1.2.840.113549.1.1.10", "rsaPSS" }, + { "1.2.840.113549.1.1.11", "sha256WithRSAEncryption" }, + { "1.2.840.113549.1.1.12", "sha384WithRSAEncryption" }, + { "1.2.840.113549.1.1.13", "sha512WithRSAEncryption" }, + + { "1.3.14.3.2.26", "sha1" }, + { "1.3.14.3.2.29", "sha-1WithRSAEncryption" }, + { "1.3.36.3.3.1.2", "rsaSignatureWithripemd160" }, + + + /* Telesec extensions. */ + { "0.2.262.1.10.12.0", "certExtensionLiabilityLimitationExt" }, + { "0.2.262.1.10.12.1", "telesecCertIdExt" }, + { "0.2.262.1.10.12.2", "telesecPolicyIdentifier" }, + { "0.2.262.1.10.12.3", "telesecPolicyQualifierID" }, + { "0.2.262.1.10.12.4", "telesecCRLFilteredExt" }, + { "0.2.262.1.10.12.5", "telesecCRLFilterExt"}, + { "0.2.262.1.10.12.6", "telesecNamingAuthorityExt" }, + + /* PKIX private extensions. */ + { "1.3.6.1.5.5.7.1.1", "authorityInfoAccess" }, + { "1.3.6.1.5.5.7.1.2", "biometricInfo" }, + { "1.3.6.1.5.5.7.1.3", "qcStatements" }, + { "1.3.6.1.5.5.7.1.4", "acAuditIdentity" }, + { "1.3.6.1.5.5.7.1.5", "acTargeting" }, + { "1.3.6.1.5.5.7.1.6", "acAaControls" }, + { "1.3.6.1.5.5.7.1.7", "sbgp-ipAddrBlock" }, + { "1.3.6.1.5.5.7.1.8", "sbgp-autonomousSysNum" }, + { "1.3.6.1.5.5.7.1.9", "sbgp-routerIdentifier" }, + { "1.3.6.1.5.5.7.1.10", "acProxying" }, + { "1.3.6.1.5.5.7.1.11", "subjectInfoAccess" }, + + /* X.509 id-ce */ + { "2.5.29.14", "subjectKeyIdentifier", 1}, + { "2.5.29.15", "keyUsage", 1 }, + { "2.5.29.16", "privateKeyUsagePeriod" }, + { "2.5.29.17", "subjectAltName", 1 }, + { "2.5.29.18", "issuerAltName", 1 }, + { "2.5.29.19", "basicConstraints", 1}, + { "2.5.29.20", "cRLNumber" }, + { "2.5.29.21", "cRLReason" }, + { "2.5.29.22", "expirationDate" }, + { "2.5.29.23", "instructionCode" }, + { "2.5.29.24", "invalidityDate" }, + { "2.5.29.27", "deltaCRLIndicator" }, + { "2.5.29.28", "issuingDistributionPoint" }, + { "2.5.29.29", "certificateIssuer" }, + { "2.5.29.30", "nameConstraints" }, + { "2.5.29.31", "cRLDistributionPoints", 1 }, + { "2.5.29.32", "certificatePolicies", 1 }, + { "2.5.29.32.0", "anyPolicy" }, + { "2.5.29.33", "policyMappings" }, + { "2.5.29.35", "authorityKeyIdentifier", 1 }, + { "2.5.29.36", "policyConstraints" }, + { "2.5.29.37", "extKeyUsage", 1 }, + { "2.5.29.46", "freshestCRL" }, + { "2.5.29.54", "inhibitAnyPolicy" }, + + /* Netscape certificate extensions. */ + { "2.16.840.1.113730.1.1", "netscape-cert-type" }, + { "2.16.840.1.113730.1.2", "netscape-base-url" }, + { "2.16.840.1.113730.1.3", "netscape-revocation-url" }, + { "2.16.840.1.113730.1.4", "netscape-ca-revocation-url" }, + { "2.16.840.1.113730.1.7", "netscape-cert-renewal-url" }, + { "2.16.840.1.113730.1.8", "netscape-ca-policy-url" }, + { "2.16.840.1.113730.1.9", "netscape-homePage-url" }, + { "2.16.840.1.113730.1.10", "netscape-entitylogo" }, + { "2.16.840.1.113730.1.11", "netscape-userPicture" }, + { "2.16.840.1.113730.1.12", "netscape-ssl-server-name" }, + { "2.16.840.1.113730.1.13", "netscape-comment" }, + + /* GnuPG extensions */ + { "1.3.6.1.4.1.11591.2.1.1", "pkaAddress" }, + + { NULL } +}; + + +/* Return the description for OID; if no description is available + NULL is returned. */ +static const char * +get_oid_desc (const char *oid, unsigned int *flag) +{ + int i; + + if (oid) + for (i=0; oidtranstbl[i].oid; i++) + if (!strcmp (oidtranstbl[i].oid, oid)) + { + if (flag) + *flag = oidtranstbl[i].flag; + return oidtranstbl[i].name; + } + if (flag) + *flag = 0; + return NULL; +} + + +static void +print_key_data (ksba_cert_t cert, FILE *fp) +{ +#if 0 + int n = pk ? pubkey_get_npkey( pk->pubkey_algo ) : 0; + int i; + + for(i=0; i < n; i++ ) + { + fprintf (fp, "pkd:%d:%u:", i, mpi_get_nbits( pk->pkey[i] ) ); + mpi_print(stdout, pk->pkey[i], 1 ); + putchar(':'); + putchar('\n'); + } +#endif +} + +static void +print_capabilities (ksba_cert_t cert, FILE *fp) +{ + gpg_error_t err; + unsigned int use; + size_t buflen; + char buffer[1]; + + err = ksba_cert_get_user_data (cert, "is_qualified", + &buffer, sizeof (buffer), &buflen); + if (!err && buflen) + { + if (*buffer) + putc ('q', fp); + } + else if (gpg_err_code (err) == GPG_ERR_NOT_FOUND) + ; /* Don't know - will not get marked as 'q' */ + else + log_debug ("get_user_data(is_qualified) failed: %s\n", + gpg_strerror (err)); + + err = ksba_cert_get_key_usage (cert, &use); + if (gpg_err_code (err) == GPG_ERR_NO_DATA) + { + putc ('e', fp); + putc ('s', fp); + putc ('c', fp); + putc ('E', fp); + putc ('S', fp); + putc ('C', fp); + return; + } + if (err) + { + log_error (_("error getting key usage information: %s\n"), + gpg_strerror (err)); + return; + } + + if ((use & (KSBA_KEYUSAGE_KEY_ENCIPHERMENT|KSBA_KEYUSAGE_DATA_ENCIPHERMENT))) + putc ('e', fp); + if ((use & (KSBA_KEYUSAGE_DIGITAL_SIGNATURE|KSBA_KEYUSAGE_NON_REPUDIATION))) + putc ('s', fp); + if ((use & KSBA_KEYUSAGE_KEY_CERT_SIGN)) + putc ('c', fp); + if ((use & (KSBA_KEYUSAGE_KEY_ENCIPHERMENT|KSBA_KEYUSAGE_DATA_ENCIPHERMENT))) + putc ('E', fp); + if ((use & (KSBA_KEYUSAGE_DIGITAL_SIGNATURE|KSBA_KEYUSAGE_NON_REPUDIATION))) + putc ('S', fp); + if ((use & KSBA_KEYUSAGE_KEY_CERT_SIGN)) + putc ('C', fp); +} + + +static void +print_time (gnupg_isotime_t t, FILE *fp) +{ + if (!t || !*t) + ; + else + fputs (t, fp); +} + + +/* Return an allocated string with the email address extracted from a + DN */ +static char * +email_kludge (const char *name) +{ + const char *p, *string; + unsigned char *buf; + int n; + + string = name; + for (;;) + { + p = strstr (string, "1.2.840.113549.1.9.1=#"); + if (!p) + return NULL; + if (p == name || (p > string+1 && p[-1] == ',' && p[-2] != '\\')) + { + name = p + 22; + break; + } + string = p + 22; + } + + + /* This looks pretty much like an email address in the subject's DN + we use this to add an additional user ID entry. This way, + openSSL generated keys get a nicer and usable listing */ + for (n=0, p=name; hexdigitp (p) && hexdigitp (p+1); p +=2, n++) + ; + if (!n) + return NULL; + buf = xtrymalloc (n+3); + if (!buf) + return NULL; /* oops, out of core */ + *buf = '<'; + for (n=1, p=name; hexdigitp (p); p +=2, n++) + buf[n] = xtoi_2 (p); + buf[n++] = '>'; + buf[n] = 0; + return (char*)buf; +} + + + + +/* List one certificate in colon mode */ +static void +list_cert_colon (ctrl_t ctrl, ksba_cert_t cert, unsigned int validity, + FILE *fp, int have_secret) +{ + int rc; + int idx; + char truststring[2]; + char *p; + ksba_sexp_t sexp; + char *fpr; + ksba_isotime_t t; + gpg_error_t valerr; + int algo; + unsigned int nbits; + const char *chain_id; + char *chain_id_buffer = NULL; + int is_root = 0; + + if (ctrl->with_validation) + valerr = gpgsm_validate_chain (ctrl, cert, NULL, 1, NULL, 0); + else + valerr = 0; + + + /* We need to get the fingerprint and the chaining ID in advance. */ + fpr = gpgsm_get_fingerprint_hexstring (cert, GCRY_MD_SHA1); + { + ksba_cert_t next; + + rc = gpgsm_walk_cert_chain (cert, &next); + if (!rc) /* We known the issuer's certificate. */ + { + p = gpgsm_get_fingerprint_hexstring (next, GCRY_MD_SHA1); + chain_id_buffer = p; + chain_id = chain_id_buffer; + ksba_cert_release (next); + } + else if (rc == -1) /* We have reached the root certificate. */ + { + chain_id = fpr; + is_root = 1; + } + else + chain_id = NULL; + } + + + fputs (have_secret? "crs:":"crt:", fp); + + /* Note: We can't use multiple flags, like "ei", because the + validation check does only return one error. */ + truststring[0] = 0; + truststring[1] = 0; + if ((validity & VALIDITY_REVOKED) + || gpg_err_code (valerr) == GPG_ERR_CERT_REVOKED) + *truststring = 'r'; + else if (gpg_err_code (valerr) == GPG_ERR_CERT_EXPIRED) + *truststring = 'e'; + else + { + /* Lets also check whether the certificate under question + expired. This is merely a hack until we found a proper way + to store the expiration flag in the keybox. */ + ksba_isotime_t current_time, not_after; + + gnupg_get_isotime (current_time); + if (!opt.ignore_expiration + && !ksba_cert_get_validity (cert, 1, not_after) + && *not_after && strcmp (current_time, not_after) > 0 ) + *truststring = 'e'; + else if (valerr) + *truststring = 'i'; + } + + /* Is we have no truststring yet (i.e. the certificate might be + good) and this is a root certificate, we ask the agent whether + this is a trusted root certificate. */ + if (!*truststring && is_root) + { + rc = gpgsm_agent_istrusted (ctrl, cert); + if (!rc) + *truststring = 'u'; /* Yes, we trust this one (ultimately). */ + else if (gpg_err_code (rc) == GPG_ERR_NOT_TRUSTED) + *truststring = 'n'; /* No, we do not trust this one. */ + /* (in case of an error we can't tell anything.) */ + } + + if (*truststring) + fputs (truststring, fp); + + algo = gpgsm_get_key_algo_info (cert, &nbits); + fprintf (fp, ":%u:%d:%s:", nbits, algo, fpr+24); + + /* We assume --fixed-list-mode for gpgsm */ + ksba_cert_get_validity (cert, 0, t); + print_time (t, fp); + putc (':', fp); + ksba_cert_get_validity (cert, 1, t); + print_time ( t, fp); + putc (':', fp); + /* Field 8, serial number: */ + if ((sexp = ksba_cert_get_serial (cert))) + { + int len; + const unsigned char *s = sexp; + + if (*s == '(') + { + s++; + for (len=0; *s && *s != ':' && digitp (s); s++) + len = len*10 + atoi_1 (s); + if (*s == ':') + for (s++; len; len--, s++) + fprintf (fp,"%02X", *s); + } + xfree (sexp); + } + putc (':', fp); + /* Field 9, ownertrust - not used here */ + putc (':', fp); + /* field 10, old user ID - we use it here for the issuer DN */ + if ((p = ksba_cert_get_issuer (cert,0))) + { + print_sanitized_string (fp, p, ':'); + xfree (p); + } + putc (':', fp); + /* Field 11, signature class - not used */ + putc (':', fp); + /* Field 12, capabilities: */ + print_capabilities (cert, fp); + putc (':', fp); + putc ('\n', fp); + + /* FPR record */ + fprintf (fp, "fpr:::::::::%s:::", fpr); + /* Print chaining ID (field 13)*/ + if (chain_id) + fputs (chain_id, fp); + putc (':', fp); + putc ('\n', fp); + xfree (fpr); fpr = NULL; chain_id = NULL; + xfree (chain_id_buffer); chain_id_buffer = NULL; + + if (opt.with_key_data) + { + if ( (p = gpgsm_get_keygrip_hexstring (cert))) + { + fprintf (fp, "grp:::::::::%s:\n", p); + xfree (p); + } + print_key_data (cert, fp); + } + + for (idx=0; (p = ksba_cert_get_subject (cert,idx)); idx++) + { + fprintf (fp, "uid:%s::::::::", truststring); + print_sanitized_string (fp, p, ':'); + putc (':', fp); + putc (':', fp); + putc ('\n', fp); + if (!idx) + { + /* It would be better to get the faked email address from + the keydb. But as long as we don't have a way to pass + the meta data back, we just check it the same way as the + code used to create the keybox meta data does */ + char *pp = email_kludge (p); + if (pp) + { + fprintf (fp, "uid:%s::::::::", truststring); + print_sanitized_string (fp, pp, ':'); + putc (':', fp); + putc (':', fp); + putc ('\n', fp); + xfree (pp); + } + } + xfree (p); + } +} + + +static void +print_name_raw (FILE *fp, const char *string) +{ + if (!string) + fputs ("[error]", fp); + else + print_sanitized_string (fp, string, 0); +} + +static void +print_names_raw (FILE *fp, int indent, ksba_name_t name) +{ + int idx; + const char *s; + int indent_all; + + if ((indent_all = (indent < 0))) + indent = - indent; + + if (!name) + { + fputs ("none\n", fp); + return; + } + + for (idx=0; (s = ksba_name_enum (name, idx)); idx++) + { + char *p = ksba_name_get_uri (name, idx); + printf ("%*s", idx||indent_all?indent:0, ""); + print_sanitized_string (fp, p?p:s, 0); + putc ('\n', fp); + xfree (p); + } +} + + +/* List one certificate in raw mode useful to have a closer look at + the certificate. This one does no beautification and only minimal + output sanitation. It is mainly useful for debugging. */ +static void +list_cert_raw (ctrl_t ctrl, KEYDB_HANDLE hd, + ksba_cert_t cert, FILE *fp, int have_secret, + int with_validation) +{ + gpg_error_t err; + size_t off, len; + ksba_sexp_t sexp, keyid; + char *dn; + ksba_isotime_t t; + int idx, i; + int is_ca, chainlen; + unsigned int kusage; + char *string, *p, *pend; + const char *oid, *s; + ksba_name_t name, name2; + unsigned int reason; + + sexp = ksba_cert_get_serial (cert); + fputs ("Serial number: ", fp); + gpgsm_print_serial (fp, sexp); + ksba_free (sexp); + putc ('\n', fp); + + dn = ksba_cert_get_issuer (cert, 0); + fputs (" Issuer: ", fp); + print_name_raw (fp, dn); + ksba_free (dn); + putc ('\n', fp); + for (idx=1; (dn = ksba_cert_get_issuer (cert, idx)); idx++) + { + fputs (" aka: ", fp); + print_name_raw (fp, dn); + ksba_free (dn); + putc ('\n', fp); + } + + dn = ksba_cert_get_subject (cert, 0); + fputs (" Subject: ", fp); + print_name_raw (fp, dn); + ksba_free (dn); + putc ('\n', fp); + for (idx=1; (dn = ksba_cert_get_subject (cert, idx)); idx++) + { + fputs (" aka: ", fp); + print_name_raw (fp, dn); + ksba_free (dn); + putc ('\n', fp); + } + + dn = gpgsm_get_fingerprint_string (cert, 0); + fprintf (fp, " sha1_fpr: %s\n", dn?dn:"error"); + xfree (dn); + + dn = gpgsm_get_fingerprint_string (cert, GCRY_MD_MD5); + fprintf (fp, " md5_fpr: %s\n", dn?dn:"error"); + xfree (dn); + + dn = gpgsm_get_certid (cert); + fprintf (fp, " certid: %s\n", dn?dn:"error"); + xfree (dn); + + dn = gpgsm_get_keygrip_hexstring (cert); + fprintf (fp, " keygrip: %s\n", dn?dn:"error"); + xfree (dn); + + ksba_cert_get_validity (cert, 0, t); + fputs (" notBefore: ", fp); + gpgsm_print_time (fp, t); + putc ('\n', fp); + fputs (" notAfter: ", fp); + ksba_cert_get_validity (cert, 1, t); + gpgsm_print_time (fp, t); + putc ('\n', fp); + + oid = ksba_cert_get_digest_algo (cert); + s = get_oid_desc (oid, NULL); + fprintf (fp, " hashAlgo: %s%s%s%s\n", oid, s?" (":"",s?s:"",s?")":""); + + { + const char *algoname; + unsigned int nbits; + + algoname = gcry_pk_algo_name (gpgsm_get_key_algo_info (cert, &nbits)); + fprintf (fp, " keyType: %u bit %s\n", nbits, algoname? algoname:"?"); + } + + /* subjectKeyIdentifier */ + fputs (" subjKeyId: ", fp); + err = ksba_cert_get_subj_key_id (cert, NULL, &keyid); + if (!err || gpg_err_code (err) == GPG_ERR_NO_DATA) + { + if (gpg_err_code (err) == GPG_ERR_NO_DATA) + fputs ("[none]\n", fp); + else + { + gpgsm_print_serial (fp, keyid); + ksba_free (keyid); + putc ('\n', fp); + } + } + else + fputs ("[?]\n", fp); + + + /* authorityKeyIdentifier */ + fputs (" authKeyId: ", fp); + err = ksba_cert_get_auth_key_id (cert, &keyid, &name, &sexp); + if (!err || gpg_err_code (err) == GPG_ERR_NO_DATA) + { + if (gpg_err_code (err) == GPG_ERR_NO_DATA || !name) + fputs ("[none]\n", fp); + else + { + gpgsm_print_serial (fp, sexp); + ksba_free (sexp); + putc ('\n', fp); + print_names_raw (fp, -15, name); + ksba_name_release (name); + } + if (keyid) + { + fputs (" authKeyId.ki: ", fp); + gpgsm_print_serial (fp, keyid); + ksba_free (keyid); + putc ('\n', fp); + } + } + else + fputs ("[?]\n", fp); + + fputs (" keyUsage: ", fp); + err = ksba_cert_get_key_usage (cert, &kusage); + if (gpg_err_code (err) != GPG_ERR_NO_DATA) + { + if (err) + fprintf (fp, " [error: %s]", gpg_strerror (err)); + else + { + if ( (kusage & KSBA_KEYUSAGE_DIGITAL_SIGNATURE)) + fputs (" digitalSignature", fp); + if ( (kusage & KSBA_KEYUSAGE_NON_REPUDIATION)) + fputs (" nonRepudiation", fp); + if ( (kusage & KSBA_KEYUSAGE_KEY_ENCIPHERMENT)) + fputs (" keyEncipherment", fp); + if ( (kusage & KSBA_KEYUSAGE_DATA_ENCIPHERMENT)) + fputs (" dataEncipherment", fp); + if ( (kusage & KSBA_KEYUSAGE_KEY_AGREEMENT)) + fputs (" keyAgreement", fp); + if ( (kusage & KSBA_KEYUSAGE_KEY_CERT_SIGN)) + fputs (" certSign", fp); + if ( (kusage & KSBA_KEYUSAGE_CRL_SIGN)) + fputs (" crlSign", fp); + if ( (kusage & KSBA_KEYUSAGE_ENCIPHER_ONLY)) + fputs (" encipherOnly", fp); + if ( (kusage & KSBA_KEYUSAGE_DECIPHER_ONLY)) + fputs (" decipherOnly", fp); + } + putc ('\n', fp); + } + else + fputs ("[none]\n", fp); + + fputs (" extKeyUsage: ", fp); + err = ksba_cert_get_ext_key_usages (cert, &string); + if (gpg_err_code (err) != GPG_ERR_NO_DATA) + { + if (err) + fprintf (fp, "[error: %s]", gpg_strerror (err)); + else + { + p = string; + while (p && (pend=strchr (p, ':'))) + { + *pend++ = 0; + for (i=0; key_purpose_map[i].oid; i++) + if ( !strcmp (key_purpose_map[i].oid, p) ) + break; + fputs (key_purpose_map[i].oid?key_purpose_map[i].name:p, fp); + p = pend; + if (*p != 'C') + fputs (" (suggested)", fp); + if ((p = strchr (p, '\n'))) + { + p++; + fputs ("\n ", fp); + } + } + xfree (string); + } + putc ('\n', fp); + } + else + fputs ("[none]\n", fp); + + + fputs (" policies: ", fp); + err = ksba_cert_get_cert_policies (cert, &string); + if (gpg_err_code (err) != GPG_ERR_NO_DATA) + { + if (err) + fprintf (fp, "[error: %s]", gpg_strerror (err)); + else + { + p = string; + while (p && (pend=strchr (p, ':'))) + { + *pend++ = 0; + for (i=0; key_purpose_map[i].oid; i++) + if ( !strcmp (key_purpose_map[i].oid, p) ) + break; + fputs (p, fp); + p = pend; + if (*p == 'C') + fputs (" (critical)", fp); + if ((p = strchr (p, '\n'))) + { + p++; + fputs ("\n ", fp); + } + } + xfree (string); + } + putc ('\n', fp); + } + else + fputs ("[none]\n", fp); + + fputs (" chainLength: ", fp); + err = ksba_cert_is_ca (cert, &is_ca, &chainlen); + if (err || is_ca) + { + if (err) + fprintf (fp, "[error: %s]", gpg_strerror (err)); + else if (chainlen == -1) + fputs ("unlimited", fp); + else + fprintf (fp, "%d", chainlen); + putc ('\n', fp); + } + else + fputs ("not a CA\n", fp); + + + /* CRL distribution point */ + for (idx=0; !(err=ksba_cert_get_crl_dist_point (cert, idx, &name, &name2, + &reason)) ;idx++) + { + fputs (" crlDP: ", fp); + print_names_raw (fp, 15, name); + if (reason) + { + fputs (" reason: ", fp); + if ( (reason & KSBA_CRLREASON_UNSPECIFIED)) + fputs (" unused", stdout); + if ( (reason & KSBA_CRLREASON_KEY_COMPROMISE)) + fputs (" keyCompromise", stdout); + if ( (reason & KSBA_CRLREASON_CA_COMPROMISE)) + fputs (" caCompromise", stdout); + if ( (reason & KSBA_CRLREASON_AFFILIATION_CHANGED)) + fputs (" affiliationChanged", stdout); + if ( (reason & KSBA_CRLREASON_SUPERSEDED)) + fputs (" superseded", stdout); + if ( (reason & KSBA_CRLREASON_CESSATION_OF_OPERATION)) + fputs (" cessationOfOperation", stdout); + if ( (reason & KSBA_CRLREASON_CERTIFICATE_HOLD)) + fputs (" certificateHold", stdout); + putchar ('\n'); + } + fputs (" issuer: ", fp); + print_names_raw (fp, 23, name2); + ksba_name_release (name); + ksba_name_release (name2); + } + if (err && gpg_err_code (err) != GPG_ERR_EOF) + fputs (" crlDP: [error]\n", fp); + else if (!idx) + fputs (" crlDP: [none]\n", fp); + + + /* authorityInfoAccess. */ + for (idx=0; !(err=ksba_cert_get_authority_info_access (cert, idx, &string, + &name)); idx++) + { + fputs (" authInfo: ", fp); + s = get_oid_desc (string, NULL); + fprintf (fp, "%s%s%s%s\n", string, s?" (":"", s?s:"", s?")":""); + print_names_raw (fp, -15, name); + ksba_name_release (name); + ksba_free (string); + } + if (err && gpg_err_code (err) != GPG_ERR_EOF) + fputs (" authInfo: [error]\n", fp); + else if (!idx) + fputs (" authInfo: [none]\n", fp); + + /* subjectInfoAccess. */ + for (idx=0; !(err=ksba_cert_get_subject_info_access (cert, idx, &string, + &name)); idx++) + { + fputs (" subjectInfo: ", fp); + s = get_oid_desc (string, NULL); + fprintf (fp, "%s%s%s%s\n", string, s?" (":"", s?s:"", s?")":""); + print_names_raw (fp, -15, name); + ksba_name_release (name); + ksba_free (string); + } + if (err && gpg_err_code (err) != GPG_ERR_EOF) + fputs (" subjInfo: [error]\n", fp); + else if (!idx) + fputs (" subjInfo: [none]\n", fp); + + + for (idx=0; !(err=ksba_cert_get_extension (cert, idx, + &oid, &i, &off, &len));idx++) + { + unsigned int flag; + + s = get_oid_desc (oid, &flag); + + if (!(flag & 1)) + fprintf (fp, " %s: %s%s%s%s [%d octets]\n", + i? "critExtn":" extn", + oid, s?" (":"", s?s:"", s?")":"", (int)len); + } + + + if (with_validation) + { + err = gpgsm_validate_chain (ctrl, cert, NULL, 1, fp, 0); + if (!err) + fprintf (fp, " [certificate is good]\n"); + else + fprintf (fp, " [certificate is bad: %s]\n", gpg_strerror (err)); + } + + if (opt.with_ephemeral_keys && hd) + { + unsigned int blobflags; + + err = keydb_get_flags (hd, KEYBOX_FLAG_BLOB, 0, &blobflags); + if (err) + fprintf (fp, " [error getting keyflags: %s]\n", gpg_strerror (err)); + else if ((blobflags & 2)) + fprintf (fp, " [stored as ephemeral]\n"); + } + +} + + + + +/* List one certificate in standard mode */ +static void +list_cert_std (ctrl_t ctrl, ksba_cert_t cert, FILE *fp, int have_secret, + int with_validation) +{ + gpg_error_t err; + ksba_sexp_t sexp; + char *dn; + ksba_isotime_t t; + int idx, i; + int is_ca, chainlen; + unsigned int kusage; + char *string, *p, *pend; + + sexp = ksba_cert_get_serial (cert); + fputs ("Serial number: ", fp); + gpgsm_print_serial (fp, sexp); + ksba_free (sexp); + putc ('\n', fp); + + dn = ksba_cert_get_issuer (cert, 0); + fputs (" Issuer: ", fp); + gpgsm_print_name (fp, dn); + ksba_free (dn); + putc ('\n', fp); + for (idx=1; (dn = ksba_cert_get_issuer (cert, idx)); idx++) + { + fputs (" aka: ", fp); + gpgsm_print_name (fp, dn); + ksba_free (dn); + putc ('\n', fp); + } + + dn = ksba_cert_get_subject (cert, 0); + fputs (" Subject: ", fp); + gpgsm_print_name (fp, dn); + ksba_free (dn); + putc ('\n', fp); + for (idx=1; (dn = ksba_cert_get_subject (cert, idx)); idx++) + { + fputs (" aka: ", fp); + gpgsm_print_name (fp, dn); + ksba_free (dn); + putc ('\n', fp); + } + + ksba_cert_get_validity (cert, 0, t); + fputs (" validity: ", fp); + gpgsm_print_time (fp, t); + fputs (" through ", fp); + ksba_cert_get_validity (cert, 1, t); + gpgsm_print_time (fp, t); + putc ('\n', fp); + + + { + const char *algoname; + unsigned int nbits; + + algoname = gcry_pk_algo_name (gpgsm_get_key_algo_info (cert, &nbits)); + fprintf (fp, " key type: %u bit %s\n", nbits, algoname? algoname:"?"); + } + + + err = ksba_cert_get_key_usage (cert, &kusage); + if (gpg_err_code (err) != GPG_ERR_NO_DATA) + { + fputs (" key usage:", fp); + if (err) + fprintf (fp, " [error: %s]", gpg_strerror (err)); + else + { + if ( (kusage & KSBA_KEYUSAGE_DIGITAL_SIGNATURE)) + fputs (" digitalSignature", fp); + if ( (kusage & KSBA_KEYUSAGE_NON_REPUDIATION)) + fputs (" nonRepudiation", fp); + if ( (kusage & KSBA_KEYUSAGE_KEY_ENCIPHERMENT)) + fputs (" keyEncipherment", fp); + if ( (kusage & KSBA_KEYUSAGE_DATA_ENCIPHERMENT)) + fputs (" dataEncipherment", fp); + if ( (kusage & KSBA_KEYUSAGE_KEY_AGREEMENT)) + fputs (" keyAgreement", fp); + if ( (kusage & KSBA_KEYUSAGE_KEY_CERT_SIGN)) + fputs (" certSign", fp); + if ( (kusage & KSBA_KEYUSAGE_CRL_SIGN)) + fputs (" crlSign", fp); + if ( (kusage & KSBA_KEYUSAGE_ENCIPHER_ONLY)) + fputs (" encipherOnly", fp); + if ( (kusage & KSBA_KEYUSAGE_DECIPHER_ONLY)) + fputs (" decipherOnly", fp); + } + putc ('\n', fp); + } + + err = ksba_cert_get_ext_key_usages (cert, &string); + if (gpg_err_code (err) != GPG_ERR_NO_DATA) + { + fputs ("ext key usage: ", fp); + if (err) + fprintf (fp, "[error: %s]", gpg_strerror (err)); + else + { + p = string; + while (p && (pend=strchr (p, ':'))) + { + *pend++ = 0; + for (i=0; key_purpose_map[i].oid; i++) + if ( !strcmp (key_purpose_map[i].oid, p) ) + break; + fputs (key_purpose_map[i].oid?key_purpose_map[i].name:p, fp); + p = pend; + if (*p != 'C') + fputs (" (suggested)", fp); + if ((p = strchr (p, '\n'))) + { + p++; + fputs (", ", fp); + } + } + xfree (string); + } + putc ('\n', fp); + } + + err = ksba_cert_get_cert_policies (cert, &string); + if (gpg_err_code (err) != GPG_ERR_NO_DATA) + { + fputs (" policies: ", fp); + if (err) + fprintf (fp, "[error: %s]", gpg_strerror (err)); + else + { + for (p=string; *p; p++) + { + if (*p == '\n') + *p = ','; + } + print_sanitized_string (fp, string, 0); + xfree (string); + } + putc ('\n', fp); + } + + err = ksba_cert_is_ca (cert, &is_ca, &chainlen); + if (err || is_ca) + { + fputs (" chain length: ", fp); + if (err) + fprintf (fp, "[error: %s]", gpg_strerror (err)); + else if (chainlen == -1) + fputs ("unlimited", fp); + else + fprintf (fp, "%d", chainlen); + putc ('\n', fp); + } + + if (opt.with_md5_fingerprint) + { + dn = gpgsm_get_fingerprint_string (cert, GCRY_MD_MD5); + fprintf (fp, " md5 fpr: %s\n", dn?dn:"error"); + xfree (dn); + } + + dn = gpgsm_get_fingerprint_string (cert, 0); + fprintf (fp, " fingerprint: %s\n", dn?dn:"error"); + xfree (dn); + + + + if (with_validation) + { + gpg_error_t tmperr; + size_t buflen; + char buffer[1]; + + err = gpgsm_validate_chain (ctrl, cert, NULL, 1, fp, 0); + tmperr = ksba_cert_get_user_data (cert, "is_qualified", + &buffer, sizeof (buffer), &buflen); + if (!tmperr && buflen) + { + if (*buffer) + fputs (" [qualified]\n", fp); + } + else if (gpg_err_code (tmperr) == GPG_ERR_NOT_FOUND) + ; /* Don't know - will not get marked as 'q' */ + else + log_debug ("get_user_data(is_qualified) failed: %s\n", + gpg_strerror (tmperr)); + + if (!err) + fprintf (fp, " [certificate is good]\n"); + else + fprintf (fp, " [certificate is bad: %s]\n", gpg_strerror (err)); + } +} + + +/* Same as standard mode mode list all certifying certs too. */ +static void +list_cert_chain (ctrl_t ctrl, KEYDB_HANDLE hd, + ksba_cert_t cert, int raw_mode, + FILE *fp, int with_validation) +{ + ksba_cert_t next = NULL; + + if (raw_mode) + list_cert_raw (ctrl, hd, cert, fp, 0, with_validation); + else + list_cert_std (ctrl, cert, fp, 0, with_validation); + ksba_cert_ref (cert); + while (!gpgsm_walk_cert_chain (cert, &next)) + { + ksba_cert_release (cert); + fputs ("Certified by\n", fp); + if (raw_mode) + list_cert_raw (ctrl, hd, next, fp, 0, with_validation); + else + list_cert_std (ctrl, next, fp, 0, with_validation); + cert = next; + } + ksba_cert_release (cert); + putc ('\n', fp); +} + + + +/* List all internal keys or just the keys given as NAMES. MODE is a + bit vector to specify what keys are to be included; see + gpgsm_list_keys (below) for details. If RAW_MODE is true, the raw + output mode will be used intead of the standard beautified one. + */ +static gpg_error_t +list_internal_keys (ctrl_t ctrl, STRLIST names, FILE *fp, + unsigned int mode, int raw_mode) +{ + KEYDB_HANDLE hd; + KEYDB_SEARCH_DESC *desc = NULL; + STRLIST sl; + int ndesc; + ksba_cert_t cert = NULL; + gpg_error_t rc = 0; + const char *lastresname, *resname; + int have_secret; + + hd = keydb_new (0); + if (!hd) + { + log_error ("keydb_new failed\n"); + rc = gpg_error (GPG_ERR_GENERAL); + goto leave; + } + + if (!names) + ndesc = 1; + else + { + for (sl=names, ndesc=0; sl; sl = sl->next, ndesc++) + ; + } + + desc = xtrycalloc (ndesc, sizeof *desc); + if (!ndesc) + { + rc = gpg_error_from_errno (errno); + log_error ("out of core\n"); + goto leave; + } + + if (!names) + desc[0].mode = KEYDB_SEARCH_MODE_FIRST; + else + { + for (ndesc=0, sl=names; sl; sl = sl->next) + { + rc = keydb_classify_name (sl->d, desc+ndesc); + if (rc) + { + log_error ("key `%s' not found: %s\n", + sl->d, gpg_strerror (rc)); + rc = 0; + } + else + ndesc++; + } + + } + + if (opt.with_ephemeral_keys) + keydb_set_ephemeral (hd, 1); + + /* 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 */ + + lastresname = NULL; + while (!(rc = keydb_search (hd, desc, ndesc))) + { + unsigned int validity; + + if (!names) + desc[0].mode = KEYDB_SEARCH_MODE_NEXT; + + rc = keydb_get_flags (hd, KEYBOX_FLAG_VALIDITY, 0, &validity); + if (rc) + { + log_error ("keydb_get_flags failed: %s\n", gpg_strerror (rc)); + goto leave; + } + rc = keydb_get_cert (hd, &cert); + if (rc) + { + log_error ("keydb_get_cert failed: %s\n", gpg_strerror (rc)); + goto leave; + } + + resname = keydb_get_resource_name (hd); + + if (lastresname != resname ) + { + int i; + + if (ctrl->no_server) + { + fprintf (fp, "%s\n", resname ); + for (i=strlen(resname); i; i-- ) + putchar('-'); + putc ('\n', fp); + lastresname = resname; + } + } + + have_secret = 0; + if (mode) + { + char *p = gpgsm_get_keygrip_hexstring (cert); + if (p) + { + rc = gpgsm_agent_havekey (ctrl, p); + if (!rc) + have_secret = 1; + else if ( gpg_err_code (rc) != GPG_ERR_NO_SECKEY) + goto leave; + rc = 0; + xfree (p); + } + } + + if (!mode + || ((mode & 1) && !have_secret) + || ((mode & 2) && have_secret) ) + { + if (ctrl->with_colons) + list_cert_colon (ctrl, cert, validity, fp, have_secret); + else if (ctrl->with_chain) + list_cert_chain (ctrl, hd, cert, + raw_mode, fp, ctrl->with_validation); + else + { + if (raw_mode) + list_cert_raw (ctrl, hd, cert, fp, have_secret, + ctrl->with_validation); + else + list_cert_std (ctrl, cert, fp, have_secret, + ctrl->with_validation); + putc ('\n', fp); + } + } + ksba_cert_release (cert); + cert = NULL; + } + if (gpg_err_code (rc) == GPG_ERR_EOF || rc == -1 ) + rc = 0; + if (rc) + log_error ("keydb_search failed: %s\n", gpg_strerror (rc)); + + leave: + ksba_cert_release (cert); + xfree (desc); + keydb_release (hd); + return rc; +} + + + +static void +list_external_cb (void *cb_value, ksba_cert_t cert) +{ + struct list_external_parm_s *parm = cb_value; + + if (keydb_store_cert (cert, 1, NULL)) + log_error ("error storing certificate as ephemeral\n"); + + if (parm->print_header) + { + const char *resname = "[external keys]"; + int i; + + fprintf (parm->fp, "%s\n", resname ); + for (i=strlen(resname); i; i-- ) + putchar('-'); + putc ('\n', parm->fp); + parm->print_header = 0; + } + + if (parm->with_colons) + list_cert_colon (parm->ctrl, cert, 0, parm->fp, 0); + else if (parm->with_chain) + list_cert_chain (parm->ctrl, NULL, cert, parm->raw_mode, parm->fp, 0); + else + { + if (parm->raw_mode) + list_cert_raw (parm->ctrl, NULL, cert, parm->fp, 0, 0); + else + list_cert_std (parm->ctrl, cert, parm->fp, 0, 0); + putc ('\n', parm->fp); + } +} + + +/* List external keys similar to internal one. Note: mode does not + make sense here because it would be unwise to list external secret + keys */ +static gpg_error_t +list_external_keys (CTRL ctrl, STRLIST names, FILE *fp, int raw_mode) +{ + int rc; + struct list_external_parm_s parm; + + parm.fp = fp; + parm.ctrl = ctrl, + parm.print_header = ctrl->no_server; + parm.with_colons = ctrl->with_colons; + parm.with_chain = ctrl->with_chain; + parm.raw_mode = raw_mode; + + rc = gpgsm_dirmngr_lookup (ctrl, names, list_external_cb, &parm); + if (rc) + log_error ("listing external keys failed: %s\n", gpg_strerror (rc)); + return rc; +} + +/* List all keys or just the key given as NAMES. + MODE controls the operation mode: + Bit 0-2: + 0 = list all public keys but don't flag secret ones + 1 = list only public keys + 2 = list only secret keys + 3 = list secret and public keys + Bit 6: list internal keys + Bit 7: list external keys + Bit 8: Do a raw format dump. + */ +gpg_error_t +gpgsm_list_keys (CTRL ctrl, STRLIST names, FILE *fp, unsigned int mode) +{ + gpg_error_t err = 0; + + if ((mode & (1<<6))) + err = list_internal_keys (ctrl, names, fp, (mode & 3), (mode&256)); + if (!err && (mode & (1<<7))) + err = list_external_keys (ctrl, names, fp, (mode&256)); + return err; +} diff --git a/sm/misc.c b/sm/misc.c new file mode 100644 index 000000000..86cb506d6 --- /dev/null +++ b/sm/misc.c @@ -0,0 +1,83 @@ +/* misc.c - Miscellaneous fucntions + * 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. + */ + +#include <config.h> +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> +#include <unistd.h> +#ifdef HAVE_LOCALE_H +#include <locale.h> +#endif + +#include "gpgsm.h" +#include "i18n.h" +#include "setenv.h" + +/* Setup the environment so that the pinentry is able to get all + required information. This is used prior to an exec of the + protect-tool. */ +void +setup_pinentry_env (void) +{ +#ifndef HAVE_W32_SYSTEM + char *lc; + + if (opt.display) + setenv ("DISPLAY", opt.display, 1); + + /* Try to make sure that GPG_TTY has been set. This is needed if we + call for example the protect-tools with redirected stdin and thus + it won't be able to ge a default by itself. Try to do it here + but print a warning. */ + if (opt.ttyname) + setenv ("GPG_TTY", opt.ttyname, 1); + else if (!(lc=getenv ("GPG_TTY")) || !*lc) + { + log_error (_("GPG_TTY has not been set - " + "using maybe bogus default\n")); + lc = ttyname (0); + if (!lc) + lc = "/dev/tty"; + setenv ("GPG_TTY", lc, 1); + } + + if (opt.ttytype) + setenv ("TERM", opt.ttytype, 1); + + if (opt.lc_ctype) + setenv ("LC_CTYPE", opt.lc_ctype, 1); +#if defined(HAVE_SETLOCALE) && defined(LC_CTYPE) + else if ( (lc = setlocale (LC_CTYPE, "")) ) + setenv ("LC_CTYPE", lc, 1); +#endif + + if (opt.lc_messages) + setenv ("LC_MESSAGES", opt.lc_messages, 1); +#if defined(HAVE_SETLOCALE) && defined(LC_MESSAGES) + else if ( (lc = setlocale (LC_MESSAGES, "")) ) + setenv ("LC_MESSAGES", lc, 1); +#endif +#endif /*!HAVE_W32_SYSTEM*/ +} + diff --git a/sm/qualified.c b/sm/qualified.c new file mode 100644 index 000000000..474e1488d --- /dev/null +++ b/sm/qualified.c @@ -0,0 +1,368 @@ +/* qualified.c - Routines related to qualified signatures + * 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> +#include <stdarg.h> +#include <assert.h> +#include <errno.h> +#ifdef HAVE_LOCALE_H +#include <locale.h> +#endif +#ifdef HAVE_LANGINFO_CODESET +#include <langinfo.h> +#endif + +#include "gpgsm.h" +#include "i18n.h" +#include <ksba.h> + + +/* We open the file only once and keep the open file pointer as well + as the name of the file here. Note that, a listname not equal to + NULL indicates that this module has been intialized and if the + LISTFP is also NULL, no list of qualified signatures exists. */ +static char *listname; +static FILE *listfp; + + +/* Read the trustlist and return entry by entry. KEY must point to a + buffer of at least 41 characters. COUNTRY shall be a buffer of at + least 3 characters to receive the country code of that qualified + signature (i.e. "de" for German and "be" for Belgium). + + Reading a valid entry returns 0, EOF is indicated by GPG_ERR_EOF + and any other error condition is indicated by the appropriate error + code. */ +static gpg_error_t +read_list (char *key, char *country, int *lnr) +{ + gpg_error_t err; + int c, i, j; + char *p, line[256]; + + *key = 0; + *country = 0; + + if (!listname) + { + listname = make_filename (GNUPG_DATADIR, "qualified.txt", NULL); + listfp = fopen (listname, "r"); + if (!listfp && errno != ENOENT) + { + err = gpg_error_from_errno (errno); + log_error (_("can't open `%s': %s\n"), listname, gpg_strerror (err)); + return err; + } + } + + if (!listfp) + return gpg_error (GPG_ERR_EOF); + + do + { + if (!fgets (line, DIM(line)-1, listfp) ) + { + if (feof (listfp)) + return gpg_error (GPG_ERR_EOF); + return gpg_error_from_errno (errno); + } + + if (!*line || line[strlen(line)-1] != '\n') + { + /* Eat until end of line. */ + while ( (c=getc (listfp)) != EOF && c != '\n') + ; + return gpg_error (*line? GPG_ERR_LINE_TOO_LONG + : GPG_ERR_INCOMPLETE_LINE); + } + ++*lnr; + + /* Allow for empty lines and spaces */ + for (p=line; spacep (p); p++) + ; + } + while (!*p || *p == '\n' || *p == '#'); + + for (i=j=0; (p[i] == ':' || hexdigitp (p+i)) && j < 40; i++) + if ( p[i] != ':' ) + key[j++] = p[i] >= 'a'? (p[i] & 0xdf): p[i]; + key[j] = 0; + if (j != 40 || !(spacep (p+i) || p[i] == '\n')) + { + log_error (_("invalid formatted fingerprint in `%s', line %d\n"), + listname, *lnr); + return gpg_error (GPG_ERR_BAD_DATA); + } + assert (p[i]); + i++; + while (spacep (p+i)) + i++; + if ( p[i] >= 'a' && p[i] <= 'z' + && p[i+1] >= 'a' && p[i+1] <= 'z' + && (spacep (p+i+2) || p[i+2] == '\n')) + { + country[0] = p[i]; + country[1] = p[i+1]; + country[2] = 0; + } + else + { + log_error (_("invalid country code in `%s', line %d\n"), listname, *lnr); + return gpg_error (GPG_ERR_BAD_DATA); + } + + return 0; +} + + + + +/* Check whether the certificate CERT is included in the list of + qualified certificates. This list is similar to the "trustlist.txt" + as maintained by gpg-agent and includes fingerprints of root + certificates to be used for qualified (legally binding like + handwritten) signatures. We keep this list system wide and not + per user because it is not a decision of the user. + + Returns: 0 if the certificate is included. GPG_ERR_NOT_FOUND if it + is not in the list or any other error (e.g. if no list of + qualified signatures is available. If COUNTRY has not been passed + as NULL a string witha maximum length of 2 will be copied into it; + thus the caller needs to provide a buffer of length 3. */ +gpg_error_t +gpgsm_is_in_qualified_list (ctrl_t ctrl, ksba_cert_t cert, char *country) +{ + gpg_error_t err; + char *fpr; + char key[41]; + char mycountry[3]; + int lnr = 0; + + if (country) + *country = 0; + + fpr = gpgsm_get_fingerprint_hexstring (cert, GCRY_MD_SHA1); + if (!fpr) + return gpg_error (GPG_ERR_GENERAL); + + if (listfp) + rewind (listfp); + while (!(err = read_list (key, mycountry, &lnr))) + { + if (!strcmp (key, fpr)) + break; + } + if (gpg_err_code (err) == GPG_ERR_EOF) + err = gpg_error (GPG_ERR_NOT_FOUND); + + if (!err && country) + strcpy (country, mycountry); + + xfree (fpr); + return err; +} + + +/* We know that CERT is a qualified certificate. Ask the user for + consent to actually create a signature using this certificate. + Returns: 0 for yes, GPG_ERR_CANCEL for no or any otehr error + code. */ +gpg_error_t +gpgsm_qualified_consent (ctrl_t ctrl, ksba_cert_t cert) +{ + gpg_error_t err; + char *name, *subject, *buffer, *p; + const char *s; + char *orig_codeset = NULL; + + name = ksba_cert_get_subject (cert, 0); + if (!name) + return gpg_error (GPG_ERR_GENERAL); + subject = gpgsm_format_name2 (name, 0); + ksba_free (name); name = NULL; + +#ifdef ENABLE_NLS + /* The Assuan agent protocol requires us to transmit utf-8 strings */ + orig_codeset = bind_textdomain_codeset (PACKAGE_GT, 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. + Note that bind_textdomain_codeset does only return on memory + errors but not if a codeset is not available. Thus we don't + bother printing a diagnostic here. */ + orig_codeset = xstrdup (orig_codeset); + if (!bind_textdomain_codeset (PACKAGE_GT, "utf-8")) + orig_codeset = NULL; + } +#endif + + if (asprintf (&name, + _("You are about to create a signature using your " + "certificate:\n" + "\"%s\"\n" + "This will create a qualified signature by law " + "equated to a handwritten signature.\n\n%s%s" + "Are you really sure that you want to do this?"), + subject? subject:"?", + opt.qualsig_approval? + "": + _("Note, that this software is not officially approved " + "to create or verify such signatures.\n"), + opt.qualsig_approval? "":"\n" + ) < 0 ) + err = gpg_error_from_errno (errno); + else + err = 0; + +#ifdef ENABLE_NLS + if (orig_codeset) + bind_textdomain_codeset (PACKAGE_GT, orig_codeset); +#endif + xfree (orig_codeset); + xfree (subject); + + if (err) + return err; + + buffer = p = xtrymalloc (strlen (name) * 3 + 1); + if (!buffer) + { + err = gpg_error_from_errno (errno); + free (name); + return err; + } + for (s=name; *s; s++) + { + if (*s < ' ' || *s == '+') + { + sprintf (p, "%%%02X", *(unsigned char *)s); + p += 3; + } + else if (*s == ' ') + *p++ = '+'; + else + *p++ = *s; + } + *p = 0; + free (name); + + + err = gpgsm_agent_get_confirmation (ctrl, buffer); + + xfree (buffer); + return err; +} + + +/* Popup a prompt to inform the user that the signature created is not + a qualified one. This is of course only done if we know that we + have been approved. */ +gpg_error_t +gpgsm_not_qualified_warning (ctrl_t ctrl, ksba_cert_t cert) +{ + gpg_error_t err; + char *name, *subject, *buffer, *p; + const char *s; + char *orig_codeset = NULL; + + if (!opt.qualsig_approval) + return 0; + + name = ksba_cert_get_subject (cert, 0); + if (!name) + return gpg_error (GPG_ERR_GENERAL); + subject = gpgsm_format_name2 (name, 0); + ksba_free (name); name = NULL; + + +#ifdef ENABLE_NLS + /* The Assuan agent protocol requires us to transmit utf-8 strings */ + orig_codeset = bind_textdomain_codeset (PACKAGE_GT, 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. + Note that bind_textdomain_codeset does only return on memory + errors but not if a codeset is not available. Thus we don't + bother printing a diagnostic here. */ + orig_codeset = xstrdup (orig_codeset); + if (!bind_textdomain_codeset (PACKAGE_GT, "utf-8")) + orig_codeset = NULL; + } +#endif + + if (asprintf (&name, + _("You are about to create a signature using your " + "certificate:\n" + "\"%s\"\n" + "Note, that this certificate will NOT create a " + "qualified signature!"), + subject? subject:"?") < 0 ) + err = gpg_error_from_errno (errno); + else + err = 0; + +#ifdef ENABLE_NLS + if (orig_codeset) + bind_textdomain_codeset (PACKAGE_GT, orig_codeset); +#endif + xfree (orig_codeset); + xfree (subject); + + if (err) + return err; + + buffer = p = xtrymalloc (strlen (name) * 3 + 1); + if (!buffer) + { + err = gpg_error_from_errno (errno); + free (name); + return err; + } + for (s=name; *s; s++) + { + if (*s < ' ' || *s == '+') + { + sprintf (p, "%%%02X", *(unsigned char *)s); + p += 3; + } + else if (*s == ' ') + *p++ = '+'; + else + *p++ = *s; + } + *p = 0; + free (name); + + + err = gpgsm_agent_get_confirmation (ctrl, buffer); + + xfree (buffer); + return err; +} diff --git a/sm/server.c b/sm/server.c new file mode 100644 index 000000000..57e5d8f38 --- /dev/null +++ b/sm/server.c @@ -0,0 +1,1125 @@ +/* server.c - Server mode and main entry point + * Copyright (C) 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 <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdarg.h> +#include <ctype.h> +#include <unistd.h> + +#include <assuan.h> + +#include "gpgsm.h" + +#define set_error(e,t) assuan_set_error (ctx, ASSUAN_ ## e, (t)) + + +/* The filepointer for status message used in non-server mode */ +static FILE *statusfp; + +/* Data used to assuciate an Assuan context with local server data */ +struct server_local_s { + assuan_context_t assuan_ctx; + int message_fd; + int list_internal; + int list_external; + certlist_t recplist; + certlist_t signerlist; + certlist_t default_recplist; /* As set by main() - don't release. */ +}; + + + +/* Note that it is sufficient to allocate the target string D as + long as the source string S, i.e.: strlen(s)+1; */ +static void +strcpy_escaped_plus (char *d, const char *s) +{ + while (*s) + { + if (*s == '%' && s[1] && s[2]) + { + s++; + *d++ = xtoi_2 (s); + s += 2; + } + else if (*s == '+') + *d++ = ' ', s++; + else + *d++ = *s++; + } + *d = 0; +} + + + + +/* Check whether the option NAME appears in LINE */ +static int +has_option (const char *line, const char *name) +{ + const char *s; + int n = strlen (name); + + s = strstr (line, name); + return (s && (s == line || spacep (s-1)) && (!s[n] || spacep (s+n))); +} + + +static void +close_message_fd (CTRL ctrl) +{ + if (ctrl->server_local->message_fd != -1) + { + close (ctrl->server_local->message_fd); + ctrl->server_local->message_fd = -1; + } +} + + +static int +option_handler (ASSUAN_CONTEXT ctx, const char *key, const char *value) +{ + CTRL ctrl = assuan_get_pointer (ctx); + + if (!strcmp (key, "include-certs")) + { + int i = *value? atoi (value) : -1; + if (ctrl->include_certs < -2) + return ASSUAN_Parameter_Error; + ctrl->include_certs = i; + } + else if (!strcmp (key, "display")) + { + if (opt.display) + free (opt.display); + opt.display = strdup (value); + if (!opt.display) + return ASSUAN_Out_Of_Core; + } + else if (!strcmp (key, "ttyname")) + { + if (opt.ttyname) + free (opt.ttyname); + opt.ttyname = strdup (value); + if (!opt.ttyname) + return ASSUAN_Out_Of_Core; + } + else if (!strcmp (key, "ttytype")) + { + if (opt.ttytype) + free (opt.ttytype); + opt.ttytype = strdup (value); + if (!opt.ttytype) + return ASSUAN_Out_Of_Core; + } + else if (!strcmp (key, "lc-ctype")) + { + if (opt.lc_ctype) + free (opt.lc_ctype); + opt.lc_ctype = strdup (value); + if (!opt.lc_ctype) + return ASSUAN_Out_Of_Core; + } + else if (!strcmp (key, "lc-messages")) + { + if (opt.lc_messages) + free (opt.lc_messages); + opt.lc_messages = strdup (value); + if (!opt.lc_messages) + return ASSUAN_Out_Of_Core; + } + else if (!strcmp (key, "list-mode")) + { + int i = *value? atoi (value) : 0; + if (!i || i == 1) /* default and mode 1 */ + { + ctrl->server_local->list_internal = 1; + ctrl->server_local->list_external = 0; + } + else if (i == 2) + { + ctrl->server_local->list_internal = 0; + ctrl->server_local->list_external = 1; + } + else if (i == 3) + { + ctrl->server_local->list_internal = 1; + ctrl->server_local->list_external = 1; + } + else + return ASSUAN_Parameter_Error; + } + else if (!strcmp (key, "with-validation")) + { + int i = *value? atoi (value) : 0; + ctrl->with_validation = i; + } + else + return ASSUAN_Invalid_Option; + + return 0; +} + + + + +static void +reset_notify (ASSUAN_CONTEXT ctx) +{ + CTRL ctrl = assuan_get_pointer (ctx); + + gpgsm_release_certlist (ctrl->server_local->recplist); + gpgsm_release_certlist (ctrl->server_local->signerlist); + ctrl->server_local->recplist = NULL; + ctrl->server_local->signerlist = NULL; + close_message_fd (ctrl); + assuan_close_input_fd (ctx); + assuan_close_output_fd (ctx); +} + + +static void +input_notify (ASSUAN_CONTEXT ctx, const char *line) +{ + CTRL ctrl = assuan_get_pointer (ctx); + + ctrl->autodetect_encoding = 0; + ctrl->is_pem = 0; + ctrl->is_base64 = 0; + if (strstr (line, "--armor")) + ctrl->is_pem = 1; + else if (strstr (line, "--base64")) + ctrl->is_base64 = 1; + else if (strstr (line, "--binary")) + ; + else + ctrl->autodetect_encoding = 1; +} + +static void +output_notify (ASSUAN_CONTEXT ctx, const char *line) +{ + CTRL ctrl = assuan_get_pointer (ctx); + + ctrl->create_pem = 0; + ctrl->create_base64 = 0; + if (strstr (line, "--armor")) + ctrl->create_pem = 1; + else if (strstr (line, "--base64")) + ctrl->create_base64 = 1; /* just the raw output */ +} + + + +/* RECIPIENT <userID> + + Set the recipient for the encryption. <userID> should be the + internal representation of the key; the server may accept any other + way of specification [we will support this]. If this is a valid and + trusted recipient the server does respond with OK, otherwise the + return is an ERR with the reason why the recipient can't be used, + the encryption will then not be done for this recipient. If the + policy is not to encrypt at all if not all recipients are valid, the + client has to take care of this. All RECIPIENT commands are + cumulative until a RESET or an successful ENCRYPT command. */ +static int +cmd_recipient (ASSUAN_CONTEXT ctx, char *line) +{ + CTRL ctrl = assuan_get_pointer (ctx); + int rc; + + rc = gpgsm_add_to_certlist (ctrl, line, 0, &ctrl->server_local->recplist, 0); + if (rc) + { + gpg_err_code_t r = gpg_err_code (rc); + gpgsm_status2 (ctrl, STATUS_INV_RECP, + r == -1? "1": + r == GPG_ERR_NO_PUBKEY? "1": + r == GPG_ERR_AMBIGUOUS_NAME? "2": + r == GPG_ERR_WRONG_KEY_USAGE? "3": + r == GPG_ERR_CERT_REVOKED? "4": + r == GPG_ERR_CERT_EXPIRED? "5": + r == GPG_ERR_NO_CRL_KNOWN? "6": + r == GPG_ERR_CRL_TOO_OLD? "7": + r == GPG_ERR_NO_POLICY_MATCH? "8": + "0", + line, NULL); + } + + return map_to_assuan_status (rc); +} + +/* SIGNER <userID> + + Set the signer's keys for the signature creation. <userID> should + be the internal representation of the key; the server may accept any + other way of specification [we will support this]. If this is a + valid and usable signing key the server does respond with OK, + otherwise it returns an ERR with the reason why the key can't be + used, the signing will then not be done for this key. If the policy + is not to sign at all if not all signer keys are valid, the client + has to take care of this. All SIGNER commands are cumulative until + a RESET but they are *not* reset by an SIGN command becuase it can + be expected that set of signers are used for more than one sign + operation. + + Note that this command returns an INV_RECP status which is a bit + strange, but they are very similar. */ +static int +cmd_signer (ASSUAN_CONTEXT ctx, char *line) +{ + CTRL ctrl = assuan_get_pointer (ctx); + int rc; + + rc = gpgsm_add_to_certlist (ctrl, line, 1, + &ctrl->server_local->signerlist, 0); + if (rc) + { + gpg_err_code_t r = gpg_err_code (rc); + gpgsm_status2 (ctrl, STATUS_INV_RECP, + r == -1? "1": + r == GPG_ERR_NO_PUBKEY? "1": + r == GPG_ERR_AMBIGUOUS_NAME? "2": + r == GPG_ERR_WRONG_KEY_USAGE? "3": + r == GPG_ERR_CERT_REVOKED? "4": + r == GPG_ERR_CERT_EXPIRED? "5": + r == GPG_ERR_NO_CRL_KNOWN? "6": + r == GPG_ERR_CRL_TOO_OLD? "7": + r == GPG_ERR_NO_POLICY_MATCH? "8": + r == GPG_ERR_NO_SECKEY? "9": + "0", + line, NULL); + } + return map_to_assuan_status (rc); +} + + +/* ENCRYPT + + Do the actual encryption process. Takes the plaintext from the INPUT + command, writes to the ciphertext to the file descriptor set with + the OUTPUT command, take the recipients form all the recipients set + so far. If this command fails the clients should try to delete all + output currently done or otherwise mark it as invalid. GPGSM does + ensure that there won't be any security problem with leftover data + on the output in this case. + + This command should in general not fail, as all necessary checks + have been done while setting the recipients. The input and output + pipes are closed. */ +static int +cmd_encrypt (ASSUAN_CONTEXT ctx, char *line) +{ + CTRL ctrl = assuan_get_pointer (ctx); + certlist_t cl; + int inp_fd, out_fd; + FILE *out_fp; + int rc; + + inp_fd = assuan_get_input_fd (ctx); + if (inp_fd == -1) + return set_error (No_Input, NULL); + out_fd = assuan_get_output_fd (ctx); + if (out_fd == -1) + return set_error (No_Output, NULL); + + out_fp = fdopen ( dup(out_fd), "w"); + if (!out_fp) + return set_error (General_Error, "fdopen() failed"); + + /* Now add all encrypt-to marked recipients from the default + list. */ + rc = 0; + if (!opt.no_encrypt_to) + { + for (cl=ctrl->server_local->default_recplist; !rc && cl; cl = cl->next) + if (cl->is_encrypt_to) + rc = gpgsm_add_cert_to_certlist (ctrl, cl->cert, + &ctrl->server_local->recplist, 1); + } + if (!rc) + rc = gpgsm_encrypt (assuan_get_pointer (ctx), + ctrl->server_local->recplist, + inp_fd, out_fp); + fclose (out_fp); + + gpgsm_release_certlist (ctrl->server_local->recplist); + ctrl->server_local->recplist = NULL; + /* Close and reset the fd */ + close_message_fd (ctrl); + assuan_close_input_fd (ctx); + assuan_close_output_fd (ctx); + return map_to_assuan_status (rc); +} + +/* DECRYPT + + This performs the decrypt operation after doing some check on the + internal state. (e.g. that only needed data has been set). Because + it utilizes the GPG-Agent for the session key decryption, there is + no need to ask the client for a protecting passphrase - GpgAgent + does take care of this by requesting this from the user. */ +static int +cmd_decrypt (ASSUAN_CONTEXT ctx, char *line) +{ + CTRL ctrl = assuan_get_pointer (ctx); + int inp_fd, out_fd; + FILE *out_fp; + int rc; + + inp_fd = assuan_get_input_fd (ctx); + if (inp_fd == -1) + return set_error (No_Input, NULL); + out_fd = assuan_get_output_fd (ctx); + if (out_fd == -1) + return set_error (No_Output, NULL); + + out_fp = fdopen ( dup(out_fd), "w"); + if (!out_fp) + return set_error (General_Error, "fdopen() failed"); + rc = gpgsm_decrypt (ctrl, inp_fd, out_fp); + fclose (out_fp); + + /* close and reset the fd */ + close_message_fd (ctrl); + assuan_close_input_fd (ctx); + assuan_close_output_fd (ctx); + + return map_to_assuan_status (rc); +} + + +/* VERIFY + + This does a verify operation on the message send to the input-FD. + The result is written out using status lines. If an output FD was + given, the signed text will be written to that. + + If the signature is a detached one, the server will inquire about + the signed material and the client must provide it. + */ +static int +cmd_verify (ASSUAN_CONTEXT ctx, char *line) +{ + int rc; + CTRL ctrl = assuan_get_pointer (ctx); + int fd = assuan_get_input_fd (ctx); + int out_fd = assuan_get_output_fd (ctx); + FILE *out_fp = NULL; + + if (fd == -1) + return set_error (No_Input, NULL); + + if (out_fd != -1) + { + out_fp = fdopen ( dup(out_fd), "w"); + if (!out_fp) + return set_error (General_Error, "fdopen() failed"); + } + + rc = gpgsm_verify (assuan_get_pointer (ctx), fd, + ctrl->server_local->message_fd, out_fp); + if (out_fp) + fclose (out_fp); + + /* close and reset the fd */ + close_message_fd (ctrl); + assuan_close_input_fd (ctx); + assuan_close_output_fd (ctx); + + return map_to_assuan_status (rc); +} + + +/* SIGN [--detached] + + Sign the data set with the INPUT command and write it to the sink + set by OUTPUT. With "--detached" specified, a detached signature is + created (surprise). */ +static int +cmd_sign (ASSUAN_CONTEXT ctx, char *line) +{ + CTRL ctrl = assuan_get_pointer (ctx); + int inp_fd, out_fd; + FILE *out_fp; + int detached; + int rc; + + inp_fd = assuan_get_input_fd (ctx); + if (inp_fd == -1) + return set_error (No_Input, NULL); + out_fd = assuan_get_output_fd (ctx); + if (out_fd == -1) + return set_error (No_Output, NULL); + + detached = has_option (line, "--detached"); + + out_fp = fdopen ( dup(out_fd), "w"); + if (!out_fp) + return set_error (General_Error, "fdopen() failed"); + + rc = gpgsm_sign (assuan_get_pointer (ctx), ctrl->server_local->signerlist, + inp_fd, detached, out_fp); + fclose (out_fp); + + /* close and reset the fd */ + close_message_fd (ctrl); + assuan_close_input_fd (ctx); + assuan_close_output_fd (ctx); + + return map_to_assuan_status (rc); +} + + +/* IMPORT + + Import the certificates read form the input-fd, return status + message for each imported one. The import checks the validity of + the certificate but not of the entire chain. It is possible to + import expired certificates. */ +static int +cmd_import (ASSUAN_CONTEXT ctx, char *line) +{ + CTRL ctrl = assuan_get_pointer (ctx); + int rc; + int fd = assuan_get_input_fd (ctx); + + if (fd == -1) + return set_error (No_Input, NULL); + + rc = gpgsm_import (assuan_get_pointer (ctx), fd); + + /* close and reset the fd */ + close_message_fd (ctrl); + assuan_close_input_fd (ctx); + assuan_close_output_fd (ctx); + + return map_to_assuan_status (rc); +} + + +static int +cmd_export (ASSUAN_CONTEXT ctx, char *line) +{ + CTRL ctrl = assuan_get_pointer (ctx); + int fd = assuan_get_output_fd (ctx); + FILE *out_fp; + char *p; + STRLIST list, sl; + + if (fd == -1) + return set_error (No_Output, NULL); + + /* break the line down into an STRLIST */ + list = NULL; + for (p=line; *p; line = p) + { + while (*p && *p != ' ') + p++; + if (*p) + *p++ = 0; + if (*line) + { + sl = xtrymalloc (sizeof *sl + strlen (line)); + if (!sl) + { + free_strlist (list); + return ASSUAN_Out_Of_Core; + } + sl->flags = 0; + strcpy_escaped_plus (sl->d, line); + sl->next = list; + list = sl; + } + } + + out_fp = fdopen ( dup(fd), "w"); + if (!out_fp) + { + free_strlist (list); + return set_error (General_Error, "fdopen() failed"); + } + + gpgsm_export (ctrl, list, out_fp); + fclose (out_fp); + free_strlist (list); + /* close and reset the fd */ + close_message_fd (ctrl); + assuan_close_input_fd (ctx); + assuan_close_output_fd (ctx); + return 0; +} + + +static int +cmd_delkeys (ASSUAN_CONTEXT ctx, char *line) +{ + CTRL ctrl = assuan_get_pointer (ctx); + char *p; + STRLIST list, sl; + int rc; + + /* break the line down into an STRLIST */ + list = NULL; + for (p=line; *p; line = p) + { + while (*p && *p != ' ') + p++; + if (*p) + *p++ = 0; + if (*line) + { + sl = xtrymalloc (sizeof *sl + strlen (line)); + if (!sl) + { + free_strlist (list); + return ASSUAN_Out_Of_Core; + } + sl->flags = 0; + strcpy_escaped_plus (sl->d, line); + sl->next = list; + list = sl; + } + } + + rc = gpgsm_delete (ctrl, list); + free_strlist (list); + + /* close and reset the fd */ + close_message_fd (ctrl); + assuan_close_input_fd (ctx); + assuan_close_output_fd (ctx); + + return map_to_assuan_status (rc); +} + + + +/* MESSAGE FD=<n> + + Set the file descriptor to read a message which is used with + detached signatures */ +static int +cmd_message (ASSUAN_CONTEXT ctx, char *line) +{ + char *endp; + int fd; + CTRL ctrl = assuan_get_pointer (ctx); + + if (strncmp (line, "FD=", 3)) + return set_error (Syntax_Error, "FD=<n> expected"); + line += 3; + if (!digitp (line)) + return set_error (Syntax_Error, "number required"); + fd = strtoul (line, &endp, 10); + if (*endp) + return set_error (Syntax_Error, "garbage found"); + if (fd == -1) + return set_error (No_Input, NULL); + + ctrl->server_local->message_fd = fd; + return 0; +} + + +static int +do_listkeys (ASSUAN_CONTEXT ctx, char *line, int mode) +{ + CTRL ctrl = assuan_get_pointer (ctx); + FILE *fp = assuan_get_data_fp (ctx); + char *p; + STRLIST list, sl; + unsigned int listmode; + gpg_error_t err; + + if (!fp) + return set_error (General_Error, "no data stream"); + + /* break the line down into an STRLIST */ + list = NULL; + for (p=line; *p; line = p) + { + while (*p && *p != ' ') + p++; + if (*p) + *p++ = 0; + if (*line) + { + sl = xtrymalloc (sizeof *sl + strlen (line)); + if (!sl) + { + free_strlist (list); + return ASSUAN_Out_Of_Core; + } + sl->flags = 0; + strcpy_escaped_plus (sl->d, line); + sl->next = list; + list = sl; + } + } + + ctrl->with_colons = 1; + listmode = mode; + if (ctrl->server_local->list_internal) + listmode |= (1<<6); + if (ctrl->server_local->list_external) + listmode |= (1<<7); + err = gpgsm_list_keys (assuan_get_pointer (ctx), list, fp, listmode); + free_strlist (list); + return map_to_assuan_status (err); +} + +static int +cmd_listkeys (ASSUAN_CONTEXT ctx, char *line) +{ + return do_listkeys (ctx, line, 3); +} + +static int +cmd_listsecretkeys (ASSUAN_CONTEXT ctx, char *line) +{ + return do_listkeys (ctx, line, 2); +} + + +/* GENKEY + + Read the parameters in native format from the input fd and write a + certificate request to the output. + */ +static int +cmd_genkey (ASSUAN_CONTEXT ctx, char *line) +{ + CTRL ctrl = assuan_get_pointer (ctx); + int inp_fd, out_fd; + FILE *out_fp; + int rc; + + inp_fd = assuan_get_input_fd (ctx); + if (inp_fd == -1) + return set_error (No_Input, NULL); + out_fd = assuan_get_output_fd (ctx); + if (out_fd == -1) + return set_error (No_Output, NULL); + + out_fp = fdopen ( dup(out_fd), "w"); + if (!out_fp) + return set_error (General_Error, "fdopen() failed"); + rc = gpgsm_genkey (ctrl, inp_fd, out_fp); + fclose (out_fp); + + /* close and reset the fds */ + assuan_close_input_fd (ctx); + assuan_close_output_fd (ctx); + + return map_to_assuan_status (rc); +} + + + + + +/* Tell the assuan library about our commands */ +static int +register_commands (ASSUAN_CONTEXT ctx) +{ + static struct { + const char *name; + int (*handler)(ASSUAN_CONTEXT, char *line); + } table[] = { + { "RECIPIENT", cmd_recipient }, + { "SIGNER", cmd_signer }, + { "ENCRYPT", cmd_encrypt }, + { "DECRYPT", cmd_decrypt }, + { "VERIFY", cmd_verify }, + { "SIGN", cmd_sign }, + { "IMPORT", cmd_import }, + { "EXPORT", cmd_export }, + { "INPUT", NULL }, + { "OUTPUT", NULL }, + { "MESSAGE", cmd_message }, + { "LISTKEYS", cmd_listkeys }, + { "LISTSECRETKEYS",cmd_listsecretkeys }, + { "GENKEY", cmd_genkey }, + { "DELKEYS", cmd_delkeys }, + { NULL } + }; + int i, rc; + + for (i=0; table[i].name; i++) + { + rc = assuan_register_command (ctx, table[i].name, table[i].handler); + if (rc) + return rc; + } + return 0; +} + +/* Startup the server. DEFAULT_RECPLIST is the list of recipients as + set from the command line or config file. We only require those + marked as encrypt-to. */ +void +gpgsm_server (certlist_t default_recplist) +{ + int rc; + int filedes[2]; + ASSUAN_CONTEXT ctx; + struct server_control_s ctrl; + static const char hello[] = ("GNU Privacy Guard's S/M server " + VERSION " ready"); + + memset (&ctrl, 0, sizeof ctrl); + gpgsm_init_default_ctrl (&ctrl); + + /* For now we use a simple pipe based server so that we can work + from scripts. We will later add options to run as a daemon and + wait for requests on a Unix domain socket */ + filedes[0] = 0; + filedes[1] = 1; + rc = assuan_init_pipe_server (&ctx, filedes); + if (rc) + { + log_error ("failed to initialize the server: %s\n", + assuan_strerror(rc)); + gpgsm_exit (2); + } + rc = register_commands (ctx); + if (rc) + { + log_error ("failed to the register commands with Assuan: %s\n", + assuan_strerror(rc)); + gpgsm_exit (2); + } + if (opt.verbose || opt.debug) + { + char *tmp = NULL; + const char *s1 = getenv ("GPG_AGENT_INFO"); + const char *s2 = getenv ("DIRMNGR_INFO"); + + if (asprintf (&tmp, + "Home: %s\n" + "Config: %s\n" + "AgentInfo: %s\n" + "DirmngrInfo: %s\n" + "%s", + opt.homedir, + opt.config_filename, + s1?s1:"[not set]", + s2?s2:"[not set]", + hello) > 0) + { + assuan_set_hello_line (ctx, tmp); + free (tmp); + } + } + else + assuan_set_hello_line (ctx, hello); + + assuan_register_reset_notify (ctx, reset_notify); + assuan_register_input_notify (ctx, input_notify); + assuan_register_output_notify (ctx, output_notify); + assuan_register_option_handler (ctx, option_handler); + + assuan_set_pointer (ctx, &ctrl); + ctrl.server_local = xcalloc (1, sizeof *ctrl.server_local); + ctrl.server_local->assuan_ctx = ctx; + ctrl.server_local->message_fd = -1; + ctrl.server_local->list_internal = 1; + ctrl.server_local->list_external = 0; + ctrl.server_local->default_recplist = default_recplist; + + if (DBG_ASSUAN) + assuan_set_log_stream (ctx, log_get_stream ()); + + for (;;) + { + rc = assuan_accept (ctx); + if (rc == -1) + { + break; + } + else if (rc) + { + log_info ("Assuan accept problem: %s\n", assuan_strerror (rc)); + break; + } + + rc = assuan_process (ctx); + if (rc) + { + log_info ("Assuan processing failed: %s\n", assuan_strerror (rc)); + continue; + } + } + + gpgsm_release_certlist (ctrl.server_local->recplist); + ctrl.server_local->recplist = NULL; + gpgsm_release_certlist (ctrl.server_local->signerlist); + ctrl.server_local->signerlist = NULL; + + assuan_deinit_server (ctx); +} + + +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_SIGEXPIRED: s = "SIGEXPIRED"; 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_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_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_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_EXPSIG : s = "EXPSIG"; break; + case STATUS_EXPKEYSIG : s = "EXPKEYSIG"; break; + case STATUS_TRUNCATED : s = "TRUNCATED"; break; + case STATUS_ERROR : s = "ERROR"; break; + case STATUS_IMPORT_PROBLEM : s = "IMPORT_PROBLEM"; break; + default: s = "?"; break; + } + return s; +} + + +gpg_error_t +gpgsm_status2 (CTRL ctrl, int no, ...) +{ + gpg_error_t err = 0; + va_list arg_ptr; + const char *text; + + va_start (arg_ptr, no); + + if (ctrl->no_server && ctrl->status_fd == -1) + ; /* No status wanted. */ + else if (ctrl->no_server) + { + if (!statusfp) + { + if (ctrl->status_fd == 1) + statusfp = stdout; + else if (ctrl->status_fd == 2) + statusfp = stderr; + else + statusfp = fdopen (ctrl->status_fd, "w"); + + if (!statusfp) + { + log_fatal ("can't open fd %d for status output: %s\n", + ctrl->status_fd, strerror(errno)); + } + } + + fputs ("[GNUPG:] ", statusfp); + fputs (get_status_string (no), statusfp); + + while ( (text = va_arg (arg_ptr, const char*) )) + { + 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); + fflush (statusfp); + } + else + { + ASSUAN_CONTEXT ctx = ctrl->server_local->assuan_ctx; + char buf[950], *p; + size_t n; + + p = buf; + n = 0; + while ( (text = va_arg (arg_ptr, const char *)) ) + { + if (n) + { + *p++ = ' '; + n++; + } + for ( ; *text && n < DIM (buf)-2; n++) + *p++ = *text++; + } + *p = 0; + err = map_assuan_err (assuan_write_status (ctx, + get_status_string (no), buf)); + } + + va_end (arg_ptr); + return err; +} + +gpg_error_t +gpgsm_status (CTRL ctrl, int no, const char *text) +{ + return gpgsm_status2 (ctrl, no, text, NULL); +} + +gpg_error_t +gpgsm_status_with_err_code (CTRL ctrl, int no, const char *text, + gpg_err_code_t ec) +{ + char buf[30]; + + sprintf (buf, "%u", (unsigned int)ec); + if (text) + return gpgsm_status2 (ctrl, no, text, buf, NULL); + else + return gpgsm_status2 (ctrl, no, buf, NULL); +} + +#if 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 ) + return; /* not enabled */ + + 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 unsigned char*)s ); + s++; n--; + } + buffer = s; + len = n; + if ( dowrap && len ) + putc ( '\n', statusfp ); + } while ( len ); + + putc ('\n',statusfp); + fflush (statusfp); +} +#endif diff --git a/sm/sign.c b/sm/sign.c new file mode 100644 index 000000000..d656825e8 --- /dev/null +++ b/sm/sign.c @@ -0,0 +1,700 @@ +/* sign.c - Sign a message + * 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. + */ + +#include <config.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include <unistd.h> +#include <time.h> +#include <assert.h> + +#include "gpgsm.h" +#include <gcrypt.h> +#include <ksba.h> + +#include "keydb.h" +#include "i18n.h" + + +static void +hash_data (int fd, gcry_md_hd_t md) +{ + FILE *fp; + char buffer[4096]; + int nread; + + fp = fdopen ( dup (fd), "rb"); + if (!fp) + { + log_error ("fdopen(%d) failed: %s\n", fd, strerror (errno)); + return; + } + + do + { + nread = fread (buffer, 1, DIM(buffer), fp); + gcry_md_write (md, buffer, nread); + } + while (nread); + if (ferror (fp)) + log_error ("read error on fd %d: %s\n", fd, strerror (errno)); + fclose (fp); +} + +static int +hash_and_copy_data (int fd, gcry_md_hd_t md, ksba_writer_t writer) +{ + gpg_error_t err; + FILE *fp; + char buffer[4096]; + int nread; + int rc = 0; + int any = 0; + + fp = fdopen ( dup (fd), "rb"); + if (!fp) + { + gpg_error_t tmperr = gpg_error (gpg_err_code_from_errno (errno)); + log_error ("fdopen(%d) failed: %s\n", fd, strerror (errno)); + return tmperr; + } + + do + { + nread = fread (buffer, 1, DIM(buffer), fp); + if (nread) + { + any = 1; + gcry_md_write (md, buffer, nread); + err = ksba_writer_write_octet_string (writer, buffer, nread, 0); + if (err) + { + log_error ("write failed: %s\n", gpg_strerror (err)); + rc = err; + } + } + } + while (nread && !rc); + if (ferror (fp)) + { + rc = gpg_error (gpg_err_code_from_errno (errno)); + log_error ("read error on fd %d: %s\n", fd, strerror (errno)); + } + fclose (fp); + if (!any) + { + /* We can't allow to sign an empty message because it does not + make much sense and more seriously, ksba-cms_build has + already written the tag for data and now expects an octet + string but an octet string of zeize 0 is illegal. */ + log_error ("cannot sign an empty message\n"); + rc = gpg_error (GPG_ERR_NO_DATA); + } + if (!rc) + { + err = ksba_writer_write_octet_string (writer, NULL, 0, 1); + if (err) + { + log_error ("write failed: %s\n", gpg_strerror (err)); + rc = err; + } + } + + return rc; +} + + +/* Get the default certificate which is defined as the first one our + keyDB returns and has a secret key available. */ +int +gpgsm_get_default_cert (ctrl_t ctrl, ksba_cert_t *r_cert) +{ + KEYDB_HANDLE hd; + ksba_cert_t cert = NULL; + int rc; + char *p; + + hd = keydb_new (0); + if (!hd) + return gpg_error (GPG_ERR_GENERAL); + rc = keydb_search_first (hd); + if (rc) + { + keydb_release (hd); + return rc; + } + + do + { + rc = keydb_get_cert (hd, &cert); + if (rc) + { + log_error ("keydb_get_cert failed: %s\n", gpg_strerror (rc)); + keydb_release (hd); + return rc; + } + + p = gpgsm_get_keygrip_hexstring (cert); + if (p) + { + if (!gpgsm_agent_havekey (ctrl, p)) + { + xfree (p); + keydb_release (hd); + *r_cert = cert; + return 0; /* got it */ + } + xfree (p); + } + + ksba_cert_release (cert); + cert = NULL; + } + while (!(rc = keydb_search_next (hd))); + if (rc && rc != -1) + log_error ("keydb_search_next failed: %s\n", gpg_strerror (rc)); + + ksba_cert_release (cert); + keydb_release (hd); + return rc; +} + + +static ksba_cert_t +get_default_signer (ctrl_t ctrl) +{ + KEYDB_SEARCH_DESC desc; + ksba_cert_t cert = NULL; + KEYDB_HANDLE kh = NULL; + int rc; + + if (!opt.local_user) + { + rc = gpgsm_get_default_cert (ctrl, &cert); + if (rc) + { + if (rc != -1) + log_debug ("failed to find default certificate: %s\n", + gpg_strerror (rc)); + return NULL; + } + return cert; + } + + rc = keydb_classify_name (opt.local_user, &desc); + if (rc) + { + log_error ("failed to find default signer: %s\n", gpg_strerror (rc)); + return NULL; + } + + kh = keydb_new (0); + if (!kh) + return NULL; + + rc = keydb_search (kh, &desc, 1); + if (rc) + { + log_debug ("failed to find default certificate: rc=%d\n", rc); + } + else + { + rc = keydb_get_cert (kh, &cert); + if (rc) + { + log_debug ("failed to get cert: rc=%d\n", rc); + } + } + + keydb_release (kh); + return cert; +} + +/* Depending on the options in CTRL add the certificate CERT as well as + other certificate up in the chain to the Root-CA to the CMS + object. */ +static int +add_certificate_list (CTRL ctrl, ksba_cms_t cms, ksba_cert_t cert) +{ + gpg_error_t err; + int rc = 0; + ksba_cert_t next = NULL; + int n; + int not_root = 0; + + ksba_cert_ref (cert); + + n = ctrl->include_certs; + log_debug ("adding certificates at level %d\n", n); + if (n == -2) + { + not_root = 1; + n = -1; + } + if (n < 0 || n > 50) + n = 50; /* We better apply an upper bound */ + + /* First add my own certificate unless we don't want any certificate + included at all. */ + if (n) + { + if (not_root && gpgsm_is_root_cert (cert)) + err = 0; + else + err = ksba_cms_add_cert (cms, cert); + if (err) + goto ksba_failure; + if (n>0) + n--; + } + /* Walk the chain to include all other certificates. Note that a -1 + used for N makes sure that there is no limit and all certs get + included. */ + while ( n-- && !(rc = gpgsm_walk_cert_chain (cert, &next)) ) + { + if (not_root && gpgsm_is_root_cert (next)) + err = 0; + else + err = ksba_cms_add_cert (cms, next); + ksba_cert_release (cert); + cert = next; next = NULL; + if (err) + goto ksba_failure; + } + ksba_cert_release (cert); + + return rc == -1? 0: rc; + + ksba_failure: + ksba_cert_release (cert); + log_error ("ksba_cms_add_cert failed: %s\n", gpg_strerror (err)); + return err; +} + + + + +/* Perform a sign operation. + + Sign the data received on DATA-FD in embedded mode or in detached + mode when DETACHED is true. Write the signature to OUT_FP. The + keys used to sign are taken from SIGNERLIST or the default one will + be used if the value of this argument is NULL. */ +int +gpgsm_sign (CTRL ctrl, CERTLIST signerlist, + int data_fd, int detached, FILE *out_fp) +{ + int i, rc; + gpg_error_t err; + Base64Context b64writer = NULL; + ksba_writer_t writer; + ksba_cms_t cms = NULL; + ksba_stop_reason_t stopreason; + KEYDB_HANDLE kh = NULL; + gcry_md_hd_t data_md = NULL; + int signer; + const char *algoid; + int algo; + ksba_isotime_t signed_at; + CERTLIST cl; + int release_signerlist = 0; + + kh = keydb_new (0); + if (!kh) + { + log_error (_("failed to allocated keyDB handle\n")); + rc = gpg_error (GPG_ERR_GENERAL); + goto leave; + } + + ctrl->pem_name = "SIGNED MESSAGE"; + rc = gpgsm_create_writer (&b64writer, ctrl, out_fp, &writer); + if (rc) + { + log_error ("can't create writer: %s\n", gpg_strerror (rc)); + goto leave; + } + + err = ksba_cms_new (&cms); + if (err) + { + rc = err; + goto leave; + } + + err = ksba_cms_set_reader_writer (cms, NULL, writer); + if (err) + { + log_debug ("ksba_cms_set_reader_writer failed: %s\n", + gpg_strerror (err)); + rc = err; + goto leave; + } + + /* We are going to create signed data with data as encap. content */ + err = ksba_cms_set_content_type (cms, 0, KSBA_CT_SIGNED_DATA); + if (!err) + err = ksba_cms_set_content_type (cms, 1, KSBA_CT_DATA); + if (err) + { + log_debug ("ksba_cms_set_content_type failed: %s\n", + gpg_strerror (err)); + rc = err; + goto leave; + } + + /* If no list of signers is given, use a default one. */ + if (!signerlist) + { + ksba_cert_t cert = get_default_signer (ctrl); + if (!cert) + { + log_error ("no default signer found\n"); + rc = gpg_error (GPG_ERR_GENERAL); + goto leave; + } + + /* Although we don't check for ambigious specification we will + check that the signer's certificate is is usable and + valid. */ + rc = gpgsm_cert_use_sign_p (cert); + if (!rc) + rc = gpgsm_validate_chain (ctrl, cert, NULL, 0, NULL, 0); + if (rc) + goto leave; + + /* That one is fine - create signerlist. */ + signerlist = xtrycalloc (1, sizeof *signerlist); + if (!signerlist) + { + rc = OUT_OF_CORE (errno); + ksba_cert_release (cert); + goto leave; + } + signerlist->cert = cert; + release_signerlist = 1; + } + + + /* Gather certificates of signers and store them in the CMS object. */ + for (cl=signerlist; cl; cl = cl->next) + { + rc = gpgsm_cert_use_sign_p (cl->cert); + if (rc) + goto leave; + + err = ksba_cms_add_signer (cms, cl->cert); + if (err) + { + log_error ("ksba_cms_add_signer failed: %s\n", gpg_strerror (err)); + rc = err; + goto leave; + } + rc = add_certificate_list (ctrl, cms, cl->cert); + if (rc) + { + log_error ("failed to store list of certificates: %s\n", + gpg_strerror(rc)); + goto leave; + } + /* Set the hash algorithm we are going to use */ + err = ksba_cms_add_digest_algo (cms, "1.3.14.3.2.26" /*SHA-1*/); + if (err) + { + log_debug ("ksba_cms_add_digest_algo failed: %s\n", + gpg_strerror (err)); + rc = err; + goto leave; + } + } + + + /* Check whether one of the certificates is qualified. Note that we + already validated the certificate and thus the user data stored + flag must be available. */ + for (cl=signerlist; cl; cl = cl->next) + { + size_t buflen; + char buffer[1]; + + err = ksba_cert_get_user_data (cl->cert, "is_qualified", + &buffer, sizeof (buffer), &buflen); + if (err || !buflen) + { + log_error (_("checking for qualified certificate failed: %s\n"), + gpg_strerror (err)); + rc = err; + goto leave; + } + if (*buffer) + err = gpgsm_qualified_consent (ctrl, cl->cert); + else + err = gpgsm_not_qualified_warning (ctrl, cl->cert); + if (err) + { + rc = err; + goto leave; + } + } + + /* Prepare hashing (actually we are figuring out what we have set above)*/ + rc = gcry_md_open (&data_md, 0, 0); + if (rc) + { + log_error ("md_open failed: %s\n", gpg_strerror (rc)); + goto leave; + } + if (DBG_HASHING) + gcry_md_start_debug (data_md, "sign.data"); + + for (i=0; (algoid=ksba_cms_get_digest_algo_list (cms, i)); i++) + { + algo = gcry_md_map_name (algoid); + if (!algo) + { + log_error ("unknown hash algorithm `%s'\n", algoid? algoid:"?"); + if (algoid + && ( !strcmp (algoid, "1.2.840.113549.1.1.2") + ||!strcmp (algoid, "1.2.840.113549.2.2"))) + log_info (_("(this is the MD2 algorithm)\n")); + rc = gpg_error (GPG_ERR_BUG); + goto leave; + } + gcry_md_enable (data_md, algo); + } + + if (detached) + { /* we hash the data right now so that we can store the message + digest. ksba_cms_build() takes this as an flag that detached + data is expected. */ + unsigned char *digest; + size_t digest_len; + /* Fixme do this for all signers and get the algo to use from + the signer's certificate - does not make mich sense, but we + should do this consistent as we have already done it above. */ + algo = GCRY_MD_SHA1; + hash_data (data_fd, data_md); + digest = gcry_md_read (data_md, algo); + digest_len = gcry_md_get_algo_dlen (algo); + if ( !digest || !digest_len) + { + log_error ("problem getting the hash of the data\n"); + rc = gpg_error (GPG_ERR_BUG); + goto leave; + } + for (cl=signerlist,signer=0; cl; cl = cl->next, signer++) + { + err = ksba_cms_set_message_digest (cms, signer, digest, digest_len); + if (err) + { + log_error ("ksba_cms_set_message_digest failed: %s\n", + gpg_strerror (err)); + rc = err; + goto leave; + } + } + } + + gnupg_get_isotime (signed_at); + for (cl=signerlist,signer=0; cl; cl = cl->next, signer++) + { + err = ksba_cms_set_signing_time (cms, signer, signed_at); + if (err) + { + log_error ("ksba_cms_set_signing_time failed: %s\n", + gpg_strerror (err)); + rc = err; + goto leave; + } + } + + /* We need to write at least a minimal list of our capabilities to + try to convince some MUAs to use 3DEs and not the crippled + RC2. Our list is: + + aes128-CBC + des-EDE3-CBC + */ + err = ksba_cms_add_smime_capability (cms, "2.16.840.1.101.3.4.1.2", NULL, 0); + if (!err) + err = ksba_cms_add_smime_capability (cms, "1.2.840.113549.3.7", NULL, 0); + if (err) + { + log_error ("ksba_cms_add_smime_capability failed: %s\n", + gpg_strerror (err)); + goto leave; + } + + + /* Main building loop. */ + do + { + err = ksba_cms_build (cms, &stopreason); + if (err) + { + log_debug ("ksba_cms_build failed: %s\n", gpg_strerror (err)); + rc = err; + goto leave; + } + + if (stopreason == KSBA_SR_BEGIN_DATA) + { /* hash the data and store the message digest */ + unsigned char *digest; + size_t digest_len; + + assert (!detached); + /* Fixme: get the algo to use from the signer's certificate + - does not make much sense, but we should do this + consistent as we have already done it above. Code is + mostly duplicated above. */ + + algo = GCRY_MD_SHA1; + rc = hash_and_copy_data (data_fd, data_md, writer); + if (rc) + goto leave; + digest = gcry_md_read (data_md, algo); + digest_len = gcry_md_get_algo_dlen (algo); + if ( !digest || !digest_len) + { + log_error ("problem getting the hash of the data\n"); + rc = gpg_error (GPG_ERR_BUG); + goto leave; + } + for (cl=signerlist,signer=0; cl; cl = cl->next, signer++) + { + err = ksba_cms_set_message_digest (cms, signer, + digest, digest_len); + if (err) + { + log_error ("ksba_cms_set_message_digest failed: %s\n", + gpg_strerror (err)); + rc = err; + goto leave; + } + } + } + else if (stopreason == KSBA_SR_NEED_SIG) + { /* calculate the signature for all signers */ + gcry_md_hd_t md; + + algo = GCRY_MD_SHA1; + rc = gcry_md_open (&md, algo, 0); + if (rc) + { + log_error ("md_open failed: %s\n", gpg_strerror (rc)); + goto leave; + } + if (DBG_HASHING) + gcry_md_start_debug (md, "sign.attr"); + ksba_cms_set_hash_function (cms, HASH_FNC, md); + for (cl=signerlist,signer=0; cl; cl = cl->next, signer++) + { + unsigned char *sigval = NULL; + char *buf, *fpr; + + if (signer) + gcry_md_reset (md); + rc = ksba_cms_hash_signed_attrs (cms, signer); + if (rc) + { + log_debug ("hashing signed attrs failed: %s\n", + gpg_strerror (rc)); + gcry_md_close (md); + goto leave; + } + + rc = gpgsm_create_cms_signature (ctrl, cl->cert, + md, algo, &sigval); + if (rc) + { + gcry_md_close (md); + goto leave; + } + + err = ksba_cms_set_sig_val (cms, signer, sigval); + xfree (sigval); + if (err) + { + log_error ("failed to store the signature: %s\n", + gpg_strerror (err)); + rc = err; + gcry_md_close (md); + goto leave; + } + + /* write a status message */ + fpr = gpgsm_get_fingerprint_hexstring (cl->cert, GCRY_MD_SHA1); + if (!fpr) + { + rc = gpg_error (GPG_ERR_ENOMEM); + gcry_md_close (md); + goto leave; + } + { + int pkalgo = gpgsm_get_key_algo_info (cl->cert, NULL); + rc = asprintf (&buf, "%c %d %d 00 %s %s", + detached? 'D':'S', + pkalgo, + algo, + signed_at, + fpr); + } + xfree (fpr); + if (rc < 0) + { + rc = gpg_error (GPG_ERR_ENOMEM); + gcry_md_close (md); + goto leave; + } + rc = 0; + gpgsm_status (ctrl, STATUS_SIG_CREATED, buf); + free (buf); /* yes, we must use the regular free() here */ + } + gcry_md_close (md); + + } + } + while (stopreason != KSBA_SR_READY); + + rc = gpgsm_finish_writer (b64writer); + if (rc) + { + log_error ("write failed: %s\n", gpg_strerror (rc)); + goto leave; + } + + log_info ("signature created\n"); + + + leave: + if (rc) + log_error ("error creating signature: %s <%s>\n", + gpg_strerror (rc), gpg_strsource (rc) ); + if (release_signerlist) + gpgsm_release_certlist (signerlist); + ksba_cms_release (cms); + gpgsm_destroy_writer (b64writer); + keydb_release (kh); + gcry_md_close (data_md); + return rc; +} diff --git a/sm/verify.c b/sm/verify.c new file mode 100644 index 000000000..4e6574078 --- /dev/null +++ b/sm/verify.c @@ -0,0 +1,547 @@ +/* verify.c - Verify a messages signature + * 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. + */ + +#include <config.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include <unistd.h> +#include <time.h> +#include <assert.h> + +#include "gpgsm.h" +#include <gcrypt.h> +#include <ksba.h> + +#include "keydb.h" +#include "i18n.h" + +static char * +strtimestamp_r (ksba_isotime_t atime) +{ + char *buffer = xmalloc (15); + + if (!atime || !*atime) + strcpy (buffer, "none"); + else + sprintf (buffer, "%.4s-%.2s-%.2s", atime, atime+4, atime+6); + return buffer; +} + + + +/* Hash the data for a detached signature */ +static void +hash_data (int fd, gcry_md_hd_t md) +{ + FILE *fp; + char buffer[4096]; + int nread; + + fp = fdopen ( dup (fd), "rb"); + if (!fp) + { + log_error ("fdopen(%d) failed: %s\n", fd, strerror (errno)); + return; + } + + do + { + nread = fread (buffer, 1, DIM(buffer), fp); + gcry_md_write (md, buffer, nread); + } + while (nread); + if (ferror (fp)) + log_error ("read error on fd %d: %s\n", fd, strerror (errno)); + fclose (fp); +} + + + + +/* Perform a verify operation. To verify detached signatures, data_fd + must be different than -1. With OUT_FP given and a non-detached + signature, the signed material is written to that stream. */ +int +gpgsm_verify (CTRL ctrl, int in_fd, int data_fd, FILE *out_fp) +{ + int i, rc; + Base64Context b64reader = NULL; + Base64Context b64writer = NULL; + ksba_reader_t reader; + ksba_writer_t writer = NULL; + ksba_cms_t cms = NULL; + ksba_stop_reason_t stopreason; + ksba_cert_t cert; + KEYDB_HANDLE kh; + gcry_md_hd_t data_md = NULL; + int signer; + const char *algoid; + int algo; + int is_detached; + FILE *fp = NULL; + char *p; + + kh = keydb_new (0); + if (!kh) + { + log_error (_("failed to allocated keyDB handle\n")); + rc = gpg_error (GPG_ERR_GENERAL); + goto leave; + } + + + fp = fdopen ( dup (in_fd), "rb"); + if (!fp) + { + rc = gpg_error (gpg_err_code_from_errno (errno)); + log_error ("fdopen() failed: %s\n", strerror (errno)); + goto leave; + } + + rc = gpgsm_create_reader (&b64reader, ctrl, fp, 0, &reader); + if (rc) + { + log_error ("can't create reader: %s\n", gpg_strerror (rc)); + goto leave; + } + + if (out_fp) + { + rc = gpgsm_create_writer (&b64writer, ctrl, out_fp, &writer); + if (rc) + { + log_error ("can't create writer: %s\n", gpg_strerror (rc)); + goto leave; + } + } + + rc = ksba_cms_new (&cms); + if (rc) + goto leave; + + rc = ksba_cms_set_reader_writer (cms, reader, writer); + if (rc) + { + log_error ("ksba_cms_set_reader_writer failed: %s\n", + gpg_strerror (rc)); + goto leave; + } + + rc = gcry_md_open (&data_md, 0, 0); + if (rc) + { + log_error ("md_open failed: %s\n", gpg_strerror (rc)); + goto leave; + } + if (DBG_HASHING) + gcry_md_start_debug (data_md, "vrfy.data"); + + is_detached = 0; + do + { + rc = ksba_cms_parse (cms, &stopreason); + if (rc) + { + log_error ("ksba_cms_parse failed: %s\n", gpg_strerror (rc)); + goto leave; + } + + if (stopreason == KSBA_SR_NEED_HASH) + { + is_detached = 1; + if (opt.verbose) + log_info ("detached signature\n"); + } + + if (stopreason == KSBA_SR_NEED_HASH + || stopreason == KSBA_SR_BEGIN_DATA) + { /* We are now able to enable the hash algorithms */ + for (i=0; (algoid=ksba_cms_get_digest_algo_list (cms, i)); i++) + { + algo = gcry_md_map_name (algoid); + if (!algo) + { + log_error ("unknown hash algorithm `%s'\n", + algoid? algoid:"?"); + if (algoid + && ( !strcmp (algoid, "1.2.840.113549.1.1.2") + ||!strcmp (algoid, "1.2.840.113549.2.2"))) + log_info (_("(this is the MD2 algorithm)\n")); + } + else + gcry_md_enable (data_md, algo); + } + if (is_detached) + { + if (data_fd == -1) + log_info ("detached signature w/o data " + "- assuming certs-only\n"); + else + hash_data (data_fd, data_md); + } + else + { + ksba_cms_set_hash_function (cms, HASH_FNC, data_md); + } + } + else if (stopreason == KSBA_SR_END_DATA) + { /* The data bas been hashed */ + + } + } + while (stopreason != KSBA_SR_READY); + + if (b64writer) + { + rc = gpgsm_finish_writer (b64writer); + if (rc) + { + log_error ("write failed: %s\n", gpg_strerror (rc)); + goto leave; + } + } + + if (data_fd != -1 && !is_detached) + { + log_error ("data given for a non-detached signature\n"); + rc = gpg_error (GPG_ERR_CONFLICT); + goto leave; + } + + for (i=0; (cert=ksba_cms_get_cert (cms, i)); i++) + { + /* Fixme: it might be better to check the validity of the + certificate first before entering it into the DB. This way + we would avoid cluttering the DB with invalid + certificates. */ + keydb_store_cert (cert, 0, NULL); + ksba_cert_release (cert); + } + + cert = NULL; + for (signer=0; ; signer++) + { + char *issuer = NULL; + ksba_sexp_t sigval = NULL; + ksba_isotime_t sigtime, keyexptime; + ksba_sexp_t serial; + char *msgdigest = NULL; + size_t msgdigestlen; + char *ctattr; + + rc = ksba_cms_get_issuer_serial (cms, signer, &issuer, &serial); + if (!signer && gpg_err_code (rc) == GPG_ERR_NO_DATA + && data_fd == -1 && is_detached) + { + log_info ("certs-only message accepted\n"); + rc = 0; + break; + } + if (rc) + { + if (signer && rc == -1) + rc = 0; + break; + } + + gpgsm_status (ctrl, STATUS_NEWSIG, NULL); + + if (DBG_X509) + { + log_debug ("signer %d - issuer: `%s'\n", + signer, issuer? issuer:"[NONE]"); + log_debug ("signer %d - serial: ", signer); + gpgsm_dump_serial (serial); + log_printf ("\n"); + } + + rc = ksba_cms_get_signing_time (cms, signer, sigtime); + if (gpg_err_code (rc) == GPG_ERR_NO_DATA) + *sigtime = 0; + else if (rc) + { + log_error ("error getting signing time: %s\n", gpg_strerror (rc)); + *sigtime = 0; /* (we can't encode an error in the time string.) */ + } + + rc = ksba_cms_get_message_digest (cms, signer, + &msgdigest, &msgdigestlen); + if (!rc) + { + size_t is_enabled; + + algoid = ksba_cms_get_digest_algo (cms, signer); + algo = gcry_md_map_name (algoid); + if (DBG_X509) + log_debug ("signer %d - digest algo: %d\n", signer, algo); + is_enabled = sizeof algo; + if ( gcry_md_info (data_md, GCRYCTL_IS_ALGO_ENABLED, + &algo, &is_enabled) + || !is_enabled) + { + log_error ("digest algo %d has not been enabled\n", algo); + goto next_signer; + } + } + else if (gpg_err_code (rc) == GPG_ERR_NO_DATA) + { + assert (!msgdigest); + rc = 0; + algoid = NULL; + algo = 0; + } + else /* real error */ + break; + + rc = ksba_cms_get_sigattr_oids (cms, signer, + "1.2.840.113549.1.9.3", &ctattr); + if (!rc) + { + const char *s; + + if (DBG_X509) + log_debug ("signer %d - content-type attribute: %s", + signer, ctattr); + + s = ksba_cms_get_content_oid (cms, 1); + if (!s || strcmp (ctattr, s)) + { + log_error ("content-type attribute does not match " + "actual content-type\n"); + ksba_free (ctattr); + ctattr = NULL; + goto next_signer; + } + ksba_free (ctattr); + ctattr = NULL; + } + else if (rc != -1) + { + log_error ("error getting content-type attribute: %s\n", + gpg_strerror (rc)); + goto next_signer; + } + rc = 0; + + + sigval = ksba_cms_get_sig_val (cms, signer); + if (!sigval) + { + log_error ("no signature value available\n"); + goto next_signer; + } + if (DBG_X509) + log_debug ("signer %d - signature available", signer); + + /* Find the certificate of the signer */ + keydb_search_reset (kh); + rc = keydb_search_issuer_sn (kh, issuer, serial); + if (rc) + { + if (rc == -1) + { + log_error ("certificate not found\n"); + rc = gpg_error (GPG_ERR_NO_PUBKEY); + } + else + log_error ("failed to find the certificate: %s\n", + gpg_strerror(rc)); + { + char numbuf[50]; + sprintf (numbuf, "%d", rc); + + gpgsm_status2 (ctrl, STATUS_ERROR, "verify.findkey", + numbuf, NULL); + } + /* fixme: we might want to append the issuer and serial + using our standard notation */ + goto next_signer; + } + + rc = keydb_get_cert (kh, &cert); + if (rc) + { + log_error ("failed to get cert: %s\n", gpg_strerror (rc)); + goto next_signer; + } + + log_info (_("Signature made ")); + if (*sigtime) + gpgsm_dump_time (sigtime); + else + log_printf (_("[date not given]")); + log_printf (_(" using certificate ID %08lX\n"), + gpgsm_get_short_fingerprint (cert)); + + + if (msgdigest) + { /* Signed attributes are available. */ + gcry_md_hd_t md; + unsigned char *s; + + /* check that the message digest in the signed attributes + matches the one we calculated on the data */ + s = gcry_md_read (data_md, algo); + if ( !s || !msgdigestlen + || gcry_md_get_algo_dlen (algo) != msgdigestlen + || !s || memcmp (s, msgdigest, msgdigestlen) ) + { + char *fpr; + + log_error ("invalid signature: message digest attribute " + "does not match calculated one\n"); + fpr = gpgsm_get_fingerprint_hexstring (cert, GCRY_MD_SHA1); + gpgsm_status (ctrl, STATUS_BADSIG, fpr); + xfree (fpr); + goto next_signer; + } + + rc = gcry_md_open (&md, algo, 0); + if (rc) + { + log_error ("md_open failed: %s\n", gpg_strerror (rc)); + goto next_signer; + } + if (DBG_HASHING) + gcry_md_start_debug (md, "vrfy.attr"); + + ksba_cms_set_hash_function (cms, HASH_FNC, md); + rc = ksba_cms_hash_signed_attrs (cms, signer); + if (rc) + { + log_error ("hashing signed attrs failed: %s\n", + gpg_strerror (rc)); + gcry_md_close (md); + goto next_signer; + } + rc = gpgsm_check_cms_signature (cert, sigval, md, algo); + gcry_md_close (md); + } + else + { + rc = gpgsm_check_cms_signature (cert, sigval, data_md, algo); + } + + if (rc) + { + char *fpr; + + log_error ("invalid signature: %s\n", gpg_strerror (rc)); + fpr = gpgsm_get_fingerprint_hexstring (cert, GCRY_MD_SHA1); + gpgsm_status (ctrl, STATUS_BADSIG, fpr); + xfree (fpr); + goto next_signer; + } + rc = gpgsm_cert_use_verify_p (cert); /*(this displays an info message)*/ + if (rc) + { + gpgsm_status_with_err_code (ctrl, STATUS_ERROR, "verify.keyusage", + gpg_err_code (rc)); + rc = 0; + } + + if (DBG_X509) + log_debug ("signature okay - checking certs\n"); + rc = gpgsm_validate_chain (ctrl, cert, keyexptime, 0, NULL, 0); + if (gpg_err_code (rc) == GPG_ERR_CERT_EXPIRED) + { + gpgsm_status (ctrl, STATUS_EXPKEYSIG, NULL); + rc = 0; + } + else + gpgsm_status (ctrl, STATUS_GOODSIG, NULL); + + { + char *buf, *fpr, *tstr; + + fpr = gpgsm_get_fingerprint_hexstring (cert, GCRY_MD_SHA1); + tstr = strtimestamp_r (sigtime); + buf = xmalloc ( strlen(fpr) + strlen (tstr) + 120); + sprintf (buf, "%s %s %s %s", fpr, tstr, + *sigtime? sigtime : "0", + *keyexptime? keyexptime : "0" ); + xfree (tstr); + xfree (fpr); + gpgsm_status (ctrl, STATUS_VALIDSIG, buf); + xfree (buf); + } + + if (rc) /* of validate_chain */ + { + log_error ("invalid certification chain: %s\n", gpg_strerror (rc)); + if (gpg_err_code (rc) == GPG_ERR_BAD_CERT_CHAIN + || gpg_err_code (rc) == GPG_ERR_BAD_CERT + || gpg_err_code (rc) == GPG_ERR_BAD_CA_CERT + || gpg_err_code (rc) == GPG_ERR_CERT_REVOKED) + gpgsm_status_with_err_code (ctrl, STATUS_TRUST_NEVER, NULL, + gpg_err_code (rc)); + else + gpgsm_status_with_err_code (ctrl, STATUS_TRUST_UNDEFINED, NULL, + gpg_err_code (rc)); + goto next_signer; + } + + for (i=0; (p = ksba_cert_get_subject (cert, i)); i++) + { + log_info (!i? _("Good signature from") + : _(" aka")); + log_printf (" \""); + gpgsm_print_name (log_get_stream (), p); + log_printf ("\"\n"); + ksba_free (p); + } + + gpgsm_status (ctrl, STATUS_TRUST_FULLY, NULL); + + + next_signer: + rc = 0; + xfree (issuer); + xfree (serial); + xfree (sigval); + xfree (msgdigest); + ksba_cert_release (cert); + cert = NULL; + } + rc = 0; + + leave: + ksba_cms_release (cms); + gpgsm_destroy_reader (b64reader); + gpgsm_destroy_writer (b64writer); + keydb_release (kh); + gcry_md_close (data_md); + if (fp) + fclose (fp); + + if (rc) + { + char numbuf[50]; + sprintf (numbuf, "%d", rc ); + gpgsm_status2 (ctrl, STATUS_ERROR, "verify.leave", + numbuf, NULL); + } + + return rc; +} + diff --git a/stamp-h.in b/stamp-h.in deleted file mode 100644 index 9788f7023..000000000 --- a/stamp-h.in +++ /dev/null @@ -1 +0,0 @@ -timestamp diff --git a/tests/ChangeLog b/tests/ChangeLog index c6b3b9af1..f12d9afbe 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,29 @@ +2006-06-08 Marcus Brinkmann <marcus@g10code.de> + + * asschk.c (__func__) [__STDC_VERSION__ < 199901L && __GNUC__ >= 2]: + Define macro to __FUNCTION__. + (die): Use __func__ instead of __FUNCTION__. + +2005-10-07 Marcus Brinkmann <marcus@g10code.de> + + * Makefile.am (TESTS_ENVIRONMENT): Remove LD_LIBRARY_PATH hack. + It's the responsibility of the person building the software to set + it properly. + +2004-09-30 Werner Koch <wk@g10code.com> + + * Makefile.am (SUBDIRS): Remove pkits until the copyright issues + have been cleared. + +2004-08-16 Werner Koch <wk@g10code.de> + + * Makefile.am: Descend into the new pkits directory + +2004-02-20 Werner Koch <wk@gnupg.org> + + * Makefile.am: Reset GPG_AGENT_INFO here + * runtest: and not anymore here. + 2002-12-04 Werner Koch <wk@gnupg.org> * inittests (gpgsm.conf): Fake system time. diff --git a/tests/Makefile.am b/tests/Makefile.am index 622b5fe58..38b64c6ea 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -15,34 +15,26 @@ # # You 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 +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, +# USA. ## Process this file with automake to produce Makefile.in + +#if RUN_PKITS_TESTS +#pkits = pkits +#else +#pkits = +#endif +# +#SUBDIRS = . ${pkits} + + GPGSM = ../sm/gpgsm -# We can't unset a variable here so we unset GPG_AGENT_INFO in runtest -TESTS_ENVIRONMENT = GNUPGHOME=`pwd` LC_ALL=C GPGSM=$(GPGSM) \ - LD_LIBRARY_PATH=$$(seen=0; \ - for i in $(LDFLAGS) $(LIBGCRYPT_LIBS) $(PTH_LIBS); \ - do \ - if echo "$$i" | egrep '^-L' >/dev/null 2>&1; \ - then \ - if test $$seen = 0; \ - then \ - seen=1; \ - else \ - printf ":"; \ - fi; \ - printf "%s" "$${i}" | sed 's/^-L//'; \ - fi; \ - done; \ - if test $$seen != 0 \ - && test x$${LD_LIBRARY_PATH} != x; \ - then \ - printf ":"; \ - fi; \ - printf "%s" "$${LD_LIBRARY_PATH}") $(srcdir)/runtest + +TESTS_ENVIRONMENT = GNUPGHOME=`pwd` GPG_AGENT_INFO= LC_ALL=C GPGSM=$(GPGSM) \ + $(srcdir)/runtest testscripts = sm-sign+verify sm-verify @@ -57,7 +49,7 @@ EXTRA_DIST = runtest inittests $(testscripts) \ TESTS = $(testscripts) -CLEANFILES = inittests.stamp x y y z out err +CLEANFILES = inittests.stamp x y y z out err \ *.lock .\#lk* DISTCLEANFILES = pubring.kbx~ random_seed diff --git a/tests/asschk.c b/tests/asschk.c index 83a8ca5af..40b95ba7d 100644 --- a/tests/asschk.c +++ b/tests/asschk.c @@ -15,7 +15,8 @@ * * You 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 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. */ /* This is a simple stand-alone Assuan server test program. We don't @@ -59,10 +60,10 @@ Print VALUE. openfile <filename> - Open file FILENAME for read access and retrun the file descriptor. + Open file FILENAME for read access and return the file descriptor. createfile <filename> - Create file FILENAME, open for write access and retrun the file + Create file FILENAME, open for write access and return the file descriptor. pipeserver <program> @@ -116,6 +117,18 @@ # define ATTR_PRINTF(f,a) #endif +#if __STDC_VERSION__ < 199901L +# if __GNUC__ >= 2 +# define __func__ __FUNCTION__ +# else +/* Let's try our luck here. Some systems may provide __func__ without + providing __STDC_VERSION__ 199901L. */ +# if 0 +# define __func__ "<unknown>" +# endif +# endif +#endif + #define spacep(p) (*(p) == ' ' || *(p) == '\t') #define MAX_LINELEN 2048 @@ -188,7 +201,7 @@ die (const char *format, ...) exit (1); } -#define die(format, args...) (die) ("%s: " format, __FUNCTION__ , ##args) +#define die(format, args...) (die) ("%s: " format, __func__ , ##args) static void err (const char *format, ...) diff --git a/tests/extrasamples/README b/tests/extrasamples/README new file mode 100644 index 000000000..31efcbde0 --- /dev/null +++ b/tests/extrasamples/README @@ -0,0 +1,11 @@ +Extra test data where it is not clear whether we may distribute them. Thus +we only keep them in the CVS. + +dod-test9.p12 A file from the DoD X.509 tests suite, September 2001. + Passphrase is "password". + +siemens-ZZZZZ000.crt +siemens-ZZZZZ0EE.crt + Two certificates from the Siemens CA featuring a trailing + garbage byte and crlDPs with several names. + diff --git a/tests/extrasamples/dod-test9.p12 b/tests/extrasamples/dod-test9.p12 new file mode 100644 index 000000000..a109b1aa9 Binary files /dev/null and b/tests/extrasamples/dod-test9.p12 differ diff --git a/tests/extrasamples/siemens-ZZZZZ000.crt b/tests/extrasamples/siemens-ZZZZZ000.crt new file mode 100644 index 000000000..6807b5c26 Binary files /dev/null and b/tests/extrasamples/siemens-ZZZZZ000.crt differ diff --git a/tests/extrasamples/siemens-ZZZZZ0EE.crt b/tests/extrasamples/siemens-ZZZZZ0EE.crt new file mode 100644 index 000000000..e8a50dbb0 Binary files /dev/null and b/tests/extrasamples/siemens-ZZZZZ0EE.crt differ diff --git a/tests/pkits/ChangeLog b/tests/pkits/ChangeLog new file mode 100644 index 000000000..084e6cec8 --- /dev/null +++ b/tests/pkits/ChangeLog @@ -0,0 +1,23 @@ +2006-05-02 Werner Koch <wk@g10code.com> + + * PKITS_data.tar.bz2: Repackaged new copy becuase the old one got + corrupted by the conversion fromCVS to SVN. + +2004-08-16 Werner Koch <wk@g10code.de> + + Started implementing PKITS based tests. + + + Copyright 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/tests/pkits/Makefile.am b/tests/pkits/Makefile.am new file mode 100644 index 000000000..d53d35a25 --- /dev/null +++ b/tests/pkits/Makefile.am @@ -0,0 +1,70 @@ +# Makefile.am - tests using NIST's PKITS +# 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. + +## Process this file with automake to produce Makefile.in + +GPGSM = ../../sm/gpgsm + +TESTS_ENVIRONMENT = GNUPGHOME=`pwd` GPG_AGENT_INFO= LC_ALL=C GPGSM=$(GPGSM) \ + LD_LIBRARY_PATH=$$(seen=0; \ + for i in $(LDFLAGS) $(LIBGCRYPT_LIBS) $(PTH_LIBS); \ + do \ + if echo "$$i" | egrep '^-L' >/dev/null 2>&1; \ + then \ + if test $$seen = 0; \ + then \ + seen=1; \ + else \ + printf ":"; \ + fi; \ + printf "%s" "$${i}" | sed 's/^-L//'; \ + fi; \ + done; \ + if test $$seen != 0 \ + && test x$${LD_LIBRARY_PATH} != x; \ + then \ + printf ":"; \ + fi; \ + printf "%s" "$${LD_LIBRARY_PATH}") $(srcdir)/runtest + + + +testscripts = import-all-certs validate-all-certs + + + +EXTRA_DIST = PKITS_data.tar.bz2 inittests runtest $(testscripts) + import-all-certs.data + +TESTS = $(testscripts) + +CLEANFILES = inittests.stamp x y y z out err *.lock .\#lk* *.log + +DISTCLEANFILES = pubring.kbx~ random_seed + +all-local: inittests.stamp + +clean-local: + srcdir=$(srcdir) $(TESTS_ENVIRONMENT) $(srcdir)/inittests --clean + +inittests.stamp: inittests + srcdir=$(srcdir) $(TESTS_ENVIRONMENT) $(srcdir)/inittests + echo timestamp >./inittests.stamp + diff --git a/tests/pkits/PKITS_data.tar.bz2 b/tests/pkits/PKITS_data.tar.bz2 new file mode 100644 index 000000000..687d504f6 Binary files /dev/null and b/tests/pkits/PKITS_data.tar.bz2 differ diff --git a/tests/pkits/README b/tests/pkits/README new file mode 100644 index 000000000..79678cf30 --- /dev/null +++ b/tests/pkits/README @@ -0,0 +1,12 @@ +tests/pkits/README + +These are tests based on NIST's Public Key Interoperability Test Suite +(PKITS) as downloaded on 2006-05-02 from +http://csrc.nist.gov/pki/testing/x509paths.html . + +README - this file. +PKITS_data.tar.bz2 - the orginal ZIP file, repackaged as a tarball. +Makefile.am - Part of our build system. + + +The password for the p12 files is "password". diff --git a/tests/pkits/common.sh b/tests/pkits/common.sh new file mode 100644 index 000000000..09fb62bc8 --- /dev/null +++ b/tests/pkits/common.sh @@ -0,0 +1,136 @@ +#!/bin/sh +# common.sh - common defs for all tests -*- sh -*- +# 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. + +# reset some environment variables because we do not want to test locals +export LANG=C +export LANGUAGE=C +export LC_ALL=C + + +[ "$VERBOSE" = yes ] && set -x +[ -z "$srcdir" ] && srcdir="." +[ -z "$top_srcdir" ] && top_srcdir=".." +[ -z "$GPGSM" ] && GPGSM="../../sm/gpgsm" + + +if [ "$GNUPGHOME" != "`pwd`" ]; then + echo "inittests: please set GNUPGHOME to the tests/pkits directory" >&2 + exit 1 +fi + +if [ -n "$GPG_AGENT_INFO" ]; then + echo "inittests: please unset GPG_AGENT_INFO" >&2 + exit 1 +fi + + + +#-------------------------------- +#------ utility functions ------- +#-------------------------------- + +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" +} + +fatal () { + echo "$pgmname: fatal:" $* >&2 + exit 1; +} + +error () { + echo "$pgmname:" $* >&2 + exit 1 +} + +info () { + echo "$pgmname:" $* >&2 +} + +info_n () { + $echo_n "$pgmname:" $* >&2 +} + +pass () { + echo "PASS: " $* >&2 + pass_count=`expr ${pass_count} + 1` +} + +fail () { + echo "FAIL: " $* >&2 + fail_count=`expr ${fail_count} + 1` +} + +unresolved () { + echo "UNRESOLVED: " $* >&2 + unresolved_count=`expr ${unresolved_count} + 1` +} + +unsupported () { + echo "UNSUPPORTED: " $* >&2 + unsupported_count=`expr ${unsupported_count} + 1` +} + + +final_result () { + [ $pass_count = 0 ] || info "$pass_count tests passed" + [ $fail_count = 0 ] || info "$fail_count tests failed" + [ $unresolved_count = 0 ] || info "$unresolved_count tests unresolved" + [ $unsupported_count = 0 ] || info "$unsupported_count tests unsupported" + if [ $fail_count = 0 ]; then + info "all tests passed" + else + exit 1 + fi +} + +set -e + +pgmname=`basename $0` + +pass_count=0 +fail_count=0 +unresolved_count=0 +unsupported_count=0 + + +#trap cleanup SIGHUP SIGINT SIGQUIT +exec 2> ${pgmname}.log + +: +# end diff --git a/tests/pkits/import-all-certs b/tests/pkits/import-all-certs new file mode 100755 index 000000000..2d70d06df --- /dev/null +++ b/tests/pkits/import-all-certs @@ -0,0 +1,54 @@ +#!/bin/sh +# Copyright (C) 2004 Free Software Foundation, Inc. -*- sh -*- +# +# This file is part of GnuPG. +# +# GnuPG is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# GnuPG is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public 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:-.}/common.sh || exit 2 + +while read flag dummy name; do + case $flag in \#*) continue;; esac + [ -z "$flag" ] && continue; + + if ${GPGSM} -q --import certs/$name ; then + if [ "$flag" = 'p' ]; then + pass "importing certificate \`$name' succeeded" + elif [ "$flag" = 'f' ]; then + fail "importing certificate \`$name' succeeded" + elif [ "$flag" = '?' ]; then + unresolved "importing certificate \`$name' succeeded" + elif [ "$flag" = 'u' ]; then + unsupported "importing certificate \`$name' succeeded" + else + info "importing certificate \`$name' succeeded - (flag=$flag)" + fi + else + if [ "$flag" = 'p' ]; then + fail "importing certificate \`$name' failed" + elif [ "$flag" = 'f' ]; then + pass "importing certificate \`$name' failed" + elif [ "$flag" = '?' ]; then + unresolved "importing certificate \`$name' failed" + elif [ "$flag" = 'u' ]; then + unsupported "importing certificate \`$name' failed" + else + info "importing certificate \`$name' failed - (flag=$flag)" + fi + fi +done < $srcdir/import-all-certs.data + +final_result diff --git a/tests/pkits/import-all-certs.data b/tests/pkits/import-all-certs.data new file mode 100644 index 000000000..18708aa61 --- /dev/null +++ b/tests/pkits/import-all-certs.data @@ -0,0 +1,490 @@ +# The first column is for the basic import test, the second for a +# validation test. + +# Make sure that the root certificate is imported first +p p TrustAnchorRootCertificate.crt + +p p AllCertificatesNoPoliciesTest2EE.crt +p p AllCertificatesSamePoliciesTest10EE.crt +p p AllCertificatesSamePoliciesTest13EE.crt +p p AllCertificatesanyPolicyTest11EE.crt +p p AnyPolicyTest14EE.crt +p p BadCRLIssuerNameCACert.crt +p p BadCRLSignatureCACert.crt +f f BadSignedCACert.crt +p f BadnotAfterDateCACert.crt + +# UTC: "470101120100Z" i.e. not before 2047-01-01 +p f BadnotBeforeDateCACert.crt + +p p BasicSelfIssuedCRLSigningKeyCACert.crt + +# For yet unknown reasons gpgsm claims a bad signature. +? ? BasicSelfIssuedCRLSigningKeyCRLCert.crt + +p p BasicSelfIssuedNewKeyCACert.crt + +# For yet unknown reasons gpgsm claims a bad signature. +? ? BasicSelfIssuedNewKeyOldWithNewCACert.crt + +p p BasicSelfIssuedOldKeyCACert.crt + +# For yet unknown reasons gpgsm claims a bad signature. +? ? BasicSelfIssuedOldKeyNewWithOldCACert.crt + +p p CPSPointerQualifierTest20EE.crt + +u u DSACACert.crt +u u DSAParametersInheritedCACert.crt + +p p DifferentPoliciesTest12EE.crt +p p DifferentPoliciesTest3EE.crt +p p DifferentPoliciesTest4EE.crt +p p DifferentPoliciesTest5EE.crt +p p DifferentPoliciesTest7EE.crt +p p DifferentPoliciesTest8EE.crt +p p DifferentPoliciesTest9EE.crt +p p GeneralizedTimeCRLnextUpdateCACert.crt +p p GoodCACert.crt +p p GoodsubCACert.crt + +# gpgsm: critical certificate extension 2.5.29.33 (policyMappings) +# is not supported +p u GoodsubCAPanyPolicyMapping1to2CACert.crt + +# fixme: gpgme does not fail for it. +p f InvalidBadCRLIssuerNameTest5EE.crt + +p f InvalidBadCRLSignatureTest4EE.crt +p f InvalidBasicSelfIssuedCRLSigningKeyTest7EE.crt + +f f InvalidBasicSelfIssuedCRLSigningKeyTest8EE.crt + +p f InvalidBasicSelfIssuedNewWithOldTest5EE.crt + +f f InvalidBasicSelfIssuedOldWithNewTest2EE.crt + +p f InvalidCASignatureTest2EE.crt + +p f InvalidCAnotAfterDateTest5EE.crt +p f InvalidCAnotBeforeDateTest1EE.crt +p f InvalidDNSnameConstraintsTest31EE.crt +p f InvalidDNSnameConstraintsTest33EE.crt +p f InvalidDNSnameConstraintsTest38EE.crt +p f InvalidDNandRFC822nameConstraintsTest28EE.crt +p f InvalidDNandRFC822nameConstraintsTest29EE.crt +p f InvalidDNnameConstraintsTest10EE.crt +p f InvalidDNnameConstraintsTest12EE.crt +p f InvalidDNnameConstraintsTest13EE.crt +p f InvalidDNnameConstraintsTest15EE.crt +p f InvalidDNnameConstraintsTest16EE.crt +p f InvalidDNnameConstraintsTest17EE.crt + +f f InvalidDNnameConstraintsTest20EE.crt + +p f InvalidDNnameConstraintsTest2EE.crt +p f InvalidDNnameConstraintsTest3EE.crt +p f InvalidDNnameConstraintsTest7EE.crt +p f InvalidDNnameConstraintsTest8EE.crt +p f InvalidDNnameConstraintsTest9EE.crt + +u u InvalidDSASignatureTest6EE.crt + +f f InvalidEESignatureTest3EE.crt + +p f InvalidEEnotAfterDateTest6EE.crt +p f InvalidEEnotBeforeDateTest2EE.crt +p f InvalidIDPwithindirectCRLTest23EE.crt +p f InvalidIDPwithindirectCRLTest26EE.crt +p f InvalidLongSerialNumberTest18EE.crt +p f InvalidMappingFromanyPolicyTest7EE.crt +p f InvalidMappingToanyPolicyTest8EE.crt +p f InvalidMissingCRLTest1EE.crt +p f InvalidMissingbasicConstraintsTest1EE.crt +p f InvalidNameChainingOrderTest2EE.crt +p f InvalidNameChainingTest1EE.crt +p f InvalidNegativeSerialNumberTest15EE.crt +p f InvalidOldCRLnextUpdateTest11EE.crt +p f InvalidPolicyMappingTest10EE.crt +p f InvalidPolicyMappingTest2EE.crt +p f InvalidPolicyMappingTest4EE.crt +p f InvalidRFC822nameConstraintsTest22EE.crt +p f InvalidRFC822nameConstraintsTest24EE.crt +p f InvalidRFC822nameConstraintsTest26EE.crt +p f InvalidRevokedCATest2EE.crt +p f InvalidRevokedEETest3EE.crt + +f f InvalidSelfIssuedinhibitAnyPolicyTest10EE.crt + +p f InvalidSelfIssuedinhibitAnyPolicyTest8EE.crt +p f InvalidSelfIssuedinhibitPolicyMappingTest10EE.crt +p f InvalidSelfIssuedinhibitPolicyMappingTest11EE.crt +p f InvalidSelfIssuedinhibitPolicyMappingTest8EE.crt +p f InvalidSelfIssuedinhibitPolicyMappingTest9EE.crt +p f InvalidSelfIssuedpathLenConstraintTest16EE.crt +p f InvalidSelfIssuedrequireExplicitPolicyTest7EE.crt +p f InvalidSelfIssuedrequireExplicitPolicyTest8EE.crt + +f f InvalidSeparateCertificateandCRLKeysTest20EE.crt +f f InvalidSeparateCertificateandCRLKeysTest21EE.crt + +p f InvalidURInameConstraintsTest35EE.crt +p f InvalidURInameConstraintsTest37EE.crt +p f InvalidUnknownCRLEntryExtensionTest8EE.crt +p f InvalidUnknownCRLExtensionTest10EE.crt +p f InvalidUnknownCRLExtensionTest9EE.crt +p f InvalidUnknownCriticalCertificateExtensionTest2EE.crt +p f InvalidWrongCRLTest6EE.crt +p f InvalidcAFalseTest2EE.crt +p f InvalidcAFalseTest3EE.crt +p f InvalidcRLIssuerTest27EE.crt +p f InvalidcRLIssuerTest31EE.crt +p f InvalidcRLIssuerTest32EE.crt +p f InvalidcRLIssuerTest34EE.crt +p f InvalidcRLIssuerTest35EE.crt +p f InvaliddeltaCRLIndicatorNoBaseTest1EE.crt +p f InvaliddeltaCRLTest10EE.crt +p f InvaliddeltaCRLTest3EE.crt +p f InvaliddeltaCRLTest4EE.crt +p f InvaliddeltaCRLTest6EE.crt +p f InvaliddeltaCRLTest9EE.crt +p f InvaliddistributionPointTest2EE.crt +p f InvaliddistributionPointTest3EE.crt +p f InvaliddistributionPointTest6EE.crt +p f InvaliddistributionPointTest8EE.crt +p f InvaliddistributionPointTest9EE.crt +p f InvalidinhibitAnyPolicyTest1EE.crt +p f InvalidinhibitAnyPolicyTest4EE.crt +p f InvalidinhibitAnyPolicyTest5EE.crt +p f InvalidinhibitAnyPolicyTest6EE.crt +p f InvalidinhibitPolicyMappingTest1EE.crt +p f InvalidinhibitPolicyMappingTest3EE.crt +p f InvalidinhibitPolicyMappingTest5EE.crt +p f InvalidinhibitPolicyMappingTest6EE.crt +p f InvalidkeyUsageCriticalcRLSignFalseTest4EE.crt +p f InvalidkeyUsageCriticalkeyCertSignFalseTest1EE.crt +p f InvalidkeyUsageNotCriticalcRLSignFalseTest5EE.crt +p f InvalidkeyUsageNotCriticalkeyCertSignFalseTest2EE.crt +p f InvalidonlyContainsAttributeCertsTest14EE.crt +p f InvalidonlyContainsCACertsTest12EE.crt +p f InvalidonlyContainsUserCertsTest11EE.crt +p f InvalidonlySomeReasonsTest15EE.crt +p f InvalidonlySomeReasonsTest16EE.crt +p f InvalidonlySomeReasonsTest17EE.crt +p f InvalidonlySomeReasonsTest20EE.crt +p f InvalidonlySomeReasonsTest21EE.crt +p f InvalidpathLenConstraintTest10EE.crt +p f InvalidpathLenConstraintTest11EE.crt +p f InvalidpathLenConstraintTest12EE.crt +p f InvalidpathLenConstraintTest5EE.crt +p f InvalidpathLenConstraintTest6EE.crt +p f InvalidpathLenConstraintTest9EE.crt +p f Invalidpre2000CRLnextUpdateTest12EE.crt +p f Invalidpre2000UTCEEnotAfterDateTest7EE.crt +p f InvalidrequireExplicitPolicyTest3EE.crt +p f InvalidrequireExplicitPolicyTest5EE.crt +p p LongSerialNumberCACert.crt +p p Mapping1to2CACert.crt +p p MappingFromanyPolicyCACert.crt +p p MappingToanyPolicyCACert.crt +p p MissingbasicConstraintsCACert.crt +p p NameOrderingCACert.crt +p p NegativeSerialNumberCACert.crt +p p NoCRLCACert.crt +p p NoPoliciesCACert.crt +p p NoissuingDistributionPointCACert.crt +p p OldCRLnextUpdateCACert.crt +p p OverlappingPoliciesTest6EE.crt +p p P12Mapping1to3CACert.crt +p p P12Mapping1to3subCACert.crt +p p P12Mapping1to3subsubCACert.crt +p p P1Mapping1to234CACert.crt +p p P1Mapping1to234subCACert.crt +p p P1anyPolicyMapping1to2CACert.crt +p p PanyPolicyMapping1to2CACert.crt +p p PoliciesP1234CACert.crt +p p PoliciesP1234subCAP123Cert.crt +p p PoliciesP1234subsubCAP123P12Cert.crt +p p PoliciesP123CACert.crt +p p PoliciesP123subCAP12Cert.crt +p p PoliciesP123subsubCAP12P1Cert.crt +p p PoliciesP123subsubCAP12P2Cert.crt +p p PoliciesP123subsubsubCAP12P2P1Cert.crt +p p PoliciesP12CACert.crt +p p PoliciesP12subCAP1Cert.crt +p p PoliciesP12subsubCAP1P2Cert.crt +p p PoliciesP2subCA2Cert.crt +p p PoliciesP2subCACert.crt +p p PoliciesP3CACert.crt +p p RFC3280MandatoryAttributeTypesCACert.crt +p p RFC3280OptionalAttributeTypesCACert.crt +p p RevokedsubCACert.crt +p p RolloverfromPrintableStringtoUTF8StringCACert.crt +p p SeparateCertificateandCRLKeysCA2CRLSigningCert.crt +p p SeparateCertificateandCRLKeysCA2CertificateSigningCACert.crt +p p SeparateCertificateandCRLKeysCRLSigningCert.crt +p p SeparateCertificateandCRLKeysCertificateSigningCACert.crt +p p TwoCRLsCACert.crt +p p UIDCACert.crt +p p UTF8StringCaseInsensitiveMatchCACert.crt +p p UTF8StringEncodedNamesCACert.crt +p p UnknownCRLEntryExtensionCACert.crt +p p UnknownCRLExtensionCACert.crt +p p UserNoticeQualifierTest15EE.crt +p p UserNoticeQualifierTest16EE.crt +p p UserNoticeQualifierTest17EE.crt +p p UserNoticeQualifierTest18EE.crt +p p UserNoticeQualifierTest19EE.crt +p p ValidBasicSelfIssuedCRLSigningKeyTest6EE.crt + +# For yet unknown reasons gpgsm claims a bad signature. +? ? ValidBasicSelfIssuedNewWithOldTest3EE.crt + +p p ValidBasicSelfIssuedNewWithOldTest4EE.crt + +# For yet unknown reasons gpgsm claims a bad signature. +? ? ValidBasicSelfIssuedOldWithNewTest1EE.crt + +p p ValidCertificatePathTest1EE.crt +p p ValidDNSnameConstraintsTest30EE.crt +p p ValidDNSnameConstraintsTest32EE.crt +p p ValidDNandRFC822nameConstraintsTest27EE.crt +p p ValidDNnameConstraintsTest11EE.crt + +# This certificate has an empty subject sequence. Our parser does not +# support this yet and it is unlikely that gpgsm will be able to cope +# with it at all. +u u ValidDNnameConstraintsTest14EE.crt + +p p ValidDNnameConstraintsTest18EE.crt + +# For yet unknown reasons gpgsm claims a bad signature. +? ? ValidDNnameConstraintsTest19EE.crt + +p p ValidDNnameConstraintsTest1EE.crt +p p ValidDNnameConstraintsTest4EE.crt +p p ValidDNnameConstraintsTest5EE.crt +p p ValidDNnameConstraintsTest6EE.crt + +u p ValidDSAParameterInheritanceTest5EE.crt +u p ValidDSASignaturesTest4EE.crt + +p p ValidGeneralizedTimeCRLnextUpdateTest13EE.crt +p p ValidGeneralizedTimenotAfterDateTest8EE.crt +p p ValidGeneralizedTimenotBeforeDateTest4EE.crt +p p ValidIDPwithindirectCRLTest22EE.crt +p p ValidIDPwithindirectCRLTest24EE.crt +p p ValidIDPwithindirectCRLTest25EE.crt +p p ValidLongSerialNumberTest16EE.crt +p p ValidLongSerialNumberTest17EE.crt +p p ValidNameChainingCapitalizationTest5EE.crt +p p ValidNameChainingWhitespaceTest3EE.crt +p p ValidNameChainingWhitespaceTest4EE.crt +p p ValidNameUIDsTest6EE.crt +p p ValidNegativeSerialNumberTest14EE.crt +p p ValidNoissuingDistributionPointTest10EE.crt +p p ValidPolicyMappingTest11EE.crt +p p ValidPolicyMappingTest12EE.crt +p p ValidPolicyMappingTest13EE.crt +p p ValidPolicyMappingTest14EE.crt +p p ValidPolicyMappingTest1EE.crt +p p ValidPolicyMappingTest3EE.crt +p p ValidPolicyMappingTest5EE.crt +p p ValidPolicyMappingTest6EE.crt +p p ValidPolicyMappingTest9EE.crt +p p ValidRFC3280MandatoryAttributeTypesTest7EE.crt +p p ValidRFC3280OptionalAttributeTypesTest8EE.crt +p p ValidRFC822nameConstraintsTest21EE.crt +p p ValidRFC822nameConstraintsTest23EE.crt +p p ValidRFC822nameConstraintsTest25EE.crt +p p ValidRolloverfromPrintableStringtoUTF8StringTest10EE.crt +p p ValidSelfIssuedinhibitAnyPolicyTest7EE.crt +p p ValidSelfIssuedinhibitAnyPolicyTest9EE.crt +p p ValidSelfIssuedinhibitPolicyMappingTest7EE.crt + +# For yet unknown reasons gpgsm claims a bad signature. +? ? ValidSelfIssuedpathLenConstraintTest15EE.crt + +p p ValidSelfIssuedpathLenConstraintTest17EE.crt + +# For yet unknown reasons gpgsm claims a bad signature. +? ? ValidSelfIssuedrequireExplicitPolicyTest6EE.crt + +# For yet unknown reasons gpgsm claims a bad signature. +? ? ValidSeparateCertificateandCRLKeysTest19EE.crt + +p p ValidTwoCRLsTest7EE.crt +p p ValidURInameConstraintsTest34EE.crt +p p ValidURInameConstraintsTest36EE.crt +p p ValidUTF8StringCaseInsensitiveMatchTest11EE.crt +p p ValidUTF8StringEncodedNamesTest9EE.crt +p p ValidUnknownNotCriticalCertificateExtensionTest1EE.crt +p p ValidbasicConstraintsNotCriticalTest4EE.crt +p p ValidcRLIssuerTest28EE.crt +p p ValidcRLIssuerTest29EE.crt +p p ValidcRLIssuerTest30EE.crt +p p ValidcRLIssuerTest33EE.crt +p p ValiddeltaCRLTest2EE.crt +p p ValiddeltaCRLTest5EE.crt +p p ValiddeltaCRLTest7EE.crt +p p ValiddeltaCRLTest8EE.crt +p p ValiddistributionPointTest1EE.crt +p p ValiddistributionPointTest4EE.crt +p p ValiddistributionPointTest5EE.crt +p p ValiddistributionPointTest7EE.crt +p p ValidinhibitAnyPolicyTest2EE.crt +p p ValidinhibitPolicyMappingTest2EE.crt +p p ValidinhibitPolicyMappingTest4EE.crt +p p ValidkeyUsageNotCriticalTest3EE.crt +p p ValidonlyContainsCACertsTest13EE.crt +p p ValidonlySomeReasonsTest18EE.crt +p p ValidonlySomeReasonsTest19EE.crt +p p ValidpathLenConstraintTest13EE.crt +p p ValidpathLenConstraintTest14EE.crt +p p ValidpathLenConstraintTest7EE.crt +p p ValidpathLenConstraintTest8EE.crt +p p Validpre2000UTCnotBeforeDateTest3EE.crt +p p ValidrequireExplicitPolicyTest1EE.crt +p p ValidrequireExplicitPolicyTest2EE.crt +p p ValidrequireExplicitPolicyTest4EE.crt +p p WrongCRLCACert.crt +p p anyPolicyCACert.crt +p p basicConstraintsCriticalcAFalseCACert.crt +p p basicConstraintsNotCriticalCACert.crt +p p basicConstraintsNotCriticalcAFalseCACert.crt +p p deltaCRLCA1Cert.crt +p p deltaCRLCA2Cert.crt +p p deltaCRLCA3Cert.crt +p p deltaCRLIndicatorNoBaseCACert.crt +p p distributionPoint1CACert.crt +p p distributionPoint2CACert.crt +p p indirectCRLCA1Cert.crt +p p indirectCRLCA2Cert.crt +p p indirectCRLCA3Cert.crt +p p indirectCRLCA3cRLIssuerCert.crt +p p indirectCRLCA4Cert.crt +p p indirectCRLCA4cRLIssuerCert.crt +p p indirectCRLCA5Cert.crt +p p indirectCRLCA6Cert.crt +p p inhibitAnyPolicy0CACert.crt +p p inhibitAnyPolicy1CACert.crt + +# For yet unknown reasons gpgsm claims a bad signature. +? ? inhibitAnyPolicy1SelfIssuedCACert.crt +? ? inhibitAnyPolicy1SelfIssuedsubCA2Cert.crt + +p p inhibitAnyPolicy1subCA1Cert.crt + +# For yet unknown reasons gpgsm claims a bad signature. +? ? inhibitAnyPolicy1subCA2Cert.crt + +p p inhibitAnyPolicy1subCAIAP5Cert.crt +p p inhibitAnyPolicy1subsubCA2Cert.crt +p p inhibitAnyPolicy5CACert.crt +p p inhibitAnyPolicy5subCACert.crt +p p inhibitAnyPolicy5subsubCACert.crt +p p inhibitAnyPolicyTest3EE.crt +p p inhibitPolicyMapping0CACert.crt +p p inhibitPolicyMapping0subCACert.crt +p p inhibitPolicyMapping1P12CACert.crt +p p inhibitPolicyMapping1P12subCACert.crt +p p inhibitPolicyMapping1P12subCAIPM5Cert.crt +p p inhibitPolicyMapping1P12subsubCACert.crt +p p inhibitPolicyMapping1P12subsubCAIPM5Cert.crt +p p inhibitPolicyMapping1P1CACert.crt + +# For yet unknown reasons gpgsm claims a bad signature. +? ? inhibitPolicyMapping1P1SelfIssuedCACert.crt +? ? inhibitPolicyMapping1P1SelfIssuedsubCACert.crt +? ? inhibitPolicyMapping1P1subCACert.crt + +p p inhibitPolicyMapping1P1subsubCACert.crt +p p inhibitPolicyMapping5CACert.crt +p p inhibitPolicyMapping5subCACert.crt +p p inhibitPolicyMapping5subsubCACert.crt +p p inhibitPolicyMapping5subsubsubCACert.crt +p p keyUsageCriticalcRLSignFalseCACert.crt +p p keyUsageCriticalkeyCertSignFalseCACert.crt +p p keyUsageNotCriticalCACert.crt +p p keyUsageNotCriticalcRLSignFalseCACert.crt +p p keyUsageNotCriticalkeyCertSignFalseCACert.crt +p p nameConstraintsDN1CACert.crt + +# For yet unknown reasons gpgsm claims a bad signature. +? ? nameConstraintsDN1SelfIssuedCACert.crt + +p p nameConstraintsDN1subCA1Cert.crt +p p nameConstraintsDN1subCA2Cert.crt +p p nameConstraintsDN1subCA3Cert.crt +p p nameConstraintsDN2CACert.crt +p p nameConstraintsDN3CACert.crt +p p nameConstraintsDN3subCA1Cert.crt +p p nameConstraintsDN3subCA2Cert.crt +p p nameConstraintsDN4CACert.crt +p p nameConstraintsDN5CACert.crt +p p nameConstraintsDNS1CACert.crt +p p nameConstraintsDNS2CACert.crt +p p nameConstraintsRFC822CA1Cert.crt +p p nameConstraintsRFC822CA2Cert.crt +p p nameConstraintsRFC822CA3Cert.crt +p p nameConstraintsURI1CACert.crt +p p nameConstraintsURI2CACert.crt +p p onlyContainsAttributeCertsCACert.crt +p p onlyContainsCACertsCACert.crt +p p onlyContainsUserCertsCACert.crt +p p onlySomeReasonsCA1Cert.crt +p p onlySomeReasonsCA2Cert.crt +p p onlySomeReasonsCA3Cert.crt +p p onlySomeReasonsCA4Cert.crt +p p pathLenConstraint0CACert.crt + +# For yet unknown reasons gpgsm claims a bad signature. +? ? pathLenConstraint0SelfIssuedCACert.crt +? ? pathLenConstraint0subCA2Cert.crt + +p p pathLenConstraint0subCACert.crt +p p pathLenConstraint1CACert.crt + +# For yet unknown reasons gpgsm claims a bad signature. +? ? pathLenConstraint1SelfIssuedCACert.crt +? ? pathLenConstraint1SelfIssuedsubCACert.crt +? ? pathLenConstraint1subCACert.crt + +p p pathLenConstraint6CACert.crt +p p pathLenConstraint6subCA0Cert.crt +p p pathLenConstraint6subCA1Cert.crt +p p pathLenConstraint6subCA4Cert.crt +p p pathLenConstraint6subsubCA00Cert.crt +p p pathLenConstraint6subsubCA11Cert.crt +p p pathLenConstraint6subsubCA41Cert.crt +p p pathLenConstraint6subsubsubCA11XCert.crt +p p pathLenConstraint6subsubsubCA41XCert.crt +p p pre2000CRLnextUpdateCACert.crt +p p requireExplicitPolicy0CACert.crt +p p requireExplicitPolicy0subCACert.crt +p p requireExplicitPolicy0subsubCACert.crt +p p requireExplicitPolicy0subsubsubCACert.crt +p p requireExplicitPolicy10CACert.crt +p p requireExplicitPolicy10subCACert.crt +p p requireExplicitPolicy10subsubCACert.crt +p p requireExplicitPolicy10subsubsubCACert.crt +p p requireExplicitPolicy2CACert.crt + +# For yet unknown reasons gpgsm claims a bad signature. +? ? requireExplicitPolicy2SelfIssuedCACert.crt +? ? requireExplicitPolicy2SelfIssuedsubCACert.crt +? ? requireExplicitPolicy2subCACert.crt + +p p requireExplicitPolicy4CACert.crt +p p requireExplicitPolicy4subCACert.crt +p p requireExplicitPolicy4subsubCACert.crt +p p requireExplicitPolicy4subsubsubCACert.crt +p p requireExplicitPolicy5CACert.crt +p p requireExplicitPolicy5subCACert.crt +p p requireExplicitPolicy5subsubCACert.crt +p p requireExplicitPolicy5subsubsubCACert.crt +p p requireExplicitPolicy7CACert.crt +p p requireExplicitPolicy7subCARE2Cert.crt +p p requireExplicitPolicy7subsubCARE2RE4Cert.crt +p p requireExplicitPolicy7subsubsubCARE2RE4Cert.crt + diff --git a/tests/pkits/inittests b/tests/pkits/inittests new file mode 100755 index 000000000..e5d136fd9 --- /dev/null +++ b/tests/pkits/inittests @@ -0,0 +1,94 @@ +#!/bin/sh +# Copyright (C) 2004 Free Software Foundation, Inc. -*- sh -*- +# +# 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. + +set -e + + +clean_files=' +ReadMe.txt pkits.ldif pkits.schema +gpgsm.conf gpg-agent.conf trustlist.txt policies.txt pubring.kbx +msg msg.sig msg.unsig +' + +[ -z "$srcdir" ] && srcdir=. +[ -z "$GPGSM" ] && GPGSM=../../sm/gpgsm + +if [ -f $srcdir/README ] \ + && grep tests/pkits/README README >/dev/null 2>&1; then + : +else + # During make distclean the Makefile has already been removed, + # so we need this extra test. + if ! grep gnupg-test-pkits-directory testdir.stamp >/dev/null 2>&1; then + echo "inittests: please cd to the tests/pkits directory first" >&2 + exit 1 + fi +fi + +if [ "$1" = "--clean" ]; then + if [ -d private-keys-v1.d ]; then + rm private-keys-v1.d/* 2>/dev/null || true + rmdir private-keys-v1.d + fi + rm ${clean_files} testdir.stamp 2>/dev/null || true + for i in certs certpairs crls pkcs12 smime; do + if [ -d $i ]; then + rm $i/* 2>/dev/null || true + rmdir $i + fi + done + exit 0 +fi + +if [ "$GNUPGHOME" != "`pwd`" ]; then + echo "inittests: please set GNUPGHOME to the tests/pkits directory" >&2 + exit 1 +fi + +if [ -n "$GPG_AGENT_INFO" ]; then + echo "inittests: please unset GPG_AGENT_INFO" >&2 + exit 1 +fi + +if ! bunzip2 -c PKITS_data.tar.bz2 | tar xf - ; then + echo "inittests: failed to untar the test data" >&2 + exit 1 +fi + + +# A stamp file used with --clean +echo gnupg-test-pkits-directory > testdir.stamp + + +# Create the configuration scripts +cat > gpgsm.conf <<EOF +no-secmem-warning +no-greeting +batch +disable-crl-checks +agent-program ../../agent/gpg-agent +EOF + +# Fixme: we need to write a dummy pinentry program +cat > gpg-agent.conf <<EOF +no-grab +EOF + +# Mark the root CA trusted +cat > trustlist.txt <<EOF +# /CN=Trust Anchor/O=Test Certificates/C=US +66:8A:47:56:A2:DC:88:FF:DA:B8:95:E1:3C:63:37:55:5F:0A:F7:BF S +EOF + +# Define the standard policies as NIST test-policy-1 +#cat >policies.txt <<EOF +#2.16.840.1.101.3.2.1.48.1 +#EOF diff --git a/tests/pkits/runtest b/tests/pkits/runtest new file mode 100755 index 000000000..f054a3498 --- /dev/null +++ b/tests/pkits/runtest @@ -0,0 +1,4 @@ +#!/bin/sh +[ -x "$1" ] && exec $1 $2 +exec sh $1 $2 + diff --git a/tests/pkits/validate-all-certs b/tests/pkits/validate-all-certs new file mode 100755 index 000000000..08f72af71 --- /dev/null +++ b/tests/pkits/validate-all-certs @@ -0,0 +1,56 @@ +#!/bin/sh +# validate-all-certs -*- sh -*- +# 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. + +. ${srcdir:-.}/common.sh || exit 2 + +while read dummy flag name; do + case $dummy in \#*) continue;; esac + [ -z "$dummy" ] && continue; + + if ${GPGSM} -q --import --with-validation --disable-crl-checks \ + certs/$name ; then + if [ "$flag" = 'p' ]; then + pass "validating certificate \`$name' succeeded" + elif [ "$flag" = 'f' ]; then + fail "validating certificate \`$name' succeeded" + elif [ "$flag" = '?' ]; then + unresolved "validating certificate \`$name' succeeded" + elif [ "$flag" = 'u' ]; then + unsupported "validating certificate \`$name' succeeded" + else + info "validating certificate \`$name' succeeded - (flag=$flag)" + fi + else + if [ "$flag" = 'p' ]; then + fail "validating certificate \`$name' failed" + elif [ "$flag" = 'f' ]; then + pass "validating certificate \`$name' failed" + elif [ "$flag" = '?' ]; then + unresolved "validating certificate \`$name' failed" + elif [ "$flag" = 'u' ]; then + unsupported "validating certificate \`$name' failed" + else + info "validating certificate \`$name' failed - (flag=$flag)" + fi + fi +done < $srcdir/import-all-certs.data + +final_result diff --git a/tests/runtest b/tests/runtest index 71385fb46..8d5078647 100755 --- a/tests/runtest +++ b/tests/runtest @@ -1,5 +1,4 @@ #!/bin/sh -unset GPG_AGENT_INFO [ -x "$1" ] && exec $1 $2 exec ./asschk --no-echo -DGPGSM=${GPGSM} <"$1" diff --git a/tests/samplekeys/README b/tests/samplekeys/README new file mode 100644 index 000000000..0e8877907 --- /dev/null +++ b/tests/samplekeys/README @@ -0,0 +1,17 @@ +This is a collection of keys we use with the regression tests. + +opensc-tests.p12 PKCS#12 key and certificates taken from OpenSC. + Passphrase is "password" + +ov-user.p12 Private tests keys from www.openvalidation.org. +ov-server.p12 Passphrase for both is "start" + +ossl-rentec-user.pem An OpenSSL generated user certificate using a + bunch of attributes and DC RDNs. + +webderoot.der trust.web.de Root CA certificate [2004-02-17] +webdeca.der trust.web.de CA certificate [2004-02-17] + + + + diff --git a/tests/samplekeys/cryptlib-key.p12 b/tests/samplekeys/cryptlib-key.p12 new file mode 100644 index 000000000..5c23e95a7 Binary files /dev/null and b/tests/samplekeys/cryptlib-key.p12 differ diff --git a/tests/samplekeys/opensc-test.p12 b/tests/samplekeys/opensc-test.p12 new file mode 100644 index 000000000..990b1279a Binary files /dev/null and b/tests/samplekeys/opensc-test.p12 differ diff --git a/tests/samplekeys/ossl-rentec-user.pem b/tests/samplekeys/ossl-rentec-user.pem new file mode 100644 index 000000000..290b0ef0d --- /dev/null +++ b/tests/samplekeys/ossl-rentec-user.pem @@ -0,0 +1,44 @@ +-----BEGIN CERTIFICATE----- +MIIHnTCCBYWgAwIBAgIBATANBgkqhkiG9w0BAQQFADBGMRMwEQYKCZImiZPyLGQB +GRYDY29tMRYwFAYKCZImiZPyLGQBGRYGcmVudGVjMRcwFQYDVQQDDA5SZW5haXNz +YW5jZSBDQTAeFw0wNDAxMTAwNDE1NDZaFw0wNjAxMDkwNDE1NDZaMFcxEzARBgoJ +kiaJk/IsZAEZFgNjb20xFjAUBgoJkiaJk/IsZAEZFgZyZW50ZWMxDzANBgNVBAsM +BlBlb3BsZTEXMBUGA1UEAwwOS2Fyc3RlbiBLw7xubmUwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDBoZHGO+Ikq/Uhb9a4nUBuKayowUVga0wPQCiWhoLV +u2tDVWf7U9uzFrz/6JMIIBT3MIe5hBgQrYWq80/na3WO+H7vd4nR3gUfPBrfDPCm +HPm9nRMV1BsnFeg+2O0N+mfci2e/PLu7Ph9Arrr4+C0IVKQWxdNiqYj/gA0mSYvw +aThuBe8px3PZPAosZ9oGuhKmT+J9JtGe3qcyGPoW6yPEVpAUff0EFBGFI+wvaRV/ +vlK2omekQ2GkirzMqywTYiBPMuQ0abIjWZJn6ThR4FspIFLDAFnppwbZHMozrBYm +vS7pkoTK+DGVzk6kdbRxugWr61q0CQfL8b6VdfB6SGqxAgMBAAGjggODMIIDfzAJ +BgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQEAwIFoDAOBgNVHQ8BAf8EBAMCBeAwHQYD +VR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMEMFAGCWCGSAGG+EIBDQRDFkFPcGVu +U1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZSwgaXNzdWVkIGJ5IFJlbmFpc3NhbmNl +IFRlY2huLiBDb3JwLjAdBgNVHQ4EFgQUh6HtcbLmbeEAQSpU73jYI7Ap0HUwbgYD +VR0jBGcwZYAUXqKKaiAqs5Gz38Yq0UGucAGbLd+hSqRIMEYxEzARBgoJkiaJk/Is +ZAEZFgNjb20xFjAUBgoJkiaJk/IsZAEZFgZyZW50ZWMxFzAVBgNVBAMMDlJlbmFp +c3NhbmNlIENBggEAMDgGA1UdEgQxMC+BDWNhQHJlbnRlYy5jb22GHmh0dHBzOi8v +d3d3LnJlbnRlYy5jb206ODQ0NC9jYTA9BgNVHR8ENjA0MDKgMKAuhixodHRwczov +L3d3dy5yZW50ZWMuY29tOjg0NDQvY2EvcmVudGVjX2NhLmNybDA6BggrBgEFBQcB +AQQuMCwwKgYIKwYBBQUHMAGGHmh0dHA6Ly9jb3VnYXIucmVudGVjLmNvbTo4MDgy +LzAuBglghkgBhvhCAQIEIRYfaHR0cHM6Ly93d3cucmVudGVjLmNvbTo4NDQ0L2Nh +LzAcBglghkgBhvhCAQgEDxYNY2Fwb2xpY3kuaHRtbDAlBglghkgBhvhCAQMEGBYW +Y2dpLWJpbi9jaGVjay1yZXYuY2dpPzCCAQUGA1UdIASB/TCB+jCB9wYKKwYBBAHD +SAMBATCB6DA4BggrBgEFBQcCARYsaHR0cHM6Ly93d3cucmVudGVjLmNvbTo4NDQ0 +L2NhL2NhcG9saWN5Lmh0bWwwgasGCCsGAQUFBwICMIGeGoGbT3BlblNTTCBHZW5l +cmF0ZWQgQ2VydGlmaWNhdGUsIGlzc3VlZCBieSBSZW5haXNzYW5jZSBUZWNobi4g +Q29ycC4sIFRoaXMgY2VydGlmaWNhdGUgaXMgdmFsaWQgb25seSBmb3IgU1NMIENs +aWVudCBBdXRoZW50aWNhdGlvbiBhbmQgU2VjdXJlIEUtTWFpbCAoUy9NSU1FKS4w +HAYDVR0RBBUwE4ERa3Vlbm5lQHJlbnRlYy5jb20wDQYJKoZIhvcNAQEEBQADggIB +AGgYIKrR5nQKICNuXl1OwWFwk+CgnbDrVIrIoFiwRlSqaNsedXMXIDYHdyE/LYwR +VaiHFimV5WywIPeoBKiws67ZcWVfGGvxF2CZuCcnuQpAyKn+J0PDAaTi3z/uoi4n +YPUVMpfU/7TPXVo4pjFfUmm9XJ6dduC6SlAN+1/xDRR1dy2WqNLcN1dpyoUTtEWp +Xvp7I66oLfWahKs0d4fOXIrZmyLqKN3H8CLrZPz8b4Skw+wWxEUIqJEkRKez5adK +Ry1VK21nIwUUWHfLvrqw4CgZvpMQVEZRhsiOPqlHEH+epDV4hD5/OCG5oK+8RoKA +Yw1xjs3gOCCf6GDVrftBBLsYQufL7E4BOD4RKDYQCo6HD7cHXfy+RttdIcKzlq4u +6QbzFgIkc3KF0/U5FpvKxQHyfQwoD8AORWF6myjGtM13ij8yXg4Mx1sgKOY9IK1/ +muLauYAamNdCSkD5+0ecmYJ98G7022zUTBE8LR6FFHAG+3F8mzP+oI2eOwJYzMFW +Zw3MNUCarArIyxts/+izpOEIfkf0ztx1TckCTGd/F7WAkQcDHZHsf8Vb+eaLTltk +rEM6mnpov+YCO8qb/vmr2018fNS5haTJvECjLbYRy6RV2v6wRPNbYRHN3og87h/8 +2HUYfYCVebbJdzSwkQGApPty9mx2wr3EwB7KTT+IjXkp +-----END CERTIFICATE----- + diff --git a/tests/samplekeys/ov-server.p12 b/tests/samplekeys/ov-server.p12 new file mode 100644 index 000000000..52f2d558d Binary files /dev/null and b/tests/samplekeys/ov-server.p12 differ diff --git a/tests/samplekeys/ov-user.p12 b/tests/samplekeys/ov-user.p12 new file mode 100644 index 000000000..bb53a3d1a Binary files /dev/null and b/tests/samplekeys/ov-user.p12 differ diff --git a/tests/samplekeys/webdeca.der b/tests/samplekeys/webdeca.der new file mode 100644 index 000000000..9532e3fa5 Binary files /dev/null and b/tests/samplekeys/webdeca.der differ diff --git a/tests/samplekeys/webderoot.der b/tests/samplekeys/webderoot.der new file mode 100644 index 000000000..3fedd9cd0 Binary files /dev/null and b/tests/samplekeys/webderoot.der differ diff --git a/tests/samplemsgs/webde-buenemann-signed.cms b/tests/samplemsgs/webde-buenemann-signed.cms new file mode 100644 index 000000000..9ed2dc1c4 Binary files /dev/null and b/tests/samplemsgs/webde-buenemann-signed.cms differ diff --git a/tools/ChangeLog b/tools/ChangeLog index 00455c619..25ffae5d2 100644 --- a/tools/ChangeLog +++ b/tools/ChangeLog @@ -1,219 +1,479 @@ -2006-04-20 David Shaw <dshaw@jabberwocky.com> +2006-06-09 Marcus Brinkmann <marcus@g10code.de> - * make-dns-cert.c (main): Small exit code tweak from Peter - Palfrader. + * Makefile.am (gpgconf_LDADD): Add $(GPG_ERROR_LIBS). + (gpgkey2ssh_LDADD): Add ../jnlib/libjnlib.a. -2006-04-05 David Shaw <dshaw@jabberwocky.com> +2006-05-23 Werner Koch <wk@g10code.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. + * gpgparsemail.c: Include config.h if available + (stpcpy): Conditional include it. -2006-04-04 David Shaw <dshaw@jabberwocky.com> + * gpgconf-comp.c (hextobyte): Removed as it is now availble in + jnlib. - * make-dns-cert.c: New program to generate properly formatted CERT - records so people don't have to do it manually. +2005-12-20 Werner Koch <wk@g10code.com> -2006-02-14 Werner Koch <wk@gnupg.org> + * gpgconf-comp.c (gc_options_gpg): Add allow-pka-lookup. - * mk-tdata.c (main): Implement option --char. +2005-12-14 Werner Koch <wk@g10code.com> -2005-08-05 David Shaw <dshaw@jabberwocky.com> + * Makefile.am (bin_PROGRAMS): Build gpgparsemail. - * gpg-zip.in: Add --decrypt functionality. Fix quoting so - filenames with spaces work properly. + * gpgparsemail.c (pkcs7_begin): New. + (parse_message, message_cb): Add support of direct pkcs signatures. -2005-08-04 David Shaw <dshaw@jabberwocky.com> +2005-10-19 Werner Koch <wk@g10code.com> - * gpg-zip.in: New. Script wrapper to work with encrypted tar - files, a la PGP Zip. + * gpgconf-comp.c (gc_options_scdaemon): New option --disable-keypad. - * Makefile.am: Use it if we have a USTAR compatible tar. +2005-09-22 Werner Koch <wk@g10code.com> -2004-12-18 David Shaw <dshaw@jabberwocky.com> + * rfc822parse.c (parse_field): Tread Content-Disposition special. - * Makefile.am: Link with readline where needed. +2005-10-08 Marcus Brinkmann <marcus@g10code.de> -2004-10-28 Werner Koch <wk@g10code.com> + * Makefile.am (watchgnupg_LDADD): New variable. - * Makefile.am (other_libs): New. Also include LIBICONV. Noted by - Tim Mooney. + * Makefile.am (gpgconf_LDADD): Add ../gl/libgnu.a after + ../common/libcommon.a. + (symcryptrun_LDADD, gpg_connect_agent_LDADD, gpgkey2ssh_LDADD): + Likewise. + +2005-09-29 Marcus Brinkmann <marcus@g10code.de> + + * Makefile.am (AM_CFLAGS): Add $(LIBGCRYPT_CFLAGS). + +2005-09-06 Werner Koch <wk@g10code.com> + + * rfc822parse.c, rfc822parse.h: Changed license to LGPL. + +2005-08-01 Werner Koch <wk@g10code.com> + + * gpgsm-gencert.sh: Allow entering a keygrip to generate a CSR from + an existing key. + +2005-07-21 Werner Koch <wk@g10code.com> + + * gpgsm-gencert.sh: Reworked to allow for multiple email addresses + as well as DNsanmes and URi. Present the parameter file before + creating the certificate. + +2005-07-04 Marcus Brinkmann <marcus@g10code.de> + + * symcryptrun.c (SYMC_BAD_PASSPHRASE, SYMC_CANCELED): New symbols, + use instead constants. + (hash_string): New function copied from simple-gettext.c. + (confucius_get_pass): Take new argument CACHEID. + (confucius_process): Calculate cacheid and pass it to + confucius_get_pass. Clear passphrase from cache if necessary. + +2005-06-16 Werner Koch <wk@g10code.com> + + * gpg-connect-agent.c (read_and_print_response): Made LINELEN a + size_t. + +2005-06-04 Marcus Brinkmann <marcus@g10code.de> + + * symcryptrun.c (main): Allow any number of arguments, don't use + first argument as input file name. Pass extra arguments to + confucius_main. + (confucius_main): Accept new arguments argc and argv and pass them + to confucius_process. + (confucius_process): Accept new arguments argc and argv and pass + them to the confucius process. + +2005-06-01 Werner Koch <wk@g10code.com> + + * symcryptrun.c: Include mkdtemp.h. + +2005-05-31 Werner Koch <wk@g10code.com> + + * watchgnupg.c: Make sure that PF_LCOAL and AF_LOCAL are defines. + Noted by Ray Link. + +2005-05-28 Moritz Schulte <moritz@g10code.com> + + * gpgkey2ssh.c: New file. + * Makefile.am (bin_PROGRAMS): Added gpgkey2ssh. + +2005-05-20 Werner Koch <wk@g10code.com> + + * gpg-connect-agent.c (add_definq, show_definq, clear_definq) + (handle_inquire): New. + (read_and_print_response): Handle INQUIRE command. + (main): Implement control commands. + +2005-04-21 Werner Koch <wk@g10code.com> + + * symcryptrun.c (main): Optionally allow the input file as command + line argument. + + * gpgconf-comp.c: Add gpgsm option disable-trusted-cert-crl-check. + +2005-04-20 Werner Koch <wk@g10code.com> + + * gpgconf-comp.c: Add gpg-agent:disable-scdaemon. + +2005-04-19 Marcus Brinkmann <marcus@g10code.de> + + * symcryptrun.c: Add --input option. + +2005-04-15 Marcus Brinkmann <marcus@g10code.de> + + * symcryptrun.c (TEMP_FAILURE_RETRY): Define if not defined. + + * symcryptrun.c (remove_file): New function. + (confucius_copy_file): Accept new argument PLAIN and shred the + file if it is set on error. + + * Makefile.am: Define symcryptrun make variable depending on + BUILD_SYMCRYPTUN. + (bin_PROGRAMS): Add ${symcryptrun} instead symcryptrun. + (symcryptrun_LDADD): Use $(LIBUTIL_LIBS) instead of -lutil. + +2005-04-11 Werner Koch <wk@g10code.com> + + * symcryptrun.c (confucius_mktmpdir): Changed to use mkdtmp(3). + +2005-04-11 Marcus Brinkmann <marcus@g10code.de> + + * symcryptrun.c: Implement config file parsing. + + * Makefile.am (bin_PROGRAMS): Add symcryptrun. + (symcryptrun_SOURCES, symcryptrun_LDADD): New variables. + * symcryptrun.c: New file. + +2005-03-31 Werner Koch <wk@g10code.com> + + * gpg-connect-agent.c (start_agent): Use PATHSEP_C instead of ':'. + +2005-03-09 Werner Koch <wk@g10code.com> + + * gpgconf-comp.c <dirmngr>: Add honor-http-proxy. + +2005-02-25 Werner Koch <wk@g10code.com> + + * no-libgcrypt.c (gcry_strdup): New. + +2005-02-24 Werner Koch <wk@g10code.com> + + * gpg-connect-agent.c: New. + * Makefile.am: Add it. + +2004-12-21 Werner Koch <wk@g10code.com> + + * gpgconf-comp.c (get_config_pathname) [DOSISH]: Detect absolute + pathnames with a drive letter. + +2004-12-15 Werner Koch <wk@g10code.com> + + * Makefile.am (bin_PROGRAMS) [W32]: Do not build watchgnupg. + + * gpgconf-comp.c (gpg_agent_runtime_change) [W32]: No way yet to + send a signal. Disable. + (change_options_file, change_options_program) [W32]: No link(2), + so we disable it. + (gc_component_change_options): Use rename instead of link. + +2004-12-13 Werner Koch <wk@g10code.com> + + * gpgconf-comp.c <ignore-ocsp-service-url>: Fixed typo. + +2004-11-24 Werner Koch <wk@g10code.com> + + * gpgconf-comp.c <dirmngr>: Add --ignore-http-dp, --ignore-ldap-dp + and --ignore-ocsp-service-url. + +2004-11-23 Werner Koch <wk@g10code.com> + + * gpgconf-comp.c <dirmngr>: Add the proxy options. + <gpgsm>: Add --prefer-system-daemon. + +2004-11-11 Werner Koch <wk@g10code.com> + + * watchgnupg.c (main): Fixed test for read error. + +2004-10-22 Werner Koch <wk@g10code.com> + + * Makefile.am (bin_SCRIPTS): Add gpgsm-gencert.sh + + * gpgsm-gencert.sh: Fixed copyright; its part of GnuPG thus FSF. 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. + * gpgconf-comp.c: Made all strings for --log-file read the same. + +2004-10-01 Werner Koch <wk@g10code.com> -2004-09-13 David Shaw <dshaw@jabberwocky.com> + * gpgconf-comp.c (my_dgettext): Also switch codeset and directory + for the other used domains (i.e. dirmngr). - * pgpgroup-to-gpggroup: New perl script to take groups from PGP - command line and write out GnuPG 'group' config lines. + * gpgconf.c (main): Fixed translation markers. -2004-07-04 David Shaw <dshaw@jabberwocky.com> +2004-09-30 Werner Koch <wk@g10code.com> - * ring-a-party: ElGamal -> Elgamal + * gpgconf.c (i18n_init): Always use LC_ALL. -2004-01-11 David Shaw <dshaw@jabberwocky.com> + * Makefile.am: Adjusted for gettext 0.14. - * convert-from-106, lspgpot: Check for gpg binary before - proceeding. Don't hardcode the path to gpg. +2004-09-29 Werner Koch <wk@g10code.com> - * gpgsplit.c (handle_bzip2): Remove two cut and paste typecast - errors. Noted by Stefan Bellon. + * gpgconf-comp.c: Made the entries fro GROUPs translatable. + Include i18n.h. + (my_dgettext): Hack to use the gnupg2 domain. -2003-12-28 Stefan Bellon <sbellon@sbellon.de> +2004-08-09 Moritz Schulte <moritz@g10code.com> - * gpgsplit.c [__riscos__]: Removal of unnecessary #ifdef - __riscos__ sections. + * gpgsm-gencert.sh: New file. -2003-12-06 David Shaw <dshaw@jabberwocky.com> +2004-06-16 Werner Koch <wk@gnupg.org> - * gpgsplit.c (write_part): Split off decompression code. - (handle_zlib): Move it here. - (handle_bzip2): Add this to handle BZIP2 compressed messages. + * rfc822parse.c (rfc822parse_get_field): Add arg VALUEOFF. -2003-10-25 Werner Koch <wk@gnupg.org> +2004-06-14 Werner Koch <wk@gnupg.org> - * Makefile.am: Replaced INTLLIBS by LIBINTL. + * no-libgcrypt.c (gcry_realloc, gcry_xmalloc, gcry_xcalloc): New. -2003-08-24 David Shaw <dshaw@jabberwocky.com> + * gpgconf-comp.c (retrieve_options_from_program) + (retrieve_options_from_file, change_options_file) + (change_options_program, gc_component_change_options): Replaced + getline by read_line and test for allocation failure. - * Makefile.am: Use NETLIBS instead of EGDLIBS. +2004-05-21 Marcus Brinkmann <marcus@g10code.de> -2003-07-10 David Shaw <dshaw@jabberwocky.com> + * gpgconf-comp.c (gc_options_dirmngr): Remove CRL group, put its + only option "max-replies" into LDAP group. + (gc_component): Change description of dirmngr to "Directory + Manager". - * Makefile.am: Use W32LIBS where appropriate. + * gpgconf-comp.c (gc_component_change_options): Move the + per-process backup file into a standard location. -2003-05-30 David Shaw <dshaw@jabberwocky.com> +2004-05-03 Werner Koch <wk@gnupg.org> - * Makefile.am: Some cleanup, and use DLLIBS for -ldl. + * gpgconf-comp.c: Add --allow-mark-trusted for the gpg-agent. -2003-05-24 David Shaw <dshaw@jabberwocky.com> +2004-04-30 Werner Koch <wk@gnupg.org> - * 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. + * gpgconf-comp.c: Added more runtime flags for the gpg-agent + backend. -2003-03-11 David Shaw <dshaw@jabberwocky.com> +2004-04-29 Marcus Brinkmann <marcus@g10code.de> - * Makefile.am: Use @CAPLIBS@ to link in -lcap if we are using - capabilities. + * gpgconf-comp.c (change_options_program): Turn on utf8-strings in + the gpgconf specific part of the config file for the GnuPG + backend. -2003-02-22 David Shaw <dshaw@jabberwocky.com> +2004-04-28 Werner Koch <wk@gnupg.org> - * Makefile.am: Distribute convert-from-106. + * gpgconf-comp.c: Add --ocsp-signer for the dirmngr backend. - * 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. +2004-04-20 Marcus Brinkmann <marcus@g10code.de> -2002-10-31 Stefan Bellon <sbellon@sbellon.de> + * gpgconf-comp.c (gc_options_gpg_agent): Change type of + ignore-cache-for-signing option to GC_ARG_TYPE_NONE. - * gpgsplit.c (write_part) [__riscos__]: Use riscos_load_module() - to load ZLib module. +2004-04-07 Werner Koch <wk@gnupg.org> -2002-10-23 Werner Koch <wk@gnupg.org> + * gpgconf-comp.c (my_dgettext): Switch the codeset once to utf-8. + Allow building with out NLS. - * gpgsplit.c: New options --secret-to-public and --no-split. - GNUified the indentation style. +2004-03-23 Marcus Brinkmann <marcus@g10code.de> -2002-09-25 David Shaw <dshaw@jabberwocky.com> + * gpgconf-comp.c (gc_options_dirmngr): Set GC_OPT_FLAG_ARG_OPT for + "LDAP Server". + (change_options_file): Remove assertion that tests that this flag + is not present. Handle an empty string in OPTION->new_value. - * Makefile.am: Link bftest with EGDLIBS (i.e. NETLIBS) as EGD uses - sockets. + * gpgconf.c (main): Remove obsolete warning. -2002-05-07 Stefan Bellon <sbellon@sbellon.de> +2004-03-23 Werner Koch <wk@gnupg.org> - * gpgsplit.c (create_filename): Use EXTSEP_S instead of ".". + * gpgconf-comp.c (gc_options_gpg): New. + (gc_component_t, gc_component): Add GC_BACKEND_GPG. + (gc_options_dirmngr): Add allow-ocsp. -2002-04-23 David Shaw <dshaw@jabberwocky.com> +2004-03-23 Marcus Brinkmann <marcus@g10code.de> - * Makefile.am: Do not list libraries in -lxxx format in a - dependency line. + * gpgconf-comp.c (gc_flag): Add missing flags. -2002-01-02 Stefan Bellon <sbellon@sbellon.de> + * gpgconf-comp.c: Include <signal.h>. + (gc_backend): Add new member runtime_change. + (gpg_agent_runtime_change): New function. + (gc_component_change_options): New variable runtime. Initialize + it. If an option is changed that has the GC_OPT_FLAG_RUNTIME bit + set, also set the corresponding runtime variable. Finally, call + the runtime_change callback of the backend if needed. - * gpgsplit.c [__riscos__]: Added RISC OS specific file name - code. +2004-03-16 Werner Koch <wk@gnupg.org> - * gpgsplit.c (write_part): Introduced two explicit casts. + * gpgconf-comp.c (gc_options_gpg_agent): Implemented. + (gc_options_gpgsm, gc_options_scdaemon): Implemented. + (gc_backend_t): Add GC_BACKEND_SCDAEMON. -2001-12-21 David Shaw <dshaw@jabberwocky.com> +2004-03-12 Marcus Brinkmann <marcus@g10code.de> - * gpgsplit.c (pkttype_to_string): PKT_PHOTO_ID -> PKT_ATTRIBUTE + * gpgconf-comp.c (gc_component_change_options): Set the filenames + of the option's backend, not of the component. + Also use GC_BACKEND_NR, not GC_COMPONENT_NR. -2001-10-23 Werner Koch <wk@gnupg.org> +2004-03-09 Werner Koch <wk@gnupg.org> - * Makefile.am (gpgsplit_LDADD): Add ZLIBS. + * gpgconf-comp.c [_riscos_]: Removed special code for RISC OS; we + don't want to clutter our code with system dependent stuff. -2001-09-18 Werner Koch <wk@gnupg.org> +2004-03-08 Marcus Brinkmann <marcus@g10code.de> - * gpgsplit.c: New option --uncompress. - (write_part): Handle old style uncompressing. + * gpgconf-comp.c (retrieve_options_from_file): Quote each string + in the list, not only the first. -2001-06-20 Werner Koch <wk@gnupg.org> +2004-02-26 Marcus Brinkmann <marcus@g10code.de> - * gpgsplit.c: New. - * Makefile.am (bin_PROGRAMS): Install gpgsplit. + * gpgconf-comp.c (gc_component_list_options): Do not print empty + groups. -2001-03-27 Werner Koch <wk@gnupg.org> + * gpgconf-comp.c (option_check_validity): Check if option is + active. + (change_options_file): Implement. - * mail-signed-keys: Add option --dry-run. + * gpgconf-comp.c (retrieve_options_from_program): Remove broken + string handling. -2001-03-21 Werner Koch <wk@gnupg.org> + * gpgconf-comp.c (change_options_program): Support all types of + options, including list types. - * shmtest.c: Add sys/types.h + * README.gpgconf: Fix description of arguments. + * gpgconf-comp.c (option_check_validity): Rewritten to properly + support optional arguments in lists. -Fri Sep 15 18:40:36 CEST 2000 Werner Koch <wk@openit.de> + * README.gpgconf: Add info about optional arg and arg type 0. + * gpgconf-comp.c (gc_component_change_options): Parse list of + arg type 0 options. + (option_check_validity): Add new argument NEW_VALUE_NR. Perform + rigorous validity checks. + (change_options_program): Disable an option also if we have a new + value for it. - * ring-a-party: An array start at offset 1 no 0. Many thanks to Mike - for finding this bug. +2004-02-25 Marcus Brinkmann <marcus@g10code.de> -Thu Sep 14 14:20:38 CEST 2000 Werner Koch <wk@openit.de> + * gpgconf-comp.c (gc_component_list_options): Correct output for + lists of arg type none. + (struct gc_option): Add new member new_flags. + (option_check_validity): Check OPTION->new_flags beside + OPTION->new_value. Add new argument FLAGS. + (gc_component_change_options): Support default flag correctly. + (change_options_program): Likewise. - * ring-a-party: Flush the last key. +2004-02-24 Marcus Brinkmann <marcus@g10code.de> -Wed Jul 5 13:28:45 CEST 2000 Werner Koch <wk@> + * README.gpgconf: Revert last change. Add new flags "default", + "default desc" and "no arg desc". Add new field ARGDEF. Add new + field FLAG to backend interface. + * gpgconf-comp.c (struct gc_option): Make flags of type unsigned + long. + (gc_component_list_options): Adjust type for flags. + Add default argument field. + (retrieve_options_from_program): Use "1" as value for non-option + arguments, not "Y". + (gc_component_change_options): Read in flags from input. - * mail-signed-keys: New. +2004-02-23 Marcus Brinkmann <marcus@g10code.de> -Tue May 23 09:19:00 CEST 2000 Werner Koch <wk@openit.de> + * README.gpgconf: Change meaning of type 0 options value if it is + the empty string or "0". - * ring-a-party: New. + * gpgconf.h (struct): Add member runtime. + * gpgconf.c: Add new option oRuntime. + (main): Same here. -Thu Jul 8 16:21:27 CEST 1999 Werner Koch <wk@isil.d.shuttle.de> + * gpgconf-comp.c (hextobyte): New function. + (percent_deescape): New function. + (get_config_pathname): Percent deescape pathname if taken from + option (default) value. Use default value only if it exists and + is not empty. Use empty string otherwise. Don't include leading + quote in pathname. + (change_options_program): Percent deescape string before writing + it out. + + * gpgconf-comp.c (gc_component_list_options): Do not skip groups + on output. - * lspgpot: New +2004-02-18 Werner Koch <wk@gnupg.org> -Wed Jul 7 13:08:40 CEST 1999 Werner Koch <wk@isil.d.shuttle.de> + * gpgconf-comp.c: Added empty components for gpgsm and scdaemon. - * Makefile.am: Support for libtool. +2004-02-12 Werner Koch <wk@gnupg.org> -Tue Jun 8 13:36:25 CEST 1999 Werner Koch <wk@isil.d.shuttle.de> + * watchgnupg.c (main): Implement option "--". + (print_version): New. - * mpicalc.c (main): hex digits may now be lowercase - (do_mulm): new. + * Makefile.am: Include cmacros.am for common flags. -Thu Dec 10 20:15:36 CET 1998 Werner Koch <wk@isil.d.shuttle.de> +2004-02-03 Werner Koch <wk@gnupg.org> - * mpicalc.c (main): Moved initialization out of definition. + * addgnupghome: Try to use getent, so that it also works for NIS + setups. -Mon May 18 15:39:22 1998 Werner Koch (wk@isil.d.shuttle.de) +2004-01-31 Marcus Brinkmann <marcus@g10code.de> - * mk-tdata.c: New. + * gpgconf-comp.c: Some bug fixes, parse only defaults from the + program, and read the current values from the configuration file + directly. -Tue Apr 7 19:50:41 1998 Werner Koch (wk@isil.d.shuttle.de) +2004-01-30 Marcus Brinkmann <marcus@g10code.de> - * bftest.c: Now supports all availabe ciphers. + * gpgconf-comp.c (gc_error): New function, use it instead of + error() throughout. + * gpgconf-comp.c: Use xmalloc, libcommon's asctimestamp and + gnupg_get_time, fix error() invocation and use getline() + consistently. + +2004-01-30 Werner Koch <wk@gnupg.org> + * addgnupghome: Also set the group of copied files. - Copyright 1998, 1999, 2000, 2001 Free Software Foundation, Inc. +2004-01-30 Werner Koch <wk@gnupg.org> + + * Makefile.am (sbin_SCRIPTS): New, to install addgnupghome. + (EXTRA_DIST): Added rfc822parse.c rfc822parse.h gpgparsemail.c + which might be useful for debugging. + +2004-01-29 Werner Koch <wk@gnupg.org> + + * addgnupghome: New. + +2004-01-29 Marcus Brinkmann <marcus@g10code.de> + + * gpgconf-list.c: File removed. + * README.gpgconf: New file. + * gpgconf-comp.c: New file. + * Makefile.am (gpgconf_SOURCES): Remove gpgconf-list.c, add + gpgconf-comp.c. + +2004-01-16 Werner Koch <wk@gnupg.org> + + * watchgnupg.c (main): Need to use FD_ISSET for the client + descriptors too; aiiih. Set the listening socket to non-blocking. + +2004-01-10 Werner Koch <wk@gnupg.org> + + * Makefile.am: Use GPG_ERROR_CFLAGS + +2004-01-05 Werner Koch <wk@gnupg.org> + + * Manifest: New. + * gpgconf.c, gpgconf.h, gpgconf-list.c: New. A skeleton for now. + * no-libgcrypt.c: New. + * Makefile.am: Add above. + +2003-12-23 Werner Koch <wk@gnupg.org> + + * Makefile.am: New. + * watchgnupg.c: New. + + + Copyright 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 @@ -222,5 +482,3 @@ Tue Apr 7 19:50:41 1998 Werner Koch (wk@isil.d.shuttle.de) 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 index 5efe2c1a6..6b4767a79 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -1,8 +1,8 @@ -# Copyright (C) 1998, 1999, 2000, 2001, 2003, -# 2004 Free Software Foundation, Inc. -# +# Makefile.am - Tools directory +# 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 @@ -15,25 +15,59 @@ # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, +# USA. -## Process this file with automake to produce Makefile.in +EXTRA_DIST = Manifest watchgnupg.c \ + addgnupghome gpgsm-gencert.sh -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) +AM_CPPFLAGS = -I$(top_srcdir)/gl -I$(top_srcdir)/intl -I$(top_srcdir)/common +include $(top_srcdir)/am/cmacros.am -bin_PROGRAMS = gpgsplit -noinst_PROGRAMS = mpicalc bftest clean-sat mk-tdata shmtest make-dns-cert +AM_CFLAGS = $(LIBGCRYPT_CFLAGS) $(GPG_ERROR_CFLAGS) $(LIBASSUAN_CFLAGS) -if HAVE_USTAR -bin_SCRIPTS = gpg-zip +sbin_SCRIPTS = addgnupghome + +bin_SCRIPTS = gpgsm-gencert.sh + +if BUILD_SYMCRYPTRUN + symcryptrun = symcryptrun +else + symcryptrun = 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@ +bin_PROGRAMS = gpgconf gpg-connect-agent gpgkey2ssh ${symcryptrun} gpgparsemail +if !HAVE_W32_SYSTEM +bin_PROGRAMS += watchgnupg +endif -gpgsplit mpicalc bftest shmtest: $(needed_libs) +gpgconf_SOURCES = gpgconf.c gpgconf.h gpgconf-comp.c no-libgcrypt.c + +# jnlib/common sucks in gpg-error, will they, nil they (some compilers +# do not eliminate the supposed-to-be-unused-inline-functions). +gpgconf_LDADD = ../jnlib/libjnlib.a ../common/libcommon.a \ + ../gl/libgnu.a @LIBINTL@ $(GPG_ERROR_LIBS) + +gpgparsemail_SOURCES = gpgparsemail.c rfc822parse.c rfc822parse.h +gpgparsemail_LDADD = + +symcryptrun_SOURCES = symcryptrun.c +symcryptrun_LDADD = $(LIBUTIL_LIBS) ../jnlib/libjnlib.a \ + ../common/libcommon.a ../gl/libgnu.a \ + ../common/libsimple-pwquery.a $(LIBGCRYPT_LIBS) \ + $(GPG_ERROR_LIBS) $(LIBINTL) + +watchgnupg_SOURCES = watchgnupg.c +watchgnupg_LDADD = $(NETLIBS) + +gpg_connect_agent_SOURCES = gpg-connect-agent.c no-libgcrypt.c +gpg_connect_agent_LDADD = ../jnlib/libjnlib.a \ + ../common/libcommon.a ../gl/libgnu.a \ + $(LIBASSUAN_LIBS) $(GPG_ERROR_LIBS) $(LIBINTL) + +gpgkey2ssh_SOURCES = gpgkey2ssh.c +gpgkey2ssh_CFLAGS = $(LIBGCRYPT_CFLAGS) $(GPG_ERROR_CFLAGS) +# common sucks in jnlib, via use of BUG() in an inline function, which +# some compilers do not eliminate. +gpgkey2ssh_LDADD = ../jnlib/libjnlib.a ../common/libcommon.a ../gl/libgnu.a \ + $(LIBGCRYPT_LIBS) $(GPG_ERROR_LIBS) diff --git a/tools/Manifest b/tools/Manifest new file mode 100644 index 000000000..96423352d --- /dev/null +++ b/tools/Manifest @@ -0,0 +1,6 @@ +Makefile.am +watchgnupg.c +gpgconf.c +gpgconf.h +gpgconf-list.c +$names$ diff --git a/tools/README.gpgconf b/tools/README.gpgconf new file mode 100644 index 000000000..084711441 --- /dev/null +++ b/tools/README.gpgconf @@ -0,0 +1,79 @@ +============ + GPG Conf +============ + +Main documentation for this tool can be found in doc/tools.texi. + +BACKENDS +======== + +Backends should support the following commands: + +Command --gpgconf-list +---------------------- + +List the location of the configuration file, and all default values of +all options. The location of the configuration file must be an +absolute pathname. + +The format of each line is: + +NAME:FLAGS:DEFAULT:ARGDEF + +NAME + +This field contains a name tag for the group or option. The name tag +is used to specify the group or option in all communication with +GPGConf. The name tag is to be used verbatim. It is not in any +escaped format. + +FLAGS + +The flags field contains an unsigned number. Its value is the +OR-wise combination of the following flag values: + + 16 default If this flag is set, a default value is available. + 32 default desc If this flag is set, a (runtime) default is available. + This and the "default" flag are mutually exclusive. + 64 no arg desc If this flag is set, and the "optional arg" flag + is set, then the option has a special meaning if no + argument is given. + +DEFAULT + +This field is defined only for options. Its format is that of an +option argument (see section Format Conventions for details). If the +default value is empty, then no default is known. Otherwise, the +value specifies the default value for this option. Note that this +field is also meaningful if the option itself does not take a real +argument. + +ARGDEF + +This field is defined only for options for which the "optional arg" +flag is set. If the "no arg desc" flag is not set, its format is that +of an option argument (see section Format Conventions for details). +If the default value is empty, then no default is known. Otherwise, +the value specifies the default value for this option. If the "no arg +desc" flag is set, the field is either empty or contains a description +of the effect of this option if no argument is given. Note that this +field is also meaningful if the option itself does not take a real +argument. + + +Example: +$ dirmngr --gpgconf-list +gpgconf-config-file:/mnt/marcus/.gnupg/dirmngr.conf +ldapservers-file:/mnt/marcus/.gnupg/dirmngr_ldapservers.conf +add-servers:0 +max-replies:10 + + +TODO +---- + +* Implement --dry-run and --quiet. + +* Extend the backend interface to include gettext domain and +description, if available, to avoid repeating this information in +gpgconf. diff --git a/tools/addgnupghome b/tools/addgnupghome new file mode 100755 index 000000000..fb032b674 --- /dev/null +++ b/tools/addgnupghome @@ -0,0 +1,122 @@ +#!/bin/sh +# Add a new .gnupg home directory for a list of users -*- sh -*- +# +# Copyright 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. + +PGM=addgnupghome +any_error=0 + + +error () { + echo "$PGM: $*" >&2 + any_error=1 +} + +info () { + echo "$PGM: $*" >&2 +} + +# Do it for one user +one_user () { + user="$1" + home=$(${cat_passwd} | awk -F: -v n="$user" '$1 == n {print $6}') + if [ -z "$home" ]; then + if ${cat_passwd} | awk -F: -v n="$user" '$1 == n {exit 1}'; then + error "no such user \`$user'" + else + error "no home directory for user \`$user'" + fi + return + fi + if [ ! -d "$home" ]; then + error "home directory \`$home' of user \`$user' does not exist" + return + fi + if [ -d "$home/.gnupg" ]; then + info "skipping user \`$user': \`.gnupg' already exists" + return + fi + info "creating home directory \`$home/.gnupg' for \`$user'" + if ! mkdir "$home/.gnupg" ; then + error "error creating \`$home/.gnupg'" + return + fi + + if ! chown $user "$home/.gnupg" ; then + error "error changing ownership of \`$home/.gnupg'" + return + fi + + group=$(id -g "$user") + [ -z "$group" ] && group="0" + + if [ "$group" -gt 0 ]; then + if ! chgrp $group "$home/.gnupg" ; then + error "error changing group of \`$home/.gnupg'" + return + fi + fi + + if ! cd "$home/.gnupg" ; then + error "error cd-ing to \`$home/.gnupg'" + return + fi + for f in $filelist; do + if [ -d /etc/skel/.gnupg/$f ]; then + mkdir $f + else + cp /etc/skel/.gnupg/$f $f + fi + if ! chown $user $f ; then + error "error changing ownership of \`$f'" + return + fi + if [ "$group" -gt 0 ]; then + if ! chgrp $group "$f" ; then + error "error changing group of \`$f'" + return + fi + fi + done + +} + +if [ -z "$1" ]; then + echo "usage: $PGM userids" + exit 1 +fi + +# Check whether we can use getent +if getent --help </dev/null >/dev/null 2>&1 ; then + cat_passwd='getent passwd' +else + cat_passwd='cat /etc/passwd' + info "please note that only users from /etc/passwd are checked" +fi + +if [ ! -d /etc/skel/.gnupg ]; then + error "skeleton directory \`/etc/skel/.gnupg' does not exist" + exit 1 +fi +cd "/etc/skel/.gnupg" || (error "error cd-ing to \`/etc/skel/.gnupg'"; exit 1) +filelist=$(find . \( -type f -or -type d \) -not -name '*~' -not -name . -print) + + +if ! umask 0077 ; then + error "error setting umask" + exit 1 +fi + +for name in $*; do + one_user $name +done + +exit $any_error diff --git a/tools/bftest.c b/tools/bftest.c deleted file mode 100644 index 829c429a0..000000000 --- a/tools/bftest.c +++ /dev/null @@ -1,108 +0,0 @@ -/* 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 deleted file mode 100644 index 8b6bfd77a..000000000 --- a/tools/clean-sat.c +++ /dev/null @@ -1,34 +0,0 @@ -/* 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 deleted file mode 100755 index 634152b11..000000000 --- a/tools/convert-from-106 +++ /dev/null @@ -1,57 +0,0 @@ -#!/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/crlf.c b/tools/crlf.c deleted file mode 100644 index ecb6eecdb..000000000 --- a/tools/crlf.c +++ /dev/null @@ -1,52 +0,0 @@ -/* crlf.c - * Copyright (C) 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, lc; - int off=0; - - if( argc > 1 ) { - fprintf(stderr, "no arguments, please\n"); - return 1; - } - - lc = -1; - while( (c=getchar()) != EOF ) { -#if 0 - if( c == '\r' && lc == ' ' ) - fprintf(stderr,"SP,CR at %d\n", off ); - if( c == '\n' && lc == ' ' ) - fprintf(stderr,"SP,LF at %d\n", off ); -#endif - if( c == '\n' && lc == '\r' ) - putchar(c); - else if( c == '\n' ) { - putchar('\r'); - putchar(c); - } - else if( c != '\n' && lc == '\r' ) { - putchar('\n'); - putchar(c); - } - else - putchar(c); - - lc = c; - off++; - } - - return 0; -} diff --git a/tools/der-to-pem b/tools/der-to-pem new file mode 100755 index 000000000..183996654 --- /dev/null +++ b/tools/der-to-pem @@ -0,0 +1,27 @@ +#!/bin/sh +# Convert A BER or DER encoding to PEM format. +# +# Copyright 20032 Free Software Foundation, Inc. +# +# This program 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. + +PGM="der-to-pem" +if [ $# == 0 ]; then + input="" +elif [ $# == 1 ]; then + input="$1" +else + echo "usage: $PGM [<inputfile>]" >&2 + exit 1 +fi + +echo "-----BEGIN CERTIFICATE-----" +mimencode $input +echo "-----END CERTIFICATE-----" + diff --git a/tools/gpg-connect-agent.c b/tools/gpg-connect-agent.c new file mode 100644 index 000000000..90e321000 --- /dev/null +++ b/tools/gpg-connect-agent.c @@ -0,0 +1,639 @@ +/* gpg-connect-agent.c - Tool to connect to the agent. + * 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> +#include <errno.h> +#include <ctype.h> +#include <assuan.h> + +#include "i18n.h" +#include "../common/util.h" +#include "../common/asshelp.h" + + + +/* Constants to identify the commands and options. */ +enum cmd_and_opt_values + { + aNull = 0, + oQuiet = 'q', + oVerbose = 'v', + oRawSocket = 'S', + + oNoVerbose = 500, + oHomedir, + oHex + + }; + + +/* The list of commands and options. */ +static ARGPARSE_OPTS opts[] = + { + { 301, NULL, 0, N_("@\nOptions:\n ") }, + + { oVerbose, "verbose", 0, N_("verbose") }, + { oQuiet, "quiet", 0, N_("quiet") }, + { oHex, "hex", 0, N_("print data out hex encoded") }, + { oRawSocket, "raw-socket", 2, N_("|NAME|connect to Assuan socket NAME")}, + + /* hidden options */ + { oNoVerbose, "no-verbose", 0, "@"}, + { oHomedir, "homedir", 2, "@" }, + {0} + }; + + +/* We keep all global options in the structure OPT. */ +struct +{ + int verbose; /* Verbosity level. */ + int quiet; /* Be extra quiet. */ + const char *homedir; /* Configuration directory name */ + int hex; /* Print data lines in hex format. */ + const char *raw_socket; /* Name of socket to connect in raw mode. */ +} opt; + + + +/* Definitions for /definq commands and a global linked list with all + the definitions. */ +struct definq_s +{ + struct definq_s *next; + char *name; /* Name of inquiry or NULL for any name. */ + int is_prog; /* True if this is a program to run. */ + char file[1]; /* Name of file or program. */ +}; +typedef struct definq_s *definq_t; + +static definq_t definq_list; +static definq_t *definq_list_tail = &definq_list; + + + +/*-- local prototypes --*/ +static int read_and_print_response (assuan_context_t ctx); +static assuan_context_t start_agent (void); + + + + +/* Print usage information and and provide strings for help. */ +static const char * +my_strusage( int level ) +{ + const char *p; + + switch (level) + { + case 11: p = "gpg-connect-agent (GnuPG)"; + break; + case 13: p = VERSION; break; + case 17: p = PRINTABLE_OS_NAME; break; + case 19: p = _("Please report bugs to <" PACKAGE_BUGREPORT ">.\n"); + break; + case 1: + case 40: p = _("Usage: gpg-connect-agent [options] (-h for help)"); + break; + case 41: + p = _("Syntax: gpg-connect-agent [options]\n" + "Connect to a running agent and send commands\n"); + break; + case 31: p = "\nHome: "; break; + case 32: p = opt.homedir; break; + case 33: p = "\n"; break; + + default: p = NULL; break; + } + return p; +} + + +/* Initialize the gettext system. */ +static void +i18n_init(void) +{ +#ifdef USE_SIMPLE_GETTEXT + set_gettext_file (PACKAGE_GT); +#else +# ifdef ENABLE_NLS + setlocale (LC_ALL, "" ); + bindtextdomain (PACKAGE_GT, LOCALEDIR); + textdomain (PACKAGE_GT); +# endif +#endif +} + +/* Store an inquire response pattern. Note, that this function may + change the content of LINE. We assume that leading white spaces + are already removed. */ +static void +add_definq (char *line, int is_prog) +{ + definq_t d; + char *name, *p; + + /* Get name. */ + name = line; + for (p=name; *p && !spacep (p); p++) + ; + if (*p) + *p++ = 0; + while (spacep (p)) + p++; + + d = xmalloc (sizeof *d + strlen (p) ); + strcpy (d->file, p); + d->is_prog = is_prog; + if ( !strcmp (name, "*")) + d->name = NULL; + else + d->name = xstrdup (name); + + d->next = NULL; + *definq_list_tail = d; + definq_list_tail = &d->next; +} + + +/* Show all inquiry defintions. */ +static void +show_definq (void) +{ + definq_t d; + + for (d=definq_list; d; d = d->next) + if (d->name) + printf ("%-20s %c %s\n", d->name, d->is_prog? 'p':'f', d->file); + for (d=definq_list; d; d = d->next) + if (!d->name) + printf ("%-20s %c %s\n", "*", d->is_prog? 'p':'f', d->file); +} + + +/* Clear all inquiry definitions. */ +static void +clear_definq (void) +{ + while (definq_list) + { + definq_t tmp = definq_list->next; + xfree (definq_list->name); + xfree (definq_list); + definq_list = tmp; + } + definq_list_tail = &definq_list; +} + + + +/* gpg-connect-agent's entry point. */ +int +main (int argc, char **argv) +{ + ARGPARSE_ARGS pargs; + const char *fname; + int no_more_options = 0; + assuan_context_t ctx; + char *line, *p; + size_t linesize; + int rc; + + set_strusage (my_strusage); + log_set_prefix ("gpg-connect-agent", 1); + + i18n_init(); + + opt.homedir = default_homedir (); + + /* Parse the command line. */ + pargs.argc = &argc; + pargs.argv = &argv; + pargs.flags = 1; /* Do not remove the args. */ + while (!no_more_options && optfile_parse (NULL, NULL, NULL, &pargs, opts)) + { + switch (pargs.r_opt) + { + case oQuiet: opt.quiet = 1; break; + case oVerbose: opt.verbose++; break; + case oNoVerbose: opt.verbose = 0; break; + case oHomedir: opt.homedir = pargs.r.ret_str; break; + case oHex: opt.hex = 1; break; + case oRawSocket: opt.raw_socket = pargs.r.ret_str; break; + + default: pargs.err = 2; break; + } + } + + if (log_get_errorcount (0)) + exit (2); + + fname = argc ? *argv : NULL; + + if (opt.raw_socket) + { + rc = assuan_socket_connect (&ctx, opt.raw_socket, 0); + if (rc) + { + log_error ("can't connect to socket `%s': %s\n", + opt.raw_socket, assuan_strerror (rc)); + exit (1); + } + + if (opt.verbose) + log_info ("connection to socket `%s' established\n", opt.raw_socket); + } + else + ctx = start_agent (); + line = NULL; + linesize = 0; + for (;;) + { + int n; + size_t maxlength; + + maxlength = 2048; + n = read_line (stdin, &line, &linesize, &maxlength); + if (n < 0) + { + log_error (_("error reading input: %s\n"), strerror (errno)); + exit (1); + } + if (!n) + break; /* EOF */ + if (!maxlength) + { + log_error (_("line too long - skipped\n")); + continue; + } + if (memchr (line, 0, n)) + log_info (_("line shortened due to embedded Nul character\n")); + if (line[n-1] == '\n') + line[n-1] = 0; + if (*line == '/') + { + /* Handle control commands. */ + char *cmd = line+1; + + for (p=cmd; *p && !spacep (p); p++) + ; + if (*p) + *p++ = 0; + while (spacep (p)) + p++; + if (!strcmp (cmd, "definqfile")) + { + add_definq (p, 0); + } + else if (!strcmp (cmd, "definqprog")) + { + add_definq (p, 1); + } + else if (!strcmp (cmd, "showdef")) + { + show_definq (); + } + else if (!strcmp (cmd, "cleardef")) + { + clear_definq (); + } + else if (!strcmp (cmd, "echo")) + { + puts (p); + } + else if (!strcmp (cmd, "help")) + { + puts ("Available commands:\n" + "/echo ARGS Echo ARGS.\n" + "/definqfile NAME FILE\n" + " Use content of FILE for inquiries with NAME.\n" + " NAME may be \"*\" to match any inquiry.\n" + "/definqprog NAME PGM\n" + " Run PGM for inquiries matching NAME and pass the\n" + " entire line to it as arguments.\n" + "/showdef Print all definitions.\n" + "/cleardef Delete all definitions.\n" + "/help Print this help."); + } + else + log_error (_("unknown command `%s'\n"), cmd ); + + continue; + } + + rc = assuan_write_line (ctx, line); + if (rc) + { + log_info (_("sending line failed: %s\n"), assuan_strerror (rc) ); + continue; + } + if (*line == '#' || !*line) + continue; /* Don't expect a response for a coment line. */ + + rc = read_and_print_response (ctx); + if (rc) + log_info (_("receiving line failed: %s\n"), assuan_strerror (rc) ); + } + + if (opt.verbose) + log_info ("closing connection to agent\n"); + + return 0; +} + + +/* Handle an Inquire from the server. Return False if it could not be + handled; in this case the caller shll complete the operation. LINE + is the complete line as received from the server. This function + may change the content of LINE. */ +static int +handle_inquire (assuan_context_t ctx, char *line) +{ + const char *name; + definq_t d; + FILE *fp; + char buffer[1024]; + int rc, n; + + /* Skip the command and trailing spaces. */ + for (; *line && !spacep (line); line++) + ; + while (spacep (line)) + line++; + /* Get the name. */ + name = line; + for (; *line && !spacep (line); line++) + ; + if (*line) + *line++ = 0; + + /* Now match it against our list. he second loop is todetect the + match all entry. **/ + for (d=definq_list; d; d = d->next) + if (d->name && !strcmp (d->name, name)) + break; + if (!d) + for (d=definq_list; d; d = d->next) + if (!d->name) + break; + if (!d) + { + if (opt.verbose) + log_info ("no handler for inquiry `%s' found\n", name); + return 0; + } + + if (d->is_prog) + { + fp = popen (d->file, "r"); + if (!fp) + log_error ("error executing `%s': %s\n", d->file, strerror (errno)); + else if (opt.verbose) + log_error ("handling inquiry `%s' by running `%s'\n", name, d->file); + } + else + { + fp = fopen (d->file, "rb"); + if (!fp) + log_error ("error opening `%s': %s\n", d->file, strerror (errno)); + else if (opt.verbose) + log_error ("handling inquiry `%s' by returning content of `%s'\n", + name, d->file); + } + if (!fp) + return 0; + + while ( (n = fread (buffer, 1, sizeof buffer, fp)) ) + { + rc = assuan_send_data (ctx, buffer, n); + if (rc) + { + log_error ("sending data back failed: %s\n", assuan_strerror (rc) ); + break; + } + } + if (ferror (fp)) + log_error ("error reading from `%s': %s\n", d->file, strerror (errno)); + + rc = assuan_send_data (ctx, NULL, 0); + if (rc) + log_error ("sending data back failed: %s\n", assuan_strerror (rc) ); + + if (d->is_prog) + { + if (pclose (fp)) + log_error ("error running `%s': %s\n", d->file, strerror (errno)); + } + else + fclose (fp); + return 1; +} + + +/* Read all response lines from server and print them. Returns 0 on + success or an assuan error code. */ +static int +read_and_print_response (assuan_context_t ctx) +{ + char *line; + size_t linelen; + assuan_error_t rc; + int i, j; + + for (;;) + { + do + { + rc = assuan_read_line (ctx, &line, &linelen); + if (rc) + return rc; + } + while (*line == '#' || !linelen); + + if (linelen >= 1 + && line[0] == 'D' && line[1] == ' ') + { + if (opt.hex) + { + for (i=2; i < linelen; ) + { + int save_i = i; + + printf ("D[%04X] ", i-2); + for (j=0; j < 16 ; j++, i++) + { + if (j == 8) + putchar (' '); + if (i < linelen) + printf (" %02X", ((unsigned char*)line)[i]); + else + fputs (" ", stdout); + } + fputs (" ", stdout); + i= save_i; + for (j=0; j < 16; j++, i++) + { + unsigned int c = ((unsigned char*)line)[i]; + if ( i >= linelen ) + putchar (' '); + else if (isascii (c) && isprint (c) && !iscntrl (c)) + putchar (c); + else + putchar ('.'); + } + putchar ('\n'); + } + } + else + { + fwrite (line, linelen, 1, stdout); + putchar ('\n'); + } + } + else if (linelen >= 1 + && line[0] == 'S' + && (line[1] == '\0' || line[1] == ' ')) + { + fwrite (line, linelen, 1, stdout); + putchar ('\n'); + } + else if (linelen >= 2 + && line[0] == 'O' && line[1] == 'K' + && (line[2] == '\0' || line[2] == ' ')) + { + fwrite (line, linelen, 1, stdout); + putchar ('\n'); + return 0; + } + else if (linelen >= 3 + && line[0] == 'E' && line[1] == 'R' && line[2] == 'R' + && (line[3] == '\0' || line[3] == ' ')) + { + fwrite (line, linelen, 1, stdout); + putchar ('\n'); + return 0; + } + 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] == ' ')) + { + fwrite (line, linelen, 1, stdout); + putchar ('\n'); + if (!handle_inquire (ctx, line)) + assuan_write_line (ctx, "CANCEL"); + } + else if (linelen >= 3 + && line[0] == 'E' && line[1] == 'N' && line[2] == 'D' + && (line[3] == '\0' || line[3] == ' ')) + { + fwrite (line, linelen, 1, stdout); + putchar ('\n'); + /* Received from server, thus more responses are expected. */ + } + else + return ASSUAN_Invalid_Response; + } +} + + + + +/* Connect to the agent and send the standard options. */ +static assuan_context_t +start_agent (void) +{ + int rc = 0; + char *infostr, *p; + assuan_context_t ctx; + + infostr = getenv ("GPG_AGENT_INFO"); + if (!infostr || !*infostr) + { + char *sockname; + + /* Check whether we can connect at the standard socket. */ + sockname = make_filename (opt.homedir, "S.gpg-agent", NULL); + rc = assuan_socket_connect (&ctx, sockname, 0); + xfree (sockname); + } + else + { + int prot; + int pid; + + infostr = xstrdup (infostr); + if ( !(p = strchr (infostr, PATHSEP_C)) || p == infostr) + { + log_error (_("malformed GPG_AGENT_INFO environment variable\n")); + xfree (infostr); + exit (1); + } + *p++ = 0; + pid = atoi (p); + while (*p && *p != PATHSEP_C) + p++; + prot = *p? atoi (p+1) : 0; + if (prot != 1) + { + log_error (_("gpg-agent protocol version %d is not supported\n"), + prot); + xfree (infostr); + exit (1); + } + + rc = assuan_socket_connect (&ctx, infostr, pid); + xfree (infostr); + } + + if (rc) + { + log_error ("can't connect to the agent: %s\n", assuan_strerror (rc)); + exit (1); + } + + if (opt.verbose) + log_info ("connection to agent established\n"); + + rc = assuan_transact (ctx, "RESET", NULL, NULL, NULL, NULL, NULL, NULL); + if (rc) + { + log_error (_("error sending %s command: %s\n"), "RESET", + assuan_strerror (rc)); + exit (1); + } + + rc = send_pinentry_environment (ctx, GPG_ERR_SOURCE_DEFAULT, + NULL, NULL, NULL, NULL, NULL); + if (rc) + { + log_error (_("error sending standard options: %s\n"), gpg_strerror (rc)); + exit (1); + } + + return ctx; +} diff --git a/tools/gpg-zip.in b/tools/gpg-zip.in deleted file mode 100644 index 8b4ccfb2b..000000000 --- a/tools/gpg-zip.in +++ /dev/null @@ -1,142 +0,0 @@ -#!/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/gpgconf-comp.c b/tools/gpgconf-comp.c new file mode 100644 index 000000000..04a61a193 --- /dev/null +++ b/tools/gpgconf-comp.c @@ -0,0 +1,2499 @@ +/* gpgconf-comp.c - Configuration utility for GnuPG. + * 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 GnuPG; if not, write to the Free Software Foundation, + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + */ + +#if HAVE_CONFIG_H +#include <config.h> +#endif +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <fcntl.h> +#include <unistd.h> +#include <sys/types.h> +#include <assert.h> +#include <errno.h> +#include <time.h> +#include <stdarg.h> +#include <signal.h> + +/* For log_logv(), asctimestamp(), gnupg_get_time (). */ +#define JNLIB_NEED_LOG_LOGV +#include "util.h" +#include "i18n.h" + +#include "gpgconf.h" + + + +/* TODO: + Components: Add more components and their options. + Robustness: Do more validation. Call programs to do validation for us. + Don't use popen, as this will not tell us if the program had a + non-zero exit code. + Add options to change backend binary path. + Extract binary path for some backends from gpgsm/gpg config. +*/ + + +#if (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 5 )) +void gc_error (int status, int errnum, const char *fmt, ...) \ + __attribute__ ((format (printf, 3, 4))); +#endif + +/* Output a diagnostic message. If ERRNUM is not 0, then the output + is followed by a colon, a white space, and the error string for the + error number ERRNUM. In any case the output is finished by a + newline. The message is prepended by the program name, a colon, + and a whitespace. The output may be further formatted or + redirected by the jnlib logging facility. */ +void +gc_error (int status, int errnum, const char *fmt, ...) +{ + va_list arg_ptr; + + va_start (arg_ptr, fmt); + log_logv (JNLIB_LOG_ERROR, fmt, arg_ptr); + va_end (arg_ptr); + + if (errnum) + log_printf (": %s\n", strerror (errnum)); + else + log_printf ("\n"); + + if (status) + { + log_printf (NULL); + log_printf ("fatal error (exit status %i)\n", status); + exit (status); + } +} + + +/* Forward declaration. */ +void gpg_agent_runtime_change (void); + +/* Backend configuration. Backends are used to decide how the default + and current value of an option can be determined, and how the + option can be changed. To every option in every component belongs + exactly one backend that controls and determines the option. Some + backends are programs from the GPG system. Others might be + implemented by GPGConf itself. If you change this enum, don't + forget to update GC_BACKEND below. */ +typedef enum + { + /* Any backend, used for find_option (). */ + GC_BACKEND_ANY, + + /* The Gnu Privacy Guard. */ + GC_BACKEND_GPG, + + /* The Gnu Privacy Guard for S/MIME. */ + GC_BACKEND_GPGSM, + + /* The GPG Agent. */ + GC_BACKEND_GPG_AGENT, + + /* The GnuPG SCDaemon. */ + GC_BACKEND_SCDAEMON, + + /* The Aegypten directory manager. */ + GC_BACKEND_DIRMNGR, + + /* The LDAP server list file for the Aegypten director manager. */ + GC_BACKEND_DIRMNGR_LDAP_SERVER_LIST, + + /* The number of the above entries. */ + GC_BACKEND_NR + } gc_backend_t; + + +/* To be able to implement generic algorithms for the various + backends, we collect all information about them in this struct. */ +static struct +{ + /* The name of the backend. */ + const char *name; + + /* The name of the program that acts as the backend. Some backends + don't have an associated program, but are implemented directly by + GPGConf. In this case, PROGRAM is NULL. */ + char *program; + + /* The runtime change callback. */ + void (*runtime_change) (void); + + /* The option name for the configuration filename of this backend. + This must be an absolute pathname. It can be an option from a + different backend (but then ordering of the options might + matter). */ + const char *option_config_filename; + + /* If this is a file backend rather than a program backend, then + this is the name of the option associated with the file. */ + const char *option_name; +} gc_backend[GC_BACKEND_NR] = + { + { NULL }, /* GC_BACKEND_ANY dummy entry. */ + { "GnuPG", "gpg", NULL, "gpgconf-gpg.conf" }, + { "GPGSM", "gpgsm", NULL, "gpgconf-gpgsm.conf" }, + { "GPG Agent", "gpg-agent", gpg_agent_runtime_change, + "gpgconf-gpg-agent.conf" }, + { "SCDaemon", "scdaemon", NULL, "gpgconf-scdaemon.conf" }, + { "DirMngr", "dirmngr", NULL, "gpgconf-dirmngr.conf" }, + { "DirMngr LDAP Server List", NULL, NULL, "ldapserverlist-file", + "LDAP Server" }, + }; + + +/* Option configuration. */ + +/* An option might take an argument, or not. Argument types can be + basic or complex. Basic types are generic and easy to validate. + Complex types provide more specific information about the intended + use, but can be difficult to validate. If you add to this enum, + don't forget to update GC_ARG_TYPE below. YOU MUST NOT CHANGE THE + NUMBERS OF THE EXISTING ENTRIES, AS THEY ARE PART OF THE EXTERNAL + INTERFACE. */ +typedef enum + { + /* Basic argument types. */ + + /* No argument. */ + GC_ARG_TYPE_NONE = 0, + + /* A String argument. */ + GC_ARG_TYPE_STRING = 1, + + /* A signed integer argument. */ + GC_ARG_TYPE_INT32 = 2, + + /* An unsigned integer argument. */ + GC_ARG_TYPE_UINT32 = 3, + + /* ADD NEW BASIC TYPE ENTRIES HERE. */ + + /* Complex argument types. */ + + /* A complete pathname. */ + GC_ARG_TYPE_PATHNAME = 32, + + /* An LDAP server in the format + HOSTNAME:PORT:USERNAME:PASSWORD:BASE_DN. */ + GC_ARG_TYPE_LDAP_SERVER = 33, + + /* A 40 character fingerprint. */ + GC_ARG_TYPE_KEY_FPR = 34, + + /* ADD NEW COMPLEX TYPE ENTRIES HERE. */ + + /* The number of the above entries. */ + GC_ARG_TYPE_NR + } gc_arg_type_t; + + +/* For every argument, we record some information about it in the + following struct. */ +static struct +{ + /* For every argument type exists a basic argument type that can be + used as a fallback for input and validation purposes. */ + gc_arg_type_t fallback; + + /* Human-readable name of the type. */ + const char *name; +} gc_arg_type[GC_ARG_TYPE_NR] = + { + /* The basic argument types have their own types as fallback. */ + { GC_ARG_TYPE_NONE, "none" }, + { GC_ARG_TYPE_STRING, "string" }, + { GC_ARG_TYPE_INT32, "int32" }, + { GC_ARG_TYPE_UINT32, "uint32" }, + + /* Reserved basic type entries for future extension. */ + { GC_ARG_TYPE_NR, NULL }, { GC_ARG_TYPE_NR, NULL }, + { GC_ARG_TYPE_NR, NULL }, { GC_ARG_TYPE_NR, NULL }, + { GC_ARG_TYPE_NR, NULL }, { GC_ARG_TYPE_NR, NULL }, + { GC_ARG_TYPE_NR, NULL }, { GC_ARG_TYPE_NR, NULL }, + { GC_ARG_TYPE_NR, NULL }, { GC_ARG_TYPE_NR, NULL }, + { GC_ARG_TYPE_NR, NULL }, { GC_ARG_TYPE_NR, NULL }, + { GC_ARG_TYPE_NR, NULL }, { GC_ARG_TYPE_NR, NULL }, + { GC_ARG_TYPE_NR, NULL }, { GC_ARG_TYPE_NR, NULL }, + { GC_ARG_TYPE_NR, NULL }, { GC_ARG_TYPE_NR, NULL }, + { GC_ARG_TYPE_NR, NULL }, { GC_ARG_TYPE_NR, NULL }, + { GC_ARG_TYPE_NR, NULL }, { GC_ARG_TYPE_NR, NULL }, + { GC_ARG_TYPE_NR, NULL }, { GC_ARG_TYPE_NR, NULL }, + { GC_ARG_TYPE_NR, NULL }, { GC_ARG_TYPE_NR, NULL }, + { GC_ARG_TYPE_NR, NULL }, { GC_ARG_TYPE_NR, NULL }, + + /* The complex argument types have a basic type as fallback. */ + { GC_ARG_TYPE_STRING, "pathname" }, + { GC_ARG_TYPE_STRING, "ldap server" }, + { GC_ARG_TYPE_STRING, "key fpr" }, + }; + + +/* Every option has an associated expert level, than can be used to + hide advanced and expert options from beginners. If you add to + this list, don't forget to update GC_LEVEL below. YOU MUST NOT + CHANGE THE NUMBERS OF THE EXISTING ENTRIES, AS THEY ARE PART OF THE + EXTERNAL INTERFACE. */ +typedef enum + { + /* The basic options should always be displayed. */ + GC_LEVEL_BASIC, + + /* The advanced options may be hidden from beginners. */ + GC_LEVEL_ADVANCED, + + /* The expert options should only be displayed to experts. */ + GC_LEVEL_EXPERT, + + /* The invisible options should normally never be displayed. */ + GC_LEVEL_INVISIBLE, + + /* The internal options are never exported, they mark options that + are recorded for internal use only. */ + GC_LEVEL_INTERNAL, + + /* ADD NEW ENTRIES HERE. */ + + /* The number of the above entries. */ + GC_LEVEL_NR + } gc_expert_level_t; + +/* A description for each expert level. */ +static struct +{ + const char *name; +} gc_level[] = + { + { "basic" }, + { "advanced" }, + { "expert" }, + { "invisible" }, + { "internal" } + }; + + +/* Option flags. YOU MUST NOT CHANGE THE NUMBERS OF THE EXISTING + FLAGS, AS THEY ARE PART OF THE EXTERNAL INTERFACE. */ +#define GC_OPT_FLAG_NONE 0UL +/* Some entries in the option list are not options, but mark the + beginning of a new group of options. These entries have the GROUP + flag set. */ +#define GC_OPT_FLAG_GROUP (1UL << 0) +/* The ARG_OPT flag for an option indicates that the argument is + optional. This is never set for GC_ARG_TYPE_NONE options. */ +#define GC_OPT_FLAG_ARG_OPT (1UL << 1) +/* The LIST flag for an option indicates that the option can occur + several times. A comma separated list of arguments is used as the + argument value. */ +#define GC_OPT_FLAG_LIST (1UL << 2) +/* The RUNTIME flag for an option indicates that the option can be + changed at runtime. */ +#define GC_OPT_FLAG_RUNTIME (1UL << 3) + +/* The following flags are incorporated from the backend. */ +/* The DEFAULT flag for an option indicates that the option has a + default value. */ +#define GC_OPT_FLAG_DEFAULT (1UL << 4) +/* The DEF_DESC flag for an option indicates that the option has a + default, which is described by the value of the default field. */ +#define GC_OPT_FLAG_DEF_DESC (1UL << 5) +/* The NO_ARG_DESC flag for an option indicates that the argument has + a default, which is described by the value of the ARGDEF field. */ +#define GC_OPT_FLAG_NO_ARG_DESC (1UL << 6) + +/* A human-readable description for each flag. */ +static struct +{ + const char *name; +} gc_flag[] = + { + { "group" }, + { "optional arg" }, + { "list" }, + { "runtime" }, + { "default" }, + { "default desc" }, + { "no arg desc" } + }; + + +/* To each option, or group marker, the information in the GC_OPTION + struct is provided. If you change this, don't forget to update the + option list of each component. */ +struct gc_option +{ + /* If this is NULL, then this is a terminator in an array of unknown + length. Otherwise, if this entry is a group marker (see FLAGS), + then this is the name of the group described by this entry. + Otherwise it is the name of the option described by this + entry. The name must not contain a colon. */ + const char *name; + + /* The option flags. If the GROUP flag is set, then this entry is a + group marker, not an option, and only the fields LEVEL, + DESC_DOMAIN and DESC are valid. In all other cases, this entry + describes a new option and all fields are valid. */ + unsigned long flags; + + /* The expert level. This field is valid for options and groups. A + group has the expert level of the lowest-level option in the + group. */ + gc_expert_level_t level; + + /* A gettext domain in which the following description can be found. + If this is NULL, then DESC is not translated. Valid for groups + and options. + + Note that we try to keep the description of groups within the + gnupg domain. + + IMPORTANT: If you add a new domain please make sure to add a code + set switching call to the function my_dgettext further below. */ + const char *desc_domain; + + /* A gettext description for this group or option. If it starts + with a '|', then the string up to the next '|' describes the + argument, and the description follows the second '|'. + + In general enclosing these description in N_() is not required + because the description should be identical to the one in the + help menu of the respective program. */ + const char *desc; + + /* The following fields are only valid for options. */ + + /* The type of the option argument. */ + gc_arg_type_t arg_type; + + /* The backend that implements this option. */ + gc_backend_t backend; + + /* The following fields are set to NULL at startup (because all + option's are declared as static variables). They are at the end + of the list so that they can be omitted from the option + declarations. */ + + /* This is true if the option is supported by this version of the + backend. */ + int active; + + /* The default value for this option. This is NULL if the option is + not present in the backend, the empty string if no default is + available, and otherwise a quoted string. */ + char *default_value; + + /* The default argument is only valid if the "optional arg" flag is + set, and specifies the default argument (value) that is used if + the argument is omitted. */ + char *default_arg; + + /* The current value of this option. */ + char *value; + + /* The new flags for this option. The only defined flag is actually + GC_OPT_FLAG_DEFAULT, and it means that the option should be + deleted. In this case, NEW_VALUE is NULL. */ + unsigned long new_flags; + + /* The new value of this option. */ + char *new_value; +}; +typedef struct gc_option gc_option_t; + +/* Use this macro to terminate an option list. */ +#define GC_OPTION_NULL { NULL } + + +/* The options of the GC_COMPONENT_GPG_AGENT component. */ +static gc_option_t gc_options_gpg_agent[] = + { + /* The configuration file to which we write the changes. */ + { "gpgconf-gpg-agent.conf", GC_OPT_FLAG_NONE, GC_LEVEL_INTERNAL, + NULL, NULL, GC_ARG_TYPE_PATHNAME, GC_BACKEND_GPG_AGENT }, + + { "Monitor", + GC_OPT_FLAG_GROUP, GC_LEVEL_BASIC, + "gnupg", N_("Options controlling the diagnostic output") }, + { "verbose", GC_OPT_FLAG_LIST|GC_OPT_FLAG_RUNTIME, GC_LEVEL_BASIC, + "gnupg", "verbose", + GC_ARG_TYPE_NONE, GC_BACKEND_GPG_AGENT }, + { "quiet", GC_OPT_FLAG_NONE|GC_OPT_FLAG_RUNTIME, GC_LEVEL_BASIC, + "gnupg", "be somewhat more quiet", + GC_ARG_TYPE_NONE, GC_BACKEND_GPG_AGENT }, + { "no-greeting", GC_OPT_FLAG_NONE, GC_LEVEL_INVISIBLE, + NULL, NULL, + GC_ARG_TYPE_NONE, GC_BACKEND_GPG_AGENT }, + + { "Configuration", + GC_OPT_FLAG_GROUP, GC_LEVEL_EXPERT, + "gnupg", N_("Options controlling the configuration") }, + { "options", GC_OPT_FLAG_NONE, GC_LEVEL_EXPERT, + "gnupg", "|FILE|read options from FILE", + GC_ARG_TYPE_PATHNAME, GC_BACKEND_GPG_AGENT }, + { "disable-scdaemon", GC_OPT_FLAG_NONE, GC_LEVEL_ADVANCED, + "gnupg", "do not use the SCdaemon", + GC_ARG_TYPE_NONE, GC_BACKEND_GPG_AGENT }, + + { "Debug", + GC_OPT_FLAG_GROUP, GC_LEVEL_ADVANCED, + "gnupg", N_("Options useful for debugging") }, + { "debug-level", GC_OPT_FLAG_ARG_OPT|GC_OPT_FLAG_RUNTIME, GC_LEVEL_ADVANCED, + "gnupg", "|LEVEL|set the debugging level to LEVEL", + GC_ARG_TYPE_STRING, GC_BACKEND_GPG_AGENT }, + { "log-file", GC_OPT_FLAG_RUNTIME, GC_LEVEL_ADVANCED, + "gnupg", N_("|FILE|write server mode logs to FILE"), + GC_ARG_TYPE_PATHNAME, GC_BACKEND_GPG_AGENT }, + { "faked-system-time", GC_OPT_FLAG_NONE, GC_LEVEL_INVISIBLE, + NULL, NULL, + GC_ARG_TYPE_UINT32, GC_BACKEND_GPG_AGENT }, + + { "Security", + GC_OPT_FLAG_GROUP, GC_LEVEL_BASIC, + "gnupg", N_("Options controlling the security") }, + { "default-cache-ttl", GC_OPT_FLAG_RUNTIME, GC_LEVEL_BASIC, + "gnupg", "|N|expire cached PINs after N seconds", + GC_ARG_TYPE_UINT32, GC_BACKEND_GPG_AGENT }, + { "ignore-cache-for-signing", GC_OPT_FLAG_RUNTIME, GC_LEVEL_BASIC, + "gnupg", "do not use the PIN cache when signing", + GC_ARG_TYPE_NONE, GC_BACKEND_GPG_AGENT }, + { "allow-mark-trusted", GC_OPT_FLAG_RUNTIME, GC_LEVEL_ADVANCED, + "gnupg", "allow clients to mark keys as \"trusted\"", + GC_ARG_TYPE_NONE, GC_BACKEND_GPG_AGENT }, + { "no-grab", GC_OPT_FLAG_RUNTIME, GC_LEVEL_EXPERT, + "gnupg", "do not grab keyboard and mouse", + GC_ARG_TYPE_NONE, GC_BACKEND_GPG_AGENT }, + + + GC_OPTION_NULL + }; + + +/* The options of the GC_COMPONENT_SCDAEMON component. */ +static gc_option_t gc_options_scdaemon[] = + { + /* The configuration file to which we write the changes. */ + { "gpgconf-scdaemon.conf", GC_OPT_FLAG_NONE, GC_LEVEL_INTERNAL, + NULL, NULL, GC_ARG_TYPE_PATHNAME, GC_BACKEND_SCDAEMON }, + + { "Monitor", + GC_OPT_FLAG_GROUP, GC_LEVEL_BASIC, + "gnupg", N_("Options controlling the diagnostic output") }, + { "verbose", GC_OPT_FLAG_LIST, GC_LEVEL_BASIC, + "gnupg", "verbose", + GC_ARG_TYPE_NONE, GC_BACKEND_SCDAEMON }, + { "quiet", GC_OPT_FLAG_NONE, GC_LEVEL_BASIC, + "gnupg", "be somewhat more quiet", + GC_ARG_TYPE_NONE, GC_BACKEND_SCDAEMON }, + { "no-greeting", GC_OPT_FLAG_NONE, GC_LEVEL_INVISIBLE, + NULL, NULL, + GC_ARG_TYPE_NONE, GC_BACKEND_SCDAEMON }, + + { "Configuration", + GC_OPT_FLAG_GROUP, GC_LEVEL_EXPERT, + "gnupg", N_("Options controlling the configuration") }, + { "options", GC_OPT_FLAG_NONE, GC_LEVEL_EXPERT, + "gnupg", "|FILE|read options from FILE", + GC_ARG_TYPE_PATHNAME, GC_BACKEND_SCDAEMON }, + { "reader-port", GC_OPT_FLAG_NONE, GC_LEVEL_BASIC, + "gnupg", "|N|connect to reader at port N", + GC_ARG_TYPE_STRING, GC_BACKEND_SCDAEMON }, + { "ctapi-driver", GC_OPT_FLAG_NONE, GC_LEVEL_ADVANCED, + "gnupg", "|NAME|use NAME as ct-API driver", + GC_ARG_TYPE_STRING, GC_BACKEND_SCDAEMON }, + { "pcsc-driver", GC_OPT_FLAG_NONE, GC_LEVEL_ADVANCED, + "gnupg", "|NAME|use NAME as PC/SC driver", + GC_ARG_TYPE_STRING, GC_BACKEND_SCDAEMON }, + { "disable-opensc", GC_OPT_FLAG_NONE, GC_LEVEL_EXPERT, + "gnupg", "do not use the OpenSC layer", + GC_ARG_TYPE_NONE, GC_BACKEND_SCDAEMON }, + { "disable-ccid", GC_OPT_FLAG_NONE, GC_LEVEL_EXPERT, + "gnupg", "do not use the internal CCID driver", + GC_ARG_TYPE_NONE, GC_BACKEND_SCDAEMON }, + { "disable-keypad", GC_OPT_FLAG_NONE, GC_LEVEL_ADVANCED, + "gnupg", "do not use a reader's keypad", + GC_ARG_TYPE_NONE, GC_BACKEND_SCDAEMON }, + + { "Debug", + GC_OPT_FLAG_GROUP, GC_LEVEL_ADVANCED, + "gnupg", N_("Options useful for debugging") }, + { "debug-level", GC_OPT_FLAG_ARG_OPT, GC_LEVEL_ADVANCED, + "gnupg", "|LEVEL|set the debugging level to LEVEL", + GC_ARG_TYPE_STRING, GC_BACKEND_SCDAEMON }, + { "log-file", GC_OPT_FLAG_NONE, GC_LEVEL_ADVANCED, + "gnupg", N_("|FILE|write server mode logs to FILE"), + GC_ARG_TYPE_PATHNAME, GC_BACKEND_SCDAEMON }, + + { "Security", + GC_OPT_FLAG_GROUP, GC_LEVEL_BASIC, + "gnupg", N_("Options controlling the security") }, + { "allow-admin", GC_OPT_FLAG_NONE, GC_LEVEL_BASIC, + "gnupg", "allow the use of admin card commands", + GC_ARG_TYPE_NONE, GC_BACKEND_SCDAEMON }, + + + GC_OPTION_NULL + }; + + +/* The options of the GC_COMPONENT_GPG component. */ +static gc_option_t gc_options_gpg[] = + { + /* The configuration file to which we write the changes. */ + { "gpgconf-gpg.conf", GC_OPT_FLAG_NONE, GC_LEVEL_INTERNAL, + NULL, NULL, GC_ARG_TYPE_PATHNAME, GC_BACKEND_GPG }, + + { "Monitor", + GC_OPT_FLAG_GROUP, GC_LEVEL_BASIC, + "gnupg", N_("Options controlling the diagnostic output") }, + { "verbose", GC_OPT_FLAG_LIST, GC_LEVEL_BASIC, + "gnupg", "verbose", + GC_ARG_TYPE_NONE, GC_BACKEND_GPG }, + { "quiet", GC_OPT_FLAG_NONE, GC_LEVEL_BASIC, + "gnupg", "be somewhat more quiet", + GC_ARG_TYPE_NONE, GC_BACKEND_GPG }, + { "no-greeting", GC_OPT_FLAG_NONE, GC_LEVEL_INVISIBLE, + NULL, NULL, + GC_ARG_TYPE_NONE, GC_BACKEND_GPG }, + + { "Configuration", + GC_OPT_FLAG_GROUP, GC_LEVEL_EXPERT, + "gnupg", N_("Options controlling the configuration") }, + { "options", GC_OPT_FLAG_NONE, GC_LEVEL_EXPERT, + "gnupg", "|FILE|read options from FILE", + GC_ARG_TYPE_PATHNAME, GC_BACKEND_GPG }, + + { "Debug", + GC_OPT_FLAG_GROUP, GC_LEVEL_ADVANCED, + "gnupg", N_("Options useful for debugging") }, + { "debug-level", GC_OPT_FLAG_ARG_OPT, GC_LEVEL_ADVANCED, + "gnupg", "|LEVEL|set the debugging level to LEVEL", + GC_ARG_TYPE_STRING, GC_BACKEND_GPG }, + { "log-file", GC_OPT_FLAG_NONE, GC_LEVEL_ADVANCED, + "gnupg", N_("|FILE|write server mode logs to FILE"), + GC_ARG_TYPE_PATHNAME, GC_BACKEND_GPG }, +/* { "faked-system-time", GC_OPT_FLAG_NONE, GC_LEVEL_INVISIBLE, */ +/* NULL, NULL, */ +/* GC_ARG_TYPE_UINT32, GC_BACKEND_GPG }, */ + + { "Keyserver", + GC_OPT_FLAG_GROUP, GC_LEVEL_BASIC, + "gnupg", N_("Configuration for Keyservers") }, + { "keyserver", GC_OPT_FLAG_NONE, GC_LEVEL_BASIC, + "gnupg", "|URL|use keyserver at URL", + GC_ARG_TYPE_STRING, GC_BACKEND_GPG }, + { "allow-pka-lookup", GC_OPT_FLAG_NONE, GC_LEVEL_BASIC, + "gnupg", N_("allow PKA lookups (DNS requests)"), + GC_ARG_TYPE_NONE, GC_BACKEND_GPG }, + + + GC_OPTION_NULL + }; + + + +/* The options of the GC_COMPONENT_GPGSM component. */ +static gc_option_t gc_options_gpgsm[] = + { + /* The configuration file to which we write the changes. */ + { "gpgconf-gpgsm.conf", GC_OPT_FLAG_NONE, GC_LEVEL_INTERNAL, + NULL, NULL, GC_ARG_TYPE_PATHNAME, GC_BACKEND_GPGSM }, + + { "Monitor", + GC_OPT_FLAG_GROUP, GC_LEVEL_BASIC, + "gnupg", N_("Options controlling the diagnostic output") }, + { "verbose", GC_OPT_FLAG_LIST, GC_LEVEL_BASIC, + "gnupg", "verbose", + GC_ARG_TYPE_NONE, GC_BACKEND_GPGSM }, + { "quiet", GC_OPT_FLAG_NONE, GC_LEVEL_BASIC, + "gnupg", "be somewhat more quiet", + GC_ARG_TYPE_NONE, GC_BACKEND_GPGSM }, + { "no-greeting", GC_OPT_FLAG_NONE, GC_LEVEL_INVISIBLE, + NULL, NULL, + GC_ARG_TYPE_NONE, GC_BACKEND_GPGSM }, + + { "Configuration", + GC_OPT_FLAG_GROUP, GC_LEVEL_EXPERT, + "gnupg", N_("Options controlling the configuration") }, + { "options", GC_OPT_FLAG_NONE, GC_LEVEL_EXPERT, + "gnupg", "|FILE|read options from FILE", + GC_ARG_TYPE_PATHNAME, GC_BACKEND_GPGSM }, + { "prefer-system-dirmngr", GC_OPT_FLAG_NONE, GC_LEVEL_ADVANCED, + "gnupg", "use system's dirmngr if available", + GC_ARG_TYPE_NONE, GC_BACKEND_GPGSM }, + + { "Debug", + GC_OPT_FLAG_GROUP, GC_LEVEL_ADVANCED, + "gnupg", N_("Options useful for debugging") }, + { "debug-level", GC_OPT_FLAG_ARG_OPT, GC_LEVEL_ADVANCED, + "gnupg", "|LEVEL|set the debugging level to LEVEL", + GC_ARG_TYPE_STRING, GC_BACKEND_GPGSM }, + { "log-file", GC_OPT_FLAG_NONE, GC_LEVEL_ADVANCED, + "gnupg", N_("|FILE|write server mode logs to FILE"), + GC_ARG_TYPE_PATHNAME, GC_BACKEND_GPGSM }, + { "faked-system-time", GC_OPT_FLAG_NONE, GC_LEVEL_INVISIBLE, + NULL, NULL, + GC_ARG_TYPE_UINT32, GC_BACKEND_GPGSM }, + + { "Security", + GC_OPT_FLAG_GROUP, GC_LEVEL_BASIC, + "gnupg", N_("Options controlling the security") }, + { "disable-crl-checks", GC_OPT_FLAG_NONE, GC_LEVEL_BASIC, + "gnupg", "never consult a CRL", + GC_ARG_TYPE_NONE, GC_BACKEND_GPGSM }, + { "disable-trusted-cert-crl-check", GC_OPT_FLAG_NONE, GC_LEVEL_EXPERT, + "gnupg", N_("do not check CRLs for root certificates"), + GC_ARG_TYPE_NONE, GC_BACKEND_GPGSM }, + { "enable-ocsp", GC_OPT_FLAG_NONE, GC_LEVEL_ADVANCED, + "gnupg", "check validity using OCSP", + GC_ARG_TYPE_NONE, GC_BACKEND_GPGSM }, + { "include-certs", GC_OPT_FLAG_NONE, GC_LEVEL_EXPERT, + "gnupg", "|N|number of certificates to include", + GC_ARG_TYPE_INT32, GC_BACKEND_GPGSM }, + { "disable-policy-checks", GC_OPT_FLAG_NONE, GC_LEVEL_ADVANCED, + "gnupg", "do not check certificate policies", + GC_ARG_TYPE_NONE, GC_BACKEND_GPGSM }, + { "auto-issuer-key-retrieve", GC_OPT_FLAG_NONE, GC_LEVEL_BASIC, + "gnupg", "fetch missing issuer certificates", + GC_ARG_TYPE_NONE, GC_BACKEND_GPGSM }, + + GC_OPTION_NULL + }; + + +/* The options of the GC_COMPONENT_DIRMNGR component. */ +static gc_option_t gc_options_dirmngr[] = + { + /* The configuration file to which we write the changes. */ + { "gpgconf-dirmngr.conf", GC_OPT_FLAG_NONE, GC_LEVEL_INTERNAL, + NULL, NULL, GC_ARG_TYPE_PATHNAME, GC_BACKEND_DIRMNGR }, + + { "Monitor", + GC_OPT_FLAG_GROUP, GC_LEVEL_BASIC, + "gnupg", N_("Options controlling the diagnostic output") }, + { "verbose", GC_OPT_FLAG_LIST, GC_LEVEL_BASIC, + "dirmngr", "verbose", + GC_ARG_TYPE_NONE, GC_BACKEND_DIRMNGR }, + { "quiet", GC_OPT_FLAG_NONE, GC_LEVEL_BASIC, + "dirmngr", "be somewhat more quiet", + GC_ARG_TYPE_NONE, GC_BACKEND_DIRMNGR }, + { "no-greeting", GC_OPT_FLAG_NONE, GC_LEVEL_INVISIBLE, + NULL, NULL, + GC_ARG_TYPE_NONE, GC_BACKEND_DIRMNGR }, + + { "Format", + GC_OPT_FLAG_GROUP, GC_LEVEL_BASIC, + "gnupg", N_("Options controlling the format of the output") }, + { "sh", GC_OPT_FLAG_NONE, GC_LEVEL_BASIC, + "dirmngr", "sh-style command output", + GC_ARG_TYPE_NONE, GC_BACKEND_DIRMNGR }, + { "csh", GC_OPT_FLAG_NONE, GC_LEVEL_BASIC, + "dirmngr", "csh-style command output", + GC_ARG_TYPE_NONE, GC_BACKEND_DIRMNGR }, + + { "Configuration", + GC_OPT_FLAG_GROUP, GC_LEVEL_EXPERT, + "gnupg", N_("Options controlling the configuration") }, + { "options", GC_OPT_FLAG_NONE, GC_LEVEL_EXPERT, + "dirmngr", "|FILE|read options from FILE", + GC_ARG_TYPE_PATHNAME, GC_BACKEND_DIRMNGR }, + + { "Debug", + GC_OPT_FLAG_GROUP, GC_LEVEL_ADVANCED, + "gnupg", N_("Options useful for debugging") }, + { "debug-level", GC_OPT_FLAG_ARG_OPT, GC_LEVEL_ADVANCED, + "dirmngr", "|LEVEL|set the debugging level to LEVEL", + GC_ARG_TYPE_STRING, GC_BACKEND_DIRMNGR }, + { "no-detach", GC_OPT_FLAG_NONE, GC_LEVEL_ADVANCED, + "dirmngr", "do not detach from the console", + GC_ARG_TYPE_NONE, GC_BACKEND_DIRMNGR }, + { "log-file", GC_OPT_FLAG_NONE, GC_LEVEL_ADVANCED, + "dirmngr", N_("|FILE|write server mode logs to FILE"), + GC_ARG_TYPE_PATHNAME, GC_BACKEND_DIRMNGR }, + { "debug-wait", GC_OPT_FLAG_NONE, GC_LEVEL_INVISIBLE, + NULL, NULL, + GC_ARG_TYPE_UINT32, GC_BACKEND_DIRMNGR }, + { "faked-system-time", GC_OPT_FLAG_NONE, GC_LEVEL_INVISIBLE, + NULL, NULL, + GC_ARG_TYPE_UINT32, GC_BACKEND_DIRMNGR }, + + { "Enforcement", + GC_OPT_FLAG_GROUP, GC_LEVEL_BASIC, + "gnupg", N_("Options controlling the interactivity and enforcement") }, + { "batch", GC_OPT_FLAG_NONE, GC_LEVEL_BASIC, + "dirmngr", "run without asking a user", + GC_ARG_TYPE_NONE, GC_BACKEND_DIRMNGR }, + { "force", GC_OPT_FLAG_NONE, GC_LEVEL_BASIC, + "dirmngr", "force loading of outdated CRLs", + GC_ARG_TYPE_NONE, GC_BACKEND_DIRMNGR }, + + { "HTTP", + GC_OPT_FLAG_GROUP, GC_LEVEL_ADVANCED, + "gnupg", N_("Configuration for HTTP servers") }, + { "disable-http", GC_OPT_FLAG_NONE, GC_LEVEL_ADVANCED, + "dirmngr", "inhibit the use of HTTP", + GC_ARG_TYPE_NONE, GC_BACKEND_DIRMNGR }, + { "ignore-http-dp", GC_OPT_FLAG_NONE, GC_LEVEL_ADVANCED, + "dirmngr", "ignore HTTP CRL distribution points", + GC_ARG_TYPE_NONE, GC_BACKEND_DIRMNGR }, + { "http-proxy", GC_OPT_FLAG_NONE, GC_LEVEL_ADVANCED, + "dirmngr", "|URL|redirect all HTTP requests to URL", + GC_ARG_TYPE_STRING, GC_BACKEND_DIRMNGR }, + { "honor-http-proxy", GC_OPT_FLAG_NONE, GC_LEVEL_ADVANCED, + "dirmngr", N_("use system's HTTP proxy setting"), + GC_ARG_TYPE_NONE, GC_BACKEND_DIRMNGR }, + + { "LDAP", + GC_OPT_FLAG_GROUP, GC_LEVEL_BASIC, + "gnupg", N_("Configuration of LDAP servers to use") }, + { "disable-ldap", GC_OPT_FLAG_NONE, GC_LEVEL_ADVANCED, + "dirmngr", "inhibit the use of LDAP", + GC_ARG_TYPE_NONE, GC_BACKEND_DIRMNGR }, + { "ignore-ldap-dp", GC_OPT_FLAG_NONE, GC_LEVEL_ADVANCED, + "dirmngr", "ignore LDAP CRL distribution points", + GC_ARG_TYPE_NONE, GC_BACKEND_DIRMNGR }, + { "ldap-proxy", GC_OPT_FLAG_NONE, GC_LEVEL_BASIC, + "dirmngr", "|HOST|use HOST for LDAP queries", + GC_ARG_TYPE_STRING, GC_BACKEND_DIRMNGR }, + { "only-ldap-proxy", GC_OPT_FLAG_NONE, GC_LEVEL_ADVANCED, + "dirmngr", "do not use fallback hosts with --ldap-proxy", + GC_ARG_TYPE_NONE, GC_BACKEND_DIRMNGR }, + { "add-servers", GC_OPT_FLAG_NONE, GC_LEVEL_ADVANCED, + "dirmngr", "add new servers discovered in CRL distribution points" + " to serverlist", GC_ARG_TYPE_NONE, GC_BACKEND_DIRMNGR }, + { "ldaptimeout", GC_OPT_FLAG_NONE, GC_LEVEL_BASIC, + "dirmngr", "|N|set LDAP timeout to N seconds", + GC_ARG_TYPE_UINT32, GC_BACKEND_DIRMNGR }, + /* The following entry must not be removed, as it is required for + the GC_BACKEND_DIRMNGR_LDAP_SERVER_LIST. */ + { "ldapserverlist-file", + GC_OPT_FLAG_NONE, GC_LEVEL_INTERNAL, + "dirmngr", "|FILE|read LDAP server list from FILE", + GC_ARG_TYPE_PATHNAME, GC_BACKEND_DIRMNGR }, + /* This entry must come after at least one entry for + GC_BACKEND_DIRMNGR in this component, so that the entry for + "ldapserverlist-file will be initialized before this one. */ + { "LDAP Server", GC_OPT_FLAG_ARG_OPT|GC_OPT_FLAG_LIST, GC_LEVEL_BASIC, + NULL, "LDAP server list", + GC_ARG_TYPE_LDAP_SERVER, GC_BACKEND_DIRMNGR_LDAP_SERVER_LIST }, + { "max-replies", GC_OPT_FLAG_NONE, GC_LEVEL_BASIC, + "dirmngr", "|N|do not return more than N items in one query", + GC_ARG_TYPE_UINT32, GC_BACKEND_DIRMNGR }, + + { "OCSP", + GC_OPT_FLAG_GROUP, GC_LEVEL_ADVANCED, + "gnupg", N_("Configuration for OCSP") }, + { "allow-ocsp", GC_OPT_FLAG_NONE, GC_LEVEL_BASIC, + "dirmngr", "allow sending OCSP requests", + GC_ARG_TYPE_NONE, GC_BACKEND_DIRMNGR }, + { "ignore-ocsp-service-url", GC_OPT_FLAG_NONE, GC_LEVEL_ADVANCED, + "dirmngr", "ignore certificate contained OCSP service URLs", + GC_ARG_TYPE_NONE, GC_BACKEND_DIRMNGR }, + { "ocsp-responder", GC_OPT_FLAG_NONE, GC_LEVEL_ADVANCED, + "dirmngr", "|URL|use OCSP responder at URL", + GC_ARG_TYPE_STRING, GC_BACKEND_DIRMNGR }, + { "ocsp-signer", GC_OPT_FLAG_NONE, GC_LEVEL_ADVANCED, + "dirmngr", "|FPR|OCSP response signed by FPR", + GC_ARG_TYPE_STRING, GC_BACKEND_DIRMNGR }, + + + GC_OPTION_NULL + }; + + +/* Component system. Each component is a set of options that can be + configured at the same time. If you change this, don't forget to + update GC_COMPONENT below. */ +typedef enum + { + /* The classic GPG for OpenPGP. */ + GC_COMPONENT_GPG, + + /* The GPG Agent. */ + GC_COMPONENT_GPG_AGENT, + + /* The Smardcard Daemon. */ + GC_COMPONENT_SCDAEMON, + + /* GPG for S/MIME. */ + GC_COMPONENT_GPGSM, + + /* The LDAP Directory Manager for CRLs. */ + GC_COMPONENT_DIRMNGR, + + /* The number of components. */ + GC_COMPONENT_NR + } gc_component_t; + + +/* The information associated with each component. */ +static struct +{ + /* The name of this component. Must not contain a colon (':') + character. */ + const char *name; + + /* The gettext domain for the description DESC. If this is NULL, + then the description is not translated. */ + const char *desc_domain; + + /* The description for this domain. */ + const char *desc; + + /* The list of options for this component, terminated by + GC_OPTION_NULL. */ + gc_option_t *options; +} gc_component[] = + { + { "gpg", NULL, "GPG for OpenPGP", gc_options_gpg }, + { "gpg-agent", NULL, "GPG Agent", gc_options_gpg_agent }, + { "scdaemon", NULL, "Smartcard Daemon", gc_options_scdaemon }, + { "gpgsm", NULL, "GPG for S/MIME", gc_options_gpgsm }, + { "dirmngr", NULL, "Directory Manager", gc_options_dirmngr } + }; + + +/* Engine specific support. */ +void +gpg_agent_runtime_change (void) +{ +#ifndef HAVE_W32_SYSTEM + char *agent = getenv ("GPG_AGENT_INFO"); + char *pid_str; + unsigned long pid_long; + char *tail; + pid_t pid; + + if (!agent) + return; + + pid_str = strchr (agent, ':'); + if (!pid_str) + return; + + pid_str++; + errno = 0; + pid_long = strtoul (pid_str, &tail, 0); + if (errno || (*tail != ':' && *tail != '\0')) + return; + + pid = (pid_t) pid_long; + + /* Check for overflow. */ + if (pid_long != (unsigned long) pid) + return; + + /* Ignore any errors here. */ + kill (pid, SIGHUP); +#endif /*!HAVE_W32_SYSTEM*/ +} + + +/* More or less Robust version of dgettext. It has the side effect of + switching the codeset to utf-8 because this is what we want to + output. In theory it is posible to keep the orginal code set and + switch back for regular disgnostic output (redefine "_(" for that) + but given the natur of this tool, being something invoked from + other pograms, it does not make much sense. */ +static const char * +my_dgettext (const char *domain, const char *msgid) +{ +#ifdef ENABLE_NLS + if (domain) + { + static int switched_codeset; + char *text; + + if (!switched_codeset) + { + switched_codeset = 1; + bind_textdomain_codeset (PACKAGE_GT, "utf-8"); + + bindtextdomain ("dirmngr", LOCALEDIR); + bind_textdomain_codeset ("dirmngr", "utf-8"); + + } + + /* Note: This is a hack to actually use the gnupg2 domain as + long we are in a transition phase where gnupg 1.x and 1.9 may + coexist. */ + if (!strcmp (domain, "gnupg")) + domain = PACKAGE_GT; + + text = dgettext (domain, msgid); + return text ? text : msgid; + } + else +#endif + return msgid; +} + + +/* Percent-Escape special characters. The string is valid until the + next invocation of the function. */ +static char * +percent_escape (const char *src) +{ + static char *esc_str; + static int esc_str_len; + int new_len = 3 * strlen (src) + 1; + char *dst; + + if (esc_str_len < new_len) + { + char *new_esc_str = realloc (esc_str, new_len); + if (!new_esc_str) + gc_error (1, errno, "can not escape string"); + esc_str = new_esc_str; + esc_str_len = new_len; + } + + dst = esc_str; + while (*src) + { + if (*src == '%') + { + *(dst++) = '%'; + *(dst++) = '2'; + *(dst++) = '5'; + } + else if (*src == ':') + { + /* The colon is used as field separator. */ + *(dst++) = '%'; + *(dst++) = '3'; + *(dst++) = 'a'; + } + else if (*src == ',') + { + /* The comma is used as list separator. */ + *(dst++) = '%'; + *(dst++) = '2'; + *(dst++) = 'c'; + } + else + *(dst++) = *(src); + src++; + } + *dst = '\0'; + return esc_str; +} + + + +/* Percent-Deescape special characters. The string is valid until the + next invocation of the function. */ +static char * +percent_deescape (const char *src) +{ + static char *str; + static int str_len; + int new_len = 3 * strlen (src) + 1; + char *dst; + + if (str_len < new_len) + { + char *new_str = realloc (str, new_len); + if (!new_str) + gc_error (1, errno, "can not deescape string"); + str = new_str; + str_len = new_len; + } + + dst = str; + while (*src) + { + if (*src == '%') + { + int val = hextobyte (src + 1); + + if (val < 0) + gc_error (1, 0, "malformed end of string %s", src); + + *(dst++) = (char) val; + src += 3; + } + else + *(dst++) = *(src++); + } + *dst = '\0'; + return str; +} + + +/* List all components that are available. */ +void +gc_component_list_components (FILE *out) +{ + gc_component_t idx; + + for (idx = 0; idx < GC_COMPONENT_NR; idx++) + { + const char *desc = gc_component[idx].desc; + desc = my_dgettext (gc_component[idx].desc_domain, desc); + fprintf (out, "%s:%s\n", gc_component[idx].name, percent_escape (desc)); + } +} + + +/* Find the component with the name NAME. Returns -1 if not + found. */ +int +gc_component_find (const char *name) +{ + gc_component_t idx; + + for (idx = 0; idx < GC_COMPONENT_NR; idx++) + { + if (!strcmp (name, gc_component[idx].name)) + return idx; + } + return -1; +} + + +/* List the option OPTION. */ +static void +list_one_option (const gc_option_t *option, FILE *out) +{ + const char *desc = NULL; + char *arg_name = NULL; + + if (option->desc) + { + desc = my_dgettext (option->desc_domain, option->desc); + + if (*desc == '|') + { + const char *arg_tail = strchr (&desc[1], '|'); + + if (arg_tail) + { + int arg_len = arg_tail - &desc[1]; + arg_name = xmalloc (arg_len + 1); + memcpy (arg_name, &desc[1], arg_len); + arg_name[arg_len] = '\0'; + desc = arg_tail + 1; + } + } + } + + + /* YOU MUST NOT REORDER THE FIELDS IN THIS OUTPUT, AS THEIR ORDER IS + PART OF THE EXTERNAL INTERFACE. YOU MUST NOT REMOVE ANY + FIELDS. */ + + /* The name field. */ + fprintf (out, "%s", option->name); + + /* The flags field. */ + fprintf (out, ":%lu", option->flags); + if (opt.verbose) + { + putc (' ', out); + + if (!option->flags) + fprintf (out, "none"); + else + { + unsigned long flags = option->flags; + unsigned long flag = 0; + unsigned long first = 1; + + while (flags) + { + if (flags & 1) + { + if (first) + first = 0; + else + putc (',', out); + fprintf (out, "%s", gc_flag[flag].name); + } + flags >>= 1; + flag++; + } + } + } + + /* The level field. */ + fprintf (out, ":%u", option->level); + if (opt.verbose) + fprintf (out, " %s", gc_level[option->level].name); + + /* The description field. */ + fprintf (out, ":%s", desc ? percent_escape (desc) : ""); + + /* The type field. */ + fprintf (out, ":%u", option->arg_type); + if (opt.verbose) + fprintf (out, " %s", gc_arg_type[option->arg_type].name); + + /* The alternate type field. */ + fprintf (out, ":%u", gc_arg_type[option->arg_type].fallback); + if (opt.verbose) + fprintf (out, " %s", + gc_arg_type[gc_arg_type[option->arg_type].fallback].name); + + /* The argument name field. */ + fprintf (out, ":%s", arg_name ? percent_escape (arg_name) : ""); + if (arg_name) + xfree (arg_name); + + /* The default value field. */ + fprintf (out, ":%s", option->default_value ? option->default_value : ""); + + /* The default argument field. */ + fprintf (out, ":%s", option->default_arg ? option->default_arg : ""); + + /* The value field. */ + if (gc_arg_type[option->arg_type].fallback == GC_ARG_TYPE_NONE + && (option->flags & GC_OPT_FLAG_LIST) + && option->value) + /* The special format "1,1,1,1,...,1" is converted to a number + here. */ + fprintf (out, ":%u", (strlen (option->value) + 1) / 2); + else + fprintf (out, ":%s", option->value ? option->value : ""); + + /* ADD NEW FIELDS HERE. */ + + putc ('\n', out); +} + + +/* List all options of the component COMPONENT. */ +void +gc_component_list_options (int component, FILE *out) +{ + const gc_option_t *option = gc_component[component].options; + const gc_option_t *group_option = NULL; + + while (option->name) + { + /* Do not output unknown or internal options. */ + if (!(option->flags & GC_OPT_FLAG_GROUP) + && (!option->active || option->level == GC_LEVEL_INTERNAL)) + { + option++; + continue; + } + + if (option->flags & GC_OPT_FLAG_GROUP) + group_option = option; + else + { + if (group_option) + { + list_one_option (group_option, out); + group_option = NULL; + } + + list_one_option (option, out); + } + + option++; + } +} + + +/* Find the option NAME in component COMPONENT, for the backend + BACKEND. If BACKEND is GC_BACKEND_ANY, any backend will match. */ +static gc_option_t * +find_option (gc_component_t component, const char *name, + gc_backend_t backend) +{ + gc_option_t *option = gc_component[component].options; + while (option->name) + { + if (!(option->flags & GC_OPT_FLAG_GROUP) + && !strcmp (option->name, name) + && (backend == GC_BACKEND_ANY || option->backend == backend)) + break; + option++; + } + return option->name ? option : NULL; +} + + +/* Determine the configuration pathname for the component COMPONENT + and backend BACKEND. */ +static char * +get_config_pathname (gc_component_t component, gc_backend_t backend) +{ + char *pathname = NULL; + gc_option_t *option = find_option + (component, gc_backend[backend].option_config_filename, GC_BACKEND_ANY); + assert (option); + assert (option->arg_type == GC_ARG_TYPE_PATHNAME); + assert (!(option->flags & GC_OPT_FLAG_LIST)); + + if (!option->active || !option->default_value) + gc_error (1, 0, "Option %s, needed by backend %s, was not initialized", + gc_backend[backend].option_config_filename, + gc_backend[backend].name); + + if (option->value && *option->value) + pathname = percent_deescape (&option->value[1]); + else if (option->default_value && *option->default_value) + pathname = percent_deescape (&option->default_value[1]); + else + pathname = ""; + +#ifdef HAVE_DOSISH_SYSTEM + if (!(pathname[0] + && pathname[1] == ':' + && (pathname[2] == '/' || pathname[2] == '\\'))) +#else + if (pathname[0] != '/') +#endif + gc_error (1, 0, "Option %s, needed by backend %s, is not absolute", + gc_backend[backend].option_config_filename, + gc_backend[backend].name); + + return pathname; +} + + +/* Retrieve the options for the component COMPONENT from backend + BACKEND, which we already know is a program-type backend. */ +static void +retrieve_options_from_program (gc_component_t component, gc_backend_t backend) +{ + char *cmd_line; + char *line = NULL; + size_t line_len = 0; + ssize_t length; + FILE *config; + char *config_pathname; + + cmd_line = xasprintf ("%s --gpgconf-list", gc_backend[backend].program); + + config = popen (cmd_line, "r"); + if (!config) + gc_error (1, errno, "could not gather active options from %s", cmd_line); + + while ((length = read_line (config, &line, &line_len, NULL)) > 0) + { + gc_option_t *option; + char *linep; + unsigned long flags = 0; + char *default_value = NULL; + + /* Strip newline and carriage return, if present. */ + while (length > 0 + && (line[length - 1] == '\n' || line[length - 1] == '\r')) + line[--length] = '\0'; + + linep = strchr (line, ':'); + if (linep) + *(linep++) = '\0'; + + /* Extract additional flags. Default to none. */ + if (linep) + { + char *end; + char *tail; + + end = strchr (linep, ':'); + if (end) + *(end++) = '\0'; + + errno = 0; + flags = strtoul (linep, &tail, 0); + if (errno) + gc_error (1, errno, "malformed flags in option %s from %s", line, cmd_line); + if (!(*tail == '\0' || *tail == ':' || *tail == ' ')) + gc_error (1, 0, "garbage after flags in option %s from %s", line, cmd_line); + + linep = end; + } + + /* Extract default value, if present. Default to empty if + not. */ + if (linep) + { + char *end; + + end = strchr (linep, ':'); + if (end) + *(end++) = '\0'; + + if (flags & GC_OPT_FLAG_DEFAULT) + default_value = linep; + + linep = end; + } + + /* Look up the option in the component and install the + configuration data. */ + option = find_option (component, line, backend); + if (option) + { + if (option->active) + gc_error (1, errno, "option %s returned twice from %s", + line, cmd_line); + option->active = 1; + + option->flags |= flags; + if (default_value && *default_value) + option->default_value = xstrdup (default_value); + } + } + if (length < 0 || ferror (config)) + gc_error (1, errno, "error reading from %s", cmd_line); + if (fclose (config) && ferror (config)) + gc_error (1, errno, "error closing %s", cmd_line); + xfree (cmd_line); + + /* At this point, we can parse the configuration file. */ + config_pathname = get_config_pathname (component, backend); + + config = fopen (config_pathname, "r"); + if (!config) + gc_error (0, errno, "warning: can not open config file %s", + config_pathname); + else + { + while ((length = read_line (config, &line, &line_len, NULL)) > 0) + { + char *name; + char *value; + gc_option_t *option; + + name = line; + while (*name == ' ' || *name == '\t') + name++; + if (!*name || *name == '#' || *name == '\r' || *name == '\n') + continue; + + value = name; + while (*value && *value != ' ' && *value != '\t' + && *value != '#' && *value != '\r' && *value != '\n') + value++; + if (*value == ' ' || *value == '\t') + { + char *end; + + *(value++) = '\0'; + while (*value == ' ' || *value == '\t') + value++; + + end = value; + while (*end && *end != '#' && *end != '\r' && *end != '\n') + end++; + while (end > value && (end[-1] == ' ' || end[-1] == '\t')) + end--; + *end = '\0'; + } + else + *value = '\0'; + + /* Look up the option in the component and install the + configuration data. */ + option = find_option (component, line, backend); + if (option) + { + char *opt_value; + + if (gc_arg_type[option->arg_type].fallback == GC_ARG_TYPE_NONE) + { + if (*value) + gc_error (0, 0, + "warning: ignoring argument %s for option %s", + value, name); + opt_value = xstrdup ("1"); + } + else if (gc_arg_type[option->arg_type].fallback + == GC_ARG_TYPE_STRING) + opt_value = xasprintf ("\"%s", percent_escape (value)); + else + { + /* FIXME: Verify that the number is sane. */ + opt_value = xstrdup (value); + } + + /* Now enter the option into the table. */ + if (!(option->flags & GC_OPT_FLAG_LIST)) + { + if (option->value) + free (option->value); + option->value = opt_value; + } + else + { + if (!option->value) + option->value = opt_value; + else + { + char *opt_val = opt_value; + + option->value = xasprintf ("%s,%s", option->value, + opt_val); + xfree (opt_value); + } + } + } + } + + if (length < 0 || ferror (config)) + gc_error (1, errno, "error reading from %s", config_pathname); + if (fclose (config) && ferror (config)) + gc_error (1, errno, "error closing %s", config_pathname); + } + + xfree (line); +} + + +/* Retrieve the options for the component COMPONENT from backend + BACKEND, which we already know is of type file list. */ +static void +retrieve_options_from_file (gc_component_t component, gc_backend_t backend) +{ + gc_option_t *list_option; + char *list_pathname; + FILE *list_file; + char *line = NULL; + size_t line_len = 0; + ssize_t length; + char *list = NULL; + + list_option = find_option (component, + gc_backend[backend].option_name, GC_BACKEND_ANY); + assert (list_option); + assert (!list_option->active); + + list_pathname = get_config_pathname (component, backend); + list_file = fopen (list_pathname, "r"); + if (!list_file) + gc_error (0, errno, "warning: can not open list file %s", list_pathname); + else + { + + while ((length = read_line (list_file, &line, &line_len, NULL)) > 0) + { + char *start; + char *end; + char *new_list; + + start = line; + while (*start == ' ' || *start == '\t') + start++; + if (!*start || *start == '#' || *start == '\r' || *start == '\n') + continue; + + end = start; + while (*end && *end != '#' && *end != '\r' && *end != '\n') + end++; + /* Walk back to skip trailing white spaces. Looks evil, but + works because of the conditions on START and END imposed + at this point (END is at least START + 1, and START is + not a whitespace character). */ + while (*(end - 1) == ' ' || *(end - 1) == '\t') + end--; + *end = '\0'; + /* FIXME: Oh, no! This is so lame! Should use realloc and + really append. */ + if (list) + { + new_list = xasprintf ("%s,\"%s", list, percent_escape (start)); + xfree (list); + list = new_list; + } + else + list = xasprintf ("\"%s", percent_escape (start)); + } + if (length < 0 || ferror (list_file)) + gc_error (1, errno, "can not read list file %s", list_pathname); + } + + list_option->active = 1; + list_option->value = list; + + xfree (line); +} + + +/* Retrieve the currently active options and their defaults from all + involved backends for this component. */ +void +gc_component_retrieve_options (int component) +{ + int backend_seen[GC_BACKEND_NR]; + gc_backend_t backend; + gc_option_t *option = gc_component[component].options; + + for (backend = 0; backend < GC_BACKEND_NR; backend++) + backend_seen[backend] = 0; + + while (option->name) + { + if (!(option->flags & GC_OPT_FLAG_GROUP)) + { + backend = option->backend; + + if (backend_seen[backend]) + { + option++; + continue; + } + backend_seen[backend] = 1; + + assert (backend != GC_BACKEND_ANY); + + if (gc_backend[backend].program) + retrieve_options_from_program (component, backend); + else + retrieve_options_from_file (component, backend); + } + option++; + } +} + + +/* Perform a simple validity check based on the type. Return in + NEW_VALUE_NR the value of the number in NEW_VALUE if OPTION is of + type GC_ARG_TYPE_NONE. */ +static void +option_check_validity (gc_option_t *option, unsigned long flags, + char *new_value, unsigned long *new_value_nr) +{ + char *arg; + + if (!option->active) + gc_error (1, 0, "option %s not supported by backend", option->name); + + if (option->new_flags || option->new_value) + gc_error (1, 0, "option %s already changed", option->name); + + if (flags & GC_OPT_FLAG_DEFAULT) + { + if (*new_value) + gc_error (1, 0, "argument %s provided for deleted option %s", + new_value, option->name); + + return; + } + + /* GC_ARG_TYPE_NONE options have special list treatment. */ + if (gc_arg_type[option->arg_type].fallback == GC_ARG_TYPE_NONE) + { + char *tail; + + errno = 0; + *new_value_nr = strtoul (new_value, &tail, 0); + + if (errno) + gc_error (1, errno, "invalid argument for option %s", + option->name); + if (*tail) + gc_error (1, 0, "garbage after argument for option %s", + option->name); + + if (!(option->flags & GC_OPT_FLAG_LIST)) + { + if (*new_value_nr != 1) + gc_error (1, 0, "argument for non-list option %s of type 0 " + "(none) must be 1", option->name); + } + else + { + if (*new_value_nr == 0) + gc_error (1, 0, "argument for option %s of type 0 (none) " + "must be positive", option->name); + } + + return; + } + + arg = new_value; + do + { + if (*arg == '\0' || *arg == ',') + { + if (!(option->flags & GC_OPT_FLAG_ARG_OPT)) + gc_error (1, 0, "argument required for option %s", option->name); + + if (*arg == ',' && !(option->flags & GC_OPT_FLAG_LIST)) + gc_error (1, 0, "list found for non-list option %s", option->name); + } + else if (gc_arg_type[option->arg_type].fallback == GC_ARG_TYPE_STRING) + { + if (*arg != '"') + gc_error (1, 0, "string argument for option %s must begin " + "with a quote (\") character", option->name); + } + else if (gc_arg_type[option->arg_type].fallback == GC_ARG_TYPE_INT32) + { + errno = 0; + (void) strtol (arg, &arg, 0); + + if (errno) + gc_error (1, errno, "invalid argument for option %s", + option->name); + + if (*arg != '\0' && *arg != ',') + gc_error (1, 0, "garbage after argument for option %s", + option->name); + } + else if (gc_arg_type[option->arg_type].fallback == GC_ARG_TYPE_INT32) + { + errno = 0; + (void) strtoul (arg, &arg, 0); + + if (errno) + gc_error (1, errno, "invalid argument for option %s", + option->name); + + if (*arg != '\0' && *arg != ',') + gc_error (1, 0, "garbage after argument for option %s", + option->name); + } + arg = strchr (arg, ','); + if (arg) + arg++; + } + while (arg && *arg); +} + + +/* Create and verify the new configuration file for the specified + backend and component. Returns 0 on success and -1 on error. */ +static int +change_options_file (gc_component_t component, gc_backend_t backend, + char **src_filenamep, char **dest_filenamep, + char **orig_filenamep) +{ + static const char marker[] = "###+++--- GPGConf ---+++###"; + /* True if we are within the marker in the config file. */ + int in_marker = 0; + gc_option_t *option; + char *line = NULL; + size_t line_len; + ssize_t length; + int res; + int fd; + FILE *src_file = NULL; + FILE *dest_file = NULL; + char *src_filename; + char *dest_filename; + char *orig_filename; + char *arg; + char *cur_arg = NULL; + + option = find_option (component, + gc_backend[backend].option_name, GC_BACKEND_ANY); + assert (option); + assert (option->active); + assert (gc_arg_type[option->arg_type].fallback != GC_ARG_TYPE_NONE); + + /* FIXME. Throughout the function, do better error reporting. */ + /* Note that get_config_pathname() calls percent_deescape(), so we + call this before processing the arguments. */ + dest_filename = xstrdup (get_config_pathname (component, backend)); + src_filename = xasprintf ("%s.gpgconf.%i.new", dest_filename, getpid ()); + orig_filename = xasprintf ("%s.gpgconf.%i.bak", dest_filename, getpid ()); + + arg = option->new_value; + if (arg && arg[0] == '\0') + arg = NULL; + else if (arg) + { + char *end; + + arg++; + end = strchr (arg, ','); + if (end) + *end = '\0'; + + cur_arg = percent_deescape (arg); + if (end) + { + *end = ','; + arg = end + 1; + } + else + arg = NULL; + } + +#if HAVE_W32_SYSTEM + res = 0; +#warning no backups for W32 yet - need to write a copy function +#else + res = link (dest_filename, orig_filename); +#endif + if (res < 0 && errno != ENOENT) + return -1; + if (res < 0) + { + xfree (orig_filename); + orig_filename = NULL; + } + + /* We now initialize the return strings, so the caller can do the + cleanup for us. */ + *src_filenamep = src_filename; + *dest_filenamep = dest_filename; + *orig_filenamep = orig_filename; + + /* Use open() so that we can use O_EXCL. */ + fd = open (src_filename, O_CREAT | O_EXCL | O_WRONLY, 0644); + if (fd < 0) + return -1; + src_file = fdopen (fd, "w"); + res = errno; + if (!src_file) + { + errno = res; + return -1; + } + + /* Only if ORIG_FILENAME is not NULL did the configuration file + exist already. In this case, we will copy its content into the + new configuration file, changing it to our liking in the + process. */ + if (orig_filename) + { + dest_file = fopen (dest_filename, "r"); + if (!dest_file) + goto change_file_one_err; + + while ((length = read_line (dest_file, &line, &line_len, NULL)) > 0) + { + int disable = 0; + char *start; + + if (!strncmp (marker, line, sizeof (marker) - 1)) + { + if (!in_marker) + in_marker = 1; + else + break; + } + + start = line; + while (*start == ' ' || *start == '\t') + start++; + if (*start && *start != '\r' && *start != '\n' && *start != '#') + { + char *end; + char *endp; + char saved_end; + + endp = start; + end = endp; + + /* Search for the end of the line. */ + while (*endp && *endp != '#' && *endp != '\r' && *endp != '\n') + { + endp++; + if (*endp && *endp != ' ' && *endp != '\t' + && *endp != '\r' && *endp != '\n' && *endp != '#') + end = endp + 1; + } + saved_end = *end; + *end = '\0'; + + if ((option->new_flags & GC_OPT_FLAG_DEFAULT) + || !cur_arg || strcmp (start, cur_arg)) + disable = 1; + else + { + /* Find next argument. */ + if (arg) + { + char *arg_end; + + arg++; + arg_end = strchr (arg, ','); + if (arg_end) + *arg_end = '\0'; + + cur_arg = percent_deescape (arg); + if (arg_end) + { + *arg_end = ','; + arg = arg_end + 1; + } + else + arg = NULL; + } + else + cur_arg = NULL; + } + + *end = saved_end; + } + + if (disable) + { + if (!in_marker) + { + fprintf (src_file, + "# GPGConf disabled this option here at %s\n", + asctimestamp (gnupg_get_time ())); + if (ferror (src_file)) + goto change_file_one_err; + fprintf (src_file, "# %s", line); + if (ferror (src_file)) + goto change_file_one_err; + } + } + else + { + fprintf (src_file, "%s", line); + if (ferror (src_file)) + goto change_file_one_err; + } + } + if (length < 0 || ferror (dest_file)) + goto change_file_one_err; + } + + if (!in_marker) + { + /* There was no marker. This is the first time we edit the + file. We add our own marker at the end of the file and + proceed. Note that we first write a newline, this guards us + against files which lack the newline at the end of the last + line, while it doesn't hurt us in all other cases. */ + fprintf (src_file, "\n%s\n", marker); + if (ferror (src_file)) + goto change_file_one_err; + } + + /* At this point, we have copied everything up to the end marker + into the new file, except for the arguments we are going to add. + Now, dump the new arguments and write the end marker, possibly + followed by the rest of the original file. */ + while (cur_arg) + { + fprintf (src_file, "%s\n", cur_arg); + + /* Find next argument. */ + if (arg) + { + char *end; + + arg++; + end = strchr (arg, ','); + if (end) + *end = '\0'; + + cur_arg = percent_deescape (arg); + if (end) + { + *end = ','; + arg = end + 1; + } + else + arg = NULL; + } + else + cur_arg = NULL; + } + + fprintf (src_file, "%s %s\n", marker, asctimestamp (gnupg_get_time ())); + if (ferror (src_file)) + goto change_file_one_err; + + if (!in_marker) + { + fprintf (src_file, "# GPGConf edited this configuration file.\n"); + if (ferror (src_file)) + goto change_file_one_err; + fprintf (src_file, "# It will disable options before this marked " + "block, but it will\n"); + if (ferror (src_file)) + goto change_file_one_err; + fprintf (src_file, "# never change anything below these lines.\n"); + if (ferror (src_file)) + goto change_file_one_err; + } + if (dest_file) + { + while ((length = read_line (dest_file, &line, &line_len, NULL)) > 0) + { + fprintf (src_file, "%s", line); + if (ferror (src_file)) + goto change_file_one_err; + } + if (length < 0 || ferror (dest_file)) + goto change_file_one_err; + } + xfree (line); + line = NULL; + + res = fclose (src_file); + if (res) + { + res = errno; + close (fd); + if (dest_file) + fclose (dest_file); + errno = res; + return -1; + } + close (fd); + if (dest_file) + { + res = fclose (dest_file); + if (res) + return -1; + } + return 0; + + change_file_one_err: + xfree (line); + res = errno; + if (src_file) + { + fclose (src_file); + close (fd); + } + if (dest_file) + fclose (dest_file); + errno = res; + return -1; +} + + +/* Create and verify the new configuration file for the specified + backend and component. Returns 0 on success and -1 on error. */ +static int +change_options_program (gc_component_t component, gc_backend_t backend, + char **src_filenamep, char **dest_filenamep, + char **orig_filenamep) +{ + static const char marker[] = "###+++--- GPGConf ---+++###"; + /* True if we are within the marker in the config file. */ + int in_marker = 0; + gc_option_t *option; + char *line = NULL; + size_t line_len; + ssize_t length; + int res; + int fd; + FILE *src_file = NULL; + FILE *dest_file = NULL; + char *src_filename; + char *dest_filename; + char *orig_filename; + + /* FIXME. Throughout the function, do better error reporting. */ + dest_filename = xstrdup (get_config_pathname (component, backend)); + src_filename = xasprintf ("%s.gpgconf.%i.new", dest_filename, getpid ()); + orig_filename = xasprintf ("%s.gpgconf.%i.bak", dest_filename, getpid ()); + +#if HAVE_W32_SYSTEM + res = 0; +#warning no backups for W32 yet - need to write a copy function +#else + res = link (dest_filename, orig_filename); +#endif + if (res < 0 && errno != ENOENT) + return -1; + if (res < 0) + { + xfree (orig_filename); + orig_filename = NULL; + } + + /* We now initialize the return strings, so the caller can do the + cleanup for us. */ + *src_filenamep = src_filename; + *dest_filenamep = dest_filename; + *orig_filenamep = orig_filename; + + /* Use open() so that we can use O_EXCL. */ + fd = open (src_filename, O_CREAT | O_EXCL | O_WRONLY, 0644); + if (fd < 0) + return -1; + src_file = fdopen (fd, "w"); + res = errno; + if (!src_file) + { + errno = res; + return -1; + } + + /* Only if ORIG_FILENAME is not NULL did the configuration file + exist already. In this case, we will copy its content into the + new configuration file, changing it to our liking in the + process. */ + if (orig_filename) + { + dest_file = fopen (dest_filename, "r"); + if (!dest_file) + goto change_one_err; + + while ((length = read_line (dest_file, &line, &line_len, NULL)) > 0) + { + int disable = 0; + char *start; + + if (!strncmp (marker, line, sizeof (marker) - 1)) + { + if (!in_marker) + in_marker = 1; + else + break; + } + + start = line; + while (*start == ' ' || *start == '\t') + start++; + if (*start && *start != '\r' && *start != '\n' && *start != '#') + { + char *end; + char saved_end; + + end = start; + while (*end && *end != ' ' && *end != '\t' + && *end != '\r' && *end != '\n' && *end != '#') + end++; + saved_end = *end; + *end = '\0'; + + option = find_option (component, start, backend); + *end = saved_end; + if (option && ((option->new_flags & GC_OPT_FLAG_DEFAULT) + || option->new_value)) + disable = 1; + } + if (disable) + { + if (!in_marker) + { + fprintf (src_file, + "# GPGConf disabled this option here at %s\n", + asctimestamp (gnupg_get_time ())); + if (ferror (src_file)) + goto change_one_err; + fprintf (src_file, "# %s", line); + if (ferror (src_file)) + goto change_one_err; + } + } + else + { + fprintf (src_file, "%s", line); + if (ferror (src_file)) + goto change_one_err; + } + } + if (length < 0 || ferror (dest_file)) + goto change_one_err; + } + + if (!in_marker) + { + /* There was no marker. This is the first time we edit the + file. We add our own marker at the end of the file and + proceed. Note that we first write a newline, this guards us + against files which lack the newline at the end of the last + line, while it doesn't hurt us in all other cases. */ + fprintf (src_file, "\n%s\n", marker); + if (ferror (src_file)) + goto change_one_err; + } + /* At this point, we have copied everything up to the end marker + into the new file, except for the options we are going to change. + Now, dump the changed options (except for those we are going to + revert to their default), and write the end marker, possibly + followed by the rest of the original file. */ + + /* We have to turn on UTF8 strings for GnuPG. */ + if (backend == GC_BACKEND_GPG) + fprintf (src_file, "utf8-strings\n"); + + option = gc_component[component].options; + while (option->name) + { + if (!(option->flags & GC_OPT_FLAG_GROUP) + && option->backend == backend + && option->new_value) + { + char *arg = option->new_value; + + do + { + if (*arg == '\0' || *arg == ',') + { + fprintf (src_file, "%s\n", option->name); + if (ferror (src_file)) + goto change_one_err; + } + else if (gc_arg_type[option->arg_type].fallback + == GC_ARG_TYPE_NONE) + { + assert (*arg == '1'); + fprintf (src_file, "%s\n", option->name); + if (ferror (src_file)) + goto change_one_err; + + arg++; + } + else if (gc_arg_type[option->arg_type].fallback + == GC_ARG_TYPE_STRING) + { + char *end; + + assert (*arg == '"'); + arg++; + + end = strchr (arg, ','); + if (end) + *end = '\0'; + + fprintf (src_file, "%s %s\n", option->name, + percent_deescape (arg)); + if (ferror (src_file)) + goto change_one_err; + + if (end) + *end = ','; + arg = end; + } + else + { + char *end; + + end = strchr (arg, ','); + if (end) + *end = '\0'; + + fprintf (src_file, "%s %s\n", option->name, arg); + if (ferror (src_file)) + goto change_one_err; + + if (end) + *end = ','; + arg = end; + } + + assert (arg == NULL || *arg == '\0' || *arg == ','); + if (arg && *arg == ',') + arg++; + } + while (arg && *arg); + } + option++; + } + + fprintf (src_file, "%s %s\n", marker, asctimestamp (gnupg_get_time ())); + if (ferror (src_file)) + goto change_one_err; + + if (!in_marker) + { + fprintf (src_file, "# GPGConf edited this configuration file.\n"); + if (ferror (src_file)) + goto change_one_err; + fprintf (src_file, "# It will disable options before this marked " + "block, but it will\n"); + if (ferror (src_file)) + goto change_one_err; + fprintf (src_file, "# never change anything below these lines.\n"); + if (ferror (src_file)) + goto change_one_err; + } + if (dest_file) + { + while ((length = read_line (dest_file, &line, &line_len, NULL)) > 0) + { + fprintf (src_file, "%s", line); + if (ferror (src_file)) + goto change_one_err; + } + if (length < 0 || ferror (dest_file)) + goto change_one_err; + } + xfree (line); + line = NULL; + + res = fclose (src_file); + if (res) + { + res = errno; + close (fd); + if (dest_file) + fclose (dest_file); + errno = res; + return -1; + } + close (fd); + if (dest_file) + { + res = fclose (dest_file); + if (res) + return -1; + } + return 0; + + change_one_err: + xfree (line); + res = errno; + if (src_file) + { + fclose (src_file); + close (fd); + } + if (dest_file) + fclose (dest_file); + errno = res; + return -1; +} + + +/* Read the modifications from IN and apply them. */ +void +gc_component_change_options (int component, FILE *in) +{ + int err = 0; + int runtime[GC_BACKEND_NR]; + char *src_pathname[GC_BACKEND_NR]; + char *dest_pathname[GC_BACKEND_NR]; + char *orig_pathname[GC_BACKEND_NR]; + gc_backend_t backend; + gc_option_t *option; + char *line = NULL; + size_t line_len = 0; + ssize_t length; + + for (backend = 0; backend < GC_BACKEND_NR; backend++) + { + runtime[backend] = 0; + src_pathname[backend] = NULL; + dest_pathname[backend] = NULL; + orig_pathname[backend] = NULL; + } + + while ((length = read_line (in, &line, &line_len, NULL)) > 0) + { + char *linep; + unsigned long flags = 0; + char *new_value = ""; + unsigned long new_value_nr = 0; + + /* Strip newline and carriage return, if present. */ + while (length > 0 + && (line[length - 1] == '\n' || line[length - 1] == '\r')) + line[--length] = '\0'; + + linep = strchr (line, ':'); + if (linep) + *(linep++) = '\0'; + + /* Extract additional flags. Default to none. */ + if (linep) + { + char *end; + char *tail; + + end = strchr (linep, ':'); + if (end) + *(end++) = '\0'; + + errno = 0; + flags = strtoul (linep, &tail, 0); + if (errno) + gc_error (1, errno, "malformed flags in option %s", line); + if (!(*tail == '\0' || *tail == ':' || *tail == ' ')) + gc_error (1, 0, "garbage after flags in option %s", line); + + linep = end; + } + + /* Extract default value, if present. Default to empty if + not. */ + if (linep) + { + char *end; + + end = strchr (linep, ':'); + if (end) + *(end++) = '\0'; + + new_value = linep; + + linep = end; + } + + option = find_option (component, line, GC_BACKEND_ANY); + if (!option) + gc_error (1, 0, "unknown option %s", line); + + option_check_validity (option, flags, new_value, &new_value_nr); + + if (option->flags & GC_OPT_FLAG_RUNTIME) + runtime[option->backend] = 1; + + option->new_flags = flags; + if (!(flags & GC_OPT_FLAG_DEFAULT)) + { + if (gc_arg_type[option->arg_type].fallback == GC_ARG_TYPE_NONE + && (option->flags & GC_OPT_FLAG_LIST)) + { + char *str; + + /* We convert the number to a list of 1's for + convenient list handling. */ + assert (new_value_nr > 0); + option->new_value = xmalloc ((2 * (new_value_nr - 1) + 1) + 1); + str = option->new_value; + *(str++) = '1'; + while (--new_value_nr > 0) + { + *(str++) = ','; + *(str++) = '1'; + } + *(str++) = '\0'; + } + else + option->new_value = xstrdup (new_value); + } + } + + /* Now that we have collected and locally verified the changes, + write them out to new configuration files, verify them + externally, and then commit them. */ + option = gc_component[component].options; + while (option->name) + { + /* Go on if we have already seen this backend, or if there is + nothing to do. */ + if (src_pathname[option->backend] + || !(option->new_flags || option->new_value)) + { + option++; + continue; + } + + if (gc_backend[option->backend].program) + err = change_options_program (component, option->backend, + &src_pathname[option->backend], + &dest_pathname[option->backend], + &orig_pathname[option->backend]); + else + err = change_options_file (component, option->backend, + &src_pathname[option->backend], + &dest_pathname[option->backend], + &orig_pathname[option->backend]); + + if (err) + break; + + option++; + } + + if (!err) + { + int i; + + for (i = 0; i < GC_BACKEND_NR; i++) + { + if (src_pathname[i]) + { + /* FIXME: Make a verification here. */ + + assert (dest_pathname[i]); + + if (orig_pathname[i]) + err = rename (src_pathname[i], dest_pathname[i]); + else + { +#ifdef HAVE_W32_SYSTEM + /* FIXME: Won't work becuase W32 doesn't silently + overwrite. Fix it by creating a backup copy and + deliting the orginal file first. */ + err = rename (src_pathname[i], dest_pathname[i]); +#else /*!HAVE_W32_SYSTEM*/ + /* This is a bit safer than rename() because we + expect DEST_PATHNAME not to be there. If it + happens to be there, this will fail. */ + err = link (src_pathname[i], dest_pathname[i]); + if (!err) + unlink (src_pathname[i]); +#endif /*!HAVE_W32_SYSTEM*/ + } + if (err) + break; + src_pathname[i] = NULL; + } + } + } + + if (err) + { + int i; + int saved_errno = errno; + + /* An error occured. */ + for (i = 0; i < GC_BACKEND_NR; i++) + { + if (src_pathname[i]) + { + /* The change was not yet committed. */ + unlink (src_pathname[i]); + if (orig_pathname[i]) + unlink (orig_pathname[i]); + } + else + { + /* The changes were already committed. FIXME: This is a + tad dangerous, as we don't know if we don't overwrite + a version of the file that is even newer than the one + we just installed. */ + if (orig_pathname[i]) + rename (orig_pathname[i], dest_pathname[i]); + else + unlink (dest_pathname[i]); + } + } + gc_error (1, saved_errno, "could not commit changes"); + } + + /* If it all worked, notify the daemons of the changes. */ + if (opt.runtime) + for (backend = 0; backend < GC_BACKEND_NR; backend++) + { + if (runtime[backend] && gc_backend[backend].runtime_change) + (*gc_backend[backend].runtime_change) (); + } + + /* Move the per-process backup file into its place. */ + for (backend = 0; backend < GC_BACKEND_NR; backend++) + if (orig_pathname[backend]) + { + char *backup_pathname; + + assert (dest_pathname[backend]); + + backup_pathname = xasprintf ("%s.gpgconf.bak", dest_pathname[backend]); + rename (orig_pathname[backend], backup_pathname); + } + + xfree (line); +} diff --git a/tools/gpgconf.c b/tools/gpgconf.c new file mode 100644 index 000000000..87ba45ae1 --- /dev/null +++ b/tools/gpgconf.c @@ -0,0 +1,203 @@ +/* gpgconf.c - Configuration utility for GnuPG + * 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 <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "gpgconf.h" +#include "i18n.h" + +/* Constants to identify the commands and options. */ +enum cmd_and_opt_values + { + aNull = 0, + oDryRun = 'n', + oOutput = 'o', + oQuiet = 'q', + oVerbose = 'v', + oRuntime = 'r', + oComponent = 'c', + oNoVerbose = 500, + oHomedir, + + aListComponents, + aListOptions, + aChangeOptions, + + }; + + +/* The list of commands and options. */ +static ARGPARSE_OPTS opts[] = + { + { 300, NULL, 0, N_("@Commands:\n ") }, + + { aListComponents, "list-components", 256, N_("list all components") }, + { aListOptions, "list-options", 256, N_("|COMPONENT|list options") }, + { aChangeOptions, "change-options", 256, N_("|COMPONENT|change options") }, + + { 301, NULL, 0, N_("@\nOptions:\n ") }, + + { oOutput, "output", 2, N_("use as output file") }, + { oVerbose, "verbose", 0, N_("verbose") }, + { oQuiet, "quiet", 0, N_("quiet") }, + { oDryRun, "dry-run", 0, N_("do not make any changes") }, + { oRuntime, "runtime", 0, N_("activate changes at runtime, if possible") }, + + /* hidden options */ + { oNoVerbose, "no-verbose", 0, "@"}, + {0} + }; + + +/* Print usage information and and provide strings for help. */ +static const char * +my_strusage( int level ) +{ + const char *p; + + switch (level) + { + case 11: p = "gpgconf (GnuPG)"; + break; + case 13: p = VERSION; break; + case 17: p = PRINTABLE_OS_NAME; break; + case 19: p = _("Please report bugs to <" PACKAGE_BUGREPORT ">.\n"); + break; + case 1: + case 40: p = _("Usage: gpgconf [options] (-h for help)"); + break; + case 41: + p = _("Syntax: gpgconf [options]\n" + "Manage configuration options for tools of the GnuPG system\n"); + break; + + default: p = NULL; break; + } + return p; +} + + +/* Initialize the gettext system. */ +static void +i18n_init(void) +{ +#ifdef USE_SIMPLE_GETTEXT + set_gettext_file (PACKAGE_GT); +#else +# ifdef ENABLE_NLS + setlocale (LC_ALL, "" ); + bindtextdomain (PACKAGE_GT, LOCALEDIR); + textdomain (PACKAGE_GT); +# endif +#endif +} + + +/* gpgconf main. */ +int +main (int argc, char **argv) +{ + ARGPARSE_ARGS pargs; + const char *fname; + int no_more_options = 0; + enum cmd_and_opt_values cmd = 0; + + set_strusage (my_strusage); + log_set_prefix ("gpgconf", 1); + + i18n_init(); + + /* Parse the command line. */ + pargs.argc = &argc; + pargs.argv = &argv; + pargs.flags = 1; /* Do not remove the args. */ + while (!no_more_options && optfile_parse (NULL, NULL, NULL, &pargs, opts)) + { + switch (pargs.r_opt) + { + case oOutput: opt.outfile = pargs.r.ret_str; break; + case oQuiet: opt.quiet = 1; break; + case oDryRun: opt.dry_run = 1; break; + case oRuntime: + opt.runtime = 1; + break; + case oVerbose: opt.verbose++; break; + case oNoVerbose: opt.verbose = 0; break; + + case aListComponents: + case aListOptions: + case aChangeOptions: + cmd = pargs.r_opt; + break; + + default: pargs.err = 2; break; + } + } + + if (log_get_errorcount (0)) + exit (2); + + fname = argc ? *argv : NULL; + + switch (cmd) + { + case aListComponents: + default: + /* List all components. */ + gc_component_list_components (stdout); + break; + + case aListOptions: + case aChangeOptions: + if (!fname) + { + fputs (_("usage: gpgconf [options] "), stderr); + putc ('\n',stderr); + fputs (_("Need one component argument"), stderr); + putc ('\n',stderr); + exit (2); + } + else + { + int idx = gc_component_find (fname); + if (idx < 0) + { + fputs (_("Component not found"), stderr); + putc ('\n', stderr); + exit (1); + } + gc_component_retrieve_options (idx); + if (cmd == aListOptions) + gc_component_list_options (idx, stdout); + else + gc_component_change_options (idx, stdin); + } + } + + return 0; +} + + + diff --git a/tools/gpgconf.h b/tools/gpgconf.h new file mode 100644 index 000000000..c083c26aa --- /dev/null +++ b/tools/gpgconf.h @@ -0,0 +1,59 @@ +/* gpgconf.h - Global definitions for gpgconf + * 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 GPGCONF_H +#define GPGCONF_H + +#include "../common/util.h" + +/* We keep all global options in the structure OPT. */ +struct +{ + int verbose; /* Verbosity level. */ + int quiet; /* Be extra quiet. */ + int dry_run; /* Don't change any persistent data. */ + int runtime; /* Make changes active at runtime. */ + char *outfile; /* Name of output file. */ + + int component; /* The active component. */ +} opt; + + + +/*-- gpgconf-comp.c --*/ +/* List all components that are available. */ +void gc_component_list_components (FILE *out); + +/* Find the component with the name NAME. Returns -1 if not + found. */ +int gc_component_find (const char *name); + +/* Retrieve the currently active options and their defaults from all + involved backends for this component. */ +void gc_component_retrieve_options (int component); + +/* List all options of the component COMPONENT. */ +void gc_component_list_options (int component, FILE *out); + +/* Read the modifications from IN and apply them. */ +void gc_component_change_options (int component, FILE *in); + +#endif /*GPGCONF_H*/ diff --git a/tools/gpgkey2ssh.c b/tools/gpgkey2ssh.c new file mode 100644 index 000000000..3dcb6516e --- /dev/null +++ b/tools/gpgkey2ssh.c @@ -0,0 +1,298 @@ +/* gpgkey2ssh.c - Converter ... + * 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 <gcrypt.h> +#include <unistd.h> +#include <stdlib.h> +#include <assert.h> +#include <stdio.h> +#include <errno.h> + +#include "util.h" + + + +typedef struct pkdbuf +{ + unsigned char *buffer; + size_t buffer_n; +} pkdbuf_t; + + + +/* Retrieve the public key material for the RSA key, whose fingerprint + is FPR, from gpg output, which can be read through the stream FP. + The RSA modulus will be stored at the address of M and MLEN, the + public exponent at E and ELEN. Returns zero on success, an error + code on failure. Caller must release the allocated buffers at M + and E if the function returns success. */ +static gpg_error_t +retrieve_key_material (FILE *fp, const char *hexkeyid, int *algorithm_id, + pkdbuf_t **pkdbuf, size_t *pkdbuf_n) +{ + pkdbuf_t *pkdbuf_new; + pkdbuf_t *pkdbuf_tmp; + size_t pkdbuf_new_n; + gcry_error_t err = 0; + char *line = NULL; /* read_line() buffer. */ + size_t line_size = 0; /* Helper for for read_line. */ + int found_key = 0; /* Helper to find a matching key. */ + int id; + unsigned char *buffer; + size_t buffer_n; + int i; + + pkdbuf_new = NULL; + pkdbuf_new_n = 0; + id = 0; + + /* Loop over all records until we have found the subkey + 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; + + 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 && + (((strlen (hexkeyid) == 8) + && (strlen (fields[4]) == 16) + && (! strcmp (fields[4] + 8, hexkeyid))) + || ((strlen (hexkeyid) == 16) + && (! strcmp (fields[4], hexkeyid))))) + { + found_key = 1; + /* Save algorithm ID. */ + id = atoi (fields[3]); + } + continue; + } + + if ( !strcmp (fields[0], "sub") || !strcmp (fields[0], "pub") ) + break; /* Next key - stop. */ + + if ( strcmp (fields[0], "pkd") ) + continue; /* Not a key data record. */ + + /* FIXME, necessary? */ + + i = atoi (fields[1]); + if ((nfields < 4) || (i < 0)) + { + err = gpg_error (GPG_ERR_GENERAL); + goto leave; + } + + err = gcry_mpi_scan (&mpi, GCRYMPI_FMT_HEX, fields[3], 0, NULL); + if (err) + mpi = NULL; + + err = gcry_mpi_aprint (GCRYMPI_FMT_STD, &buffer, &buffer_n, mpi); + gcry_mpi_release (mpi); + if (err) + goto leave; + + pkdbuf_tmp = xrealloc (pkdbuf_new, sizeof (*pkdbuf_new) * (pkdbuf_new_n + 1)); + if (pkdbuf_new != pkdbuf_tmp) + pkdbuf_new = pkdbuf_tmp; + pkdbuf_new[pkdbuf_new_n].buffer = buffer; + pkdbuf_new[pkdbuf_new_n].buffer_n = buffer_n; + pkdbuf_new_n++; + } + + *algorithm_id = id; + *pkdbuf = pkdbuf_new; + *pkdbuf_n = pkdbuf_new_n; + + leave: + + if (err) + if (pkdbuf_new) + { + for (i = 0; i < pkdbuf_new_n; i++) + xfree (pkdbuf_new[i].buffer); + xfree (pkdbuf_new); + } + xfree (line); + + return err; +} + + + +int +key_to_blob (unsigned char **blob, size_t *blob_n, const char *identifier, ...) +{ + unsigned char *blob_new; + size_t blob_new_n; + unsigned char uint32_buffer[4]; + u32 identifier_n; + FILE *stream; + va_list ap; + int ret; + pkdbuf_t *pkd; + + stream = tmpfile (); + assert (stream); + + identifier_n = strlen (identifier); + uint32_buffer[0] = identifier_n >> 24; + uint32_buffer[1] = identifier_n >> 16; + uint32_buffer[2] = identifier_n >> 8; + uint32_buffer[3] = identifier_n >> 0; + ret = fwrite (uint32_buffer, sizeof (uint32_buffer), 1, stream); + assert (ret == 1); + ret = fwrite (identifier, identifier_n, 1, stream); + assert (ret == 1); + + va_start (ap, identifier); + while (1) + { + pkd = va_arg (ap, pkdbuf_t *); + if (! pkd) + break; + + uint32_buffer[0] = pkd->buffer_n >> 24; + uint32_buffer[1] = pkd->buffer_n >> 16; + uint32_buffer[2] = pkd->buffer_n >> 8; + uint32_buffer[3] = pkd->buffer_n >> 0; + ret = fwrite (uint32_buffer, sizeof (uint32_buffer), 1, stream); + assert (ret == 1); + ret = fwrite (pkd->buffer, pkd->buffer_n, 1, stream); + assert (ret == 1); + } + + blob_new_n = ftell (stream); + rewind (stream); + + blob_new = xmalloc (blob_new_n); + ret = fread (blob_new, blob_new_n, 1, stream); + assert (ret == 1); + + *blob = blob_new; + *blob_n = blob_new_n; + + fclose (stream); + + return 0; +} + +int +main (int argc, char **argv) +{ + const char *keyid; + int algorithm_id; + pkdbuf_t *pkdbuf; + size_t pkdbuf_n; + char *command; + FILE *fp; + int ret; + gcry_error_t err; + unsigned char *blob; + size_t blob_n; + struct b64state b64_state; + const char *identifier; + + pkdbuf = NULL; + pkdbuf_n = 0; + + algorithm_id = 0; /* (avoid cc warning) */ + identifier = NULL; /* (avoid cc warning) */ + + assert (argc == 2); + + keyid = argv[1]; + + ret = asprintf (&command, + "gpg --list-keys --with-colons --with-key-data '%s'", + keyid); + assert (ret > 0); + + fp = popen (command, "r"); + assert (fp); + + err = retrieve_key_material (fp, keyid, &algorithm_id, &pkdbuf, &pkdbuf_n); + assert (! err); + assert ((algorithm_id == 1) || (algorithm_id == 17)); + + if (algorithm_id == 1) + { + identifier = "ssh-rsa"; + ret = key_to_blob (&blob, &blob_n, identifier, + &pkdbuf[0], &pkdbuf[1], NULL); + } + else if (algorithm_id == 17) + { + identifier = "ssh-dsa"; + ret = key_to_blob (&blob, &blob_n, identifier, + &pkdbuf[0], &pkdbuf[1], &pkdbuf[2], &pkdbuf[3], NULL); + } + assert (! ret); + + printf ("%s ", identifier); + + err = b64enc_start (&b64_state, stdout, ""); + assert (! err); + err = b64enc_write (&b64_state, blob, blob_n); + assert (! err); + err = b64enc_finish (&b64_state); + assert (! err); + + printf (" COMMENT\n"); + + return 0; +} diff --git a/tools/gpgparsemail.c b/tools/gpgparsemail.c new file mode 100644 index 000000000..30759f9a4 --- /dev/null +++ b/tools/gpgparsemail.c @@ -0,0 +1,767 @@ +/* gpgparsemail.c - Standalone crypto mail parser + * 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. + */ + + +/* This utility prints an RFC8222, possible MIME structured, message + in an annotated format with the first column having an indicator + for the content of the line. Several options are available to + scrutinize the message. S/MIME and OpenPGP support is included. */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <stddef.h> +#include <string.h> +#include <errno.h> +#include <stdarg.h> +#include <assert.h> +#include <time.h> +#include <signal.h> +#include <unistd.h> +#include <fcntl.h> +#include <sys/wait.h> + +#include "rfc822parse.h" + + +#define PGM "gpgparsemail" + +/* Option flags. */ +static int verbose; +static int debug; +static int opt_crypto; /* Decrypt or verify messages. */ +static int opt_no_header; /* Don't output the header lines. */ + +/* Structure used to communicate with the parser callback. */ +struct parse_info_s { + int show_header; /* Show the header lines. */ + int show_data; /* Show the data lines. */ + unsigned int skip_show; /* Temporary disable above for these + number of lines. */ + int show_data_as_note; /* The next data line should be shown + as a note. */ + int show_boundary; + int nesting_level; + + int is_pkcs7; /* Old style S/MIME message. */ + + int gpgsm_mime; /* gpgsm shall be used from S/MIME. */ + char *signing_protocol; + int hashing_level; /* The nesting level we are hashing. */ + int hashing; + FILE *hash_file; + + FILE *sig_file; /* Signature part with MIME or full + pkcs7 data if IS_PCKS7 is set. */ + int verify_now; /* Flag set when all signature data is + available. */ +}; + + +/* 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); + 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; +} + +#ifndef HAVE_STPCPY +static char * +stpcpy (char *a,const char *b) +{ + while (*b) + *a++ = *b++; + *a = 0; + + return (char*)a; +} +#endif + +static int +run_gnupg (int smime, int sig_fd, int data_fd, int *close_list) +{ + int rp[2]; + pid_t pid; + int i, c, is_status; + unsigned int pos; + char status_buf[10]; + const char *cmd = smime? "gpgsm":"gpg"; + FILE *fp; + + if (pipe (rp) == -1) + die ("error creating a pipe: %s", strerror (errno)); + + pid = fork (); + if (pid == -1) + die ("error forking process: %s", strerror (errno)); + + if (!pid) + { /* Child. */ + char data_fd_buf[50]; + int fd; + + /* Connect our signature fd to stdin. */ + if (sig_fd != 0) + { + if (dup2 (sig_fd, 0) == -1) + die ("dup2 stdin failed: %s", strerror (errno)); + } + + /* Keep our data fd and format it for gpg/gpgsm use. */ + if (data_fd == -1) + *data_fd_buf = 0; + else + sprintf (data_fd_buf, "-&%d", data_fd); + + /* Send stdout to the bit bucket. */ + fd = open ("/dev/null", O_WRONLY); + if (fd == -1) + die ("can't open `/dev/null': %s", strerror (errno)); + if (fd != 1) + { + if (dup2 (fd, 1) == -1) + die ("dup2 stderr failed: %s", strerror (errno)); + } + + /* Connect stderr to our pipe. */ + if (rp[1] != 2) + { + if (dup2 (rp[1], 2) == -1) + die ("dup2 stderr failed: %s", strerror (errno)); + } + + /* Close other files. */ + for (i=0; (fd=close_list[i]) != -1; i++) + if (fd > 2 && fd != data_fd) + close (fd); + errno = 0; + + execlp (cmd, cmd, + "--enable-special-filenames", + "--status-fd", "2", + "--assume-base64", + "--verify", + "--", + "-", data_fd == -1? NULL : data_fd_buf, + NULL); + + die ("failed to exec the crypto command: %s", strerror (errno)); + } + + /* Parent. */ + close (rp[1]); + + fp = fdopen (rp[0], "r"); + if (!fp) + die ("can't fdopen pipe for reading: %s", strerror (errno)); + + pos = 0; + is_status = 0; + assert (sizeof status_buf > 9); + while ((c=getc (fp)) != EOF) + { + if (pos < 9) + status_buf[pos] = c; + else + { + if (pos == 9) + { + is_status = !memcmp (status_buf, "[GNUPG:] ", 9); + if (is_status) + fputs ( "c ", stdout); + else if (verbose) + fputs ( "# ", stdout); + fwrite (status_buf, 9, 1, stdout); + } + putchar (c); + } + if (c == '\n') + { + if (verbose && pos < 9) + { + fputs ( "# ", stdout); + fwrite (status_buf, pos+1, 1, stdout); + } + pos = 0; + } + else + pos++; + } + if (pos) + { + if (verbose && pos < 9) + { + fputs ( "# ", stdout); + fwrite (status_buf, pos+1, 1, stdout); + } + putchar ('\n'); + } + fclose (fp); + + while ( (i=waitpid (pid, NULL, 0)) == -1 && errno == EINTR) + ; + if (i == -1) + die ("waiting for child failed: %s", strerror (errno)); + + return 0; +} + + + + +/* Verify the signature in the current temp files. */ +static void +verify_signature (struct parse_info_s *info) +{ + int close_list[10]; + + if (info->is_pkcs7) + { + assert (!info->hash_file); + assert (info->sig_file); + rewind (info->sig_file); + } + else + { + assert (info->hash_file); + assert (info->sig_file); + rewind (info->hash_file); + rewind (info->sig_file); + } + +/* printf ("# Begin hashed data\n"); */ +/* while ( (c=getc (info->hash_file)) != EOF) */ +/* putchar (c); */ +/* printf ("# End hashed data signature\n"); */ +/* printf ("# Begin signature\n"); */ +/* while ( (c=getc (info->sig_file)) != EOF) */ +/* putchar (c); */ +/* printf ("# End signature\n"); */ +/* rewind (info->hash_file); */ +/* rewind (info->sig_file); */ + + close_list[0] = -1; + run_gnupg (1, fileno (info->sig_file), + info->hash_file ? fileno (info->hash_file) : -1, close_list); +} + + + + + +/* Prepare for a multipart/signed. + FIELD_CTX is the parsed context of the content-type header.*/ +static void +mime_signed_begin (struct parse_info_s *info, rfc822parse_t msg, + rfc822parse_field_t field_ctx) +{ + const char *s; + s = rfc822parse_query_parameter (field_ctx, "protocol", 1); + if (s) + { + printf ("h signed.protocol: %s\n", s); + if (!strcmp (s, "application/pkcs7-signature") + || !strcmp (s, "application/x-pkcs7-signature")) + { + if (info->gpgsm_mime) + err ("note: ignoring nested pkcs7-signature"); + else + { + info->gpgsm_mime = 1; + free (info->signing_protocol); + info->signing_protocol = xstrdup (s); + } + } + else if (verbose) + printf ("# this protocol is not supported\n"); + } +} + + +/* Prepare for a multipart/encrypted. + FIELD_CTX is the parsed context of the content-type header.*/ +static void +mime_encrypted_begin (struct parse_info_s *info, rfc822parse_t msg, + rfc822parse_field_t field_ctx) +{ + const char *s; + s = rfc822parse_query_parameter (field_ctx, "protocol", 0); + if (s) + printf ("h encrypted.protocol: %s\n", s); +} + + +/* Prepare for old-style pkcs7 messages. */ +static void +pkcs7_begin (struct parse_info_s *info, rfc822parse_t msg, + rfc822parse_field_t field_ctx) +{ + const char *s; + s = rfc822parse_query_parameter (field_ctx, "name", 0); + if (s) + printf ("h pkcs7.name: %s\n", s); + if (info->is_pkcs7) + err ("note: ignoring nested pkcs7 data"); + else + { + info->is_pkcs7 = 1; + if (opt_crypto) + { + assert (!info->sig_file); + info->sig_file = tmpfile (); + if (!info->sig_file) + die ("error creating temp file: %s", strerror (errno)); + } + } +} + + +/* Print the event received by the parser for debugging as comment + line. */ +static void +show_event (rfc822parse_event_t event) +{ + const char *s; + + switch (event) + { + case RFC822PARSE_OPEN: s= "Open"; break; + case RFC822PARSE_CLOSE: s= "Close"; break; + case RFC822PARSE_CANCEL: s= "Cancel"; break; + case RFC822PARSE_T2BODY: s= "T2Body"; break; + case RFC822PARSE_FINISH: s= "Finish"; break; + case RFC822PARSE_RCVD_SEEN: s= "Rcvd_Seen"; break; + case RFC822PARSE_LEVEL_DOWN: s= "Level_Down"; break; + case RFC822PARSE_LEVEL_UP: s= "Level_Up"; break; + case RFC822PARSE_BOUNDARY: s= "Boundary"; break; + case RFC822PARSE_LAST_BOUNDARY: s= "Last_Boundary"; break; + case RFC822PARSE_BEGIN_HEADER: s= "Begin_Header"; break; + case RFC822PARSE_PREAMBLE: s= "Preamble"; break; + case RFC822PARSE_EPILOGUE: s= "Epilogue"; break; + default: s= "[unknown event]"; break; + } + printf ("# *** got RFC822 event %s\n", s); +} + +/* This function is called by the parser to communicate events. This + callback comminucates with the main program using a structure + passed in OPAQUE. Should retrun 0 or set errno and return -1. */ +static int +message_cb (void *opaque, rfc822parse_event_t event, rfc822parse_t msg) +{ + struct parse_info_s *info = opaque; + + if (debug) + show_event (event); + if (event == RFC822PARSE_OPEN) + { + /* Initialize for a new message. */ + info->show_header = 1; + } + else if (event == RFC822PARSE_T2BODY) + { + rfc822parse_field_t ctx; + + ctx = rfc822parse_parse_field (msg, "Content-Type", -1); + if (ctx) + { + const char *s1, *s2; + s1 = rfc822parse_query_media_type (ctx, &s2); + if (s1) + { + printf ("h media: %*s%s %s\n", + info->nesting_level*2, "", s1, s2); + if (info->gpgsm_mime == 3) + { + char *buf = xmalloc (strlen (s1) + strlen (s2) + 2); + strcpy (stpcpy (stpcpy (buf, s1), "/"), s2); + assert (info->signing_protocol); + if (strcmp (buf, info->signing_protocol)) + err ("invalid S/MIME structure; expected `%s', found `%s'", + info->signing_protocol, buf); + else + { + printf ("c begin_signature\n"); + info->gpgsm_mime++; + if (opt_crypto) + { + assert (!info->sig_file); + info->sig_file = tmpfile (); + if (!info->sig_file) + die ("error creating temp file: %s", + strerror (errno)); + } + } + free (buf); + } + else if (!strcmp (s1, "multipart")) + { + if (!strcmp (s2, "signed")) + mime_signed_begin (info, msg, ctx); + else if (!strcmp (s2, "encrypted")) + mime_encrypted_begin (info, msg, ctx); + } + else if (!strcmp (s1, "application") + && (!strcmp (s2, "pkcs7-mime") + || !strcmp (s2, "x-pkcs7-mime"))) + pkcs7_begin (info, msg, ctx); + } + else + printf ("h media: %*s none\n", info->nesting_level*2, ""); + + rfc822parse_release_field (ctx); + } + else + printf ("h media: %*stext plain [assumed]\n", + info->nesting_level*2, ""); + info->show_header = 0; + info->show_data = 1; + info->skip_show = 1; + } + else if (event == RFC822PARSE_PREAMBLE) + info->show_data_as_note = 1; + else if (event == RFC822PARSE_LEVEL_DOWN) + { + printf ("b down\n"); + info->nesting_level++; + } + else if (event == RFC822PARSE_LEVEL_UP) + { + printf ("b up\n"); + if (info->nesting_level) + info->nesting_level--; + else + err ("invalid structure (bad nesting level)"); + } + else if (event == RFC822PARSE_BOUNDARY || event == RFC822PARSE_LAST_BOUNDARY) + { + info->show_data = 0; + info->show_boundary = 1; + if (event == RFC822PARSE_BOUNDARY) + { + info->show_header = 1; + info->skip_show = 1; + printf ("b part\n"); + } + else + printf ("b last\n"); + + if (info->gpgsm_mime == 2 && info->nesting_level == info->hashing_level) + { + printf ("c end_hash\n"); + info->gpgsm_mime++; + info->hashing = 0; + } + else if (info->gpgsm_mime == 4) + { + printf ("c end_signature\n"); + info->verify_now = 1; + } + } + else if (event == RFC822PARSE_BEGIN_HEADER) + { + if (info->gpgsm_mime == 1) + { + printf ("c begin_hash\n"); + info->hashing = 1; + info->hashing_level = info->nesting_level; + info->gpgsm_mime++; + + if (opt_crypto) + { + assert (!info->hash_file); + info->hash_file = tmpfile (); + if (!info->hash_file) + die ("failed to create temporary file: %s", strerror (errno)); + } + } + } + + return 0; +} + + +/* Read a message from FP and process it according to the global + options. */ +static void +parse_message (FILE *fp) +{ + char line[5000]; + size_t length; + rfc822parse_t msg; + unsigned int lineno = 0; + int no_cr_reported = 0; + struct parse_info_s info; + + memset (&info, 0, sizeof info); + + msg = rfc822parse_open (message_cb, &info); + if (!msg) + die ("can't open parser: %s", strerror (errno)); + + /* Fixme: We should not use fgets becuase it can't cope with + embedded nul characters. */ + while (fgets (line, sizeof (line), fp)) + { + lineno++; + if (lineno == 1 && !strncmp (line, "From ", 5)) + continue; /* We better ignore a leading From line. */ + + length = strlen (line); + if (length && line[length - 1] == '\n') + line[--length] = 0; + else + err ("line number %u too long or last line not terminated", lineno); + if (length && line[length - 1] == '\r') + line[--length] = 0; + else if (verbose && !no_cr_reported) + { + err ("non canonical ended line detected (line %u)", lineno); + no_cr_reported = 1; + } + + + if (rfc822parse_insert (msg, line, length)) + die ("parser failed: %s", strerror (errno)); + + if (info.hashing) + { + /* Delay hashing of the CR/LF because the last line ending + belongs to the next boundary. */ + if (debug) + printf ("# hashing %s`%s'\n", info.hashing==2?"CR,LF+":"", line); + if (opt_crypto) + { + if (info.hashing == 2) + fputs ("\r\n", info.hash_file); + fputs (line, info.hash_file); + if (ferror (info.hash_file)) + die ("error writing to temporary file: %s", strerror (errno)); + } + + info.hashing = 2; + } + + if (info.sig_file && opt_crypto) + { + if (info.verify_now) + { + verify_signature (&info); + if (info.hash_file) + fclose (info.hash_file); + info.hash_file = NULL; + fclose (info.sig_file); + info.sig_file = NULL; + info.gpgsm_mime = 0; + info.is_pkcs7 = 0; + } + else + { + fputs (line, info.sig_file); + fputs ("\r\n", info.sig_file); + if (ferror (info.sig_file)) + die ("error writing to temporary file: %s", strerror (errno)); + } + } + + if (info.show_boundary) + { + if (!opt_no_header) + printf (":%s\n", line); + info.show_boundary = 0; + } + + if (info.skip_show) + info.skip_show--; + else if (info.show_data) + { + if (info.show_data_as_note) + { + if (verbose) + printf ("# DATA: %s\n", line); + info.show_data_as_note = 0; + } + else + printf (" %s\n", line); + } + else if (info.show_header && !opt_no_header) + printf (".%s\n", line); + + } + + if (info.sig_file && opt_crypto && info.is_pkcs7) + { + verify_signature (&info); + fclose (info.sig_file); + info.sig_file = NULL; + info.is_pkcs7 = 0; + } + + rfc822parse_close (msg); +} + + +int +main (int argc, char **argv) +{ + int last_argc = -1; + + 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" + "Parse a mail message into an annotated format.\n\n" + " --crypto decrypt or verify messages\n" + " --no-header don't output the header lines\n" + " --verbose enable extra informational output\n" + " --debug enable additional debug output\n" + " --help display this help and exit\n\n" + "With no FILE, or when FILE is -, read standard input.\n\n" + "WARNING: This tool is under development.\n" + " The semantics may change without notice\n\n" + "Report bugs to <bug-gnupg@gnu.org>."); + exit (0); + } + else if (!strcmp (*argv, "--verbose")) + { + verbose = 1; + argc--; argv++; + } + else if (!strcmp (*argv, "--debug")) + { + verbose = debug = 1; + argc--; argv++; + } + else if (!strcmp (*argv, "--crypto")) + { + opt_crypto = 1; + argc--; argv++; + } + else if (!strcmp (*argv, "--no-header")) + { + opt_no_header = 1; + argc--; argv++; + } + } + + if (argc > 1) + die ("usage: " PGM " [OPTION] [FILE] (try --help for more information)\n"); + + signal (SIGPIPE, SIG_IGN); + + if (argc && strcmp (*argv, "-")) + { + FILE *fp = fopen (*argv, "rb"); + if (!fp) + die ("can't open `%s': %s", *argv, strerror (errno)); + parse_message (fp); + fclose (fp); + } + else + parse_message (stdin); + + return 0; +} + + +/* +Local Variables: +compile-command: "gcc -Wall -g -o gpgparsemail rfc822parse.c gpgparsemail.c" +End: +*/ diff --git a/tools/gpgsm-gencert.sh b/tools/gpgsm-gencert.sh new file mode 100755 index 000000000..3949f2361 --- /dev/null +++ b/tools/gpgsm-gencert.sh @@ -0,0 +1,171 @@ +#!/bin/sh +# -*- sh -*- +# gpgsm-gencert.c - Generate X.509 certificates through GPGSM. +# 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., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +set -e + +ASSUAN_FP_IN=4 +ASSUAN_FP_OUT=5 + +ASSUAN_COMMANDS="\ +INPUT FD=$ASSUAN_FP_IN\n\ +OUTPUT FD=$ASSUAN_FP_OUT --armor\n\ +GENKEY\n\ +BYE" + +ANSWER="" + +query_user() +{ + message=$1; shift + + echo "$message" >&2 + echo -n "> " >&2 + read answer + + ANSWER=$answer; +} + +query_user_menu() +{ + message=$1; shift + i=0 + + echo "$message" >&2 + for choice in "$@"; do + i=$(expr $i + 1) + echo " [$i] $choice" >&2 + done + + while true; do + j=1 + echo -n "Your selection: " >&2 + read idx + + while [ $j -lt $i -o $j -eq $i ]; do + if [ "$idx" = $j ]; then + break + fi + j=$(expr $j + 1) + done + if [ $j -lt $i -o $j -eq $i ]; then + break + fi + done + + i=0 + for choice in "$@"; do + i=$(expr $i + 1) + if [ $i -eq $idx ]; then + ANSWER=$1 + break; + fi + shift + done + + echo "You selected: $ANSWER" >&2 +} + +query_user_menu "Key type" "RSA" "existing key" +if [ "$ANSWER" = "existing key" ]; then + # User requested to use an existing key; need to set some dummy defaults + KEY_TYPE=RSA + KEY_LENGTH=1024 + query_user "Keygrip " + KEY_GRIP=$ANSWER +else + KEY_TYPE=$ANSWER + query_user_menu "Key length" "1024" "2048" + KEY_LENGTH=$ANSWER + KEY_GRIP= +fi + + +query_user_menu "Key usage" "sign, encrypt" "sign" "encrypt" +KEY_USAGE=$ANSWER + +query_user "Name (DN)" +NAME=$ANSWER + +EMAIL_ADDRESSES= +LF= +while : ; do + query_user "E-Mail addresses (end with an empty line)" + [ -z "$ANSWER" ] && break + EMAIL_ADDRESSES="${EMAIL_ADDRESSES}${LF}Name-Email: $ANSWER" + LF=' +' +done + +DNS_ADDRESSES= +LF= +while : ; do + query_user "DNS Names (optional; end with an empty line)" + [ -z "$ANSWER" ] && break + DNS_ADDRESSES="${DNS_ADDRESSES}${LF}Name-DNS: $ANSWER" + LF=' +' +done + +URI_ADDRESSES= +LF= +while : ; do + query_user "URIs (optional; end with an empty line)" + [ -z "$ANSWER" ] && break + URI_ADDRESSES="${URI_ADDRESSES}${LF}Name-URI: $ANSWER" + LF=' +' +done + +file_parameter=$(mktemp "/tmp/gpgsm.XXXXXX") +outfile=$(mktemp "/tmp/gpgsm.XXXXXX") + + +( +cat <<EOF +Key-Type: $KEY_TYPE +Key-Length: $KEY_LENGTH +Key-Usage: $KEY_USAGE +Name-DN: $NAME +EOF +[ -n "$KEY_GRIP" ] && echo "Key-Grip: $KEY_GRIP" +[ -n "$EMAIL_ADDRESSES" ] && echo "$EMAIL_ADDRESSES" +[ -n "$DNS_ADDRESSES" ] && echo "$DNS_ADDRESSES" +[ -n "$URI_ADDRESSES" ] && echo "$URI_ADDRESSES" +) > "$file_parameter" + + +echo 'Parameters for certificate request to create:' >&2 +cat -n "$file_parameter" >&2 +echo >&2 + +query_user_menu "Really create such a CSR?" "yes" "no" +[ "$ANSWER" != "yes" ] && exit 1 + + +echo -e "$ASSUAN_COMMANDS" | \ + gpgsm --no-log-file --debug-level none --debug-none \ + --server 4< "$file_parameter" 5>"$outfile" >/dev/null + +cat "$outfile" + +rm "$file_parameter" "$outfile" +exit 0 diff --git a/tools/gpgsplit.c b/tools/gpgsplit.c deleted file mode 100644 index 3cdae05bf..000000000 --- a/tools/gpgsplit.c +++ /dev/null @@ -1,879 +0,0 @@ -/* 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 deleted file mode 100755 index f406392eb..000000000 --- a/tools/lspgpot +++ /dev/null @@ -1,27 +0,0 @@ -#!/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 deleted file mode 100755 index 80fbb3481..000000000 --- a/tools/mail-signed-keys +++ /dev/null @@ -1,114 +0,0 @@ -#!/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 deleted file mode 100644 index 496b63b0b..000000000 --- a/tools/make-dns-cert.c +++ /dev/null @@ -1,239 +0,0 @@ -/* 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 deleted file mode 100644 index 833875d28..000000000 --- a/tools/mk-tdata.c +++ /dev/null @@ -1,67 +0,0 @@ -/* 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 deleted file mode 100644 index 915dcc32a..000000000 --- a/tools/mpicalc.c +++ /dev/null @@ -1,385 +0,0 @@ -/* 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/no-libgcrypt.c b/tools/no-libgcrypt.c new file mode 100644 index 000000000..636df10c6 --- /dev/null +++ b/tools/no-libgcrypt.c @@ -0,0 +1,112 @@ +/* no-libgcrypt.c - Replacement functions for libgcrypt. + * 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 <stdlib.h> +#include <string.h> +#include <errno.h> + +#include "../common/util.h" +#include "i18n.h" + + +/* Replace libgcrypt's malloc functions which are used by + ../jnlib/libjnlib.a . ../common/util.h defines macros to map them + to xmalloc etc. */ +static void +out_of_core (void) +{ + log_fatal (_("error allocating enough memory: %s\n"), strerror (errno)); +} + + +void * +gcry_malloc (size_t n) +{ + return malloc (n); +} + +void * +gcry_xmalloc (size_t n) +{ + void *p = malloc (n); + if (!p) + out_of_core (); + return p; +} + +char * +gcry_strdup (const char *string) +{ + return malloc (strlen (string)+1); +} + + +void * +gcry_realloc (void *a, size_t n) +{ + return realloc (a, n); +} + +void * +gcry_xrealloc (void *a, size_t n) +{ + void *p = realloc (a, n); + if (!p) + out_of_core (); + return p; +} + + + +void * +gcry_calloc (size_t n, size_t m) +{ + return calloc (n, m); +} + +void * +gcry_xcalloc (size_t n, size_t m) +{ + void *p = calloc (n, m); + if (!p) + out_of_core (); + return p; +} + + +char * +gcry_xstrdup (const char *string) +{ + void *p = malloc (strlen (string)+1); + if (!p) + out_of_core (); + strcpy( p, string ); + return p; +} + +void +gcry_free (void *a) +{ + if (a) + free (a); +} diff --git a/tools/pgpgroup-to-gpggroup b/tools/pgpgroup-to-gpggroup deleted file mode 100755 index 5ea9990b6..000000000 --- a/tools/pgpgroup-to-gpggroup +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/perl -w - -# pgpgroup-to-gpggroup - convert PGP groups to GnuPG groups -# Copyright (C) 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. - -# This program requires a PGP command line program that supports -# groups (note that the PGP 8 command line doesn't). - -$pgp="pgp -gvv 2>/dev/null"; - -open(PGP,"$pgp|") || die "Unable to call PGP: $!"; - -while(<PGP>) -{ - # If the line begins with a ">", then it is a new group. - - if(/^ > (\S+)/) - { - print "\ngroup $1 = "; - } - elsif(/\s+(0x\S+)/) - { - print "$1 "; - } -} - -print "\n"; -close(PGP); diff --git a/tools/rfc822parse.c b/tools/rfc822parse.c new file mode 100644 index 000000000..303ddad13 --- /dev/null +++ b/tools/rfc822parse.c @@ -0,0 +1,1258 @@ +/* rfc822parse.c - Simple mail and MIME parser + * Copyright (C) 1999, 2000 Werner Koch, Duesseldorf + * Copyright (C) 2003, 2004 g10 Code GmbH + * + * This program 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 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 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. + */ + + +/* According to RFC822 binary zeroes are allowed at many places. We do + * not handle this correct especially in the field parsing code. It + * should be easy to fix and the API provides a interfaces which + * returns the length but in addition makes sure that returned strings + * are always ended by a \0. + * + * Furthermore, the case of field names is changed and thus it is not + * always a good idea to use these modified header + * lines (e.g. signatures may break). + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <errno.h> +#include <stdarg.h> +#include <assert.h> + +#include "rfc822parse.h" + +enum token_type + { + tSPACE, + tATOM, + tQUOTED, + tDOMAINLIT, + tSPECIAL + }; + +/* For now we directly use our TOKEN as the parse context */ +typedef struct rfc822parse_field_context *TOKEN; +struct rfc822parse_field_context +{ + TOKEN next; + enum token_type type; + struct { + unsigned int cont:1; + unsigned int lowered:1; + } flags; + /*TOKEN owner_pantry; */ + char data[1]; +}; + +struct hdr_line +{ + struct hdr_line *next; + int cont; /* This is a continuation of the previous line. */ + unsigned char line[1]; +}; + +typedef struct hdr_line *HDR_LINE; + + +struct part +{ + struct part *right; /* The next part. */ + struct part *down; /* A contained part. */ + HDR_LINE hdr_lines; /* Header lines os that part. */ + HDR_LINE *hdr_lines_tail; /* Helper for adding lines. */ + char *boundary; /* Only used in the first part. */ +}; +typedef struct part *part_t; + +struct rfc822parse_context +{ + rfc822parse_cb_t callback; + void *callback_value; + int callback_error; + int in_body; + int in_preamble; /* Wether we are before the first boundary. */ + part_t parts; /* The tree of parts. */ + part_t current_part; /* Whom we are processing (points into parts). */ + const char *boundary; /* Current boundary. */ +}; + +static HDR_LINE find_header (rfc822parse_t msg, const char *name, + int which, HDR_LINE * rprev); + + +static size_t +length_sans_trailing_ws (const unsigned char *line, size_t len) +{ + const unsigned char *p, *mark; + size_t n; + + for (mark=NULL, p=line, n=0; n < len; n++, p++) + { + if (strchr (" \t\r\n", *p )) + { + if( !mark ) + mark = p; + } + else + mark = NULL; + } + + if (mark) + return mark - line; + return len; +} + + +static void +lowercase_string (unsigned char *string) +{ + for (; *string; string++) + if (*string >= 'A' && *string <= 'Z') + *string = *string - 'A' + 'a'; +} + +/* Transform a header name into a standard capitalized format; i.e + "Content-Type". Conversion stops at the colon. As usual we don't + use the localized versions of ctype.h. + */ +static void +capitalize_header_name (unsigned char *name) +{ + int first = 1; + + for (; *name && *name != ':'; name++) + if (*name == '-') + first = 1; + else if (first) + { + if (*name >= 'a' && *name <= 'z') + *name = *name - 'a' + 'A'; + first = 0; + } + else if (*name >= 'A' && *name <= 'Z') + *name = *name - 'A' + 'a'; +} + +#ifndef HAVE_STPCPY +static char * +stpcpy (char *a,const char *b) +{ + while (*b) + *a++ = *b++; + *a = 0; + + return (char*)a; +} +#endif + + +/* If a callback has been registerd, call it for the event of type + EVENT. */ +static int +do_callback (rfc822parse_t msg, rfc822parse_event_t event) +{ + int rc; + + if (!msg->callback || msg->callback_error) + return 0; + rc = msg->callback (msg->callback_value, event, msg); + if (rc) + msg->callback_error = rc; + return rc; +} + +static part_t +new_part (void) +{ + part_t part; + + part = calloc (1, sizeof *part); + if (part) + { + part->hdr_lines_tail = &part->hdr_lines; + } + return part; +} + + +static void +release_part (part_t part) +{ + part_t tmp; + HDR_LINE hdr, hdr2; + + for (; part; part = tmp) + { + tmp = part->right; + if (part->down) + release_part (part->down); + for (hdr = part->hdr_lines; hdr; hdr = hdr2) + { + hdr2 = hdr->next; + free (hdr); + } + free (part->boundary); + free (part); + } +} + + +static void +release_handle_data (rfc822parse_t msg) +{ + release_part (msg->parts); + msg->parts = NULL; + msg->current_part = NULL; + msg->boundary = NULL; +} + + +/* Create a new parsing context for an entire rfc822 message and + return it. CB and CB_VALUE may be given to callback for certain + events. NULL is returned on error with errno set appropriately. */ +rfc822parse_t +rfc822parse_open (rfc822parse_cb_t cb, void *cb_value) +{ + rfc822parse_t msg = calloc (1, sizeof *msg); + if (msg) + { + msg->parts = msg->current_part = new_part (); + if (!msg->parts) + { + free (msg); + msg = NULL; + } + else + { + msg->callback = cb; + msg->callback_value = cb_value; + if (do_callback (msg, RFC822PARSE_OPEN)) + { + release_handle_data (msg); + free (msg); + msg = NULL; + } + } + } + return msg; +} + + +void +rfc822parse_cancel (rfc822parse_t msg) +{ + if (msg) + { + do_callback (msg, RFC822PARSE_CANCEL); + release_handle_data (msg); + free (msg); + } +} + + +void +rfc822parse_close (rfc822parse_t msg) +{ + if (msg) + { + do_callback (msg, RFC822PARSE_CLOSE); + release_handle_data (msg); + free (msg); + } +} + +static part_t +find_parent (part_t tree, part_t target) +{ + part_t part; + + for (part = tree->down; part; part = part->right) + { + if (part == target) + return tree; /* Found. */ + if (part->down) + { + part_t tmp = find_parent (part, target); + if (tmp) + return tmp; + } + } + return NULL; +} + +static void +set_current_part_to_parent (rfc822parse_t msg) +{ + part_t parent; + + assert (msg->current_part); + parent = find_parent (msg->parts, msg->current_part); + if (!parent) + return; /* Already at the top. */ + +#ifndef NDEBUG + { + part_t part; + for (part = parent->down; part; part = part->right) + if (part == msg->current_part) + break; + assert (part); + } +#endif + msg->current_part = parent; + + parent = find_parent (msg->parts, parent); + msg->boundary = parent? parent->boundary: NULL; +} + + + +/**************** + * We have read in all header lines and are about to receive the body + * part. The delimiter line has already been processed. + * + * FIXME: we's better return an error in case of memory failures. + */ +static int +transition_to_body (rfc822parse_t msg) +{ + rfc822parse_field_t ctx; + int rc; + + rc = do_callback (msg, RFC822PARSE_T2BODY); + if (!rc) + { + /* Store the boundary if we have multipart type. */ + ctx = rfc822parse_parse_field (msg, "Content-Type", -1); + if (ctx) + { + const char *s; + + s = rfc822parse_query_media_type (ctx, NULL); + if (s && !strcmp (s,"multipart")) + { + s = rfc822parse_query_parameter (ctx, "boundary", 0); + if (s) + { + assert (!msg->current_part->boundary); + msg->current_part->boundary = malloc (strlen (s) + 1); + if (msg->current_part->boundary) + { + part_t part; + + strcpy (msg->current_part->boundary, s); + msg->boundary = msg->current_part->boundary; + part = new_part (); + if (!part) + { + int save_errno = errno; + rfc822parse_release_field (ctx); + errno = save_errno; + return -1; + } + rc = do_callback (msg, RFC822PARSE_LEVEL_DOWN); + assert (!msg->current_part->down); + msg->current_part->down = part; + msg->current_part = part; + msg->in_preamble = 1; + } + } + } + rfc822parse_release_field (ctx); + } + } + + return rc; +} + +/* We have just passed a MIME boundary and need to prepare for new part. + headers. */ +static int +transition_to_header (rfc822parse_t msg) +{ + part_t part; + + assert (msg->current_part); + assert (!msg->current_part->right); + + part = new_part (); + if (!part) + return -1; + + msg->current_part->right = part; + msg->current_part = part; + return 0; +} + + +static int +insert_header (rfc822parse_t msg, const unsigned char *line, size_t length) +{ + HDR_LINE hdr; + + assert (msg->current_part); + if (!length) + { + msg->in_body = 1; + return transition_to_body (msg); + } + + if (!msg->current_part->hdr_lines) + do_callback (msg, RFC822PARSE_BEGIN_HEADER); + + length = length_sans_trailing_ws (line, length); + hdr = malloc (sizeof (*hdr) + length); + if (!hdr) + return -1; + hdr->next = NULL; + hdr->cont = (*line == ' ' || *line == '\t'); + memcpy (hdr->line, line, length); + hdr->line[length] = 0; /* Make it a string. */ + + /* Transform a field name into canonical format. */ + if (!hdr->cont && strchr (line, ':')) + capitalize_header_name (hdr->line); + + *msg->current_part->hdr_lines_tail = hdr; + msg->current_part->hdr_lines_tail = &hdr->next; + + /* Lets help the caller to prevent mail loops and issue an event for + * every Received header. */ + if (length >= 9 && !memcmp (line, "Received:", 9)) + do_callback (msg, RFC822PARSE_RCVD_SEEN); + return 0; +} + + +/**************** + * Note: We handle the body transparent to allow binary zeroes in it. + */ +static int +insert_body (rfc822parse_t msg, const unsigned char *line, size_t length) +{ + int rc = 0; + + if (length > 2 && *line == '-' && line[1] == '-' && msg->boundary) + { + size_t blen = strlen (msg->boundary); + + if (length == blen + 2 + && !memcmp (line+2, msg->boundary, blen)) + { + rc = do_callback (msg, RFC822PARSE_BOUNDARY); + msg->in_body = 0; + if (!rc && !msg->in_preamble) + rc = transition_to_header (msg); + msg->in_preamble = 0; + } + else if (length == blen + 4 + && line[length-2] =='-' && line[length-1] == '-' + && !memcmp (line+2, msg->boundary, blen)) + { + rc = do_callback (msg, RFC822PARSE_LAST_BOUNDARY); + msg->boundary = NULL; /* No current boundary anymore. */ + set_current_part_to_parent (msg); + + /* Fixme: The next should actually be send right before the + next boundary, so that we can mark the epilogue. */ + if (!rc) + rc = do_callback (msg, RFC822PARSE_LEVEL_UP); + } + } + if (msg->in_preamble && !rc) + rc = do_callback (msg, RFC822PARSE_PREAMBLE); + + return rc; +} + +/* Insert the next line into the parser. Return 0 on success or true + on error with errno set appropriately. */ +int +rfc822parse_insert (rfc822parse_t msg, const unsigned char *line, size_t length) +{ + return (msg->in_body + ? insert_body (msg, line, length) + : insert_header (msg, line, length)); +} + + +/* Tell the parser that we have finished the message. */ +int +rfc822parse_finish (rfc822parse_t msg) +{ + return do_callback (msg, RFC822PARSE_FINISH); +} + + + +/**************** + * Get a copy of a header line. The line is returned as one long + * string with LF to separate the continuation line. Caller must free + * the return buffer. WHICH may be used to enumerate over all lines. + * Wildcards are allowed. This function works on the current headers; + * i.e. the regular mail headers or the MIME headers of the current + * part. + * + * WHICH gives the mode: + * -1 := Take the last occurence + * n := Take the n-th one. + * + * Returns a newly allocated buffer or NULL on error. errno is set in + * case of a memory failure or set to 0 if the requested field is not + * available. + * + * If VALUEOFF is not NULL it will receive the offset of the first non + * space character in the value part of the line (i.e. after the first + * colon). + */ +char * +rfc822parse_get_field (rfc822parse_t msg, const char *name, int which, + size_t *valueoff) +{ + HDR_LINE h, h2; + char *buf, *p; + size_t n; + + h = find_header (msg, name, which, NULL); + if (!h) + { + errno = 0; + return NULL; /* no such field */ + } + + n = strlen (h->line) + 1; + for (h2 = h->next; h2 && h2->cont; h2 = h2->next) + n += strlen (h2->line) + 1; + + buf = p = malloc (n); + if (buf) + { + p = stpcpy (p, h->line); + *p++ = '\n'; + for (h2 = h->next; h2 && h2->cont; h2 = h2->next) + { + p = stpcpy (p, h2->line); + *p++ = '\n'; + } + p[-1] = 0; + } + + if (valueoff) + { + p = strchr (buf, ':'); + if (!p) + *valueoff = 0; /* Oops: should never happen. */ + else + { + p++; + while (*p == ' ' || *p == '\t' || *p == '\r' || *p == '\n') + p++; + *valueoff = p - buf; + } + } + + return buf; +} + + +/**************** + * Enumerate all header. Caller has to provide the address of a pointer + * which has to be initialzed to NULL, the caller should then never change this + * pointer until he has closed the enumeration by passing again the address + * of the pointer but with msg set to NULL. + * The function returns pointers to all the header lines or NULL when + * all lines have been enumerated or no headers are available. + */ +const char * +rfc822parse_enum_header_lines (rfc822parse_t msg, void **context) +{ + HDR_LINE l; + + if (!msg) /* Close. */ + return NULL; + + if (*context == msg || !msg->current_part) + return NULL; + + l = *context ? (HDR_LINE) *context : msg->current_part->hdr_lines; + + if (l) + { + *context = l->next ? (void *) (l->next) : (void *) msg; + return l->line; + } + *context = msg; /* Mark end of list. */ + return NULL; +} + + + +/**************** + * Find a header field. If the Name does end in an asterisk this is meant + * to be a wildcard. + * + * which -1 : Retrieve the last field + * >0 : Retrieve the n-th field + + * RPREV may be used to return the predecessor of the returned field; + * which may be NULL for the very first one. It has to be initialzed + * to either NULL in which case the search start at the first header line, + * or it may point to a headerline, where the search should start + */ +static HDR_LINE +find_header (rfc822parse_t msg, const char *name, int which, HDR_LINE *rprev) +{ + HDR_LINE hdr, prev = NULL, mark = NULL; + unsigned char *p; + size_t namelen, n; + int found = 0; + int glob = 0; + + if (!msg->current_part) + return NULL; + + namelen = strlen (name); + if (namelen && name[namelen - 1] == '*') + { + namelen--; + glob = 1; + } + + hdr = msg->current_part->hdr_lines; + if (rprev && *rprev) + { + /* spool forward to the requested starting place. + * we cannot simply set this as we have to return + * the previous list element too */ + for (; hdr && hdr != *rprev; prev = hdr, hdr = hdr->next) + ; + } + + for (; hdr; prev = hdr, hdr = hdr->next) + { + if (hdr->cont) + continue; + if (!(p = strchr (hdr->line, ':'))) + continue; /* invalid header, just skip it. */ + n = p - hdr->line; + if (!n) + continue; /* invalid name */ + if ((glob ? (namelen <= n) : (namelen == n)) + && !memcmp (hdr->line, name, namelen)) + { + found++; + if (which == -1) + mark = hdr; + else if (found == which) + { + if (rprev) + *rprev = prev; + return hdr; + } + } + } + if (mark && rprev) + *rprev = prev; + return mark; +} + + + +static const char * +skip_ws (const char *s) +{ + while (*s == ' ' || *s == '\t' || *s == '\r' || *s == '\n') + s++; + return s; +} + + +static void +release_token_list (TOKEN t) +{ + while (t) + { + TOKEN t2 = t->next; + /* fixme: If we have owner_pantry, put the token back to + * this pantry so that it can be reused later */ + free (t); + t = t2; + } +} + + +static TOKEN +new_token (enum token_type type, const char *buf, size_t length) +{ + TOKEN t; + + /* fixme: look through our pantries to find a suitable + * token for reuse */ + t = malloc (sizeof *t + length); + if (t) + { + t->next = NULL; + t->type = type; + memset (&t->flags, 0, sizeof (t->flags)); + t->data[0] = 0; + if (buf) + { + memcpy (t->data, buf, length); + t->data[length] = 0; /* Make sure it is a C string. */ + } + else + t->data[0] = 0; + } + return t; +} + +static TOKEN +append_to_token (TOKEN old, const char *buf, size_t length) +{ + size_t n = strlen (old->data); + TOKEN t; + + t = malloc (sizeof *t + n + length); + if (t) + { + t->next = old->next; + t->type = old->type; + t->flags = old->flags; + memcpy (t->data, old->data, n); + memcpy (t->data + n, buf, length); + t->data[n + length] = 0; + old->next = NULL; + release_token_list (old); + } + return t; +} + + + +/* + Parse a field into tokens as defined by rfc822. + */ +static TOKEN +parse_field (HDR_LINE hdr) +{ + static const char specials[] = "<>@.,;:\\[]\"()"; + static const char specials2[] = "<>@.,;:"; + static const char tspecials[] = "/?=<>@,;:\\[]\"()"; + static const char tspecials2[] = "/?=<>@.,;:"; /* FIXME: really + include '.'?*/ + static struct + { + const unsigned char *name; + size_t namelen; + } tspecial_header[] = { + { "Content-Type", 12}, + { "Content-Transfer-Encoding", 25}, + { "Content-Disposition", 19}, + { NULL, 0} + }; + const char *delimiters; + const char *delimiters2; + const unsigned char *line, *s, *s2; + size_t n; + int i, invalid = 0; + TOKEN t, tok, *tok_tail; + + errno = 0; + if (!hdr) + return NULL; + + tok = NULL; + tok_tail = &tok; + + line = hdr->line; + if (!(s = strchr (line, ':'))) + return NULL; /* oops */ + + n = s - line; + if (!n) + return NULL; /* oops: invalid name */ + + delimiters = specials; + delimiters2 = specials2; + for (i = 0; tspecial_header[i].name; i++) + { + if (n == tspecial_header[i].namelen + && !memcmp (line, tspecial_header[i].name, n)) + { + delimiters = tspecials; + delimiters2 = tspecials2; + break; + } + } + + s++; /* Move over the colon. */ + for (;;) + { + if (!*s) + { + if (!hdr->next || !hdr->next->cont) + break; + hdr = hdr->next; + s = hdr->line; + } + + if (*s == '(') + { + int level = 1; + int in_quote = 0; + + invalid = 0; + for (s++;; s++) + { + if (!*s) + { + if (!hdr->next || !hdr->next->cont) + break; + hdr = hdr->next; + s = hdr->line; + } + + if (in_quote) + { + if (*s == '\"') + in_quote = 0; + else if (*s == '\\' && s[1]) /* what about continuation? */ + s++; + } + else if (*s == ')') + { + if (!--level) + break; + } + else if (*s == '(') + level++; + else if (*s == '\"') + in_quote = 1; + } + if (!*s) + ; /* Actually this is an error, but we don't care about it. */ + else + s++; + } + else if (*s == '\"' || *s == '[') + { + /* We do not check for non-allowed nesting of domainliterals */ + int term = *s == '\"' ? '\"' : ']'; + invalid = 0; + s++; + t = NULL; + + for (;;) + { + for (s2 = s; *s2; s2++) + { + if (*s2 == term) + break; + else if (*s2 == '\\' && s2[1]) /* what about continuation? */ + s2++; + } + + t = (t + ? append_to_token (t, s, s2 - s) + : new_token (term == '\"'? tQUOTED : tDOMAINLIT, s, s2 - s)); + if (!t) + goto failure; + + if (*s2 || !hdr->next || !hdr->next->cont) + break; + hdr = hdr->next; + s = hdr->line; + } + *tok_tail = t; + tok_tail = &t->next; + s = s2; + if (*s) + s++; /* skip the delimiter */ + } + else if ((s2 = strchr (delimiters2, *s))) + { /* Special characters which are not handled above. */ + invalid = 0; + t = new_token (tSPECIAL, s, 1); + if (!t) + goto failure; + *tok_tail = t; + tok_tail = &t->next; + s++; + } + else if (*s == ' ' || *s == '\t' || *s == '\r' || *s == '\n') + { + invalid = 0; + s = skip_ws (s + 1); + } + else if (*s > 0x20 && !(*s & 128)) + { /* Atom. */ + invalid = 0; + for (s2 = s + 1; *s2 > 0x20 + && !(*s2 & 128) && !strchr (delimiters, *s2); s2++) + ; + t = new_token (tATOM, s, s2 - s); + if (!t) + goto failure; + *tok_tail = t; + tok_tail = &t->next; + s = s2; + } + else + { /* Invalid character. */ + if (!invalid) + { /* For parsing we assume only one space. */ + t = new_token (tSPACE, NULL, 0); + if (!t) + goto failure; + *tok_tail = t; + tok_tail = &t->next; + invalid = 1; + } + s++; + } + } + + return tok; + + failure: + { + int save = errno; + release_token_list (tok); + errno = save; + } + return NULL; +} + + + + +/**************** + * Find and parse a header field. + * WHICH indicates what to do if there are multiple instance of the same + * field (like "Received"); the following value are defined: + * -1 := Take the last occurence + * 0 := Reserved + * n := Take the n-th one. + * Returns a handle for further operations on the parse context of the field + * or NULL if the field was not found. + */ +rfc822parse_field_t +rfc822parse_parse_field (rfc822parse_t msg, const char *name, int which) +{ + HDR_LINE hdr; + + if (!which) + return NULL; + + hdr = find_header (msg, name, which, NULL); + if (!hdr) + return NULL; + return parse_field (hdr); +} + +void +rfc822parse_release_field (rfc822parse_field_t ctx) +{ + if (ctx) + release_token_list (ctx); +} + + + +/**************** + * Check whether T points to a parameter. + * A parameter starts with a semicolon and it is assumed that t + * points to exactly this one. + */ +static int +is_parameter (TOKEN t) +{ + t = t->next; + if (!t || t->type != tATOM) + return 0; + t = t->next; + if (!t || !(t->type == tSPECIAL && t->data[0] == '=')) + return 0; + t = t->next; + if (!t) + return 1; /* We assume that an non existing value is an empty one. */ + return t->type == tQUOTED || t->type == tATOM; +} + +/* + Some header (Content-type) have a special syntax where attribute=value + pairs are used after a leading semicolon. The parse_field code + knows about these fields and changes the parsing to the one defined + in RFC2045. + Returns a pointer to the value which is valid as long as the + parse context is valid; NULL is returned in case that attr is not + defined in the header, a missing value is reppresented by an empty string. + + With LOWER_VALUE set to true, a matching field valuebe be + lowercased. + + Note, that ATTR should be lowercase. + */ +const char * +rfc822parse_query_parameter (rfc822parse_field_t ctx, const char *attr, + int lower_value) +{ + TOKEN t, a; + + for (t = ctx; t; t = t->next) + { + /* skip to the next semicolon */ + for (; t && !(t->type == tSPECIAL && t->data[0] == ';'); t = t->next) + ; + if (!t) + return NULL; + if (is_parameter (t)) + { /* Look closer. */ + a = t->next; /* We know that this is an atom */ + if ( !a->flags.lowered ) + { + lowercase_string (a->data); + a->flags.lowered = 1; + } + if (!strcmp (a->data, attr)) + { /* found */ + t = a->next->next; + /* Either T is now an atom, a quoted string or NULL in + * which case we return an empty string. */ + + if ( lower_value && t && !t->flags.lowered ) + { + lowercase_string (t->data); + t->flags.lowered = 1; + } + return t ? t->data : ""; + } + } + } + return NULL; +} + +/**************** + * This function may be used for the Content-Type header to figure out + * the media type and subtype. Note, that the returned strings are + * guaranteed to be lowercase as required by MIME. + * + * Returns: a pointer to the media type and if subtype is not NULL, + * a pointer to the subtype. + */ +const char * +rfc822parse_query_media_type (rfc822parse_field_t ctx, const char **subtype) +{ + TOKEN t = ctx; + const char *type; + + if (t->type != tATOM) + return NULL; + if (!t->flags.lowered) + { + lowercase_string (t->data); + t->flags.lowered = 1; + } + type = t->data; + t = t->next; + if (!t || t->type != tSPECIAL || t->data[0] != '/') + return NULL; + t = t->next; + if (!t || t->type != tATOM) + return NULL; + + if (subtype) + { + if (!t->flags.lowered) + { + lowercase_string (t->data); + t->flags.lowered = 1; + } + *subtype = t->data; + } + return type; +} + + + + + +#ifdef TESTING + +/* Internal debug function to print the structure of the message. */ +static void +dump_structure (rfc822parse_t msg, part_t part, int indent) +{ + if (!part) + { + printf ("*** Structure of this message:\n"); + part = msg->parts; + } + + for (; part; part = part->right) + { + rfc822parse_field_t ctx; + part_t save_part; /* ugly hack - we should have a function to + get part inforation. */ + const char *s; + + save_part = msg->current_part; + msg->current_part = part; + ctx = rfc822parse_parse_field (msg, "Content-Type", -1); + msg->current_part = save_part; + if (ctx) + { + const char *s1, *s2; + s1 = rfc822parse_query_media_type (ctx, &s2); + if (s1) + printf ("*** %*s %s/%s", indent*2, "", s1, s2); + else + printf ("*** %*s [not found]", indent*2, ""); + + s = rfc822parse_query_parameter (ctx, "boundary", 0); + if (s) + printf (" (boundary=\"%s\")", s); + rfc822parse_release_field (ctx); + } + else + printf ("*** %*s text/plain [assumed]", indent*2, ""); + putchar('\n'); + + if (part->down) + dump_structure (msg, part->down, indent + 1); + } + +} + + + +static void +show_param (rfc822parse_field_t ctx, const char *name) +{ + const char *s; + + if (!ctx) + return; + s = rfc822parse_query_parameter (ctx, name, 0); + if (s) + printf ("*** %s: `%s'\n", name, s); +} + + + +static void +show_event (rfc822parse_event_t event) +{ + const char *s; + + switch (event) + { + case RFC822PARSE_OPEN: s= "Open"; break; + case RFC822PARSE_CLOSE: s= "Close"; break; + case RFC822PARSE_CANCEL: s= "Cancel"; break; + case RFC822PARSE_T2BODY: s= "T2Body"; break; + case RFC822PARSE_FINISH: s= "Finish"; break; + case RFC822PARSE_RCVD_SEEN: s= "Rcvd_Seen"; break; + case RFC822PARSE_BOUNDARY: s= "Boundary"; break; + case RFC822PARSE_LAST_BOUNDARY: s= "Last_Boundary"; break; + default: s= "***invalid event***"; break; + } + printf ("*** got RFC822 event %s\n", s); +} + +static int +msg_cb (void *dummy_arg, rfc822parse_event_t event, rfc822parse_t msg) +{ + show_event (event); + if (event == RFC822PARSE_T2BODY) + { + rfc822parse_field_t ctx; + void *ectx; + const char *line; + + for (ectx=NULL; (line = rfc822parse_enum_header_lines (msg, &ectx)); ) + { + printf ("*** HDR: %s\n", line); + } + rfc822parse_enum_header_lines (NULL, &ectx); /* Close enumerator. */ + + ctx = rfc822parse_parse_field (msg, "Content-Type", -1); + if (ctx) + { + const char *s1, *s2; + s1 = rfc822parse_query_media_type (ctx, &s2); + if (s1) + printf ("*** media: `%s/%s'\n", s1, s2); + else + printf ("*** media: [not found]\n"); + show_param (ctx, "boundary"); + show_param (ctx, "protocol"); + rfc822parse_release_field (ctx); + } + else + printf ("*** media: text/plain [assumed]\n"); + + } + + + return 0; +} + + + +int +main (int argc, char **argv) +{ + char line[5000]; + size_t length; + rfc822parse_t msg; + + msg = rfc822parse_open (msg_cb, NULL); + if (!msg) + abort (); + + while (fgets (line, sizeof (line), stdin)) + { + length = strlen (line); + if (length && line[length - 1] == '\n') + line[--length] = 0; + if (length && line[length - 1] == '\r') + line[--length] = 0; + if (rfc822parse_insert (msg, line, length)) + abort (); + } + + dump_structure (msg, NULL, 0); + + rfc822parse_close (msg); + return 0; +} +#endif + +/* +Local Variables: +compile-command: "gcc -Wall -g -DTESTING -o rfc822parse rfc822parse.c" +End: +*/ diff --git a/tools/rfc822parse.h b/tools/rfc822parse.h new file mode 100644 index 000000000..8a56c51cb --- /dev/null +++ b/tools/rfc822parse.h @@ -0,0 +1,81 @@ +/* rfc822parse.h - Simple mail and MIME parser + * Copyright (C) 1999 Werner Koch, Duesseldorf + * Copyright (C) 2003, g10 Code GmbH + * + * This program 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 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 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. + */ + +#ifndef RFC822PARSE_H +#define RFC822PARSE_H + +struct rfc822parse_context; +typedef struct rfc822parse_context *rfc822parse_t; + +typedef enum + { + RFC822PARSE_OPEN = 1, + RFC822PARSE_CLOSE, + RFC822PARSE_CANCEL, + RFC822PARSE_T2BODY, + RFC822PARSE_FINISH, + RFC822PARSE_RCVD_SEEN, + RFC822PARSE_LEVEL_DOWN, + RFC822PARSE_LEVEL_UP, + RFC822PARSE_BOUNDARY, + RFC822PARSE_LAST_BOUNDARY, + RFC822PARSE_BEGIN_HEADER, + RFC822PARSE_PREAMBLE, + RFC822PARSE_EPILOGUE + } +rfc822parse_event_t; + +struct rfc822parse_field_context; +typedef struct rfc822parse_field_context *rfc822parse_field_t; + + +typedef int (*rfc822parse_cb_t) (void *opaque, + rfc822parse_event_t event, + rfc822parse_t msg); + + +rfc822parse_t rfc822parse_open (rfc822parse_cb_t cb, void *opaque_value); + +void rfc822parse_close (rfc822parse_t msg); + +void rfc822parse_cancel (rfc822parse_t msg); +int rfc822parse_finish (rfc822parse_t msg); + +int rfc822parse_insert (rfc822parse_t msg, + const unsigned char *line, size_t length); + +char *rfc822parse_get_field (rfc822parse_t msg, const char *name, int which, + size_t *valueoff); + +const char *rfc822parse_enum_header_lines (rfc822parse_t msg, void **context); + +rfc822parse_field_t rfc822parse_parse_field (rfc822parse_t msg, + const char *name, + int which); + +void rfc822parse_release_field (rfc822parse_field_t field); + +const char *rfc822parse_query_parameter (rfc822parse_field_t ctx, + const char *attr, int lower_value); + +const char *rfc822parse_query_media_type (rfc822parse_field_t ctx, + const char **subtype); + +#endif /*RFC822PARSE_H */ diff --git a/tools/ring-a-party b/tools/ring-a-party deleted file mode 100755 index 01e0f3ff3..000000000 --- a/tools/ring-a-party +++ /dev/null @@ -1,114 +0,0 @@ -#!/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 deleted file mode 100644 index f48340508..000000000 --- a/tools/shmtest.c +++ /dev/null @@ -1,201 +0,0 @@ -/* 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/tools/signmany b/tools/signmany deleted file mode 100644 index d628e7ba3..000000000 --- a/tools/signmany +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/sh - -if [ ! -f ./$1 ]; then - echo "usage: signmany keyring" >&2 - exit 1 -fi - - -ro="--trustdb-name=./tdb.tmp --no-default-keyring --secret-keyring /floppy/secring.gpg --keyring ./$1" - -kis=`gpg $ro --fast-list-mode --list-keys --with-colons \ - | awk -F: '$1=="pub" { print $5 }'` - -for k in $kis; do - echo "Keyid: $k" - answer=A - while [ "$answer" = "A" ]; do - gpg $ro --lock-never --no-interactive-selection --sign-key $k - answer="" - while [ "$answer" = "" ]; do - read -p 'Okay, Again or Quit? (O/A/Q) ' - case "$REPLY" in - o|O) answer=O ;; - a|A) answer=A ;; - q|Q) answer=Q ;; - *) ;; - esac - done - done - [ "$answer" = "Q" ] && break -done - - diff --git a/tools/symcryptrun.c b/tools/symcryptrun.c new file mode 100644 index 000000000..406cbb2a2 --- /dev/null +++ b/tools/symcryptrun.c @@ -0,0 +1,1073 @@ +/* symcryptrun.c - Tool to call simple symmetric encryption tools. + * 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. + */ + + +/* Sometimes simple encryption tools are already in use for a long + time and there is a desire to integrate them into the GnuPG + framework. The protocols and encryption methods might be + non-standard or not even properly documented, so that a + full-fledged encryption tool with an interface like gpg is not + doable. This simple wrapper program provides a solution: It + operates by calling the encryption/decryption module and providing + the passphrase for a key (or even the key directly) using the + standard pinentry mechanism through gpg-agent. */ + +/* This program is invoked in the following way: + + symcryptrun --class CLASS --program PROGRAM --keyfile KEYFILE \ + [--decrypt | --encrypt] + + For encryption, the plain text must be provided on STDIN, and the + ciphertext will be output to STDOUT. For decryption vice versa. + + CLASS can currently only be "confucius". + + PROGRAM must be the path to the crypto engine. + + KEYFILE must contain the secret key, which may be protected by a + passphrase. The passphrase is retrieved via the pinentry program. + + + The GPG Agent _must_ be running before starting symcryptrun. + + The possible exit status codes: + + 0 Success + 1 Some error occured + 2 No valid passphrase was provided + 3 The operation was canceled by the user + + Other classes may be added in the future. */ + +#define SYMC_BAD_PASSPHRASE 2 +#define SYMC_CANCELED 3 + + +#include <config.h> + +#include <unistd.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include <assert.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <sys/wait.h> +#include <pty.h> +#include <utmp.h> +#include <ctype.h> +#ifdef HAVE_LOCALE_H +#include <locale.h> +#endif +#ifdef HAVE_LANGINFO_CODESET +#include <langinfo.h> +#endif +#include <gpg-error.h> + +#define JNLIB_NEED_LOG_LOGV +#include "i18n.h" +#include "../common/util.h" +#include "mkdtemp.h" + +/* FIXME: Bah. For spwq_secure_free. */ +#define SIMPLE_PWQUERY_IMPLEMENTATION 1 +#include "../common/simple-pwquery.h" + + +/* Used by gcry for logging */ +static void +my_gcry_logger (void *dummy, int level, const char *fmt, va_list arg_ptr) +{ + /* translate the log levels */ + switch (level) + { + case GCRY_LOG_CONT: level = JNLIB_LOG_CONT; break; + case GCRY_LOG_INFO: level = JNLIB_LOG_INFO; break; + case GCRY_LOG_WARN: level = JNLIB_LOG_WARN; break; + case GCRY_LOG_ERROR:level = JNLIB_LOG_ERROR; break; + case GCRY_LOG_FATAL:level = JNLIB_LOG_FATAL; break; + case GCRY_LOG_BUG: level = JNLIB_LOG_BUG; break; + case GCRY_LOG_DEBUG:level = JNLIB_LOG_DEBUG; break; + default: level = JNLIB_LOG_ERROR; break; } + log_logv (level, fmt, arg_ptr); +} + + +/* From simple-gettext.c. */ + +/* 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; +} + + +/* Constants to identify the commands and options. */ +enum cmd_and_opt_values + { + aNull = 0, + oQuiet = 'q', + oVerbose = 'v', + + oNoVerbose = 500, + oOptions, + oNoOptions, + oLogFile, + oHomedir, + oClass, + oProgram, + oKeyfile, + oDecrypt, + oEncrypt, + oInput + }; + + +/* The list of commands and options. */ +static ARGPARSE_OPTS opts[] = + { + { 301, NULL, 0, N_("@\nCommands:\n ") }, + + { oDecrypt, "decrypt", 0, N_("decryption modus") }, + { oEncrypt, "encrypt", 0, N_("encryption modus") }, + + { 302, NULL, 0, N_("@\nOptions:\n ") }, + + { oClass, "class", 2, N_("tool class (confucius)") }, + { oProgram, "program", 2, N_("program filename") }, + + { oKeyfile, "keyfile", 2, N_("secret key file (required)") }, + { oInput, "inputfile", 2, N_("input file name (default stdin)") }, + { oVerbose, "verbose", 0, N_("verbose") }, + { oQuiet, "quiet", 0, N_("quiet") }, + { oLogFile, "log-file", 2, N_("use a log file for the server") }, + { oOptions, "options" , 2, N_("|FILE|read options from FILE") }, + + /* Hidden options. */ + { oNoVerbose, "no-verbose", 0, "@" }, + { oHomedir, "homedir", 2, "@" }, + { oNoOptions, "no-options", 0, "@" },/* shortcut for --options /dev/null */ + + {0} + }; + + +/* We keep all global options in the structure OPT. */ +struct +{ + int verbose; /* Verbosity level. */ + int quiet; /* Be extra quiet. */ + const char *homedir; /* Configuration directory name */ + + char *class; + char *program; + char *keyfile; + char *input; +} opt; + + +/* Print usage information and and provide strings for help. */ +static const char * +my_strusage (int level) +{ + const char *p; + + switch (level) + { + case 11: p = "symcryptrun (GnuPG)"; + break; + case 13: p = VERSION; break; + case 17: p = PRINTABLE_OS_NAME; break; + case 19: p = _("Please report bugs to <" PACKAGE_BUGREPORT ">.\n"); + break; + case 1: + case 40: p = _("Usage: symcryptrun [options] (-h for help)"); + break; + case 41: + p = _("Syntax: symcryptrun --class CLASS --program PROGRAM " + "--keyfile KEYFILE [options...] COMMAND [inputfile]\n" + "Call a simple symmetric encryption tool\n"); + break; + case 31: p = "\nHome: "; break; + case 32: p = opt.homedir; break; + case 33: p = "\n"; break; + + default: p = NULL; break; + } + return p; +} + + +/* Initialize the gettext system. */ +static void +i18n_init(void) +{ +#ifdef USE_SIMPLE_GETTEXT + set_gettext_file (PACKAGE_GT); +#else +# ifdef ENABLE_NLS + setlocale (LC_ALL, ""); + bindtextdomain (PACKAGE_GT, LOCALEDIR); + textdomain (PACKAGE_GT); +# endif +#endif +} + + +/* This is in the GNU C library in unistd.h. */ + +#ifndef TEMP_FAILURE_RETRY +/* Evaluate EXPRESSION, and repeat as long as it returns -1 with `errno' + set to EINTR. */ + +# define TEMP_FAILURE_RETRY(expression) \ + (__extension__ \ + ({ long int __result; \ + do __result = (long int) (expression); \ + while (__result == -1L && errno == EINTR); \ + __result; })) +#endif + + +/* Unlink a file, and shred it if SHRED is true. */ +int +remove_file (char *name, int shred) +{ + if (!shred) + return unlink (name); + else + { + int status; + pid_t pid; + + pid = fork (); + if (pid == 0) + { + /* Child. */ + + /* -f forces file to be writable, and -u unlinks it afterwards. */ + char *args[] = { SHRED, "-uf", name, NULL }; + + execv (SHRED, args); + _exit (127); + } + else if (pid < 0) + { + /* Fork failed. */ + status = -1; + } + else + { + /* Parent. */ + + if (TEMP_FAILURE_RETRY (waitpid (pid, &status, 0)) != pid) + status = -1; + } + + if (!WIFEXITED (status)) + { + log_error (_("%s on %s aborted with status %i\n"), + SHRED, name, status); + unlink (name); + return 1; + } + else if (WEXITSTATUS (status)) + { + log_error (_("%s on %s failed with status %i\n"), SHRED, name, + WEXITSTATUS (status)); + unlink (name); + return 1; + } + + return 0; + } +} + + +/* Class Confucius. + + "Don't worry that other people don't know you; + worry that you don't know other people." Analects--1.16. */ + +/* Create temporary directory with mode 0700. Returns a dynamically + allocated string with the filename of the directory. */ +static char * +confucius_mktmpdir (void) +{ + char *name; + + name = strdup ("/tmp/gpg-XXXXXX"); + if (!name || !mkdtemp (name)) + { + log_error (_("can't create temporary directory `%s': %s\n"), + name?name:"", strerror (errno)); + return NULL; + } + + return name; +} + + +/* Buffer size for I/O operations. */ +#define CONFUCIUS_BUFSIZE 4096 + +/* Buffer size for output lines. */ +#define CONFUCIUS_LINESIZE 4096 + + +/* Copy the file IN to OUT, either of which may be "-". If PLAIN is + true, and the copying fails, and OUT is not STDOUT, then shred the + file instead unlinking it. */ +static int +confucius_copy_file (char *infile, char *outfile, int plain) +{ + FILE *in; + int in_is_stdin = 0; + FILE *out; + int out_is_stdout = 0; + char data[CONFUCIUS_BUFSIZE]; + ssize_t data_len; + + if (infile[0] == '-' && infile[1] == '\0') + { + /* FIXME: Is stdin in binary mode? */ + in = stdin; + in_is_stdin = 1; + } + else + { + in = fopen (infile, "rb"); + if (!in) + { + log_error (_("could not open %s for writing: %s\n"), + infile, strerror (errno)); + return 1; + } + } + + if (outfile[0] == '-' && outfile[1] == '\0') + { + /* FIXME: Is stdout in binary mode? */ + out = stdout; + out_is_stdout = 1; + } + else + { + out = fopen (outfile, "wb"); + if (!out) + { + log_error (_("could not open %s for writing: %s\n"), + infile, strerror (errno)); + return 1; + } + } + + /* Now copy the data. */ + while ((data_len = fread (data, 1, sizeof (data), in)) > 0) + { + if (fwrite (data, 1, data_len, out) != data_len) + { + log_error (_("error writing to %s: %s\n"), outfile, + strerror (errno)); + goto copy_err; + } + } + if (data_len < 0 || ferror (in)) + { + log_error (_("error reading from %s: %s\n"), infile, strerror (errno)); + goto copy_err; + } + + /* Close IN if appropriate. */ + if (!in_is_stdin && fclose (in) && ferror (in)) + { + log_error (_("error closing %s: %s\n"), infile, strerror (errno)); + goto copy_err; + } + + /* Close OUT if appropriate. */ + if (!out_is_stdout && fclose (out) && ferror (out)) + { + log_error (_("error closing %s: %s\n"), infile, strerror (errno)); + goto copy_err; + } + + return 0; + + copy_err: + if (!out_is_stdout) + remove_file (outfile, plain); + + return 1; +} + + +/* Get a passphrase in secure storage (if possible). If AGAIN is + true, then this is a repeated attempt. If CANCELED is not a null + pointer, it will be set to true or false, depending on if the user + canceled the operation or not. On error (including cancelation), a + null pointer is returned. The passphrase must be deallocated with + confucius_drop_pass. CACHEID is the ID to be used for passphrase + caching and can be NULL to disable caching. */ +char * +confucius_get_pass (const char *cacheid, int again, int *canceled) +{ + int err; + char *pw; +#ifdef HAVE_LANGINFO_CODESET + char *orig_codeset = NULL; +#endif + + if (canceled) + *canceled = 0; + +#ifdef ENABLE_NLS + /* The Assuan agent protocol requires us to transmit utf-8 strings */ + orig_codeset = bind_textdomain_codeset (PACKAGE_GT, NULL); +#ifdef HAVE_LANGINFO_CODESET + if (!orig_codeset) + orig_codeset = nl_langinfo (CODESET); +#endif + if (orig_codeset && !strcmp (orig_codeset, "UTF-8")) + orig_codeset = NULL; + 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_GT, "utf-8")) + orig_codeset = NULL; + } +#endif + + pw = simple_pwquery (cacheid, + again ? _("does not match - try again"):NULL, + _("Passphrase:"), NULL, &err); + +#ifdef ENABLE_NLS + if (orig_codeset) + { + bind_textdomain_codeset (PACKAGE_GT, orig_codeset); + xfree (orig_codeset); + } +#endif + + if (!pw) + { + if (err) + log_error (_("error while asking for the passphrase: %s\n"), + gpg_strerror (err)); + else + { + log_info (_("cancelled\n")); + if (canceled) + *canceled = 1; + } + } + + return pw; +} + + +/* Drop a passphrase retrieved with confucius_get_pass. */ +void +confucius_drop_pass (char *pass) +{ + if (pass) + spwq_secure_free (pass); +} + + +/* Run a confucius crypto engine. If MODE is oEncrypt, encryption is + requested. If it is oDecrypt, decryption is requested. INFILE and + OUTFILE are the temporary files used in the process. */ +int +confucius_process (int mode, char *infile, char *outfile, + int argc, char *argv[]) +{ + char **args; + int cstderr[2]; + int master; + int slave; + int res; + pid_t pid; + pid_t wpid; + int tries = 0; + char cacheid[40]; + + signal (SIGPIPE, SIG_IGN); + + if (!opt.program) + { + log_error (_("no --program option provided\n")); + return 1; + } + + if (mode != oDecrypt && mode != oEncrypt) + { + log_error (_("only --decrypt and --encrypt are supported\n")); + return 1; + } + + if (!opt.keyfile) + { + log_error (_("no --keyfile option provided\n")); + return 1; + } + + /* Generate a hash from the keyfile name for caching. */ + snprintf (cacheid, sizeof (cacheid), "confucius:%lu", + hash_string (opt.keyfile)); + cacheid[sizeof (cacheid) - 1] = '\0'; + args = malloc (sizeof (char *) * (10 + argc)); + if (!args) + { + log_error (_("cannot allocate args vector\n")); + return 1; + } + args[0] = opt.program; + args[1] = (mode == oEncrypt) ? "-m1" : "-m2"; + args[2] = "-q"; + args[3] = infile; + args[4] = "-z"; + args[5] = outfile; + args[6] = "-s"; + args[7] = opt.keyfile; + args[8] = (mode == oEncrypt) ? "-af" : "-f"; + args[9 + argc] = NULL; + while (argc--) + args[9 + argc] = argv[argc]; + + if (pipe (cstderr) < 0) + { + log_error (_("could not create pipe: %s\n"), strerror (errno)); + free (args); + return 1; + } + + if (openpty (&master, &slave, NULL, NULL, NULL) == -1) + { + log_error (_("could not create pty: %s\n"), strerror (errno)); + close (cstderr[0]); + close (cstderr[1]); + free (args); + return -1; + } + + /* We don't want to deal with the worst case scenarios. */ + assert (master > 2); + assert (slave > 2); + assert (cstderr[0] > 2); + assert (cstderr[1] > 2); + + pid = fork (); + if (pid < 0) + { + log_error (_("could not fork: %s\n"), strerror (errno)); + close (master); + close (slave); + close (cstderr[0]); + close (cstderr[1]); + free (args); + return 1; + } + else if (pid == 0) + { + /* Child. */ + + /* Close the parent ends. */ + close (master); + close (cstderr[0]); + + /* Change controlling terminal. */ + if (login_tty (slave)) + { + /* It's too early to output a debug message. */ + _exit (1); + } + + dup2 (cstderr[1], 2); + close (cstderr[1]); + + /* Now kick off the engine program. */ + execv (opt.program, args); + log_error (_("execv failed: %s\n"), strerror (errno)); + _exit (1); + } + else + { + /* Parent. */ + char buffer[CONFUCIUS_LINESIZE]; + int buffer_len = 0; + fd_set fds; + int slave_closed = 0; + int stderr_closed = 0; + + close (slave); + close (cstderr[1]); + free (args); + + /* Listen on the output FDs. */ + do + { + FD_ZERO (&fds); + + if (!slave_closed) + FD_SET (master, &fds); + if (!stderr_closed) + FD_SET (cstderr[0], &fds); + + res = select (FD_SETSIZE, &fds, NULL, NULL, NULL); + if (res < 0) + { + log_error (_("select failed: %s\n"), strerror (errno)); + + kill (pid, SIGTERM); + close (master); + close (cstderr[0]); + return 1; + } + + if (FD_ISSET (cstderr[0], &fds)) + { + /* We got some output on stderr. This is just passed + through via the logging facility. */ + + res = read (cstderr[0], &buffer[buffer_len], + sizeof (buffer) - buffer_len - 1); + if (res < 0) + { + log_error (_("read failed: %s\n"), strerror (errno)); + + kill (pid, SIGTERM); + close (master); + close (cstderr[0]); + return 1; + } + else + { + char *newline; + + buffer_len += res; + for (;;) + { + buffer[buffer_len] = '\0'; + newline = strchr (buffer, '\n'); + if (newline) + { + *newline = '\0'; + log_error ("%s\n", buffer); + buffer_len -= newline + 1 - buffer; + memmove (buffer, newline + 1, buffer_len); + } + else if (buffer_len == sizeof (buffer) - 1) + { + /* Overflow. */ + log_error ("%s\n", buffer); + buffer_len = 0; + } + else + break; + } + + if (res == 0) + stderr_closed = 1; + } + } + else if (FD_ISSET (master, &fds)) + { + char data[512]; + + res = read (master, data, sizeof (data)); + if (res < 0) + { + if (errno == EIO) + { + /* Slave-side close leads to readable fd and + EIO. */ + slave_closed = 1; + } + else + { + log_error (_("pty read failed: %s\n"), strerror (errno)); + + kill (pid, SIGTERM); + close (master); + close (cstderr[0]); + return 1; + } + } + else if (res == 0) + /* This never seems to be what happens on slave-side + close. */ + slave_closed = 1; + else + { + /* Check for password prompt. */ + if (data[res - 1] == ':') + { + char *pass; + int canceled; + + /* If this is not the first attempt, the + passphrase seems to be wrong, so clear the + cache. */ + if (tries) + simple_pwclear (cacheid); + + pass = confucius_get_pass (cacheid, + tries ? 1 : 0, &canceled); + if (!pass) + { + kill (pid, SIGTERM); + close (master); + close (cstderr[0]); + return canceled ? SYMC_CANCELED : 1; + } + write (master, pass, strlen (pass)); + write (master, "\n", 1); + confucius_drop_pass (pass); + + tries++; + } + } + } + } + while (!stderr_closed || !slave_closed); + + close (master); + close (cstderr[0]); + + wpid = waitpid (pid, &res, 0); + if (wpid < 0) + { + log_error (_("waitpid failed: %s\n"), strerror (errno)); + + kill (pid, SIGTERM); + /* State of cached password is unclear. Just remove it. */ + simple_pwclear (cacheid); + return 1; + } + else + { + /* Shouldn't happen, as we don't use WNOHANG. */ + assert (wpid != 0); + + if (!WIFEXITED (res)) + { + log_error (_("child aborted with status %i\n"), res); + + /* State of cached password is unclear. Just remove it. */ + simple_pwclear (cacheid); + + return 1; + } + + if (WEXITSTATUS (res)) + { + /* The passphrase was wrong. Remove it from the cache. */ + simple_pwclear (cacheid); + + /* We probably exceeded our number of attempts at guessing + the password. */ + if (tries >= 3) + return SYMC_BAD_PASSPHRASE; + else + return 1; + } + + return 0; + } + } + + /* Not reached. */ +} + + +/* Class confucius main program. If MODE is oEncrypt, encryption is + requested. If it is oDecrypt, decryption is requested. The other + parameters are taken from the global option data. */ +int +confucius_main (int mode, int argc, char *argv[]) +{ + int res; + char *tmpdir; + char *infile; + int infile_from_stdin = 0; + char *outfile; + + tmpdir = confucius_mktmpdir (); + if (!tmpdir) + return 1; + + if (opt.input && !(opt.input[0] == '-' && opt.input[1] == '\0')) + infile = xstrdup (opt.input); + else + { + infile_from_stdin = 1; + + /* TMPDIR + "/" + "in" + "\0". */ + infile = malloc (strlen (tmpdir) + 1 + 2 + 1); + if (!infile) + { + log_error (_("cannot allocate infile string: %s\n"), + strerror (errno)); + rmdir (tmpdir); + return 1; + } + strcpy (infile, tmpdir); + strcat (infile, "/in"); + } + + /* TMPDIR + "/" + "out" + "\0". */ + outfile = malloc (strlen (tmpdir) + 1 + 3 + 1); + if (!outfile) + { + log_error (_("cannot allocate outfile string: %s\n"), strerror (errno)); + free (infile); + rmdir (tmpdir); + return 1; + } + strcpy (outfile, tmpdir); + strcat (outfile, "/out"); + + if (infile_from_stdin) + { + /* Create INFILE and fill it with content. */ + res = confucius_copy_file ("-", infile, mode == oEncrypt); + if (res) + { + free (outfile); + free (infile); + rmdir (tmpdir); + return res; + } + } + + /* Run the engine and thus create the output file, handling + passphrase retrieval. */ + res = confucius_process (mode, infile, outfile, argc, argv); + if (res) + { + remove_file (outfile, mode == oDecrypt); + if (infile_from_stdin) + remove_file (infile, mode == oEncrypt); + free (outfile); + free (infile); + rmdir (tmpdir); + return res; + } + + /* Dump the output file to stdout. */ + res = confucius_copy_file (outfile, "-", mode == oDecrypt); + if (res) + { + remove_file (outfile, mode == oDecrypt); + if (infile_from_stdin) + remove_file (infile, mode == oEncrypt); + free (outfile); + free (infile); + rmdir (tmpdir); + return res; + } + + remove_file (outfile, mode == oDecrypt); + if (infile_from_stdin) + remove_file (infile, mode == oEncrypt); + free (outfile); + free (infile); + rmdir (tmpdir); + return 0; +} + + +/* symcryptrun's entry point. */ +int +main (int argc, char **argv) +{ + ARGPARSE_ARGS pargs; + int orig_argc; + char **orig_argv; + FILE *configfp = NULL; + char *configname = NULL; + unsigned configlineno; + int mode = 0; + int res; + char *logfile = NULL; + int default_config = 1; + + set_strusage (my_strusage); + log_set_prefix ("symcryptrun", 1); + + /* Try to auto set the character set. */ + set_native_charset (NULL); + + i18n_init(); + + opt.homedir = default_homedir (); + + /* Check whether we have a config file given 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 == 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) + opt.homedir = pargs.r.ret_str; + } + + if (default_config) + configname = make_filename (opt.homedir, "symcryptrun.conf", NULL ); + + argc = orig_argc; + argv = orig_argv; + pargs.argc = &argc; + pargs.argv = &argv; + pargs.flags= 1; /* do not remove the args */ + next_pass: + if (configname) + { + configlineno = 0; + configfp = fopen (configname, "r"); + if (!configfp) + { + if (!default_config) + { + log_error (_("option file `%s': %s\n"), + configname, strerror(errno) ); + exit(1); + } + xfree (configname); + configname = NULL; + } + default_config = 0; + } + + /* Parse the command line. */ + while (optfile_parse (configfp, configname, &configlineno, &pargs, opts)) + { + switch (pargs.r_opt) + { + case oDecrypt: mode = oDecrypt; break; + case oEncrypt: mode = oEncrypt; break; + + case oQuiet: opt.quiet = 1; break; + case oVerbose: opt.verbose++; break; + case oNoVerbose: opt.verbose = 0; break; + + case oClass: opt.class = pargs.r.ret_str; break; + case oProgram: opt.program = pargs.r.ret_str; break; + case oKeyfile: opt.keyfile = pargs.r.ret_str; break; + case oInput: opt.input = pargs.r.ret_str; break; + + case oLogFile: logfile = 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 oNoOptions: break; /* no-options */ + case oHomedir: /* Ignore this option here. */; break; + + default : pargs.err = configfp? 1:2; break; + } + } + if (configfp) + { + fclose( configfp ); + configfp = NULL; + configname = NULL; + goto next_pass; + } + xfree (configname); + configname = NULL; + + if (!mode) + log_error (_("either %s or %s must be given\n"), + "--decrypt", "--encrypt"); + + if (log_get_errorcount (0)) + exit (1); + + if (logfile) + log_set_file (logfile); + + gcry_control (GCRYCTL_SUSPEND_SECMEM_WARN); + if (!gcry_check_version (NEED_LIBGCRYPT_VERSION) ) + { + log_fatal( _("libgcrypt is too old (need %s, have %s)\n"), + NEED_LIBGCRYPT_VERSION, gcry_check_version (NULL) ); + } + gcry_set_log_handler (my_gcry_logger, NULL); + gcry_control (GCRYCTL_INIT_SECMEM, 16384, 0); + + if (!opt.class) + { + log_error (_("no class provided\n")); + res = 1; + } + else if (!strcmp (opt.class, "confucius")) + res = confucius_main (mode, argc, argv); + else + { + log_error (_("class %s is not supported\n"), opt.class); + res = 1; + } + + return res; +} diff --git a/tools/watchgnupg.c b/tools/watchgnupg.c new file mode 100644 index 000000000..051ca50fe --- /dev/null +++ b/tools/watchgnupg.c @@ -0,0 +1,402 @@ +/* watchgnupg.c - Socket server for GnuPG logs + * 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. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif +#include <stdio.h> +#include <stdlib.h> +#include <stddef.h> +#include <string.h> +#include <errno.h> +#include <stdarg.h> +#include <assert.h> +#include <unistd.h> +#include <sys/socket.h> +#include <sys/un.h> +#include <fcntl.h> +#include <time.h> + +#define PGM "watchgnupg" + +/* Allow for a standalone build. */ +#ifdef VERSION +#define MYVERSION_LINE PGM " (GnuPG) " VERSION +#define BUGREPORT_LINE "\nReport bugs to <bug-gnupg@gnu.org>.\n" +#else +#define MYVERSION_LINE PGM +#define BUGREPORT_LINE "" +#endif + +#ifndef PF_LOCAL +# ifdef PF_UNIX +# define PF_LOCAL PF_UNIX +# else +# define PF_LOCAL AF_UNIX +# endif +# ifndef AF_LOCAL +# define AF_LOCAL AF_UNIX +# endif +#endif + + +static int verbose; + + +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); +} + + +/* static void */ +/* err (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"); + return p; +} + +static void * +xcalloc (size_t n, size_t m) +{ + void *p = calloc (n, m); + if (!p) + die ("out of core"); + return p; +} + +static void * +xrealloc (void *old, size_t n) +{ + void *p = realloc (old, n); + if (!p) + die ("out of core"); + return p; +} + + +struct client_s { + struct client_s *next; + int fd; + size_t size; /* Allocated size of buffer. */ + size_t len; /* Current length of buffer. */ + unsigned char *buffer; /* Buffer to with data already read. */ + +}; +typedef struct client_s *client_t; + + + +static void +print_fd_and_time (int fd) +{ + struct tm *tp; + time_t atime = time (NULL); + + tp = localtime (&atime); + printf ("%3d - %04d-%02d-%02d %02d:%02d:%02d ", + fd, + 1900+tp->tm_year, tp->tm_mon+1, tp->tm_mday, + tp->tm_hour, tp->tm_min, tp->tm_sec ); +} + + +/* Print LINE for the client identified by C. Calling this function + witgh LINE set to NULL, will flush the internal buffer. */ +static void +print_line (client_t c, const char *line) +{ + const char *s; + size_t n; + + if (!line) + { + if (c->buffer && c->len) + { + print_fd_and_time (c->fd); + fwrite (c->buffer, c->len, 1, stdout); + putc ('\n', stdout); + c->len = 0; + } + return; + } + + while ((s = strchr (line, '\n'))) + { + print_fd_and_time (c->fd); + if (c->buffer && c->len) + { + fwrite (c->buffer, c->len, 1, stdout); + c->len = 0; + } + fwrite (line, s - line + 1, 1, stdout); + line = s + 1; + } + n = strlen (line); + if (n) + { + if (c->len + n >= c->size) + { + c->size += ((n + 255) & ~255); + c->buffer = (c->buffer + ? xrealloc (c->buffer, c->size) + : xmalloc (c->size)); + } + memcpy (c->buffer + c->len, line, n); + c->len += n; + } +} + + +static void +print_version (int with_help) +{ + fputs (MYVERSION_LINE "\n" + "Copyright (C) 2004 Free Software Foundation, Inc.\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.\n", + stdout); + + if (with_help) + fputs ("\n" + "Usage: " PGM " [OPTIONS] SOCKETNAME\n" + "Open the local socket SOCKETNAME and display log messages\n" + "\n" + " --force delete an already existing socket file\n" + " --verbose enable extra informational output\n" + " --version print version of the program and exit\n" + " --help display this help and exit\n" + BUGREPORT_LINE, stdout ); + + exit (0); +} + +int +main (int argc, char **argv) +{ + int last_argc = -1; + int force = 0; + + struct sockaddr_un srvr_addr; + socklen_t addrlen; + int server; + int flags; + client_t client_list = NULL; + + if (argc) + { + argc--; argv++; + } + while (argc && last_argc != argc ) + { + last_argc = argc; + if (!strcmp (*argv, "--")) + { + argc--; argv++; + break; + } + else if (!strcmp (*argv, "--version")) + print_version (0); + else if (!strcmp (*argv, "--help")) + print_version (1); + else if (!strcmp (*argv, "--verbose")) + { + verbose = 1; + argc--; argv++; + } + else if (!strcmp (*argv, "--force")) + { + force = 1; + argc--; argv++; + } + } + + if (argc != 1) + { + fprintf (stderr, "usage: " PGM " socketname\n"); + exit (1); + } + + + if (verbose) + fprintf (stderr, "opening socket `%s'\n", *argv); + + setvbuf (stdout, NULL, _IOLBF, 0); + + server = socket (PF_LOCAL, SOCK_STREAM, 0); + if (server == -1) + die ("socket() failed: %s\n", strerror (errno)); + + /* We better set the listening socket to non-blocking so that we + don't get bitten by race conditions in accept. The should not + happen for Unix Domain sockets but well, shit happens. */ + flags = fcntl (server, F_GETFL, 0); + if (flags == -1) + die ("fcntl (F_GETFL) failed: %s\n", strerror (errno)); + if ( fcntl (server, F_SETFL, (flags | O_NONBLOCK)) == -1) + die ("fcntl (F_SETFL) failed: %s\n", strerror (errno)); + + + memset (&srvr_addr, 0, sizeof srvr_addr); + srvr_addr.sun_family = AF_LOCAL; + strncpy (srvr_addr.sun_path, *argv, sizeof (srvr_addr.sun_path) - 1); + srvr_addr.sun_path[sizeof (srvr_addr.sun_path) - 1] = 0; + addrlen = (offsetof (struct sockaddr_un, sun_path) + + strlen (srvr_addr.sun_path) + 1); + + + again: + if (bind (server, (struct sockaddr *) &srvr_addr, addrlen)) + { + if (errno == EADDRINUSE && force) + { + force = 0; + remove (srvr_addr.sun_path); + goto again; + } + die ("bind to `%s' failed: %s\n", *argv, strerror (errno)); + } + + if (listen (server, 5)) + die ("listen failed: %s\n", strerror (errno)); + + for (;;) + { + fd_set rfds; + int max_fd; + client_t client; + + /* Usually we don't have that many connections, thus it is okay + to set them allways from scratch and don't maintain an active + fd_set. */ + FD_ZERO (&rfds); + FD_SET (server, &rfds); + max_fd = server; + for (client = client_list; client; client = client->next) + if (client->fd != -1) + { + FD_SET (client->fd, &rfds); + if (client->fd > max_fd) + max_fd = client->fd; + } + + if (select (max_fd + 1, &rfds, NULL, NULL, NULL) <= 0) + continue; /* Ignore any errors. */ + + if (FD_ISSET (server, &rfds)) /* New connection. */ + { + struct sockaddr_un clnt_addr; + int fd; + + addrlen = sizeof clnt_addr; + fd = accept (server, (struct sockaddr *) &clnt_addr, &addrlen); + if (fd == -1) + { + printf ("[accepting connection failed: %s]\n", strerror (errno)); + } + else if (fd >= FD_SETSIZE) + { + close (fd); + printf ("[connection request denied: too many connections]\n"); + } + else + { + for (client = client_list; client && client->fd != -1; + client = client->next) + ; + if (!client) + { + client = xcalloc (1, sizeof *client); + client->next = client_list; + client_list = client; + } + client->fd = fd; + printf ("[client at fd %d connected]\n", client->fd); + } + } + for (client = client_list; client; client = client->next) + if (client->fd != -1 && FD_ISSET (client->fd, &rfds)) + { + char line[256]; + int n; + + n = read (client->fd, line, sizeof line - 1); + if (n < 0) + { + int save_errno = errno; + print_line (client, NULL); /* flush */ + printf ("[client at fd %d read error: %s]\n", + client->fd, strerror (save_errno)); + close (client->fd); + client->fd = -1; + } + else if (!n) + { + print_line (client, NULL); /* flush */ + close (client->fd); + printf ("[client at fd %d disconnected]\n", client->fd); + client->fd = -1; + } + else + { + line[n] = 0; + print_line (client, line); + } + } + } + + return 0; +} + + +/* +Local Variables: +compile-command: "gcc -Wall -g -o watchgnupg watchgnupg.c" +End: +*/ diff --git a/util/ChangeLog b/util/ChangeLog deleted file mode 100644 index 426d4d3c9..000000000 --- a/util/ChangeLog +++ /dev/null @@ -1,1695 +0,0 @@ -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 (Rmi). - -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 (Gal Quri). - -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 (Rmi 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 deleted file mode 100644 index 48457c29f..000000000 --- a/util/Makefile.am +++ /dev/null @@ -1,73 +0,0 @@ -# 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 - -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 - -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 is for the replacement functions -libutil_a_DEPENDENCIES = @LIBOBJS@ -libutil_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/assuan-buffer.c b/util/assuan-buffer.c deleted file mode 100644 index 3c0108601..000000000 --- a/util/assuan-buffer.c +++ /dev/null @@ -1,485 +0,0 @@ -/* 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); -} - - - -/* 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 - **/ - -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 deleted file mode 100644 index 0467f6dc5..000000000 --- a/util/assuan-client.c +++ /dev/null @@ -1,282 +0,0 @@ -/* 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; -} - - - -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 deleted file mode 100644 index 9952b4406..000000000 --- a/util/assuan-connect.c +++ /dev/null @@ -1,96 +0,0 @@ -/* 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 deleted file mode 100644 index 67c4e13ce..000000000 --- a/util/assuan-defs.h +++ /dev/null @@ -1,244 +0,0 @@ -/* 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 deleted file mode 100644 index c3a8770cb..000000000 --- a/util/assuan-errors.c +++ /dev/null @@ -1,105 +0,0 @@ -/* 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 deleted file mode 100644 index f2d6c876d..000000000 --- a/util/assuan-logging.c +++ /dev/null @@ -1,116 +0,0 @@ -/* 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 deleted file mode 100644 index 0c580cd5f..000000000 --- a/util/assuan-socket-connect.c +++ /dev/null @@ -1,191 +0,0 @@ -/* 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-util.c b/util/assuan-util.c deleted file mode 100644 index db3cb7232..000000000 --- a/util/assuan-util.c +++ /dev/null @@ -1,171 +0,0 @@ -/* 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" - - - -/* 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/dotlock.c b/util/dotlock.c deleted file mode 100644 index 9edac57ed..000000000 --- a/util/dotlock.c +++ /dev/null @@ -1,454 +0,0 @@ -/* 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 deleted file mode 100644 index 75498f80e..000000000 --- a/util/errors.c +++ /dev/null @@ -1,116 +0,0 @@ -/* 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 deleted file mode 100644 index 5834e3d89..000000000 --- a/util/fileutil.c +++ /dev/null @@ -1,297 +0,0 @@ -/* 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 deleted file mode 100644 index 41000024f..000000000 --- a/util/http.c +++ /dev/null @@ -1,1076 +0,0 @@ -/* 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 deleted file mode 100644 index f6e817c42..000000000 --- a/util/iobuf.c +++ /dev/null @@ -1,2276 +0,0 @@ -/* 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 ); - - - -#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/logger.c b/util/logger.c deleted file mode 100644 index 857436c43..000000000 --- a/util/logger.c +++ /dev/null @@ -1,265 +0,0 @@ -/* 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/memory.c b/util/memory.c deleted file mode 100644 index e16c3d8f7..000000000 --- a/util/memory.c +++ /dev/null @@ -1,647 +0,0 @@ -/* 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/miscutil.c b/util/miscutil.c deleted file mode 100644 index 698e80691..000000000 --- a/util/miscutil.c +++ /dev/null @@ -1,480 +0,0 @@ -/* 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; -} - -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/mkdtemp.c b/util/mkdtemp.c deleted file mode 100644 index c0ee0bbdb..000000000 --- a/util/mkdtemp.c +++ /dev/null @@ -1,99 +0,0 @@ -/* 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/regcomp.c b/util/regcomp.c deleted file mode 100644 index 766339945..000000000 --- a/util/regcomp.c +++ /dev/null @@ -1,3495 +0,0 @@ -/* 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); - -/* 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 - }; - -/* 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; - } - } -} - -/* 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 - -/* 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 */ - -/* 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; -} - -/* 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; -} - -/* 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; -} - -/* 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; -} - -#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 */ - -/* 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 deleted file mode 100644 index 34d412002..000000000 --- a/util/regex.c +++ /dev/null @@ -1,62 +0,0 @@ -/* 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 deleted file mode 100644 index 0f8b897b1..000000000 --- a/util/regex_internal.c +++ /dev/null @@ -1,1229 +0,0 @@ -/* 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); - -/* 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; -} - -/* 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; -} - - -/* 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 deleted file mode 100644 index 679bea11b..000000000 --- a/util/regex_internal.h +++ /dev/null @@ -1,643 +0,0 @@ -/* 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); - - -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 deleted file mode 100644 index 40d305899..000000000 --- a/util/regexec.c +++ /dev/null @@ -1,3225 +0,0 @@ -/* 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); - -/* 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 - -/* 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 */ - -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 */ - - -/* 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; -} - - -/* 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/riscos.c b/util/riscos.c deleted file mode 100644 index b94ff5318..000000000 --- a/util/riscos.c +++ /dev/null @@ -1,436 +0,0 @@ -/* riscos.c - RISC OS stuff - * Copyright (C) 2001 Free Software Foundation, Inc. - * - * This file is part of GnuPG for RISC OS. - * - * GnuPG is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * GnuPG is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public 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 __RISCOS__C__ -#define __RISCOS__C__ - -#include <config.h> -#include <stdlib.h> -#include <string.h> -#include <signal.h> -#include <fcntl.h> -#include <unistd.h> -#include <errno.h> -#include <kernel.h> -#include <swis.h> -#include "util.h" -#include "memory.h" - -#include <unixlib/local.h> /* needed for RISCOSIFY_NO_PROCESS */ -#define __UNIXLIB_INTERNALS -#include <unixlib/swiparams.h> /* needed for MMM_TYPE_* definitions */ -#undef __UNIXLIB_INTERNALS - - -/* static symbols that trigger UnixLib behaviour */ - -int __riscosify_control = __RISCOSIFY_NO_PROCESS; -int __feature_imagefs_is_file = 1; - - -/* RISC OS file open descriptor control list */ - -struct fds_item { - int fd; - struct fds_item *next; -}; -static struct fds_item *fds_list = NULL; -static int fdlist_initialized = 0; - - -/* local RISC OS functions */ - -static int -is_read_only(const char *filename) -{ - int type, attr; - - if (_swix(OS_File, _INR(0,1) | _OUT(0) | _OUT(5), - 17, filename, &type, &attr)) - log_fatal("Can't get file attributes for file \"%s\"!\n", filename); - - if (type == 0) - log_fatal("Can't find file \"%s\"!\n", filename); - - if (_swix(OS_File, _INR(0,1) | _IN(5), 4, filename, attr)) - return 1; - - return 0; -} - -/* exported RISC OS functions */ - -int -riscos_load_module(const char *name, const char * const path[], int fatal) -{ - int i; - - /* Is module already loaded? */ - if (!_swix(OS_Module, _INR(0,1), 18, name)) - return 1; - - /* Check all the places where the module could be located */ - for (i=0; path[i]; ++i) - if (!_swix(OS_Module, _INR(0,1), 1, path[i])) - return 1; - - /* Can't find module in the default locations */ - if (fatal) - log_fatal("Operation cannot be performed without \"%s\" module!\n", - name); - else - log_info("Can't load \"%s\" module, continuing anyway!\n", name); - - return 0; -} - -int -riscos_get_filetype_from_string(const char *string, int len) -{ - int result = 0xfff; - - if (strlen(string) < 5 || string[len - 4] != ',') - return -1; - - sscanf(string+len-3, "%3x", &result); - - return result; -} - -int -riscos_get_filetype(const char *filename) -{ - int result; - - if (_swix(OS_File, _INR(0,1) | _OUT(2), 17, filename, &result)) - log_fatal("Can't get filetype for file \"%s\"!\n", filename); - - if ((result & 0xfff00000) == 0xfff00000) - return (result & 0xfff00) >> 8; - else - return 0; -} - -void -riscos_set_filetype_by_number(const char *filename, int type) -{ - if (_swix(OS_File, _INR(0,2), 18, filename, type)) - log_fatal("Can't set filetype for file \"%s\"!\n" - "Is the file on a read-only file system?\n", filename); -} - -void -riscos_set_filetype_by_mimetype(const char *filename, const char *mimetype) -{ - int result; - - if (_swix(MimeMap_Translate, _INR(0,2) | _OUT(3), - MMM_TYPE_MIME, mimetype, MMM_TYPE_RISCOS, &result)) - log_fatal("Can't translate MIME type \"%s\"!\n", mimetype); - - riscos_set_filetype_by_number(filename, result); -} - -pid_t -riscos_getpid(void) -{ - int state; - - if (_swix(Wimp_ReadSysInfo, _IN(0) | _OUT(0), 3, &state)) - log_fatal("Wimp_ReadSysInfo failed: Can't get WimpState (R0=3)!\n"); - - if (state) - if (_swix(Wimp_ReadSysInfo, _IN(0) | _OUT(0), 5, &state)) - log_fatal("Wimp_ReadSysInfo failed: " - "Can't get task handle (R0=5)!\n"); - - return (pid_t) state; -} - -int -riscos_kill(pid_t pid, int sig) -{ - int buf[4], iter = 0; - - if (sig) - kill(pid, sig); - - do { - if (_swix(TaskManager_EnumerateTasks, _INR(0,2) | _OUT(0), - iter, buf, 16, &iter)) - log_fatal("TaskManager_EnumerateTasks failed!\n"); - if (buf[0] == pid) - return 0; - } while (iter >= 0); - - return __set_errno(ESRCH); -} - -int -riscos_access(const char *path, int amode) -{ - /* Do additional check, i.e. whether path is on write-protected floppy */ - if ((amode & W_OK) && is_read_only(path)) - return 1; - return access(path, amode); -} - -int -riscos_getchar(void) -{ - int c, flags; - - if (_swix(OS_ReadC, _OUT(0) | _OUT(_FLAGS), &c, &flags)) - log_fatal("OS_ReadC failed: Couldn't read from keyboard!\n"); - if (flags & _C) - log_fatal("OS_ReadC failed: Return Code = %i!\n", c); - - return c; -} - -#ifdef DEBUG -void -riscos_dump_fdlist(void) -{ - struct fds_item *iter = fds_list; - printf("List of open file descriptors:\n"); - while (iter) { - printf(" %i\n", iter->fd); - iter = iter->next; - } -} -#endif /* DEBUG */ - -int -riscos_fdopenfile(const char *filename, const int allow_write) -{ - struct fds_item *h; - int fd; - if (allow_write) - fd = open(filename, O_CREAT | O_TRUNC | O_RDWR, S_IRUSR | S_IWUSR); - else - fd = open(filename, O_RDONLY); - if (fd == -1) - log_error("Can't open file \"%s\": %i, %s!\n", - filename, errno, strerror(errno)); - - if (!fdlist_initialized) { - atexit (riscos_close_fds); - fdlist_initialized = 1; - } - - h = fds_list; - fds_list = (struct fds_item *) xmalloc(sizeof(struct fds_item)); - if (!fds_list) - log_fatal("Can't claim memory for fdopenfile() buffer!\n"); - fds_list->fd = fd; - fds_list->next = h; - - return fd; -} - -void -riscos_close_fds(void) -{ - FILE *fp; - struct fds_item *h = fds_list; - while( fds_list ) { - h = fds_list->next; - fp = fdopen (fds_list->fd, "a"); - if (fp) - fflush(fp); - close(fds_list->fd); - xfree(fds_list); - fds_list = h; - } -} - -int -riscos_renamefile(const char *old, const char *new) -{ - _kernel_oserror *e; - - if (e = _swix(OS_FSControl, _INR(0,2), 25, old, new)) { - if (e->errnum == 214) - return __set_errno(ENOENT); - if (e->errnum == 176) - return __set_errno(EEXIST); - printf("Error during renaming: %i, %s!\n", e->errnum, e->errmess); - return __set_errno(EOPSYS); - } - return 0; -} - -char * -riscos_gstrans(const char *old) -{ - int size = 256, last; - char *buf, *tmp; - - buf = (char *) xmalloc(size); - if (!buf) - log_fatal("Can't claim memory for OS_GSTrans buffer!\n"); - while (_C & _swi(OS_GSTrans, _INR(0,2) | _OUT(2) | _RETURN(_FLAGS), - old, buf, size, &last)) { - size += 256; - tmp = (char *) xrealloc(buf, size); - if (!tmp) - log_fatal("Can't claim memory for OS_GSTrans buffer!\n"); - buf = tmp; - } - - buf[last] = '\0'; - tmp = (char *) xrealloc(buf, last + 1); - if (!tmp) - log_fatal("Can't realloc memory after OS_GSTrans!\n"); - - return tmp; -} - -/*************** - * Extract from a given path the filename component. - * (cloned from util/fileutil.c and then heavily modified) - */ -char * -riscos_make_basename(const char *filepath, const char *realfname) -{ - char *result, *p; - int i, filetype; - - if ( (p = strrchr(filepath, DIRSEP_C)) ) - p++; - else if ( (p = strrchr(filepath, ':')) ) - p++; - else - p = (char*) filepath; - - i = strlen(p); - result = xmalloc(i + 5); - if (!result) - log_fatal("Can't claim memory for riscos_make_basename() buffer!\n"); - strcpy(result, p); - - filetype = riscos_get_filetype( realfname ); - result[i++] = ','; - result[i++] = "0123456789abcdef"[(filetype >> 8) & 0xf]; - result[i++] = "0123456789abcdef"[(filetype >> 4) & 0xf]; - result[i++] = "0123456789abcdef"[(filetype >> 0) & 0xf]; - result[i] = 0; - - for(i=0; i<strlen(result); ++i) - if(result[i] == '/') - result[i] = '.'; - - return result; -} - -#define RegEx_CompilePattern 0x52AC0 -#define RegEx_Search 0x52AC2 -#define RegEx_Free 0x52AC7 -#define RegEx_CompileExtendedPattern 0x52AC9 - -static const char * const regex_path[] = { - "GnuPG:RegEx", - "System:310.Modules.RegEx", - "System:Modules.RegEx", - NULL -}; - -int -riscos_check_regexp(const char *exp, const char *string, int debug) -{ - static int regex_initialized = 0; - int ret; - char *buf; - - if (!regex_initialized) - regex_initialized = riscos_load_module("RegEx", regex_path, 0); - - if (!regex_initialized) { - log_info("Regular expressions cannot be used!\n"); - return 0; - } - - if (_swix(RegEx_CompileExtendedPattern, _INR(0,2) | _OUT(0) | _OUT(3), - 0, exp, 1<<18, - &buf, &ret)) { - log_info("RegEx could not compile pattern \"%s\".\n", exp); - log_info("ErrorCode = %i\n", ret); - return 0; - } - - if (_swix(RegEx_Search, _INR(0,4) | _OUT(5), - buf, string, -1, 0, -1, - &ret)) { - log_info("RegEx error during execution of serach pattern \"%s\"\n", - exp); - log_info("on string \"%s\"\n", string); - return 0; - } - - _swix(RegEx_Free, _IN(0), buf); - - if(debug) - log_debug("regexp \"%s\" on \"%s\": %s\n",exp,string,ret>=0?"YES":"NO"); - - return (ret>=0); -} - -#ifdef DEBUG -void -riscos_list_openfiles(void) -{ - char *name; - int i, len; - - for (i = 255; i >= 0; --i) { - if (_swix(OS_Args, _INR(0,2) | _IN(5) | _OUT(5), 7, i, 0, 0, &len)) - continue; - - name = (char *) xmalloc(1-len); - if (!name) - log_fatal("Can't claim memory for OS_Args buffer!\n"); - - if (_swix(OS_Args, _INR(0,2) | _IN(5), 7, i, name, 1-len)) { - xfree(name); - log_fatal("Error when calling OS_Args(7)!\n"); - } - - if (_swix(OS_Args, _INR(0,1) | _OUT(0), 254, i, &len)) { - xfree(name); - log_fatal("Error when calling OS_Args(254)!\n"); - } - - printf("%3i: %s (%c%c)\n", i, name, - (len & 0x40) ? 'R' : 0, - (len & 0x80) ? 'W' : 0); - xfree(name); - } -} -#endif - -void -riscos_not_implemented(const char *feature) -{ - log_info("%s is not implemented in the RISC OS version!\n", feature); -} - -#endif /* !__RISCOS__C__ */ diff --git a/util/secmem.c b/util/secmem.c deleted file mode 100644 index 5ffbfc6d3..000000000 --- a/util/secmem.c +++ /dev/null @@ -1,499 +0,0 @@ -/* 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/srv.c b/util/srv.c deleted file mode 100644 index 95187dbc8..000000000 --- a/util/srv.c +++ /dev/null @@ -1,257 +0,0 @@ -/* 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 deleted file mode 100644 index a81ebd573..000000000 --- a/util/srv.h +++ /dev/null @@ -1,51 +0,0 @@ -/* 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 deleted file mode 100644 index cffdfcf77..000000000 --- a/util/strgutil.c +++ /dev/null @@ -1,1373 +0,0 @@ -/* 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_STRSEP -/* 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; -} -#endif /*HAVE_STRSEP*/ - - -#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/timegm.c b/util/timegm.c deleted file mode 100644 index 3b7931e7c..000000000 --- a/util/timegm.c +++ /dev/null @@ -1,68 +0,0 @@ -/* 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/zlib/ChangeLog b/zlib/ChangeLog deleted file mode 100644 index 5f06bcc7b..000000000 --- a/zlib/ChangeLog +++ /dev/null @@ -1,505 +0,0 @@ -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 Lvset <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$. 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 deleted file mode 100644 index 2c1e9cda4..000000000 --- a/zlib/Makefile.am +++ /dev/null @@ -1,28 +0,0 @@ -# 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/README b/zlib/README deleted file mode 100644 index 8ff458799..000000000 --- a/zlib/README +++ /dev/null @@ -1,148 +0,0 @@ -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 deleted file mode 100644 index fae88b655..000000000 --- a/zlib/adler32.c +++ /dev/null @@ -1,48 +0,0 @@ -/* 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$ */ - -#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 deleted file mode 100644 index 01902aff6..000000000 --- a/zlib/algorithm.doc +++ /dev/null @@ -1,105 +0,0 @@ -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 deleted file mode 100644 index 814bd9d60..000000000 --- a/zlib/compress.c +++ /dev/null @@ -1,68 +0,0 @@ -/* 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$ */ - -#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 deleted file mode 100644 index 60deca2dd..000000000 --- a/zlib/crc32.c +++ /dev/null @@ -1,162 +0,0 @@ -/* 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$ */ - -#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 deleted file mode 100644 index 16ebdade3..000000000 --- a/zlib/deflate.c +++ /dev/null @@ -1,1350 +0,0 @@ -/* 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$ */ - -#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 deleted file mode 100644 index b99a48a52..000000000 --- a/zlib/deflate.h +++ /dev/null @@ -1,318 +0,0 @@ -/* 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$ */ - -#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/example.c b/zlib/example.c deleted file mode 100644 index e7e367333..000000000 --- a/zlib/example.c +++ /dev/null @@ -1,556 +0,0 @@ -/* example.c -- usage example 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$ */ - -#include <stdio.h> -#include "zlib.h" - -#ifdef STDC -# include <string.h> -# include <stdlib.h> -#else - extern void exit OF((int)); -#endif - -#if defined(VMS) || defined(RISCOS) -# define TESTFILE "foo-gz" -#else -# define TESTFILE "foo.gz" -#endif - -#define CHECK_ERR(err, msg) { \ - if (err != Z_OK) { \ - fprintf(stderr, "%s error: %d\n", msg, err); \ - exit(1); \ - } \ -} - -const char hello[] = "hello, hello!"; -/* "hello world" would be more standard, but the repeated "hello" - * stresses the compression code better, sorry... - */ - -const char dictionary[] = "hello"; -uLong dictId; /* Adler32 value of the dictionary */ - -void test_compress OF((Byte *compr, uLong comprLen, - Byte *uncompr, uLong uncomprLen)); -void test_gzio OF((const char *out, const char *in, - Byte *uncompr, int uncomprLen)); -void test_deflate OF((Byte *compr, uLong comprLen)); -void test_inflate OF((Byte *compr, uLong comprLen, - Byte *uncompr, uLong uncomprLen)); -void test_large_deflate OF((Byte *compr, uLong comprLen, - Byte *uncompr, uLong uncomprLen)); -void test_large_inflate OF((Byte *compr, uLong comprLen, - Byte *uncompr, uLong uncomprLen)); -void test_flush OF((Byte *compr, uLong *comprLen)); -void test_sync OF((Byte *compr, uLong comprLen, - Byte *uncompr, uLong uncomprLen)); -void test_dict_deflate OF((Byte *compr, uLong comprLen)); -void test_dict_inflate OF((Byte *compr, uLong comprLen, - Byte *uncompr, uLong uncomprLen)); -int main OF((int argc, char *argv[])); - -/* =========================================================================== - * Test compress() and uncompress() - */ -void test_compress(compr, comprLen, uncompr, uncomprLen) - Byte *compr, *uncompr; - uLong comprLen, uncomprLen; -{ - int err; - uLong len = strlen(hello)+1; - - err = compress(compr, &comprLen, (const Bytef*)hello, len); - CHECK_ERR(err, "compress"); - - strcpy((char*)uncompr, "garbage"); - - err = uncompress(uncompr, &uncomprLen, compr, comprLen); - CHECK_ERR(err, "uncompress"); - - if (strcmp((char*)uncompr, hello)) { - fprintf(stderr, "bad uncompress\n"); - exit(1); - } else { - printf("uncompress(): %s\n", (char *)uncompr); - } -} - -/* =========================================================================== - * Test read/write of .gz files - */ -void test_gzio(out, in, uncompr, uncomprLen) - const char *out; /* compressed output file */ - const char *in; /* compressed input file */ - Byte *uncompr; - int uncomprLen; -{ - int err; - int len = strlen(hello)+1; - gzFile file; - z_off_t pos; - - file = gzopen(out, "wb"); - if (file == NULL) { - fprintf(stderr, "gzopen error\n"); - exit(1); - } - gzputc(file, 'h'); - if (gzputs(file, "ello") != 4) { - fprintf(stderr, "gzputs err: %s\n", gzerror(file, &err)); - exit(1); - } - if (gzprintf(file, ", %s!", "hello") != 8) { - fprintf(stderr, "gzprintf err: %s\n", gzerror(file, &err)); - exit(1); - } - gzseek(file, 1L, SEEK_CUR); /* add one zero byte */ - gzclose(file); - - file = gzopen(in, "rb"); - if (file == NULL) { - fprintf(stderr, "gzopen error\n"); - } - strcpy((char*)uncompr, "garbage"); - - uncomprLen = gzread(file, uncompr, (unsigned)uncomprLen); - if (uncomprLen != len) { - fprintf(stderr, "gzread err: %s\n", gzerror(file, &err)); - exit(1); - } - if (strcmp((char*)uncompr, hello)) { - fprintf(stderr, "bad gzread: %s\n", (char*)uncompr); - exit(1); - } else { - printf("gzread(): %s\n", (char *)uncompr); - } - - pos = gzseek(file, -8L, SEEK_CUR); - if (pos != 6 || gztell(file) != pos) { - fprintf(stderr, "gzseek error, pos=%ld, gztell=%ld\n", - (long)pos, (long)gztell(file)); - exit(1); - } - - if (gzgetc(file) != ' ') { - fprintf(stderr, "gzgetc error\n"); - exit(1); - } - - gzgets(file, (char*)uncompr, uncomprLen); - uncomprLen = strlen((char*)uncompr); - if (uncomprLen != 6) { /* "hello!" */ - fprintf(stderr, "gzgets err after gzseek: %s\n", gzerror(file, &err)); - exit(1); - } - if (strcmp((char*)uncompr, hello+7)) { - fprintf(stderr, "bad gzgets after gzseek\n"); - exit(1); - } else { - printf("gzgets() after gzseek: %s\n", (char *)uncompr); - } - - gzclose(file); -} - -/* =========================================================================== - * Test deflate() with small buffers - */ -void test_deflate(compr, comprLen) - Byte *compr; - uLong comprLen; -{ - z_stream c_stream; /* compression stream */ - int err; - int len = strlen(hello)+1; - - c_stream.zalloc = (alloc_func)0; - c_stream.zfree = (free_func)0; - c_stream.opaque = (voidpf)0; - - err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION); - CHECK_ERR(err, "deflateInit"); - - c_stream.next_in = (Bytef*)hello; - c_stream.next_out = compr; - - while (c_stream.total_in != (uLong)len && c_stream.total_out < comprLen) { - c_stream.avail_in = c_stream.avail_out = 1; /* force small buffers */ - err = deflate(&c_stream, Z_NO_FLUSH); - CHECK_ERR(err, "deflate"); - } - /* Finish the stream, still forcing small buffers: */ - for (;;) { - c_stream.avail_out = 1; - err = deflate(&c_stream, Z_FINISH); - if (err == Z_STREAM_END) break; - CHECK_ERR(err, "deflate"); - } - - err = deflateEnd(&c_stream); - CHECK_ERR(err, "deflateEnd"); -} - -/* =========================================================================== - * Test inflate() with small buffers - */ -void test_inflate(compr, comprLen, uncompr, uncomprLen) - Byte *compr, *uncompr; - uLong comprLen, uncomprLen; -{ - int err; - z_stream d_stream; /* decompression stream */ - - strcpy((char*)uncompr, "garbage"); - - d_stream.zalloc = (alloc_func)0; - d_stream.zfree = (free_func)0; - d_stream.opaque = (voidpf)0; - - d_stream.next_in = compr; - d_stream.avail_in = 0; - d_stream.next_out = uncompr; - - err = inflateInit(&d_stream); - CHECK_ERR(err, "inflateInit"); - - while (d_stream.total_out < uncomprLen && d_stream.total_in < comprLen) { - d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */ - err = inflate(&d_stream, Z_NO_FLUSH); - if (err == Z_STREAM_END) break; - CHECK_ERR(err, "inflate"); - } - - err = inflateEnd(&d_stream); - CHECK_ERR(err, "inflateEnd"); - - if (strcmp((char*)uncompr, hello)) { - fprintf(stderr, "bad inflate\n"); - exit(1); - } else { - printf("inflate(): %s\n", (char *)uncompr); - } -} - -/* =========================================================================== - * Test deflate() with large buffers and dynamic change of compression level - */ -void test_large_deflate(compr, comprLen, uncompr, uncomprLen) - Byte *compr, *uncompr; - uLong comprLen, uncomprLen; -{ - z_stream c_stream; /* compression stream */ - int err; - - c_stream.zalloc = (alloc_func)0; - c_stream.zfree = (free_func)0; - c_stream.opaque = (voidpf)0; - - err = deflateInit(&c_stream, Z_BEST_SPEED); - CHECK_ERR(err, "deflateInit"); - - c_stream.next_out = compr; - c_stream.avail_out = (uInt)comprLen; - - /* At this point, uncompr is still mostly zeroes, so it should compress - * very well: - */ - c_stream.next_in = uncompr; - c_stream.avail_in = (uInt)uncomprLen; - err = deflate(&c_stream, Z_NO_FLUSH); - CHECK_ERR(err, "deflate"); - if (c_stream.avail_in != 0) { - fprintf(stderr, "deflate not greedy\n"); - exit(1); - } - - /* Feed in already compressed data and switch to no compression: */ - deflateParams(&c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY); - c_stream.next_in = compr; - c_stream.avail_in = (uInt)comprLen/2; - err = deflate(&c_stream, Z_NO_FLUSH); - CHECK_ERR(err, "deflate"); - - /* Switch back to compressing mode: */ - deflateParams(&c_stream, Z_BEST_COMPRESSION, Z_FILTERED); - c_stream.next_in = uncompr; - c_stream.avail_in = (uInt)uncomprLen; - err = deflate(&c_stream, Z_NO_FLUSH); - CHECK_ERR(err, "deflate"); - - err = deflate(&c_stream, Z_FINISH); - if (err != Z_STREAM_END) { - fprintf(stderr, "deflate should report Z_STREAM_END\n"); - exit(1); - } - err = deflateEnd(&c_stream); - CHECK_ERR(err, "deflateEnd"); -} - -/* =========================================================================== - * Test inflate() with large buffers - */ -void test_large_inflate(compr, comprLen, uncompr, uncomprLen) - Byte *compr, *uncompr; - uLong comprLen, uncomprLen; -{ - int err; - z_stream d_stream; /* decompression stream */ - - strcpy((char*)uncompr, "garbage"); - - d_stream.zalloc = (alloc_func)0; - d_stream.zfree = (free_func)0; - d_stream.opaque = (voidpf)0; - - d_stream.next_in = compr; - d_stream.avail_in = (uInt)comprLen; - - err = inflateInit(&d_stream); - CHECK_ERR(err, "inflateInit"); - - for (;;) { - d_stream.next_out = uncompr; /* discard the output */ - d_stream.avail_out = (uInt)uncomprLen; - err = inflate(&d_stream, Z_NO_FLUSH); - if (err == Z_STREAM_END) break; - CHECK_ERR(err, "large inflate"); - } - - err = inflateEnd(&d_stream); - CHECK_ERR(err, "inflateEnd"); - - if (d_stream.total_out != 2*uncomprLen + comprLen/2) { - fprintf(stderr, "bad large inflate: %ld\n", d_stream.total_out); - exit(1); - } else { - printf("large_inflate(): OK\n"); - } -} - -/* =========================================================================== - * Test deflate() with full flush - */ -void test_flush(compr, comprLen) - Byte *compr; - uLong *comprLen; -{ - z_stream c_stream; /* compression stream */ - int err; - int len = strlen(hello)+1; - - c_stream.zalloc = (alloc_func)0; - c_stream.zfree = (free_func)0; - c_stream.opaque = (voidpf)0; - - err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION); - CHECK_ERR(err, "deflateInit"); - - c_stream.next_in = (Bytef*)hello; - c_stream.next_out = compr; - c_stream.avail_in = 3; - c_stream.avail_out = (uInt)*comprLen; - err = deflate(&c_stream, Z_FULL_FLUSH); - CHECK_ERR(err, "deflate"); - - compr[3]++; /* force an error in first compressed block */ - c_stream.avail_in = len - 3; - - err = deflate(&c_stream, Z_FINISH); - if (err != Z_STREAM_END) { - CHECK_ERR(err, "deflate"); - } - err = deflateEnd(&c_stream); - CHECK_ERR(err, "deflateEnd"); - - *comprLen = c_stream.total_out; -} - -/* =========================================================================== - * Test inflateSync() - */ -void test_sync(compr, comprLen, uncompr, uncomprLen) - Byte *compr, *uncompr; - uLong comprLen, uncomprLen; -{ - int err; - z_stream d_stream; /* decompression stream */ - - strcpy((char*)uncompr, "garbage"); - - d_stream.zalloc = (alloc_func)0; - d_stream.zfree = (free_func)0; - d_stream.opaque = (voidpf)0; - - d_stream.next_in = compr; - d_stream.avail_in = 2; /* just read the zlib header */ - - err = inflateInit(&d_stream); - CHECK_ERR(err, "inflateInit"); - - d_stream.next_out = uncompr; - d_stream.avail_out = (uInt)uncomprLen; - - inflate(&d_stream, Z_NO_FLUSH); - CHECK_ERR(err, "inflate"); - - d_stream.avail_in = (uInt)comprLen-2; /* read all compressed data */ - err = inflateSync(&d_stream); /* but skip the damaged part */ - CHECK_ERR(err, "inflateSync"); - - err = inflate(&d_stream, Z_FINISH); - if (err != Z_DATA_ERROR) { - fprintf(stderr, "inflate should report DATA_ERROR\n"); - /* Because of incorrect adler32 */ - exit(1); - } - err = inflateEnd(&d_stream); - CHECK_ERR(err, "inflateEnd"); - - printf("after inflateSync(): hel%s\n", (char *)uncompr); -} - -/* =========================================================================== - * Test deflate() with preset dictionary - */ -void test_dict_deflate(compr, comprLen) - Byte *compr; - uLong comprLen; -{ - z_stream c_stream; /* compression stream */ - int err; - - c_stream.zalloc = (alloc_func)0; - c_stream.zfree = (free_func)0; - c_stream.opaque = (voidpf)0; - - err = deflateInit(&c_stream, Z_BEST_COMPRESSION); - CHECK_ERR(err, "deflateInit"); - - err = deflateSetDictionary(&c_stream, - (const Bytef*)dictionary, sizeof(dictionary)); - CHECK_ERR(err, "deflateSetDictionary"); - - dictId = c_stream.adler; - c_stream.next_out = compr; - c_stream.avail_out = (uInt)comprLen; - - c_stream.next_in = (Bytef*)hello; - c_stream.avail_in = (uInt)strlen(hello)+1; - - err = deflate(&c_stream, Z_FINISH); - if (err != Z_STREAM_END) { - fprintf(stderr, "deflate should report Z_STREAM_END\n"); - exit(1); - } - err = deflateEnd(&c_stream); - CHECK_ERR(err, "deflateEnd"); -} - -/* =========================================================================== - * Test inflate() with a preset dictionary - */ -void test_dict_inflate(compr, comprLen, uncompr, uncomprLen) - Byte *compr, *uncompr; - uLong comprLen, uncomprLen; -{ - int err; - z_stream d_stream; /* decompression stream */ - - strcpy((char*)uncompr, "garbage"); - - d_stream.zalloc = (alloc_func)0; - d_stream.zfree = (free_func)0; - d_stream.opaque = (voidpf)0; - - d_stream.next_in = compr; - d_stream.avail_in = (uInt)comprLen; - - err = inflateInit(&d_stream); - CHECK_ERR(err, "inflateInit"); - - d_stream.next_out = uncompr; - d_stream.avail_out = (uInt)uncomprLen; - - for (;;) { - err = inflate(&d_stream, Z_NO_FLUSH); - if (err == Z_STREAM_END) break; - if (err == Z_NEED_DICT) { - if (d_stream.adler != dictId) { - fprintf(stderr, "unexpected dictionary"); - exit(1); - } - err = inflateSetDictionary(&d_stream, (const Bytef*)dictionary, - sizeof(dictionary)); - } - CHECK_ERR(err, "inflate with dict"); - } - - err = inflateEnd(&d_stream); - CHECK_ERR(err, "inflateEnd"); - - if (strcmp((char*)uncompr, hello)) { - fprintf(stderr, "bad inflate with dict\n"); - exit(1); - } else { - printf("inflate with dictionary: %s\n", (char *)uncompr); - } -} - -/* =========================================================================== - * Usage: example [output.gz [input.gz]] - */ - -int main(argc, argv) - int argc; - char *argv[]; -{ - Byte *compr, *uncompr; - uLong comprLen = 10000*sizeof(int); /* don't overflow on MSDOS */ - uLong uncomprLen = comprLen; - static const char* myVersion = ZLIB_VERSION; - - if (zlibVersion()[0] != myVersion[0]) { - fprintf(stderr, "incompatible zlib version\n"); - exit(1); - - } else if (strcmp(zlibVersion(), ZLIB_VERSION) != 0) { - fprintf(stderr, "warning: different zlib version\n"); - } - - compr = (Byte*)calloc((uInt)comprLen, 1); - uncompr = (Byte*)calloc((uInt)uncomprLen, 1); - /* compr and uncompr are cleared to avoid reading uninitialized - * data and to ensure that uncompr compresses well. - */ - if (compr == Z_NULL || uncompr == Z_NULL) { - printf("out of memory\n"); - exit(1); - } - test_compress(compr, comprLen, uncompr, uncomprLen); - - test_gzio((argc > 1 ? argv[1] : TESTFILE), - (argc > 2 ? argv[2] : TESTFILE), - uncompr, (int)uncomprLen); - - test_deflate(compr, comprLen); - test_inflate(compr, comprLen, uncompr, uncomprLen); - - test_large_deflate(compr, comprLen, uncompr, uncomprLen); - test_large_inflate(compr, comprLen, uncompr, uncomprLen); - - test_flush(compr, &comprLen); - test_sync(compr, comprLen, uncompr, uncomprLen); - comprLen = uncomprLen; - - test_dict_deflate(compr, comprLen); - test_dict_inflate(compr, comprLen, uncompr, uncomprLen); - - exit(0); - return 0; /* to avoid warning */ -} diff --git a/zlib/infblock.c b/zlib/infblock.c deleted file mode 100644 index dd7a6d40a..000000000 --- a/zlib/infblock.c +++ /dev/null @@ -1,403 +0,0 @@ -/* 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 deleted file mode 100644 index 173b2267a..000000000 --- a/zlib/infblock.h +++ /dev/null @@ -1,39 +0,0 @@ -/* 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 deleted file mode 100644 index 9abe5412b..000000000 --- a/zlib/infcodes.c +++ /dev/null @@ -1,251 +0,0 @@ -/* 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 deleted file mode 100644 index 46821a02b..000000000 --- a/zlib/infcodes.h +++ /dev/null @@ -1,27 +0,0 @@ -/* 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 deleted file mode 100644 index aa7f1d4d2..000000000 --- a/zlib/inffast.c +++ /dev/null @@ -1,183 +0,0 @@ -/* 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 deleted file mode 100644 index a31a4bbb0..000000000 --- a/zlib/inffast.h +++ /dev/null @@ -1,17 +0,0 @@ -/* 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 deleted file mode 100644 index 77f7e7631..000000000 --- a/zlib/inffixed.h +++ /dev/null @@ -1,151 +0,0 @@ -/* 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 deleted file mode 100644 index dfb2e867d..000000000 --- a/zlib/inflate.c +++ /dev/null @@ -1,366 +0,0 @@ -/* 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 deleted file mode 100644 index 4c32ca30d..000000000 --- a/zlib/inftrees.c +++ /dev/null @@ -1,454 +0,0 @@ -/* 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 deleted file mode 100644 index 04b73b729..000000000 --- a/zlib/inftrees.h +++ /dev/null @@ -1,58 +0,0 @@ -/* 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 deleted file mode 100644 index 9a076221f..000000000 --- a/zlib/infutil.c +++ /dev/null @@ -1,87 +0,0 @@ -/* 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 deleted file mode 100644 index 4401df82f..000000000 --- a/zlib/infutil.h +++ /dev/null @@ -1,98 +0,0 @@ -/* 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 deleted file mode 100644 index 0a9840567..000000000 --- a/zlib/trees.c +++ /dev/null @@ -1,1214 +0,0 @@ -/* 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$ */ - -/* #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 deleted file mode 100644 index 72facf900..000000000 --- a/zlib/trees.h +++ /dev/null @@ -1,128 +0,0 @@ -/* 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 deleted file mode 100644 index a287714f5..000000000 --- a/zlib/uncompr.c +++ /dev/null @@ -1,58 +0,0 @@ -/* 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$ */ - -#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 deleted file mode 100644 index eb0ae2e1a..000000000 --- a/zlib/zconf.h +++ /dev/null @@ -1,279 +0,0 @@ -/* 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$ */ - -#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 deleted file mode 100644 index 52cb529f6..000000000 --- a/zlib/zlib.h +++ /dev/null @@ -1,893 +0,0 @@ -/* 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 deleted file mode 100644 index dfc38ec14..000000000 --- a/zlib/zutil.c +++ /dev/null @@ -1,225 +0,0 @@ -/* 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$ */ - -#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 deleted file mode 100644 index 718ebc15b..000000000 --- a/zlib/zutil.h +++ /dev/null @@ -1,220 +0,0 @@ -/* 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$ */ - -#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 */

.*o#s7lTnqu.E.s8Drq +s8Vrns8Mfnp\fMZN0oipQB[^"PnB%FOcGipPB)oPs7uZos82irqu.Q7rVH@I,;J;/SuI8WR#1bBM"&e?a5EH?2MNRdY!qYU3irorhIrr*K,qYR.' +F+]rVZ]gp\t0irqcrE:6V<1OHuF$Pl[,4rKR>I&!C"gp\k-lq#(0hr;Zcks7uZoruV1< +qYds+NC`a@rVuoqrr2rtrqu]ns8;3WnFGT-s3LZLqZ$TUm.'Q +"g=i;p\OjcrrN-!huSJ>#L-5N1%W&`Pf^2p&+gnrqkjHrr2os +s8!8'AoWL6ko`+serr2rtrWrGF9Tbj)O-Z=5Q2d*)rjGa_8+uu]s8Dlprr;p)rr<#sjgDG![%b>2d/F=NrVuYlSt2IWJ,~> +%q/[h]>Mb4`l?!=aNVfJ`o5#=b5KBj`l#Aj<)n(H`Q6'<`l@qt1<%GY`6QmaK1hEHcHF5OaMu6@ +b0%fF_TBd9`5g';`6ZZJfZ_iN?\Xc,Q'dr-R@0D.m?J?HS<8i#QB5j3ak"AKa3_rJ`Q6."asP3R +`Q#pAd*G+/Uf:uD,-0MGa2cED]>MCse]YtTb/_WHceQt'nG`%Znc&"Wm;D:[o(2JPjhACB_ns=. +_7f1.na>o7naZ>Ke,Jk(n`\lNeTr\f[\Ns_SO.*_99g5ai=1us2kbka2lc,8:)l0bK7uNrQ#Gjc-4/A]pVkk +6;:*s^!b"%ap?52a1>VO7nm`K~> +$2*9dUt*=)]E!##D:&6NsoEcc>CF)cJIHZ3dc +('FI7rrahf=aGX`5tjR:<_-GGM2dd,<+rhqeC[5(#V9Y/GB8(iearb9qu$Hml0\BIrXA`)s8)Jd +MM6@DQWs:as7HdEu#rW`E#s8Dlqq>("4s8;iqqtm*uMdH>V +s8N&prr2rtrqu]ns82-UnF>K/s3glRs8N#os8V-HnaH1%~> +"gFl9p\XserrN-!huVbsI +rr)lqi5W[Qec#IGrW)oqrrLulrkg8'_8F41`Pf[5_8F+3]TJ#5Pa%;lO-#@2`5KR4_o0L1a2#a4 +aJk;^OHc(1Os5gI_T'*r>%1<+>uPR/WNNUUB4e?nce3/bNLn2-`PfX/o_e^mrqkjHrr2lr%fZA" +UkjSF5a>RLs8W&to`"jg$MeOkOI;`!PEhE!rg!MJmZm[8%[^[/Z1J"qrr;rsrr)lnrr;lp%f6/( +rqrBrLgC#Ws8N#or;Q]q#l`nmZa-p1_tha[$NL,*rVuShS=Q7UJ,~> +%q8^f]>Vk5`l?!=aNVfJ`o5#=b5KCI`l#Ak<)n%H`Q6'=aN2NHaN2E=`6-TYauOQJGg4LTaNhlH +`lQM@re]YtTb/_WHceQt'nFQ8Nnc/(Wm:Z"[p@J7L^pUnk_o0O4 +_7f1.na>o7naZ)@nbMhQftFr.^r+"+_RmeXpYjS.9dLPn&N4m&[C9U+1MCW@Ma;oseGnq%n`\Be +f?)(SaNDrE^<+I9`Q$9MdFF;*IW[`.6.=6*b0Tt+!6Y2[s2PAgf2cgBPb!a3P6R/5Q'[o,Qh-I_ +Q^O8.Q'7>mOH>K%8!VENccF8Ha2Gm>^r==5aN4A'+NqgGbK87q=*HjS`6-0E`lQ6@aNVfG^Uok5 +84-'EHbIkK$HpT9`lPVq91M]lJ,~> +$2J,~> +"gXu9p\b$frrN-!hu:Lo3SaKp5!<)\4&Ge_,?]Rt?`T?5!h`5'1\r;RW5qr[AGrr2rt +rq?BbCdN\u5+HGooDe[bnbrpjoMCL5OIMK"Q'Ra'Pld28Q2[*LPn'.CO+LMmq#(-_s8)Qkr;?Tn +rXSl+qZ$TeJo#aDq>^?hq#16lrr2p&jgDG$[%GG8df'URrVuirp8=FOT! +%qJgf]>_q6`Q#mo7rp`bSp@nC6^qIS%`PK:*_nj1SqruKo3&`lS/%s2bScaj/(QAn= +$2NK:s8W)qqYpKmr;ZfUrr;uurr2iprr^jLs*qt^9foUTN@B_;6&rVccrqYh6*rr;fo +p\jm_fM?dTPa7SuPEhK#Pj"A=Ocl&qPb(P=qu?Zos8N)squ?]q)u]U4p\12$VKlfh5FM->rVuls +qr#E1_peP^s8N!7s82T`_M^!a#QOaqA<<"FPNA).PRitBS!BLW7_ANsrVZ]qrV-*d+9269rq'WL7-saGs8N&m +r;?Qorr2ips7u$Tna>01s3glRs8Durs8V-JnF64'~> +#.128p\k*jr;Qfss53hUr;cirrsA]$n=6J]^%hL'q>UEo&Gu;'q!sq_HY<'Ms8Doqrr;oq(B+%- +s7u]ks8;fJ;0S.dQBd\uQ'[f$k`lID@tY*=66JZm2-:ImK1\A#Jf6?\-TaMPm5_8,^@rri>uk3r9Jrr"[BlFLq9f0JrVuiror"COT +%q\pd]>i"6`Q#m/]0#l&Q`R;oNI8t2Va3)ZMbK.]C +aNDZHaN_lOcGRfBbKA5A3G=83QC!o$Q'ISsrg!GKn!+*?PF%AgM_>"SrlG2`c2P^9aND`LaMu9< +dEL0pAXI@??nQfLc-+5LajA,>^Uh&-bJq]Ia2uKMgsXsHoCMMBr9s[UCAIi"]#);&_SF(-`PfU* +lh9l:nF#i@_Sj=,_8*q(])Vg!n)2HkJlsTtF,PJ\$NL6LDf(CbNOmmEmHaK4eaD,4 +`Q#mBRS`lQBH_nNgL<_,_T +8r14/a9fo/a2k\q9h%lsJ,~> +$2`W:s8W)qqu6Tnr;ZfUrr;uurr2iprr^p=lJMR?qYh!&rr;rsr;O;iP#2)Ts8Drsqu.E0s8Vfm +qt^0^C3ks8;lrr;6NorYth5q#BtRWi/7!ED?0+qu?]q +s81`m_o't$rVulr#ljesoYQB/F`[P*rHJQiG\UUs"TSW#!"T)> +#.C>8pAP!ir;Qfss53hUr;cirrsA]$n=HS^]D;@&q>M$*s8W&tqu+)bOAGiRs8Dusrr;oq(]==5 +pAb*frq0A_Mj]ltPa7Q!QBmf%Qg'bIQ^*u&R9Ic1r;HZqr;Q`prr2lp*<-!UBks7uX!qu$26G*A,QrfmJLlBV=4%[E9GO-booRT4"ApAXs_qu?Wo!<)os +$2a]kM(@T`s8)`ms8N#srs.PlZaR30eG7Mk$2so'rplnXS=d0=~> +%qo'd]#Mn5`l?!=aNVfJ`o5#=b5KBh`l#Gr;H7SA`6-0BrQ>/]$cL',a3`#WRk04HdJh;nc,doE +aND[)a;)nF`73)Xf$c]7I?Bb\QC=,+QB[Strg!GKn!+9HP*_/e6DhuJa3Dj-a=tNOaNDZLb/hTB +`Q6]_/tS^p?"5h@cc=/J`QQ]N\\,D`e]YtTb/_WHceQt'nFQ8Nnc/(XnSIgpq"h>,]u\73^r411 +`50+Pp@7S?mdp&>s7t`i^:hY0`PK@-^q[^ro_\L[p>t;]bclL`3*'^PO![M?F%^n]`nUIWlLjMo +mb,_$`P]^@]u&(>bf\#BcbmQF`AMmCAX6hFdaZ:Zb/hU%`<+'#aSa0laMc6I?"](XPa.MtOctuq +Qh$CYPED&oR@9Y9R[BG!Ob]!]85QA;f[%Rbao03YaT'C*a2uBB`7@#('"Z6+`5p'BaN2BBbf[i; +]ouJf852X8^ +$2r`9s8W)qr;Q]or;ZfUrr;uurr2iprr^s>lJ;F=qYh!)o)Jabs7C5/LdUh3rVlfrqu.E3rqcZm +pA1IJNgQ,kQ^!c$Pa.Q"Q'Ra#Pn'.FNgO1Jp&G'hrr;uoq>1-krYth9q=K2kWG>.M8B15ps8N&t +s8Clo_o't$rVulr'`\(*oYQB/F`VVHG^4U]H$*q5%gr78rrW)u%16!OEccSOH?aCD7h6",!!*-) +quA8R),kL*f+8u6>q +#.UG7p&4mhr;Qfss53hUr;cirrs8W#nXlb`\bZ-trY#8&s8Vloo5@H[6M:6Srr;uss8DrsrtbV1 +s8DZeTg+R)Q].8qQ^p`P]U0^r!t, +WdB8=GCPI2OH5TfNfoaE`kKF-_Sa4$^UT)8Dc9D!76WYDKoD+RR_uqX_o0@_qu7!"k3i3Hrr2rt +qu6U)nFhKY-E=+NP`q;qPaIc(Q^O.rP($6-q#(0f +rVccprX\u*s8W#a7=S>,s82ins8N#trr2rt#lW\hZa[<2g%j"o#ljl#m\6;BTXK@~> +%r,0c\]2e4a2Z*>aNVfJ`o5#=b5KBh`l#Jt;H7M?`666CrQ>/]$I$*&bf8/Q9gs@RrlHD/ccF,G +aNDZH`Q,j6cI((pM(O=@P)>NhQC4),Q]mPpPa.O4Qg^2&QB@&e9SCR3aMQ$Ebf%B:`lQ&6Y`koa5`l6-LaLJaf\^emCb0%cHb0Skkg[P46r:)*)p@n?f]",Jrb/D'5`5T[2 +]^,:]mdTZ9oCDV8\]2A"`Q?6=^AbrV_nbO-lgaB0nac#3h4f7>>$auq3@nTtVSC4&q!785jjW\O +ai26:`m297cHXSWb0e2H`m;`eIsruKSh.\&bKS,M`l5j5`Q$!Ab08#NaMuBOe4>@SR[9;'Octuq +Qh$CZPE(`iR@^+FSt)".Od2/gO`ERHg"+]oa2\+ts2b5_+NMLBaMl+\HT]`Q6-?aNVfE +^:TM-84cQIPJ5Db#g:3(X]J1b:NM$~> +&-(M@s8W)srVZTmr;6Eks5EtVrsA]&r;Q`rfBV\\rr;fn%f65*q>^6ipSqIoanl&5rr;lp%K$2* +rq>,9?^?b;R$a0DPEhY,h"gaFrr2rpqu?ZorqufrrYte7qVk;LSO%@@oC`.] +s8;ors8Clp_o't$rVulr'`\(*oYQB/F`V_NH$Xd^G&_(,#RC;.!s]#4!WE'/#Z>P\FaAC\G&BY] +"98T(!(?tk!!*'""q+ORH?OX]G&qqI2AR,?)^?s`0d[hG!!!6UD0pbTH&^AGrVQNjrr20LqYpNo +rqcZnqu?Ii8q9T9TT+0nnG`If#Pn;kM//HDQKsh7QN*6MPRit@QC!o'R@053=&m*4qYg3g+929; +r5_WIPQ1CWs8Dlqr;?Qns8Mrqs7P[No^:<1s3goGs8W#us53hE!;h9~> +#.UD5o_ndfqZ#=Ls8NB(qX^G[Y.+3&q#1s(s8Vopq#C)d>#!-7s7u]nrr<#trW3&trr3Z*gdGG6 +Ng,ouQ'R]#PEqT#QBma!Pm3G=_8F'4G("dbIX[-4O-,QfPE;eNffK`QN"`*_ns4]s8W)trtkRpn,E:arr2corqufo +;G)C0;4WVgqYgBlqu?Tnrr36#r:GbXQBd]uPld26PPp^TQ^F&&Q^L6krVd9+rVlf; +8n=+bqZ$Tpqu6WqrXAc)s8W#R['R9MSDF"frWrQ%q!+KBS"[ +%r>Bf\AlV1a2l?AaNDZH`nJK@`OfMU[S;W]!TWPfE`6\5JmHW]Ymb,_$ +`P]^@]thk:bfn5Ja25X9d5XCB:fWg)=4,:8rlG,Zrl#DfaND`Nb/VB>b1PNp?]pW=Po5dIOHZ*( +TUq[>OckolQ(4;#P!qR1e]l:Wrl$/&aNVfJa2>m?Ud&1/eAKAK`P]g;`lQ +&-(\@s8W#srqu]nrqZBhs5Eqfr;Q`rr;6Els4ZZ+jo>AZo)9R*j@F0;qu-Qlqu?]ps8W&tp]($\ +`($/[QBqK7s-2c5&!WNHOdMAtR@fX`LA:fGrV?Ens7lTn*rH!9s8)G(P,DPkF'":rs82ips8Dup +i5NUOe,91Err*Z4qtTg#LO"#cH@gNgH$3h1&.AjK!r`09"U5)4!WW608T8foI!^9Z57dl'!sAr4 +rW!9+!WrK-%TmduJ:@K?2InKH"pk;7&/#Qe&e,$F!!b/tGC4RYN7IP"rVlfrs68nHrr<#trr;lq +qtf>6LP%ISW*%[KrVlusrr;rmrX\o+s8)ch9Tk[,S!KD'Q]U0k0Tq`cIqYkUr;ZQls8Dlqqu6Hl +qt+`Q:%nJ`rr)iqrVuosrr;uprr;NYq![Xus8UOH!rr8srr3,anF#Z>J,~> +$+m"8pAb$hrVlfps53eds8Mros8W)qorFmh[.*tko)9L)i^R[1r;Zfrqu?]qrr;lqq#C0_`'foU +iKXt=RZil$Pa%N(NGjLFs82fqr;Q]q"Si#rrVHNn)>Wu>OJH)aDcDVks82ios8N&ri5WaTf)>RH +rW)oqrrLulrkirp`kfI0a1]<4G^+O]H?spdK8YkTOH>O0aiM<6^W"$dJ9-'[FaJ=XIt`iBOcYT_ +`PoR/_S*h*]T[D[I!9dWF)uSWM3*m^M3l2p^r=4-o`+sis8W)pk3rU%ZOcklqPEq;uP3nP6Pk^LbP*V8\B<(\)s7u]prqufps8Dus +ok\b@o(rCdrr<#rrXAc)s8W&K\[AcSRd'^trX/])rVufSURRgJ]mp~> +%rtrk\AlG*`QZQG`QH?E`ne]D`lQBF\7863BX#@ooZ7'T(t6Yg?>%^.aiDNHai)9BaND6Cc-raQ +O-'=("I5=AR@!l;!0cl:&X8`JOd_T%R$rkAD:I.W`Q$!ub^RXQ`luBIcHO5E^ra^H;1tQC=(Xg8 +dEfeV`lH'CeAer.\%1&4`lcHEai_rbdbF9_n*'0)mJ$VTs0fJO^r""._7[Iu`l>d+\_ZlHlg=-5 +oAIBk_7mh/`4s.*_o0I.]!1>algXH5q#C6@[(*fY\[f2TZFIQ^_8 +&-(\Bs8W&ts8;corqZBhs5O"hr;6Els8;]js8Up&,!!*0'qu@67=_VbuG'%[p'EA.?"9So,!<3*9 +!!<^6FaS7VG&q+J"onf,!!<6'!<<0"!"B#>11toYFEiboo`+mhrr3)am.gSZrt550r;QTkmV6`m +>th;c7E +r;Zcprr2lrs8N#trqlWnnaZAAm*G_3df'=JrVHNn"R#=Cl2#o~> +"hg_5p&FshrW3&urr:pUrr3H)r;ZfrqtRLnX0Cpes76-qrUjN?=nVUis8W)r%KHD+qu?ZiEDMm_ +Q'@NnPn07EPF%K#P`goRD#=&.rVulr!<)or"TSB!rqcTn)YF'T5 +`RXqcrr)orrVloT_#D4Z_SNn(_nX03GBe@Xrcg,BG^P.&OHGZb^qde,^qdgbKQ_QhG^"IVG^Fpo +MN!QAP`M?I_8"%/_=dj.rVlfpqW@;Ir;H`srVld(mqH]g +=@]?W=8MjirVloqrr2rrrr91$NL)(s81ZIS"6:iJ,~> +%s_Mt\&ZD+a3DlJ`QH?E`o5#=`XU)3`lQEI\S"W8Aui_ho#N!#fhcKUc,@TBd`TGBa2Q-?bg4^= +6BR=pQ'IPsQ'[r.Qg0i7R$!T!Q("#&LNQ_Sd*9VRaND`Obf\#H`QucLccF)D^=\fISVo^G>r0aI +aihfKa2Q('!]YDA%rkp\2]tM8#`PT. +`4Ne+`Pfp;`50:,`5TU,Zg75Qkk+WJpscjfaMu3B`P]U1_u@SF_naXip[[q:cg99*a2l9Cd(R08 +b/hZD`5]a:aj%k!@!Z0TWf96k_Rdk8da#hK_8F:6b0%fEa1T@9dFQMnL67djPb"&$PN%i]S!0=t +Mbo&Ub0.f;ai)HMb/VQJ^ase!eBQ%O`5]d7_o9jEbf[r?["21I6r?a`_pZX+aU$,6^mnCo5u +&-(Y?s8W)us8;corqZBhs5O"er;6Els8;cls8V-@o&frOnbrpkC3rk"rVuQhs8N#qrrq\F@[<+C +rg*MJs-2c5&!rHFR#mc$Q]YAEr;QTnqtU.)s82fpp\OpipJmui9LEZ/?2+C!p\t3mr/q"2FYH$+1SF*)D8.LG +CO1lfo`+mhrr3)am.gSZrtkY6rqu]mql,p](6a7Zj.0RZj&p +Q2d!PR%'!tc2.J>rr3K%rVHQjpP3m:HM[U?rr)iqs8W,u%0->(rr;NWp%.Fos8UOH$NL)#s8W#Z +nF#Q>J,~> +"i6t6nGiIdrW3&urr:pUrr3H)r;ZfrqtRh!WikFZs76-qrV'rK:WWS9q#'sf"mh+TPDkh,PQ@&8 +jcp@CP*VJsRZs+t;Y9haqu?TnrW)orrYGP5s82fqq"t*koi%K^84%0&>PS6up\t1!rr;oS`l,jH +rVc`p!<)lr@,A]:_o0U3`lQ-/H$=O[H[L0eI!^3dIts,MQBAAla25p7VKm9-I!p9eIX-9cH%(I, +PEM-Bahtm4`5.OZFFJO]I!Bp_I!g?mMNO!]QGpk]^WF@cs8W&srr)]UnGiFcs8Nc1s8W"s:PaBu +L8SjnqZ$QpqYpHls8Drsrso&.s7ZKmnjJP)R@05*Qf42:Q^!Z$RYs;Pq#C?mrt5),rVufiKlV6X +q#(0lrVlisrr2rr$i^2+r6i!Y\$VasqpGECr +%t.buYf+K"a3DlK`QH?E`o5#=`XU)3`lQEI]5^PFA"p`[o#N!#fiDlNU<_'#bg4;H`5fpDe]2W) +N/O*jQ'IPqPEhQ(Qg0iTQ]dZ%OIDK"Jj.f9c,I`?aND`Obf\#HaO%uK`kK:2eB^7@U.%7W<^b<] +bJDQLa2Q-`lQEHa_/W2_SsR:_nYI6qXsa`rQr*c`Q#pAaN)?B`PKC0`koI2q>'[Kkg/VIaiDKBb0[i9 +ai_]G`l,p;`lcTTM`l]E?\tCUNQBAecH+/HaMYp8aNDZH`kfO5dE'njdk???TV%R9P*=mj0U@oa +Pa-_GY0kV=aiM`DbK/#Sd;30"?.-s=`lH0?`P][=c-4>M^U/Jg7n6 +&-(M:s8W&ts8;corqZBhs5O"gr;6Els8;cls8VHDn`TrPnGX=(GZpA-eG]FDs8N&up]'s[<0^0gs8DurrVGHk +_o(%&rVulr&HDY&oYQB/F`MM>ASG0T$3Kbu$4'XRBl.<@&c`(rr2p"kj8*Drr3f5s8W#qrVt_CItUfcUSUc`n,N@ar;Z]jrX\o+ +o`+jbrpc4`Q^!MqP*Y'l)O$8LQ]IK'CRkG%qYg'dq>C'fbY +$HAd^Hos7lWeoi.$:PF7Ys +Pa.Q#jcpLDR[0/&Q][D%qt9pfs8N&urr2lprZ_C=r;Zcrs8MVXEMdhCEHOjAqZ$9hrVQWos8:fp +`5U:*rVlcrrVca+hS@%H`5TU-aLZS@G'J<0H:rU1H@^p6P)m&h]#2L`IrTa]H?adcI!L'aGC"gr +O-,:;_Rn"3_N/e^Jq8#hIs$'bI=-?hKSknPR``Xf_8a=as8W&srr)]UnGiFcs8N)srr3Pd7!sJ[ +4JJ]Lr9jU`r;HZorr;rr&HD\.p&Fsbs7):^PELojPaLBo)3U>QNgH2KR/d$Zrq6 +%te2"W56Ek`m)cJ`QH?E`o5#=`XL#2`lQEI]7!=PA":=(a<8a^?UT>qXjGP=c,drG]ZS:D4FW0N +SXGb0PECukPF%X#Q$nmcQBRT#PDhETcd0eS_SsO;bg"ASaN2TF`llp=b/h`G_ns:1aMka_qtC'i$2r)U]>r(1aNha'a9'>q^])+a^oifu3\NKocd +O,[+cg!%IT]?A+9cJ#H\Ae +&-(J8s8W)us8;forqZBhs5O"hr;6Kns8;cns8VcFn`g)RrUKk)pj#,HK4FZNr;?TopAb0lDgI\2 +Pa%<#QBpQr$'pg?S!f5$QLanOrrW)tqt^49s82imrVuilp.M6_5>ZZ>6K\1Cs8N&ts8Domi5NUO +eboCGrr*T2qtTg#LO"#_Chmrf&.SsM!s/N&!<3)r!"'<=EcZ"S$Np\=#5\B;"UGA;!W`<+(.rUi +An2qk#QXo*!I-Hs8)]moBK#:T(`-^!<<&trr<#t +s8NH's8VKSp%RIrs8UOHs8NB%s8VcSn*]9:J,~> +$-f3Bj88fTrVlfps5M2YhT$PnbsF%Gs68"@e]]trr<#ns8W"6G`n&LOcGio +Q2[*3PmNb@Pae)"QBq(9rr33#s8;orrr)fp,6.Q?qu?]pp[q(NVE@OtBKtVWs8W)ur;ZcrrSY]6 +`RXqcrr)orrVm;_^r+(._oC!0G^4R\rd=Zm(4:RYI"$^*OHHod`Q4^"G'eFZH@(0lrd#'"H?t!l +M2db0aMkp4LO/rH+F83SGBeC\H[9s`I=R<7UW(3gbJ1mds8W&srr)]UnGiId)?'U8rVuiqp47[J +G!C2MEfg=us8W#srVuoqrr +%?4b*TtnXe`m)`I`Q63ZaT'6hb/hTDc-!_V8605d^;TT`+O&/5-!P+Re'H@aai1g4dFME8Mi=!i +Q(XJ-OcY]hQ^?s%;3mH2S!f5$N7H8%c,[W@^rFO@c-4>OaNMWE^VJ(:cIXq>TJoGd?nTIEaN;NI +ai;9Bd`/f2]"?M9`lcHEai_rbdbF9_o_ACbo!cS4>]Y;1t_o0R7`Pf[0^qIFm_S"Ckp$h_6cg99*a2l9Cd(R08b5TI" +a2uKGbfe>ZBm#>a7!4u)ESJa`aMQ$9`l@tu'$A53^rOOAairCL*c7(/S;rVnj-:UJQ]%#jRZrh_ +,JMaRaj%ZBd*L*!L5=C1ccjPTrlPhp`Q$'Ebf[r>YB!B,9hJ[!_pZU5aihoK]o#c\7oc=7~> +"973/rr)lsr;ZcrqZ6]rir8uU%fZM.r;6Kns8:F:lMpn_nGX-oqi[7VXS`%is8N&upn:9BT:D75 +rKcK/%[33EOcuDc0(&Q8qu6Tkq#:9m+SYp3q#>huVenqIEGn)3qtU3ko`+sirVGHk_o(%&rVulr +&c_b'oYQB/F`D;/:`0]I#RL\2!s&H(rW5=c#8L'Y?9Ai("UG>>#R:M7!X]2@$jm1@!sTE8FE(h( +)[6TT!!!B:$kE^O"U>DD$O6q@+(]82FFK5!o`+mhrr3)am.gSZrrE#srY,8,qtWj+Jqm8kW2`GY +s8Dupqu?Kks8;os$haProU15HQ^a&%RGjDPPEhYtQ^!f*0erS*r:9d_r;9HOQn.+ks8N#ts8N#s +s8W)ursJZ's6B(Hp>FX(s3goHrs8N%s7,7@m,S+r~> +$.YfLhu!EQrVlfps5*pAP"!p7Fj8S!TA&PEV5r +rg)]3&rr2p%qT>M'StO_d~> +%@Ugu&he@;+AjC9PB.2*M_T0s: +dDj,Jd`/f2]"?M9`lcHEai_rbdbF9_o_\IK\$<3J^:jKZs1M.@^qme"]=>D_hu;rj\$`od]tM1q +^qIFt]Y(kf\$icS]BoRpo;]L-\@];]^V.1l_8*h#]tLtc\?a$Lo_%_8cg99*a2l9Cd(R08b5TI" +a2lEGbK.oU0P,`j=$`LI1=+OpahYd9aNFJ&'$A;5_9's:bK._HBO@!pOcu)pj-;?_O-,ljR$El! ++rf=jcbRQBe(m39L_RGDc-"2PaiM]L`l?0Fbf[r>XDCU#:.f*,_pZX+aU$&0]S0 +"9700rVccrr;ZcrqZ6]rir8rTs8W,s!<2ut"Olo*r;Z9c(]+10/r,QWq"Oddo`+J[5@g.HNLuK$ +Pi7lLEnqu6U:qZ#5FWM)XdEc,JgrVHQjqu?HkrVcTN`P]UDr;HZp +rXf,,q"2FYH$+.@58bCX*#&n]&H*1X&.]&#rC/MSM$/1`A'.Om#(.fLqI.OQVm*E6s" +68UPN-SR/)1Gq'J0.\V)0f(U<.4-KNE-cVZO4 +#25lNg\_$Nrr2lri;W`Us8Dut$3'l#jd<0Qde`q4rY5>2r@EPZ62('Qs7ZKa:ci'NPDYn0P5ggH +QKFG?Ruif(Oc++*o`+pfrVuco"98B!qu6U9qu>8AUn'\SEG];crVZ]mr;ZKjrr;rT`l,gGrVc`p +!<)lr%,Se;_o09TF*;eXG]`n/rH\Efs*=Wg'7YV>]on/2PDYNdPECobN/s-\NW"niOHPI2^V5nl +QB@2qS!TD(OHP`hPEM#gO-#ZmQ,1DY]#)8Us8W&srr)]UnGiCb&cMb/rVu\D@t9/\3+AeDDYa,, +s8Doss8N!"s8;lkr;Qu$=d5)7Q'C6m$^d*;S!&u"NDr2 +$`%KGPeP2ZaNVlJ`SJW8`XU#3aN2TH^nOG)?AQ85n]2fjd+&eWLbdf6e'>nWa#PhZR@',5S!fV. +PECrhPEhL!PnBLIP+@YjCi@PD`4s=-`Q6-CrldFG`lQ?D`PBL1ftKbGS3:(nCKrsQb07]>cbmc@ +ajA&;^V%2/bJq]Ia2uKMgsXsHoCVRrW3*;8['KY>rO*QP\[o;YZEpmsn%lQRd*1"dcHjbYbKeMY +rlPqq`l5m*kOeGg_TU!@e'udnd*0h_rmDY5daHIeb/WrBpZq"gm+9A"aMuBL]tVV2rlG,^0$2>X +aNi+?<.BaZ4^O_1=k1U9^r+17bf\#HaNDZL_SsC5aiMl^N_GP!Q]dDnj-BY.s,8P!Q^F5%:Gk2X +hqHK&c;&&+11\SQbK7fF`l?6IaMudo4~> +"97*/rr2otrqlTorr:sVs8;oss82lrrr3)KnEK`Is76.*rV66X4Hc:$qXs^_oM@_)B9JRER$Ei& +iKXq8SUEkrr;olrZhI>s8Mrqp19Si>XEFODaDV@r;6Ejs8DurrVGHk_o(%&rVulr +&HDY&oYQB/F`VY:EGT?&A8(sR!+u.Bs(3iqC2%6o5&4nJ@W-$lAnGdnD0'`4ChdZtC2%Bo@Q/FQ +FE;&1C1UshBkqX+D#S,\Ci=6-A7&A#F*31bOOWq&rVlfr"6f+Hrr2p6rr;rsq>C9ejZJ9OK0_MZ +W*@mPq>:3hq>Lp#rr<#os8D`d`E/=kOID?kPq\DiP*_K"S +$/MAQf_YUIrVlfps5UC%qZ$TmpVp3tQ]R`%iKY=GRZa#%PF%>n7W;W'dI[.7;NZ-4nc&Rf +r;Q]q!rW#qrr*?(rVulj]XG2QVn`!(df'UPrr2lk_kEZpU#LS~> +$*7lKOhA]Sa3;d,`o"l:`X^)4aNDZH_l?I:>Ca<)`q.7h`l,a=cnUKA.b`4ue]fd#.VP*8Q^jJ/ +RZm`5"-]":Qg'c2OIVMuPa>^;e\T5I^r+42aND`Lb/hQAcc3r=^WP&'O/H2JDJj8LYKb/,_o9pB +`l-!G`jidr]@G*Eb0%cHb0Skkg[Oh+q!7_Jp%S1Xrql`lrV/2FrVcWgp\2Soo(DGKs82Zfqtg3i +rq?0`q"aa\p\"6uoC2AFnGE(VqYL!Zo_8.WrVulqrtG:uc1UK"h9YH>aiDKBb0[i9aiaV(0?VJ[ +c,IcOb/>ZWL5//TMkE_Qd(mB=`QZQKaMu`m(DPOI;9"OlDW\PE1ulR@0G6PES:C +8_LDoe;c\GC/3+%bK@iC`5BR4/6VC.!]Z&7=#g(&rHW!L3@D@<~> +#QNK3p](6mrVQKnrr:sV"oSB"s8;fnrs$j^BiW/d716+=p]1R32_qj--)%[N:-jr;Q`rr@aE-chaOOWq&rVlfr"6f+Hrr2rrrr)a*ogXRcK7enGX. +#j8(]c2.D=r;QWoi;W`Us8N&us8<3#p6r%`a85`)rXf,+s8;YfM3O/f[`EbNP]TXsPl?sIQK=A; +QBRK!Q^:O]qu6Tsrr<#qrr)lsrr +$G(.]K>#7H`luTHrl3m;rl4uZrlPPe_ReX2&KJL6hg@N0o=;uW-`R0/e@ +PEZ!."-]":Qgp@@PPpdHQOfCGOHu/p9r8nF6/Bo_/"No^VqL)tW^qp\b$er;?9^o()51cg99*a2l9Cd(R08b5TK\b5TI! +c-e4iJVT#76Dou7e&]VLaNVlNaMu"1kO9T$R'd`;d9bK%T0E)fP,ABTK~> +#liQ4pAb-lr;QZm!ri6"iVj#Yrr<#rr;HWtdHp2hrr;Qg&-)M+qt*`HS=3\\GCkrZIJ]>ePms.I +Q&gr^=o&'srr)irq#2NL6krVcTN`P]UDr;HZprXAi(q"2FY +H$+7QG]n90FT?L^FoHOrG^4FZG&_P8=t46-F)Z8HH$]I7!."Nh/U;YaDK'T4B-pr.Is,p[Fa84S +F*;_LG'eLWEdi%KFC?@HE-?GTJ/lJMVl~> +#j8([b5D5U?m#&ACL +OdVH#h3Ir'"-Ja3Nr>%FRS\.Rp&G$irqufrrVuj,s8Mrps8;#g[^E?4f_k]rrX/W(s8M\tURdsN +m=5~> +$GUXeJ%inDaNDZHrl3m;s2GSgaN2NHaMu30? +oCqqL\a/n[mHsT7rq$0[+78CZm-dDW(b/_ZE +^V%.oc-abV`lQBJaLd[;779gDQ,:Pga9g#1_R+)Y92B3KJ,~> +&-(>=o)JXfr;Q]nr;Q]qs5!YTr;QZp"4lc)mJd.VrXei(rVlcq7pUe3NL$0#3K]W]PlR!HPQmSE +Le[XBs7H:(pAadbrL7W*HphdkG&B*3b4ko1r;Zfq#lrr2p"kj8*Drr;rrrVR2X4bAH;M1B/2TVl#fpAb$err<#qrr;m$o1b@5P`qMs +iKaA-rKRn\PtlXmQ]ugd`VT9-q#C +$1=df_YsB3r;Q]orrN,tir8rWs8EB*rr)fpq4jml^\@6s&,6,&rql[`>D&&qP+7[oO8G4BQJn)/ +P5^[MS!o1/p\k-frqud0pAadbrgIW&GX?.aF_rm1b5))8rr3B)s8N&si5W^Rec#IGrW)oqrrLul +rknTL!5nQJ&AuT/^lF5b_Sj@1`50:*^qoud(;[Z&_SOL9V2^2Jahtp4a1oF*_Sa:0rl#ej_p5g4 +aMO7#TuXsca2#Oas8W&srr)]UnGi=`rr3Q/ffak +&'K6%G/(r:aNDZH`l5s=b2UMB`Xg&0aNDZH`lGf%>ZbaJ`5_Di&B_u;a3<)m/4=E.Kp/'k3fs6& +s,m;Es-)lo^;;Cn,DqYnK7/alKdQrpZM8Ho>7r[oC)2Aj3R)DaiDKBb0[i9aiaP&s2tA_.E9T: ++`r +#63TRHQrr)j!hraCkrr;Qgrr3E*rqH3_>A\SPNIj`ifp)l(SrT/!O-i3+ +r;?NorV?Hmruq=?nO0UU2-OsCD0'Ya^[qL'rr2rrs8Domi5NUOeboCGrr*6(qtTg#LO"#`FnTuM +G]n=VHZF1@;%EaA@!-[9F`qtTI!U$\F`hkPH$++G@m:b6)-q*#G'.tRH?sgZG'.hHHuaXRDJW`4% +2q'/FE_PNNR[V#rVlfr"6f+Hrr2rrrr)a*l:->[L4Y#-3..T@Qi-[Uqu6Wqqu6Wn#PUoQR?sA)Q +Jn,-QMm'ZN1H.l>[9][q"aabqtU$fq>UEls8N&u#Q4W%l0n37dJj0orX/](rVuoSl0R^%s*t~> +#559r\GQ+%rr2lr!WN&Wrr2rtrX/])rVccmY,&83oC)\Ys8W'*p%\8cCil#%J4H"'QJe#7Nh28t +OcYtspA=jfs8E)urr2`n&,ZCs7'<.==Di7tEc4:Zp&=t#rr)`orr;rT`l,gGrVc`p!<)lr"l@&4 +_o0Ic_A:&+_T'@0aMEpqOM/HI_8O=0_8*k'_Z%F^_Sa4+a2b!G(Bq>1-jqtg?lr;QitrVlfr$iKu'r7eNe\$;Cls3U`Or;Z`a +W1olRYkNY~> +&(Q89Cq[a0b0%fH`l5s=b2UMB`Xg&0aNDZF`lGi1=BAq7`5_Di&B`AGai2KJf%WPqDjZW?8='+7 +s-*JJrKm#=s-*JJrKdhNSrAqnMNKR=bPocdbW*_eaMu6=`Q#p@d*(%e/>8Lf>An\"DJCts_p$$< +b0A,M`5g0A\A,\ie]YtTb/_WHceQt'nFQ8Io_nC\nIb6Zlh1,G^q7JWq=jIKmd0E4rU^'Z&G,Pc +o_eOA^TkNGo^VSDnacYM+S"pflg*O$lL=K>ag/\/nG2bBkKiMHaiDKBb0[i9aiaV(s2H,$b/hZD +bebcKJ;8i0IlDS==Ei<>b08#LaMu6@aNFM+$d-Q1b0DViPaS,+Qf45/QS"JdPEhDmSrts1;)BZR +e'QF_`5^0H`kT7&_p$HNaMl0Cc,dGN90kpB9!Q@Td`;d=`lGit?r0NoHJa5~> +%0,AIkl:V]s8N#qr;Q]qhuQMNc_Y$(I0?PF[ns +5kb-RrW)omrZhI +$2Cs(ZhjV"s8N#ss8W&urSmhRrsJc(rVu]-T<>NfrUBdtpAY*lr;ZT=O*j&L4c5JiQ2R$+PmNqE +O-?0"N^i+;Sr8bhU<:Ko`59@`s8W&srr)]UnGiIds8W,urr3K-qa,"LK7Sf(6V*rO7d^0Sp&=sj#"Fi< +OdV;siKaA+rKR_ZPE:GtWV$#^r;?Nn!V? +&)<+KA\,n*bK@oI`l5p(2-X +Km5pQS!u%Te^2J:a9'B&aSs?^a9fl/eL--1Odh>oiKaD//X;N`Q'Io*Oap,oi8)l,b0A#KdD*cA +_o'I7b08)N`Pp'Gb.2sn5XA1A\AZD8a9p,1a1nKU:J4W;j+%~> +%0,MMkPtS]r;Q]nr;Q]qhu^Hoq#'pco_n:O=+m!(fp)o.Pa@r" +S;p28rVuNh'Dqh0k"i%E:0h"EE,BVO2u`dMq#(0lr/q"2FYH$+1NF`qnN +F`qnNFa!_+&T_u+=V_/F!!cbLGB\4SF`hm)FTli+E+qiXrW"5Q??:71EH$)GH$4@UG&q_LEcPo) +.gZ@Z"?:.2G'\=jeF`e>rr2p"kj8*Drr;rrrVR9'M`urFLPBDOVe`5cHMmO8r;HWps82fqr!2lh +Q(=,,PaUKqrKdDI&!<-CPsO^3o_\R]rVQHbs7uZor;ZcrrsJ](q=*kBm,%dAs3goHrs8Q&s4lf( +m.gU2~> +"SKF'YkS.ss8N#ts8E#sir8lUs8N&s#lj_JS?9*Yqu-*b!;HKm$i0_srqHHbp/cp9P5(=BPiS): +PE_E*NLc,'q#16jrqufqrZ_7>ro?bOQVCagF)Pl70K/q1qu$Kor;Zfrs8Lrr`5L4)rVlcrrVca! +hS@%H`:CeX`5p$9Mi![`NkiKK_8F4._8?)e'#_]/ag7.dO,Ae7`kfX4_o9L/rPJTQ)o]V6aiU-5 +OH5C%b.>C3_85gEs8DrrrVG[Gs8Drss8W)trt,2-N'2lBKnX)HUhHTXHMmU +&)<=P@(=A'b0%fH`l5pGbf%$+]Y2k=`lcHEai_rbdbF9_oCMMPo+1Znp;"8X^qKC9p%%YDnFHMKs7--\&Gl=f +_RR=i\+falo^M8;naZSLs7%?*me?PRc+:O!\_?uKnbD(hm+9A"aMuBL]tVV2aN2B?`Q64$a:leF +Cb's\L4NctPMVQTPEhE"PEh>k0\"t,cH*lCa2l3H +`l5s?bfn5Nb/hK>bg";@F\+e`8mAmFdDu[ +%0,bUj8]/Wr;Q]nr;Q]qiVjDgrquZkrr<#ss8Ud>jnJfTo)A[h!W2iprs8DtqsjMBO-Q+2PhhT7 +Q]IT%Nf[/8q>UEnrVlikrZ_4=?'MQq_Jr[uF*_ahd.I/6r;?Toq>^ElqV]?1_q"\`s8N!2s82T` +_M]+Y+H$XUUEcQ;GH$OXWEb7`W!sSo/'k;<,EccDD +G^4OYH$OXXGB%V80Fn6g!sUJqH[9aZN7@M"rVlfr"6f+Hrr2rrrqu[*nO%b^Jp`<&H:2M18D=(@ +r;HWps82fqr!39!6^!LrP`Xjh".#=?QMm'ZQ^*f&