tests: Add new test tool run-decrypt
[gpgme.git] / tests / run-encrypt.c
1 /* run-encrypt.c  - Helper to perform an encrypt operation
2  * Copyright (C) 2016 g10 Code GmbH
3  *
4  * This file is part of GPGME.
5  *
6  * GPGME is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU Lesser General Public License as
8  * published by the Free Software Foundation; either version 2.1 of
9  * the License, or (at your option) any later version.
10  *
11  * GPGME is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this program; if not, see <http://www.gnu.org/licenses/>.
18  */
19
20 /* We need to include config.h so that we know whether we are building
21    with large file system (LFS) support. */
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25
26 #include <stdlib.h>
27 #include <stdio.h>
28 #include <string.h>
29
30 #include <gpgme.h>
31
32 #define PGM "run-encrypt"
33
34 #include "run-support.h"
35
36
37 static int verbose;
38
39 static gpg_error_t
40 status_cb (void *opaque, const char *keyword, const char *value)
41 {
42   (void)opaque;
43   printf ("status_cb: %s %s\n", keyword, value);
44   return 0;
45 }
46
47
48 static void
49 print_result (gpgme_encrypt_result_t result)
50 {
51   gpgme_invalid_key_t invkey;
52
53   for (invkey = result->invalid_recipients; invkey; invkey = invkey->next)
54     printf ("Encryption key `%s' not used: %s <%s>\n",
55             nonnull (invkey->fpr),
56             gpg_strerror (invkey->reason), gpg_strsource (invkey->reason));
57 }
58
59
60
61 static int
62 show_usage (int ex)
63 {
64   fputs ("usage: " PGM " [options] FILE\n\n"
65          "Options:\n"
66          "  --verbose        run in verbose mode\n"
67          "  --status         print status lines from the backend\n"
68          "  --openpgp        use the OpenPGP protocol (default)\n"
69          "  --cms            use the CMS protocol\n"
70          "  --uiserver       use the UI server\n"
71          "  --loopback       use a loopback pinentry\n"
72          "  --key NAME       encrypt to key NAME\n"
73          , stderr);
74   exit (ex);
75 }
76
77
78 int
79 main (int argc, char **argv)
80 {
81   int last_argc = -1;
82   gpgme_error_t err;
83   gpgme_ctx_t ctx;
84   const char *key_string = NULL;
85   gpgme_protocol_t protocol = GPGME_PROTOCOL_OpenPGP;
86   gpgme_data_t in, out;
87   gpgme_encrypt_result_t result;
88   int print_status = 0;
89   int use_loopback = 0;
90   char *keyargs[10];
91   gpgme_key_t keys[10+1];
92   int keycount = 0;
93   int i;
94
95   if (argc)
96     { argc--; argv++; }
97
98   if (DIM(keys) != DIM(keyargs)+1)
99     abort ();
100
101   while (argc && last_argc != argc )
102     {
103       last_argc = argc;
104       if (!strcmp (*argv, "--"))
105         {
106           argc--; argv++;
107           break;
108         }
109       else if (!strcmp (*argv, "--help"))
110         show_usage (0);
111       else if (!strcmp (*argv, "--verbose"))
112         {
113           verbose = 1;
114           argc--; argv++;
115         }
116       else if (!strcmp (*argv, "--status"))
117         {
118           print_status = 1;
119           argc--; argv++;
120         }
121       else if (!strcmp (*argv, "--openpgp"))
122         {
123           protocol = GPGME_PROTOCOL_OpenPGP;
124           argc--; argv++;
125         }
126       else if (!strcmp (*argv, "--cms"))
127         {
128           protocol = GPGME_PROTOCOL_CMS;
129           argc--; argv++;
130         }
131       else if (!strcmp (*argv, "--uiserver"))
132         {
133           protocol = GPGME_PROTOCOL_UISERVER;
134           argc--; argv++;
135         }
136       else if (!strcmp (*argv, "--key"))
137         {
138           argc--; argv++;
139           if (!argc)
140             show_usage (1);
141           if (keycount == DIM (keyargs))
142             show_usage (1);
143           keyargs[keycount++] = *argv;
144           argc--; argv++;
145         }
146       else if (!strcmp (*argv, "--loopback"))
147         {
148           use_loopback = 1;
149           argc--; argv++;
150         }
151       else if (!strncmp (*argv, "--", 2))
152         show_usage (1);
153
154     }
155
156   if (argc != 1)
157     show_usage (1);
158
159   if (key_string && protocol == GPGME_PROTOCOL_UISERVER)
160     {
161       fprintf (stderr, PGM ": ignoring --key in UI-server mode\n");
162       key_string = NULL;
163     }
164
165   if (!key_string)
166     key_string = "test";
167
168   init_gpgme (protocol);
169
170   err = gpgme_new (&ctx);
171   fail_if_err (err);
172   gpgme_set_protocol (ctx, protocol);
173   gpgme_set_armor (ctx, 1);
174   if (print_status)
175     gpgme_set_status_cb (ctx, status_cb, NULL);
176   if (use_loopback)
177     gpgme_set_pinentry_mode (ctx, GPGME_PINENTRY_MODE_LOOPBACK);
178
179   for (i=0; i < keycount; i++)
180     {
181       err = gpgme_get_key (ctx, keyargs[i], &keys[i], 0);
182       fail_if_err (err);
183     }
184   keys[i] = NULL;
185
186   err = gpgme_data_new_from_file (&in, *argv, 1);
187   if (err)
188     {
189       fprintf (stderr, PGM ": error reading `%s': %s\n",
190                *argv, gpg_strerror (err));
191       exit (1);
192     }
193
194   err = gpgme_data_new (&out);
195   fail_if_err (err);
196
197   err = gpgme_op_encrypt (ctx, keys, GPGME_ENCRYPT_ALWAYS_TRUST, in, out);
198   result = gpgme_op_encrypt_result (ctx);
199   if (result)
200     print_result (result);
201   if (err)
202     {
203       fprintf (stderr, PGM ": encrypting failed: %s\n", gpg_strerror (err));
204       exit (1);
205     }
206
207   fputs ("Begin Output:\n", stdout);
208   print_data (out);
209   fputs ("End Output.\n", stdout);
210   gpgme_data_release (out);
211
212   gpgme_data_release (in);
213
214   for (i=0; i < keycount; i++)
215     gpgme_key_unref (keys[i]);
216   gpgme_release (ctx);
217   return 0;
218 }