1 /* t-verify.c - Regression test.
2 Copyright (C) 2000 Werner Koch (dd9jn)
3 Copyright (C) 2001, 2002, 2003, 2004 g10 Code GmbH
5 This file is part of GPGME.
7 GPGME is free software; you can redistribute it and/or modify it
8 under the terms of the GNU Lesser General Public License as
9 published by the Free Software Foundation; either version 2.1 of
10 the License, or (at your option) any later version.
12 GPGME is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public
18 License along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
22 /* We need to include config.h so that we know whether we are building
23 with large file system (LFS) support. */
34 #include "t-support.h"
37 static const char test_text1[] = "Just GNU it!\n";
38 static const char test_text1f[]= "Just GNU it?\n";
39 static const char test_sig1[] =
41 "-----BEGIN PGP SIGNATURE-----\n"
43 "iEYEABECAAYFAjoKgjIACgkQLXJ8x2hpdzQMSwCeO/xUrhysZ7zJKPf/FyXA//u1\n"
44 "ZgIAn0204PBR7yxSdQx6CFxugstNqmRv\n"
46 "-----END PGP SIGNATURE-----\n"
48 "-----BEGIN PGP SIGNATURE-----\n"
49 "Version: GnuPG v1.0.4-2 (GNU/Linux)\n"
50 "Comment: For info see http://www.gnupg.org\n"
52 "iJcEABECAFcFAjoS8/E1FIAAAAAACAAkZm9vYmFyLjF0aGlzIGlzIGEgbm90YXRp\n"
53 "b24gZGF0YSB3aXRoIDIgbGluZXMaGmh0dHA6Ly93d3cuZ3Uub3JnL3BvbGljeS8A\n"
54 "CgkQLXJ8x2hpdzQLyQCbBW/fgU8ZeWSlWPM1F8umHX17bAAAoIfSNDSp5zM85XcG\n"
57 "-----END PGP SIGNATURE-----\n"
59 "-----BEGIN PGP SIGNATURE-----\n"
61 "iN0EABECAJ0FAjoS+i9FFIAAAAAAAwA5YmFyw7bDpMO8w58gZGFzIHdhcmVuIFVt\n"
62 "bGF1dGUgdW5kIGpldHp0IGVpbiBwcm96ZW50JS1aZWljaGVuNRSAAAAAAAgAJGZv\n"
63 "b2Jhci4xdGhpcyBpcyBhIG5vdGF0aW9uIGRhdGEgd2l0aCAyIGxpbmVzGhpodHRw\n"
64 "Oi8vd3d3Lmd1Lm9yZy9wb2xpY3kvAAoJEC1yfMdoaXc0JBIAoIiLlUsvpMDOyGEc\n"
65 "dADGKXF/Hcb+AKCJWPphZCphduxSvrzH0hgzHdeQaA==\n"
67 "-----END PGP SIGNATURE-----\n"
70 static const char test_sig2[] =
71 "-----BEGIN PGP MESSAGE-----\n"
73 "owGbwMvMwCSoW1RzPCOz3IRxjXQSR0lqcYleSUWJTZOvjVdpcYmCu1+oQmaJIleH\n"
74 "GwuDIBMDGysTSIqBi1MApi+nlGGuwDeHao53HBr+FoVGP3xX+kvuu9fCMJvl6IOf\n"
75 "y1kvP4y+8D5a11ang0udywsA\n"
77 "-----END PGP MESSAGE-----\n";
79 /* A message with a prepended but unsigned plaintext packet. */
80 static const char double_plaintext_sig[] =
81 "-----BEGIN PGP MESSAGE-----\n"
83 "rDRiCmZvb2Jhci50eHRF4pxNVGhpcyBpcyBteSBzbmVha3kgcGxhaW50ZXh0IG1l\n"
84 "c3NhZ2UKowGbwMvMwCSoW1RzPCOz3IRxTWISa6JebnG666MFD1wzSzJSixQ81XMV\n"
85 "UlITUxTyixRyKxXKE0uSMxQyEosVikvyCwpSU/S4FNCArq6Ce1F+aXJGvoJvYlGF\n"
86 "erFCTmJxiUJ5flFKMVeHGwuDIBMDGysTyA4GLk4BmO036xgWzMgzt9V85jCtfDFn\n"
87 "UqVooWlGXHwNw/xg/fVzt9VNbtjtJ/fhUqYo0/LyCGEA\n"
89 "-----END PGP MESSAGE-----\n";
95 check_result (gpgme_verify_result_t result, unsigned int summary,
97 gpgme_error_t status, int notation)
99 gpgme_signature_t sig;
101 sig = result->signatures;
102 if (!sig || sig->next)
104 fprintf (stderr, "%s:%i: Unexpected number of signatures\n",
108 if (sig->summary != summary)
110 fprintf (stderr, "%s:%i: Unexpected signature summary: "
111 "want=0x%x have=0x%x\n",
112 __FILE__, __LINE__, summary, sig->summary);
115 if (strcmp (sig->fpr, fpr))
117 fprintf (stderr, "%s:%i: Unexpected fingerprint: %s\n",
118 __FILE__, __LINE__, sig->fpr);
121 if (gpgme_err_code (sig->status) != status)
123 fprintf (stderr, "%s:%i: Unexpected signature status: %s\n",
124 __FILE__, __LINE__, gpgme_strerror (sig->status));
133 } expected_notations[] = {
135 "\xc3\xb6\xc3\xa4\xc3\xbc\xc3\x9f"
136 " das waren Umlaute und jetzt ein prozent%-Zeichen" },
138 "this is a notation data with 2 lines" },
140 "http://www.gu.org/policy/" }
143 gpgme_sig_notation_t r;
145 for (i=0; i < DIM(expected_notations); i++ )
146 expected_notations[i].seen = 0;
148 for (r = sig->notations; r; r = r->next)
151 for (i=0; i < DIM(expected_notations); i++)
153 if ( ((r->name && expected_notations[i].name
154 && !strcmp (r->name, expected_notations[i].name)
156 == strlen (expected_notations[i].name))
157 || (!r->name && !expected_notations[i].name
158 && r->name_len == 0))
160 && !strcmp (r->value, expected_notations[i].value)
161 && r->value_len == strlen (expected_notations[i].value))
163 expected_notations[i].seen++;
169 fprintf (stderr, "%s:%i: Unexpected notation data\n",
174 for (i=0; i < DIM(expected_notations); i++ )
176 if (expected_notations[i].seen != 1)
178 fprintf (stderr, "%s:%i: Missing or duplicate notation data\n",
184 if (sig->wrong_key_usage)
186 fprintf (stderr, "%s:%i: Unexpectedly wrong key usage\n",
190 if (sig->validity != GPGME_VALIDITY_UNKNOWN)
192 fprintf (stderr, "%s:%i: Unexpected validity: %i\n",
193 __FILE__, __LINE__, sig->validity);
196 if (gpgme_err_code (sig->validity_reason) != GPG_ERR_NO_ERROR)
198 fprintf (stderr, "%s:%i: Unexpected validity reason: %s\n",
199 __FILE__, __LINE__, gpgme_strerror (sig->validity_reason));
206 main (int argc, char *argv[])
210 gpgme_data_t sig, text;
211 gpgme_verify_result_t result;
217 init_gpgme (GPGME_PROTOCOL_OpenPGP);
219 err = gpgme_new (&ctx);
222 /* Checking a valid message. */
223 err = gpgme_data_new_from_mem (&text, test_text1, strlen (test_text1), 0);
225 err = gpgme_data_new_from_mem (&sig, test_sig1, strlen (test_sig1), 0);
227 err = gpgme_op_verify (ctx, sig, text, NULL);
229 result = gpgme_op_verify_result (ctx);
230 check_result (result, 0, "A0FF4590BB6122EDEF6E3C542D727CC768697734",
231 GPG_ERR_NO_ERROR, 1);
233 /* Checking a manipulated message. */
234 gpgme_data_release (text);
235 err = gpgme_data_new_from_mem (&text, test_text1f, strlen (test_text1f), 0);
237 gpgme_data_seek (sig, 0, SEEK_SET);
238 err = gpgme_op_verify (ctx, sig, text, NULL);
240 result = gpgme_op_verify_result (ctx);
241 check_result (result, GPGME_SIGSUM_RED, "2D727CC768697734",
242 GPG_ERR_BAD_SIGNATURE, 0);
244 /* Checking a normal signature. */
245 gpgme_data_release (sig);
246 gpgme_data_release (text);
247 err = gpgme_data_new_from_mem (&sig, test_sig2, strlen (test_sig2), 0);
249 err = gpgme_data_new (&text);
251 err = gpgme_op_verify (ctx, sig, NULL, text);
253 result = gpgme_op_verify_result (ctx);
254 check_result (result, 0, "A0FF4590BB6122EDEF6E3C542D727CC768697734",
255 GPG_ERR_NO_ERROR, 0);
258 /* Checking an invalid message. */
259 gpgme_data_release (sig);
260 gpgme_data_release (text);
261 err = gpgme_data_new_from_mem (&sig, double_plaintext_sig,
262 strlen (double_plaintext_sig), 0);
264 err = gpgme_data_new (&text);
266 err = gpgme_op_verify (ctx, sig, NULL, text);
267 if (gpgme_err_code (err) != GPG_ERR_BAD_DATA)
269 fprintf (stderr, "%s:%i: Double plaintext message not detected\n",
274 /* Checking that set/get_sernder works. */
275 err = gpgme_set_sender (ctx, "foo@example.org");
277 s = gpgme_get_sender (ctx);
278 if (!s || strcmp (s, "foo@example.org"))
280 fprintf (stderr, "%s:%i: gpgme_{set,get}_sender mismatch\n",
285 err = gpgme_set_sender (ctx, "<bar@example.org>");
287 s = gpgme_get_sender (ctx);
288 if (!s || strcmp (s, "bar@example.org"))
290 fprintf (stderr, "%s:%i: gpgme_{set,get}_sender mismatch\n",
295 err = gpgme_set_sender (ctx, "Foo bar (comment) <foo@example.org>");
297 s = gpgme_get_sender (ctx);
298 if (!s || strcmp (s, "foo@example.org"))
300 fprintf (stderr, "%s:%i: gpgme_{set,get}_sender mismatch\n",
305 err = gpgme_set_sender (ctx, "foo");
306 if (gpgme_err_code (err) != GPG_ERR_INV_VALUE)
308 fprintf (stderr, "%s:%i: gpgme_set_sender didn't detect bogus address\n",
312 /* (the former address should still be there.) */
313 s = gpgme_get_sender (ctx);
314 if (!s || strcmp (s, "foo@example.org"))
316 fprintf (stderr, "%s:%i: gpgme_{set,get}_sender mismatch\n",
322 gpgme_data_release (sig);
323 gpgme_data_release (text);