NeoMutt  2024-12-12-14-g7b49f7
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
lib.h
Go to the documentation of this file.
1
63#ifndef MUTT_NCRYPT_LIB_H
64#define MUTT_NCRYPT_LIB_H
65
66#include <stdbool.h>
67#include <stdint.h>
68#include <stdio.h>
69
70struct Address;
71struct Body;
72#ifdef USE_AUTOCRYPT
73struct Buffer;
74#endif
75struct Email;
76struct EmailArray;
77struct Envelope;
78struct Mailbox;
79struct Message;
80struct State;
81
82typedef uint16_t SecurityFlags;
83#define SEC_NO_FLAGS 0
84#define SEC_ENCRYPT (1 << 0)
85#define SEC_SIGN (1 << 1)
86#define SEC_GOODSIGN (1 << 2)
87#define SEC_BADSIGN (1 << 3)
88#define SEC_PARTSIGN (1 << 4)
89#define SEC_SIGNOPAQUE (1 << 5)
90#define SEC_KEYBLOCK (1 << 6)
91#define SEC_INLINE (1 << 7)
92#define SEC_OPPENCRYPT (1 << 8)
93#define SEC_AUTOCRYPT (1 << 9)
94#define SEC_AUTOCRYPT_OVERRIDE (1 << 10)
95
96#define APPLICATION_PGP (1 << 11)
97#define APPLICATION_SMIME (1 << 12)
98#define PGP_TRADITIONAL_CHECKED (1 << 13)
99
100#define SEC_ALL_FLAGS ((1 << 14) - 1)
101
102#define PGP_ENCRYPT (APPLICATION_PGP | SEC_ENCRYPT)
103#define PGP_SIGN (APPLICATION_PGP | SEC_SIGN)
104#define PGP_GOODSIGN (APPLICATION_PGP | SEC_GOODSIGN)
105#define PGP_KEY (APPLICATION_PGP | SEC_KEYBLOCK)
106#define PGP_INLINE (APPLICATION_PGP | SEC_INLINE)
107
108#define SMIME_ENCRYPT (APPLICATION_SMIME | SEC_ENCRYPT)
109#define SMIME_SIGN (APPLICATION_SMIME | SEC_SIGN)
110#define SMIME_GOODSIGN (APPLICATION_SMIME | SEC_GOODSIGN)
111#define SMIME_BADSIGN (APPLICATION_SMIME | SEC_BADSIGN)
112#define SMIME_OPAQUE (APPLICATION_SMIME | SEC_SIGNOPAQUE)
113
114/* WITHCRYPTO actually replaces ifdefs to make the code more readable.
115 * Because it is defined as a constant and known at compile time, the
116 * compiler can do dead code elimination and thus it behaves
117 * effectively as a conditional compile directive. It is set to false
118 * if no crypto backend is configured or to a bit vector denoting the
119 * configured backends. */
120#if (defined(CRYPT_BACKEND_CLASSIC_PGP) && defined(CRYPT_BACKEND_CLASSIC_SMIME)) || \
121 defined(CRYPT_BACKEND_GPGME)
122#define WithCrypto (APPLICATION_PGP | APPLICATION_SMIME)
123#elif defined(CRYPT_BACKEND_CLASSIC_PGP)
124#define WithCrypto APPLICATION_PGP
125#elif defined(CRYPT_BACKEND_CLASSIC_SMIME)
126#define WithCrypto APPLICATION_SMIME
127#else
128#define WithCrypto 0
129#endif
130
131typedef uint16_t KeyFlags;
132#define KEYFLAG_NO_FLAGS 0
133#define KEYFLAG_CANSIGN (1 << 0)
134#define KEYFLAG_CANENCRYPT (1 << 1)
135#define KEYFLAG_ISX509 (1 << 2)
136#define KEYFLAG_SECRET (1 << 7)
137#define KEYFLAG_EXPIRED (1 << 8)
138#define KEYFLAG_REVOKED (1 << 9)
139#define KEYFLAG_DISABLED (1 << 10)
140#define KEYFLAG_SUBKEY (1 << 11)
141#define KEYFLAG_CRITICAL (1 << 12)
142#define KEYFLAG_PREFER_ENCRYPTION (1 << 13)
143#define KEYFLAG_PREFER_SIGNING (1 << 14)
144
145#define KEYFLAG_CANTUSE (KEYFLAG_DISABLED | KEYFLAG_REVOKED | KEYFLAG_EXPIRED)
146#define KEYFLAG_RESTRICTIONS (KEYFLAG_CANTUSE | KEYFLAG_CRITICAL)
147
148#define KEYFLAG_ABILITIES (KEYFLAG_CANSIGN | KEYFLAG_CANENCRYPT | KEYFLAG_PREFER_ENCRYPTION | KEYFLAG_PREFER_SIGNING)
149
150/* crypt.c */
151void crypt_extract_keys_from_messages (struct Mailbox *m, struct EmailArray *ea);
152void crypt_forget_passphrase (void);
153int crypt_get_keys (struct Email *e, char **keylist, bool oppenc_mode);
154void crypt_opportunistic_encrypt (struct Email *e);
155SecurityFlags crypt_query (struct Body *b);
163int mutt_protected_headers_handler (struct Body *b, struct State *state);
164int mutt_protect (struct Email *e, char *keylist, bool postpone);
166int mutt_signed_handler (struct Body *b, struct State *state);
167
168/* cryptglue.c */
169void crypt_cleanup (void);
171void crypt_init (void);
173int crypt_pgp_application_handler (struct Body *b_email, struct State *state);
174bool crypt_pgp_check_traditional (FILE *fp, struct Body *b, bool just_one);
175int crypt_pgp_decrypt_mime (FILE *fp_in, FILE **fp_out, struct Body *b, struct Body **b_dec);
176int crypt_pgp_encrypted_handler (struct Body *b_email, struct State *state);
177void crypt_pgp_extract_key_from_attachment (FILE *fp, struct Body *b);
178void crypt_pgp_invoke_getkeys (struct Address *addr);
179struct Body * crypt_pgp_make_key_attachment (void);
181int crypt_smime_application_handler (struct Body *b_email, struct State *state);
182int crypt_smime_decrypt_mime (FILE *fp_in, FILE **fp_out, struct Body *b, struct Body **b_dec);
183void crypt_smime_getkeys (struct Envelope *env);
185int crypt_smime_verify_sender (struct Email *e, struct Message *msg);
186
187/* crypt_mod.c */
188void crypto_module_cleanup (void);
189
190#ifdef CRYPT_BACKEND_GPGME
191/* crypt_gpgme.c */
192void pgp_gpgme_init (void);
193#ifdef USE_AUTOCRYPT
194int mutt_gpgme_select_secret_key (struct Buffer *keyid);
195#endif
196const char * mutt_gpgme_print_version (void);
197#endif
198
199#endif /* MUTT_NCRYPT_LIB_H */
void pgp_gpgme_init(void)
Initialise the crypto module - Implements CryptModuleSpecs::init() -.
Definition: crypt_gpgme.c:3865
int crypt_pgp_application_handler(struct Body *b_email, struct State *state)
Wrapper for CryptModuleSpecs::application_handler() - Implements handler_t -.
Definition: cryptglue.c:236
int crypt_smime_application_handler(struct Body *b_email, struct State *state)
Wrapper for CryptModuleSpecs::application_handler() - Implements handler_t -.
Definition: cryptglue.c:443
int crypt_pgp_encrypted_handler(struct Body *b_email, struct State *state)
Wrapper for CryptModuleSpecs::encrypted_handler() - Implements handler_t -.
Definition: cryptglue.c:247
int mutt_protected_headers_handler(struct Body *b, struct State *state)
Handler for protected headers - Implements handler_t -.
Definition: crypt.c:1117
int mutt_signed_handler(struct Body *b, struct State *state)
Handler for "multipart/signed" - Implements handler_t -.
Definition: crypt.c:1243
bool crypt_has_module_backend(SecurityFlags type)
Is there a crypto backend for a given type?
Definition: cryptglue.c:170
void crypt_invoke_message(SecurityFlags type)
Display an informative message.
Definition: cryptglue.c:156
uint16_t SecurityFlags
Flags, e.g. SEC_ENCRYPT.
Definition: lib.h:82
int crypt_pgp_decrypt_mime(FILE *fp_in, FILE **fp_out, struct Body *b, struct Body **b_dec)
Wrapper for CryptModuleSpecs::decrypt_mime()
Definition: cryptglue.c:210
void crypt_opportunistic_encrypt(struct Email *e)
Can all recipients be determined.
Definition: crypt.c:1045
int mutt_gpgme_select_secret_key(struct Buffer *keyid)
Select a private Autocrypt key for a new account.
Definition: crypt_gpgme.c:3685
const char * mutt_gpgme_print_version(void)
Get version of GPGME.
Definition: crypt_gpgme.c:4163
SecurityFlags mutt_is_multipart_signed(struct Body *b)
Is a message signed?
Definition: crypt.c:408
void crypt_cleanup(void)
Clean up backend.
Definition: cryptglue.c:141
void crypt_smime_getkeys(struct Envelope *env)
Wrapper for CryptModuleSpecs::smime_getkeys()
Definition: cryptglue.c:454
SecurityFlags mutt_is_application_smime(struct Body *b)
Does the message use S/MIME?
Definition: crypt.c:609
bool crypt_valid_passphrase(SecurityFlags flags)
Check that we have a usable passphrase, ask if not.
Definition: crypt.c:132
int mutt_is_valid_multipart_pgp_encrypted(struct Body *b)
Is this a valid multi-part encrypted message?
Definition: crypt.c:467
bool mutt_should_hide_protected_subject(struct Email *e)
Should NeoMutt hide the protected subject?
Definition: crypt.c:1100
uint16_t KeyFlags
Flags describing PGP/SMIME keys, e.g. KEYFLAG_CANSIGN.
Definition: lib.h:131
bool crypt_pgp_check_traditional(FILE *fp, struct Body *b, bool just_one)
Wrapper for CryptModuleSpecs::pgp_check_traditional()
Definition: cryptglue.c:282
void crypto_module_cleanup(void)
Clean up the crypto modules.
Definition: crypt_mod.c:84
struct Body * crypt_pgp_make_key_attachment(void)
Wrapper for CryptModuleSpecs::pgp_make_key_attachment()
Definition: cryptglue.c:304
SecurityFlags crypt_smime_send_menu(struct Email *e)
Wrapper for CryptModuleSpecs::send_menu()
Definition: cryptglue.c:527
void crypt_extract_keys_from_messages(struct Mailbox *m, struct EmailArray *ea)
Extract keys from a message.
Definition: crypt.c:858
SecurityFlags crypt_pgp_send_menu(struct Email *e)
Wrapper for CryptModuleSpecs::send_menu()
Definition: cryptglue.c:383
void crypt_pgp_invoke_getkeys(struct Address *addr)
Wrapper for CryptModuleSpecs::pgp_invoke_getkeys()
Definition: cryptglue.c:273
SecurityFlags mutt_is_multipart_encrypted(struct Body *b)
Does the message have encrypted parts?
Definition: crypt.c:443
int mutt_protect(struct Email *e, char *keylist, bool postpone)
Encrypt and/or sign a message.
Definition: crypt.c:157
void crypt_forget_passphrase(void)
Forget a passphrase and display a message.
Definition: crypt.c:90
void crypt_pgp_extract_key_from_attachment(FILE *fp, struct Body *b)
Wrapper for CryptModuleSpecs::pgp_extract_key_from_attachment()
Definition: cryptglue.c:394
int crypt_smime_verify_sender(struct Email *e, struct Message *msg)
Wrapper for CryptModuleSpecs::smime_verify_sender()
Definition: cryptglue.c:463
SecurityFlags mutt_is_malformed_multipart_pgp_encrypted(struct Body *b)
Check for malformed layout.
Definition: crypt.c:504
int crypt_smime_decrypt_mime(FILE *fp_in, FILE **fp_out, struct Body *b, struct Body **b_dec)
Wrapper for CryptModuleSpecs::decrypt_mime()
Definition: cryptglue.c:432
void crypt_init(void)
Initialise the crypto backends.
Definition: cryptglue.c:93
int crypt_get_keys(struct Email *e, char **keylist, bool oppenc_mode)
Check we have all the keys we need.
Definition: crypt.c:961
SecurityFlags mutt_is_application_pgp(const struct Body *b)
Does the message use PGP?
Definition: crypt.c:548
SecurityFlags crypt_query(struct Body *b)
Check out the type of encryption used.
Definition: crypt.c:687
An email address.
Definition: address.h:36
The body of an email.
Definition: body.h:36
String manipulation buffer.
Definition: buffer.h:36
The envelope/body of an email.
Definition: email.h:39
The header of an Email.
Definition: envelope.h:57
A mailbox.
Definition: mailbox.h:79
A local copy of an email.
Definition: message.h:34
Keep track when processing files.
Definition: state.h:48
StateFlags flags
Flags, e.g. STATE_DISPLAY.
Definition: state.h:52
FILE * fp_out
File to write to.
Definition: state.h:50
FILE * fp_in
File to read from.
Definition: state.h:49