2 * Copyright (C) 2003 Werner Koch <wk@gnupg.org>
3 * Copyright (C) 2004 g10 Code GmbH
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
21 This file dispatches the generic crypto functions to the
22 implemented backend or provides dummy stubs. Note, that some
23 generic functions are handled in crypt.c.
26 /* Note: This file has been changed to make use of the new module
27 system. Consequently there's a 1:1 mapping between the functions
28 contained in this file and the functions implemented by the crypto
36 #include "mutt_crypt.h"
38 #include "crypt-mod.h"
46 #ifdef CRYPT_BACKEND_CLASSIC_PGP
47 extern struct crypt_module_specs crypt_mod_pgp_classic;
50 #ifdef CRYPT_BACKEND_CLASSIC_SMIME
51 extern struct crypt_module_specs crypt_mod_smime_classic;
54 #ifdef CRYPT_BACKEND_GPGME
55 extern struct crypt_module_specs crypt_mod_pgp_gpgme;
56 extern struct crypt_module_specs crypt_mod_smime_gpgme;
59 void crypt_init (void)
61 #ifdef CRYPT_BACKEND_CLASSIC_PGP
63 #ifdef CRYPT_BACKEND_GPGME
64 (! option (OPTCRYPTUSEGPGME))
69 crypto_module_register (&crypt_mod_pgp_classic);
72 #ifdef CRYPT_BACKEND_CLASSIC_SMIME
74 #ifdef CRYPT_BACKEND_GPGME
75 (! option (OPTCRYPTUSEGPGME))
80 crypto_module_register (&crypt_mod_smime_classic);
83 if (option (OPTCRYPTUSEGPGME))
85 #ifdef CRYPT_BACKEND_GPGME
86 crypto_module_register (&crypt_mod_pgp_gpgme);
87 crypto_module_register (&crypt_mod_smime_gpgme);
89 mutt_message (_("\"crypt_use_gpgme\" set"
90 " but not build with GPGME support."));
91 if (mutt_any_key_to_continue (NULL) == -1)
96 #if defined CRYPT_BACKEND_CLASSIG_PGP || defined CRYPT_BACKEND_CLASSIG_SMIME || defined CRYPT_BACKEND_GPGME
97 if (CRYPT_MOD_CALL_CHECK (PGP, init))
98 (CRYPT_MOD_CALL (PGP, init)) ();
100 if (CRYPT_MOD_CALL_CHECK (SMIME, init))
101 (CRYPT_MOD_CALL (SMIME, init)) ();
106 /* Show a message that a backend will be invoked. */
107 void crypt_invoke_message (int type)
109 if ((WithCrypto & APPLICATION_PGP) && (type & APPLICATION_PGP))
110 mutt_message _("Invoking PGP...");
111 else if ((WithCrypto & APPLICATION_SMIME) && (type & APPLICATION_SMIME))
112 mutt_message _("Invoking SMIME...");
124 /* Reset a PGP passphrase */
125 void crypt_pgp_void_passphrase (void)
127 if (CRYPT_MOD_CALL_CHECK (PGP, void_passphrase))
128 (CRYPT_MOD_CALL (PGP, void_passphrase)) ();
131 int crypt_pgp_valid_passphrase (void)
133 if (CRYPT_MOD_CALL_CHECK (PGP, valid_passphrase))
134 return (CRYPT_MOD_CALL (PGP, valid_passphrase)) ();
140 /* Decrypt a PGP/MIME message. */
141 int crypt_pgp_decrypt_mime (FILE *a, FILE **b, BODY *c, BODY **d)
143 if (CRYPT_MOD_CALL_CHECK (PGP, decrypt_mime))
144 return (CRYPT_MOD_CALL (PGP, decrypt_mime)) (a, b, c, d);
149 /* MIME handler for the application/pgp content-type. */
150 void crypt_pgp_application_pgp_handler (BODY *m, STATE *s)
152 if (CRYPT_MOD_CALL_CHECK (PGP, application_handler))
153 (CRYPT_MOD_CALL (PGP, application_handler)) (m, s);
156 /* MIME handler for an PGP/MIME encrypted message. */
157 void crypt_pgp_encrypted_handler (BODY *a, STATE *s)
159 if (CRYPT_MOD_CALL_CHECK (PGP, encrypted_handler))
160 (CRYPT_MOD_CALL (PGP, encrypted_handler)) (a, s);
163 /* fixme: needs documentation. */
164 void crypt_pgp_invoke_getkeys (ADDRESS *addr)
166 if (CRYPT_MOD_CALL_CHECK (PGP, pgp_invoke_getkeys))
167 (CRYPT_MOD_CALL (PGP, pgp_invoke_getkeys)) (addr);
170 /* Check for a traditional PGP message in body B. */
171 int crypt_pgp_check_traditional (FILE *fp, BODY *b, int tagged_only)
173 if (CRYPT_MOD_CALL_CHECK (PGP, pgp_check_traditional))
174 return (CRYPT_MOD_CALL (PGP, pgp_check_traditional)) (fp, b, tagged_only);
179 /* fixme: needs documentation. */
180 BODY *crypt_pgp_traditional_encryptsign (BODY *a, int flags, char *keylist)
182 if (CRYPT_MOD_CALL_CHECK (PGP, pgp_traditional_encryptsign))
183 return (CRYPT_MOD_CALL (PGP, pgp_traditional_encryptsign)) (a, flags, keylist);
188 /* Generate a PGP public key attachment. */
189 BODY *crypt_pgp_make_key_attachment (char *tempf)
191 if (CRYPT_MOD_CALL_CHECK (PGP, pgp_make_key_attachment))
192 return (CRYPT_MOD_CALL (PGP, pgp_make_key_attachment)) (tempf);
197 /* This routine attempts to find the keyids of the recipients of a
198 message. It returns NULL if any of the keys can not be found. */
199 char *crypt_pgp_findkeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc)
201 if (CRYPT_MOD_CALL_CHECK (PGP, findkeys))
202 return (CRYPT_MOD_CALL (PGP, findkeys)) (to, cc, bcc);
207 /* Create a new body with a PGP signed message from A. */
208 BODY *crypt_pgp_sign_message (BODY *a)
210 if (CRYPT_MOD_CALL_CHECK (PGP, sign_message))
211 return (CRYPT_MOD_CALL (PGP, sign_message)) (a);
216 /* Warning: A is no longer freed in this routine, you need to free it
217 later. This is necessary for $fcc_attach. */
218 BODY *crypt_pgp_encrypt_message (BODY *a, char *keylist, int sign)
220 if (CRYPT_MOD_CALL_CHECK (PGP, pgp_encrypt_message))
221 return (CRYPT_MOD_CALL (PGP, pgp_encrypt_message)) (a, keylist, sign);
226 /* Invoke the PGP command to import a key. */
227 void crypt_pgp_invoke_import (const char *fname)
229 if (CRYPT_MOD_CALL_CHECK (PGP, pgp_invoke_import))
230 (CRYPT_MOD_CALL (PGP, pgp_invoke_import)) (fname);
233 /* fixme: needs documentation */
234 int crypt_pgp_verify_one (BODY *sigbdy, STATE *s, const char *tempf)
236 if (CRYPT_MOD_CALL_CHECK (PGP, verify_one))
237 return (CRYPT_MOD_CALL (PGP, verify_one)) (sigbdy, s, tempf);
243 int crypt_pgp_send_menu (HEADER *msg, int *redraw)
245 if (CRYPT_MOD_CALL_CHECK (PGP, send_menu))
246 return (CRYPT_MOD_CALL (PGP, send_menu)) (msg, redraw);
252 /* fixme: needs documentation */
253 void crypt_pgp_extract_keys_from_attachment_list (FILE *fp, int tag, BODY *top)
255 if (CRYPT_MOD_CALL_CHECK (PGP, pgp_extract_keys_from_attachment_list))
256 (CRYPT_MOD_CALL (PGP, pgp_extract_keys_from_attachment_list)) (fp, tag, top);
268 /* Reset an SMIME passphrase */
269 void crypt_smime_void_passphrase (void)
271 if (CRYPT_MOD_CALL_CHECK (SMIME, void_passphrase))
272 (CRYPT_MOD_CALL (SMIME, void_passphrase)) ();
275 int crypt_smime_valid_passphrase (void)
277 if (CRYPT_MOD_CALL_CHECK (SMIME, valid_passphrase))
278 return (CRYPT_MOD_CALL (SMIME, valid_passphrase)) ();
283 /* Decrypt am S/MIME message. */
284 int crypt_smime_decrypt_mime (FILE *a, FILE **b, BODY *c, BODY **d)
286 if (CRYPT_MOD_CALL_CHECK (SMIME, decrypt_mime))
287 return (CRYPT_MOD_CALL (SMIME, decrypt_mime)) (a, b, c, d);
292 /* MIME handler for the application/smime content-type. */
293 void crypt_smime_application_smime_handler (BODY *m, STATE *s)
295 if (CRYPT_MOD_CALL_CHECK (SMIME, application_handler))
296 (CRYPT_MOD_CALL (SMIME, application_handler)) (m, s);
299 /* MIME handler for an PGP/MIME encrypted message. */
300 void crypt_smime_encrypted_handler (BODY *a, STATE *s)
302 if (CRYPT_MOD_CALL_CHECK (SMIME, encrypted_handler))
303 (CRYPT_MOD_CALL (SMIME, encrypted_handler)) (a, s);
306 /* fixme: Needs documentation. */
307 void crypt_smime_getkeys (ENVELOPE *env)
309 if (CRYPT_MOD_CALL_CHECK (SMIME, smime_getkeys))
310 (CRYPT_MOD_CALL (SMIME, smime_getkeys)) (env);
313 /* Check that the sender matches. */
314 int crypt_smime_verify_sender(HEADER *h)
316 if (CRYPT_MOD_CALL_CHECK (SMIME, smime_verify_sender))
317 return (CRYPT_MOD_CALL (SMIME, smime_verify_sender)) (h);
322 /* This routine attempts to find the keyids of the recipients of a
323 message. It returns NULL if any of the keys can not be found. */
324 char *crypt_smime_findkeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc)
326 if (CRYPT_MOD_CALL_CHECK (SMIME, findkeys))
327 return (CRYPT_MOD_CALL (SMIME, findkeys)) (to, cc, bcc);
332 /* fixme: Needs documentation. */
333 BODY *crypt_smime_sign_message (BODY *a)
335 if (CRYPT_MOD_CALL_CHECK (SMIME, sign_message))
336 return (CRYPT_MOD_CALL (SMIME, sign_message)) (a);
341 /* fixme: needs documentation. */
342 BODY *crypt_smime_build_smime_entity (BODY *a, char *certlist)
344 if (CRYPT_MOD_CALL_CHECK (SMIME, smime_build_smime_entity))
345 return (CRYPT_MOD_CALL (SMIME, smime_build_smime_entity)) (a, certlist);
350 /* Add a certificate and update index file (externally). */
351 void crypt_smime_invoke_import (char *infile, char *mailbox)
353 if (CRYPT_MOD_CALL_CHECK (SMIME, smime_invoke_import))
354 (CRYPT_MOD_CALL (SMIME, smime_invoke_import)) (infile, mailbox);
357 /* fixme: needs documentation */
358 int crypt_smime_verify_one (BODY *sigbdy, STATE *s, const char *tempf)
360 if (CRYPT_MOD_CALL_CHECK (SMIME, verify_one))
361 return (CRYPT_MOD_CALL (SMIME, verify_one)) (sigbdy, s, tempf);
366 int crypt_smime_send_menu (HEADER *msg, int *redraw)
368 if (CRYPT_MOD_CALL_CHECK (SMIME, send_menu))
369 return (CRYPT_MOD_CALL (SMIME, send_menu)) (msg, redraw);