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
32 #include "mutt_crypt.h"
34 #include "crypt-mod.h"
42 #ifdef CRYPT_BACKEND_CLASSIC_PGP
43 extern struct crypt_module_specs crypt_mod_pgp_classic;
46 #ifdef CRYPT_BACKEND_CLASSIC_SMIME
47 extern struct crypt_module_specs crypt_mod_smime_classic;
50 #ifdef CRYPT_BACKEND_GPGME
51 extern struct crypt_module_specs crypt_mod_pgp_gpgme;
52 extern struct crypt_module_specs crypt_mod_smime_gpgme;
55 void crypt_init (void)
57 #ifdef CRYPT_BACKEND_CLASSIC_PGP
59 #ifdef CRYPT_BACKEND_GPGME
60 (! option (OPTCRYPTUSEGPGME))
65 crypto_module_register (&crypt_mod_pgp_classic);
68 #ifdef CRYPT_BACKEND_CLASSIC_SMIME
70 #ifdef CRYPT_BACKEND_GPGME
71 (! option (OPTCRYPTUSEGPGME))
76 crypto_module_register (&crypt_mod_smime_classic);
79 if (option (OPTCRYPTUSEGPGME))
81 #ifdef CRYPT_BACKEND_GPGME
82 crypto_module_register (&crypt_mod_pgp_gpgme);
83 crypto_module_register (&crypt_mod_smime_gpgme);
85 mutt_message (_("\"crypt_use_gpgme\" set"
86 " but not build with GPGME support."));
90 #if defined CRYPT_BACKEND_CLASSIG_PGP || defined CRYPT_BACKEND_CLASSIG_SMIME || defined CRYPT_BACKEND_GPGME
91 if (CRYPT_MOD_CALL_CHECK (PGP, init))
92 (CRYPT_MOD_CALL (PGP, init)) ();
94 if (CRYPT_MOD_CALL_CHECK (SMIME, init))
95 (CRYPT_MOD_CALL (SMIME, init)) ();
100 /* Show a message that a backend will be invoked. */
101 void crypt_invoke_message (int type)
103 if ((WithCrypto & APPLICATION_PGP) && (type & APPLICATION_PGP))
104 mutt_message _("Invoking PGP...");
105 else if ((WithCrypto & APPLICATION_SMIME) && (type & APPLICATION_SMIME))
106 mutt_message _("Invoking SMIME...");
118 /* Reset a PGP passphrase */
119 void crypt_pgp_void_passphrase (void)
121 if (CRYPT_MOD_CALL_CHECK (PGP, void_passphrase))
122 (CRYPT_MOD_CALL (PGP, void_passphrase)) ();
125 int crypt_pgp_valid_passphrase (void)
127 if (CRYPT_MOD_CALL_CHECK (PGP, valid_passphrase))
128 return (CRYPT_MOD_CALL (PGP, valid_passphrase)) ();
134 /* Decrypt a PGP/MIME message. */
135 int crypt_pgp_decrypt_mime (FILE *a, FILE **b, BODY *c, BODY **d)
137 if (CRYPT_MOD_CALL_CHECK (PGP, decrypt_mime))
138 return (CRYPT_MOD_CALL (PGP, decrypt_mime)) (a, b, c, d);
143 /* MIME handler for the application/pgp content-type. */
144 void crypt_pgp_application_pgp_handler (BODY *m, STATE *s)
146 if (CRYPT_MOD_CALL_CHECK (PGP, application_handler))
147 (CRYPT_MOD_CALL (PGP, application_handler)) (m, s);
150 /* MIME handler for an PGP/MIME encrypted message. */
151 void crypt_pgp_encrypted_handler (BODY *a, STATE *s)
153 if (CRYPT_MOD_CALL_CHECK (PGP, encrypted_handler))
154 (CRYPT_MOD_CALL (PGP, encrypted_handler)) (a, s);
157 /* fixme: needs documentation. */
158 void crypt_pgp_invoke_getkeys (ADDRESS *addr)
160 if (CRYPT_MOD_CALL_CHECK (PGP, pgp_invoke_getkeys))
161 (CRYPT_MOD_CALL (PGP, pgp_invoke_getkeys)) (addr);
164 /* Check for a traditional PGP message in body B. */
165 int crypt_pgp_check_traditional (FILE *fp, BODY *b, int tagged_only)
167 if (CRYPT_MOD_CALL_CHECK (PGP, pgp_check_traditional))
168 return (CRYPT_MOD_CALL (PGP, pgp_check_traditional)) (fp, b, tagged_only);
173 /* fixme: needs documentation. */
174 BODY *crypt_pgp_traditional_encryptsign (BODY *a, int flags, char *keylist)
176 if (CRYPT_MOD_CALL_CHECK (PGP, pgp_traditional_encryptsign))
177 return (CRYPT_MOD_CALL (PGP, pgp_traditional_encryptsign)) (a, flags, keylist);
182 /* Generate a PGP public key attachment. */
183 BODY *crypt_pgp_make_key_attachment (char *tempf)
185 if (CRYPT_MOD_CALL_CHECK (PGP, pgp_make_key_attachment))
186 return (CRYPT_MOD_CALL (PGP, pgp_make_key_attachment)) (tempf);
191 /* This routine attempts to find the keyids of the recipients of a
192 message. It returns NULL if any of the keys can not be found. */
193 char *crypt_pgp_findkeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc)
195 if (CRYPT_MOD_CALL_CHECK (PGP, findkeys))
196 return (CRYPT_MOD_CALL (PGP, findkeys)) (to, cc, bcc);
201 /* Create a new body with a PGP signed message from A. */
202 BODY *crypt_pgp_sign_message (BODY *a)
204 if (CRYPT_MOD_CALL_CHECK (PGP, sign_message))
205 return (CRYPT_MOD_CALL (PGP, sign_message)) (a);
210 /* Warning: A is no longer freed in this routine, you need to free it
211 later. This is necessary for $fcc_attach. */
212 BODY *crypt_pgp_encrypt_message (BODY *a, char *keylist, int sign)
214 if (CRYPT_MOD_CALL_CHECK (PGP, pgp_encrypt_message))
215 return (CRYPT_MOD_CALL (PGP, pgp_encrypt_message)) (a, keylist, sign);
220 /* Invoke the PGP command to import a key. */
221 void crypt_pgp_invoke_import (const char *fname)
223 if (CRYPT_MOD_CALL_CHECK (PGP, pgp_invoke_import))
224 (CRYPT_MOD_CALL (PGP, pgp_invoke_import)) (fname);
227 /* fixme: needs documentation */
228 int crypt_pgp_verify_one (BODY *sigbdy, STATE *s, const char *tempf)
230 if (CRYPT_MOD_CALL_CHECK (PGP, verify_one))
231 return (CRYPT_MOD_CALL (PGP, verify_one)) (sigbdy, s, tempf);
237 int crypt_pgp_send_menu (HEADER *msg, int *redraw)
239 if (CRYPT_MOD_CALL_CHECK (PGP, send_menu))
240 return (CRYPT_MOD_CALL (PGP, send_menu)) (msg, redraw);
246 /* fixme: needs documentation */
247 void crypt_pgp_extract_keys_from_attachment_list (FILE *fp, int tag, BODY *top)
249 if (CRYPT_MOD_CALL_CHECK (PGP, pgp_extract_keys_from_attachment_list))
250 (CRYPT_MOD_CALL (PGP, pgp_extract_keys_from_attachment_list)) (fp, tag, top);
262 /* Reset an SMIME passphrase */
263 void crypt_smime_void_passphrase (void)
265 if (CRYPT_MOD_CALL_CHECK (SMIME, void_passphrase))
266 (CRYPT_MOD_CALL (SMIME, void_passphrase)) ();
269 int crypt_smime_valid_passphrase (void)
271 if (CRYPT_MOD_CALL_CHECK (SMIME, valid_passphrase))
272 return (CRYPT_MOD_CALL (SMIME, valid_passphrase)) ();
277 /* Decrypt am S/MIME message. */
278 int crypt_smime_decrypt_mime (FILE *a, FILE **b, BODY *c, BODY **d)
280 if (CRYPT_MOD_CALL_CHECK (SMIME, decrypt_mime))
281 return (CRYPT_MOD_CALL (SMIME, decrypt_mime)) (a, b, c, d);
286 /* MIME handler for the application/smime content-type. */
287 void crypt_smime_application_smime_handler (BODY *m, STATE *s)
289 if (CRYPT_MOD_CALL_CHECK (SMIME, application_handler))
290 (CRYPT_MOD_CALL (SMIME, application_handler)) (m, s);
293 /* MIME handler for an PGP/MIME encrypted message. */
294 void crypt_smime_encrypted_handler (BODY *a, STATE *s)
296 if (CRYPT_MOD_CALL_CHECK (SMIME, encrypted_handler))
297 (CRYPT_MOD_CALL (SMIME, encrypted_handler)) (a, s);
300 /* fixme: Needs documentation. */
301 void crypt_smime_getkeys (ENVELOPE *env)
303 if (CRYPT_MOD_CALL_CHECK (SMIME, smime_getkeys))
304 (CRYPT_MOD_CALL (SMIME, smime_getkeys)) (env);
307 /* Check that the sender matches. */
308 int crypt_smime_verify_sender(HEADER *h)
310 if (CRYPT_MOD_CALL_CHECK (SMIME, smime_verify_sender))
311 return (CRYPT_MOD_CALL (SMIME, smime_verify_sender)) (h);
316 /* This routine attempts to find the keyids of the recipients of a
317 message. It returns NULL if any of the keys can not be found. */
318 char *crypt_smime_findkeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc)
320 if (CRYPT_MOD_CALL_CHECK (SMIME, findkeys))
321 return (CRYPT_MOD_CALL (SMIME, findkeys)) (to, cc, bcc);
326 /* fixme: Needs documentation. */
327 BODY *crypt_smime_sign_message (BODY *a)
329 if (CRYPT_MOD_CALL_CHECK (SMIME, sign_message))
330 return (CRYPT_MOD_CALL (SMIME, sign_message)) (a);
335 /* fixme: needs documentation. */
336 BODY *crypt_smime_build_smime_entity (BODY *a, char *certlist)
338 if (CRYPT_MOD_CALL_CHECK (SMIME, smime_build_smime_entity))
339 return (CRYPT_MOD_CALL (SMIME, smime_build_smime_entity)) (a, certlist);
344 /* Add a certificate and update index file (externally). */
345 void crypt_smime_invoke_import (char *infile, char *mailbox)
347 if (CRYPT_MOD_CALL_CHECK (SMIME, smime_invoke_import))
348 (CRYPT_MOD_CALL (SMIME, smime_invoke_import)) (infile, mailbox);
351 /* fixme: needs documentation */
352 int crypt_smime_verify_one (BODY *sigbdy, STATE *s, const char *tempf)
354 if (CRYPT_MOD_CALL_CHECK (SMIME, verify_one))
355 return (CRYPT_MOD_CALL (SMIME, verify_one)) (sigbdy, s, tempf);
360 int crypt_smime_send_menu (HEADER *msg, int *redraw)
362 if (CRYPT_MOD_CALL_CHECK (SMIME, send_menu))
363 return (CRYPT_MOD_CALL (SMIME, send_menu)) (msg, redraw);