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 ..: ");
