File: lib.h

package info (click to toggle)
neomutt 20250510%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 23,372 kB
  • sloc: ansic: 171,730; sh: 5,357; perl: 1,121; tcl: 1,065; python: 443; makefile: 48
file content (199 lines) | stat: -rw-r--r-- 10,762 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
/**
 * @file
 * API for encryption/signing of emails
 *
 * @authors
 * Copyright (C) 2017-2023 Richard Russon <rich@flatcap.org>
 * Copyright (C) 2021 Pietro Cerutti <gahr@gahr.ch>
 *
 * @copyright
 * This program is free software: you can redistribute it and/or modify it under
 * the terms of the GNU General Public License as published by the Free Software
 * Foundation, either version 2 of the License, or (at your option) any later
 * version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
 * details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program.  If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * @page lib_ncrypt Ncrypt
 *
 * Encrypt/decrypt/sign/verify emails
 *
 * | File                             | Description                          |
 * | :------------------------------- | :----------------------------------- |
 * | ncrypt/config.c                  | @subpage crypt_config                |
 * | ncrypt/crypt.c                   | @subpage crypt_crypt                 |
 * | ncrypt/crypt_gpgme.c             | @subpage crypt_crypt_gpgme           |
 * | ncrypt/crypt_mod.c               | @subpage crypt_crypt_mod             |
 * | ncrypt/crypt_mod_pgp_classic.c   | @subpage crypt_crypt_mod_pgp         |
 * | ncrypt/crypt_mod_pgp_gpgme.c     | @subpage crypt_crypt_mod_pgp_gpgme   |
 * | ncrypt/crypt_mod_smime_classic.c | @subpage crypt_crypt_mod_smime       |
 * | ncrypt/crypt_mod_smime_gpgme.c   | @subpage crypt_crypt_mod_smime_gpgme |
 * | ncrypt/cryptglue.c               | @subpage crypt_cryptglue             |
 * | ncrypt/dlg_gpgme.c               | @subpage crypt_dlg_gpgme             |
 * | ncrypt/dlg_pgp.c                 | @subpage crypt_dlg_pgp               |
 * | ncrypt/dlg_smime.c               | @subpage crypt_dlg_smime             |
 * | ncrypt/expando_command.c         | @subpage ncrypt_expando_command      |
 * | ncrypt/expando_gpgme.c           | @subpage ncrypt_expando_gpgme        |
 * | ncrypt/expando_pgp.c             | @subpage ncrypt_expando_pgp          |
 * | ncrypt/expando_smime.c           | @subpage ncrypt_expando_smime        |
 * | ncrypt/functions.c               | @subpage crypt_functions             |
 * | ncrypt/gnupgparse.c              | @subpage crypt_gnupg                 |
 * | ncrypt/gpgme_functions.c         | @subpage crypt_gpgme_functions       |
 * | ncrypt/pgp.c                     | @subpage crypt_pgp                   |
 * | ncrypt/pgp_functions.c           | @subpage pgp_functions               |
 * | ncrypt/pgpinvoke.c               | @subpage crypt_pgpinvoke             |
 * | ncrypt/pgpkey.c                  | @subpage crypt_pgpkey                |
 * | ncrypt/pgplib.c                  | @subpage crypt_pgplib                |
 * | ncrypt/pgpmicalg.c               | @subpage crypt_pgpmicalg             |
 * | ncrypt/pgppacket.c               | @subpage crypt_pgppacket             |
 * | ncrypt/smime.c                   | @subpage crypt_smime                 |
 * | ncrypt/smime_functions.c         | @subpage smime_functions             |
 * | ncrypt/sort_gpgme.c              | @subpage crypt_sort_gpgme            |
 * | ncrypt/sort_pgp.c                | @subpage crypt_sort_pgp              |
 */

#ifndef MUTT_NCRYPT_LIB_H
#define MUTT_NCRYPT_LIB_H

#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>

struct Address;
struct Body;
#ifdef USE_AUTOCRYPT
struct Buffer;
#endif
struct Email;
struct EmailArray;
struct Envelope;
struct Mailbox;
struct Message;
struct State;

typedef uint16_t SecurityFlags;           ///< Flags, e.g. #SEC_ENCRYPT
#define SEC_NO_FLAGS                  0   ///< No flags are set
#define SEC_ENCRYPT             (1 << 0)  ///< Email is encrypted
#define SEC_SIGN                (1 << 1)  ///< Email is signed
#define SEC_GOODSIGN            (1 << 2)  ///< Email has a valid signature
#define SEC_BADSIGN             (1 << 3)  ///< Email has a bad signature
#define SEC_PARTSIGN            (1 << 4)  ///< Not all parts of the email is signed
#define SEC_SIGNOPAQUE          (1 << 5)  ///< Email has an opaque signature (encrypted)
#define SEC_KEYBLOCK            (1 << 6)  ///< Email has a key attached
#define SEC_INLINE              (1 << 7)  ///< Email has an inline signature
#define SEC_OPPENCRYPT          (1 << 8)  ///< Opportunistic encrypt mode
#define SEC_AUTOCRYPT           (1 << 9)  ///< (Autocrypt) Message will be, or was Autocrypt encrypt+signed
#define SEC_AUTOCRYPT_OVERRIDE  (1 << 10) ///< (Autocrypt) Indicates manual set/unset of encryption

#define APPLICATION_PGP         (1 << 11) ///< Use PGP to encrypt/sign
#define APPLICATION_SMIME       (1 << 12) ///< Use SMIME to encrypt/sign
#define PGP_TRADITIONAL_CHECKED (1 << 13) ///< Email has a traditional (inline) signature

#define SEC_ALL_FLAGS          ((1 << 14) - 1)

#define PGP_ENCRYPT  (APPLICATION_PGP | SEC_ENCRYPT)
#define PGP_SIGN     (APPLICATION_PGP | SEC_SIGN)
#define PGP_GOODSIGN (APPLICATION_PGP | SEC_GOODSIGN)
#define PGP_KEY      (APPLICATION_PGP | SEC_KEYBLOCK)
#define PGP_INLINE   (APPLICATION_PGP | SEC_INLINE)

#define SMIME_ENCRYPT  (APPLICATION_SMIME | SEC_ENCRYPT)
#define SMIME_SIGN     (APPLICATION_SMIME | SEC_SIGN)
#define SMIME_GOODSIGN (APPLICATION_SMIME | SEC_GOODSIGN)
#define SMIME_BADSIGN  (APPLICATION_SMIME | SEC_BADSIGN)
#define SMIME_OPAQUE   (APPLICATION_SMIME | SEC_SIGNOPAQUE)

/* WITHCRYPTO actually replaces ifdefs to make the code more readable.
 * Because it is defined as a constant and known at compile time, the
 * compiler can do dead code elimination and thus it behaves
 * effectively as a conditional compile directive. It is set to false
 * if no crypto backend is configured or to a bit vector denoting the
 * configured backends. */
#if (defined(CRYPT_BACKEND_CLASSIC_PGP) && defined(CRYPT_BACKEND_CLASSIC_SMIME)) || \
    defined(CRYPT_BACKEND_GPGME)
#define WithCrypto (APPLICATION_PGP | APPLICATION_SMIME)
#elif defined(CRYPT_BACKEND_CLASSIC_PGP)
#define WithCrypto APPLICATION_PGP
#elif defined(CRYPT_BACKEND_CLASSIC_SMIME)
#define WithCrypto APPLICATION_SMIME
#else
#define WithCrypto 0
#endif

typedef uint16_t KeyFlags;                  ///< Flags describing PGP/SMIME keys, e.g. #KEYFLAG_CANSIGN
#define KEYFLAG_NO_FLAGS                0   ///< No flags are set
#define KEYFLAG_CANSIGN           (1 << 0)  ///< Key is suitable for signing
#define KEYFLAG_CANENCRYPT        (1 << 1)  ///< Key is suitable for encryption
#define KEYFLAG_ISX509            (1 << 2)  ///< Key is an X.509 key
#define KEYFLAG_SECRET            (1 << 7)  ///< Key is a secret key
#define KEYFLAG_EXPIRED           (1 << 8)  ///< Key is expired
#define KEYFLAG_REVOKED           (1 << 9)  ///< Key is revoked
#define KEYFLAG_DISABLED          (1 << 10) ///< Key is marked disabled
#define KEYFLAG_SUBKEY            (1 << 11) ///< Key is a subkey
#define KEYFLAG_CRITICAL          (1 << 12) ///< Key is marked critical
#define KEYFLAG_PREFER_ENCRYPTION (1 << 13) ///< Key's owner prefers encryption
#define KEYFLAG_PREFER_SIGNING    (1 << 14) ///< Key's owner prefers signing

#define KEYFLAG_CANTUSE (KEYFLAG_DISABLED | KEYFLAG_REVOKED | KEYFLAG_EXPIRED)
#define KEYFLAG_RESTRICTIONS (KEYFLAG_CANTUSE | KEYFLAG_CRITICAL)

#define KEYFLAG_ABILITIES (KEYFLAG_CANSIGN | KEYFLAG_CANENCRYPT | KEYFLAG_PREFER_ENCRYPTION | KEYFLAG_PREFER_SIGNING)

/* crypt.c */
void          crypt_extract_keys_from_messages         (struct Mailbox *m, struct EmailArray *ea);
void          crypt_forget_passphrase                  (void);
int           crypt_get_keys                           (struct Email *e, char **keylist, bool oppenc_mode);
void          crypt_opportunistic_encrypt              (struct Email *e);
SecurityFlags crypt_query                              (struct Body *b);
bool          crypt_valid_passphrase                   (SecurityFlags flags);
SecurityFlags mutt_is_application_pgp                  (const struct Body *b);
SecurityFlags mutt_is_application_smime                (struct Body *b);
SecurityFlags mutt_is_malformed_multipart_pgp_encrypted(struct Body *b);
SecurityFlags mutt_is_multipart_encrypted              (struct Body *b);
SecurityFlags mutt_is_multipart_signed                 (struct Body *b);
int           mutt_is_valid_multipart_pgp_encrypted    (struct Body *b);
int           mutt_protected_headers_handler           (struct Body *b, struct State *state);
int           mutt_protect                             (struct Email *e, char *keylist, bool postpone);
bool          mutt_should_hide_protected_subject       (struct Email *e);
int           mutt_signed_handler                      (struct Body *b, struct State *state);

/* cryptglue.c */
void          crypt_cleanup                            (void);
bool          crypt_has_module_backend                 (SecurityFlags type);
void          crypt_init                               (void);
void          crypt_invoke_message                     (SecurityFlags type);
int           crypt_pgp_application_handler            (struct Body *b_email, struct State *state);
bool          crypt_pgp_check_traditional              (FILE *fp, struct Body *b, bool just_one);
int           crypt_pgp_decrypt_mime                   (FILE *fp_in, FILE **fp_out, struct Body *b, struct Body **b_dec);
int           crypt_pgp_encrypted_handler              (struct Body *b_email, struct State *state);
void          crypt_pgp_extract_key_from_attachment    (FILE *fp, struct Body *b);
void          crypt_pgp_invoke_getkeys                 (struct Address *addr);
struct Body * crypt_pgp_make_key_attachment            (void);
SecurityFlags crypt_pgp_send_menu                      (struct Email *e);
int           crypt_smime_application_handler          (struct Body *b_email, struct State *state);
int           crypt_smime_decrypt_mime                 (FILE *fp_in, FILE **fp_out, struct Body *b, struct Body **b_dec);
void          crypt_smime_getkeys                      (struct Envelope *env);
SecurityFlags crypt_smime_send_menu                    (struct Email *e);
int           crypt_smime_verify_sender                (struct Email *e, struct Message *msg);

/* crypt_mod.c */
void          crypto_module_cleanup                    (void);

#ifdef CRYPT_BACKEND_GPGME
/* crypt_gpgme.c */
void          pgp_gpgme_init                           (void);
#ifdef USE_AUTOCRYPT
int          mutt_gpgme_select_secret_key              (struct Buffer *keyid);
#endif
const char  * mutt_gpgme_print_version                 (void);
#endif

#endif /* MUTT_NCRYPT_LIB_H */