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