aboutsummaryrefslogtreecommitdiff
path: root/util/crypto.c
diff options
context:
space:
mode:
authorDaniel Kahn Gillmor <dkg@fifthhorseman.net>2019-05-26 18:15:55 -0400
committerDavid Bremner <david@tethera.net>2019-05-29 08:02:45 -0300
commita6b0772b60d9191fcc291358eec3d78bfea31f1c (patch)
treeecaecc73958232fb50fd30dae97dc59afbe2a5ca /util/crypto.c
parent80728a95e6fd8bd1c4a4f8dd8040984ab5c4b04a (diff)
util/crypto: add information about the payload part
When walking the MIME tree, if we discover that we are at the cryptographic payload, then we would like to record at least the Subject header of the current MIME part. In the future, we might want to record many other headers as well, but for now we will stick with just the Subject. See https://dkg.fifthhorseman.net/blog/e-mail-cryptography.html#cryptographic-envelope for more description of the Cryptographic Payload vs. the Cryptographic Envelope. Signed-off-by: Daniel Kahn Gillmor <dkg@fifthhorseman.net>
Diffstat (limited to 'util/crypto.c')
-rw-r--r--util/crypto.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/util/crypto.c b/util/crypto.c
index 3f8ac25a..9e185e03 100644
--- a/util/crypto.c
+++ b/util/crypto.c
@@ -90,6 +90,8 @@ _notmuch_message_crypto_destructor (_notmuch_message_crypto_t *msg_crypto)
return 0;
if (msg_crypto->sig_list)
g_object_unref (msg_crypto->sig_list);
+ if (msg_crypto->payload_subject)
+ talloc_free (msg_crypto->payload_subject);
return 0;
}
@@ -133,6 +135,10 @@ _notmuch_message_crypto_potential_sig_list (_notmuch_message_crypto_t *msg_crypt
notmuch_status_t
_notmuch_message_crypto_potential_payload (_notmuch_message_crypto_t *msg_crypto, GMimeObject *payload, GMimeObject *parent, int childnum)
{
+ const char *protected_headers = NULL;
+ const char *forwarded = NULL;
+ const char *subject = NULL;
+
if (!msg_crypto || !payload)
return NOTMUCH_STATUS_NULL_POINTER;
@@ -156,6 +162,37 @@ _notmuch_message_crypto_potential_payload (_notmuch_message_crypto_t *msg_crypto
msg_crypto->payload_encountered = true;
+ /* don't bother recording anything if there is no cryptographic
+ * envelope: */
+ if ((msg_crypto->decryption_status != NOTMUCH_MESSAGE_DECRYPTED_FULL) &&
+ (msg_crypto->sig_list == NULL))
+ return NOTMUCH_STATUS_SUCCESS;
+
+ /* Verify that this payload has headers that are intended to be
+ * exported to the larger message: */
+
+ /* Consider a payload that uses Alexei Melinkov's forwarded="no" for
+ * message/global or message/rfc822:
+ * https://tools.ietf.org/html/draft-melnikov-smime-header-signing-05#section-4 */
+ forwarded = g_mime_object_get_content_type_parameter (payload, "forwarded");
+ if (GMIME_IS_MESSAGE_PART (payload) && forwarded && strcmp (forwarded, "no") == 0) {
+ GMimeMessage *message = g_mime_message_part_get_message (GMIME_MESSAGE_PART (payload));
+ subject = g_mime_message_get_subject (message);
+ /* FIXME: handle more than just Subject: at some point */
+ } else {
+ /* Consider "memoryhole"-style protected headers as practiced by Enigmail and K-9 */
+ protected_headers = g_mime_object_get_content_type_parameter (payload, "protected-headers");
+ if (protected_headers && strcasecmp("v1", protected_headers) == 0)
+ subject = g_mime_object_get_header (payload, "Subject");
+ /* FIXME: handle more than just Subject: at some point */
+ }
+
+ if (subject) {
+ if (msg_crypto->payload_subject)
+ talloc_free (msg_crypto->payload_subject);
+ msg_crypto->payload_subject = talloc_strdup (msg_crypto, subject);
+ }
+
return NOTMUCH_STATUS_SUCCESS;
}