diff options
| author | Daniel Kahn Gillmor <dkg@fifthhorseman.net> | 2017-12-08 01:24:01 -0500 |
|---|---|---|
| committer | David Bremner <david@tethera.net> | 2017-12-08 08:08:47 -0400 |
| commit | 29648a137c5807135ab168917b4a51d5e19e51c2 (patch) | |
| tree | ea06354db54289171b1cc46fba3f7314f515516b /util | |
| parent | 6a9626a2fdddf6115bcf97982fd10053bf48e942 (diff) | |
crypto: actually stash session keys when decrypt=true
If you're going to store the cleartext index of an encrypted message,
in most situations you might just as well store the session key.
Doing this storage has efficiency and recoverability advantages.
Combined with a schedule of regular OpenPGP subkey rotation and
destruction, this can also offer security benefits, like "deletable
e-mail", which is the store-and-forward analog to "forward secrecy".
But wait, i hear you saying, i have a special need to store cleartext
indexes but it's really bad for me to store session keys! Maybe
(let's imagine) i get lots of e-mails with incriminating photos
attached, and i want to be able to search for them by the text in the
e-mail, but i don't want someone with access to the index to be
actually able to see the photos themselves.
Fret not, the next patch in this series will support your wacky
uncommon use case.
Diffstat (limited to 'util')
| -rw-r--r-- | util/crypto.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/util/crypto.c b/util/crypto.c index 338f1d5d..066dea6e 100644 --- a/util/crypto.c +++ b/util/crypto.c @@ -197,10 +197,24 @@ _notmuch_crypto_decrypt (bool *attempted, if (attempted) *attempted = true; #if (GMIME_MAJOR_VERSION < 3) +#if HAVE_GMIME_SESSION_KEYS + gboolean oldgetsk = g_mime_crypto_context_get_retrieve_session_key (crypto_ctx); + gboolean newgetsk = (decrypt_result); + if (newgetsk != oldgetsk) + /* This could return an error, but we can't do anything about it, so ignore it */ + g_mime_crypto_context_set_retrieve_session_key (crypto_ctx, newgetsk, NULL); +#endif ret = g_mime_multipart_encrypted_decrypt(part, crypto_ctx, decrypt_result, err); +#if HAVE_GMIME_SESSION_KEYS + if (newgetsk != oldgetsk) + g_mime_crypto_context_set_retrieve_session_key (crypto_ctx, oldgetsk, NULL); +#endif #else - ret = g_mime_multipart_encrypted_decrypt(part, GMIME_DECRYPT_NONE, NULL, + GMimeDecryptFlags flags = GMIME_DECRYPT_NONE; + if (decrypt_result) + flags |= GMIME_DECRYPT_EXPORT_SESSION_KEY; + ret = g_mime_multipart_encrypted_decrypt(part, flags, NULL, decrypt_result, err); #endif return ret; |
