2 * Copyright notice from original mutt:
3 * Copyright (C) 2003 Werner Koch <wk@gnupg.org>
4 * Copyright (C) 2004 g10 Code GmbH
6 * This file is part of mutt-ng, see http://www.muttng.org/.
7 * It's licensed under the GNU General Public License,
8 * please see the file GPL in the top level source directory.
12 This file dispatches the generic crypto functions to the
13 implemented backend or provides dummy stubs. Note, that some
14 generic functions are handled in crypt.c.
17 /* Note: This file has been changed to make use of the new module
18 system. Consequently there's a 1:1 mapping between the functions
19 contained in this file and the functions implemented by the crypto
26 #include <lib-lib/macros.h>
32 #include "crypt-mod.h"
38 extern struct crypt_module_specs crypt_mod_pgp_classic;
39 extern struct crypt_module_specs crypt_mod_smime_classic;
41 #ifdef CRYPT_BACKEND_GPGME
42 extern struct crypt_module_specs crypt_mod_pgp_gpgme;
43 extern struct crypt_module_specs crypt_mod_smime_gpgme;
46 void crypt_init (void)
49 #ifdef CRYPT_BACKEND_GPGME
50 (!option (OPTCRYPTUSEGPGME))
55 crypto_module_register (&crypt_mod_pgp_classic);
58 #ifdef CRYPT_BACKEND_GPGME
59 (!option (OPTCRYPTUSEGPGME))
64 crypto_module_register (&crypt_mod_smime_classic);
66 if (option (OPTCRYPTUSEGPGME)) {
67 #ifdef CRYPT_BACKEND_GPGME
68 crypto_module_register (&crypt_mod_pgp_gpgme);
69 crypto_module_register (&crypt_mod_smime_gpgme);
71 mutt_message (_("\"crypt_use_gpgme\" set"
72 " but not build with GPGME support."));
73 if (mutt_any_key_to_continue (NULL) == -1)
78 #if defined CRYPT_BACKEND_CLASSIG_PGP || defined CRYPT_BACKEND_CLASSIG_SMIME || defined CRYPT_BACKEND_GPGME
79 if (CRYPT_MOD_CALL_CHECK (PGP, init))
80 (CRYPT_MOD_CALL (PGP, init)) ();
82 if (CRYPT_MOD_CALL_CHECK (SMIME, init))
83 (CRYPT_MOD_CALL (SMIME, init)) ();
88 /* Show a message that a backend will be invoked. */
89 void crypt_invoke_message (int type)
91 if (type & APPLICATION_PGP) {
92 mutt_message _("Invoking PGP...");
94 else if (type & APPLICATION_SMIME) {
95 mutt_message _("Invoking S/MIME...");
108 /* Reset a PGP passphrase */
109 void crypt_pgp_void_passphrase (void)
111 if (CRYPT_MOD_CALL_CHECK (PGP, void_passphrase))
112 (CRYPT_MOD_CALL (PGP, void_passphrase)) ();
115 int crypt_pgp_valid_passphrase (void)
117 if (CRYPT_MOD_CALL_CHECK (PGP, valid_passphrase))
118 return (CRYPT_MOD_CALL (PGP, valid_passphrase)) ();
124 /* Decrypt a PGP/MIME message. */
125 int crypt_pgp_decrypt_mime (FILE * a, FILE ** b, BODY * c, BODY ** d)
127 if (CRYPT_MOD_CALL_CHECK (PGP, decrypt_mime))
128 return (CRYPT_MOD_CALL (PGP, decrypt_mime)) (a, b, c, d);
133 /* MIME handler for the application/pgp content-type. */
134 int crypt_pgp_application_pgp_handler (BODY * m, STATE * s)
136 if (CRYPT_MOD_CALL_CHECK (PGP, application_handler))
137 return (CRYPT_MOD_CALL (PGP, application_handler)) (m, s);
141 /* MIME handler for an PGP/MIME encrypted message. */
142 int crypt_pgp_encrypted_handler (BODY * a, STATE * s)
144 if (CRYPT_MOD_CALL_CHECK (PGP, encrypted_handler))
145 return (CRYPT_MOD_CALL (PGP, encrypted_handler)) (a, s);
149 /* fixme: needs documentation. */
150 void crypt_pgp_invoke_getkeys (address_t * addr)
152 if (CRYPT_MOD_CALL_CHECK (PGP, pgp_invoke_getkeys))
153 (CRYPT_MOD_CALL (PGP, pgp_invoke_getkeys)) (addr);
156 /* Check for a traditional PGP message in body B. */
157 int crypt_pgp_check_traditional (FILE * fp, BODY * b, int tagged_only)
159 if (CRYPT_MOD_CALL_CHECK (PGP, pgp_check_traditional))
160 return (CRYPT_MOD_CALL (PGP, pgp_check_traditional)) (fp, b, tagged_only);
165 /* fixme: needs documentation. */
166 BODY *crypt_pgp_traditional_encryptsign (BODY * a, int flags, char *keylist)
168 if (CRYPT_MOD_CALL_CHECK (PGP, pgp_traditional_encryptsign))
169 return (CRYPT_MOD_CALL (PGP, pgp_traditional_encryptsign)) (a, flags,
175 /* Generate a PGP public key attachment. */
176 BODY *crypt_pgp_make_key_attachment (char *tempf)
178 if (CRYPT_MOD_CALL_CHECK (PGP, pgp_make_key_attachment))
179 return (CRYPT_MOD_CALL (PGP, pgp_make_key_attachment)) (tempf);
184 /* This routine attempts to find the keyids of the recipients of a
185 message. It returns NULL if any of the keys can not be found. */
186 char *crypt_pgp_findkeys (address_t * to, address_t * cc, address_t * bcc)
188 if (CRYPT_MOD_CALL_CHECK (PGP, findkeys))
189 return (CRYPT_MOD_CALL (PGP, findkeys)) (to, cc, bcc);
194 /* Create a new body with a PGP signed message from A. */
195 BODY *crypt_pgp_sign_message (BODY * a)
197 if (CRYPT_MOD_CALL_CHECK (PGP, sign_message))
198 return (CRYPT_MOD_CALL (PGP, sign_message)) (a);
203 /* Warning: A is no longer freed in this routine, you need to free it
204 later. This is necessary for $fcc_attach. */
205 BODY *crypt_pgp_encrypt_message (BODY * a, char *keylist, int sign)
207 if (CRYPT_MOD_CALL_CHECK (PGP, pgp_encrypt_message))
208 return (CRYPT_MOD_CALL (PGP, pgp_encrypt_message)) (a, keylist, sign);
213 /* Invoke the PGP command to import a key. */
214 void crypt_pgp_invoke_import (const char *fname)
216 if (CRYPT_MOD_CALL_CHECK (PGP, pgp_invoke_import))
217 (CRYPT_MOD_CALL (PGP, pgp_invoke_import)) (fname);
220 /* fixme: needs documentation */
221 int crypt_pgp_verify_one (BODY * sigbdy, STATE * s, const char *tempf)
223 if (CRYPT_MOD_CALL_CHECK (PGP, verify_one))
224 return (CRYPT_MOD_CALL (PGP, verify_one)) (sigbdy, s, tempf);
230 int crypt_pgp_send_menu (HEADER * msg, int *redraw)
232 if (CRYPT_MOD_CALL_CHECK (PGP, send_menu))
233 return (CRYPT_MOD_CALL (PGP, send_menu)) (msg, redraw);
239 /* fixme: needs documentation */
240 void crypt_pgp_extract_keys_from_attachment_list (FILE * fp, int tag,
243 if (CRYPT_MOD_CALL_CHECK (PGP, pgp_extract_keys_from_attachment_list))
244 (CRYPT_MOD_CALL (PGP, pgp_extract_keys_from_attachment_list)) (fp, tag,
257 /* Reset an SMIME passphrase */
258 void crypt_smime_void_passphrase (void)
260 if (CRYPT_MOD_CALL_CHECK (SMIME, void_passphrase))
261 (CRYPT_MOD_CALL (SMIME, void_passphrase)) ();
264 int crypt_smime_valid_passphrase (void)
266 if (CRYPT_MOD_CALL_CHECK (SMIME, valid_passphrase))
267 return (CRYPT_MOD_CALL (SMIME, valid_passphrase)) ();
272 /* Decrypt am S/MIME message. */
273 int crypt_smime_decrypt_mime (FILE * a, FILE ** b, BODY * c, BODY ** d)
275 if (CRYPT_MOD_CALL_CHECK (SMIME, decrypt_mime))
276 return (CRYPT_MOD_CALL (SMIME, decrypt_mime)) (a, b, c, d);
281 /* MIME handler for the application/smime content-type. */
282 int crypt_smime_application_smime_handler (BODY * m, STATE * s)
284 if (CRYPT_MOD_CALL_CHECK (SMIME, application_handler))
285 return (CRYPT_MOD_CALL (SMIME, application_handler)) (m, s);
289 /* MIME handler for an PGP/MIME encrypted message. */
290 int crypt_smime_encrypted_handler (BODY * a, STATE * s)
292 if (CRYPT_MOD_CALL_CHECK (SMIME, encrypted_handler))
293 return (CRYPT_MOD_CALL (SMIME, encrypted_handler)) (a, s);
297 /* fixme: Needs documentation. */
298 void crypt_smime_getkeys (ENVELOPE * env)
300 if (CRYPT_MOD_CALL_CHECK (SMIME, smime_getkeys))
301 (CRYPT_MOD_CALL (SMIME, smime_getkeys)) (env);
304 /* Check that the sender matches. */
305 int crypt_smime_verify_sender (HEADER * h)
307 if (CRYPT_MOD_CALL_CHECK (SMIME, smime_verify_sender))
308 return (CRYPT_MOD_CALL (SMIME, smime_verify_sender)) (h);
313 /* This routine attempts to find the keyids of the recipients of a
314 message. It returns NULL if any of the keys can not be found. */
315 char *crypt_smime_findkeys (address_t * to, address_t * cc, address_t * bcc)
317 if (CRYPT_MOD_CALL_CHECK (SMIME, findkeys))
318 return (CRYPT_MOD_CALL (SMIME, findkeys)) (to, cc, bcc);
323 /* fixme: Needs documentation. */
324 BODY *crypt_smime_sign_message (BODY * a)
326 if (CRYPT_MOD_CALL_CHECK (SMIME, sign_message))
327 return (CRYPT_MOD_CALL (SMIME, sign_message)) (a);
332 /* fixme: needs documentation. */
333 BODY *crypt_smime_build_smime_entity (BODY * a, char *certlist)
335 if (CRYPT_MOD_CALL_CHECK (SMIME, smime_build_smime_entity))
336 return (CRYPT_MOD_CALL (SMIME, smime_build_smime_entity)) (a, certlist);
341 /* Add a certificate and update index file (externally). */
342 void crypt_smime_invoke_import (char *infile, char *mailbox)
344 if (CRYPT_MOD_CALL_CHECK (SMIME, smime_invoke_import))
345 (CRYPT_MOD_CALL (SMIME, smime_invoke_import)) (infile, mailbox);
348 /* fixme: needs documentation */
349 int crypt_smime_verify_one (BODY * sigbdy, STATE * s, const char *tempf)
351 if (CRYPT_MOD_CALL_CHECK (SMIME, verify_one))
352 return (CRYPT_MOD_CALL (SMIME, verify_one)) (sigbdy, s, tempf);
357 int crypt_smime_send_menu (HEADER * msg, int *redraw)
359 if (CRYPT_MOD_CALL_CHECK (SMIME, send_menu))
360 return (CRYPT_MOD_CALL (SMIME, send_menu)) (msg, redraw);