Merge branch 'STABLE-BRANCH-2-2'
authorWerner Koch <wk@gnupg.org>
Thu, 22 Feb 2018 15:19:56 +0000 (16:19 +0100)
committerWerner Koch <wk@gnupg.org>
Thu, 22 Feb 2018 15:19:56 +0000 (16:19 +0100)
1  2 
AUTHORS
README
agent/command.c
configure.ac
doc/gpg.texi
doc/gpgsm.texi
doc/wks.texi
g10/keyedit.c
scd/app-openpgp.c

diff --combined AUTHORS
+++ b/AUTHORS
@@@ -15,9 -15,9 +15,9 @@@ copyrightable year that would otherwis
  List of Copyright holders
  =========================
  
-   Copyright (C) 1997-2017 Werner Koch
-   Copyright (C) 1994-2017 Free Software Foundation, Inc.
-   Copyright (C) 2003-2013,2015-2017 g10 Code GmbH
+   Copyright (C) 1997-2018 Werner Koch
+   Copyright (C) 1994-2018 Free Software Foundation, Inc.
+   Copyright (C) 2003-2013,2015-2018 g10 Code GmbH
    Copyright (C) 2002 Klarälvdalens Datakonsult AB
    Copyright (C) 1995-1997, 2000-2007 Ulrich Drepper <drepper@gnu.ai.mit.edu>
    Copyright (C) 1994 X Consortium
  Authors with a FSF copyright assignment
  =======================================
  
 -The list of authors who signed a FSF copyright assignment is kept in
 -the GIT master branch's copy of this file.
 +Ales Nyakhaychyk <nyakhaychyk@i1fn.linux.by> Translations [be]
 +
 +Andrey Jivsov <openpgp@brainhub.org>  Assigns past and future changes for ECC.
 +    (g10/ecdh.c.  other changes to support ECC)
 +
 +Ben Kibbey  <bjk@luxsci.net>  Assigns past and future changes.
 +
 +Birger Langkjer <birger.langkjer@image.dk> Translations [da]
 +
 +Maxim Britov <maxim.britov@gmail.com> Translations [ru]
 +
 +Daniel Resare  <daniel@resare.com> Translations [sv]
 +Per Tunedal    <per@clipanish.com> Translations [sv]
 +Daniel Nylander <po@danielnylander.se> Translations [sv]
 +
 +Daiki Ueno <ueno@unixuser.org>  Assigns Past and Future Changes.
 +    (changed:passphrase.c and related code)
 +
 +David Shaw <dshaw@jabberwocky.com> Assigns past and future changes.
 +    (all in keyserver/,
 +     a lot of changes in g10/ see the ChangeLog,
 +     bug fixes here and there)
 +
 +Dokianakis Theofanis <madf@hellug.gr> Translations [el]
 +
 +Edmund GRIMLEY EVANS <edmundo@rano.org> Translations [eo]
 +
 +Florian Weimer        <fw@deneb.enyo.de>  Assigns past and future changes
 +    (changed:g10/parse-packet.c, include/iobuf.h, util/iobuf.c)
 +
 +g10 Code GmbH   <info@g10code.com>  Assigns past and future changes
 +    (all work since 2001 as indicated by mail addresses in ChangeLogs)
 +
 +Gaël Quéri  <gael@lautre.net>  Translations [fr]
 +    (fixed a lot of typos)
 +
 +Gregory Steuck <steuck@iname.com> Translations [ru]
 +
 +Nagy Ferenc László <nfl@nfllab.com> Translations [hu]
 +
 +Ivo Timmermans <itimmermans@bigfoot.com> Translations [nl]
 +
 +Jacobo Tarri'o Barreiro <jtarrio@iname.com> Translations [gl]
 +
 +Janusz Aleksander Urbanowicz <alex@bofh.torun.pl> Translations [pl]
 +Jakub Bogusz <qboosh@pld-linux.org> Translations [pl]
 +
 +Jedi Lin <Jedi@idej.org> Translations [zh-tw]
 +
 +Jouni Hiltunen <jouni.hiltunen@kolumbus.fi> Translations [fi]
 +Tommi Vainikainen <Tommi.Vainikainen@iki.fi> Translations [fi]
 +
 +Laurentiu Buzdugan <lbgnupg@rolix.org> Translations [ro]
 +
 +Magda Procha'zkova'  <magda@math.muni.cz> Translations [cs]
 +
 +Michael Roth  <mroth@nessie.de>  Assigns changes.
 +    (wrote cipher/des.c., changes and bug fixes all over the place)
 +
 +Michal Majer <mmajer@econ.umb.sk> Translations [sk]
 +
 +Marco d'Itri <md@linux.it> Translations [it]
 +
 +Marcus Brinkmann  <marcus@g10code.de>
 +    (gpgconf and fixes all over the place)
 +
 +Matthew Skala <mskala@ansuz.sooke.bc.ca>  Disclaimer
 +    (wrote cipher/twofish.c)
 +
 +Moritz Schulte  <moritz@g10code.com>
 +   (ssh support gpg-agent)
 +
 +Niklas Hernaeus <nh@df.lth.se> Disclaimer
 +    (weak key patches)
 +
 +Nilgun Belma Buguner <nilgun@technologist.com> Translations [tr]
 +
 +Nils Ellmenreich  <nils 'at' infosun.fmi.uni-passau.de>
 +                                      Assigns past and future changes
 +    (configure.in, cipher/rndlinux.c, FAQ)
 +
 +Paul Eggert <eggert@twinsun.com>
 +    (configuration macros for LFS)
 +
 +Pavel I. Shajdo <pshajdo@gmail.com> Translations [ru]
 +    (man pages)
 +
 +Pedro Morais <morais@poli.org> Translations [pt_PT]
 +
 +Rémi Guyomarch       <rguyom@mail.dotcom.fr> Assigns past and future changes.
 +    (g10/compress.c, g10/encr-data.c,
 +     g10/free-packet.c, g10/mdfilter.c, g10/plaintext.c, util/iobuf.c)
 +
 +Stefan Bellon   <sbellon@sbellon.de> Assigns past and future changes.
 +   (All patches to support RISC OS)
 +
 +Timo Schulz     <twoaday@freakmail.de> Assigns past and future changes.
 +   (util/w32reg.c, g10/passphrase.c, g10/hkp.c)
 +
 +Tedi Heriyanto        <tedi_h@gmx.net> Translations [id]
 +
 +Thiago Jung Bauermann <jungmann@cwb.matrix.com.br> Translations [pt_BR]
 +Rafael Caetano dos Santos <rcaetano@linux.ime.usp.br> Translations [pt_BR]
 +
 +Toomas Soome <tsoome@ut.ee> Translations [et]
 +
 +Urko Lusa <ulusa@euskalnet.net> Translations [es_ES]
 +
 +Walter Koch <koch@u32.de>  Translations [de]
 +
 +Werner Koch  <wk@gnupg.org>  Assigns GNU Privacy Guard and future changes.
 +    (started the whole thing, wrote the S/MIME extensions, the
 +     smartcard daemon and the gpg-agent)
 +
 +Yosiaki IIDA <iida@ring.gr.jp> Translations [ja]
 +
 +Yuri Chornoivan, yurchor at ukr dot net: Translations [uk]
 +
 +Yutaka Niibe   Assigns Past and Future Changes
 +     (scd/)
  
  
  Authors with a DCO
  ==================
  
 -The list of authors who signed the Developer's Certificate of Origin
 -is kept in the GIT master branch's copy of this file.
 +Andre Heinecke <aheinecke@intevation.de>
 +2014-09-19:4525694.FcpLvWDUFT@esus:
 +
 +Andreas Schwier <andreas.schwier@cardcontact.de>
 +2014-07-22:53CED1D8.1010306@cardcontact.de:
 +
 +Arnaud Fontaine <arnaud.fontaine at ssi.gouv.fr>
 +2016-10-17:580484F4.8040806@ssi.gouv.fr:
 +
 +Christian Aistleitner <christian@quelltextlich.at>
 +2013-05-26:20130626112332.GA2228@quelltextlich.at:
 +
 +Damien Goutte-Gattat <dgouttegattat@incenp.org>
 +2015-01-17:54BA49AA.2040708@incenp.org:
 +
 +Daniel Kahn Gillmor <dkg@fifthhorseman.net>
 +2014-09-24:87oau6w9q7.fsf@alice.fifthhorseman.net:
 +
 +Hans of Guardian <hans@guardianproject.info>
 +2013-06-26:D84473D7-F3F7-43D5-A9CE-16580B88D574@guardianproject.info:
 +
 +Ineiev <ineiev@gnu.org>
 +2017-05-09:20170509121611.GH25850@gnu.org:
 +
 +Jonas Borgström <jonas@borgstrom.se>
 +2013-08-29:521F1E7A.5080602@borgstrom.se:
 +
 +Joshua Rogers <git@internot.info>
 +2014-12-22:5497FE75.7010503@internot.info:
 +
 +Jussi Kivilinna <jussi.kivilinna@iki.fi>
 +2018-02-11:2d8b7014-ff67-1e73-1152-9ff9fb8c10d7@iki.fi:
 +
 +Kyle Butt <kylebutt@gmail.com>
 +2013-05-29:CAAODAYLbCtqOG6msLLL0UTdASKWT6u2ptxsgUQ1JpusBESBoNQ@mail.gmail.com:
 +
 +Phil Pennock <phil.pennock@spodhuis.org>
 +Phil Pennock <phil@pennock-tech.com>
 +2017-01-19:20170119061225.GA26207@breadbox.private.spodhuis.org:
 +
 +Rainer Perske <rainer.perske@uni-muenster.de>
 +2017-10-24:permail-2017102014511105be2aed00002fc6-perske@message-id.uni-muenster.de:
 +
 +Stefan Tomanek <tomanek@internet-sicherheit.de>
 +2014-01-30:20140129234449.GY30808@zirkel.wertarbyte.de:
 +
 +Tobias Mueller <muelli@cryptobitch.de>
 +2016-11-23:1479937342.11180.3.camel@cryptobitch.de:
 +
 +Werner Koch <wk@gnupg.org>
 +2013-03-29:87620ahchj.fsf@vigenere.g10code.de:
 +
 +William L. Thomson Jr. <wlt@o-sinc.com>
 +2017-05-23:assp.0316398ca8.20170523093623.00a17d03@o-sinc.com:
 +
 +Yann E. MORIN <yann.morin.1998@free.fr>
 +2016-07-10:20160710093202.GA3688@free.fr:
  
  
  Other authors
@@@ -264,8 -91,8 +264,8 @@@ domain
  
  =========
  
-  Copyright 1998-2017 Free Software Foundation, Inc.
-  Copyright 1997-2017 Werner Koch
+  Copyright 1998-2018 Free Software Foundation, Inc.
+  Copyright 1997-2018 Werner Koch
  
   This file is free software; as a special exception the author gives
   unlimited permission to copy and/or distribute it, with or without
diff --combined README
--- 1/README
--- 2/README
+++ b/README
@@@ -2,8 -2,8 +2,8 @@@
                        =========================
                               Version 2.2
  
-           Copyright 1997-2017 Werner Koch
-           Copyright 1998-2017 Free Software Foundation, Inc.
+           Copyright 1997-2018 Werner Koch
+           Copyright 1998-2018 Free Software Foundation, Inc.
  
  
  * INTRODUCTION
@@@ -26,8 -26,7 +26,8 @@@
  
    Note that the 2.0 series of GnuPG will reach end-of-life on
    2017-12-31.  It is not possible to install a 2.2.x version along
 -  with any 2.0.x version.
 +  with any 2.0.x version.  However, it is possible to install GnuPG
 +  1.4 along with any 2.x version.
  
  
  * BUILD INSTRUCTIONS
diff --combined agent/command.c
@@@ -293,50 -293,19 +293,19 @@@ parse_keygrip (assuan_context_t ctx, co
  
  
  /* Write an Assuan status line.  KEYWORD is the first item on the
-    status line.  The following arguments are all separated by a space
-    in the output.  The last argument must be a NULL.  Linefeeds and
-    carriage returns characters (which are not allowed in an Assuan
-    status line) are silently quoted in C-style.  */
+  * status line.  The following arguments are all separated by a space
+  * in the output.  The last argument must be a NULL.  Linefeeds and
+  * carriage returns characters (which are not allowed in an Assuan
+  * status line) are silently quoted in C-style.  */
  gpg_error_t
  agent_write_status (ctrl_t ctrl, const char *keyword, ...)
  {
-   gpg_error_t err = 0;
+   gpg_error_t err;
    va_list arg_ptr;
-   const char *text;
    assuan_context_t ctx = ctrl->server_local->assuan_ctx;
-   char buf[950], *p;
-   size_t n;
  
    va_start (arg_ptr, keyword);
-   p = buf;
-   n = 0;
-   while ( (text = va_arg (arg_ptr, const char *)) )
-     {
-       if (n)
-         {
-           *p++ = ' ';
-           n++;
-         }
-       for ( ; *text && n < DIM (buf)-3; n++, text++)
-         {
-           if (*text == '\n')
-             {
-               *p++ = '\\';
-               *p++ = 'n';
-             }
-           else if (*text == '\r')
-             {
-               *p++ = '\\';
-               *p++ = 'r';
-             }
-           else
-             *p++ = *text;
-         }
-     }
-   *p = 0;
-   err = assuan_write_status (ctx, keyword, buf);
+   err = vprint_assuan_status_strings (ctx, keyword, arg_ptr);
    va_end (arg_ptr);
    return err;
  }
@@@ -874,7 -843,7 +843,7 @@@ static const char hlp_genkey[] 
    "\n"
    "  C: GENKEY\n"
    "  S: INQUIRE KEYPARAM\n"
 -  "  C: D (genkey (rsa (nbits  2048)))\n"
 +  "  C: D (genkey (rsa (nbits 3072)))\n"
    "  C: END\n"
    "  S: D (public-key\n"
    "  S: D   (rsa (n 326487324683264) (e 10001)))\n"
@@@ -1062,7 -1031,8 +1031,8 @@@ cmd_readkey (assuan_context_t ctx, cha
              rc = gpg_error_from_syserror ();
            else
              {
-               gcry_sexp_sprint (s_pkey, GCRYSEXP_FMT_CANON, pkbuf, pkbuflen);
+               pkbuflen = gcry_sexp_sprint (s_pkey, GCRYSEXP_FMT_CANON,
+                                            pkbuf, pkbuflen);
                rc = assuan_send_data (ctx, pkbuf, pkbuflen);
              }
          }
@@@ -3347,7 -3317,7 +3317,7 @@@ start_command_handler (ctrl_t ctrl, gnu
  
    for (;;)
      {
 -      pid_t client_pid;
 +      assuan_peercred_t client_creds;
  
        rc = assuan_accept (ctx);
        if (gpg_err_code (rc) == GPG_ERR_EOF || rc == -1)
            break;
          }
  
 -      client_pid = assuan_get_pid (ctx);
 -      ctrl->server_local->connect_from_self = (client_pid == getpid ());
 -      if (client_pid != ASSUAN_INVALID_PID)
 -        ctrl->client_pid = (unsigned long)client_pid;
 +      rc = assuan_get_peercred (ctx, &client_creds);
 +      if (rc)
 +        {
 +          log_info ("Assuan get_peercred failed: %s\n", gpg_strerror (rc));
 +          client_creds->pid = assuan_get_pid (ctx);
 +          ctrl->client_uid = -1;
 +        }
 +      ctrl->server_local->connect_from_self =
 +        (client_creds->pid == getpid ());
 +      if (client_creds->pid != ASSUAN_INVALID_PID)
 +        ctrl->client_pid = (unsigned long)client_creds->pid;
        else
          ctrl->client_pid = 0;
 +      ctrl->client_uid = client_creds->uid;
  
        rc = assuan_process (ctx);
        if (rc)
diff --combined configure.ac
@@@ -1,6 -1,6 +1,6 @@@
  # configure.ac - for GnuPG 2.1
- # Copyright (C) 1998-2017 Free Software Foundation, Inc.
- # Copyright (C) 1998-2017 Werner Koch
+ # Copyright (C) 1998-2018 Free Software Foundation, Inc.
+ # Copyright (C) 1998-2018 Werner Koch
  #
  # This file is part of GnuPG.
  #
@@@ -27,8 -27,8 +27,8 @@@ min_automake_version="1.14
  # another commit and push so that the git magic is able to work.
  m4_define([mym4_package],[gnupg])
  m4_define([mym4_major], [2])
 -m4_define([mym4_minor], [2])
 -m4_define([mym4_micro], [6])
 +m4_define([mym4_minor], [3])
 +m4_define([mym4_micro], [0])
  
  # To start a new development series, i.e a new major or minor number
  # you need to mark an arbitrary commit before the first beta release
@@@ -116,8 -116,8 +116,8 @@@ use_tls_library=n
  large_secmem=no
  show_tor_support=no
  
 -
 -GNUPG_BUILD_PROGRAM(gpg, yes)
 +# gpg is a required part and can't be disabled anymore.
 +build_gpg=yes
  GNUPG_BUILD_PROGRAM(gpgsm, yes)
  # The agent is a required part and can't be disabled anymore.
  build_agent=yes
  AC_DEFINE_UNQUOTED(SECMEM_BUFFER_SIZE,$SECMEM_BUFFER_SIZE,
                     [Size of secure memory buffer])
  
 +AC_MSG_CHECKING([calibrated passphrase-stretching (s2k) duration])
 +AC_ARG_WITH(agent-s2k-calibration,
 +              AC_HELP_STRING([--with-agent-s2k-calibration=MSEC],
 +                             [calibrate passphrase stretching (s2k) to MSEC milliseconds]),
 +              agent_s2k_calibration=$withval, agent_s2k_calibration=100)
 +AC_MSG_RESULT($agent_s2k_calibration milliseconds)
 +AC_DEFINE_UNQUOTED(AGENT_S2K_CALIBRATION, $agent_s2k_calibration,
 +                   [Agent s2k calibration time (ms)])
 +
  AC_MSG_CHECKING([whether to enable trust models])
  AC_ARG_ENABLE(trust-models,
                AC_HELP_STRING([--disable-trust-models],
@@@ -557,12 -548,9 +557,12 @@@ AH_BOTTOM(
  # endif
  #endif
  
 -/* Provide the es_ macro for estream.  */
 +/* Enable the es_ macros from gpgrt.  */
  #define GPGRT_ENABLE_ES_MACROS 1
  
 +/* Enable the log_ macros from gpgrt.  */
 +#define GPGRT_ENABLE_LOG_MACROS 1
 +
  /* Tell libgcrypt not to use its own libgpg-error implementation. */
  #define USE_LIBGPG_ERROR 1
  
@@@ -614,8 -602,9 +614,8 @@@ AC_PROG_RANLI
  AC_CHECK_TOOL(AR, ar, :)
  AC_PATH_PROG(PERL,"perl")
  AC_CHECK_TOOL(WINDRES, windres, :)
 -AC_PATH_PROG(YAT2M, "yat2m")
 +AC_PATH_PROG(YAT2M, "yat2m", "./yat2m" )
  AC_ARG_VAR(YAT2M, [tool to convert texi to man pages])
 -AM_CONDITIONAL(HAVE_YAT2M, test -n "$ac_cv_path_YAT2M")
  AC_ISC_POSIX
  AC_SYS_LARGEFILE
  GNUPG_CHECK_USTAR
@@@ -650,6 -639,7 +650,7 @@@ have_android_system=n
  use_simple_gettext=no
  use_ldapwrapper=yes
  mmap_needed=yes
+ require_pipe_to_unblock_pselect=no
  case "${host}" in
      *-mingw32*)
          # special stuff for Windoze NT
          AC_DEFINE(_DARWIN_C_SOURCE, 900000L,
                    Expose all libc features (__DARWIN_C_FULL).)
          ;;
+     *-*-netbsd*)
+         require_pipe_to_unblock_pselect=yes
+         ;;
      *)
-        ;;
+         ;;
  esac
  
+ if test "$require_pipe_to_unblock_pselect" = yes; then
+    AC_DEFINE(HAVE_PSELECT_NO_EINTR, 1,
+              [Defined if we run on systems like NetBSD, where
+               pselect cannot be unblocked by signal from a thread
+               within the same process.  We use pipe in this case, instead.])
+ fi
  if test "$have_dosish_system" = yes; then
     AC_DEFINE(HAVE_DOSISH_SYSTEM,1,
               [Defined if we run on some of the PCDOS like systems
@@@ -831,7 -831,8 +842,8 @@@ if test x"$LIBUSB_NAME" != x ; the
                    have_libusb=yes ])
     AC_MSG_CHECKING([libusb include dir])
     usb_incdir_found="no"
-    for _incdir in "" "/usr/include/libusb-1.0" "/usr/local/include/libusb-1.0"; do
+    for _incdir in "" "/usr/include/libusb-1.0" \
+        "/usr/local/include/libusb-1.0" "/usr/pkg/include/libusb-1.0"; do
       _libusb_save_cppflags=$CPPFLAGS
       if test -n "${_incdir}"; then
         CPPFLAGS="-I${_incdir} ${CPPFLAGS}"
@@@ -1611,7 -1612,7 +1623,7 @@@ if test "$GCC" = yes; the
            AC_MSG_RESULT($_gcc_wopt)
          fi
          if test x"$_gcc_wopt" = xyes ; then
 -          mycflags="$mycflags -W -Wno-sign-compare"
 +          mycflags="$mycflags -W -Wno-sign-compare -Wno-format-zero-length"
            mycflags="$mycflags -Wno-missing-field-initializers"
          fi
  
@@@ -1686,19 -1687,6 +1698,19 @@@ AC_ARG_ENABLE(optimization
                     fi])
  
  #
 +# log_debug has certain requirements which might hamper portability.
 +# Thus we use an option to enable it.
 +#
 +AC_MSG_CHECKING([whether to enable log_clock])
 +AC_ARG_ENABLE(log_clock,
 +              AC_HELP_STRING([--enable-log-clock],
 +                             [enable log_clock timestamps]),
 +              enable_log_clock=$enableval, enable_log_clock=no)
 +AC_MSG_RESULT($enable_log_clock)
 +if test "$enable_log_clock" = yes ; then
 +  AC_DEFINE(ENABLE_LOG_CLOCK,1,[Defined to use log_clock timestamps])
 +fi
 +
  # Add -Werror to CFLAGS.  This hack can be used to avoid problems with
  # misbehaving autoconf tests in case the user supplied -Werror.
  #
diff --combined doc/gpg.texi
@@@ -2257,16 -2257,6 +2257,16 @@@ works properly with such messages, ther
  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 --chunk-size @var{n}
 +@opindex chunk-size
 +The AEAD encryption mode encrypts the data in chunks so that a
 +receiving side can check for transmission errors or tampering at the
 +end of each chunk and does not need to delay this until all data has
 +been received.  The used chunk size is 2^@var{n} byte.  The lowest
 +allowed value for @var{n} is 6 (64 byte) and the largest is 62 (4
 +EiB). The default value for @var{n} is 30 which creates chunks not
 +larger than 1 GiB.
 +
  @item --input-size-hint @var{n}
  @opindex input-size-hint
  This option can be used to tell GPG the size of the input data in
@@@ -2604,16 -2594,6 +2604,16 @@@ is the default
  @itemx --no-force-v4-certs
  These options are obsolete and have no effect since GnuPG 2.1.
  
 +@item --force-aead
 +@opindex force-aead
 +Force the use of AEAD encryption over MDC encryption.  AEAD is a
 +modern and faster way to do authenticated encrytion than the old MDC
 +method.  See also options @option{--aead-algo} and
 +@option{--chunk-size}.
 +
 +This option requires the use of option @option{--rfc4880bis} to
 +declare that a not yet standardized feature is used.
 +
  @item --force-mdc
  @opindex force-mdc
  Force the use of encryption with a modification detection code. This
@@@ -2645,16 -2625,6 +2645,16 @@@ preferences, as GPG will only select a
  all recipients.  The most highly ranked cipher in this list is also
  used for the @option{--symmetric} encryption command.
  
 +@item --personal-aead-preferences @var{string}
 +@opindex personal-aead-preferences
 +Set the list of personal AEAD preferences to @var{string}.  Use
 +@command{@gpgname --version} to get a list of available algorithms,
 +and use @code{none} to set no preference at all.  This allows the user
 +to safely override the algorithm chosen by the recipient key
 +preferences, as GPG will only select an algorithm that is usable by
 +all recipients.  The most highly ranked cipher in this list is also
 +used for the @option{--symmetric} encryption command.
 +
  @item --personal-digest-preferences @var{string}
  @opindex personal-digest-preferences
  Set the list of personal digest preferences to @var{string}.  Use
@@@ -2861,12 -2831,6 +2861,12 @@@ Set all useful debugging flags
  Set stdout into line buffered mode.  This option is only honored when
  given on the command line.
  
 +@item --debug-set-iobuf-size @var{n}
 +@opindex debug-iolbf
 +Change the buffer size of the IOBUFs to @var{n} kilobyte.  Using 0
 +prints the current size.  Note well: This is a maintainer only option
 +and may thus be changed or removed at any time without notice.
 +
  @item --faked-system-time @var{epoch}
  @opindex faked-system-time
  This option is only useful for testing; it sets the system time back or
@@@ -3019,28 -2983,17 +3019,28 @@@ Use @var{name} as cipher algorithm. Run
  command @option{--version} yields a list of supported algorithms. If
  this is not used the cipher algorithm is selected from the preferences
  stored with the key. In general, you do not want to use this option as
 -it allows you to violate the OpenPGP standard.
 +it allows you to violate the OpenPGP standard.  The option
  @option{--personal-cipher-preferences} is the safe way to accomplish the
  same thing.
  
 +@item --aead-algo @var{name}
 +@opindex aead-algo
 +Specify that the AEAD algorithm @var{name} is to be used.  This is
 +useful for symmetric encryption where no key preference are available
 +to select the AEAD algorithm.  Runing @command{@gpgname} with option
 +@option{--version} shows the available AEAD algorithms.  In general,
 +you do not want to use this option as it allows you to violate the
 +OpenPGP standard.  The option @option{--personal-aead-preferences} is
 +the safe way to accomplish the same thing.
 +
  @item --digest-algo @var{name}
  @opindex digest-algo
  Use @var{name} as the message digest algorithm. Running the program
 -with the command @option{--version} yields a list of supported algorithms. In
 -general, you do not want to use this option as it allows you to
 -violate the OpenPGP standard. @option{--personal-digest-preferences} is the
 -safe way to accomplish the same thing.
 +with the command @option{--version} yields a list of supported
 +algorithms. In general, you do not want to use this option as it
 +allows you to violate the OpenPGP standard.  The option
 +@option{--personal-digest-preferences} is the safe way to accomplish
 +the same thing.
  
  @item --compress-algo @var{name}
  @opindex compress-algo
@@@ -3062,9 -3015,8 +3062,9 @@@ significant in low memory situations. N
  versions) only supports ZIP compression. Using any algorithm other
  than ZIP or "none" will make the message unreadable with PGP. In
  general, you do not want to use this option as it allows you to
 -violate the OpenPGP standard. @option{--personal-compress-preferences} is the
 -safe way to accomplish the same thing.
 +violate the OpenPGP standard.  The option
 +@option{--personal-compress-preferences} is the safe way to accomplish
 +the same thing.
  
  @item --cert-digest-algo @var{name}
  @opindex cert-digest-algo
@@@ -3829,6 -3781,19 +3829,19 @@@ If you are going to verify detached sig
  program knows about it; either give both filenames on the command line
  or use @samp{-} to specify STDIN.
  
+ For scripted or other unattended use of @command{gpg} make sure to use
+ the machine-parseable interface and not the default interface which is
+ intended for direct use by humans.  The machine-parseable interface
+ provides a stable and well documented API independent of the locale or
+ future changes of @command{gpg}.  To enable this interface use the
+ options @option{--with-colons} and @option{--status-fd}.  For certain
+ operations the option @option{--command-fd} may come handy too.  See
+ this man page and the file @file{DETAILS} for the specification of the
+ interface.  Note that the GnuPG ``info'' pages as well as the PDF
+ version of the GnuPG manual features a chapter on unattended use of
+ GnuPG.  As an alternative the library @command{GPGME} can be used as a
+ high-level abstraction on top of that interface.
  @mansect interoperability
  @chapheading INTEROPERABILITY WITH OTHER OPENPGP PROGRAMS
  
diff --combined doc/gpgsm.texi
@@@ -257,10 -257,10 +257,10 @@@ fingerprints or keygrips
  @item --export-secret-key-p12 @var{key-id}
  @opindex export-secret-key-p12
  Export the private key and the certificate identified by @var{key-id} in
a PKCS#12 format. When used with the @code{--armor} option a few
using the PKCS#12 format.  When used with the @code{--armor} option a few
  informational lines are prepended to the output.  Note, that the PKCS#12
- format is not very secure and this command is only provided if there is
no other way to exchange the private key. (@xref{option --p12-charset}.)
+ format is not very secure and proper transport security should be used
to convey the exported key.  (@xref{option --p12-charset}.)
  
  @item --export-secret-key-p8 @var{key-id}
  @itemx --export-secret-key-raw @var{key-id}
@@@ -843,9 -843,15 +843,9 @@@ purposes
  
  Note that even if a certificate is listed in this file, this does not
  mean that the certificate 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{@value{DATADIR}/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.
 +in this file need to be listed also in @file{trustlist.txt}. This is a global
 +file an installed in the sysconf directory (e.g.
 +@file{@value{SYSCONFDIR}/qualified.txt}).
  
  Every time @command{gpgsm} uses a certificate for signing or verification
  this file will be consulted to check whether the certificate under
@@@ -1067,7 -1073,7 +1067,7 @@@ key. The algorithm must be capable of s
  parameter.  The only supported value for @var{algo} is @samp{rsa}.
  
  @item Key-Length: @var{nbits}
 -The requested length of a generated key in bits.  Defaults to 2048.
 +The requested length of a generated key in bits.  Defaults to 3072.
  
  @item Key-Grip: @var{hexstring}
  This is optional and used to generate a CSR or certificate for an
diff --combined doc/wks.texi
@@@ -181,6 -181,7 +181,7 @@@ Display a brief help page and exit
  .RI [ options ]
  .B \-\-install-key
  .I file
+ .I user-id
  .br
  .B gpg-wks-server
  .RI [ options ]
@@@ -221,14 -222,19 +222,19 @@@ the process returns failure; to suppres
  @option{-q}.  More than one user-id can be given; see also option
  @option{with-file}.
  
+ The command @option{--install-key} manually installs a key into the
+ WKD.  The arguments are a file with the keyblock and the user-id to
+ install.  If the first argument resembles a fingerprint the key is
+ taken from the current keyring; to force the use of a file, prefix the
+ first argument with "./".
  The command @option{--remove-key} uninstalls a key from the WKD.  The
- process return success in this case; to also print a diagnostic, use
- option @option{-v}.  If the key is not installed a diagnostics is
+ process returns success in this case; to also print a diagnostic, use
+ option @option{-v}.  If the key is not installed a diagnostic is
  printed and the process returns failure; to suppress the diagnostic,
  use option @option{-q}.
  
- The commands @option{--install-key} and @option{--revoke-key} are not
- yet functional.
+ The command @option{--revoke-key} is not yet functional.
  
  
  @mansect options
@@@ -326,30 -332,25 +332,26 @@@ the submission address
  
  @example
    $ gpg --batch --passphrase '' --quick-gen-key key-submission@@example.net
-   $ gpg --with-wkd-hash -K key-submission@@example.net
+   $ gpg -K key-submission@@example.net
  @end example
  
  The output of the last command looks similar to this:
  
  @example
 -  sec   rsa2048 2016-08-30 [SC]
 +  sec   rsa3072 2016-08-30 [SC]
          C0FCF8642D830C53246211400346653590B3795B
    uid           [ultimate] key-submission@@example.net
 -  ssb   rsa2048 2016-08-30 [E]
 +                bxzcxpxk8h87z1k7bzk86xn5aj47intu@@example.net
 +  ssb   rsa3072 2016-08-30 [E]
  @end example
  
- Take the hash of the string "key-submission", which is
- "bxzcxpxk8h87z1k7bzk86xn5aj47intu" and manually publish that key:
+ Take the fingerprint from that output and manually publish the key:
  
  @example
-   $ gpg --export-options export-minimal --export \
-   >  -o /var/lib/gnupg/wks/example.net/hu/bxzcxpxk8h87z1k7bzk86xn5aj47intu \
-   >  key-submission@@example.new
+   $ gpg-wks-server --install-key C0FCF8642D830C53246211400346653590B3795B \
+   >                key-submission@@example.net
  @end example
  
- Make sure that the created file is world readable.
  Finally that submission address needs to be redirected to a script
  running @command{gpg-wks-server}.  The @command{procmail} command can
  be used for this: Redirect the submission address to the user "webkey"
diff --combined g10/keyedit.c
@@@ -1142,7 -1142,7 +1142,7 @@@ change_passphrase (ctrl_t ctrl, kbnode_
            if (err)
              log_log ((gpg_err_code (err) == GPG_ERR_CANCELED
                        || gpg_err_code (err) == GPG_ERR_FULLY_CANCELED)
 -                     ? GPGRT_LOG_INFO : GPGRT_LOG_ERROR,
 +                     ? GPGRT_LOGLVL_INFO : GPGRT_LOGLVL_ERROR,
                       _("key %s: error changing passphrase: %s\n"),
                         keystr_with_sub (keyid, subid),
                         gpg_strerror (err));
@@@ -1664,11 -1664,11 +1664,11 @@@ keyedit_menu (ctrl_t ctrl, const char *
                  if (opt.only_sign_text_ids)
                    result = cpr_get_answer_is_yes
                      ("keyedit.sign_all.okay",
-                      _("Really sign all user IDs? (y/N) "));
+                      _("Really sign all text user IDs? (y/N) "));
                  else
                    result = cpr_get_answer_is_yes
                      ("keyedit.sign_all.okay",
-                      _("Really sign all text user IDs? (y/N) "));
+                      _("Really sign all user IDs? (y/N) "));
  
                  if (! result)
                    {
@@@ -3064,23 -3064,6 +3064,23 @@@ show_prefs (PKT_user_id * uid, PKT_sign
          tty_printf ("%s", openpgp_cipher_algo_name (CIPHER_ALGO_3DES));
        }
        tty_printf ("\n     ");
 +      tty_printf (_("AEAD: "));
 +      for (i = any = 0; prefs[i].type; i++)
 +      {
 +        if (prefs[i].type == PREFTYPE_AEAD)
 +          {
 +            if (any)
 +              tty_printf (", ");
 +            any = 1;
 +            /* We don't want to display strings for experimental algos */
 +            if (!openpgp_aead_test_algo (prefs[i].value)
 +                && prefs[i].value < 100)
 +              tty_printf ("%s", openpgp_aead_algo_name (prefs[i].value));
 +            else
 +              tty_printf ("[%d]", prefs[i].value);
 +          }
 +      }
 +      tty_printf ("\n     ");
        tty_printf (_("Digest: "));
        for (i = any = 0; prefs[i].type; i++)
        {
            }
          tty_printf ("%s", compress_algo_to_string (COMPRESS_ALGO_NONE));
        }
 -      if (uid->flags.mdc || !uid->flags.ks_modify)
 +      if (uid->flags.mdc || uid->flags.aead || !uid->flags.ks_modify)
        {
          tty_printf ("\n     ");
          tty_printf (_("Features: "));
              tty_printf ("MDC");
              any = 1;
            }
 +        if (!uid->flags.aead)
 +          {
 +            if (any)
 +              tty_printf (", ");
 +            tty_printf ("AEAD");
 +          }
          if (!uid->flags.ks_modify)
            {
              if (any)
        for (i = 0; prefs[i].type; i++)
        {
          tty_printf (" %c%d", prefs[i].type == PREFTYPE_SYM ? 'S' :
 +                    prefs[i].type == PREFTYPE_AEAD ? 'A' :
                      prefs[i].type == PREFTYPE_HASH ? 'H' :
                      prefs[i].type == PREFTYPE_ZIP ? 'Z' : '?',
                      prefs[i].value);
        }
        if (uid->flags.mdc)
        tty_printf (" [mdc]");
 +      if (uid->flags.aead)
 +      tty_printf (" [aead]");
        if (!uid->flags.ks_modify)
        tty_printf (" [no-ks-modify]");
        tty_printf ("\n");
@@@ -3343,8 -3317,6 +3343,8 @@@ show_key_with_all_names_colon (ctrl_t c
                }
              if (uid->flags.mdc)
                es_fputs (",mdc", fp);
 +            if (uid->flags.aead)
 +              es_fputs (",aead", fp);
              if (!uid->flags.ks_modify)
                es_fputs (",no-ks-modify", fp);
            }
diff --combined scd/app-openpgp.c
@@@ -98,7 -98,7 +98,7 @@@ static struct 
    { 0x0065, 1,    0, 1, 0, 0, 0, 0, "Cardholder Related Data"},
    { 0x005B, 0, 0x65, 0, 0, 0, 0, 0, "Name" },
    { 0x5F2D, 0, 0x65, 0, 0, 0, 0, 0, "Language preferences" },
 -  { 0x5F35, 0, 0x65, 0, 0, 0, 0, 0, "Sex" },
 +  { 0x5F35, 0, 0x65, 0, 0, 0, 0, 0, "Salutation" },
    { 0x006E, 1,    0, 1, 0, 0, 0, 0, "Application Related Data" },
    { 0x004F, 0, 0x6E, 1, 0, 0, 0, 0, "AID" },
    { 0x0073, 1,    0, 1, 0, 0, 0, 0, "Discretionary Data Objects" },
@@@ -348,7 -348,8 +348,8 @@@ get_cached_data (app_t app, int tag
    err = iso7816_get_data (app->slot, exmode, tag, &p, &len);
    if (err)
      return err;
-   *result = p;
+   if (len)
+     *result = p;
    *resultlen = len;
  
    /* Check whether we should cache this object. */
    c = xtrymalloc (sizeof *c + len);
    if (c)
      {
-       memcpy (c->data, p, len);
+       if (len)
+         memcpy (c->data, p, len);
+       else
+         xfree (p);
        c->length = len;
        c->tag = tag;
        c->next = app->app_local->cache;
@@@ -559,7 -563,7 +563,7 @@@ dump_all_do (int slot
            if (data_objects[i].binary)
              {
                log_info ("DO '%s': ", data_objects[i].desc);
 -              log_printhex ("", buffer, buflen);
 +              log_printhex (buffer, buflen, "");
              }
            else
              log_info ("DO '%s': '%.*s'\n",
                            if (valuelen > 200)
                              log_info ("[%u]\n", (unsigned int)valuelen);
                            else
 -                            log_printhex ("", value, valuelen);
 +                            log_printhex (value, valuelen, "");
                          }
                        else
                          log_info ("DO '%s': '%.*s'\n",
@@@ -2068,7 -2072,8 +2072,8 @@@ pin2hash_if_kdf (app_t app, int chvno, 
    size_t buflen;
  
    if (app->app_local->extcap.kdf_do
-       && (relptr = get_one_do (app, 0x00F9, &buffer, &buflen, NULL)))
+       && (relptr = get_one_do (app, 0x00F9, &buffer, &buflen, NULL))
+       && buflen == 110 && (buffer[2] == 0x03))
      {
        char *salt;
        unsigned long s2k_count;
@@@ -5042,7 -5047,7 +5047,7 @@@ parse_algorithm_attribute (app_t app, i
        curve = ecc_curve (buffer + 1, oidlen);
  
        if (!curve)
 -        log_printhex ("Curve with OID not supported: ", buffer+1, buflen-1);
 +        log_printhex (buffer+1, buflen-1, "Curve with OID not supported: ");
        else
          {
            app->app_local->keyattr[keyno].key_type = KEY_TYPE_ECC;
          }
      }
    else if (opt.verbose)
 -    log_printhex ("", buffer, buflen);
 +    log_printhex (buffer, buflen, "");
  
    xfree (relptr);
  }
@@@ -5102,7 -5107,7 +5107,7 @@@ app_select_openpgp (app_t app
        if (opt.verbose)
          {
            log_info ("AID: ");
 -          log_printhex ("", buffer, buflen);
 +          log_printhex (buffer, buflen, "");
          }
  
        app->card_version = buffer[6] << 8;
            if (opt.verbose)
              {
                log_info ("Historical Bytes: ");
 -              log_printhex ("", buffer, buflen);
 +              log_printhex (buffer, buflen, "");
              }
            parse_historical (app->app_local, buffer, buflen);
            xfree (relptr);