Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package gpgme for openSUSE:Factory checked 
in at 2026-09-04 12:36:31
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/gpgme (Old)
 and      /work/SRC/openSUSE:Factory/.gpgme.new.1265 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "gpgme"

Fri Sep  4 12:36:31 2026 rev:121 rq:1375527 version:2.2.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/gpgme/gpgme.changes      2026-07-08 
17:35:38.283582556 +0200
+++ /work/SRC/openSUSE:Factory/.gpgme.new.1265/gpgme.changes    2026-09-04 
12:37:20.405114687 +0200
@@ -1,0 +2,10 @@
+Thu Sep  3 05:56:18 UTC 2026 - Andreas Stieger <[email protected]>
+
+- Update to 2.2.0:
+  * gpgme_verify_result_t now provides issuer serial number and
+    issuer name for S/MIME certificates used for signing that are
+    not included in a signature
+  * Handle the new SIGINFO status line
+  * Ignore TRUST_ status lines if no NEWSIG was seen
+
+-------------------------------------------------------------------

Old:
----
  gpgme-2.1.2.tar.bz2
  gpgme-2.1.2.tar.bz2.sig

New:
----
  gpgme-2.2.0.tar.bz2
  gpgme-2.2.0.tar.bz2.sig

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ gpgme.spec ++++++
--- /var/tmp/diff_new_pack.EUT8mK/_old  2026-09-04 12:37:21.278145339 +0200
+++ /var/tmp/diff_new_pack.EUT8mK/_new  2026-09-04 12:37:21.280145409 +0200
@@ -19,7 +19,7 @@
 
 %define sover 45
 Name:           gpgme
-Version:        2.1.2
+Version:        2.2.0
 Release:        0
 Summary:        Programmatic library interface to GnuPG
 License:        GPL-3.0-or-later AND LGPL-2.1-or-later

++++++ gpgme-2.1.2.tar.bz2 -> gpgme-2.2.0.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gpgme-2.1.2/ChangeLog new/gpgme-2.2.0/ChangeLog
--- old/gpgme-2.1.2/ChangeLog   2026-06-30 11:59:01.000000000 +0200
+++ new/gpgme-2.2.0/ChangeLog   2026-08-31 14:53:45.000000000 +0200
@@ -1,3 +1,75 @@
+2026-08-31  Werner Koch  <[email protected]>
+
+       Release 2.2.0.
+       + commit 5c2e9553adda72753d7edc4d755814689968f88e
+
+
+2026-08-05  Ingo Klöcker  <[email protected]>
+
+       tests: Add test to check issuer serial number and issuer name.
+       + commit ecffd0c9a7ec00a156443d6d8d253da09c0cf23b
+       * tests/gpgsm/Makefile.am (LDADD): Add @GPG_ERROR_LIBS@.
+       * tests/gpgsm/t-support.h (_test, test, safe_strcmp, nonnull,
+       have_gpgsm_version): New.
+       * tests/gpgsm/cms-decrypt.c (nonnull): Remove.
+       * tests/gpgsm/cms-keylist.c (nonnull): Remove.
+       * tests/gpgsm/t-verify.c (test_opaque_without_cert): New.
+       (check_result): Add arguments issuer_serial, issuer_name. Use
+       safe_strcmp to compare fpr. Check issuer_serial and issuer_name.
+       (main): Add expected issuer serial and issuer name to existing
+       check_result calls. Add test to check S/MIME signature without embedded
+       signing certificate.
+
+       Fix handling of missing timestamp in SIGINFO status.
+       + commit 8dc1de3acb86375830e7034cab419030bdf1d36b
+       * src/verify.c (parse_sig_info): Add argument protocol. Check for "-"
+       if protocol is CMS.
+       (_gpgme_verify_status_handler): Pass protocol to parse_sig_info.
+
+       * tests/gpg/t-verify.c (check_result): Add argument timestamp. Check
+       timestamp.
+       (main): Add expected timestamp to all check_result calls.
+       * tests/gpgsm/t-verify.c (check_result): Add argument timestamp. Check
+       timestamp.
+       (main): Add expected timestamp to all check_result calls.
+
+2026-08-03  Ingo Klöcker  <[email protected]>
+
+       Provide serial number and issuer of unknown S/MIME signing certificates.
+       + commit 7ba3ef8e40518ec109b6e0551ac3cc076c95b53f
+       * src/gpgme.h.in (_gpgme_signature): Add fields issuer_serial and
+       issuer_name.
+       * src/verify.c (release_op_data): Free new fields.
+       (parse_no_pubkey): New.
+       (_gpgme_verify_status_handler): Handle NO_PUBKEY status code.
+
+       * tests/run-verify.c (print_result): Print issuer_serial and
+       issuer_name.
+
+       Add helper to decode percent-plus encoded strings.
+       + commit 667ced56862ec5d50dd17e98aa26155cc2330ac3
+       * src/conversion.c (do_decode_percent_or_percent_plus): New.
+       (_gpgme_decode_percent_string): Move its code to new file-static
+       do_decode_percent_or_percent_plus and call it with disabled decoding of
+       '+'.
+       * src/conversion.c, src/util.h (_gpgme_decode_percent_plus_string): New.
+
+2026-07-30  Ingo Klöcker  <[email protected]>
+
+       Handle new SIGINFO status line.
+       + commit 31eb884e8f102ed3cf1220ccdd77e6e1931a9a7b
+       * src/gpgme.h.in (gpgme_status_code_t): Add status code for SIGINFO.
+       * src/status-table.c (status_table): Add "SIGINFO".
+       * src/verify.c (parse_sig_info): New.
+       (_gpgme_verify_status_handler): Handle SIGINFO status line.
+
+2026-07-09  Ingo Klöcker  <[email protected]>
+
+       Ignore TRUST_ status lines if no NEWSIG was seen.
+       + commit 4cb1906c1c47ce2c8b7180bc31ffdb1af4b5ffe8
+       * src/verify.c (_gpgme_verify_status_handler): Don't return error if
+       TRUST_* status line is seen before NEWSIG status line has been seen.
+
 2026-06-30  Werner Koch  <[email protected]>
 
        Release 2.1.2.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gpgme-2.1.2/NEWS new/gpgme-2.2.0/NEWS
--- old/gpgme-2.1.2/NEWS        2026-06-30 11:56:33.000000000 +0200
+++ new/gpgme-2.2.0/NEWS        2026-08-31 14:44:43.000000000 +0200
@@ -1,3 +1,26 @@
+Noteworthy changes in version 2.2.0 (2026-08-31)   [C47/A2/R0]
+------------------------------------------------
+
+ * gpgme_verify_result_t now provides issuer serial number and issuer name
+   for S/MIME certificates used for signing that are not included in a
+   signature.  [T8369]
+
+ * Handle the new SIGINFO status line.  [T8368]
+
+ * Ignore TRUST_ status lines if no NEWSIG was seen.  [T8333]
+
+ * Interface changes relative to the 2.1.2 release:
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ gpgme_signature_t             EXT: New fields "issuer_serial",
+                                    "issuer_name".
+ GPGME_STATUS_SIGINFO          NEW: Note that the use of stati codes
+                                    is deprecated.  Please switch to
+                                    gpgme_op_interact.
+
+
+ Release-info: https://dev.gnupg.org/T8311
+
+
 Noteworthy changes in version 2.1.2 (2026-06-30)   [C46/A1/R2]
 ------------------------------------------------
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gpgme-2.1.2/VERSION new/gpgme-2.2.0/VERSION
--- old/gpgme-2.1.2/VERSION     2026-06-30 11:58:52.000000000 +0200
+++ new/gpgme-2.2.0/VERSION     2026-08-31 14:53:35.000000000 +0200
@@ -1,2 +1,2 @@
-2.1.2
-34eaa0a69c120cd1d19365c6b24c58e98cd29cdf
+2.2.0
+5c2e9553adda72753d7edc4d755814689968f88e
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gpgme-2.1.2/configure new/gpgme-2.2.0/configure
--- old/gpgme-2.1.2/configure   2026-06-30 11:58:52.000000000 +0200
+++ new/gpgme-2.2.0/configure   2026-08-31 14:53:35.000000000 +0200
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.71 for gpgme 2.1.2.
+# Generated by GNU Autoconf 2.71 for gpgme 2.2.0.
 #
 # Report bugs to <https://bugs.gnupg.org>.
 #
@@ -621,8 +621,8 @@
 # Identity of this package.
 PACKAGE_NAME='gpgme'
 PACKAGE_TARNAME='gpgme'
-PACKAGE_VERSION='2.1.2'
-PACKAGE_STRING='gpgme 2.1.2'
+PACKAGE_VERSION='2.2.0'
+PACKAGE_STRING='gpgme 2.2.0'
 PACKAGE_BUGREPORT='https://bugs.gnupg.org'
 PACKAGE_URL=''
 
@@ -1453,7 +1453,7 @@
   # 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 2.1.2 to adapt to many kinds of systems.
+\`configure' configures gpgme 2.2.0 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1524,7 +1524,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of gpgme 2.1.2:";;
+     short | recursive ) echo "Configuration of gpgme 2.2.0:";;
    esac
   cat <<\_ACEOF
 
@@ -1666,7 +1666,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-gpgme configure 2.1.2
+gpgme configure 2.2.0
 generated by GNU Autoconf 2.71
 
 Copyright (C) 2021 Free Software Foundation, Inc.
@@ -2323,7 +2323,7 @@
 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 2.1.2, which was
+It was created by gpgme $as_me 2.2.0, which was
 generated by GNU Autoconf 2.71.  Invocation command line was
 
   $ $0$ac_configure_args_raw
@@ -3093,9 +3093,9 @@
 #   (Interfaces added:                 AGE++)
 #   (Interfaces removed:               AGE=0)
 #
-LIBGPGME_LT_CURRENT=46
-LIBGPGME_LT_AGE=1
-LIBGPGME_LT_REVISION=2
+LIBGPGME_LT_CURRENT=47
+LIBGPGME_LT_AGE=2
+LIBGPGME_LT_REVISION=0
 ################################################
 
 
@@ -3112,8 +3112,8 @@
 
 
 VERSION_MAJOR=2
-VERSION_MINOR=1
-VERSION_MICRO=2
+VERSION_MINOR=2
+VERSION_MICRO=0
 
 
 
@@ -3634,7 +3634,7 @@
 
 # Define the identity of the package.
  PACKAGE='gpgme'
- VERSION='2.1.2'
+ VERSION='2.2.0'
 
 
 printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h
@@ -6501,7 +6501,7 @@
 
 
 
-VERSION_NUMBER=0x020102
+VERSION_NUMBER=0x020200
 
 
 # We need to compile and run a program on the build machine.  A
@@ -15650,8 +15650,8 @@
 #
 # Provide information about the build.
 #
-BUILD_REVISION="34eaa0a6"
-BUILD_COMMITID="34eaa0a69c120cd1d19365c6b24c58e98cd29cdf"
+BUILD_REVISION="5c2e9553"
+BUILD_COMMITID="5c2e9553adda72753d7edc4d755814689968f88e"
 
 
 printf "%s\n" "#define BUILD_REVISION \"$BUILD_REVISION\"" >>confdefs.h
@@ -15661,7 +15661,7 @@
 
 
 BUILD_VERSION=`echo "$PACKAGE_VERSION" | sed 's/\([0-9.]*\).*/\1./'`
-BUILD_VERSION="${BUILD_VERSION}13546"
+BUILD_VERSION="${BUILD_VERSION}23598"
 BUILD_FILEVERSION=`echo "${BUILD_VERSION}" | tr . ,`
 
 
@@ -18206,7 +18206,7 @@
 # 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 2.1.2, which was
+This file was extended by gpgme $as_me 2.2.0, which was
 generated by GNU Autoconf 2.71.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -18274,7 +18274,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config='$ac_cs_config_escaped'
 ac_cs_version="\\
-gpgme config.status 2.1.2
+gpgme config.status 2.2.0
 configured by $0, generated by GNU Autoconf 2.71,
   with options \\"\$ac_cs_config\\"
 
@@ -20229,7 +20229,7 @@
 echo "
         GPGME v${VERSION} has been configured as follows:
 
-        Revision:          34eaa0a6  (13546)
+        Revision:          5c2e9553  (23598)
         Platform:          $host
 
         UI Server:         $uiserver
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gpgme-2.1.2/configure.ac new/gpgme-2.2.0/configure.ac
--- old/gpgme-2.1.2/configure.ac        2026-06-30 11:56:43.000000000 +0200
+++ new/gpgme-2.2.0/configure.ac        2026-08-31 14:44:27.000000000 +0200
@@ -31,8 +31,8 @@
 # for the LT versions.
 m4_define([mym4_package],[gpgme])
 m4_define([mym4_major], [2])
-m4_define([mym4_minor], [1])
-m4_define([mym4_micro], [2])
+m4_define([mym4_minor], [2])
+m4_define([mym4_micro], [0])
 
 # Below is m4 magic to extract and compute the git revision number,
 # the decimalized short revision number, a beta version string and a
@@ -55,9 +55,9 @@
 #   (Interfaces added:                 AGE++)
 #   (Interfaces removed:               AGE=0)
 #
-LIBGPGME_LT_CURRENT=46
-LIBGPGME_LT_AGE=1
-LIBGPGME_LT_REVISION=2
+LIBGPGME_LT_CURRENT=47
+LIBGPGME_LT_AGE=2
+LIBGPGME_LT_REVISION=0
 ################################################
 
 AC_SUBST(LIBGPGME_LT_CURRENT)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gpgme-2.1.2/doc/defsincdate 
new/gpgme-2.2.0/doc/defsincdate
--- old/gpgme-2.1.2/doc/defsincdate     2026-06-30 11:59:00.000000000 +0200
+++ new/gpgme-2.2.0/doc/defsincdate     2026-08-31 14:53:44.000000000 +0200
@@ -1 +1 @@
-1782141765
+1785833651
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gpgme-2.1.2/doc/gpgme.info 
new/gpgme-2.2.0/doc/gpgme.info
--- old/gpgme-2.1.2/doc/gpgme.info      2026-06-25 16:04:54.000000000 +0200
+++ new/gpgme-2.2.0/doc/gpgme.info      2026-08-31 14:53:44.000000000 +0200
@@ -19,8 +19,8 @@
 
    This file documents the GPGME library.
 
-   This is Edition 2.1.1-beta9, last updated 22 June 2026, of ‘The
-‘GnuPG Made Easy’ Reference Manual’, for Version 2.1.1-beta9.
+   This is Edition 2.2.0, last updated 4 August 2026, of ‘The ‘GnuPG
+Made Easy’ Reference Manual’, for Version 2.2.0.
 
    Copyright © 2002–2008, 2010, 2012–2018 g10 Code GmbH.
 
@@ -37,131 +37,131 @@
 
 
 Indirect:
-gpgme.info-1: 1680
-gpgme.info-2: 303687
+gpgme.info-1: 1669
+gpgme.info-2: 302058
 
 Tag Table:
 (Indirect)
-Node: Top1680
-Node: Introduction9114
-Node: Getting Started9904
-Node: Features11365
-Node: Overview12753
-Node: Preparation13862
-Node: Header14859
-Node: Building the Source15606
-Node: Largefile Support (LFS)17996
-Node: Using Automake23413
-Node: Using Libtool25125
-Node: Library Version Check25422
-Node: Signal Handling31881
-Node: Multi-Threading33151
-Ref: Multi-Threading-Footnote-134567
-Node: Protocols and Engines34990
-Node: Engine Version Check37741
-Node: Engine Information40790
-Node: Engine Configuration44650
-Node: OpenPGP45954
-Node: Cryptographic Message Syntax46294
-Node: Assuan46607
-Node: Algorithms46981
-Ref: Algorithms-Footnote-147460
-Node: Public Key Algorithms47588
-Node: Hash Algorithms50190
-Node: Error Handling51404
-Node: Error Values53278
-Node: Error Sources58481
-Node: Error Codes60921
-Node: Error Strings65942
-Node: Exchanging Data67749
-Node: Creating Data Buffers69634
-Node: Memory Based Data Buffers70150
-Node: File Based Data Buffers73583
-Node: Callback Based Data Buffers76696
-Node: Destroying Data Buffers80887
-Node: Manipulating Data Buffers82394
-Node: Data Buffer I/O Operations82886
-Node: Data Buffer Meta-Data85259
-Node: Data Buffer Convenience90840
-Node: Contexts93114
-Node: Creating Contexts94233
-Node: Destroying Contexts95080
-Node: Result Management95419
-Node: Context Attributes97000
-Node: Protocol Selection98167
-Node: Crypto Engine99213
-Node: Setting the Sender101102
-Node: ASCII Armor102625
-Node: Text Mode103254
-Node: Offline Mode104188
-Node: Pinentry Mode105719
-Node: Included Certificates107613
-Node: Key Listing Mode109059
-Node: Passphrase Callback115381
-Node: Progress Meter Callback118943
-Node: Status Message Callback120928
-Node: Context Flags122693
-Node: Locale131450
-Node: Additional Logs133042
-Node: Key Management135240
-Node: Key objects136464
-Node: Listing Keys154906
-Node: Information About Keys163559
-Node: Manipulating Keys164867
-Node: Generating Keys168855
-Node: Signing Keys187793
-Node: Exporting Keys193552
-Node: Importing Keys201141
-Ref: Importing Keys-Footnote-1210009
-Node: Deleting Keys210137
-Node: Changing Passphrases212560
-Node: Changing TOFU Data213887
-Node: Advanced Key Editing215995
-Node: Crypto Operations218728
-Node: Decrypt220048
-Node: Verify229649
-Node: Decrypt and Verify245972
-Node: Sign248827
-Node: Selecting Signers249391
-Node: Creating a Signature250950
-Node: Signature Notation Data257436
-Node: Encrypt260303
-Node: Encrypting a Plaintext260674
-Node: Random277904
-Node: Getting Random278180
-Node: Miscellaneous280009
-Node: Running other Programs280421
-Node: Using the Assuan protocol282584
-Node: Checking for updates285382
-Node: Run Control290199
-Node: Waiting For Completion290943
-Node: Using External Event Loops293068
-Node: I/O Callback Interface295040
-Node: Registering I/O Callbacks299968
-Node: I/O Callback Example303687
-Node: I/O Callback Example GTK+310312
-Node: I/O Callback Example GDK312101
-Node: I/O Callback Example Qt313743
-Node: Cancellation316031
-Node: UI Server Protocol318339
-Ref: UI Server Protocol-Footnote-1319774
-Node: UI Server Encrypt319893
-Node: UI Server Sign325251
-Node: UI Server Decrypt327604
-Node: UI Server Verify329259
-Node: UI Server Set Input Files332831
-Node: UI Server Sign/Encrypt Files333901
-Node: UI Server Verify/Decrypt Files335709
-Node: UI Server Import/Export Keys337585
-Node: UI Server Checksum Files338647
-Node: Miscellaneous UI Server Commands340865
-Ref: command SENDER342796
-Node: Debugging344498
-Node: Deprecated Functions346657
-Node: Library Copying357360
-Node: Copying385580
-Node: Concept Index423330
-Node: Function and Data Index438188
+Node: Top1669
+Node: Introduction9092
+Node: Getting Started9882
+Node: Features11343
+Node: Overview12731
+Node: Preparation13840
+Node: Header14837
+Node: Building the Source15584
+Node: Largefile Support (LFS)17974
+Node: Using Automake23391
+Node: Using Libtool25103
+Node: Library Version Check25400
+Node: Signal Handling31859
+Node: Multi-Threading33129
+Ref: Multi-Threading-Footnote-134545
+Node: Protocols and Engines34968
+Node: Engine Version Check37719
+Node: Engine Information40768
+Node: Engine Configuration44628
+Node: OpenPGP45932
+Node: Cryptographic Message Syntax46272
+Node: Assuan46585
+Node: Algorithms46959
+Ref: Algorithms-Footnote-147438
+Node: Public Key Algorithms47566
+Node: Hash Algorithms50168
+Node: Error Handling51382
+Node: Error Values53256
+Node: Error Sources58459
+Node: Error Codes60899
+Node: Error Strings65920
+Node: Exchanging Data67727
+Node: Creating Data Buffers69612
+Node: Memory Based Data Buffers70128
+Node: File Based Data Buffers73561
+Node: Callback Based Data Buffers76674
+Node: Destroying Data Buffers80865
+Node: Manipulating Data Buffers82372
+Node: Data Buffer I/O Operations82864
+Node: Data Buffer Meta-Data85237
+Node: Data Buffer Convenience90818
+Node: Contexts93092
+Node: Creating Contexts94211
+Node: Destroying Contexts95058
+Node: Result Management95397
+Node: Context Attributes96978
+Node: Protocol Selection98145
+Node: Crypto Engine99191
+Node: Setting the Sender101080
+Node: ASCII Armor102603
+Node: Text Mode103232
+Node: Offline Mode104166
+Node: Pinentry Mode105697
+Node: Included Certificates107591
+Node: Key Listing Mode109037
+Node: Passphrase Callback115359
+Node: Progress Meter Callback118921
+Node: Status Message Callback120906
+Node: Context Flags122671
+Node: Locale131428
+Node: Additional Logs133020
+Node: Key Management135218
+Node: Key objects136442
+Node: Listing Keys154884
+Node: Information About Keys163537
+Node: Manipulating Keys164845
+Node: Generating Keys168833
+Node: Signing Keys187771
+Node: Exporting Keys193530
+Node: Importing Keys201119
+Ref: Importing Keys-Footnote-1209987
+Node: Deleting Keys210115
+Node: Changing Passphrases212538
+Node: Changing TOFU Data213865
+Node: Advanced Key Editing215973
+Node: Crypto Operations218706
+Node: Decrypt220026
+Node: Verify229627
+Node: Decrypt and Verify246393
+Node: Sign249248
+Node: Selecting Signers249812
+Node: Creating a Signature251371
+Node: Signature Notation Data257857
+Node: Encrypt260724
+Node: Encrypting a Plaintext261095
+Node: Random278325
+Node: Getting Random278601
+Node: Miscellaneous280430
+Node: Running other Programs280842
+Node: Using the Assuan protocol283005
+Node: Checking for updates285803
+Node: Run Control290620
+Node: Waiting For Completion291364
+Node: Using External Event Loops293489
+Node: I/O Callback Interface295461
+Node: Registering I/O Callbacks302058
+Node: I/O Callback Example304097
+Node: I/O Callback Example GTK+310722
+Node: I/O Callback Example GDK312511
+Node: I/O Callback Example Qt314153
+Node: Cancellation316441
+Node: UI Server Protocol318749
+Ref: UI Server Protocol-Footnote-1320184
+Node: UI Server Encrypt320303
+Node: UI Server Sign325661
+Node: UI Server Decrypt328014
+Node: UI Server Verify329669
+Node: UI Server Set Input Files333241
+Node: UI Server Sign/Encrypt Files334311
+Node: UI Server Verify/Decrypt Files336119
+Node: UI Server Import/Export Keys337995
+Node: UI Server Checksum Files339057
+Node: Miscellaneous UI Server Commands341275
+Ref: command SENDER343206
+Node: Debugging344908
+Node: Deprecated Functions347067
+Node: Library Copying357770
+Node: Copying385990
+Node: Concept Index423740
+Node: Function and Data Index438598
 
 End Tag Table
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gpgme-2.1.2/doc/gpgme.info-1 
new/gpgme-2.2.0/doc/gpgme.info-1
--- old/gpgme-2.1.2/doc/gpgme.info-1    2026-06-25 16:04:54.000000000 +0200
+++ new/gpgme-2.2.0/doc/gpgme.info-1    2026-08-31 14:53:44.000000000 +0200
@@ -19,8 +19,8 @@
 
    This file documents the GPGME library.
 
-   This is Edition 2.1.1-beta9, last updated 22 June 2026, of ‘The
-‘GnuPG Made Easy’ Reference Manual’, for Version 2.1.1-beta9.
+   This is Edition 2.2.0, last updated 4 August 2026, of ‘The ‘GnuPG
+Made Easy’ Reference Manual’, for Version 2.2.0.
 
    Copyright © 2002–2008, 2010, 2012–2018 g10 Code GmbH.
 
@@ -41,9 +41,8 @@
 Main Menu
 *********
 
-This is Edition 2.1.1-beta9, last updated 22 June 2026, of ‘The ‘GnuPG
-Made Easy’ Reference Manual’, for Version 2.1.1-beta9 of the GPGME
-library.
+This is Edition 2.2.0, last updated 4 August 2026, of ‘The ‘GnuPG Made
+Easy’ Reference Manual’, for Version 2.2.0 of the GPGME library.
 
 * Menu:
 
@@ -5856,6 +5855,16 @@
           information availabale directly with a signature.  It may also
           be ‘NULL’ if such information is not readily available.
 
+     ‘char *issuer_serial’
+          SINCE: 2.2.0 For S/MIME signatures this is the issuer serial
+          number of the signing certificate if the signing certificate
+          isn’t available.  Requires GnuPG 2.5.22.
+
+     ‘char *issuer_name’
+          SINCE: 2.2.0 For S/MIME signatures this is the issuer name of
+          the signing certificate if the signing certificate isn’t
+          available.  Requires GnuPG 2.5.22.
+
  -- Data type: gpgme_verify_result_t
      This is a pointer to a structure used to store the result of a
      ‘gpgme_op_verify’ operation.  After verifying a signature, you can
@@ -7131,52 +7140,3 @@
 
      GPGME can call this function in an I/O callback handler.
 
-
-File: gpgme.info,  Node: Registering I/O Callbacks,  Next: I/O Callback 
Example,  Prev: I/O Callback Interface,  Up: Using External Event Loops
-
-7.8.2.2 Registering I/O Callbacks
-.................................
-
- -- Data type: struct gpgme_io_cbs
-     This structure is used to store the I/O callback interface
-     functions described in the previous section.  It has the following
-     members:
-
-     ‘gpgme_register_io_cb_t add’
-          This is the function called by GPGME to register an I/O
-          callback handler.  It must be specified.
-
-     ‘void *add_priv’
-          This is passed as the first argument to the ‘add’ function
-          when it is called by GPGME.  For example, it can be used to
-          determine the event loop to which the file descriptor should
-          be added.
-
-     ‘gpgme_remove_io_cb_t remove’
-          This is the function called by GPGME to remove an I/O callback
-          handler.  It must be specified.
-
-     ‘gpgme_event_io_cb_t event’
-          This is the function called by GPGME to signal an event for an
-          operation.  It must be specified, because at least the start
-          event must be processed.
-
-     ‘void *event_priv’
-          This is passed as the first argument to the ‘event’ function
-          when it is called by GPGME.  For example, it can be used to
-          determine the context in which the event has occurred.
-
- -- Function: void gpgme_set_io_cbs (gpgme_ctx_t CTX,
-          struct gpgme_io_cbs *IO_CBS)
-     The function ‘gpgme_set_io_cbs’ enables the I/O callback interface
-     for the context CTX.  The I/O callback functions are specified by
-     IO_CBS.
-
-     If IO_CBS->‘add’ is ‘NULL’, the I/O callback interface is disabled
-     for the context, and normal operation is restored.
-
- -- Function: void gpgme_get_io_cbs (gpgme_ctx_t CTX,
-          struct gpgme_io_cbs *IO_CBS)
-     The function ‘gpgme_get_io_cbs’ returns the I/O callback functions
-     set with ‘gpgme_set_io_cbs’ in IO_CBS.
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gpgme-2.1.2/doc/gpgme.info-2 
new/gpgme-2.2.0/doc/gpgme.info-2
--- old/gpgme-2.1.2/doc/gpgme.info-2    2026-06-25 16:04:54.000000000 +0200
+++ new/gpgme-2.2.0/doc/gpgme.info-2    2026-08-31 14:53:44.000000000 +0200
@@ -19,8 +19,8 @@
 
    This file documents the GPGME library.
 
-   This is Edition 2.1.1-beta9, last updated 22 June 2026, of ‘The
-‘GnuPG Made Easy’ Reference Manual’, for Version 2.1.1-beta9.
+   This is Edition 2.2.0, last updated 4 August 2026, of ‘The ‘GnuPG
+Made Easy’ Reference Manual’, for Version 2.2.0.
 
    Copyright © 2002–2008, 2010, 2012–2018 g10 Code GmbH.
 
@@ -36,6 +36,55 @@
 Public License for more details.
 
 
+File: gpgme.info,  Node: Registering I/O Callbacks,  Next: I/O Callback 
Example,  Prev: I/O Callback Interface,  Up: Using External Event Loops
+
+7.8.2.2 Registering I/O Callbacks
+.................................
+
+ -- Data type: struct gpgme_io_cbs
+     This structure is used to store the I/O callback interface
+     functions described in the previous section.  It has the following
+     members:
+
+     ‘gpgme_register_io_cb_t add’
+          This is the function called by GPGME to register an I/O
+          callback handler.  It must be specified.
+
+     ‘void *add_priv’
+          This is passed as the first argument to the ‘add’ function
+          when it is called by GPGME.  For example, it can be used to
+          determine the event loop to which the file descriptor should
+          be added.
+
+     ‘gpgme_remove_io_cb_t remove’
+          This is the function called by GPGME to remove an I/O callback
+          handler.  It must be specified.
+
+     ‘gpgme_event_io_cb_t event’
+          This is the function called by GPGME to signal an event for an
+          operation.  It must be specified, because at least the start
+          event must be processed.
+
+     ‘void *event_priv’
+          This is passed as the first argument to the ‘event’ function
+          when it is called by GPGME.  For example, it can be used to
+          determine the context in which the event has occurred.
+
+ -- Function: void gpgme_set_io_cbs (gpgme_ctx_t CTX,
+          struct gpgme_io_cbs *IO_CBS)
+     The function ‘gpgme_set_io_cbs’ enables the I/O callback interface
+     for the context CTX.  The I/O callback functions are specified by
+     IO_CBS.
+
+     If IO_CBS->‘add’ is ‘NULL’, the I/O callback interface is disabled
+     for the context, and normal operation is restored.
+
+ -- Function: void gpgme_get_io_cbs (gpgme_ctx_t CTX,
+          struct gpgme_io_cbs *IO_CBS)
+     The function ‘gpgme_get_io_cbs’ returns the I/O callback functions
+     set with ‘gpgme_set_io_cbs’ in IO_CBS.
+
+
 File: gpgme.info,  Node: I/O Callback Example,  Next: I/O Callback Example 
GTK+,  Prev: Registering I/O Callbacks,  Up: Using External Event Loops
 
 7.8.2.3 I/O Callback Example
@@ -3150,7 +3199,7 @@
 * gpgme_op_verify:                       Verify.              (line   6)
 * gpgme_op_verify_ext:                   Verify.              (line  44)
 * gpgme_op_verify_ext_start:             Verify.              (line  72)
-* gpgme_op_verify_result:                Verify.              (line 367)
+* gpgme_op_verify_result:                Verify.              (line 377)
 * gpgme_op_verify_start:                 Verify.              (line  32)
 * gpgme_passphrase_cb_t:                 Passphrase Callback. (line   9)
 * gpgme_pinentry_mode_t:                 Pinentry Mode.       (line  26)
@@ -3227,7 +3276,7 @@
 * gpgme_user_id_t:                       Key objects.         (line 283)
 * gpgme_validity_t:                      Information About Keys.
                                                               (line   9)
-* gpgme_verify_result_t:                 Verify.              (line 345)
+* gpgme_verify_result_t:                 Verify.              (line 355)
 * gpgme_wait:                            Waiting For Completion.
                                                               (line   6)
 * IMPORT_FILES:                          UI Server Import/Export Keys.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gpgme-2.1.2/doc/gpgme.texi 
new/gpgme-2.2.0/doc/gpgme.texi
--- old/gpgme-2.1.2/doc/gpgme.texi      2026-06-25 16:04:19.000000000 +0200
+++ new/gpgme-2.2.0/doc/gpgme.texi      2026-08-31 14:25:10.000000000 +0200
@@ -6394,6 +6394,17 @@
 availabale directly with a signature.  It may also be @code{NULL} if
 such information is not readily available.
 
+@item char *issuer_serial
+@since{2.2.0}
+For S/MIME signatures this is the issuer serial number of the signing
+certificate if the signing certificate isn't available. Requires
+GnuPG 2.5.22.
+
+@item char *issuer_name
+@since{2.2.0}
+For S/MIME signatures this is the issuer name of the signing certificate
+if the signing certificate isn't available. Requires GnuPG 2.5.22.
+
 @end table
 @end deftp
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gpgme-2.1.2/gpgme.spec new/gpgme-2.2.0/gpgme.spec
--- old/gpgme-2.1.2/gpgme.spec  2026-06-30 11:59:01.000000000 +0200
+++ new/gpgme-2.2.0/gpgme.spec  2026-08-31 14:53:45.000000000 +0200
@@ -1,7 +1,7 @@
 # This is a template.  The dist target uses it to create the real file.
 Summary: GPGME - GnuPG Made Easy
 Name: gpgme
-Version: 2.1.2
+Version: 2.2.0
 Release: 1
 URL: https://gnupg.org/gpgme.html
 Source: https://www.gnupg.org/ftp/gcrypt/gpgme/%{name}-%{version}.tar.gz
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gpgme-2.1.2/lang/cl/gpgme.asd 
new/gpgme-2.2.0/lang/cl/gpgme.asd
--- old/gpgme-2.1.2/lang/cl/gpgme.asd   2026-06-30 11:58:58.000000000 +0200
+++ new/gpgme-2.2.0/lang/cl/gpgme.asd   2026-08-31 14:53:42.000000000 +0200
@@ -27,7 +27,7 @@
 (defsystem gpgme
   :description "GnuPG Made Easy."
   :author "g10 Code GmbH"
-  :version "2.1.2"
+  :version "2.2.0"
   :licence "GPL"
   :defsystem-depends-on ("cffi-grovel")
   :depends-on ("cffi" "gpg-error" "trivial-garbage")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gpgme-2.1.2/src/conversion.c 
new/gpgme-2.2.0/src/conversion.c
--- old/gpgme-2.1.2/src/conversion.c    2026-06-23 09:50:48.000000000 +0200
+++ new/gpgme-2.2.0/src/conversion.c    2026-08-31 14:25:10.000000000 +0200
@@ -242,16 +242,17 @@
 }
 
 
-/* Decode the percent escaped string SRC and store the result in the
-   buffer *DESTP which is LEN bytes long.  If LEN is zero, then a
-   large enough buffer is allocated with malloc and *DESTP is set to
-   the result.  Currently, LEN is only used to specify if allocation
+/* Do the percent and plus/space decoding of string SRC and store the
+   result in the buffer *DESTP which is LEN bytes long.  If LEN is zero,
+   then a large enough buffer is allocated with malloc and *DESTP is set
+   to the result.  Currently, LEN is only used to specify if allocation
    is desired or not, the caller is expected to make sure that *DESTP
    is large enough if LEN is not zero.  If BINARY is 1, then '\0'
-   characters are allowed in the output.  */
-gpgme_error_t
-_gpgme_decode_percent_string (const char *src, char **destp, size_t len,
-                             int binary)
+   characters are allowed in the output.  Plus decoding is only done
+   if WITHPLUS is 1.  */
+static gpgme_error_t
+do_decode_percent_or_percent_plus (const char *src, char **destp, size_t len,
+                                  int binary, int withplus)
 {
   char *dest;
 
@@ -277,7 +278,12 @@
   /* Convert the string.  */
   while (*src)
     {
-      if (*src != '%')
+      if (*src == '+' && withplus)
+        {
+          *(dest++) = ' ';
+          src++;
+        }
+      else if (*src != '%')
        {
          *(dest++) = *(src++);
          continue;
@@ -316,6 +322,36 @@
 }
 
 
+/* Decode the percent escaped string SRC and store the result in the
+   buffer *DESTP which is LEN bytes long.  If LEN is zero, then a
+   large enough buffer is allocated with malloc and *DESTP is set to
+   the result.  Currently, LEN is only used to specify if allocation
+   is desired or not, the caller is expected to make sure that *DESTP
+   is large enough if LEN is not zero.  If BINARY is 1, then '\0'
+   characters are allowed in the output.  */
+gpgme_error_t
+_gpgme_decode_percent_string (const char *src, char **destp, size_t len,
+                             int binary)
+{
+  return do_decode_percent_or_percent_plus (src, destp, len, binary, 0);
+}
+
+
+/* Decode the percent-plus escaped string SRC and store the result in the
+   buffer *DESTP which is LEN bytes long.  If LEN is zero, then a
+   large enough buffer is allocated with malloc and *DESTP is set to
+   the result.  Currently, LEN is only used to specify if allocation
+   is desired or not, the caller is expected to make sure that *DESTP
+   is large enough if LEN is not zero.  If BINARY is 1, then '\0'
+   characters are allowed in the output.  */
+gpgme_error_t
+_gpgme_decode_percent_plus_string (const char *src, char **destp, size_t len,
+                                  int binary)
+{
+  return do_decode_percent_or_percent_plus (src, destp, len, binary, 1);
+}
+
+
 /* Encode the string SRC with percent escaping and store the result in
    the buffer *DESTP which is LEN bytes long.  If LEN is zero, then a
    large enough buffer is allocated with malloc and *DESTP is set to
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gpgme-2.1.2/src/gpgme.h.in 
new/gpgme-2.2.0/src/gpgme.h.in
--- old/gpgme-2.1.2/src/gpgme.h.in      2026-06-25 16:04:19.000000000 +0200
+++ new/gpgme-2.2.0/src/gpgme.h.in      2026-08-31 14:45:21.000000000 +0200
@@ -1731,6 +1731,14 @@
   /* If non-NULL, a possible incomplete key object with the data
    * available for the signature.  */
   gpgme_key_t key;
+
+  /* If protocol is GPGME_PROTOCOL_CMS, this string may contain the
+     issuer serial.  */
+  char *issuer_serial;
+
+  /* If protocol is GPGME_PROTOCOL_CMS, this string may contain the
+     issuer name.  */
+  char *issuer_name;
 };
 typedef struct _gpgme_signature *gpgme_signature_t;
 
@@ -2737,7 +2745,8 @@
     GPGME_STATUS_VERIFICATION_COMPLIANCE_MODE = 100,
     GPGME_STATUS_CANCELED_BY_USER = 101,
     GPGME_STATUS_ENCRYPTION_COMPLIANCE_MODE = 102,
-    GPGME_STATUS_SESSION_HASH = 103
+    GPGME_STATUS_SESSION_HASH = 103,
+    GPGME_STATUS_SIGINFO = 104
   }
 gpgme_status_code_t;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gpgme-2.1.2/src/status-table.c 
new/gpgme-2.2.0/src/status-table.c
--- old/gpgme-2.1.2/src/status-table.c  2026-06-23 09:50:48.000000000 +0200
+++ new/gpgme-2.2.0/src/status-table.c  2026-08-31 14:25:10.000000000 +0200
@@ -125,6 +125,7 @@
   { "SHM_GET_HIDDEN", GPGME_STATUS_SHM_GET_HIDDEN },
   { "SHM_INFO", GPGME_STATUS_SHM_INFO },
   { "SIGEXPIRED", GPGME_STATUS_SIGEXPIRED },
+  { "SIGINFO", GPGME_STATUS_SIGINFO },
   { "SIG_CREATED", GPGME_STATUS_SIG_CREATED },
   { "SIG_ID", GPGME_STATUS_SIG_ID },
   { "SIG_SUBPACKET", GPGME_STATUS_SIG_SUBPACKET },
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gpgme-2.1.2/src/util.h new/gpgme-2.2.0/src/util.h
--- old/gpgme-2.1.2/src/util.h  2026-06-23 09:50:48.000000000 +0200
+++ new/gpgme-2.2.0/src/util.h  2026-08-31 14:25:10.000000000 +0200
@@ -131,6 +131,16 @@
 gpgme_error_t _gpgme_decode_percent_string (const char *src, char **destp,
                                            size_t len, int binary);
 
+/* Decode the percent-plus escaped string SRC and store the result in the
+   buffer *DESTP which is LEN bytes long.  If LEN is zero, then a
+   large enough buffer is allocated with malloc and *DESTP is set to
+   the result.  Currently, LEN is only used to specify if allocation
+   is desired or not, the caller is expected to make sure that *DESTP
+   is large enough if LEN is not zero.  If BINARY is 1, then '\0'
+   characters are allowed in the output.  */
+gpgme_error_t _gpgme_decode_percent_plus_string (const char *src, char **destp,
+                                                size_t len, int binary);
+
 gpgme_error_t _gpgme_encode_percent_string (const char *src, char **destp,
                                            size_t len);
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gpgme-2.1.2/src/verify.c new/gpgme-2.2.0/src/verify.c
--- old/gpgme-2.1.2/src/verify.c        2026-06-23 09:50:48.000000000 +0200
+++ new/gpgme-2.2.0/src/verify.c        2026-08-31 14:25:10.000000000 +0200
@@ -75,6 +75,10 @@
        free (sig->pka_address);
       if (sig->key)
         gpgme_key_unref (sig->key);
+      if (sig->issuer_serial)
+       free (sig->issuer_serial);
+      if (sig->issuer_name)
+       free (sig->issuer_name);
       free (sig);
       sig = next;
     }
@@ -487,6 +491,27 @@
 
 
 static gpgme_error_t
+parse_sig_info (gpgme_signature_t sig, char *args, gpgme_protocol_t protocol)
+{
+  char *end = args;
+  char *tail;
+
+  if (!*args)
+    /* We require at least the creation time.  */
+    return gpg_error (GPG_ERR_GENERAL);
+
+  if ((protocol == GPGME_PROTOCOL_CMS) && (*args == '-'))
+    return 0;
+
+  sig->timestamp = _gpgme_parse_timestamp (end, &tail);
+  if (sig->timestamp == -1 || end == tail || (*tail && *tail != ' '))
+    return trace_gpg_error (GPG_ERR_INV_ENGINE);
+
+  return 0;
+}
+
+
+static gpgme_error_t
 parse_notation (gpgme_signature_t sig, gpgme_status_code_t code, char *args)
 {
   gpgme_error_t err;
@@ -926,6 +951,49 @@
 }
 
 
+static gpgme_error_t
+parse_no_pubkey (gpgme_signature_t sig, char *args, gpgme_protocol_t protocol)
+{
+  gpgme_error_t err;
+  char *end;
+  char *name;
+
+  if (protocol != GPGME_PROTOCOL_CMS)
+    return 0;
+
+  /* Check that we only get one of these status codes per
+     signature; if not the crypto backend misbehaves.  */
+  if (sig->issuer_serial || sig->issuer_name)
+    return trace_gpg_error (GPG_ERR_INV_ENGINE);
+
+  /* Parse #serialno/issuer */
+  end = strchr (args, ' ');
+  if (end)
+    *end = '\0';
+
+  if (*args != '#')
+    return trace_gpg_error (GPG_ERR_INV_ENGINE);
+  args++;
+
+  name = strchr (args, '/');
+  if (name)
+    {
+      *name = '\0';
+      name++;
+    }
+  if (!name || !*args || !*name)
+    return trace_gpg_error (GPG_ERR_INV_ENGINE);
+
+  err = _gpgme_decode_percent_plus_string (args, &sig->issuer_serial, 0, 0);
+  if (err)
+    return err;
+
+  err = _gpgme_decode_percent_plus_string (name, &sig->issuer_name, 0, 0);
+
+  return err;
+}
+
+
 gpgme_error_t
 _gpgme_verify_status_handler (void *priv, gpgme_status_code_t code, char *args)
 {
@@ -969,6 +1037,11 @@
       return sig ? parse_valid_sig (sig, args, ctx->protocol)
        : trace_gpg_error (GPG_ERR_INV_ENGINE);
 
+    case GPGME_STATUS_SIGINFO:
+      opd->only_newsig_seen = 0;
+      return sig ? parse_sig_info (sig, args, ctx->protocol)
+       : trace_gpg_error (GPG_ERR_INV_ENGINE);
+
     case GPGME_STATUS_NODATA:
       opd->only_newsig_seen = 0;
       if (!sig)
@@ -996,9 +1069,14 @@
     case GPGME_STATUS_TRUST_MARGINAL:
     case GPGME_STATUS_TRUST_FULLY:
     case GPGME_STATUS_TRUST_ULTIMATE:
+      /* In de-vs compliance mode TRUST_ status is emitted during
+       * decryption if validation of the encryption certificate
+       * fails.  Silently, ignore such a status line if no NEWSIG
+       * was seen.  */
+      if (!sig)
+        break;
       opd->only_newsig_seen = 0;
-      return sig ? parse_trust (sig, code, args)
-       : trace_gpg_error (GPG_ERR_INV_ENGINE);
+      return parse_trust (sig, code, args);
 
     case GPGME_STATUS_PKA_TRUST_BAD:
     case GPGME_STATUS_PKA_TRUST_GOOD:
@@ -1106,6 +1184,11 @@
       PARSE_COMPLIANCE_FLAGS (args, opd->current_sig);
       break;
 
+    case GPGME_STATUS_NO_PUBKEY:
+      opd->only_newsig_seen = 0;
+      return sig ? parse_no_pubkey (sig, args, ctx->protocol)
+       : trace_gpg_error (GPG_ERR_INV_ENGINE);
+
     default:
       break;
     }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gpgme-2.1.2/tests/gpg/t-verify.c 
new/gpgme-2.2.0/tests/gpg/t-verify.c
--- old/gpgme-2.1.2/tests/gpg/t-verify.c        2024-06-24 16:51:19.000000000 
+0200
+++ new/gpgme-2.2.0/tests/gpg/t-verify.c        2026-08-31 14:25:10.000000000 
+0200
@@ -132,7 +132,8 @@
 static void
 check_result (gpgme_verify_result_t result, int no_of_sigs, int skip_sigs,
               unsigned int summary, const char *fpr,
-             gpgme_error_t status, int notation, int validity)
+             gpgme_error_t status, int notation, int validity,
+              unsigned long timestamp)
 {
   gpgme_signature_t sig;
   int n;
@@ -258,6 +259,13 @@
                gpgme_strerror (sig->validity_reason));
       exit (1);
     }
+  if (sig->timestamp != timestamp)
+    {
+     fprintf (stderr, "%s:%i:sig-%d: Unexpected timestamp: "
+              "want=%li have=%li\n",
+             PGM, __LINE__, skip_sigs, timestamp, sig->timestamp);
+      exit (1);
+    }
 }
 
 
@@ -288,7 +296,7 @@
   result = gpgme_op_verify_result (ctx);
   check_result (result, 1, 0, GPGME_SIGSUM_VALID|GPGME_SIGSUM_GREEN,
                 "A0FF4590BB6122EDEF6E3C542D727CC768697734",
-               GPG_ERR_NO_ERROR, 1, GPGME_VALIDITY_FULL);
+               GPG_ERR_NO_ERROR, 1, GPGME_VALIDITY_FULL, 974322223);
 
   /* Checking a manipulated message.  */
   gpgme_data_release (text);
@@ -298,8 +306,12 @@
   err = gpgme_op_verify (ctx, sig, text, NULL);
   fail_if_err (err);
   result = gpgme_op_verify_result (ctx);
-  check_result (result, 1, 0, GPGME_SIGSUM_RED, "2D727CC768697734",
-               GPG_ERR_BAD_SIGNATURE, 0, GPGME_VALIDITY_UNKNOWN);
+  if (have_gpg_version ("2.5.22"))
+    check_result (result, 1, 0, GPGME_SIGSUM_RED, "2D727CC768697734",
+                 GPG_ERR_BAD_SIGNATURE, 0, GPGME_VALIDITY_UNKNOWN, 974322223);
+  else
+    check_result (result, 1, 0, GPGME_SIGSUM_RED, "2D727CC768697734",
+                 GPG_ERR_BAD_SIGNATURE, 0, GPGME_VALIDITY_UNKNOWN, 0);
 
   /* Checking a valid message.  But that one has a second signature
    * made by an unknown key.  */
@@ -315,10 +327,10 @@
   result = gpgme_op_verify_result (ctx);
   check_result (result, 2, 0, GPGME_SIGSUM_VALID|GPGME_SIGSUM_GREEN,
                 "A0FF4590BB6122EDEF6E3C542D727CC768697734",
-               GPG_ERR_NO_ERROR, 1, GPGME_VALIDITY_FULL);
+               GPG_ERR_NO_ERROR, 1, GPGME_VALIDITY_FULL, 974322223);
   check_result (result, 2, 1, GPGME_SIGSUM_KEY_MISSING,
                 "36EC2A70C6426EB0FCE5BB4DF91C98F049D4204C",
-               GPG_ERR_NO_PUBKEY, 0, GPGME_VALIDITY_UNKNOWN);
+               GPG_ERR_NO_PUBKEY, 0, GPGME_VALIDITY_UNKNOWN, 1523533703);
 
 
   /* Checking a normal signature.  */
@@ -333,7 +345,7 @@
   result = gpgme_op_verify_result (ctx);
   check_result (result, 1, 0, GPGME_SIGSUM_VALID|GPGME_SIGSUM_GREEN,
                 "A0FF4590BB6122EDEF6E3C542D727CC768697734",
-               GPG_ERR_NO_ERROR, 0, GPGME_VALIDITY_FULL);
+               GPG_ERR_NO_ERROR, 0, GPGME_VALIDITY_FULL, 1015172412);
 
 
   /* Checking an invalid message.  */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gpgme-2.1.2/tests/gpgsm/Makefile.am 
new/gpgme-2.2.0/tests/gpgsm/Makefile.am
--- old/gpgme-2.1.2/tests/gpgsm/Makefile.am     2026-06-23 09:50:48.000000000 
+0200
+++ new/gpgme-2.2.0/tests/gpgsm/Makefile.am     2026-08-31 14:25:10.000000000 
+0200
@@ -38,7 +38,7 @@
 
 AM_CPPFLAGS = -I$(top_builddir)/src @GPG_ERROR_CFLAGS@
 AM_LDFLAGS = -no-install
-LDADD = ../../src/libgpgme.la @LDADD_FOR_TESTS_KLUDGE@
+LDADD = ../../src/libgpgme.la @GPG_ERROR_LIBS@ @LDADD_FOR_TESTS_KLUDGE@
 
 # We don't run t-genkey in the test suite, because it takes too long
 # and needs a working pinentry.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gpgme-2.1.2/tests/gpgsm/Makefile.in 
new/gpgme-2.2.0/tests/gpgsm/Makefile.in
--- old/gpgme-2.1.2/tests/gpgsm/Makefile.in     2026-06-30 11:58:52.000000000 
+0200
+++ new/gpgme-2.2.0/tests/gpgsm/Makefile.in     2026-08-31 14:53:35.000000000 
+0200
@@ -449,7 +449,7 @@
 
 AM_CPPFLAGS = -I$(top_builddir)/src @GPG_ERROR_CFLAGS@
 AM_LDFLAGS = -no-install
-LDADD = ../../src/libgpgme.la @LDADD_FOR_TESTS_KLUDGE@
+LDADD = ../../src/libgpgme.la @GPG_ERROR_LIBS@ @LDADD_FOR_TESTS_KLUDGE@
 key_id = 32100C27173EF6E9C4E9A25D3D69F86D37A4F939
 CLEANFILES = pubring-stamp pubring.kbx pubring.kbx~ gpgsm.conf trustlist.txt \
        random_seed S.gpg-agent gpg-sample.stamp
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gpgme-2.1.2/tests/gpgsm/cms-decrypt.c 
new/gpgme-2.2.0/tests/gpgsm/cms-decrypt.c
--- old/gpgme-2.1.2/tests/gpgsm/cms-decrypt.c   2018-12-03 10:37:25.000000000 
+0100
+++ new/gpgme-2.2.0/tests/gpgsm/cms-decrypt.c   2026-08-31 14:25:10.000000000 
+0200
@@ -34,13 +34,6 @@
 
 #include "t-support.h"
 
-static const char *
-nonnull (const char *s)
-{
-  return s? s :"[none]";
-}
-
-
 int
 main (int argc, char **argv)
 {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gpgme-2.1.2/tests/gpgsm/cms-keylist.c 
new/gpgme-2.2.0/tests/gpgsm/cms-keylist.c
--- old/gpgme-2.1.2/tests/gpgsm/cms-keylist.c   2018-12-03 10:37:25.000000000 
+0100
+++ new/gpgme-2.2.0/tests/gpgsm/cms-keylist.c   2026-08-31 14:25:10.000000000 
+0200
@@ -34,13 +34,6 @@
 
 #include "t-support.h"
 
-static const char *
-nonnull (const char *s)
-{
-  return s? s :"[none]";
-}
-
-
 int
 main (int argc, char **argv)
 {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gpgme-2.1.2/tests/gpgsm/t-support.h 
new/gpgme-2.2.0/tests/gpgsm/t-support.h
--- old/gpgme-2.1.2/tests/gpgsm/t-support.h     2023-02-01 17:50:48.000000000 
+0100
+++ new/gpgme-2.2.0/tests/gpgsm/t-support.h     2026-08-31 14:25:10.000000000 
+0200
@@ -23,6 +23,7 @@
 #include <errno.h>
 #include <stdlib.h>
 #include <locale.h>
+#include <string.h>
 
 #include <gpgme.h>
 
@@ -45,6 +46,49 @@
   while (0)
 
 
+#ifdef GPGRT_HAVE_MACRO_FUNCTION
+void GPGRT_ATTR_NORETURN
+_test (const char *expr, const char *file, int line,
+       const char *func)
+{
+  fprintf (stderr, "Test \"%s\" in %s failed (%s:%d)\n",
+           expr, func, file, line);
+  exit (1);
+}
+# define test(expr)                                             \
+  ((expr)                                                       \
+   ? (void) 0                                                   \
+   : _test (#expr, __FILE__, __LINE__, __FUNCTION__))
+#else /*!GPGRT_HAVE_MACRO_FUNCTION*/
+void
+_test (const char *expr, const char *file, int line)
+{
+  fprintf (stderr, "Test \"%s\" failed (%s:%d)\n",
+           expr, file, line);
+  exit (1);
+}
+# define test(expr)                                             \
+  ((expr)                                                       \
+   ? (void) 0                                                   \
+   : _test (#expr, __FILE__, __LINE__))
+#endif /*!GPGRT_HAVE_MACRO_FUNCTION*/
+
+
+int
+safe_strcmp (const char *s1, const char *s2)
+{
+  return s1 ? (s2 ? strcmp (s1, s2) : 1)
+            : (s2 ? -1 : 0);
+}
+
+
+const char *
+nonnull (const char *s)
+{
+  return s? s :"[none]";
+}
+
+
 void
 print_data (gpgme_data_t dh)
 {
@@ -121,3 +165,21 @@
   err = gpgme_engine_check_version (proto);
   fail_if_err (err);
 }
+
+
+/* Return true if the gpg engine's version is at least REQ_VERSION.  */
+int
+have_gpgsm_version (const char *req_version)
+{
+  gpgme_engine_info_t engine_info;
+  init_gpgme (GPGME_PROTOCOL_CMS);
+
+  fail_if_err (gpgme_get_engine_info (&engine_info));
+  for (; engine_info; engine_info = engine_info->next)
+    if (engine_info->protocol == GPGME_PROTOCOL_CMS)
+      break;
+
+  test (engine_info);
+
+  return gpgrt_cmp_version (engine_info->version, req_version, 3) >= 0;
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gpgme-2.1.2/tests/gpgsm/t-verify.c 
new/gpgme-2.2.0/tests/gpgsm/t-verify.c
--- old/gpgme-2.1.2/tests/gpgsm/t-verify.c      2018-12-03 10:37:25.000000000 
+0100
+++ new/gpgme-2.2.0/tests/gpgsm/t-verify.c      2026-08-31 14:25:10.000000000 
+0200
@@ -49,11 +49,34 @@
 "mRgCXIWcjlHT0DTRLBf192Ve22IyKH00L52CqFsSN3a2sajqRUlXH8RY2D+Al71e\n"
 "MYdRclgjObCcoilA8fZ13VR4DiMJVFCxJL4qVWI=\n"
 "-----END CMS OBJECT-----\n";
+static const char test_opaque_without_cert[] =
+"-----BEGIN SIGNED MESSAGE-----\n"
+"MIAGCSqGSIb3DQEHAqCAMIACAQExDzANBglghkgBZQMEAgEFADCABgkqhkiG9w0B\n"
+"BwGggCSABAlTaWduIG1lIQoAAAAAAAAxggLmMIIC4gIBATB+MHgxCzAJBgNVBAYT\n"
+"AkRFMRYwFAYDVQQKEw1nMTAgQ29kZSBHbWJIMRAwDgYDVQQLEwdUZXN0bGFiMR4w\n"
+"HAYDVQQDExVnMTAgQ29kZSBURVNUIENBIDIwMTkxHzAdBgkqhkiG9w0BCQEWEGlu\n"
+"Zm9AZzEwY29kZS5jb20CAhoDMA0GCWCGSAFlAwQCAQUAoIG6MBgGCSqGSIb3DQEJ\n"
+"AzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTI2MDcyMjEyMjMzMlowLwYJ\n"
+"KoZIhvcNAQkEMSIEIKmQZ0JOVOovrhBksV3YI2d7ilQAdZccUJYySVzZ0+tYME8G\n"
+"CSqGSIb3DQEJDzFCMEAwCwYJYIZIAWUDBAEuMAsGCWCGSAFlAwQBBjALBglghkgB\n"
+"ZQMEASowCwYJYIZIAWUDBAECMAoGCCqGSIb3DQMHMA0GCSqGSIb3DQEBAQUABIIB\n"
+"gJ0L7QAD5cOvgW+qETBWZIUwnyFRwUdQuNMC71X1SCRJdIzRPecr38Tt0i2dGXA2\n"
+"Y7b6SGy9gOmy+DfqQ7GKPAmDyVqA1+sMOMnsF8CCB3DWdYbOWI18WAoPV49XOdra\n"
+"vVTdXzKgz91WgXjiMUaG8Rrq7kP0F5Yw3LStUKZzO6yOof/YnJQWL9kYo/04m5Lj\n"
+"ZkdwGW1o+WmFUcDO1OIEkxNmHWa/6wDlROT4HqH3ptwhXE9rMj8hA53tc7FlyACQ\n"
+"pqe4U/GSTyoCUmPvdiiKc2SlM7JpiBtujUfIrIGyoPamsYodtQspdEeGzJaoSTwd\n"
+"H9OJAmCRYIUrkAyE9XKediKkN7I7goQ0bbEUPMLCBuYGlaLmi6mjsdkXgBYDCfdl\n"
+"Lp5y93zATlDCNfFtFnpaNsdCiGGRiLQKZOGEfsySa3DSMqXy+CUkv51VVkPf2i9D\n"
+"Qx6gF4XphsJU9W0S+vjSCAFQ6e6zdAKduVLaTRrw29s11uNGdFebcMMPxGlGsNOd\n"
+"jQAAAAAAAA==\n"
+"-----END SIGNED MESSAGE-----\n";
 
 
 static void
 check_result (gpgme_verify_result_t result, int summary, const char *fpr,
-             gpgme_error_t status, gpgme_validity_t validity)
+              const char *issuer_serial, const char *issuer_name,
+             gpgme_error_t status, gpgme_validity_t validity,
+              unsigned long timestamp)
 {
   gpgme_signature_t sig;
 
@@ -73,10 +96,22 @@
               __FILE__, __LINE__, summary, sig->summary);
       got_errors = 1;
     }
-  if (sig->fpr && strcmp (sig->fpr, fpr))
+  if (safe_strcmp (sig->fpr, fpr))
     {
       fprintf (stderr, "%s:%i: Unexpected fingerprint: %s\n",
-              __FILE__, __LINE__, sig->fpr);
+              __FILE__, __LINE__, nonnull (sig->fpr));
+      got_errors = 1;
+    }
+  if (safe_strcmp (sig->issuer_serial, issuer_serial))
+    {
+      fprintf (stderr, "%s:%i: Unexpected s/n: %s\n",
+              __FILE__, __LINE__, nonnull (sig->issuer_serial));
+      got_errors = 1;
+    }
+  if (safe_strcmp (sig->issuer_name, issuer_name))
+    {
+      fprintf (stderr, "%s:%i: Unexpected issuer: %s\n",
+              __FILE__, __LINE__, nonnull (sig->issuer_name));
       got_errors = 1;
     }
   if (gpgme_err_code (sig->status) != status)
@@ -109,6 +144,13 @@
               __FILE__, __LINE__, gpgme_strerror (sig->validity_reason));
       got_errors = 1;
     }
+  if (sig->timestamp != timestamp)
+    {
+     fprintf (stderr, "%s:%i: Unexpected timestamp: "
+              "want=%li have=%li\n",
+             __FILE__, __LINE__, timestamp, sig->timestamp);
+      exit (1);
+    }
 }
 
 
@@ -158,8 +200,8 @@
   fail_if_err (err);
   result = gpgme_op_verify_result (ctx);
   check_result (result, GPGME_SIGSUM_VALID | GPGME_SIGSUM_GREEN,
-               "3CF405464F66ED4A7DF45BBDD1E4282E33BDB76E",
-               GPG_ERR_NO_ERROR, GPGME_VALIDITY_FULL);
+               "3CF405464F66ED4A7DF45BBDD1E4282E33BDB76E", NULL, NULL,
+               GPG_ERR_NO_ERROR, GPGME_VALIDITY_FULL, 0);
 
   show_auditlog (ctx);
 
@@ -172,13 +214,38 @@
   fail_if_err (err);
   result = gpgme_op_verify_result (ctx);
   check_result (result, GPGME_SIGSUM_RED,
-               "3CF405464F66ED4A7DF45BBDD1E4282E33BDB76E",
-               GPG_ERR_BAD_SIGNATURE, GPGME_VALIDITY_UNKNOWN);
+               "3CF405464F66ED4A7DF45BBDD1E4282E33BDB76E", NULL, NULL,
+               GPG_ERR_BAD_SIGNATURE, GPGME_VALIDITY_UNKNOWN, 0);
+
+  show_auditlog (ctx);
+
+  /* Checking a message without embedded signing certificate.  */
+  gpgme_data_release (sig);
+  gpgme_data_release (text);
+  err = gpgme_data_new_from_mem (&sig, test_opaque_without_cert,
+                                 strlen (test_opaque_without_cert), 0);
+  fail_if_err (err);
+  err = gpgme_data_new (&text);
+  fail_if_err (err);
+  err = gpgme_op_verify (ctx, sig, NULL, text);
+  fail_if_err (err);
+  result = gpgme_op_verify_result (ctx);
+  if (have_gpgsm_version ("2.5.22"))
+    check_result (result, GPGME_SIGSUM_KEY_MISSING,
+                 NULL, "1A03",
+                 "1.2.840.113549.1.9.1=#696E666F40673130636F64652E636F6D,"
+                 "CN=g10 Code TEST CA 2019,OU=Testlab,O=g10 Code GmbH,C=DE",
+                 GPG_ERR_NO_PUBKEY, GPGME_VALIDITY_UNKNOWN, 0);
+  else
+    check_result (result, GPGME_SIGSUM_KEY_MISSING,
+                 NULL, NULL, NULL,
+                 GPG_ERR_NO_PUBKEY, GPGME_VALIDITY_UNKNOWN, 0);
 
   show_auditlog (ctx);
 
   gpgme_data_release (text);
   gpgme_data_release (sig);
   gpgme_release (ctx);
+
   return got_errors? 1 : 0;
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gpgme-2.1.2/tests/run-verify.c 
new/gpgme-2.2.0/tests/run-verify.c
--- old/gpgme-2.1.2/tests/run-verify.c  2025-05-05 16:32:11.000000000 +0200
+++ new/gpgme-2.2.0/tests/run-verify.c  2026-08-31 14:25:10.000000000 +0200
@@ -145,6 +145,8 @@
       printf ("  status ....: %s\n", gpgme_strerror (sig->status));
       printf ("  summary ...:"); print_summary (sig->summary); putchar ('\n');
       printf ("  fingerprint: %s\n", nonnull (sig->fpr));
+      printf ("  s/n .......: %s\n", nonnull (sig->issuer_serial));
+      printf ("  issuer ....: %s\n", nonnull (sig->issuer_name));
       printf ("  created ...: %lu\n", sig->timestamp);
       printf ("  expires ...: %lu\n", sig->exp_timestamp);
       printf ("  validity ..: ");

Reply via email to