core: Add 'is_mime' flags to the verify and decrypt results.
[gpgme.git] / tests / run-decrypt.c
1 /* run-decrypt.c  - Helper to perform a verify operation
2    Copyright (C) 2009 g10 Code GmbH
3                  2016 by Bundesamt für Sicherheit in der Informationstechnik
4                  Software engineering by Intevation GmbH
5
6    This file is part of GPGME.
7
8    GPGME is free software; you can redistribute it and/or modify it
9    under the terms of the GNU Lesser General Public License as
10    published by the Free Software Foundation; either version 2.1 of
11    the License, or (at your option) any later version.
12
13    GPGME is distributed in the hope that it will be useful, but
14    WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16    Lesser General Public License for more details.
17
18    You should have received a copy of the GNU Lesser General Public
19    License along with this program; if not, see <https://www.gnu.org/licenses/>.
20 */
21
22 /* We need to include config.h so that we know whether we are building
23    with large file system (LFS) support. */
24 #ifdef HAVE_CONFIG_H
25 #include <config.h>
26 #endif
27
28 #include <stdlib.h>
29 #include <stdio.h>
30 #include <string.h>
31
32 #include <gpgme.h>
33
34 #define PGM "run-decrypt"
35
36 #include "run-support.h"
37
38
39 static int verbose;
40
41 static gpg_error_t
42 status_cb (void *opaque, const char *keyword, const char *value)
43 {
44   (void)opaque;
45   fprintf (stderr, "status_cb: %s %s\n", keyword, value);
46   return 0;
47 }
48
49
50 static void
51 print_result (gpgme_decrypt_result_t result)
52 {
53   gpgme_recipient_t recp;
54   int count = 0;
55
56   printf ("Original file name .: %s\n", nonnull(result->file_name));
57   printf ("Wrong key usage ....: %s\n", result->wrong_key_usage? "yes":"no");
58   printf ("Compliance de-vs ...: %s\n", result->is_de_vs? "yes":"no");
59   printf ("MIME flag ..........: %s\n", result->is_mime? "yes":"no");
60   printf ("Unsupported algo ...: %s\n", nonnull(result->unsupported_algorithm));
61   printf ("Session key ........: %s\n", nonnull (result->session_key));
62   printf ("Symmetric algorithm : %s\n", result->symkey_algo);
63
64   for (recp = result->recipients; recp && recp->next; recp = recp->next)
65     {
66       printf ("Recipient ...: %d\n", count++);
67       printf ("  status ....: %s\n", gpgme_strerror (recp->status));
68       printf ("  keyid .....: %s\n", nonnull (recp->keyid));
69       printf ("  algo ......: %s\n",
70               gpgme_pubkey_algo_name (recp->pubkey_algo));
71     }
72 }
73
74
75 static int
76 show_usage (int ex)
77 {
78   fputs ("usage: " PGM " [options] FILE\n\n"
79          "Options:\n"
80          "  --verbose        run in verbose mode\n"
81          "  --status         print status lines from the backend\n"
82          "  --openpgp        use the OpenPGP protocol (default)\n"
83          "  --cms            use the CMS protocol\n"
84          "  --export-session-key            show the session key\n"
85          "  --override-session-key STRING   use STRING as session key\n"
86          "  --request-origin STRING         use STRING as request origin\n"
87          "  --no-symkey-cache               disable the use of that cache\n"
88          "  --unwrap         remove only the encryption layer\n"
89          , stderr);
90   exit (ex);
91 }
92
93
94 int
95 main (int argc, char **argv)
96 {
97   int last_argc = -1;
98   gpgme_error_t err;
99   gpgme_ctx_t ctx;
100   gpgme_protocol_t protocol = GPGME_PROTOCOL_OpenPGP;
101   gpgme_decrypt_flags_t flags = 0;
102   FILE *fp_in = NULL;
103   gpgme_data_t in = NULL;
104   gpgme_data_t out = NULL;
105   gpgme_decrypt_result_t result;
106   int print_status = 0;
107   int export_session_key = 0;
108   const char *override_session_key = NULL;
109   const char *request_origin = NULL;
110   int no_symkey_cache = 0;
111   int raw_output = 0;
112
113   if (argc)
114     { argc--; argv++; }
115
116   while (argc && last_argc != argc )
117     {
118       last_argc = argc;
119       if (!strcmp (*argv, "--"))
120         {
121           argc--; argv++;
122           break;
123         }
124       else if (!strcmp (*argv, "--help"))
125         show_usage (0);
126       else if (!strcmp (*argv, "--verbose"))
127         {
128           verbose = 1;
129           argc--; argv++;
130         }
131       else if (!strcmp (*argv, "--status"))
132         {
133           print_status = 1;
134           argc--; argv++;
135         }
136       else if (!strcmp (*argv, "--openpgp"))
137         {
138           protocol = GPGME_PROTOCOL_OpenPGP;
139           argc--; argv++;
140         }
141       else if (!strcmp (*argv, "--cms"))
142         {
143           protocol = GPGME_PROTOCOL_CMS;
144           argc--; argv++;
145         }
146       else if (!strcmp (*argv, "--export-session-key"))
147         {
148           export_session_key = 1;
149           argc--; argv++;
150         }
151       else if (!strcmp (*argv, "--override-session-key"))
152         {
153           argc--; argv++;
154           if (!argc)
155             show_usage (1);
156           override_session_key = *argv;
157           argc--; argv++;
158         }
159       else if (!strcmp (*argv, "--request-origin"))
160         {
161           argc--; argv++;
162           if (!argc)
163             show_usage (1);
164           request_origin = *argv;
165           argc--; argv++;
166         }
167       else if (!strcmp (*argv, "--no-symkey-cache"))
168         {
169           no_symkey_cache = 1;
170           argc--; argv++;
171         }
172       else if (!strcmp (*argv, "--unwrap"))
173         {
174           flags |= GPGME_DECRYPT_UNWRAP;
175           raw_output = 1;
176           argc--; argv++;
177         }
178       else if (!strncmp (*argv, "--", 2))
179         show_usage (1);
180
181     }
182
183   if (argc < 1 || argc > 2)
184     show_usage (1);
185
186   fp_in = fopen (argv[0], "rb");
187   if (!fp_in)
188     {
189       err = gpgme_error_from_syserror ();
190       fprintf (stderr, PGM ": can't open `%s': %s\n",
191                argv[0], gpgme_strerror (err));
192       exit (1);
193     }
194
195   init_gpgme (protocol);
196
197   err = gpgme_new (&ctx);
198   fail_if_err (err);
199   gpgme_set_protocol (ctx, protocol);
200   if (print_status)
201     {
202       gpgme_set_status_cb (ctx, status_cb, NULL);
203       gpgme_set_ctx_flag (ctx, "full-status", "1");
204     }
205   if (export_session_key)
206     {
207       err = gpgme_set_ctx_flag (ctx, "export-session-key", "1");
208       if (err)
209         {
210           fprintf (stderr, PGM ": error requesting exported session key: %s\n",
211                    gpgme_strerror (err));
212           exit (1);
213         }
214     }
215   if (override_session_key)
216     {
217       err = gpgme_set_ctx_flag (ctx, "override-session-key",
218                                 override_session_key);
219       if (err)
220         {
221           fprintf (stderr, PGM ": error setting overriding session key: %s\n",
222                    gpgme_strerror (err));
223           exit (1);
224         }
225     }
226
227   if (request_origin)
228     {
229       err = gpgme_set_ctx_flag (ctx, "request-origin", request_origin);
230       if (err)
231         {
232           fprintf (stderr, PGM ": error setting request_origin: %s\n",
233                    gpgme_strerror (err));
234           exit (1);
235         }
236     }
237
238   if (no_symkey_cache)
239     {
240       err = gpgme_set_ctx_flag (ctx, "no-symkey-cache", "1");
241       if (err)
242         {
243           fprintf (stderr, PGM ": error setting no-symkey-cache:  %s\n",
244                    gpgme_strerror (err));
245           exit (1);
246         }
247     }
248
249   err = gpgme_data_new_from_stream (&in, fp_in);
250   if (err)
251     {
252       fprintf (stderr, PGM ": error allocating data object: %s\n",
253                gpgme_strerror (err));
254       exit (1);
255     }
256
257   err = gpgme_data_new (&out);
258   if (err)
259     {
260       fprintf (stderr, PGM ": error allocating data object: %s\n",
261                gpgme_strerror (err));
262       exit (1);
263     }
264
265   err = gpgme_op_decrypt_ext (ctx, flags, in, out);
266   result = gpgme_op_decrypt_result (ctx);
267   if (err)
268     {
269       fprintf (stderr, PGM ": decrypt failed: %s\n", gpgme_strerror (err));
270       exit (1);
271     }
272   if (result)
273     {
274       if (!raw_output)
275         print_result (result);
276       if (!raw_output)
277         fputs ("Begin Output:\n", stdout);
278       print_data (out);
279       if (!raw_output)
280         fputs ("End Output.\n", stdout);
281     }
282
283   gpgme_data_release (out);
284   gpgme_data_release (in);
285
286   gpgme_release (ctx);
287   return 0;
288 }