NeoMutt  2025-12-11-980-ge38c27
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
lib.h File Reference

API for encryption/signing of emails. More...

#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
+ Include dependency graph for lib.h:

Go to the source code of this file.

Macros

#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)
 Mask for all security flags.
 
#define PGP_ENCRYPT   (APPLICATION_PGP | SEC_ENCRYPT)
 Email is PGP encrypted.
 
#define PGP_SIGN   (APPLICATION_PGP | SEC_SIGN)
 Email is PGP signed.
 
#define PGP_GOODSIGN   (APPLICATION_PGP | SEC_GOODSIGN)
 Email has a good PGP signature.
 
#define PGP_KEY   (APPLICATION_PGP | SEC_KEYBLOCK)
 Email contains a PGP key.
 
#define PGP_INLINE   (APPLICATION_PGP | SEC_INLINE)
 Email is inline PGP encrypted/signed.
 
#define SMIME_ENCRYPT   (APPLICATION_SMIME | SEC_ENCRYPT)
 Email is S/MIME encrypted.
 
#define SMIME_SIGN   (APPLICATION_SMIME | SEC_SIGN)
 Email is S/MIME signed.
 
#define SMIME_GOODSIGN   (APPLICATION_SMIME | SEC_GOODSIGN)
 Email has a good S/MIME signature.
 
#define SMIME_BADSIGN   (APPLICATION_SMIME | SEC_BADSIGN)
 Email has a bad S/MIME signature.
 
#define SMIME_OPAQUE   (APPLICATION_SMIME | SEC_SIGNOPAQUE)
 Email has an opaque S/MIME signature.
 
#define WithCrypto   (APPLICATION_PGP | APPLICATION_SMIME)
 
#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)
 

Typedefs

typedef uint16_t SecurityFlags
 
typedef uint16_t KeyFlags
 

Enumerations

enum  SecurityFlag {
  SEC_NONE = 0 , SEC_ENCRYPT = 1U << 0 , SEC_SIGN = 1U << 1 , SEC_GOODSIGN = 1U << 2 ,
  SEC_BADSIGN = 1U << 3 , SEC_PARTSIGN = 1U << 4 , SEC_SIGNOPAQUE = 1U << 5 , SEC_KEYBLOCK = 1U << 6 ,
  SEC_INLINE = 1U << 7 , SEC_OPPENCRYPT = 1U << 8 , SEC_AUTOCRYPT = 1U << 9 , SEC_AUTOCRYPT_OVERRIDE = 1U << 10
}
 Flags describing an email's cryptographic state. More...
 
enum  KeyFlag {
  KEYFLAG_NONE = 0 , KEYFLAG_CANSIGN = 1U << 0 , KEYFLAG_CANENCRYPT = 1U << 1 , KEYFLAG_ISX509 = 1U << 2 ,
  KEYFLAG_SECRET = 1U << 7 , KEYFLAG_EXPIRED = 1U << 8 , KEYFLAG_REVOKED = 1U << 9 , KEYFLAG_DISABLED = 1U << 10 ,
  KEYFLAG_SUBKEY = 1U << 11 , KEYFLAG_CRITICAL = 1U << 12 , KEYFLAG_PREFER_ENCRYPTION = 1U << 13 , KEYFLAG_PREFER_SIGNING = 1U << 14
}
 Flags describing PGP/SMIME keys. More...
 

Functions

void pgp_init_keys (struct NeoMutt *n, struct SubMenu *sm_generic)
 Initialise the PGP Keybindings - Implements ::init_keys_api.
 
void crypt_extract_keys_from_messages (struct Mailbox *m, struct EmailArray *ea)
 Extract keys from a message.
 
void crypt_forget_passphrase (void)
 Forget a passphrase and display a message.
 
int crypt_get_keys (struct Email *e, char **keylist, bool oppenc_mode)
 Check we have all the keys we need.
 
void crypt_opportunistic_encrypt (struct Email *e)
 Can all recipients be determined.
 
SecurityFlags crypt_query (struct Body *b)
 Check out the type of encryption used.
 
bool crypt_valid_passphrase (SecurityFlags flags)
 Check that we have a usable passphrase, ask if not.
 
SecurityFlags mutt_is_application_pgp (const struct Body *b)
 Does the message use PGP?
 
SecurityFlags mutt_is_application_smime (struct Body *b)
 Does the message use S/MIME?
 
SecurityFlags mutt_is_malformed_multipart_pgp_encrypted (struct Body *b)
 Check for malformed layout.
 
SecurityFlags mutt_is_multipart_encrypted (struct Body *b)
 Does the message have encrypted parts?
 
SecurityFlags mutt_is_multipart_signed (struct Body *b)
 Is a message signed?
 
int mutt_is_valid_multipart_pgp_encrypted (struct Body *b)
 Is this a valid multi-part encrypted message?
 
int mutt_protected_headers_handler (struct Body *b, struct State *state)
 Handler for protected headers - Implements handler_t -.
 
int mutt_protect (struct Email *e, char *keylist, bool postpone)
 Encrypt and/or sign a message.
 
bool mutt_should_hide_protected_subject (struct Email *e)
 Should NeoMutt hide the protected subject?
 
int mutt_signed_handler (struct Body *b, struct State *state)
 Handler for "multipart/signed" - Implements handler_t -.
 
void crypt_cleanup (struct NcryptModuleData *mod_data)
 Clean up backend.
 
bool crypt_has_module_backend (SecurityFlags type)
 Is there a crypto backend for a given type?
 
void crypt_init (void)
 Initialise the crypto backends.
 
void crypt_invoke_message (SecurityFlags type)
 Display an informative message.
 
int crypt_pgp_application_handler (struct Body *b_email, struct State *state)
 Wrapper for CryptModuleSpecs::application_handler() - Implements handler_t -.
 
bool crypt_pgp_check_traditional (FILE *fp, struct Body *b, bool just_one)
 Wrapper for CryptModuleSpecs::pgp_check_traditional()
 
int crypt_pgp_decrypt_mime (FILE *fp_in, FILE **fp_out, struct Body *b, struct Body **b_dec)
 Wrapper for CryptModuleSpecs::decrypt_mime()
 
int crypt_pgp_encrypted_handler (struct Body *b_email, struct State *state)
 Wrapper for CryptModuleSpecs::encrypted_handler() - Implements handler_t -.
 
void crypt_pgp_extract_key_from_attachment (FILE *fp, struct Body *b)
 Wrapper for CryptModuleSpecs::pgp_extract_key_from_attachment()
 
void crypt_pgp_invoke_getkeys (struct Address *addr)
 Wrapper for CryptModuleSpecs::pgp_invoke_getkeys()
 
struct Bodycrypt_pgp_make_key_attachment (void)
 Wrapper for CryptModuleSpecs::pgp_make_key_attachment()
 
SecurityFlags crypt_pgp_send_menu (struct Email *e)
 Wrapper for CryptModuleSpecs::send_menu()
 
int crypt_smime_application_handler (struct Body *b_email, struct State *state)
 Wrapper for CryptModuleSpecs::application_handler() - Implements handler_t -.
 
int crypt_smime_decrypt_mime (FILE *fp_in, FILE **fp_out, struct Body *b, struct Body **b_dec)
 Wrapper for CryptModuleSpecs::decrypt_mime()
 
void crypt_smime_getkeys (struct Envelope *env)
 Wrapper for CryptModuleSpecs::smime_getkeys()
 
SecurityFlags crypt_smime_send_menu (struct Email *e)
 Wrapper for CryptModuleSpecs::send_menu()
 
int crypt_smime_verify_sender (struct Email *e, struct Message *msg)
 Wrapper for CryptModuleSpecs::smime_verify_sender()
 
void crypto_module_cleanup (struct NcryptModuleData *mod_data)
 Clean up the crypto modules.
 
void pgp_gpgme_init (void)
 Initialise the crypto module - Implements CryptModuleSpecs::init() -.
 
int mutt_gpgme_select_secret_key (struct Buffer *keyid)
 Select a private Autocrypt key for a new account.
 
const char * mutt_gpgme_print_version (void)
 Get version of GPGME.
 

Detailed Description

API for encryption/signing of emails.

Authors
  • Richard Russon
  • Pietro Cerutti

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/.

Definition in file lib.h.

Macro Definition Documentation

◆ APPLICATION_PGP

#define APPLICATION_PGP   (1 << 11)

Use PGP to encrypt/sign.

Definition at line 106 of file lib.h.

◆ APPLICATION_SMIME

#define APPLICATION_SMIME   (1 << 12)

Use SMIME to encrypt/sign.

Definition at line 107 of file lib.h.

◆ PGP_TRADITIONAL_CHECKED

#define PGP_TRADITIONAL_CHECKED   (1 << 13)

Email has a traditional (inline) signature.

Definition at line 108 of file lib.h.

◆ SEC_ALL_FLAGS

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

Mask for all security flags.

Definition at line 110 of file lib.h.

◆ PGP_ENCRYPT

#define PGP_ENCRYPT   (APPLICATION_PGP | SEC_ENCRYPT)

Email is PGP encrypted.

Definition at line 112 of file lib.h.

◆ PGP_SIGN

#define PGP_SIGN   (APPLICATION_PGP | SEC_SIGN)

Email is PGP signed.

Definition at line 113 of file lib.h.

◆ PGP_GOODSIGN

#define PGP_GOODSIGN   (APPLICATION_PGP | SEC_GOODSIGN)

Email has a good PGP signature.

Definition at line 114 of file lib.h.

◆ PGP_KEY

#define PGP_KEY   (APPLICATION_PGP | SEC_KEYBLOCK)

Email contains a PGP key.

Definition at line 115 of file lib.h.

◆ PGP_INLINE

#define PGP_INLINE   (APPLICATION_PGP | SEC_INLINE)

Email is inline PGP encrypted/signed.

Definition at line 116 of file lib.h.

◆ SMIME_ENCRYPT

#define SMIME_ENCRYPT   (APPLICATION_SMIME | SEC_ENCRYPT)

Email is S/MIME encrypted.

Definition at line 118 of file lib.h.

◆ SMIME_SIGN

#define SMIME_SIGN   (APPLICATION_SMIME | SEC_SIGN)

Email is S/MIME signed.

Definition at line 119 of file lib.h.

◆ SMIME_GOODSIGN

#define SMIME_GOODSIGN   (APPLICATION_SMIME | SEC_GOODSIGN)

Email has a good S/MIME signature.

Definition at line 120 of file lib.h.

◆ SMIME_BADSIGN

#define SMIME_BADSIGN   (APPLICATION_SMIME | SEC_BADSIGN)

Email has a bad S/MIME signature.

Definition at line 121 of file lib.h.

◆ SMIME_OPAQUE

#define SMIME_OPAQUE   (APPLICATION_SMIME | SEC_SIGNOPAQUE)

Email has an opaque S/MIME signature.

Definition at line 122 of file lib.h.

◆ WithCrypto

#define WithCrypto   (APPLICATION_PGP | APPLICATION_SMIME)

Definition at line 132 of file lib.h.

◆ KEYFLAG_CANTUSE

#define KEYFLAG_CANTUSE   (KEYFLAG_DISABLED | KEYFLAG_REVOKED | KEYFLAG_EXPIRED)

Definition at line 161 of file lib.h.

◆ KEYFLAG_RESTRICTIONS

#define KEYFLAG_RESTRICTIONS   (KEYFLAG_CANTUSE | KEYFLAG_CRITICAL)

Definition at line 162 of file lib.h.

◆ KEYFLAG_ABILITIES

Definition at line 164 of file lib.h.

Typedef Documentation

◆ SecurityFlags

typedef uint16_t SecurityFlags

Definition at line 104 of file lib.h.

◆ KeyFlags

typedef uint16_t KeyFlags

Definition at line 159 of file lib.h.

Enumeration Type Documentation

◆ SecurityFlag

Flags describing an email's cryptographic state.

Enumerator
SEC_NONE 

No flags are set.

SEC_ENCRYPT 

Email is encrypted.

SEC_SIGN 

Email is signed.

SEC_GOODSIGN 

Email has a valid signature.

SEC_BADSIGN 

Email has a bad signature.

SEC_PARTSIGN 

Not all parts of the email is signed.

SEC_SIGNOPAQUE 

Email has an opaque signature (encrypted)

SEC_KEYBLOCK 

Email has a key attached.

SEC_INLINE 

Email has an inline signature.

SEC_OPPENCRYPT 

Opportunistic encrypt mode.

SEC_AUTOCRYPT 

(Autocrypt) Message will be, or was Autocrypt encrypt+signed

SEC_AUTOCRYPT_OVERRIDE 

(Autocrypt) Indicates manual set/unset of encryption

Definition at line 89 of file lib.h.

90{
91 SEC_NONE = 0,
92 SEC_ENCRYPT = 1U << 0,
93 SEC_SIGN = 1U << 1,
94 SEC_GOODSIGN = 1U << 2,
95 SEC_BADSIGN = 1U << 3,
96 SEC_PARTSIGN = 1U << 4,
97 SEC_SIGNOPAQUE = 1U << 5,
98 SEC_KEYBLOCK = 1U << 6,
99 SEC_INLINE = 1U << 7,
100 SEC_OPPENCRYPT = 1U << 8,
101 SEC_AUTOCRYPT = 1U << 9,
102 SEC_AUTOCRYPT_OVERRIDE = 1U << 10,
103};
@ SEC_NONE
No flags are set.
Definition lib.h:91
@ SEC_OPPENCRYPT
Opportunistic encrypt mode.
Definition lib.h:100
@ SEC_BADSIGN
Email has a bad signature.
Definition lib.h:95
@ SEC_PARTSIGN
Not all parts of the email is signed.
Definition lib.h:96
@ SEC_SIGNOPAQUE
Email has an opaque signature (encrypted)
Definition lib.h:97
@ SEC_SIGN
Email is signed.
Definition lib.h:93
@ SEC_INLINE
Email has an inline signature.
Definition lib.h:99
@ SEC_KEYBLOCK
Email has a key attached.
Definition lib.h:98
@ SEC_ENCRYPT
Email is encrypted.
Definition lib.h:92
@ SEC_AUTOCRYPT
(Autocrypt) Message will be, or was Autocrypt encrypt+signed
Definition lib.h:101
@ SEC_GOODSIGN
Email has a valid signature.
Definition lib.h:94
@ SEC_AUTOCRYPT_OVERRIDE
(Autocrypt) Indicates manual set/unset of encryption
Definition lib.h:102

◆ KeyFlag

enum KeyFlag

Flags describing PGP/SMIME keys.

Enumerator
KEYFLAG_NONE 

No flags are set.

KEYFLAG_CANSIGN 

Key is suitable for signing.

KEYFLAG_CANENCRYPT 

Key is suitable for encryption.

KEYFLAG_ISX509 

Key is an X.509 key.

KEYFLAG_SECRET 

Key is a secret key.

KEYFLAG_EXPIRED 

Key is expired.

KEYFLAG_REVOKED 

Key is revoked.

KEYFLAG_DISABLED 

Key is marked disabled.

KEYFLAG_SUBKEY 

Key is a subkey.

KEYFLAG_CRITICAL 

Key is marked critical.

KEYFLAG_PREFER_ENCRYPTION 

Key's owner prefers encryption.

KEYFLAG_PREFER_SIGNING 

Key's owner prefers signing.

Definition at line 144 of file lib.h.

145{
146 KEYFLAG_NONE = 0,
147 KEYFLAG_CANSIGN = 1U << 0,
148 KEYFLAG_CANENCRYPT = 1U << 1,
149 KEYFLAG_ISX509 = 1U << 2,
150 KEYFLAG_SECRET = 1U << 7,
151 KEYFLAG_EXPIRED = 1U << 8,
152 KEYFLAG_REVOKED = 1U << 9,
153 KEYFLAG_DISABLED = 1U << 10,
154 KEYFLAG_SUBKEY = 1U << 11,
155 KEYFLAG_CRITICAL = 1U << 12,
156 KEYFLAG_PREFER_ENCRYPTION = 1U << 13,
157 KEYFLAG_PREFER_SIGNING = 1U << 14,
158};
@ KEYFLAG_REVOKED
Key is revoked.
Definition lib.h:152
@ KEYFLAG_PREFER_SIGNING
Key's owner prefers signing.
Definition lib.h:157
@ KEYFLAG_NONE
No flags are set.
Definition lib.h:146
@ KEYFLAG_SECRET
Key is a secret key.
Definition lib.h:150
@ KEYFLAG_PREFER_ENCRYPTION
Key's owner prefers encryption.
Definition lib.h:156
@ KEYFLAG_CANSIGN
Key is suitable for signing.
Definition lib.h:147
@ KEYFLAG_ISX509
Key is an X.509 key.
Definition lib.h:149
@ KEYFLAG_EXPIRED
Key is expired.
Definition lib.h:151
@ KEYFLAG_CANENCRYPT
Key is suitable for encryption.
Definition lib.h:148
@ KEYFLAG_SUBKEY
Key is a subkey.
Definition lib.h:154
@ KEYFLAG_DISABLED
Key is marked disabled.
Definition lib.h:153
@ KEYFLAG_CRITICAL
Key is marked critical.
Definition lib.h:155

Function Documentation

◆ pgp_init_keys()

void pgp_init_keys ( struct NeoMutt * n,
struct SubMenu * sm_generic )

Initialise the PGP Keybindings - Implements ::init_keys_api.

Definition at line 84 of file functions.c.

85{
86 struct MenuDefinition *md = NULL;
87 struct SubMenu *sm = NULL;
88
90 md = km_register_menu(MENU_PGP, "pgp");
91 km_menu_add_submenu(md, sm);
92 km_menu_add_submenu(md, sm_generic);
94
96 ASSERT(mod_data);
97 mod_data->menu_pgp = md;
98
100 md = km_register_menu(MENU_SMIME, "smime");
101 km_menu_add_submenu(md, sm);
102 km_menu_add_submenu(md, sm_generic);
104
105 mod_data->menu_smime = md;
106}
void km_menu_add_submenu(struct MenuDefinition *md, struct SubMenu *sm)
Add a SubMenu to a Menu Definition.
Definition init.c:123
struct SubMenu * km_register_submenu(const struct MenuFuncOp functions[])
Register a submenu.
Definition init.c:88
struct MenuDefinition * km_register_menu(int menu, const char *name)
Register a menu.
Definition init.c:105
void km_menu_add_bindings(struct MenuDefinition *md, const struct MenuOpSeq bindings[])
Add Keybindings to a Menu.
Definition init.c:136
@ MODULE_ID_NCRYPT
ModuleNcrypt, Ncrypt
Definition module_api.h:82
static const struct MenuFuncOp OpSmime[]
Functions for the Smime Menu.
Definition functions.c:52
static const struct MenuFuncOp OpPgp[]
Functions for the Pgp Menu.
Definition functions.c:43
static const struct MenuOpSeq PgpDefaultBindings[]
Key bindings for the Pgp Menu.
Definition functions.c:63
static const struct MenuOpSeq SmimeDefaultBindings[]
Key bindings for the Smime Menu.
Definition functions.c:72
void * neomutt_get_module_data(struct NeoMutt *n, enum ModuleId id)
Get the private data for a Module.
Definition neomutt.c:666
#define ASSERT(COND)
Definition signal2.h:59
Functions for a Dialog or Window.
Definition menudef.h:44
Ncrypt private Module data.
Definition module_data.h:39
struct MenuDefinition * menu_smime
S/MIME menu definition.
Definition module_data.h:42
struct MenuDefinition * menu_pgp
PGP menu definition.
Definition module_data.h:41
Collection of related functions.
Definition menudef.h:33
@ MENU_PGP
PGP encryption menu.
Definition type.h:48
@ MENU_SMIME
SMIME encryption menu.
Definition type.h:52
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ crypt_extract_keys_from_messages()

void crypt_extract_keys_from_messages ( struct Mailbox * m,
struct EmailArray * ea )

Extract keys from a message.

Parameters
mMailbox
eaArray of Emails to process

The extracted keys will be added to the user's keyring.

Definition at line 864 of file crypt.c.

865{
866 if (!WithCrypto)
867 return;
868
869 struct Buffer *tempfile = buf_pool_get();
870 buf_mktemp(tempfile);
871 FILE *fp_out = mutt_file_fopen(buf_string(tempfile), "w");
872 if (!fp_out)
873 {
874 mutt_perror("%s", buf_string(tempfile));
875 goto cleanup;
876 }
877
880
881 struct Email **ep = NULL;
882 ARRAY_FOREACH(ep, ea)
883 {
884 struct Email *e = *ep;
885 struct Message *msg = mx_msg_open(m, e);
886 if (!msg)
887 {
888 continue;
889 }
892 {
893 mx_msg_close(m, &msg);
894 mutt_file_fclose(&fp_out);
895 break;
896 }
897
898 if (((WithCrypto & APPLICATION_PGP) != 0) && (e->security & APPLICATION_PGP))
899 {
901 fflush(fp_out);
902
903 mutt_endwin();
904 puts(_("Trying to extract PGP keys...\n"));
906 }
907
909 {
910 const bool encrypt = e->security & SEC_ENCRYPT;
911 mutt_copy_message(fp_out, e, msg,
914 CH_NONE, 0);
915 fflush(fp_out);
916
917 const char *mbox = NULL;
918 if (!TAILQ_EMPTY(&e->env->from))
919 {
921 mbox = buf_string(TAILQ_FIRST(&e->env->from)->mailbox);
922 }
923 else if (!TAILQ_EMPTY(&e->env->sender))
924 {
926 mbox = buf_string(TAILQ_FIRST(&e->env->sender)->mailbox);
927 }
928 if (mbox)
929 {
930 mutt_endwin();
931 puts(_("Trying to extract S/MIME certificates..."));
932 crypt_smime_invoke_import(buf_string(tempfile), mbox);
933 }
934 }
935 mx_msg_close(m, &msg);
936
937 rewind(fp_out);
938 }
939
940 mutt_file_fclose(&fp_out);
941 if (isendwin())
943
944 mutt_file_unlink(buf_string(tempfile));
945
947 OptDontHandlePgpKeys = false;
948
949cleanup:
950 buf_pool_release(&tempfile);
951}
void mutt_expand_aliases(struct AddressList *al)
Expand aliases in a List of Addresses.
Definition alias.c:297
#define ARRAY_FOREACH(elem, head)
Iterate over all elements of the array.
Definition array.h:223
void mutt_parse_mime_message(struct Email *e, FILE *fp)
Parse a MIME email.
Definition commands.c:628
static const char * buf_string(const struct Buffer *buf)
Convert a buffer to a const char * "string".
Definition buffer.h:96
int mutt_copy_message(FILE *fp_out, struct Email *e, struct Message *msg, CopyMessageFlags cmflags, CopyHeaderFlags chflags, int wraplen)
Copy a message from a Mailbox.
Definition copy_email.c:920
@ MUTT_CM_DECODE_SMIME
Used for decoding S/MIME messages.
Definition copy_email.h:52
@ MUTT_CM_DECODE
Decode the message body into text/plain.
Definition copy_email.h:44
@ MUTT_CM_NOHEADER
Don't copy the message header.
Definition copy_email.h:42
@ MUTT_CM_CHARCONV
Perform character set conversions.
Definition copy_email.h:48
@ MUTT_CM_NONE
No flags are set.
Definition copy_email.h:41
#define MUTT_CM_DECODE_CRYPT
Combination flag for decoding any kind of cryptography (PGP or S/MIME)
Definition copy_email.h:58
@ CH_NONE
No flags are set.
Definition copy_email.h:65
bool crypt_valid_passphrase(SecurityFlags flags)
Check that we have a usable passphrase, ask if not.
Definition crypt.c:131
void crypt_pgp_invoke_import(const char *fname)
Wrapper for CryptModuleSpecs::pgp_invoke_import()
Definition cryptglue.c:420
void crypt_smime_invoke_import(const char *infile, const char *mailbox)
Wrapper for CryptModuleSpecs::smime_invoke_import()
Definition cryptglue.c:606
int mutt_any_key_to_continue(const char *s)
Prompt the user to 'press any key' and wait.
Definition curs_lib.c:174
void mutt_endwin(void)
Shutdown curses.
Definition curs_lib.c:152
void mutt_file_unlink(const char *s)
Delete a file, carefully.
Definition file.c:156
#define mutt_file_fclose(FP)
Definition file.h:144
#define mutt_file_fopen(PATH, MODE)
Definition file.h:143
bool OptDontHandlePgpKeys
(pseudo) used to extract PGP keys
Definition globals.c:46
#define mutt_perror(...)
Definition logging2.h:95
#define _(a)
Definition message.h:28
int mx_msg_close(struct Mailbox *m, struct Message **ptr)
Close a message.
Definition mx.c:1185
struct Message * mx_msg_open(struct Mailbox *m, struct Email *e)
Return a stream pointer for a message.
Definition mx.c:1139
#define APPLICATION_PGP
Use PGP to encrypt/sign.
Definition lib.h:106
#define APPLICATION_SMIME
Use SMIME to encrypt/sign.
Definition lib.h:107
#define WithCrypto
Definition lib.h:132
struct Buffer * buf_pool_get(void)
Get a Buffer from the pool.
Definition pool.c:91
void buf_pool_release(struct Buffer **ptr)
Return a Buffer to the pool.
Definition pool.c:111
#define TAILQ_FIRST(head)
Definition queue.h:780
#define TAILQ_EMPTY(head)
Definition queue.h:778
String manipulation buffer.
Definition buffer.h:36
The envelope/body of an email.
Definition email.h:39
struct Envelope * env
Envelope information.
Definition email.h:68
SecurityFlags security
bit 0-10: flags, bit 11,12: application, bit 13: traditional pgp See: ncrypt/lib.h pgplib....
Definition email.h:43
struct AddressList sender
Email's sender.
Definition envelope.h:63
struct AddressList from
Email's 'From' list.
Definition envelope.h:59
A local copy of an email.
Definition message.h:34
FILE * fp
pointer to the message data
Definition message.h:35
#define buf_mktemp(buf)
Definition tmp.h:33
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ crypt_forget_passphrase()

void crypt_forget_passphrase ( void )

Forget a passphrase and display a message.

Definition at line 89 of file crypt.c.

90{
93
96
97 if (WithCrypto)
98 {
99 /* L10N: Due to the implementation details (e.g. some passwords are managed
100 by gpg-agent) we can't know whether we forgot zero, 1, 12, ...
101 passwords. So in English we use "Passphrases". Your language might
102 have other means to express this. */
103 mutt_message(_("Passphrases forgotten"));
104 }
105}
void crypt_smime_void_passphrase(void)
Wrapper for CryptModuleSpecs::void_passphrase()
Definition cryptglue.c:484
void crypt_pgp_void_passphrase(void)
Wrapper for CryptModuleSpecs::void_passphrase()
Definition cryptglue.c:211
#define mutt_message(...)
Definition logging2.h:93
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ crypt_get_keys()

int crypt_get_keys ( struct Email * e,
char ** keylist,
bool oppenc_mode )

Check we have all the keys we need.

Parameters
[in]eEmail with addresses to match
[out]keylistKeys needed
[in]oppenc_modeIf true, use opportunistic encryption
Return values
0Success
-1Error

Do a quick check to make sure that we can find all of the encryption keys if the user has requested this service. Return the list of keys in KEYLIST. If oppenc_mode is true, only keys that can be determined without prompting will be used.

Definition at line 967 of file crypt.c.

968{
969 if (!WithCrypto)
970 return 0;
971
972 struct AddressList addrlist = TAILQ_HEAD_INITIALIZER(addrlist);
973 const char *fqdn = mutt_fqdn(true, NeoMutt->sub);
974 const char *self_encrypt = NULL;
975
976 /* Do a quick check to make sure that we can find all of the encryption
977 * keys if the user has requested this service. */
978
979 *keylist = NULL;
980
981#ifdef USE_AUTOCRYPT
982 if (!oppenc_mode && (e->security & SEC_AUTOCRYPT))
983 {
985 return -1;
986 return 0;
987 }
988#endif
989
991 OptPgpCheckTrust = true;
992
993 mutt_addrlist_copy(&addrlist, &e->env->to, false);
994 mutt_addrlist_copy(&addrlist, &e->env->cc, false);
995 mutt_addrlist_copy(&addrlist, &e->env->bcc, false);
996 mutt_addrlist_qualify(&addrlist, fqdn);
997 mutt_addrlist_dedupe(&addrlist);
998
999 if (oppenc_mode || (e->security & SEC_ENCRYPT))
1000 {
1001 if (((WithCrypto & APPLICATION_PGP) != 0) && (e->security & APPLICATION_PGP))
1002 {
1003 *keylist = crypt_pgp_find_keys(&addrlist, oppenc_mode);
1004 if (!*keylist)
1005 {
1006 mutt_addrlist_clear(&addrlist);
1007 return -1;
1008 }
1009 OptPgpCheckTrust = false;
1010 const bool c_pgp_self_encrypt = cs_subset_bool(NeoMutt->sub, "pgp_self_encrypt");
1011 const char *const c_pgp_default_key = cs_subset_string(NeoMutt->sub, "pgp_default_key");
1012 const enum QuadOption c_pgp_encrypt_self = cs_subset_quad(NeoMutt->sub, "pgp_encrypt_self");
1013 if (c_pgp_self_encrypt || (c_pgp_encrypt_self == MUTT_YES))
1014 self_encrypt = c_pgp_default_key;
1015 }
1016 if (((WithCrypto & APPLICATION_SMIME) != 0) && (e->security & APPLICATION_SMIME))
1017 {
1018 *keylist = crypt_smime_find_keys(&addrlist, oppenc_mode);
1019 if (!*keylist)
1020 {
1021 mutt_addrlist_clear(&addrlist);
1022 return -1;
1023 }
1024 const bool c_smime_self_encrypt = cs_subset_bool(NeoMutt->sub, "smime_self_encrypt");
1025 const char *const c_smime_default_key = cs_subset_string(NeoMutt->sub, "smime_default_key");
1026 const enum QuadOption c_smime_encrypt_self = cs_subset_quad(NeoMutt->sub, "smime_encrypt_self");
1027 if (c_smime_self_encrypt || (c_smime_encrypt_self == MUTT_YES))
1028 self_encrypt = c_smime_default_key;
1029 }
1030 }
1031
1032 if (!oppenc_mode && self_encrypt)
1033 {
1034 const size_t keylist_size = mutt_str_len(*keylist);
1035 MUTT_MEM_REALLOC(keylist, keylist_size + mutt_str_len(self_encrypt) + 2, char);
1036 sprintf(*keylist + keylist_size, " %s", self_encrypt);
1037 }
1038
1039 mutt_addrlist_clear(&addrlist);
1040
1041 return 0;
1042}
void mutt_addrlist_copy(struct AddressList *dst, const struct AddressList *src, bool prune)
Copy a list of addresses into another list.
Definition address.c:776
void mutt_addrlist_qualify(struct AddressList *al, const char *host)
Expand local names in an Address list using a hostname.
Definition address.c:687
void mutt_addrlist_clear(struct AddressList *al)
Unlink and free all Address in an AddressList.
Definition address.c:1475
void mutt_addrlist_dedupe(struct AddressList *al)
Remove duplicate addresses.
Definition address.c:1410
@ AUTOCRYPT_REC_NO
Do no use Autocrypt.
Definition lib.h:168
enum AutocryptRec mutt_autocrypt_ui_recommendation(const struct Email *e, char **keylist)
Get the recommended action for an Email.
Definition autocrypt.c:578
const char * cs_subset_string(const struct ConfigSubset *sub, const char *name)
Get a string config item by name.
Definition helpers.c:291
enum QuadOption cs_subset_quad(const struct ConfigSubset *sub, const char *name)
Get a quad-value config item by name.
Definition helpers.c:192
bool cs_subset_bool(const struct ConfigSubset *sub, const char *name)
Get a boolean config item by name.
Definition helpers.c:47
char * crypt_smime_find_keys(struct AddressList *addrlist, bool oppenc_mode)
Wrapper for CryptModuleSpecs::find_keys()
Definition cryptglue.c:564
char * crypt_pgp_find_keys(struct AddressList *addrlist, bool oppenc_mode)
Wrapper for CryptModuleSpecs::find_keys()
Definition cryptglue.c:363
bool OptPgpCheckTrust
(pseudo) used by dlg_pgp()
Definition globals.c:55
#define MUTT_MEM_REALLOC(pptr, n, type)
Definition memory.h:55
size_t mutt_str_len(const char *a)
Calculate the length of a string, safely.
Definition string.c:503
QuadOption
Possible values for a quad-option.
Definition quad.h:36
@ MUTT_YES
User answered 'Yes', or assume 'Yes'.
Definition quad.h:39
#define TAILQ_HEAD_INITIALIZER(head)
Definition queue.h:694
const char * mutt_fqdn(bool may_hide_host, const struct ConfigSubset *sub)
Get the Fully-Qualified Domain Name.
Definition sendlib.c:717
struct AddressList to
Email's 'To' list.
Definition envelope.h:60
struct AddressList cc
Email's 'Cc' list.
Definition envelope.h:61
struct AddressList bcc
Email's 'Bcc' list.
Definition envelope.h:62
Container for Accounts, Notifications.
Definition neomutt.h:41
struct ConfigSubset * sub
Inherited config items.
Definition neomutt.h:49
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ crypt_opportunistic_encrypt()

void crypt_opportunistic_encrypt ( struct Email * e)

Can all recipients be determined.

Parameters
eEmail

Check if all recipients keys can be automatically determined. Enable encryption if they can, otherwise disable encryption.

Definition at line 1051 of file crypt.c.

1052{
1053 if (!WithCrypto)
1054 return;
1055
1056 const bool c_crypt_opportunistic_encrypt = cs_subset_bool(NeoMutt->sub, "crypt_opportunistic_encrypt");
1057 if (!(c_crypt_opportunistic_encrypt && (e->security & SEC_OPPENCRYPT)))
1058 return;
1059
1060 char *pgpkeylist = NULL;
1061
1062 crypt_get_keys(e, &pgpkeylist, true);
1063 if (pgpkeylist)
1064 {
1065 e->security |= SEC_ENCRYPT;
1066 FREE(&pgpkeylist);
1067 }
1068 else
1069 {
1070 e->security &= ~SEC_ENCRYPT;
1071 }
1072}
int crypt_get_keys(struct Email *e, char **keylist, bool oppenc_mode)
Check we have all the keys we need.
Definition crypt.c:967
#define FREE(x)
Free memory and set the pointer to NULL.
Definition memory.h:68
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ crypt_query()

SecurityFlags crypt_query ( struct Body * b)

Check out the type of encryption used.

Parameters
bBody of email
Return values
numFlags, see SecurityFlags
0Error (SEC_NONE)

Set the cached status values if there are any.

Definition at line 693 of file crypt.c.

694{
695 if (!WithCrypto || !b)
696 return SEC_NONE;
697
699
700 if (b->type == TYPE_APPLICATION)
701 {
704
706 {
708 if (rc && b->goodsig)
709 rc |= SEC_GOODSIGN;
710 if (rc && b->badsig)
711 rc |= SEC_BADSIGN;
712 }
713 }
714 else if (((WithCrypto & APPLICATION_PGP) != 0) && (b->type == TYPE_TEXT))
715 {
717 if (rc && b->goodsig)
718 rc |= SEC_GOODSIGN;
719 }
720
721 if (b->type == TYPE_MULTIPART)
722 {
726
727 if (rc && b->goodsig)
728 rc |= SEC_GOODSIGN;
729#ifdef USE_AUTOCRYPT
730 if (rc && b->is_autocrypt)
731 rc |= SEC_AUTOCRYPT;
732#endif
733 }
734
735 if ((b->type == TYPE_MULTIPART) || (b->type == TYPE_MESSAGE))
736 {
737 SecurityFlags u = b->parts ? SEC_ALL_FLAGS : SEC_NONE; /* Bits set in all parts */
738 SecurityFlags w = SEC_NONE; /* Bits set in any part */
739
740 for (b = b->parts; b; b = b->next)
741 {
742 const SecurityFlags v = crypt_query(b);
743 u &= v;
744 w |= v;
745 }
746 rc |= u | (w & ~SEC_GOODSIGN);
747
748 if ((w & SEC_GOODSIGN) && !(u & SEC_GOODSIGN))
749 rc |= SEC_PARTSIGN;
750 }
751
752 return rc;
753}
SecurityFlags mutt_is_multipart_signed(struct Body *b)
Is a message signed?
Definition crypt.c:409
SecurityFlags mutt_is_application_smime(struct Body *b)
Does the message use S/MIME?
Definition crypt.c:610
SecurityFlags mutt_is_multipart_encrypted(struct Body *b)
Does the message have encrypted parts?
Definition crypt.c:444
SecurityFlags mutt_is_malformed_multipart_pgp_encrypted(struct Body *b)
Check for malformed layout.
Definition crypt.c:505
SecurityFlags mutt_is_application_pgp(const struct Body *b)
Does the message use PGP?
Definition crypt.c:549
SecurityFlags crypt_query(struct Body *b)
Check out the type of encryption used.
Definition crypt.c:693
@ TYPE_MESSAGE
Type: 'message/*'.
Definition mime.h:35
@ TYPE_MULTIPART
Type: 'multipart/*'.
Definition mime.h:37
@ TYPE_APPLICATION
Type: 'application/*'.
Definition mime.h:33
@ TYPE_TEXT
Type: 'text/*'.
Definition mime.h:38
uint16_t SecurityFlags
Definition lib.h:104
#define SEC_ALL_FLAGS
Mask for all security flags.
Definition lib.h:110
struct Body * parts
parts of a multipart or message/rfc822
Definition body.h:73
bool badsig
Bad cryptographic signature (needed to check encrypted s/mime-signatures)
Definition body.h:43
bool is_autocrypt
Flag autocrypt-decrypted messages for replying.
Definition body.h:50
struct Body * next
next attachment in the list
Definition body.h:72
bool goodsig
Good cryptographic signature.
Definition body.h:45
unsigned int type
content-type primary type, ContentType
Definition body.h:40
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ crypt_valid_passphrase()

bool crypt_valid_passphrase ( SecurityFlags flags)

Check that we have a usable passphrase, ask if not.

Parameters
flagsFlags, see SecurityFlags
Return values
trueSuccess
falseFailed

Definition at line 131 of file crypt.c.

132{
133 bool rc = false;
134
135#ifndef DEBUG
136 disable_coredumps();
137#endif
138
139 if (((WithCrypto & APPLICATION_PGP) != 0) && (flags & APPLICATION_PGP))
141
142 if (((WithCrypto & APPLICATION_SMIME) != 0) && (flags & APPLICATION_SMIME))
144
145 return rc;
146}
bool crypt_smime_valid_passphrase(void)
Wrapper for CryptModuleSpecs::valid_passphrase()
Definition cryptglue.c:496
bool crypt_pgp_valid_passphrase(void)
Wrapper for CryptModuleSpecs::valid_passphrase()
Definition cryptglue.c:223
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_is_application_pgp()

SecurityFlags mutt_is_application_pgp ( const struct Body * b)

Does the message use PGP?

Parameters
bBody of email
Return values
>0Message uses PGP, e.g. PGP_ENCRYPT
0Message doesn't use PGP, (SEC_NONE)

Definition at line 549 of file crypt.c.

550{
552 char *p = NULL;
553
554 if (b->type == TYPE_APPLICATION)
555 {
556 if (mutt_istr_equal(b->subtype, "pgp") || mutt_istr_equal(b->subtype, "x-pgp-message"))
557 {
558 p = mutt_param_get(&b->parameter, "x-action");
559 if (p && (mutt_istr_equal(p, "sign") || mutt_istr_equal(p, "signclear")))
560 {
561 t |= PGP_SIGN;
562 }
563
564 p = mutt_param_get(&b->parameter, "format");
565 if (p && mutt_istr_equal(p, "keys-only"))
566 {
567 t |= PGP_KEY;
568 }
569
570 if (t == SEC_NONE)
571 t |= PGP_ENCRYPT; /* not necessarily correct, but... */
572 }
573
574 if (mutt_istr_equal(b->subtype, "pgp-signed"))
575 t |= PGP_SIGN;
576
577 if (mutt_istr_equal(b->subtype, "pgp-keys"))
578 t |= PGP_KEY;
579 }
580 else if ((b->type == TYPE_TEXT) && mutt_istr_equal("plain", b->subtype))
581 {
582 if (((p = mutt_param_get(&b->parameter, "x-mutt-action")) ||
583 (p = mutt_param_get(&b->parameter, "x-action")) ||
584 (p = mutt_param_get(&b->parameter, "action"))) &&
585 mutt_istr_startswith(p, "pgp-sign"))
586 {
587 t |= PGP_SIGN;
588 }
589 else if (p && mutt_istr_startswith(p, "pgp-encrypt"))
590 {
591 t |= PGP_ENCRYPT;
592 }
593 else if (p && mutt_istr_startswith(p, "pgp-keys"))
594 {
595 t |= PGP_KEY;
596 }
597 }
598 if (t)
599 t |= PGP_INLINE;
600
601 return t;
602}
bool mutt_istr_equal(const char *a, const char *b)
Compare two strings, ignoring case.
Definition string.c:678
size_t mutt_istr_startswith(const char *str, const char *prefix)
Check whether a string starts with a prefix, ignoring case.
Definition string.c:246
#define PGP_SIGN
Email is PGP signed.
Definition lib.h:113
#define PGP_ENCRYPT
Email is PGP encrypted.
Definition lib.h:112
#define PGP_INLINE
Email is inline PGP encrypted/signed.
Definition lib.h:116
#define PGP_KEY
Email contains a PGP key.
Definition lib.h:115
char * mutt_param_get(const struct ParameterList *pl, const char *s)
Find a matching Parameter.
Definition parameter.c:85
struct ParameterList parameter
Parameters of the content-type.
Definition body.h:63
char * subtype
content-type subtype
Definition body.h:61
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_is_application_smime()

SecurityFlags mutt_is_application_smime ( struct Body * b)

Does the message use S/MIME?

Parameters
bBody of email
Return values
>0Message uses S/MIME, e.g. SMIME_ENCRYPT
0Message doesn't use S/MIME, (SEC_NONE)

Definition at line 610 of file crypt.c.

611{
612 if (!b)
613 return SEC_NONE;
614
615 if (((b->type & TYPE_APPLICATION) == 0) || !b->subtype)
616 return SEC_NONE;
617
618 char *t = NULL;
619 bool complain = false;
620 /* S/MIME MIME types don't need x- anymore, see RFC2311 */
621 if (mutt_istr_equal(b->subtype, "x-pkcs7-mime") || mutt_istr_equal(b->subtype, "pkcs7-mime"))
622 {
623 t = mutt_param_get(&b->parameter, "smime-type");
624 if (t)
625 {
626 if (mutt_istr_equal(t, "enveloped-data"))
627 return SMIME_ENCRYPT;
628 if (mutt_istr_equal(t, "signed-data"))
629 return SMIME_SIGN | SMIME_OPAQUE;
630 return SEC_NONE;
631 }
632 /* Netscape 4.7 uses
633 * Content-Description: S/MIME Encrypted Message
634 * instead of Content-Type parameter */
635 if (mutt_istr_equal(b->description, "S/MIME Encrypted Message"))
636 return SMIME_ENCRYPT;
637 complain = true;
638 }
639 else if (!mutt_istr_equal(b->subtype, "octet-stream"))
640 {
641 return SEC_NONE;
642 }
643
644 t = mutt_param_get(&b->parameter, "name");
645
646 if (!t)
647 t = b->d_filename;
648 if (!t)
649 t = b->filename;
650 if (!t)
651 {
652 if (complain)
653 {
654 mutt_message(_("S/MIME messages with no hints on content are unsupported"));
655 }
656 return SEC_NONE;
657 }
658
659 /* no .p7c, .p10 support yet. */
660
661 int len = mutt_str_len(t) - 4;
662 if ((len > 0) && (*(t + len) == '.'))
663 {
664 len++;
665 if (mutt_istr_equal((t + len), "p7m"))
666 {
667 const char *const c_smime_pkcs7_default_smime_type =
668 cs_subset_string(NeoMutt->sub, "smime_pkcs7_default_smime_type");
669 if (mutt_istr_equal(c_smime_pkcs7_default_smime_type, "signed"))
670 return SMIME_SIGN | SMIME_OPAQUE;
671 else if (mutt_istr_equal(c_smime_pkcs7_default_smime_type, "enveloped"))
672 return SMIME_ENCRYPT;
673 else
674 return SEC_NONE;
675 }
676 else if (mutt_istr_equal((t + len), "p7s"))
677 {
678 return SMIME_SIGN | SMIME_OPAQUE;
679 }
680 }
681
682 return SEC_NONE;
683}
#define SMIME_SIGN
Email is S/MIME signed.
Definition lib.h:119
#define SMIME_OPAQUE
Email has an opaque S/MIME signature.
Definition lib.h:122
#define SMIME_ENCRYPT
Email is S/MIME encrypted.
Definition lib.h:118
char * d_filename
filename to be used for the content-disposition header If NULL, filename is used instead.
Definition body.h:56
char * description
content-description
Definition body.h:55
char * filename
When sending a message, this is the file to which this structure refers.
Definition body.h:59
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_is_malformed_multipart_pgp_encrypted()

SecurityFlags mutt_is_malformed_multipart_pgp_encrypted ( struct Body * b)

Check for malformed layout.

Parameters
bBody of email
Return values
numSuccess, see SecurityFlags
0Error, (SEC_NONE)

This checks for the malformed layout caused by MS Exchange in some cases:

<multipart/mixed>
<text/plain>
<application/pgp-encrypted> [BASE64-encoded]
<application/octet-stream> [BASE64-encoded]

Definition at line 505 of file crypt.c.

506{
508 return SEC_NONE;
509
510 if (!b || (b->type != TYPE_MULTIPART) || !b->subtype || !mutt_istr_equal(b->subtype, "mixed"))
511 {
512 return SEC_NONE;
513 }
514
515 b = b->parts;
516 if (!b || (b->type != TYPE_TEXT) || !b->subtype ||
517 !mutt_istr_equal(b->subtype, "plain") || (b->length != 0))
518 {
519 return SEC_NONE;
520 }
521
522 b = b->next;
523 if (!b || (b->type != TYPE_APPLICATION) || !b->subtype ||
524 !mutt_istr_equal(b->subtype, "pgp-encrypted"))
525 {
526 return SEC_NONE;
527 }
528
529 b = b->next;
530 if (!b || (b->type != TYPE_APPLICATION) || !b->subtype ||
531 !mutt_istr_equal(b->subtype, "octet-stream"))
532 {
533 return SEC_NONE;
534 }
535
536 b = b->next;
537 if (b)
538 return SEC_NONE;
539
540 return PGP_ENCRYPT;
541}
LOFF_T length
length (in bytes) of attachment
Definition body.h:53
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_is_multipart_encrypted()

SecurityFlags mutt_is_multipart_encrypted ( struct Body * b)

Does the message have encrypted parts?

Parameters
bBody of email
Return values
numMessage has got encrypted parts, see SecurityFlags
0Message hasn't got encrypted parts (SEC_NONE)

Definition at line 444 of file crypt.c.

445{
446 if ((WithCrypto & APPLICATION_PGP) == 0)
447 return SEC_NONE;
448
449 char *p = NULL;
450
451 if (!b || (b->type != TYPE_MULTIPART) || !b->subtype ||
452 !mutt_istr_equal(b->subtype, "encrypted") ||
453 !(p = mutt_param_get(&b->parameter, "protocol")) ||
454 !mutt_istr_equal(p, "application/pgp-encrypted"))
455 {
456 return SEC_NONE;
457 }
458
459 return PGP_ENCRYPT;
460}
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_is_multipart_signed()

SecurityFlags mutt_is_multipart_signed ( struct Body * b)

Is a message signed?

Parameters
bBody of email
Return values
numMessage is signed, see SecurityFlags
0Message is not signed (SEC_NONE)

Definition at line 409 of file crypt.c.

410{
411 if (!b || (b->type != TYPE_MULTIPART) || !b->subtype || !mutt_istr_equal(b->subtype, "signed"))
412 {
413 return SEC_NONE;
414 }
415
416 char *p = mutt_param_get(&b->parameter, "protocol");
417 if (!p)
418 return SEC_NONE;
419
420 if (mutt_istr_equal(p, "multipart/mixed"))
421 return SEC_SIGN;
422
423 if (((WithCrypto & APPLICATION_PGP) != 0) && mutt_istr_equal(p, "application/pgp-signature"))
424 {
425 return PGP_SIGN;
426 }
427
428 if (((WithCrypto & APPLICATION_SMIME) != 0) &&
429 (mutt_istr_equal(p, "application/x-pkcs7-signature") ||
430 mutt_istr_equal(p, "application/pkcs7-signature")))
431 {
432 return SMIME_SIGN;
433 }
434
435 return SEC_NONE;
436}
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_is_valid_multipart_pgp_encrypted()

int mutt_is_valid_multipart_pgp_encrypted ( struct Body * b)

Is this a valid multi-part encrypted message?

Parameters
bBody of email
Return values
>0Message is valid, with encrypted parts, e.g. PGP_ENCRYPT
0Message hasn't got encrypted parts

Definition at line 468 of file crypt.c.

469{
471 return 0;
472
473 b = b->parts;
474 if (!b || (b->type != TYPE_APPLICATION) || !b->subtype ||
475 !mutt_istr_equal(b->subtype, "pgp-encrypted"))
476 {
477 return 0;
478 }
479
480 b = b->next;
481 if (!b || (b->type != TYPE_APPLICATION) || !b->subtype ||
482 !mutt_istr_equal(b->subtype, "octet-stream"))
483 {
484 return 0;
485 }
486
487 return PGP_ENCRYPT;
488}
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_protect()

int mutt_protect ( struct Email * e,
char * keylist,
bool postpone )

Encrypt and/or sign a message.

Parameters
eEmail
keylistList of keys to encrypt to (space-separated)
postponeWhen true, signing is automatically disabled
Return values
0Success
-1Error

Definition at line 156 of file crypt.c.

157{
158 struct Body *pbody = NULL;
159 struct Body *tmp_pbody = NULL;
160 struct Body *tmp_smime_pbody = NULL;
161 struct Body *tmp_pgp_pbody = NULL;
162 bool has_retainable_sig = false;
163
164 if (!WithCrypto)
165 return -1;
166
167 SecurityFlags security = e->security;
168 int sign = security & (SEC_AUTOCRYPT | SEC_SIGN);
169 if (postpone)
170 {
171 sign = SEC_NONE;
172 security &= ~SEC_SIGN;
173 }
174
175 if (!(security & (SEC_ENCRYPT | SEC_AUTOCRYPT)) && !sign)
176 return 0;
177
178 if (sign && !(security & SEC_AUTOCRYPT) && !crypt_valid_passphrase(security))
179 return -1;
180
181 if (((WithCrypto & APPLICATION_PGP) != 0) && !(security & SEC_AUTOCRYPT) &&
182 ((security & PGP_INLINE) == PGP_INLINE))
183 {
184 if ((e->body->type != TYPE_TEXT) || !mutt_istr_equal(e->body->subtype, "plain"))
185 {
186 if (query_quadoption(_("Inline PGP can't be used with attachments. Revert to PGP/MIME?"),
187 NeoMutt->sub, "pgp_mime_auto") != MUTT_YES)
188 {
189 mutt_error(_("Mail not sent: inline PGP can't be used with attachments"));
190 return -1;
191 }
192 }
193 else if (mutt_istr_equal("flowed", mutt_param_get(&e->body->parameter, "format")))
194 {
195 if ((query_quadoption(_("Inline PGP can't be used with format=flowed. Revert to PGP/MIME?"),
196 NeoMutt->sub, "pgp_mime_auto")) != MUTT_YES)
197 {
198 mutt_error(_("Mail not sent: inline PGP can't be used with format=flowed"));
199 return -1;
200 }
201 }
202 else
203 {
204 /* they really want to send it inline... go for it */
205 if (!isendwin())
206 {
207 mutt_endwin();
208 puts(_("Invoking PGP..."));
209 }
210 pbody = crypt_pgp_traditional_encryptsign(e->body, security, keylist);
211 if (pbody)
212 {
213 e->body = pbody;
214 return 0;
215 }
216
217 /* otherwise inline won't work...ask for revert */
218 if (query_quadoption(_("Message can't be sent inline. Revert to using PGP/MIME?"),
219 NeoMutt->sub, "pgp_mime_auto") != MUTT_YES)
220 {
221 mutt_error(_("Mail not sent"));
222 return -1;
223 }
224 }
225
226 /* go ahead with PGP/MIME */
227 }
228
229 if (!isendwin())
230 mutt_endwin();
231
233 tmp_smime_pbody = e->body;
235 tmp_pgp_pbody = e->body;
236
237#ifdef CRYPT_BACKEND_GPGME
238 const bool c_crypt_use_pka = cs_subset_bool(NeoMutt->sub, "crypt_use_pka");
239 if (sign && c_crypt_use_pka)
240#else
241 if (sign)
242#endif
243 {
244 /* Set sender (necessary for e.g. PKA). */
245 const char *mailbox = NULL;
246 struct Address *from = TAILQ_FIRST(&e->env->from);
247 bool free_from = false;
248
249 if (!from)
250 {
251 free_from = true;
253 }
254
255 mailbox = buf_string(from->mailbox);
256 const struct Address *c_envelope_from_address = cs_subset_address(NeoMutt->sub, "envelope_from_address");
257 if (!mailbox && c_envelope_from_address)
258 mailbox = buf_string(c_envelope_from_address->mailbox);
259
260 if (((WithCrypto & APPLICATION_SMIME) != 0) && (security & APPLICATION_SMIME))
262 else if (((WithCrypto & APPLICATION_PGP) != 0) && (security & APPLICATION_PGP))
264
265 if (free_from)
266 mutt_addr_free(&from);
267 }
268
269 const bool c_crypt_protected_headers_write = cs_subset_bool(NeoMutt->sub, "crypt_protected_headers_write");
270 if (c_crypt_protected_headers_write)
271 {
272 const bool c_devel_security = cs_subset_bool(NeoMutt->sub, "devel_security");
273 struct Envelope *protected_headers = mutt_env_new();
274 mutt_env_set_subject(protected_headers, e->env->subject);
275 if (c_devel_security)
276 {
277 mutt_addrlist_copy(&protected_headers->return_path, &e->env->return_path, false);
278 mutt_addrlist_copy(&protected_headers->from, &e->env->from, false);
279 mutt_addrlist_copy(&protected_headers->to, &e->env->to, false);
280 mutt_addrlist_copy(&protected_headers->cc, &e->env->cc, false);
281 mutt_addrlist_copy(&protected_headers->sender, &e->env->sender, false);
282 mutt_addrlist_copy(&protected_headers->reply_to, &e->env->reply_to, false);
283 mutt_addrlist_copy(&protected_headers->mail_followup_to,
284 &e->env->mail_followup_to, false);
285 mutt_addrlist_copy(&protected_headers->x_original_to, &e->env->x_original_to, false);
286 mutt_str_replace(&protected_headers->message_id, e->env->message_id);
287 mutt_list_copy_tail(&protected_headers->references, &e->env->references);
288 mutt_list_copy_tail(&protected_headers->in_reply_to, &e->env->in_reply_to);
289 mutt_env_to_intl(protected_headers, NULL, NULL);
290 }
291 mutt_prepare_envelope(protected_headers, 0, NeoMutt->sub);
292
294 e->body->mime_headers = protected_headers;
295 mutt_param_set(&e->body->parameter, "protected-headers", "v1");
296 }
297
298#ifdef USE_AUTOCRYPT
299 /* A note about e->body->mime_headers. If postpone or send
300 * fails, the mime_headers is cleared out before returning to the
301 * compose menu. So despite the "robustness" code above and in the
302 * gen_gossip_list function below, mime_headers will not be set when
303 * entering mutt_protect().
304 *
305 * This is important to note because the user could toggle
306 * $crypt_protected_headers_write or $autocrypt off back in the
307 * compose menu. We don't want mutt_rfc822_write_header() to write
308 * stale data from one option if the other is set.
309 */
310 const bool c_autocrypt = cs_subset_bool(NeoMutt->sub, "autocrypt");
311 if (c_autocrypt && !postpone && (security & SEC_AUTOCRYPT))
312 {
314 }
315#endif
316
317 if (sign)
318 {
319 if (((WithCrypto & APPLICATION_SMIME) != 0) && (security & APPLICATION_SMIME))
320 {
321 tmp_pbody = crypt_smime_sign_message(e->body, &e->env->from);
322 if (!tmp_pbody)
323 goto bail;
324 pbody = tmp_pbody;
325 tmp_smime_pbody = tmp_pbody;
326 }
327
328 const bool c_pgp_retainable_sigs = cs_subset_bool(NeoMutt->sub, "pgp_retainable_sigs");
329 if (((WithCrypto & APPLICATION_PGP) != 0) && (security & APPLICATION_PGP) &&
330 (!(security & (SEC_ENCRYPT | SEC_AUTOCRYPT)) || c_pgp_retainable_sigs))
331 {
332 tmp_pbody = crypt_pgp_sign_message(e->body, &e->env->from);
333 if (!tmp_pbody)
334 goto bail;
335
336 has_retainable_sig = true;
337 sign = SEC_NONE;
338 pbody = tmp_pbody;
339 tmp_pgp_pbody = tmp_pbody;
340 }
341 }
342
343 if (security & (SEC_ENCRYPT | SEC_AUTOCRYPT))
344 {
345 if (((WithCrypto & APPLICATION_SMIME) != 0) && (security & APPLICATION_SMIME))
346 {
347 tmp_pbody = crypt_smime_build_smime_entity(tmp_smime_pbody, keylist);
348 if (!tmp_pbody)
349 {
350 /* signed ? free it! */
351 goto bail;
352 }
353 /* free tmp_body if messages was signed AND encrypted ... */
354 if ((tmp_smime_pbody != e->body) && (tmp_smime_pbody != tmp_pbody))
355 {
356 /* detach and don't delete e->body,
357 * which tmp_smime_pbody->parts after signing. */
358 tmp_smime_pbody->parts = tmp_smime_pbody->parts->next;
359 e->body->next = NULL;
360 mutt_body_free(&tmp_smime_pbody);
361 }
362 pbody = tmp_pbody;
363 }
364
365 if (((WithCrypto & APPLICATION_PGP) != 0) && (security & APPLICATION_PGP))
366 {
367 pbody = crypt_pgp_encrypt_message(e, tmp_pgp_pbody, keylist, sign, &e->env->from);
368 if (!pbody)
369 {
370 /* did we perform a retainable signature? */
371 if (has_retainable_sig)
372 {
373 /* remove the outer multipart layer */
374 tmp_pgp_pbody = mutt_remove_multipart(tmp_pgp_pbody);
375 /* get rid of the signature */
376 mutt_body_free(&tmp_pgp_pbody->next);
377 }
378
379 goto bail;
380 }
381
382 // destroy temporary signature envelope when doing retainable signatures.
383 if (has_retainable_sig)
384 {
385 tmp_pgp_pbody = mutt_remove_multipart(tmp_pgp_pbody);
386 mutt_body_free(&tmp_pgp_pbody->next);
387 }
388 }
389 }
390
391 if (pbody)
392 {
393 e->body = pbody;
394 return 0;
395 }
396
397bail:
399 mutt_param_delete(&e->body->parameter, "protected-headers");
400 return -1;
401}
void mutt_addr_free(struct Address **ptr)
Free a single Address.
Definition address.c:463
const struct Address * cs_subset_address(const struct ConfigSubset *sub, const char *name)
Get an Address config item by name.
int mutt_autocrypt_generate_gossip_list(struct Email *e)
Create the gossip list headers.
Definition autocrypt.c:844
struct Body * crypt_smime_build_smime_entity(struct Body *b, char *certlist)
Wrapper for CryptModuleSpecs::smime_build_smime_entity()
Definition cryptglue.c:592
struct Body * crypt_smime_sign_message(struct Body *b, const struct AddressList *from)
Wrapper for CryptModuleSpecs::sign_message()
Definition cryptglue.c:578
struct Body * crypt_pgp_traditional_encryptsign(struct Body *b, SecurityFlags flags, char *keylist)
Wrapper for CryptModuleSpecs::pgp_traditional_encryptsign()
Definition cryptglue.c:335
struct Body * crypt_pgp_sign_message(struct Body *b, const struct AddressList *from)
Wrapper for CryptModuleSpecs::sign_message()
Definition cryptglue.c:377
void crypt_pgp_set_sender(const char *sender)
Wrapper for CryptModuleSpecs::set_sender()
Definition cryptglue.c:472
void crypt_smime_set_sender(const char *sender)
Wrapper for CryptModuleSpecs::set_sender()
Definition cryptglue.c:646
struct Body * crypt_pgp_encrypt_message(struct Email *e, struct Body *b, char *keylist, int sign, const struct AddressList *from)
Wrapper for CryptModuleSpecs::pgp_encrypt_message()
Definition cryptglue.c:391
void mutt_body_free(struct Body **ptr)
Free a Body.
Definition body.c:58
int mutt_env_to_intl(struct Envelope *env, const char **tag, char **err)
Convert an Envelope's Address fields to Punycode format.
Definition envelope.c:350
void mutt_env_free(struct Envelope **ptr)
Free an Envelope.
Definition envelope.c:125
struct Envelope * mutt_env_new(void)
Create a new Envelope.
Definition envelope.c:45
void mutt_env_set_subject(struct Envelope *env, const char *subj)
Set both subject and real_subj to subj.
Definition envelope.c:68
#define mutt_error(...)
Definition logging2.h:94
void mutt_list_copy_tail(struct ListHead *dst, const struct ListHead *src)
Copy a list into another list.
Definition list.c:278
struct Body * mutt_remove_multipart(struct Body *b)
Extract the multipart body if it exists.
Definition multipart.c:133
char * mutt_str_replace(char **p, const char *s)
Replace one string with another.
Definition string.c:284
void mutt_param_delete(struct ParameterList *pl, const char *attribute)
Delete a matching Parameter.
Definition parameter.c:143
void mutt_param_set(struct ParameterList *pl, const char *attribute, const char *value)
Set a Parameter.
Definition parameter.c:111
enum QuadOption query_quadoption(const char *prompt, struct ConfigSubset *sub, const char *name)
Ask the user a quad-question.
Definition question.c:384
struct Address * mutt_default_from(struct ConfigSubset *sub)
Get a default 'from' Address.
Definition send.c:1405
void mutt_prepare_envelope(struct Envelope *env, bool final, struct ConfigSubset *sub)
Prepare an email header.
Definition sendlib.c:750
An email address.
Definition address.h:35
struct Buffer * mailbox
Mailbox and host address.
Definition address.h:37
The body of an email.
Definition body.h:36
struct Envelope * mime_headers
Memory hole protected headers.
Definition body.h:76
struct Body * body
List of MIME parts.
Definition email.h:69
The header of an Email.
Definition envelope.h:57
struct AddressList return_path
Return path for the Email.
Definition envelope.h:58
char *const subject
Email's subject.
Definition envelope.h:70
struct AddressList reply_to
Email's 'reply-to'.
Definition envelope.h:64
char * message_id
Message ID.
Definition envelope.h:73
struct AddressList x_original_to
Email's 'X-Original-to'.
Definition envelope.h:66
struct AddressList mail_followup_to
Email's 'mail-followup-to'.
Definition envelope.h:65
struct ListHead references
message references (in reverse order)
Definition envelope.h:83
struct ListHead in_reply_to
in-reply-to header content
Definition envelope.h:84
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_should_hide_protected_subject()

bool mutt_should_hide_protected_subject ( struct Email * e)

Should NeoMutt hide the protected subject?

Parameters
eEmail to test
Return values
trueThe subject should be protected

Definition at line 1106 of file crypt.c.

1107{
1108 const bool c_crypt_protected_headers_write = cs_subset_bool(NeoMutt->sub, "crypt_protected_headers_write");
1109 const char *const c_crypt_protected_headers_subject =
1110 cs_subset_string(NeoMutt->sub, "crypt_protected_headers_subject");
1111 if (c_crypt_protected_headers_write && (e->security & (SEC_ENCRYPT | SEC_AUTOCRYPT)) &&
1112 !(e->security & SEC_INLINE) && c_crypt_protected_headers_subject)
1113 {
1114 return true;
1115 }
1116
1117 return false;
1118}
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ crypt_cleanup()

void crypt_cleanup ( struct NcryptModuleData * mod_data)

Clean up backend.

Parameters
mod_dataNcrypt module data

Definition at line 151 of file cryptglue.c.

152{
153 if (CRYPT_MOD_CALL_CHECK(mod_data, PGP, cleanup))
154 (CRYPT_MOD_CALL(mod_data, PGP, cleanup))(mod_data);
155
156 if (CRYPT_MOD_CALL_CHECK(mod_data, SMIME, cleanup))
157 (CRYPT_MOD_CALL(mod_data, SMIME, cleanup))(mod_data);
158
159#ifdef CRYPT_BACKEND_CLASSIC_PGP
161#endif
162
163#ifdef CRYPT_BACKEND_GPGME
165#endif
166}
void gpgme_id_defaults_cleanup(struct NcryptModuleData *mod_data)
Free the GPGME IdDefaults cache.
#define CRYPT_MOD_CALL(mod_data, identifier, func)
Definition cryptglue.c:91
#define CRYPT_MOD_CALL_CHECK(mod_data, identifier, func)
Definition cryptglue.c:85
void pgp_id_defaults_cleanup(struct PgpCache **pgp_id_defaults)
Free the PGP IdDefaults cache.
Definition pgpkey.c:626
struct PgpCache * pgp_id_defaults
PGP IdDefaults cache.
Definition module_data.h:53
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ crypt_has_module_backend()

bool crypt_has_module_backend ( SecurityFlags type)

Is there a crypto backend for a given type?

Parameters
typeCrypto type, see SecurityFlags
Return values
trueBackend is present
falseBackend is not present

Definition at line 188 of file cryptglue.c.

189{
191 ASSERT(mod_data);
192
193 if (((WithCrypto & APPLICATION_PGP) != 0) && (type & APPLICATION_PGP) &&
195 {
196 return true;
197 }
198
199 if (((WithCrypto & APPLICATION_SMIME) != 0) && (type & APPLICATION_SMIME) &&
201 {
202 return true;
203 }
204
205 return false;
206}
const struct CryptModuleSpecs * crypto_module_lookup(struct NcryptModuleData *mod_data, int identifier)
Lookup a crypto module by name.
Definition crypt_mod.c:57
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ crypt_init()

void crypt_init ( void )

Initialise the crypto backends.

This calls CryptModuleSpecs::init()

Definition at line 99 of file cryptglue.c.

100{
101#ifdef CRYPT_BACKEND_GPGME
102 const bool c_crypt_use_gpgme = cs_subset_bool(NeoMutt->sub, "crypt_use_gpgme");
103#endif
104#ifdef CRYPT_BACKEND_CLASSIC_PGP
105 if (
106#ifdef CRYPT_BACKEND_GPGME
107 (!c_crypt_use_gpgme)
108#else
109 1
110#endif
111 )
113#endif
114
115#ifdef CRYPT_BACKEND_CLASSIC_SMIME
116 if (
117#ifdef CRYPT_BACKEND_GPGME
118 (!c_crypt_use_gpgme)
119#else
120 1
121#endif
122 )
124#endif
125
126#ifdef CRYPT_BACKEND_GPGME
127 if (c_crypt_use_gpgme)
128 {
131 }
132#endif
133
134#if defined(CRYPT_BACKEND_CLASSIC_PGP) || \
135 defined(CRYPT_BACKEND_CLASSIC_SMIME) || defined(CRYPT_BACKEND_GPGME)
137 ASSERT(mod_data);
138
139 if (CRYPT_MOD_CALL_CHECK(mod_data, PGP, init))
140 CRYPT_MOD_CALL(mod_data, PGP, init)();
141
142 if (CRYPT_MOD_CALL_CHECK(mod_data, SMIME, init))
143 CRYPT_MOD_CALL(mod_data, SMIME, init)();
144#endif
145}
void crypto_module_register(const struct CryptModuleSpecs *specs)
Register a new crypto module.
Definition crypt_mod.c:41
const struct CryptModuleSpecs CryptModSmimeGpgme
GPGME SMIME - Implements CryptModuleSpecs -.
const struct CryptModuleSpecs CryptModSmimeClassic
CLI SMIME - Implements CryptModuleSpecs -.
const struct CryptModuleSpecs CryptModPgpGpgme
GPGME PGP - Implements CryptModuleSpecs -.
const struct CryptModuleSpecs CryptModPgpClassic
CLI PGP - Implements CryptModuleSpecs -.
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ crypt_invoke_message()

void crypt_invoke_message ( SecurityFlags type)

Display an informative message.

Parameters
typeCrypto type, see SecurityFlags

Show a message that a backend will be invoked.

Definition at line 174 of file cryptglue.c.

175{
176 if (((WithCrypto & APPLICATION_PGP) != 0) && (type & APPLICATION_PGP))
177 mutt_message(_("Invoking PGP..."));
178 else if (((WithCrypto & APPLICATION_SMIME) != 0) && (type & APPLICATION_SMIME))
179 mutt_message(_("Invoking S/MIME..."));
180}
+ Here is the caller graph for this function:

◆ crypt_pgp_check_traditional()

bool crypt_pgp_check_traditional ( FILE * fp,
struct Body * b,
bool just_one )

Wrapper for CryptModuleSpecs::pgp_check_traditional()

Definition at line 321 of file cryptglue.c.

322{
324 ASSERT(mod_data);
325
326 if (CRYPT_MOD_CALL_CHECK(mod_data, PGP, pgp_check_traditional))
327 return CRYPT_MOD_CALL(mod_data, PGP, pgp_check_traditional)(fp, b, just_one);
328
329 return false;
330}
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ crypt_pgp_decrypt_mime()

int crypt_pgp_decrypt_mime ( FILE * fp_in,
FILE ** fp_out,
struct Body * b,
struct Body ** b_dec )

Wrapper for CryptModuleSpecs::decrypt_mime()

Definition at line 237 of file cryptglue.c.

238{
239#ifdef USE_AUTOCRYPT
240 const bool c_autocrypt = cs_subset_bool(NeoMutt->sub, "autocrypt");
241 if (c_autocrypt)
242 {
243 OptAutocryptGpgme = true;
244 int result = pgp_gpgme_decrypt_mime(fp_in, fp_out, b, b_dec);
245 OptAutocryptGpgme = false;
246 if (result == 0)
247 {
248 b->is_autocrypt = true;
249 return result;
250 }
251 }
252#endif
253
255 ASSERT(mod_data);
256
257 if (CRYPT_MOD_CALL_CHECK(mod_data, PGP, decrypt_mime))
258 return CRYPT_MOD_CALL(mod_data, PGP, decrypt_mime)(fp_in, fp_out, b, b_dec);
259
260 return -1;
261}
bool OptAutocryptGpgme
(pseudo) use Autocrypt context inside ncrypt/crypt_gpgme.c
Definition globals.c:44
int pgp_gpgme_decrypt_mime(FILE *fp_in, FILE **fp_out, struct Body *b, struct Body **b_dec)
Decrypt an encrypted MIME part - Implements CryptModuleSpecs::decrypt_mime() -.
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ crypt_pgp_extract_key_from_attachment()

void crypt_pgp_extract_key_from_attachment ( FILE * fp,
struct Body * b )

Wrapper for CryptModuleSpecs::pgp_extract_key_from_attachment()

Definition at line 460 of file cryptglue.c.

461{
463 ASSERT(mod_data);
464
465 if (CRYPT_MOD_CALL_CHECK(mod_data, PGP, pgp_extract_key_from_attachment))
466 CRYPT_MOD_CALL(mod_data, PGP, pgp_extract_key_from_attachment)(fp, b);
467}
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ crypt_pgp_invoke_getkeys()

void crypt_pgp_invoke_getkeys ( struct Address * addr)

Wrapper for CryptModuleSpecs::pgp_invoke_getkeys()

Definition at line 309 of file cryptglue.c.

310{
312 ASSERT(mod_data);
313
314 if (CRYPT_MOD_CALL_CHECK(mod_data, PGP, pgp_invoke_getkeys))
315 CRYPT_MOD_CALL(mod_data, PGP, pgp_invoke_getkeys)(addr);
316}
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ crypt_pgp_make_key_attachment()

struct Body * crypt_pgp_make_key_attachment ( void )

Wrapper for CryptModuleSpecs::pgp_make_key_attachment()

Definition at line 349 of file cryptglue.c.

350{
352 ASSERT(mod_data);
353
354 if (CRYPT_MOD_CALL_CHECK(mod_data, PGP, pgp_make_key_attachment))
355 return CRYPT_MOD_CALL(mod_data, PGP, pgp_make_key_attachment)();
356
357 return NULL;
358}
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ crypt_pgp_send_menu()

SecurityFlags crypt_pgp_send_menu ( struct Email * e)

Wrapper for CryptModuleSpecs::send_menu()

Definition at line 446 of file cryptglue.c.

447{
449 ASSERT(mod_data);
450
451 if (CRYPT_MOD_CALL_CHECK(mod_data, PGP, send_menu))
452 return CRYPT_MOD_CALL(mod_data, PGP, send_menu)(e);
453
454 return 0;
455}
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ crypt_smime_decrypt_mime()

int crypt_smime_decrypt_mime ( FILE * fp_in,
FILE ** fp_out,
struct Body * b,
struct Body ** b_dec )

Wrapper for CryptModuleSpecs::decrypt_mime()

Definition at line 510 of file cryptglue.c.

511{
513 ASSERT(mod_data);
514
515 if (CRYPT_MOD_CALL_CHECK(mod_data, SMIME, decrypt_mime))
516 return CRYPT_MOD_CALL(mod_data, SMIME, decrypt_mime)(fp_in, fp_out, b, b_dec);
517
518 return -1;
519}
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ crypt_smime_getkeys()

void crypt_smime_getkeys ( struct Envelope * env)

Wrapper for CryptModuleSpecs::smime_getkeys()

Definition at line 538 of file cryptglue.c.

539{
541 ASSERT(mod_data);
542
543 if (CRYPT_MOD_CALL_CHECK(mod_data, SMIME, smime_getkeys))
544 CRYPT_MOD_CALL(mod_data, SMIME, smime_getkeys)(env);
545}
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ crypt_smime_send_menu()

SecurityFlags crypt_smime_send_menu ( struct Email * e)

Wrapper for CryptModuleSpecs::send_menu()

Definition at line 632 of file cryptglue.c.

633{
635 ASSERT(mod_data);
636
637 if (CRYPT_MOD_CALL_CHECK(mod_data, SMIME, send_menu))
638 return CRYPT_MOD_CALL(mod_data, SMIME, send_menu)(e);
639
640 return 0;
641}
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ crypt_smime_verify_sender()

int crypt_smime_verify_sender ( struct Email * e,
struct Message * msg )

Wrapper for CryptModuleSpecs::smime_verify_sender()

Definition at line 550 of file cryptglue.c.

551{
553 ASSERT(mod_data);
554
555 if (CRYPT_MOD_CALL_CHECK(mod_data, SMIME, smime_verify_sender))
556 return CRYPT_MOD_CALL(mod_data, SMIME, smime_verify_sender)(e, msg);
557
558 return 1;
559}
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ crypto_module_cleanup()

void crypto_module_cleanup ( struct NcryptModuleData * mod_data)

Clean up the crypto modules.

Parameters
mod_dataNcrypt module data

Definition at line 74 of file crypt_mod.c.

75{
76 struct CryptModule *np = NULL;
77 struct CryptModule *tmp = NULL;
78 STAILQ_FOREACH_SAFE(np, &mod_data->crypt_modules, entries, tmp)
79 {
80 STAILQ_REMOVE(&mod_data->crypt_modules, np, CryptModule, entries);
81 FREE(&np);
82 }
83}
#define STAILQ_REMOVE(head, elm, type, field)
Definition queue.h:441
#define STAILQ_FOREACH_SAFE(var, head, field, tvar)
Definition queue.h:400
A crypto plugin module.
Definition crypt_mod.h:315
struct CryptModuleList crypt_modules
Linked list of crypto modules.
Definition module_data.h:49
+ Here is the caller graph for this function:

◆ mutt_gpgme_select_secret_key()

int mutt_gpgme_select_secret_key ( struct Buffer * keyid)

Select a private Autocrypt key for a new account.

Parameters
keyidAutocrypt Key id
Return values
0Success
-1Error

Unfortunately, the internal ncrypt/crypt_gpgme.c functions use CryptKeyInfo, and so aren't exportable.

This function queries all private keys, provides the crypt_select_keys() menu, and returns the selected key fingerprint in keyid.

Definition at line 3715 of file crypt_gpgme.c.

3716{
3717 int rc = -1;
3718 gpgme_error_t err = GPG_ERR_NO_ERROR;
3719 gpgme_key_t key = NULL;
3720 gpgme_user_id_t uid = NULL;
3721 struct CryptKeyInfo *results = NULL;
3722 struct CryptKeyInfo *k = NULL;
3723 struct CryptKeyInfo **kend = NULL;
3724 struct CryptKeyInfo *choice = NULL;
3725
3726 gpgme_ctx_t ctx = create_gpgme_context(false);
3727
3728 /* list all secret keys */
3729 if (gpgme_op_keylist_start(ctx, NULL, 1))
3730 goto cleanup;
3731
3732 kend = &results;
3733
3734 while ((err = gpgme_op_keylist_next(ctx, &key)) == GPG_ERR_NO_ERROR)
3735 {
3737
3742
3743 if (key->revoked)
3745 if (key->expired)
3747 if (key->disabled)
3749
3750 int idx;
3751 for (idx = 0, uid = key->uids; uid; idx++, uid = uid->next)
3752 {
3753 k = MUTT_MEM_CALLOC(1, struct CryptKeyInfo);
3754 k->kobj = key;
3755 gpgme_key_ref(k->kobj);
3756 k->idx = idx;
3757 k->uid = uid->uid;
3758 k->flags = flags;
3759 if (uid->revoked)
3760 k->flags |= KEYFLAG_REVOKED;
3761 k->validity = uid->validity;
3762 *kend = k;
3763 kend = &k->next;
3764 }
3765 gpgme_key_unref(key);
3766 }
3767 if (gpg_err_code(err) != GPG_ERR_EOF)
3768 mutt_error(_("gpgme_op_keylist_next failed: %s"), gpgme_strerror(err));
3769 gpgme_op_keylist_end(ctx);
3770
3771 if (!results)
3772 {
3773 /* L10N: mutt_gpgme_select_secret_key() tries to list all secret keys to choose
3774 from. This error is displayed if no results were found. */
3775 mutt_error(_("No secret keys found"));
3776 goto cleanup;
3777 }
3778
3779 choice = dlg_gpgme(results, NULL, "*", APPLICATION_PGP, NULL);
3780 if (!(choice && choice->kobj && choice->kobj->subkeys && choice->kobj->subkeys->fpr))
3781 goto cleanup;
3782 buf_strcpy(keyid, choice->kobj->subkeys->fpr);
3783
3784 rc = 0;
3785
3786cleanup:
3787 crypt_key_free(&choice);
3788 crypt_key_free(&results);
3789 gpgme_release(ctx);
3790 return rc;
3791}
size_t buf_strcpy(struct Buffer *buf, const char *s)
Copy a string into a Buffer.
Definition buffer.c:401
gpgme_ctx_t create_gpgme_context(bool for_smime)
Create a new GPGME context.
unsigned int key_check_cap(gpgme_key_t key, enum KeyCap cap)
Check the capabilities of a key.
static void crypt_key_free(struct CryptKeyInfo **keylist)
Release all the keys in a list.
@ KEY_CAP_CAN_ENCRYPT
Key can be used for encryption.
Definition crypt_gpgme.h:78
@ KEY_CAP_CAN_SIGN
Key can be used for signing.
Definition crypt_gpgme.h:79
struct CryptKeyInfo * dlg_gpgme(struct CryptKeyInfo *keys, struct Address *p, const char *s, unsigned int app, bool *forced_valid)
Get the user to select a key -.
Definition dlg_gpgme.c:195
#define MUTT_MEM_CALLOC(n, type)
Definition memory.h:52
uint16_t KeyFlags
Definition lib.h:159
A stored PGP key.
Definition crypt_gpgme.h:45
gpgme_validity_t validity
uid validity (cached for convenience)
Definition crypt_gpgme.h:51
KeyFlags flags
global and per uid flags (for convenience)
Definition crypt_gpgme.h:50
int idx
and the user ID at this index
Definition crypt_gpgme.h:48
struct CryptKeyInfo * next
Linked list.
Definition crypt_gpgme.h:46
const char * uid
and for convenience point to this user ID
Definition crypt_gpgme.h:49
gpgme_key_t kobj
GPGME key object.
Definition crypt_gpgme.h:47
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_gpgme_print_version()

const char * mutt_gpgme_print_version ( void )

Get version of GPGME.

Return values
ptrGPGME version string

Definition at line 4197 of file crypt_gpgme.c.

4198{
4199 return GPGME_VERSION;
4200}
+ Here is the caller graph for this function: