aboutsummaryrefslogtreecommitdiffstats
path: root/tests/gpgsm
diff options
context:
space:
mode:
authorIngo Klöcker <[email protected]>2026-08-05 14:41:33 +0200
committerIngo Klöcker <[email protected]>2026-08-05 14:41:33 +0200
commitecffd0c9a7ec00a156443d6d8d253da09c0cf23b (patch)
tree7f8be0ca77101488e43b36688e769ef11207b809 /tests/gpgsm
parentFix handling of missing timestamp in SIGINFO status (diff)
downloadgpgme-ecffd0c9a7ec00a156443d6d8d253da09c0cf23b.tar.gz
gpgme-ecffd0c9a7ec00a156443d6d8d253da09c0cf23b.zip
tests: Add test to check issuer serial number and issuer name
* 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. -- GnuPG-bug-id: 8369
Diffstat (limited to 'tests/gpgsm')
-rw-r--r--tests/gpgsm/Makefile.am2
-rw-r--r--tests/gpgsm/cms-decrypt.c7
-rw-r--r--tests/gpgsm/cms-keylist.c7
-rw-r--r--tests/gpgsm/t-support.h62
-rw-r--r--tests/gpgsm/t-verify.c67
5 files changed, 126 insertions, 19 deletions
diff --git a/tests/gpgsm/Makefile.am b/tests/gpgsm/Makefile.am
index 6ce8e339..a0893a14 100644
--- a/tests/gpgsm/Makefile.am
+++ b/tests/gpgsm/Makefile.am
@@ -38,7 +38,7 @@ EXTRA_DIST = cert_dfn_pca01.der cert_dfn_pca15.der cert_g10code_test1.der \
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 --git a/tests/gpgsm/cms-decrypt.c b/tests/gpgsm/cms-decrypt.c
index c3426bb2..aa8fd709 100644
--- a/tests/gpgsm/cms-decrypt.c
+++ b/tests/gpgsm/cms-decrypt.c
@@ -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 --git a/tests/gpgsm/cms-keylist.c b/tests/gpgsm/cms-keylist.c
index 1995af30..9b1b7e88 100644
--- a/tests/gpgsm/cms-keylist.c
+++ b/tests/gpgsm/cms-keylist.c
@@ -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 --git a/tests/gpgsm/t-support.h b/tests/gpgsm/t-support.h
index fe65364f..dcb03f23 100644
--- a/tests/gpgsm/t-support.h
+++ b/tests/gpgsm/t-support.h
@@ -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 @@ init_gpgme (gpgme_protocol_t proto)
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 --git a/tests/gpgsm/t-verify.c b/tests/gpgsm/t-verify.c
index 681ab02d..0826c2ff 100644
--- a/tests/gpgsm/t-verify.c
+++ b/tests/gpgsm/t-verify.c
@@ -49,10 +49,32 @@ static const char test_sig1[] =
"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,
+ const char *issuer_serial, const char *issuer_name,
gpgme_error_t status, gpgme_validity_t validity,
unsigned long timestamp)
{
@@ -74,10 +96,22 @@ check_result (gpgme_verify_result_t result, int summary, const char *fpr,
__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)
@@ -166,7 +200,7 @@ main (void)
fail_if_err (err);
result = gpgme_op_verify_result (ctx);
check_result (result, GPGME_SIGSUM_VALID | GPGME_SIGSUM_GREEN,
- "3CF405464F66ED4A7DF45BBDD1E4282E33BDB76E",
+ "3CF405464F66ED4A7DF45BBDD1E4282E33BDB76E", NULL, NULL,
GPG_ERR_NO_ERROR, GPGME_VALIDITY_FULL, 0);
show_auditlog (ctx);
@@ -180,13 +214,38 @@ main (void)
fail_if_err (err);
result = gpgme_op_verify_result (ctx);
check_result (result, GPGME_SIGSUM_RED,
- "3CF405464F66ED4A7DF45BBDD1E4282E33BDB76E",
+ "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;
}