Copyright (C) 1991-2013 Free Software Foundation, Inc.
Copyright (C) 2000-2001 Werner Koch
- Copyright (C) 2001-2018 g10 Code GmbH
+ Copyright (C) 2001-2021 g10 Code GmbH
Copyright (C) 2002 Klarälvdalens Datakonsult AB
Copyright (C) 2004-2008 Igor Belyi
Copyright (C) 2002 John Goerzen
+2021-01-08 Werner Koch <wk@gnupg.org>
+
+ Release 1.15.1.
+ + commit bb9880778fb16cdb6de83905e45bf6c965770013
+
+
+ Make distcheck make target a bit more reliable.
+ + commit 133050b3fa28122a4b60dbbde698fb14379ccf95
+ * Makefile.am (release): Do not pass --parallel
+
+2021-01-05 Ingo Klöcker <dev@ingo-kloecker.de>
+
+ core: Make listing of signatures work if only secret keys are listed.
+ + commit 5137d7fc214d0d9dcb947ccdc32fa87979f9a6d0
+ * src/engine-gpg.c (gpg_keylist_build_options): Add "--with-sig-check"
+ argument if signatures shall be listed.
+ * tests/gpg/t-keylist-secret-sig.c: New.
+ * tests/gpg/Makefile.am (c_tests): Add new test.
+
+2021-01-04 Ingo Klöcker <dev@ingo-kloecker.de>
+
+ cpp: Add const-overload of UserID::Signature::operator<
+ + commit a6220adf3081c9c848f6d0a6fc3774cb168ccf9c
+ lang/cpp/src/key.h, lang/cpp/src/key.cpp (UserID::Signature::operator<):
+ Add const-overload. Deprecate non-const overload.
+
+2021-01-04 Andre Heinecke <aheinecke@gnupg.org>
+
+ Qt: Undeprecate QByteArray based start functs.
+ + commit 543e2106386f00ebecf7653e7896fa12a6e828ff
+ * lang/qt/src/encryptjob.h, lang/qt/src/signjob.h (start):
+ Undeprecate QByteArray based functions.
+
+2020-12-03 NIIBE Yutaka <gniibe@fsij.org>
+
+ python: Fix key_export*.
+ + commit 7a4fe82a017b751ad756c93d2b9e31d7be045275
+ * lang/python/src/core.py (key_export): Just raise an error.
+ (key_export_minimal, key_export_secret): Ditto.
+
+2020-11-24 NIIBE Yutaka <gniibe@fsij.org>
+
+ core: Call _gpgme_passphrase_status_handler when exporting keys.
+ + commit 53ac732bae46e1f883998e987fc84d4cababde12
+ * src/export.c (export_status_handler): Call the handler.
+
+2020-11-20 Andre Heinecke <aheinecke@gnupg.org>
+
+ Revert "cpp: Use portable off_t size_t"
+ + commit a5c4b030258714dd72a2e276114183309cad3ec3
+ This reverts commit 88294023c196497cfa6737be262c8b0c09d2a3ce.
+
+2020-11-20 NIIBE Yutaka <gniibe@fsij.org>
+
+ m4: Update with newer autoconf constructs.
+ + commit 4c6fd361593e22092770d120d68a18b4f70e0bb8
+ * src/gpgme.m4: Replace AC_HELP_STRING to AS_HELP_STRING.
+
+2020-11-18 Andre Heinecke <aheinecke@gnupg.org>
+
+ cpp: Use portable off_t size_t.
+ + commit 88294023c196497cfa6737be262c8b0c09d2a3ce
+ * configure.ac: Configure cpp data.h.in
+ * lang/cpp/src/Makefile.am: Generate data.h
+ * lang/cpp/src/data.cpp, lang/cpp/src/data.h: Use portable
+ types.
+ * lang/qt/src/Makefile.am: Include build dir.
+ * lang/qt/tests/makefile.am: Include build dir.
+
+2020-11-18 Ingo Klöcker <dev@ingo-kloecker.de>
+ Daniel Kahn Gillmor
+
+ qt: Avoid empty "rem@gnupg.org" signature notations.
+ + commit 3c185c2159cdcc23f44773fe1cfb624b27598c80
+ * lang/qt/src/qgpgmesignkeyjob.cpp (sign_key): Check remark for being
+ an empty string instead of a null QString.
+
+2020-11-18 NIIBE Yutaka <gniibe@fsij.org>
+
+ build: Update with newer autoconf constructs.
+ + commit 223779dfdeb7808809372587fa135a8cc2616ce8
+ * configure.ac: Use AC_USE_SYSTEM_EXTENSIONS instead of AC_GNU_SOURCE.
+ Use AS_HELP_STRING instead of AC_HELP_STRING.
+ * m4/libtool.m4: Update from libgpg-error.
+ * m4/gpg-error.m4: Update from libgpg-error.
+ * m4/libassuan.m4: Update from libassuan.
+
+2020-11-12 Andre Heinecke <aheinecke@gnupg.org>
+
+ qt: Fix export of qDebug GpgME::Error overload.
+ + commit df5a89e6929479dc1bf301974fe7d607d024bc1f
+ * lang/qt/src/debug.cpp: Include debug.h to get the export decl.
+
2020-11-12 Werner Koch <wk@gnupg.org>
+ build: Use ~/.gnupg-autogen.sh for the release targets.
+ + commit 27abdac25dcd4ba57e073a5de2f057830e623282
+ * Makefile.am (sign-release): Use global config vars.
+
+ Post release updates.
+ + commit 01a0d8ec1aa8543dca0986c6dcb5cabc535aae2c
+
+
Release 1.15.0.
+ commit feea38c89d4ceb40334f884da9ab07cc4b73e757
* configure.ac: Bump LT versions to c=C35/A24/R0, cpp=C18/A13/R0,
## Process this file with automake to produce Makefile.in
-# Location of the released tarball archives. Note that this is an
-# internal archive and before uploading this to the public server,
-# manual tests should be run and the git release tat set and pushed.
-# Adjust as needed.
-RELEASE_ARCHIVE_DIR = wk@vigenere:tarballs/gpgme/
+# Location of the released tarball archives. This is prefixed by
+# the variable RELEASE_ARCHIVE in ~/.gnupg-autogen.rc. For example:
+# RELEASE_ARCHIVE=user@host:archive/tarballs
+RELEASE_ARCHIVE_SUFFIX = gpgme
+# The variable RELEASE_SIGNKEY in ~/.gnupg-autogen.rc is used
+# to specify the key for signing. For example:
+# RELEASE_SIGNKEY=D8692123C4065DEA5E0F3AB5249B39D24F25E3B6
-# The key used to sign the released sources. Adjust as needed.
-RELEASE_SIGNING_KEY = D8692123C4065DEA5E0F3AB5249B39D24F25E3B6
# Autoconf flags
ACLOCAL_AMFLAGS = -I m4
cd $(abs_top_builddir); \
rm -rf dist; mkdir dist ; cd dist ; \
$(abs_top_srcdir)/configure --enable-maintainer-mode; \
- $(MAKE) distcheck TESTFLAGS=--parallel; \
+ $(MAKE) distcheck; \
echo "/* Build finished at $$(date -uIseconds) */" ;\
echo "/*" ;\
echo " * Please run the final step interactively:" ;\
sign-release:
+(set -e; \
cd dist; \
+ x=$$(grep '^RELEASE_ARCHIVE=' $$HOME/.gnupg-autogen.rc|cut -d= -f2);\
+ if [ -z "$$x" ]; then \
+ echo "error: RELEASE_ARCHIVE missing in ~/.gnupg-autogen.rc">&2; \
+ exit 2;\
+ fi;\
+ myarchive="$$x/$(RELEASE_ARCHIVE_SUFFIX)";\
+ x=$$(grep '^RELEASE_SIGNKEY=' $$HOME/.gnupg-autogen.rc|cut -d= -f2);\
+ if [ -z "$$x" ]; then \
+ echo "error: RELEASE_SIGNKEY missing in ~/.gnupg-autogen.rc">&2; \
+ exit 2;\
+ fi;\
+ mysignkey="$$x";\
files1="$(RELEASE_NAME).tar.bz2" ;\
files2="$(RELEASE_NAME).tar.bz2.sig \
$(RELEASE_NAME).swdb \
$(RELEASE_NAME).buildlog" ;\
echo "/* Signing the source tarball ..." ;\
- gpg -sbu $(RELEASE_SIGNING_KEY) $(RELEASE_NAME).tar.bz2 ;\
+ gpg -sbu $$mysignkey $(RELEASE_NAME).tar.bz2 ;\
cat $(RELEASE_NAME).swdb >swdb.snippet;\
echo >>swdb.snippet ;\
sha1sum $${files1} >>swdb.snippet ;\
cat "../$(RELEASE_NAME).buildlog" swdb.snippet \
| gzip >$(RELEASE_NAME).buildlog ;\
echo "Copying to local archive ..." ;\
- scp -p $${files1} $${files2} $(RELEASE_ARCHIVE_DIR)/ || true;\
+ scp -p $${files1} $${files2} $$myarchive/ || true;\
echo "Uploading documentation ..." ;\
$(MAKE) -C doc online; \
echo '/*' ;\
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
-# Location of the released tarball archives. Note that this is an
-# internal archive and before uploading this to the public server,
-# manual tests should be run and the git release tat set and pushed.
-# Adjust as needed.
-RELEASE_ARCHIVE_DIR = wk@vigenere:tarballs/gpgme/
-
-# The key used to sign the released sources. Adjust as needed.
-RELEASE_SIGNING_KEY = D8692123C4065DEA5E0F3AB5249B39D24F25E3B6
+# Location of the released tarball archives. This is prefixed by
+# the variable RELEASE_ARCHIVE in ~/.gnupg-autogen.rc. For example:
+# RELEASE_ARCHIVE=user@host:archive/tarballs
+RELEASE_ARCHIVE_SUFFIX = gpgme
+# The variable RELEASE_SIGNKEY in ~/.gnupg-autogen.rc is used
+# to specify the key for signing. For example:
+# RELEASE_SIGNKEY=D8692123C4065DEA5E0F3AB5249B39D24F25E3B6
# Autoconf flags
ACLOCAL_AMFLAGS = -I m4
cd $(abs_top_builddir); \
rm -rf dist; mkdir dist ; cd dist ; \
$(abs_top_srcdir)/configure --enable-maintainer-mode; \
- $(MAKE) distcheck TESTFLAGS=--parallel; \
+ $(MAKE) distcheck; \
echo "/* Build finished at $$(date -uIseconds) */" ;\
echo "/*" ;\
echo " * Please run the final step interactively:" ;\
sign-release:
+(set -e; \
cd dist; \
+ x=$$(grep '^RELEASE_ARCHIVE=' $$HOME/.gnupg-autogen.rc|cut -d= -f2);\
+ if [ -z "$$x" ]; then \
+ echo "error: RELEASE_ARCHIVE missing in ~/.gnupg-autogen.rc">&2; \
+ exit 2;\
+ fi;\
+ myarchive="$$x/$(RELEASE_ARCHIVE_SUFFIX)";\
+ x=$$(grep '^RELEASE_SIGNKEY=' $$HOME/.gnupg-autogen.rc|cut -d= -f2);\
+ if [ -z "$$x" ]; then \
+ echo "error: RELEASE_SIGNKEY missing in ~/.gnupg-autogen.rc">&2; \
+ exit 2;\
+ fi;\
+ mysignkey="$$x";\
files1="$(RELEASE_NAME).tar.bz2" ;\
files2="$(RELEASE_NAME).tar.bz2.sig \
$(RELEASE_NAME).swdb \
$(RELEASE_NAME).buildlog" ;\
echo "/* Signing the source tarball ..." ;\
- gpg -sbu $(RELEASE_SIGNING_KEY) $(RELEASE_NAME).tar.bz2 ;\
+ gpg -sbu $$mysignkey $(RELEASE_NAME).tar.bz2 ;\
cat $(RELEASE_NAME).swdb >swdb.snippet;\
echo >>swdb.snippet ;\
sha1sum $${files1} >>swdb.snippet ;\
cat "../$(RELEASE_NAME).buildlog" swdb.snippet \
| gzip >$(RELEASE_NAME).buildlog ;\
echo "Copying to local archive ..." ;\
- scp -p $${files1} $${files2} $(RELEASE_ARCHIVE_DIR)/ || true;\
+ scp -p $${files1} $${files2} $$myarchive/ || true;\
echo "Uploading documentation ..." ;\
$(MAKE) -C doc online; \
echo '/*' ;\
+Noteworthy changes in version 1.15.1 (2021-01-08)
+-------------------------------------------------
+
+ * Fix another bug in the secret key export. [#5046]
+
+ * Make listing of signatures work if only secret keys are listed. [#3580]
+
+ * Fix build problem on FreeBSD. [a6220adf30]
+
+ * qt: Avoid empty "rem@gnupg.org" signature notations. [#5142]
+
+ * python: Fix key_export functions. [#5149]
+
+
+ [c=C35/A24/R1 cpp=C18/A12/R1 qt=C12/A5/R1]
+
+ Release-info: https://dev.gnupg.org/T5225
+
+
Noteworthy changes in version 1.15.0 (2020-11-12)
-------------------------------------------------
GPGME - GnuPG Made Easy
---------------------------
-Copyright 2001-2020 g10 Code GmbH
+Copyright 2001-2021 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
#define GPG_ERR_ENABLE_ERRNO_MACROS 1
#define CRIGHTBLURB "Copyright (C) 2000 Werner Koch\n" \
- "Copyright (C) 2001--2020 g10 Code GmbH\n"
+ "Copyright (C) 2001--2021 g10 Code GmbH\n"
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for gpgme 1.15.0.
+# Generated by GNU Autoconf 2.69 for gpgme 1.15.1.
#
# Report bugs to <https://bugs.gnupg.org>.
#
# Identity of this package.
PACKAGE_NAME='gpgme'
PACKAGE_TARNAME='gpgme'
-PACKAGE_VERSION='1.15.0'
-PACKAGE_STRING='gpgme 1.15.0'
+PACKAGE_VERSION='1.15.1'
+PACKAGE_STRING='gpgme 1.15.1'
PACKAGE_BUGREPORT='https://bugs.gnupg.org'
PACKAGE_URL=''
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures gpgme 1.15.0 to adapt to many kinds of systems.
+\`configure' configures gpgme 1.15.1 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of gpgme 1.15.0:";;
+ short | recursive ) echo "Configuration of gpgme 1.15.1:";;
esac
cat <<\_ACEOF
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-gpgme configure 1.15.0
+gpgme configure 1.15.1
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by gpgme $as_me 1.15.0, which was
+It was created by gpgme $as_me 1.15.1, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
#
LIBGPGME_LT_CURRENT=35
LIBGPGME_LT_AGE=24
-LIBGPGME_LT_REVISION=0
+LIBGPGME_LT_REVISION=1
# If there is an ABI break in gpgmepp or qgpgme also bump the
# version in IMPORTED_LOCATION in the GpgmeppConfig-w32.cmake.in.in
LIBGPGMEPP_LT_CURRENT=18
LIBGPGMEPP_LT_AGE=12
-LIBGPGMEPP_LT_REVISION=0
+LIBGPGMEPP_LT_REVISION=1
LIBQGPGME_LT_CURRENT=12
LIBQGPGME_LT_AGE=5
-LIBQGPGME_LT_REVISION=0
+LIBQGPGME_LT_REVISION=1
################################################
VERSION_MAJOR=1
VERSION_MINOR=15
-VERSION_MICRO=0
+VERSION_MICRO=1
ac_aux_dir=
for ac_dir in build-aux "$srcdir"/build-aux; do
# Define the identity of the package.
PACKAGE='gpgme'
- VERSION='1.15.0'
+ VERSION='1.15.1'
cat >>confdefs.h <<_ACEOF
-
# Taken from mpfr-4.0.1, then modified for LDADD_FOR_TESTS_KLUDGE
case $host in
*-*-linux*)
-VERSION_NUMBER=0x010f00
+VERSION_NUMBER=0x010f01
# We need to compile and run a program on the build machine. A
x86_64-*linux*)
LD="${LD-ld} -m elf_i386"
;;
- ppc64-*linux*|powerpc64-*linux*)
+ powerpc64le-*)
+ LD="${LD-ld} -m elf32lppclinux"
+ ;;
+ powerpc64-*)
LD="${LD-ld} -m elf32ppclinux"
;;
s390x-*linux*)
x86_64-*linux*)
LD="${LD-ld} -m elf_x86_64"
;;
- ppc*-*linux*|powerpc*-*linux*)
+ powerpcle-*)
+ LD="${LD-ld} -m elf64lppc"
+ ;;
+ powerpc-*)
LD="${LD-ld} -m elf64ppc"
;;
s390*-*linux*|s390*-*tpf*)
dynamic_linker=no
;;
+linux*android*)
+ version_type=none # Android doesn't support versioned libraries.
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext'
+ soname_spec='$libname$release$shared_ext'
+ finish_cmds=
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ dynamic_linker='Android linker'
+ # Don't embed -rpath directories since the linker doesn't support them.
+ hardcode_libdir_flag_spec='-L$libdir'
+ ;;
+
# This must be glibc/ELF.
linux* | k*bsd*-gnu | kopensolaris*-gnu)
version_type=linux # correct to gnu/linux during the next big refactor
dynamic_linker=no
;;
+linux*android*)
+ version_type=none # Android doesn't support versioned libraries.
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext'
+ soname_spec='$libname$release$shared_ext'
+ finish_cmds=
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ dynamic_linker='Android linker'
+ # Don't embed -rpath directories since the linker doesn't support them.
+ hardcode_libdir_flag_spec_CXX='-L$libdir'
+ ;;
+
# This must be glibc/ELF.
linux* | k*bsd*-gnu | kopensolaris*-gnu)
version_type=linux # correct to gnu/linux during the next big refactor
#
# Provide information about the build.
#
-BUILD_REVISION="feea38c8"
+BUILD_REVISION="bb988077"
cat >>confdefs.h <<_ACEOF
BUILD_VERSION=`echo "$PACKAGE_VERSION" | sed 's/\([0-9.]*\).*/\1./'`
-BUILD_VERSION="${BUILD_VERSION}65258"
+BUILD_VERSION="${BUILD_VERSION}48024"
BUILD_FILEVERSION=`echo "${BUILD_VERSION}" | tr . ,`
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by gpgme $as_me 1.15.0, which was
+This file was extended by gpgme $as_me 1.15.1, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
-gpgme config.status 1.15.0
+gpgme config.status 1.15.1
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
echo "
GPGME v${VERSION} has been configured as follows:
- Revision: feea38c8 (65258)
+ Revision: bb988077 (48024)
Platform: $host
UI Server: $uiserver
# configure.ac for GPGME
# Copyright (C) 2000 Werner Koch (dd9jn)
-# Copyright (C) 2001-2018 g10 Code GmbH
+# Copyright (C) 2001-2021 g10 Code GmbH
#
# This file is part of GPGME.
#
# SPDX-License-Identifier: LGPL-2.1-or-later
# (Process this file with autoconf to produce a configure script.)
-AC_PREREQ(2.59)
+AC_PREREQ([2.59])
min_automake_version="1.14"
# To build a release you need to create a tag with the version number
m4_define([mym4_package],[gpgme])
m4_define([mym4_major], [1])
m4_define([mym4_minor], [15])
-m4_define([mym4_micro], [0])
+m4_define([mym4_micro], [1])
# Below is m4 magic to extract and compute the git revision number,
# the decimalized short revision number, a beta version string and a
m4_define([mym4_revision], m4_argn(7, mym4_verslist))
m4_define([mym4_revision_dec], m4_argn(8, mym4_verslist))
m4_esyscmd([echo ]mym4_version[>VERSION])
-AC_INIT([mym4_package],[mym4_version], [https://bugs.gnupg.org])
+AC_INIT([mym4_package],[mym4_version],[https://bugs.gnupg.org])
# LT Version numbers, remember to change them just *before* a release.
# (Code changed: REVISION++)
#
LIBGPGME_LT_CURRENT=35
LIBGPGME_LT_AGE=24
-LIBGPGME_LT_REVISION=0
+LIBGPGME_LT_REVISION=1
# If there is an ABI break in gpgmepp or qgpgme also bump the
# version in IMPORTED_LOCATION in the GpgmeppConfig-w32.cmake.in.in
LIBGPGMEPP_LT_CURRENT=18
LIBGPGMEPP_LT_AGE=12
-LIBGPGMEPP_LT_REVISION=0
+LIBGPGMEPP_LT_REVISION=1
LIBQGPGME_LT_CURRENT=12
LIBQGPGME_LT_AGE=5
-LIBQGPGME_LT_REVISION=0
+LIBQGPGME_LT_REVISION=1
################################################
AC_SUBST(LIBGPGME_LT_CURRENT)
AC_ARG_VAR(SYSROOT,[locate config scripts also below that directory])
# Enable GNU extensions on systems that have them.
-AC_GNU_SOURCE
+AC_USE_SYSTEM_EXTENSIONS
# Taken from mpfr-4.0.1, then modified for LDADD_FOR_TESTS_KLUDGE
dnl Under Linux, make sure that the old dtags are used if LD_LIBRARY_PATH
AM_PATH_GLIB_2_0
AC_ARG_ENABLE(w32-glib,
- AC_HELP_STRING([--enable-w32-glib], [build GPGME Glib for W32]),
+ AS_HELP_STRING([--enable-w32-glib],[build GPGME Glib for W32]),
build_w32_glib=$enableval)
;;
*)
AC_ARG_ENABLE([fixed-path],
- AC_HELP_STRING([--enable-fixed-path=PATH],
+ AS_HELP_STRING([--enable-fixed-path=PATH],
[locate binaries only via this PATH]),
[fixed_search_path="$enableval"],
[fixed_search_path=""])
# Note: You need to declare all possible languages also in
# lang/Makefile.am's DIST_SUBDIRS.
AC_ARG_ENABLE([languages],
- AC_HELP_STRING([--enable-languages=languages],
+ AS_HELP_STRING([--enable-languages=languages],
[enable only specific language bindings]),
[enabled_languages=`echo $enableval | \
tr ',:' ' ' | tr '[A-Z]' '[a-z]' | \
AC_SUBST(BUILD_FILEVERSION)
AC_ARG_ENABLE([build-timestamp],
- AC_HELP_STRING([--enable-build-timestamp],
+ AS_HELP_STRING([--enable-build-timestamp],
[set an explicit build timestamp for reproducibility.
(default is the current time in ISO-8601 format)]),
[if test "$enableval" = "yes"; then
#
run_gpgconf_test="yes"
AC_ARG_ENABLE(gpgconf-test,
- AC_HELP_STRING([--disable-gpgconf-test], [disable GPGCONF regression test]),
+ AS_HELP_STRING([--disable-gpgconf-test],[disable GPGCONF regression test]),
run_gpgconf_test=$enableval)
AM_CONDITIONAL(RUN_GPGCONF_TESTS, test "$run_gpgconf_test" = "yes")
run_gpg_test="yes"
AC_ARG_ENABLE(gpg-test,
- AC_HELP_STRING([--disable-gpg-test], [disable GPG regression test]),
+ AS_HELP_STRING([--disable-gpg-test],[disable GPG regression test]),
run_gpg_test=$enableval)
AM_CONDITIONAL(RUN_GPG_TESTS, test "$run_gpg_test" = "yes")
run_gpgsm_test="yes"
AC_ARG_ENABLE(gpgsm-test,
- AC_HELP_STRING([--disable-gpgsm-test], [disable GPGSM regression test]),
+ AS_HELP_STRING([--disable-gpgsm-test],[disable GPGSM regression test]),
run_gpgsm_test=$enableval)
AM_CONDITIONAL(RUN_GPGSM_TESTS, test "$run_gpgsm_test" = "yes")
run_g13_test="yes"
AC_ARG_ENABLE(g13-test,
- AC_HELP_STRING([--disable-g13-test], [disable G13 regression test]),
+ AS_HELP_STRING([--disable-g13-test],[disable G13 regression test]),
run_g13_test=$enableval)
AM_CONDITIONAL(RUN_G13_TESTS, test "$run_g13_test" = "yes")
use_descriptor_passing=yes
AC_ARG_ENABLE(fd-passing,
- AC_HELP_STRING([--disable-fd-passing], [do not use FD passing]),
+ AS_HELP_STRING([--disable-fd-passing],[do not use FD passing]),
use_descriptor_passing=$enableval)
if test "$supports_descriptor_passing" != "yes"; then
# before an exec. This option allows to switch this optimization off.
use_linux_getdents=yes
AC_ARG_ENABLE(linux-getdents,
- AC_HELP_STRING([--disable-linux-getdents],
+ AS_HELP_STRING([--disable-linux-getdents],
[do not use SYS_getdents on Linux]),
use_linux_getdents=$enableval)
if test "$use_linux_getdents" = "yes"; then
#define GPG_ERR_ENABLE_ERRNO_MACROS 1
#define CRIGHTBLURB "Copyright (C) 2000 Werner Koch\n" \
- "Copyright (C) 2001--2020 g10 Code GmbH\n"
+ "Copyright (C) 2001--2021 g10 Code GmbH\n"
])
# This is a template. The dist target uses it to create the real file.
Summary: GPGME - GnuPG Made Easy
Name: gpgme
-Version: 1.15.0
+Version: 1.15.1
Release: 1
URL: https://gnupg.org/gpgme.html
Source: https://www.gnupg.org/ftp/gcrypt/gpgme/%{name}-%{version}.tar.gz
(defsystem gpgme
:description "GnuPG Made Easy."
:author "g10 Code GmbH"
- :version "1.15.0"
+ :version "1.15.1"
:licence "GPL"
:defsystem-depends-on ("cffi-grovel")
:depends-on ("cffi" "gpg-error" "trivial-garbage")
bool UserID::Signature::operator<(const Signature &other)
{
+ // kept for binary compatibility
+ return static_cast<const UserID::Signature *>(this)->operator<(other);
+}
+
+bool UserID::Signature::operator<(const Signature &other) const
+{
// based on cmp_signodes() in g10/keylist.c
// both signatures must belong to the same user ID
}
/*! Defines a canonical sort order for signatures of the same user ID. */
- bool operator<(const Signature &other);
+ bool operator<(const Signature &other) const;
+
+ GPGMEPP_DEPRECATED bool operator<(const Signature &other);
bool isNull() const
{
data.seek(0, os.SEEK_SET)
pk_result = data.read()
except GPGMEError as e:
- pk_result = e
+ raise e
if len(pk_result) > 0:
result = pk_result
data.seek(0, os.SEEK_SET)
pk_result = data.read()
except GPGMEError as e:
- pk_result = e
+ raise e
if len(pk_result) > 0:
result = pk_result
data.seek(0, os.SEEK_SET)
sk_result = data.read()
except GPGMEError as e:
- sk_result = e
+ raise e
if len(sk_result) > 0:
result = sk_result
#endif
#include "error.h"
+#include "debug.h"
#include <QDebug>
not be performed, but full validity assumed for all keys
without further checks.
*/
- virtual QGPGME_DEPRECATED_EXPORT GpgME::Error start(const std::vector<GpgME::Key> &recipients,
+ virtual GpgME::Error start(const std::vector<GpgME::Key> &recipients,
const QByteArray &plainText, bool alwaysTrust = false) = 0;
/*!
skei->setDupeOk(true);
}
- if (!remark.isNull()) {
+ if (!remark.isEmpty()) {
ctx->addSignatureNotation("rem@gnupg.org", remark.toUtf8().constData());
}
Starts the signing operation. \a signers is the list of keys to
sign \a plainText with. Empty (null) keys are ignored.
*/
- virtual QGPGME_DEPRECATED_EXPORT GpgME::Error start(const std::vector<GpgME::Key> &signers,
+ virtual GpgME::Error start(const std::vector<GpgME::Key> &signers,
const QByteArray &plainText,
GpgME::SignatureMode mode) = 0;
# gpg-error.m4 - autoconf macro to detect libgpg-error.
-# Copyright (C) 2002, 2003, 2004, 2011, 2014, 2018 g10 Code GmbH
+# Copyright (C) 2002, 2003, 2004, 2011, 2014, 2018, 2020 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
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
-# Last-changed: 2018-11-02
+# Last-changed: 2020-11-17
dnl AM_PATH_GPG_ERROR([MINIMUM-VERSION,
dnl since that is consistent with how our three siblings use the directory/
dnl package name in --with-$dir_name-prefix=PFX.
AC_ARG_WITH(libgpg-error-prefix,
- AC_HELP_STRING([--with-libgpg-error-prefix=PFX],
+ AS_HELP_STRING([--with-libgpg-error-prefix=PFX],
[prefix where GPG Error is installed (optional)]),
[gpg_error_config_prefix="$withval"])
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 SPDX-License-Identifier: FSFULLR
+# Last-changed: 2020-11-17
dnl
dnl Common code used for libassuan detection [internal]
AC_DEFUN([_AM_PATH_LIBASSUAN_COMMON],
[ AC_REQUIRE([AC_CANONICAL_HOST])
AC_ARG_WITH(libassuan-prefix,
- AC_HELP_STRING([--with-libassuan-prefix=PFX],
+ AS_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
x86_64-*linux*)
LD="${LD-ld} -m elf_i386"
;;
- ppc64-*linux*|powerpc64-*linux*)
+ powerpc64le-*)
+ LD="${LD-ld} -m elf32lppclinux"
+ ;;
+ powerpc64-*)
LD="${LD-ld} -m elf32ppclinux"
;;
s390x-*linux*)
x86_64-*linux*)
LD="${LD-ld} -m elf_x86_64"
;;
- ppc*-*linux*|powerpc*-*linux*)
+ powerpcle-*)
+ LD="${LD-ld} -m elf64lppc"
+ ;;
+ powerpc-*)
LD="${LD-ld} -m elf64ppc"
;;
s390*-*linux*|s390*-*tpf*)
dynamic_linker=no
;;
+linux*android*)
+ version_type=none # Android doesn't support versioned libraries.
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext'
+ soname_spec='$libname$release$shared_ext'
+ finish_cmds=
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ dynamic_linker='Android linker'
+ # Don't embed -rpath directories since the linker doesn't support them.
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ ;;
+
# This must be glibc/ELF.
linux* | k*bsd*-gnu | kopensolaris*-gnu)
version_type=linux # correct to gnu/linux during the next big refactor
# to write the compiler configuration to `libtool'.
m4_defun([_LT_LANG_GCJ_CONFIG],
[AC_REQUIRE([LT_PROG_GCJ])dnl
-AC_LANG_SAVE
+AC_LANG_PUSH([Java])
# Source file extension for Java test sources.
ac_ext=java
_LT_CONFIG($1)
fi
-AC_LANG_RESTORE
+AC_LANG_POP
GCC=$lt_save_GCC
CC=$lt_save_CC
# to write the compiler configuration to `libtool'.
m4_defun([_LT_LANG_GO_CONFIG],
[AC_REQUIRE([LT_PROG_GO])dnl
-AC_LANG_SAVE
+AC_LANG_PUSH([Go])
# Source file extension for Go test sources.
ac_ext=go
_LT_CONFIG($1)
fi
-AC_LANG_RESTORE
+AC_LANG_POP
GCC=$lt_save_GCC
CC=$lt_save_CC
# to write the compiler configuration to `libtool'.
m4_defun([_LT_LANG_RC_CONFIG],
[AC_REQUIRE([LT_PROG_RC])dnl
-AC_LANG_SAVE
+
+dnl Here, something like AC_LANG_PUSH([RC]) is expected.
+dnl But Resource Compiler is not supported as a language by autoconf
# Source file extension for RC test sources.
ac_ext=rc
_LT_CONFIG($1)
fi
+dnl Here, AC_LANG_POP is expected.
GCC=$lt_save_GCC
-AC_LANG_RESTORE
+dnl Back to C
+AC_LANG([C])
CC=$lt_save_CC
CFLAGS=$lt_save_CFLAGS
])# _LT_LANG_RC_CONFIG
err = add_arg (gpg, "--with-keygrip");
}
+ if (!err && (mode & GPGME_KEYLIST_MODE_SIGS)
+ && have_gpg_version (gpg, "2.0.10"))
+ {
+ err = add_arg (gpg, "--with-sig-check");
+ }
+
if (!err
&& (mode & GPGME_KEYLIST_MODE_SIGS)
&& (mode & GPGME_KEYLIST_MODE_SIG_NOTATIONS))
op_data_t opd;
const char *loc;
+ err = _gpgme_passphrase_status_handler (priv, code, args);
+ if (err)
+ return err;
+
err = _gpgme_op_data_lookup (ctx, OPDATA_EXPORT, &hook, -1, NULL);
opd = hook;
if (err)
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
-# Last-changed: 2018-11-12
+# Last-changed: 2020-11-20
AC_DEFUN([_AM_PATH_GPGME_CONFIG],
[ AC_ARG_WITH(gpgme-prefix,
- AC_HELP_STRING([--with-gpgme-prefix=PFX],
+ AS_HELP_STRING([--with-gpgme-prefix=PFX],
[prefix where GPGME is installed (optional)]),
gpgme_config_prefix="$withval", gpgme_config_prefix="")
if test x"${GPGME_CONFIG}" = x ; then
VALUE "FileDescription", "GPGME - GnuPG Made Easy\0"
VALUE "FileVersion", "@LIBGPGME_LT_CURRENT@.@LIBGPGME_LT_AGE@.@LIBGPGME_LT_REVISION@.@BUILD_REVISION@\0"
VALUE "InternalName", "gpgme\0"
- VALUE "LegalCopyright", "Copyright © 2001-2020 g10 Code GmbH\0"
+ VALUE "LegalCopyright", "Copyright © 2001-2021 g10 Code GmbH\0"
VALUE "LegalTrademarks", "\0"
VALUE "OriginalFilename", "gpgme.dll\0"
VALUE "PrivateBuild", "\0"
c_tests = \
t-encrypt t-encrypt-sym t-encrypt-sign t-sign t-signers \
t-decrypt t-verify t-decrypt-verify t-sig-notation t-export \
- t-import t-edit t-keylist t-keylist-sig t-wait \
+ t-import t-edit t-keylist t-keylist-sig t-keylist-secret-sig t-wait \
t-encrypt-large t-file-name t-gpgconf t-encrypt-mixed \
$(tests_unix)
t-decrypt$(EXEEXT) t-verify$(EXEEXT) t-decrypt-verify$(EXEEXT) \
t-sig-notation$(EXEEXT) t-export$(EXEEXT) t-import$(EXEEXT) \
t-edit$(EXEEXT) t-keylist$(EXEEXT) t-keylist-sig$(EXEEXT) \
- t-wait$(EXEEXT) t-encrypt-large$(EXEEXT) t-file-name$(EXEEXT) \
+ t-keylist-secret-sig$(EXEEXT) t-wait$(EXEEXT) \
+ t-encrypt-large$(EXEEXT) t-file-name$(EXEEXT) \
t-gpgconf$(EXEEXT) t-encrypt-mixed$(EXEEXT) $(am__EXEEXT_1)
@HAVE_W32_SYSTEM_FALSE@am__EXEEXT_3 = t-cancel$(EXEEXT)
am__EXEEXT_4 = t-genkey$(EXEEXT) $(am__EXEEXT_3)
t_keylist_OBJECTS = t-keylist.$(OBJEXT)
t_keylist_LDADD = $(LDADD)
t_keylist_DEPENDENCIES = ../../src/libgpgme.la
+t_keylist_secret_sig_SOURCES = t-keylist-secret-sig.c
+t_keylist_secret_sig_OBJECTS = t-keylist-secret-sig.$(OBJEXT)
+t_keylist_secret_sig_LDADD = $(LDADD)
+t_keylist_secret_sig_DEPENDENCIES = ../../src/libgpgme.la
t_keylist_sig_SOURCES = t-keylist-sig.c
t_keylist_sig_OBJECTS = t-keylist-sig.$(OBJEXT)
t_keylist_sig_LDADD = $(LDADD)
./$(DEPDIR)/t-eventloop.Po ./$(DEPDIR)/t-export.Po \
./$(DEPDIR)/t-file-name.Po ./$(DEPDIR)/t-genkey.Po \
./$(DEPDIR)/t-gpgconf.Po ./$(DEPDIR)/t-import.Po \
+ ./$(DEPDIR)/t-keylist-secret-sig.Po \
./$(DEPDIR)/t-keylist-sig.Po ./$(DEPDIR)/t-keylist.Po \
./$(DEPDIR)/t-sig-notation.Po ./$(DEPDIR)/t-sign.Po \
./$(DEPDIR)/t-signers.Po \
t-encrypt.c t-encrypt-large.c t-encrypt-mixed.c \
t-encrypt-sign.c t-encrypt-sym.c t-eventloop.c t-export.c \
t-file-name.c t-genkey.c t-gpgconf.c t-import.c t-keylist.c \
- t-keylist-sig.c t-sig-notation.c t-sign.c t-signers.c \
- t-thread-keylist.c t-thread-keylist-verify.c t-thread1.c \
- t-verify.c t-wait.c
+ t-keylist-secret-sig.c t-keylist-sig.c t-sig-notation.c \
+ t-sign.c t-signers.c t-thread-keylist.c \
+ t-thread-keylist-verify.c t-thread1.c t-verify.c t-wait.c
DIST_SOURCES = t-cancel.c t-decrypt.c t-decrypt-verify.c t-edit.c \
t-encrypt.c t-encrypt-large.c t-encrypt-mixed.c \
t-encrypt-sign.c t-encrypt-sym.c t-eventloop.c t-export.c \
t-file-name.c t-genkey.c t-gpgconf.c t-import.c t-keylist.c \
- t-keylist-sig.c t-sig-notation.c t-sign.c t-signers.c \
- t-thread-keylist.c t-thread-keylist-verify.c t-thread1.c \
- t-verify.c t-wait.c
+ t-keylist-secret-sig.c t-keylist-sig.c t-sig-notation.c \
+ t-sign.c t-signers.c t-thread-keylist.c \
+ t-thread-keylist-verify.c t-thread1.c t-verify.c t-wait.c
am__can_run_installinfo = \
case $$AM_UPDATE_INFO_DIR in \
n|no|NO) false;; \
c_tests = \
t-encrypt t-encrypt-sym t-encrypt-sign t-sign t-signers \
t-decrypt t-verify t-decrypt-verify t-sig-notation t-export \
- t-import t-edit t-keylist t-keylist-sig t-wait \
+ t-import t-edit t-keylist t-keylist-sig t-keylist-secret-sig t-wait \
t-encrypt-large t-file-name t-gpgconf t-encrypt-mixed \
$(tests_unix)
@rm -f t-keylist$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(t_keylist_OBJECTS) $(t_keylist_LDADD) $(LIBS)
+t-keylist-secret-sig$(EXEEXT): $(t_keylist_secret_sig_OBJECTS) $(t_keylist_secret_sig_DEPENDENCIES) $(EXTRA_t_keylist_secret_sig_DEPENDENCIES)
+ @rm -f t-keylist-secret-sig$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(t_keylist_secret_sig_OBJECTS) $(t_keylist_secret_sig_LDADD) $(LIBS)
+
t-keylist-sig$(EXEEXT): $(t_keylist_sig_OBJECTS) $(t_keylist_sig_DEPENDENCIES) $(EXTRA_t_keylist_sig_DEPENDENCIES)
@rm -f t-keylist-sig$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(t_keylist_sig_OBJECTS) $(t_keylist_sig_LDADD) $(LIBS)
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-genkey.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-gpgconf.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-import.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-keylist-secret-sig.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-keylist-sig.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-keylist.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-sig-notation.Po@am__quote@ # am--include-marker
-rm -f ./$(DEPDIR)/t-genkey.Po
-rm -f ./$(DEPDIR)/t-gpgconf.Po
-rm -f ./$(DEPDIR)/t-import.Po
+ -rm -f ./$(DEPDIR)/t-keylist-secret-sig.Po
-rm -f ./$(DEPDIR)/t-keylist-sig.Po
-rm -f ./$(DEPDIR)/t-keylist.Po
-rm -f ./$(DEPDIR)/t-sig-notation.Po
-rm -f ./$(DEPDIR)/t-genkey.Po
-rm -f ./$(DEPDIR)/t-gpgconf.Po
-rm -f ./$(DEPDIR)/t-import.Po
+ -rm -f ./$(DEPDIR)/t-keylist-secret-sig.Po
-rm -f ./$(DEPDIR)/t-keylist-sig.Po
-rm -f ./$(DEPDIR)/t-keylist.Po
-rm -f ./$(DEPDIR)/t-sig-notation.Po
--- /dev/null
+/* t-keylist-secret-sig.c - Regression test.
+ * Copyright (C) 2000 Werner Koch (dd9jn)
+ * Copyright (C) 2001, 2003, 2004 g10 Code GmbH
+ *
+ * This file is part of GPGME.
+ *
+ * GPGME 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.
+ *
+ * GPGME is distributed in the hope that 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, see <https://gnu.org/licenses/>.
+ * SPDX-License-Identifier: LGPL-2.1-or-later
+ */
+
+/* We need to include config.h so that we know whether we are building
+ with large file system (LFS) support. */
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <gpgme.h>
+
+#include "t-support.h"
+
+\f
+struct
+{
+ const char *fpr;
+ const char *sec_keyid;
+ struct
+ {
+ const char *name;
+ const char *comment;
+ const char *email;
+ struct
+ {
+ gpgme_pubkey_algo_t algo;
+ const char *keyid;
+ const char *name;
+ const char *comment;
+ const char *email;
+ unsigned int sig_class;
+ int exportable;
+ } sig;
+ } uid[3];
+}
+keys[] =
+ {
+ { "A0FF4590BB6122EDEF6E3C542D727CC768697734", "6AE6D7EE46A871F8",
+ { { "Alfa Test", "demo key", "alfa@example.net",
+ { GPGME_PK_DSA, "2D727CC768697734",
+ "Alfa Test", "demo key", "alfa@example.net", 19, 1 } },
+ { "Alpha Test", "demo key", "alpha@example.net",
+ { GPGME_PK_DSA, "2D727CC768697734",
+ "Alfa Test", "demo key", "alfa@example.net", 19, 1 } },
+ { "Alice", "demo key", NULL,
+ { GPGME_PK_DSA, "2D727CC768697734",
+ "Alfa Test", "demo key", "alfa@example.net", 19, 1 } } } },
+ { NULL }
+ };
+
+
+int
+main (void)
+{
+ gpgme_error_t err;
+ gpgme_ctx_t ctx;
+ gpgme_key_t key;
+ gpgme_keylist_result_t result;
+ int mode;
+ int i = 0;
+
+ init_gpgme (GPGME_PROTOCOL_OpenPGP);
+
+ err = gpgme_new (&ctx);
+ fail_if_err (err);
+
+ mode = gpgme_get_keylist_mode (ctx);
+ mode |= GPGME_KEYLIST_MODE_SIGS;
+ err = gpgme_set_keylist_mode (ctx, mode);
+ fail_if_err (err);
+
+ err = gpgme_op_keylist_start (ctx, "Alpha", 1);
+ fail_if_err (err);
+
+ while (!(err = gpgme_op_keylist_next (ctx, &key)))
+ {
+ if (!keys[i].fpr)
+ {
+ fprintf (stderr, "More keys returned than expected\n");
+ exit (1);
+ }
+
+ /* Global key flags. */
+ if (key->revoked)
+ {
+ fprintf (stderr, "Key unexpectedly revoked\n");
+ exit (1);
+ }
+ if (key->expired)
+ {
+ fprintf (stderr, "Key unexpectedly expired\n");
+ exit (1);
+ }
+ if (key->disabled)
+ {
+ fprintf (stderr, "Key unexpectedly disabled\n");
+ exit (1);
+ }
+ if (key->invalid)
+ {
+ fprintf (stderr, "Key unexpectedly invalid\n");
+ exit (1);
+ }
+ if (!key->can_encrypt)
+ {
+ fprintf (stderr, "Key unexpectedly unusable for encryption\n");
+ exit (1);
+ }
+ if (!key->can_sign)
+ {
+ fprintf (stderr, "Key unexpectedly unusable for signing\n");
+ exit (1);
+ }
+ if (!key->can_certify)
+ {
+ fprintf (stderr, "Key unexpectedly unusable for certifications\n");
+ exit (1);
+ }
+ if (!key->secret)
+ {
+ fprintf (stderr, "Key unexpectedly not secret\n");
+ exit (1);
+ }
+ if (key->protocol != GPGME_PROTOCOL_OpenPGP)
+ {
+ fprintf (stderr, "Key has unexpected protocol: %s\n",
+ gpgme_get_protocol_name (key->protocol));
+ exit (1);
+ }
+ if (key->issuer_serial)
+ {
+ fprintf (stderr, "Key unexpectedly carries issuer serial: %s\n",
+ key->issuer_serial);
+ exit (1);
+ }
+ if (key->issuer_name)
+ {
+ fprintf (stderr, "Key unexpectedly carries issuer name: %s\n",
+ key->issuer_name);
+ exit (1);
+ }
+ if (key->chain_id)
+ {
+ fprintf (stderr, "Key unexpectedly carries chain ID: %s\n",
+ key->chain_id);
+ exit (1);
+ }
+ if (key->owner_trust != GPGME_VALIDITY_UNKNOWN)
+ {
+ fprintf (stderr, "Key has unexpected owner trust: %i\n",
+ key->owner_trust);
+ exit (1);
+ }
+ if (!key->subkeys || !key->subkeys->next || key->subkeys->next->next)
+ {
+ fprintf (stderr, "Key has unexpected number of subkeys\n");
+ exit (1);
+ }
+
+ /* Primary key. */
+ if (key->subkeys->revoked)
+ {
+ fprintf (stderr, "Primary key unexpectedly revoked\n");
+ exit (1);
+ }
+ if (key->subkeys->expired)
+ {
+ fprintf (stderr, "Primary key unexpectedly expired\n");
+ exit (1);
+ }
+ if (key->subkeys->disabled)
+ {
+ fprintf (stderr, "Primary key unexpectedly disabled\n");
+ exit (1);
+ }
+ if (key->subkeys->invalid)
+ {
+ fprintf (stderr, "Primary key unexpectedly invalid\n");
+ exit (1);
+ }
+ if (key->subkeys->can_encrypt)
+ {
+ fprintf (stderr, "Primary key unexpectedly usable for encryption\n");
+ exit (1);
+ }
+ if (!key->subkeys->can_sign)
+ {
+ fprintf (stderr, "Primary key unexpectedly unusable for signing\n");
+ exit (1);
+ }
+ if (!key->subkeys->can_certify)
+ {
+ fprintf (stderr, "Primary key unexpectedly unusable for certifications\n");
+ exit (1);
+ }
+ if (!key->subkeys->secret)
+ {
+ fprintf (stderr, "Primary key unexpectedly not secret\n");
+ exit (1);
+ }
+ if (key->subkeys->pubkey_algo != GPGME_PK_DSA)
+ {
+ fprintf (stderr, "Primary key has unexpected public key algo: %s\n",
+ gpgme_pubkey_algo_name (key->subkeys->pubkey_algo));
+ exit (1);
+ }
+ if (key->subkeys->length != 1024)
+ {
+ fprintf (stderr, "Primary key has unexpected length: %i\n",
+ key->subkeys->length);
+ exit (1);
+ }
+ if (strcmp (key->subkeys->keyid, &keys[i].fpr[40 - 16]))
+ {
+ fprintf (stderr, "Primary key has unexpected key ID: %s\n",
+ key->subkeys->keyid);
+ exit (1);
+ }
+ if (strcmp (key->subkeys->fpr, keys[i].fpr))
+ {
+ fprintf (stderr, "Primary key has unexpected fingerprint: %s\n",
+ key->subkeys->fpr);
+ exit (1);
+ }
+ if (key->subkeys->expires)
+ {
+ fprintf (stderr, "Primary key unexpectedly expires: %lu\n",
+ key->subkeys->expires);
+ exit (1);
+ }
+
+ /* Secondary key. */
+ if (key->subkeys->next->revoked)
+ {
+ fprintf (stderr, "Secondary key unexpectedly revoked\n");
+ exit (1);
+ }
+ if (key->subkeys->next->expired)
+ {
+ fprintf (stderr, "Secondary key unexpectedly expired\n");
+ exit (1);
+ }
+ if (key->subkeys->next->disabled)
+ {
+ fprintf (stderr, "Secondary key unexpectedly disabled\n");
+ exit (1);
+ }
+ if (key->subkeys->next->invalid)
+ {
+ fprintf (stderr, "Secondary key unexpectedly invalid\n");
+ exit (1);
+ }
+ if (!key->subkeys->next->can_encrypt)
+ {
+ fprintf (stderr, "Secondary key unexpectedly unusable for encryption\n");
+ exit (1);
+ }
+ if (key->subkeys->next->can_sign)
+ {
+ fprintf (stderr, "Secondary key unexpectedly usable for signing\n");
+ exit (1);
+ }
+ if (key->subkeys->next->can_certify)
+ {
+ fprintf (stderr, "Secondary key unexpectedly usable for certifications\n");
+ exit (1);
+ }
+ if (!key->subkeys->next->secret)
+ {
+ fprintf (stderr, "Secondary key unexpectedly not secret\n");
+ exit (1);
+ }
+ if (key->subkeys->next->pubkey_algo != GPGME_PK_ELG_E)
+ {
+ fprintf (stderr, "Secondary key has unexpected public key algo: %s\n",
+ gpgme_pubkey_algo_name (key->subkeys->next->pubkey_algo));
+ exit (1);
+ }
+ if (key->subkeys->next->length != 1024)
+ {
+ fprintf (stderr, "Secondary key has unexpected length: %i\n",
+ key->subkeys->next->length);
+ exit (1);
+ }
+ if (strcmp (key->subkeys->next->keyid, keys[i].sec_keyid))
+ {
+ fprintf (stderr, "Secondary key has unexpected key ID: %s\n",
+ key->subkeys->next->keyid);
+ exit (1);
+ }
+ if (!key->subkeys->next->fpr)
+ {
+ fprintf (stderr, "Secondary key has unexpectedly no fingerprint\n");
+ exit (1);
+ }
+ if (key->subkeys->next->expires)
+ {
+ fprintf (stderr, "Secondary key unexpectedly expires: %lu\n",
+ key->subkeys->next->expires);
+ exit (1);
+ }
+
+ /* FIXME: The below test will crash if we want to check for a
+ name, comment or email that doesn't exist in the key's user
+ IDs. */
+ if (!((!keys[i].uid[0].name && !key->uids)
+ || (keys[i].uid[0].name && !keys[i].uid[1].name
+ && key->uids && !key->uids->next)
+ || (keys[i].uid[0].name && keys[i].uid[1].name
+ && !keys[i].uid[2].name
+ && key->uids && key->uids->next && !key->uids->next->next)
+ || (keys[i].uid[0].name && keys[i].uid[1].name
+ && keys[i].uid[2].name
+ && key->uids && key->uids->next && key->uids->next->next
+ && !key->uids->next->next->next)))
+ {
+ fprintf (stderr, "Key has unexpected number of user IDs\n");
+ exit (1);
+ }
+ if (key->uids && key->uids->revoked)
+ {
+ fprintf (stderr, "First user ID unexpectedly revoked\n");
+ exit (1);
+ }
+ if (key->uids && key->uids->invalid)
+ {
+ fprintf (stderr, "First user ID unexpectedly invalid\n");
+ exit (1);
+ }
+ if (key->uids && key->uids->validity != GPGME_VALIDITY_UNKNOWN)
+ {
+ fprintf (stderr, "First user ID has unexpectedly validity: %i\n",
+ key->uids->validity);
+ exit (1);
+ }
+ if (keys[i].uid[0].name
+ && strcmp (keys[i].uid[0].name, key->uids->name))
+ {
+ fprintf (stderr, "Unexpected name in first user ID: %s\n",
+ key->uids->name);
+ exit (1);
+ }
+ if (keys[i].uid[0].comment
+ && strcmp (keys[i].uid[0].comment, key->uids->comment))
+ {
+ fprintf (stderr, "Unexpected comment in first user ID: %s\n",
+ key->uids->comment);
+ exit (1);
+ }
+ if (keys[i].uid[0].email
+ && strcmp (keys[i].uid[0].email, key->uids->email))
+ {
+ fprintf (stderr, "Unexpected email in first user ID: %s\n",
+ key->uids->email);
+ exit (1);
+ }
+ if (key->uids && (!key->uids->signatures || key->uids->signatures->next))
+ {
+ fprintf (stderr, "First user ID unexpected number of signatures\n");
+ exit (1);
+ }
+ if (keys[i].uid[0].sig.algo != key->uids->signatures->pubkey_algo)
+ {
+ fprintf (stderr, "Unexpected algorithm in first user ID sig: %s\n",
+ gpgme_pubkey_algo_name (key->uids->signatures->pubkey_algo));
+ exit (1);
+ }
+ if (strcmp (keys[i].uid[0].sig.keyid, key->uids->signatures->keyid))
+ {
+ fprintf (stderr, "Unexpected key ID in first user ID sig: %s\n",
+ key->uids->signatures->keyid);
+ exit (1);
+ }
+ if (strcmp (keys[i].uid[0].sig.name, key->uids->signatures->name))
+ {
+ fprintf (stderr, "Unexpected name in first user ID sig: %s\n",
+ key->uids->signatures->name);
+ exit (1);
+ }
+ if (strcmp (keys[i].uid[0].sig.comment, key->uids->signatures->comment))
+ {
+ fprintf (stderr, "Unexpected comment in first user ID sig: %s\n",
+ key->uids->signatures->comment);
+ exit (1);
+ }
+ if (strcmp (keys[i].uid[0].sig.email, key->uids->signatures->email))
+ {
+ fprintf (stderr, "Unexpected email in first user ID sig: %s\n",
+ key->uids->signatures->email);
+ exit (1);
+ }
+ if (keys[i].uid[0].sig.sig_class != key->uids->signatures->sig_class)
+ {
+ fprintf (stderr, "Unexpected class in first user ID sig: %i\n",
+ key->uids->signatures->sig_class);
+ exit (1);
+ }
+ if (keys[i].uid[0].sig.exportable != key->uids->signatures->exportable)
+ {
+ fprintf (stderr, "Unexpected exportable stat in first user ID sig: %i\n",
+ key->uids->signatures->exportable);
+ exit (1);
+ }
+
+ if (key->uids && key->uids->next && key->uids->next->revoked)
+ {
+ fprintf (stderr, "Second user ID unexpectedly revoked\n");
+ exit (1);
+ }
+ if (key->uids && key->uids->next && key->uids->next->invalid)
+ {
+ fprintf (stderr, "Second user ID unexpectedly invalid\n");
+ exit (1);
+ }
+ if (key->uids && key->uids->next
+ && key->uids->next->validity != GPGME_VALIDITY_UNKNOWN)
+ {
+ fprintf (stderr, "Second user ID has unexpectedly validity: %i\n",
+ key->uids->next->validity);
+ exit (1);
+ }
+ if (keys[i].uid[1].name
+ && strcmp (keys[i].uid[1].name, key->uids->next->name))
+ {
+ fprintf (stderr, "Unexpected name in second user ID: %s\n",
+ key->uids->next->name);
+ exit (1);
+ }
+ if (keys[i].uid[1].comment
+ && strcmp (keys[i].uid[1].comment, key->uids->next->comment))
+ {
+ fprintf (stderr, "Unexpected comment in second user ID: %s\n",
+ key->uids->next->comment);
+ exit (1);
+ }
+ if (keys[i].uid[1].email
+ && strcmp (keys[i].uid[1].email, key->uids->next->email))
+ {
+ fprintf (stderr, "Unexpected email in second user ID: %s\n",
+ key->uids->next->email);
+ exit (1);
+ }
+ /* Note: There is a bug in gpg 1.3.4 which duplicates a
+ signature after importing the secret key. Thus we disable
+ the second part of the check. */
+ if (key->uids && (!key->uids->next->signatures /*|| key->uids->next->signatures->next*/))
+ {
+ fprintf (stderr, "Second user ID unexpected number of signatures\n");
+ exit (1);
+ }
+ if (keys[i].uid[1].sig.algo != key->uids->next->signatures->pubkey_algo)
+ {
+ fprintf (stderr, "Unexpected algorithm in second user ID sig: %s\n",
+ gpgme_pubkey_algo_name (key->uids->next->signatures->pubkey_algo));
+ exit (1);
+ }
+ if (strcmp (keys[i].uid[1].sig.keyid, key->uids->next->signatures->keyid))
+ {
+ fprintf (stderr, "Unexpected key ID in second user ID sig: %s\n",
+ key->uids->next->signatures->keyid);
+ exit (1);
+ }
+ if (strcmp (keys[i].uid[1].sig.name, key->uids->next->signatures->name))
+ {
+ fprintf (stderr, "Unexpected name in second user ID sig: %s\n",
+ key->uids->next->signatures->name);
+ exit (1);
+ }
+ if (strcmp (keys[i].uid[1].sig.comment, key->uids->next->signatures->comment))
+ {
+ fprintf (stderr, "Unexpected comment in second user ID sig: %s\n",
+ key->uids->next->signatures->comment);
+ exit (1);
+ }
+ if (strcmp (keys[i].uid[1].sig.email, key->uids->next->signatures->email))
+ {
+ fprintf (stderr, "Unexpected email in second user ID sig: %s\n",
+ key->uids->next->signatures->email);
+ exit (1);
+ }
+ if (keys[i].uid[1].sig.sig_class != key->uids->next->signatures->sig_class)
+ {
+ fprintf (stderr, "Unexpected class in second user ID sig: %i\n",
+ key->uids->next->signatures->sig_class);
+ exit (1);
+ }
+ if (keys[i].uid[1].sig.exportable != key->uids->next->signatures->exportable)
+ {
+ fprintf (stderr, "Unexpected exportable stat in second user ID sig: %i\n",
+ key->uids->next->signatures->exportable);
+ exit (1);
+ }
+
+ if (key->uids && key->uids->next && key->uids->next->next
+ && key->uids->next->next->revoked)
+ {
+ fprintf (stderr, "Third user ID unexpectedly revoked\n");
+ exit (1);
+ }
+ if (key->uids && key->uids->next && key->uids->next->next
+ && key->uids->next->next->invalid)
+ {
+ fprintf (stderr, "Third user ID unexpectedly invalid\n");
+ exit (1);
+ }
+ if (key->uids && key->uids->next && key->uids->next->next
+ && key->uids->next->next->validity != GPGME_VALIDITY_UNKNOWN)
+ {
+ fprintf (stderr, "Third user ID has unexpectedly validity: %i\n",
+ key->uids->next->next->validity);
+ exit (1);
+ }
+ if (keys[i].uid[2].name
+ && strcmp (keys[i].uid[2].name, key->uids->next->next->name))
+ {
+ fprintf (stderr, "Unexpected name in third user ID: %s\n",
+ key->uids->next->next->name);
+ exit (1);
+ }
+ if (keys[i].uid[2].comment
+ && strcmp (keys[i].uid[2].comment, key->uids->next->next->comment))
+ {
+ fprintf (stderr, "Unexpected comment in third user ID: %s\n",
+ key->uids->next->next->comment);
+ exit (1);
+ }
+ if (keys[i].uid[2].email
+ && strcmp (keys[i].uid[2].email, key->uids->next->next->email))
+ {
+ fprintf (stderr, "Unexpected email in third user ID: %s\n",
+ key->uids->next->next->email);
+ exit (1);
+ }
+ if (key->uids && (!key->uids->next->next->signatures
+ || key->uids->next->next->signatures->next))
+ {
+ fprintf (stderr, "Third user ID unexpected number of signatures\n");
+ exit (1);
+ }
+ if (keys[i].uid[2].sig.algo != key->uids->next->next->signatures->pubkey_algo)
+ {
+ fprintf (stderr, "Unexpected algorithm in third user ID sig: %s\n",
+ gpgme_pubkey_algo_name (key->uids->next->next->signatures->pubkey_algo));
+ exit (1);
+ }
+ if (strcmp (keys[i].uid[2].sig.keyid, key->uids->next->next->signatures->keyid))
+ {
+ fprintf (stderr, "Unexpected key ID in third user ID sig: %s\n",
+ key->uids->next->next->signatures->keyid);
+ exit (1);
+ }
+ if (strcmp (keys[i].uid[2].sig.name, key->uids->next->next->signatures->name))
+ {
+ fprintf (stderr, "Unexpected name in third user ID sig: %s\n",
+ key->uids->next->next->signatures->name);
+ exit (1);
+ }
+ if (strcmp (keys[i].uid[2].sig.comment, key->uids->next->next->signatures->comment))
+ {
+ fprintf (stderr, "Unexpected comment in third user ID sig: %s\n",
+ key->uids->next->next->signatures->comment);
+ exit (1);
+ }
+ if (strcmp (keys[i].uid[2].sig.email, key->uids->next->next->signatures->email))
+ {
+ fprintf (stderr, "Unexpected email in third user ID sig: %s\n",
+ key->uids->next->next->signatures->email);
+ exit (1);
+ }
+ if (keys[i].uid[2].sig.sig_class != key->uids->next->next->signatures->sig_class)
+ {
+ fprintf (stderr, "Unexpected class in third user ID sig: %i\n",
+ key->uids->next->next->signatures->sig_class);
+ exit (1);
+ }
+ if (keys[i].uid[2].sig.exportable != key->uids->next->next->signatures->exportable)
+ {
+ fprintf (stderr, "Unexpected exportable stat in third user ID sig: %i\n",
+ key->uids->next->next->signatures->exportable);
+ exit (1);
+ }
+
+ gpgme_key_unref (key);
+ i++;
+ }
+ if (gpgme_err_code (err) != GPG_ERR_EOF)
+ fail_if_err (err);
+ err = gpgme_op_keylist_end (ctx);
+ fail_if_err (err);
+
+ result = gpgme_op_keylist_result (ctx);
+ if (result->truncated)
+ {
+ fprintf (stderr, "Key listing unexpectedly truncated\n");
+ exit (1);
+ }
+
+ if (keys[i].fpr)
+ {
+ fprintf (stderr, "Less keys returned than expected\n");
+ exit (1);
+ }
+
+ gpgme_release (ctx);
+ return 0;
+}