28b43046d46dec35462feff6a2151b04efd6311f
[gpgme.git] / tests / gpg / t-verify.c
1 /* t-verify.c - Regression test.
2    Copyright (C) 2000 Werner Koch (dd9jn)
3    Copyright (C) 2001, 2002, 2003 g10 Code GmbH
4
5    This file is part of GPGME.
6  
7    GPGME is free software; you can redistribute it and/or modify it
8    under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11  
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    General Public License for more details.
16  
17    You should have received a copy of the GNU General Public License
18    along with GPGME; if not, write to the Free Software Foundation,
19    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
20
21 #include <stdlib.h>
22 #include <stdio.h>
23 #include <string.h>
24
25 #include <gpgme.h>
26
27 \f
28 #define fail_if_err(err)                                        \
29   do                                                            \
30     {                                                           \
31       if (err)                                                  \
32         {                                                       \
33           fprintf (stderr, "%s:%d: GpgmeError %s\n",            \
34                    __FILE__, __LINE__, gpgme_strerror (err));   \
35           exit (1);                                             \
36         }                                                       \
37     }                                                           \
38   while (0)
39
40 \f
41 static const char test_text1[] = "Just GNU it!\n";
42 static const char test_text1f[]= "Just GNU it?\n";
43 static const char test_sig1[] =
44 #if 0
45 "-----BEGIN PGP SIGNATURE-----\n"
46 "\n"
47 "iEYEABECAAYFAjoKgjIACgkQLXJ8x2hpdzQMSwCeO/xUrhysZ7zJKPf/FyXA//u1\n"
48 "ZgIAn0204PBR7yxSdQx6CFxugstNqmRv\n"
49 "=yku6\n"
50 "-----END PGP SIGNATURE-----\n"
51 #elif 0
52 "-----BEGIN PGP SIGNATURE-----\n"
53 "Version: GnuPG v1.0.4-2 (GNU/Linux)\n"
54 "Comment: For info see http://www.gnupg.org\n"
55 "\n"
56 "iJcEABECAFcFAjoS8/E1FIAAAAAACAAkZm9vYmFyLjF0aGlzIGlzIGEgbm90YXRp\n"
57 "b24gZGF0YSB3aXRoIDIgbGluZXMaGmh0dHA6Ly93d3cuZ3Uub3JnL3BvbGljeS8A\n"
58 "CgkQLXJ8x2hpdzQLyQCbBW/fgU8ZeWSlWPM1F8umHX17bAAAoIfSNDSp5zM85XcG\n"
59 "iwxMrf+u8v4r\n"
60 "=88Zo\n"
61 "-----END PGP SIGNATURE-----\n"
62 #elif 1
63 "-----BEGIN PGP SIGNATURE-----\n"
64 "\n"
65 "iN0EABECAJ0FAjoS+i9FFIAAAAAAAwA5YmFyw7bDpMO8w58gZGFzIHdhcmVuIFVt\n"
66 "bGF1dGUgdW5kIGpldHp0IGVpbiBwcm96ZW50JS1aZWljaGVuNRSAAAAAAAgAJGZv\n"
67 "b2Jhci4xdGhpcyBpcyBhIG5vdGF0aW9uIGRhdGEgd2l0aCAyIGxpbmVzGhpodHRw\n"
68 "Oi8vd3d3Lmd1Lm9yZy9wb2xpY3kvAAoJEC1yfMdoaXc0JBIAoIiLlUsvpMDOyGEc\n"
69 "dADGKXF/Hcb+AKCJWPphZCphduxSvrzH0hgzHdeQaA==\n"
70 "=nts1\n"
71 "-----END PGP SIGNATURE-----\n"
72 #endif
73 ;
74 static const char test_sig2[] =
75 "-----BEGIN PGP MESSAGE-----\n"
76 "\n"
77 "owGbwMvMwCSoW1RzPCOz3IRxjXQSR0lqcYleSUWJTZOvjVdpcYmCu1+oQmaJIleH\n"
78 "GwuDIBMDGysTSIqBi1MApi+nlGGuwDeHao53HBr+FoVGP3xX+kvuu9fCMJvl6IOf\n"
79 "y1kvP4y+8D5a11ang0udywsA\n"
80 "=Crq6\n"
81 "-----END PGP MESSAGE-----\n";
82
83
84 static void
85 check_result (GpgmeVerifyResult result, int summary, char *fpr,
86               GpgmeError status, int notation)
87 {
88   GpgmeSignature sig;
89
90   sig = result->signatures;
91   if (!sig || sig->next)
92     {
93       fprintf (stderr, "%s:%i: Unexpected number of signatures\n",
94                __FILE__, __LINE__);
95       exit (1);
96     }
97   if (sig->summary != summary)
98     {
99       fprintf (stderr, "%s:%i: Unexpected signature summary: 0x%x\n",
100                __FILE__, __LINE__, sig->summary);
101       exit (1);
102     }
103   if (strcmp (sig->fpr, fpr))
104     {
105       fprintf (stderr, "%s:%i: Unexpected fingerprint: %s\n",
106                __FILE__, __LINE__, sig->fpr);
107       exit (1);
108     }
109   if (sig->status != status)
110     {
111       fprintf (stderr, "%s:%i: Unexpected signature status: %s\n",
112                __FILE__, __LINE__, gpgme_strerror (sig->status));
113       exit (1);
114     }
115   if (notation)
116     {
117       if (!sig->notations
118           || strcmp (sig->notations->name, "bar")
119           || strcmp (sig->notations->value, "\xc3\xb6\xc3\xa4\xc3\xbc\xc3\x9f"
120                      " das waren Umlaute und jetzt ein prozent%-Zeichen")
121           || !sig->notations->next
122           || strcmp (sig->notations->next->name, "foobar.1")
123           || strcmp (sig->notations->next->value,
124                      "this is a notation data with 2 lines")
125           || !sig->notations->next->next
126           || sig->notations->next->next->name != NULL
127           || strcmp (sig->notations->next->next->value,
128                      "http://www.gu.org/policy/")
129           || sig->notations->next->next->next)
130         {
131           fprintf (stderr, "%s:%i: Unexpected notation data\n",
132                    __FILE__, __LINE__);
133           exit (1);
134         }
135     }
136   if (sig->wrong_key_usage)
137     {
138       fprintf (stderr, "%s:%i: Unexpectedly wrong key usage\n",
139                __FILE__, __LINE__);
140       exit (1);
141     }
142   if (sig->validity != GPGME_VALIDITY_UNKNOWN)
143     {
144       fprintf (stderr, "%s:%i: Unexpected validity: %i\n",
145                __FILE__, __LINE__, sig->validity);
146       exit (1);
147     }
148   if (sig->validity_reason != GPGME_No_Error)
149     {
150       fprintf (stderr, "%s:%i: Unexpected validity reason: %s\n",
151                __FILE__, __LINE__, gpgme_strerror (sig->validity_reason));
152       exit (1);
153     }
154 }
155
156
157 int 
158 main (int argc, char *argv[])
159 {
160   GpgmeCtx ctx;
161   GpgmeError err;
162   GpgmeData sig, text;
163   GpgmeVerifyResult result;
164
165   err = gpgme_new (&ctx);
166   fail_if_err (err);
167
168   /* Checking a valid message.  */
169   err = gpgme_data_new_from_mem (&text, test_text1, strlen (test_text1), 0);
170   fail_if_err (err);
171   err = gpgme_data_new_from_mem (&sig, test_sig1, strlen (test_sig1), 0);
172   fail_if_err (err);
173   err = gpgme_op_verify (ctx, sig, text, NULL);
174   fail_if_err (err);
175   result = gpgme_op_verify_result (ctx);
176   check_result (result, 0, "A0FF4590BB6122EDEF6E3C542D727CC768697734",
177                 GPGME_No_Error, 1);
178
179   /* Checking a manipulated message.  */
180   gpgme_data_release (text);
181   err = gpgme_data_new_from_mem (&text, test_text1f, strlen (test_text1f), 0);
182   fail_if_err (err);
183   gpgme_data_rewind (sig);
184   err = gpgme_op_verify (ctx, sig, text, NULL);
185   fail_if_err (err);
186   result = gpgme_op_verify_result (ctx);
187   check_result (result, GPGME_SIGSUM_RED, "2D727CC768697734",
188                 GPGME_Bad_Signature, 0);
189
190   /* Checking a normal signature.  */
191   gpgme_data_release (sig);
192   gpgme_data_release (text);
193   err = gpgme_data_new_from_mem (&sig, test_sig2, strlen (test_sig2), 0);
194   fail_if_err (err);
195   err = gpgme_data_new (&text);
196   fail_if_err (err);
197   err = gpgme_op_verify (ctx, sig, NULL, text);
198   fail_if_err (err);
199   result = gpgme_op_verify_result (ctx);
200   check_result (result, 0, "A0FF4590BB6122EDEF6E3C542D727CC768697734",
201                 GPGME_No_Error, 0);
202
203   gpgme_data_release (sig);
204   gpgme_data_release (text);
205   gpgme_release (ctx);
206   return 0;
207 }