diff options
Diffstat (limited to 'tests/gpgsm')
| -rw-r--r-- | tests/gpgsm/Makefile.am | 2 | ||||
| -rw-r--r-- | tests/gpgsm/cms-decrypt.c | 7 | ||||
| -rw-r--r-- | tests/gpgsm/cms-keylist.c | 7 | ||||
| -rw-r--r-- | tests/gpgsm/t-support.h | 62 | ||||
| -rw-r--r-- | tests/gpgsm/t-verify.c | 67 |
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; } |
