diff options
Diffstat (limited to '')
-rw-r--r-- | tests/gpgsm/t-verify.c | 305 |
1 files changed, 102 insertions, 203 deletions
diff --git a/tests/gpgsm/t-verify.c b/tests/gpgsm/t-verify.c index 282cf2b8..48e0ce96 100644 --- a/tests/gpgsm/t-verify.c +++ b/tests/gpgsm/t-verify.c @@ -1,6 +1,6 @@ -/* t-verify.c - regression test +/* t-verify.c - Regression test. Copyright (C) 2000 Werner Koch (dd9jn) - Copyright (C) 2001, 2002 g10 Code GmbH + Copyright (C) 2001, 2002, 2003 g10 Code GmbH This file is part of GPGME. @@ -18,13 +18,26 @@ along with GPGME; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include <stdio.h> #include <stdlib.h> +#include <stdio.h> #include <string.h> -#include <assert.h> #include <gpgme.h> + +#define fail_if_err(err) \ + do \ + { \ + if (err) \ + { \ + fprintf (stderr, "%s:%d: GpgmeError %s\n", \ + __FILE__, __LINE__, gpgme_strerror (err)); \ + exit (1); \ + } \ + } \ + while (0) + + static const char test_text1[] = "Hallo Leute!\n"; static const char test_text1f[]= "Hallo Leute?\n"; static const char test_sig1[] = @@ -39,217 +52,103 @@ static const char test_sig1[] = "MYdRclgjObCcoilA8fZ13VR4DiMJVFCxJL4qVWI=\n" "-----END CMS OBJECT-----\n"; -#define fail_if_err(a) do { if(a) { \ - fprintf (stderr, "%s:%d: GpgmeError %s\n", \ - __FILE__, __LINE__, gpgme_strerror(a)); \ - exit (1); } \ - } while(0) - -static const char * -status_string (GpgmeSigStat status) +static void +check_result (GpgmeVerifyResult result, int summary, char *fpr, + GpgmeError status, GpgmeValidity validity) { - const char *s = "?"; + GpgmeSignature sig; - switch ( status ) { - case GPGME_SIG_STAT_NONE: - s = "None"; - break; - case GPGME_SIG_STAT_NOSIG: - s = "No Signature"; - break; - case GPGME_SIG_STAT_GOOD: - s = "Good"; - break; - case GPGME_SIG_STAT_GOOD_EXP: - s = "Good but expired"; - break; - case GPGME_SIG_STAT_GOOD_EXPKEY: - s = "Good but key exipired"; - break; - case GPGME_SIG_STAT_BAD: - s = "Bad"; - break; - case GPGME_SIG_STAT_NOKEY: - s = "No Key"; - break; - case GPGME_SIG_STAT_ERROR: - s = "Error"; - break; - case GPGME_SIG_STAT_DIFF: - s = "More than one signature"; - break; + sig = result->signatures; + if (!sig || sig->next) + { + fprintf (stderr, "%s:%i: Unexpected number of signatures\n", + __FILE__, __LINE__); + exit (1); } - return s; -} - -static const char * -validity_string (GpgmeValidity val) -{ - const char *s = "?"; - - switch (val) + if (sig->summary != summary) { - case GPGME_VALIDITY_UNKNOWN: s = "unknown"; break; - case GPGME_VALIDITY_NEVER: s = "not trusted"; break; - case GPGME_VALIDITY_MARGINAL:s = "marginal trusted"; break; - case GPGME_VALIDITY_FULL: s = "fully trusted"; break; - case GPGME_VALIDITY_UNDEFINED: - case GPGME_VALIDITY_ULTIMATE: - break; + fprintf (stderr, "%s:%i: Unexpected signature summary: 0x%x\n", + __FILE__, __LINE__, sig->summary); + exit (1); } - return s; -} - - -static void -print_sig_stat ( GpgmeCtx ctx, GpgmeSigStat status ) -{ - const char *s; - time_t created; - int idx; - GpgmeKey key; - - printf ("Verification Status: %s\n", status_string (status)); - - for (idx=0; (s=gpgme_get_sig_status (ctx, idx, &status, &created)); idx++ ) + if (strcmp (sig->fpr, fpr)) { - unsigned long sum; - - printf ("sig %d: created: %lu expires: %lu status: %s\n", - idx, (unsigned long)created, - gpgme_get_sig_ulong_attr (ctx, idx, GPGME_ATTR_EXPIRE, 0), - status_string(status) ); - printf ("sig %d: fpr/keyid: `%s' exterr: `%s' validity: %s\n", - idx, s, - gpgme_get_sig_string_attr (ctx, idx, GPGME_ATTR_ERRTOK, 0), - validity_string (gpgme_get_sig_ulong_attr - (ctx, idx, GPGME_ATTR_VALIDITY, 0)) ); - - sum = gpgme_get_sig_ulong_attr (ctx, idx, GPGME_ATTR_SIG_SUMMARY, 0); - fputs ("summary:", stdout); - if ((sum & GPGME_SIGSUM_VALID)) - fputs (" valid", stdout); - if ((sum & GPGME_SIGSUM_GREEN)) - fputs (" green", stdout); - if ((sum & GPGME_SIGSUM_RED)) - fputs (" red", stdout); - if ((sum & GPGME_SIGSUM_KEY_REVOKED)) - fputs (" keyRevoked", stdout); - if ((sum & GPGME_SIGSUM_KEY_EXPIRED)) - fputs (" keyExpired", stdout); - if ((sum & GPGME_SIGSUM_SIG_EXPIRED)) - fputs (" sigExpired", stdout); - if ((sum & GPGME_SIGSUM_KEY_MISSING)) - fputs (" keyMissing", stdout); - if ((sum & GPGME_SIGSUM_CRL_MISSING)) - fputs (" crlMissing", stdout); - if ((sum & GPGME_SIGSUM_CRL_TOO_OLD)) - fputs (" crlTooOld", stdout); - if ((sum & GPGME_SIGSUM_BAD_POLICY)) - fputs (" badPolicy", stdout); - if ((sum & GPGME_SIGSUM_SYS_ERROR)) - fputs (" sysError", stdout); - putchar ('\n'); - - if ( !gpgme_get_sig_key (ctx, idx, &key) ) - { - char *p = gpgme_key_get_as_xml ( key ); - printf ("sig %d: key object:\n%s\n", idx, p ); - free (p); - gpgme_key_release (key); - } + fprintf (stderr, "%s:%i: Unexpected fingerprint: %s\n", + __FILE__, __LINE__, sig->fpr); + exit (1); + } + if (sig->status != status) + { + fprintf (stderr, "%s:%i: Unexpected signature status: %s\n", + __FILE__, __LINE__, gpgme_strerror (sig->status)); + exit (1); + } + if (sig->notations) + { + fprintf (stderr, "%s:%i: Unexpected notation data\n", + __FILE__, __LINE__); + exit (1); + } + if (sig->wrong_key_usage) + { + fprintf (stderr, "%s:%i: Unexpectedly wrong key usage\n", + __FILE__, __LINE__); + exit (1); + } + if (sig->validity != validity) + { + fprintf (stderr, "%s:%i: Unexpected validity: %i\n", + __FILE__, __LINE__, sig->validity); + exit (1); + } + if (sig->validity_reason != GPGME_No_Error) + { + fprintf (stderr, "%s:%i: Unexpected validity reason: %s\n", + __FILE__, __LINE__, gpgme_strerror (sig->validity_reason)); + exit (1); } } + int -main (int argc, char **argv ) +main (int argc, char **argv) { - GpgmeCtx ctx; - GpgmeError err; - GpgmeData sig, text; - GpgmeSigStat status; - GpgmeVerifyResult result; - GpgmeSigNotation notation; - char *nota; - int n = 0; - - err = gpgme_new (&ctx); - fail_if_err (err); - gpgme_set_protocol (ctx, GPGME_PROTOCOL_CMS); - - do { - err = gpgme_data_new_from_mem ( &text, - test_text1, strlen (test_text1), 0 ); - fail_if_err (err); - err = gpgme_data_new_from_mem ( &sig, - test_sig1, strlen (test_sig1), 0 ); - fail_if_err (err); - - puts ("checking a valid message:\n"); - err = gpgme_op_verify (ctx, sig, text, NULL); - fail_if_err (err); - if (!gpgme_get_sig_status (ctx, 0, &status, NULL)) - { - fprintf (stderr, "%s:%d: No signature\n", __FILE__, __LINE__); - exit (1); - } - print_sig_stat (ctx, status); - - result = gpgme_op_verify_result (ctx); - notation = result->signatures->notations; - if (notation) - { - printf ("---Begin Notation---\n"); - while (notation) - { - if (notation->name) - printf ("%s: %s\n", notation->name, notation->value); - else - printf ("Policy URL: %s\n", notation->value); - notation = notation->next; - } - printf ("---End Notation---\n"); - } - - puts ("checking a manipulated message:\n"); - gpgme_data_release (text); - err = gpgme_data_new_from_mem ( &text, - test_text1f, strlen (test_text1f), 0); - fail_if_err (err); - gpgme_data_rewind ( sig ); - err = gpgme_op_verify (ctx, sig, text, NULL); - fail_if_err (err); - if (!gpgme_get_sig_status (ctx, 0, &status, NULL)) - { - fprintf (stderr, "%s:%d: No signature\n", __FILE__, __LINE__); - exit (1); - } - print_sig_stat (ctx, status); - - result = gpgme_op_verify_result (ctx); - notation = result->signatures->notations; - if (notation) - { - printf ("---Begin Notation---\n"); - while (notation) - { - if (notation->name) - printf ("%s: %s\n", notation->name, notation->value); - else - printf ("Policy URL: %s\n", notation->value); - notation = notation->next; - } - printf ("---End Notation---\n"); - } - - gpgme_data_release (sig); - gpgme_data_release (text); - - } while ( argc > 1 && !strcmp( argv[1], "--loop" ) && ++n < 20 ); - gpgme_release (ctx); - - return 0; + GpgmeCtx ctx; + GpgmeError err; + GpgmeData sig, text; + GpgmeVerifyResult result; + + err = gpgme_new (&ctx); + fail_if_err (err); + gpgme_set_protocol (ctx, GPGME_PROTOCOL_CMS); + + /* Checking a valid message. */ + err = gpgme_data_new_from_mem (&text, test_text1, strlen (test_text1), 0); + fail_if_err (err); + err = gpgme_data_new_from_mem (&sig, test_sig1, strlen (test_sig1), 0); + fail_if_err (err); + err = gpgme_op_verify (ctx, sig, text, NULL); + fail_if_err (err); + result = gpgme_op_verify_result (ctx); + check_result (result, GPGME_SIGSUM_VALID | GPGME_SIGSUM_GREEN, + "3CF405464F66ED4A7DF45BBDD1E4282E33BDB76E", + GPGME_No_Error, GPGME_VALIDITY_FULL); + + /* Checking a manipulated message. */ + gpgme_data_release (text); + err = gpgme_data_new_from_mem (&text, test_text1f, strlen (test_text1f), 0); + fail_if_err (err); + gpgme_data_rewind (sig); + err = gpgme_op_verify (ctx, sig, text, NULL); + fail_if_err (err); + result = gpgme_op_verify_result (ctx); + check_result (result, GPGME_SIGSUM_RED, + "3CF405464F66ED4A7DF45BBDD1E4282E33BDB76E", + GPGME_Bad_Signature, GPGME_VALIDITY_UNKNOWN); + + gpgme_release (ctx); + return 0; } |