d5b2f139d30db0ab4e8bb24f781799a9f485debe
[gpgme.git] / gpgme / gpgme.c
1 /* gpgme.c - GnuPG Made Easy.
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 #if HAVE_CONFIG_H
22 #include <config.h>
23 #endif
24 #include <stdio.h>
25 #include <stdlib.h>
26 #include <string.h>
27 #include <assert.h>
28
29 #include "util.h"
30 #include "context.h"
31 #include "ops.h"
32 #include "wait.h"
33
34 /* Create a new context as an environment for GPGME crypto
35    operations.  */
36 gpgme_error_t
37 gpgme_new (gpgme_ctx_t *r_ctx)
38 {
39   gpgme_ctx_t ctx;
40
41   ctx = calloc (1, sizeof *ctx);
42   if (!ctx)
43     return GPGME_Out_Of_Core;
44   ctx->keylist_mode = GPGME_KEYLIST_MODE_LOCAL;
45   ctx->include_certs = 1;
46   ctx->protocol = GPGME_PROTOCOL_OpenPGP;
47   _gpgme_fd_table_init (&ctx->fdt);
48   *r_ctx = ctx;
49   return 0;
50 }
51
52
53 /* Release all resources associated with the given context.  */
54 void
55 gpgme_release (gpgme_ctx_t ctx)
56 {
57   _gpgme_engine_release (ctx->engine);
58   _gpgme_fd_table_deinit (&ctx->fdt);
59   _gpgme_release_result (ctx);
60   gpgme_signers_clear (ctx);
61   if (ctx->signers)
62     free (ctx->signers);
63   free (ctx);
64 }
65
66
67 void
68 _gpgme_release_result (gpgme_ctx_t ctx)
69 {
70   struct ctx_op_data *data = ctx->op_data;
71
72   while (data)
73     {
74       struct ctx_op_data *next_data = data->next;
75       if (data->cleanup)
76         (*data->cleanup) (data->hook);
77       free (data);
78       data = next_data;
79     }
80   ctx->op_data = NULL;
81 }
82
83
84 gpgme_error_t
85 gpgme_set_protocol (gpgme_ctx_t ctx, gpgme_protocol_t protocol)
86 {
87   if (protocol != GPGME_PROTOCOL_OpenPGP && protocol != GPGME_PROTOCOL_CMS)
88     return GPGME_Invalid_Value;
89
90   ctx->protocol = protocol;
91   return 0;
92 }
93
94
95 gpgme_protocol_t
96 gpgme_get_protocol (gpgme_ctx_t ctx)
97 {
98   return ctx->protocol;
99 }
100
101
102 const char *
103 gpgme_get_protocol_name (gpgme_protocol_t protocol)
104 {
105   switch (protocol)
106     {
107     case GPGME_PROTOCOL_OpenPGP:
108       return "OpenPGP";
109
110     case GPGME_PROTOCOL_CMS:
111       return "CMS";
112
113     default:
114       return NULL;
115     }
116 }
117
118 /* Enable or disable the use of an ascii armor for all output.  */
119 void
120 gpgme_set_armor (gpgme_ctx_t ctx, int yes)
121 {
122   ctx->use_armor = yes;
123 }
124
125
126 /* Return the state of the armor flag.  */
127 int
128 gpgme_get_armor (gpgme_ctx_t ctx)
129 {
130   return ctx->use_armor;
131 }
132
133
134 /* Enable or disable the use of the special textmode.  Textmode is for
135   example used for the RFC2015 signatures; note that the updated RFC
136   3156 mandates that the MUA does some preparations so that textmode
137   is not needed anymore.  */
138 void
139 gpgme_set_textmode (gpgme_ctx_t ctx, int yes)
140 {
141   ctx->use_textmode = yes;
142 }
143
144 /* Return the state of the textmode flag.  */
145 int
146 gpgme_get_textmode (gpgme_ctx_t ctx)
147 {
148   return ctx->use_textmode;
149 }
150
151
152 /* Set the number of certifications to include in an S/MIME message.
153    The default is 1 (only the cert of the sender).  -1 means all
154    certs, and -2 means all certs except the root cert.  */
155 void
156 gpgme_set_include_certs (gpgme_ctx_t ctx, int nr_of_certs)
157 {
158   if (nr_of_certs < -2)
159     ctx->include_certs = -2;
160   else
161     ctx->include_certs = nr_of_certs;
162 }
163
164
165 /* Get the number of certifications to include in an S/MIME
166    message.  */
167 int
168 gpgme_get_include_certs (gpgme_ctx_t ctx)
169 {
170   return ctx->include_certs;
171 }
172
173
174 /* This function changes the default behaviour of the keylisting
175    functions.  MODE is a bitwise-OR of the GPGME_KEYLIST_* flags.  The
176    default mode is GPGME_KEYLIST_MODE_LOCAL.  */
177 gpgme_error_t
178 gpgme_set_keylist_mode (gpgme_ctx_t ctx, gpgme_keylist_mode_t mode)
179 {
180   if (!((mode & GPGME_KEYLIST_MODE_LOCAL)
181         || (mode & GPGME_KEYLIST_MODE_EXTERN)
182         || (mode & GPGME_KEYLIST_MODE_SIGS)))
183      return GPGME_Invalid_Value;
184
185   ctx->keylist_mode = mode;
186   return 0;
187 }
188
189 /* This function returns the default behaviour of the keylisting
190    functions.  */
191 gpgme_keylist_mode_t
192 gpgme_get_keylist_mode (gpgme_ctx_t ctx)
193 {
194   return ctx->keylist_mode;
195 }
196
197
198 /* This function sets a callback function to be used to pass a
199    passphrase to gpg.  */
200 void
201 gpgme_set_passphrase_cb (gpgme_ctx_t ctx, gpgme_passphrase_cb_t cb,
202                          void *cb_value)
203 {
204   ctx->passphrase_cb = cb;
205   ctx->passphrase_cb_value = cb_value;
206 }
207
208
209 /* This function returns the callback function to be used to pass a
210    passphrase to the crypto engine.  */
211 void
212 gpgme_get_passphrase_cb (gpgme_ctx_t ctx, gpgme_passphrase_cb_t *r_cb,
213                          void **r_cb_value)
214 {
215   if (r_cb)
216     *r_cb = ctx->passphrase_cb;
217   if (r_cb_value)
218     *r_cb_value = ctx->passphrase_cb_value;
219 }
220
221
222 /* This function sets a callback function to be used as a progress
223    indicator.  */
224 void
225 gpgme_set_progress_cb (gpgme_ctx_t ctx, gpgme_progress_cb_t cb, void *cb_value)
226 {
227   ctx->progress_cb = cb;
228   ctx->progress_cb_value = cb_value;
229 }
230
231
232 /* This function returns the callback function to be used as a
233    progress indicator.  */
234 void
235 gpgme_get_progress_cb (gpgme_ctx_t ctx, gpgme_progress_cb_t *r_cb,
236                        void **r_cb_value)
237 {
238   if (r_cb)
239     *r_cb = ctx->progress_cb;
240   if (r_cb_value)
241     *r_cb_value = ctx->progress_cb_value;
242 }
243
244
245 /* Set the I/O callback functions for CTX to IO_CBS.  */
246 void
247 gpgme_set_io_cbs (gpgme_ctx_t ctx, gpgme_io_cbs_t io_cbs)
248 {
249   if (io_cbs)
250     ctx->io_cbs = *io_cbs;
251   else
252     {
253       ctx->io_cbs.add = NULL;
254       ctx->io_cbs.add_priv = NULL;
255       ctx->io_cbs.remove = NULL;
256       ctx->io_cbs.event = NULL;
257       ctx->io_cbs.event_priv = NULL;
258     }
259 }
260
261
262 /* This function returns the callback function for I/O.  */
263 void
264 gpgme_get_io_cbs (gpgme_ctx_t ctx, gpgme_io_cbs_t io_cbs)
265 {
266   *io_cbs = ctx->io_cbs;
267 }
268
269
270 const char *
271 gpgme_pubkey_algo_name (gpgme_pubkey_algo_t algo)
272 {
273   switch (algo)
274     {
275     case GPGME_PK_RSA:
276       return "RSA";
277
278     case GPGME_PK_RSA_E:
279       return "RSA-E";
280
281     case GPGME_PK_RSA_S:
282       return "RSA-S";
283
284     case GPGME_PK_ELG_E:
285       return "ELG-E";
286
287     case GPGME_PK_DSA:
288       return "DSA";
289
290     case GPGME_PK_ELG:
291       return "ELG";
292
293     default:
294       return NULL;
295     }
296 }
297
298
299 const char *
300 gpgme_hash_algo_name (gpgme_hash_algo_t algo)
301 {
302   switch (algo)
303     {
304     case GPGME_MD_MD5:
305       return "MD5";
306
307     case GPGME_MD_SHA1:
308       return "SHA1";
309
310     case GPGME_MD_RMD160:
311       return "RMD160";
312
313     case GPGME_MD_MD2:
314       return "MD2";
315
316     case GPGME_MD_TIGER:
317       return "TIGER";
318
319     case GPGME_MD_HAVAL:
320       return "HAVAL";
321
322     case GPGME_MD_SHA256:
323       return "SHA256";
324
325     case GPGME_MD_SHA384:
326       return "SHA384";
327
328     case GPGME_MD_SHA512:
329       return "SHA512";
330
331     case GPGME_MD_MD4:
332       return "MD4";
333
334     case GPGME_MD_CRC32:
335       return "CRC32";
336
337     case GPGME_MD_CRC32_RFC1510:
338       return "CRC32-RFC1510";
339
340     case GPGME_MD_CRC24_RFC2440:
341       return "CRC24-RFC2440";
342
343     default:
344       return NULL;
345     }
346 }