Rocco Rutte:
[apps/madmutt.git] / mutt_crypt.h
1 /*
2  * Copyright notice from original mutt:
3  * Copyright (C) 2003 Werner Koch <wk@gnupg.org>
4  * Copyright (C) 2004 g10code GmbH
5  *
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.
9  */
10
11 /*
12    Common definitions and prototypes for the crypt functions. They are
13    all defined in crypt.c and cryptglue.c
14 */
15
16 #ifndef MUTT_CRYPT_H
17 #define MUTT_CRYPT_H
18
19 #include "mutt.h"               /* Need this to declare BODY, ADDRESS. STATE etc. */
20 #include "state.h"
21
22 /* FIXME: They should be pointer to anonymous structures for better
23    information hiding. */
24
25
26
27 #define ENCRYPT    (1 << 0)
28 #define SIGN       (1 << 1)
29 #define GOODSIGN   (1 << 2)
30 #define BADSIGN    (1 << 3)
31 #define PARTSIGN   (1 << 4)
32 #define SIGNOPAQUE (1 << 5)
33 #define KEYBLOCK   (1 << 6)     /* KEY too generic? */
34 #define INLINE     (1 << 7)
35
36 #define APPLICATION_PGP    (1 << 8)
37 #define APPLICATION_SMIME  (1 << 9)
38
39 #define PGP_TRADITIONAL_CHECKED (1 << 10)
40
41 #define PGPENCRYPT  (APPLICATION_PGP | ENCRYPT)
42 #define PGPSIGN     (APPLICATION_PGP | SIGN)
43 #define PGPGOODSIGN (APPLICATION_PGP | GOODSIGN)
44 #define PGPKEY      (APPLICATION_PGP | KEYBLOCK)
45 #define PGPINLINE   (APPLICATION_PGP | INLINE)
46
47 #define SMIMEENCRYPT  (APPLICATION_SMIME | ENCRYPT)
48 #define SMIMESIGN     (APPLICATION_SMIME | SIGN)
49 #define SMIMEGOODSIGN (APPLICATION_SMIME | GOODSIGN)
50 #define SMIMEBADSIGN  (APPLICATION_SMIME | BADSIGN)
51 #define SMIMEOPAQUE   (APPLICATION_SMIME | SIGNOPAQUE)
52
53
54 /* WITHCRYPTO actually replaces ifdefs so make the code more readable.
55    Because it is defined as a constant and known at compile time, the
56    compiler can do dead code elimination and thus it behaves
57    effectively as a conditional compile directive. It is set to false
58    if no crypto backend is configures or to a bit vector denoting the
59    configured backends. */
60 #if (defined(CRYPT_BACKEND_CLASSIC_PGP) && defined(CRYPT_BACKEND_CLASSIC_SMIME)) || defined (CRYPT_BACKEND_GPGME)
61 # define WithCrypto (APPLICATION_PGP | APPLICATION_SMIME)
62 #elif defined(CRYPT_BACKEND_CLASSIC_PGP)
63 # define WithCrypto  APPLICATION_PGP
64 #elif defined(CRYPT_BACKEND_CLASSIC_SMIME)
65 # define WithCrypto  APPLICATION_SMIME
66 #else
67 # define WithCrypto 0
68 #endif
69
70
71 #define KEYFLAG_CANSIGN                 (1 <<  0)
72 #define KEYFLAG_CANENCRYPT              (1 <<  1)
73 #define KEYFLAG_ISX509                  (1 <<  2)
74 #define KEYFLAG_SECRET                  (1 <<  7)
75 #define KEYFLAG_EXPIRED                 (1 <<  8)
76 #define KEYFLAG_REVOKED                 (1 <<  9)
77 #define KEYFLAG_DISABLED                (1 << 10)
78 #define KEYFLAG_SUBKEY                  (1 << 11)
79 #define KEYFLAG_CRITICAL                (1 << 12)
80 #define KEYFLAG_PREFER_ENCRYPTION       (1 << 13)
81 #define KEYFLAG_PREFER_SIGNING          (1 << 14)
82
83 #define KEYFLAG_CANTUSE (KEYFLAG_DISABLED|KEYFLAG_REVOKED|KEYFLAG_EXPIRED)
84 #define KEYFLAG_RESTRICTIONS (KEYFLAG_CANTUSE|KEYFLAG_CRITICAL)
85
86 #define KEYFLAG_ABILITIES (KEYFLAG_CANSIGN|KEYFLAG_CANENCRYPT|KEYFLAG_PREFER_ENCRYPTION|KEYFLAG_PREFER_SIGNING)
87
88 enum pgp_ring {
89   PGP_PUBRING,
90   PGP_SECRING
91 };
92 typedef enum pgp_ring pgp_ring_t;
93
94
95 struct pgp_keyinfo;
96 typedef struct pgp_keyinfo *pgp_key_t;
97
98
99
100 /* Some prototypes -- old crypt.h. */
101
102 int mutt_protect (HEADER *, char *);
103
104 int mutt_is_multipart_encrypted (BODY *);
105
106 int mutt_is_multipart_signed (BODY *);
107
108 int mutt_is_application_pgp (BODY *);
109
110 int mutt_is_application_smime (BODY *);
111
112 int mutt_signed_handler (BODY *, STATE *);
113
114 int mutt_parse_crypt_hdr (char *, int);
115
116
117 void convert_to_7bit (BODY *);
118
119
120
121 /*-- crypt.c --*/
122
123 /* Print the current time. */
124 void crypt_current_time (STATE * s, char *app_name);
125
126 /* Check out the type of encryption used and set the cached status
127    values if there are any. */
128 int crypt_query (BODY * m);
129
130 /* Fixme: To be documented. */
131 void crypt_extract_keys_from_messages (HEADER * h);
132
133 /* Do a quick check to make sure that we can find all of the
134    encryption keys if the user has requested this service. 
135    Return the list of keys in KEYLIST. */
136 int crypt_get_keys (HEADER * msg, char **keylist);
137
138 /* Forget a passphrase and display a message. */
139 void crypt_forget_passphrase (void);
140
141 /* Check that we have a usable passphrase, ask if not. */
142 int crypt_valid_passphrase (int);
143
144 /* Write the message body/part A described by state S to a the given
145    TEMPFILE.  */
146 int crypt_write_signed (BODY * a, STATE * s, const char *tempf);
147
148
149
150 /*-- cryptglue.c --*/
151
152 /* Show a message that a backend will be invoked. */
153 void crypt_invoke_message (int type);
154
155
156 /* Silently forget about a passphrase. */
157 void crypt_pgp_void_passphrase (void);
158
159 int crypt_pgp_valid_passphrase (void);
160
161
162 /* Decrypt a PGP/MIME message. */
163 int crypt_pgp_decrypt_mime (FILE * a, FILE ** b, BODY * c, BODY ** d);
164
165 /* MIME handler for the application/pgp content-type. */
166 int crypt_pgp_application_pgp_handler (BODY * m, STATE * s);
167
168 /* MIME handler for an PGP/MIME encrypted message. */
169 int crypt_pgp_encrypted_handler (BODY * a, STATE * s);
170
171 /* fixme: needs documentation. */
172 void crypt_pgp_invoke_getkeys (ADDRESS * addr);
173
174 /* Ask for a PGP key. */
175 pgp_key_t crypt_pgp_ask_for_key (char *tag, char *whatfor,
176                                  short abilities, pgp_ring_t keyring);
177
178 /* Check for a traditional PGP message in body B. */
179 int crypt_pgp_check_traditional (FILE * fp, BODY * b, int tagged_only);
180
181 /* fixme: needs documentation. */
182 BODY *crypt_pgp_traditional_encryptsign (BODY * a, int flags, char *keylist);
183
184 /* Release the PGP key KPP (note, that we pass a pointer to it). */
185 void crypt_pgp_free_key (pgp_key_t * kpp);
186
187 /* Generate a PGP public key attachment. */
188 BODY *crypt_pgp_make_key_attachment (char *tempf);
189
190 /* This routine attempts to find the keyids of the recipients of a
191    message.  It returns NULL if any of the keys can not be found.  */
192 char *crypt_pgp_findkeys (ADDRESS * to, ADDRESS * cc, ADDRESS * bcc);
193
194 /* Create a new body with a PGP signed message from A. */
195 BODY *crypt_pgp_sign_message (BODY * a);
196
197 /* Warning: A is no longer freed in this routine, you need to free it
198    later.  This is necessary for $fcc_attach. */
199 BODY *crypt_pgp_encrypt_message (BODY * a, char *keylist, int sign);
200
201 /* Invoke the PGP command to import a key. */
202 void crypt_pgp_invoke_import (const char *fname);
203
204 int crypt_pgp_send_menu (HEADER * msg, int *redraw);
205
206 /* fixme: needs documentation */
207 int crypt_pgp_verify_one (BODY * sigbdy, STATE * s, const char *tempf);
208
209 /* Access the keyID in K. */
210 char *crypt_pgp_keyid (pgp_key_t k);
211
212 /* fixme: needs documentation */
213 void crypt_pgp_extract_keys_from_attachment_list (FILE * fp, int tag,
214                                                   BODY * top);
215
216
217
218
219
220 /* Silently forget about a passphrase. */
221 void crypt_smime_void_passphrase (void);
222
223 int crypt_smime_valid_passphrase (void);
224
225 /* Decrypt an S/MIME message. */
226 int crypt_smime_decrypt_mime (FILE * a, FILE ** b, BODY * c, BODY ** d);
227
228 /* MIME handler for the application/smime content-type. */
229 int crypt_smime_application_smime_handler (BODY * m, STATE * s);
230
231 /* fixme: Needs documentation. */
232 void crypt_smime_getkeys (ENVELOPE * env);
233
234 /* Check that the sender matches. */
235 int crypt_smime_verify_sender (HEADER * h);
236
237 /* Ask for an SMIME key. */
238 char *crypt_smime_ask_for_key (char *prompt, char *mailbox, short public);
239
240 /* This routine attempts to find the keyids of the recipients of a
241    message.  It returns NULL if any of the keys can not be found.  */
242 char *crypt_smime_findkeys (ADDRESS * to, ADDRESS * cc, ADDRESS * bcc);
243
244 /* fixme: Needs documentation. */
245 BODY *crypt_smime_sign_message (BODY * a);
246
247 /* fixme: needs documentation. */
248 BODY *crypt_smime_build_smime_entity (BODY * a, char *certlist);
249
250 /* Add a certificate and update index file (externally). */
251 void crypt_smime_invoke_import (char *infile, char *mailbox);
252
253 int crypt_smime_send_menu (HEADER * msg, int *redraw);
254
255 /* fixme: needs documentation */
256 int crypt_smime_verify_one (BODY * sigbdy, STATE * s, const char *tempf);
257
258 void crypt_init (void);
259
260 #endif /*MUTT_CRYPT_H */