Browse Source

ENGINE-633: default keys now allegedly set in decrypt message to prepare for key election removal. Also fixes for messages which look like pEp messages but don't conoform.

doxygen_doc
parent
commit
4fe7a15cf3
4 changed files with 401 additions and 277 deletions
  1. +204
    -92
      src/message_api.c
  2. +8
    -0
      src/pEp_internal.h
  3. +7
    -3
      test/src/ElevatedAttachmentsTest.cc
  4. +182
    -182
      test/test_mails/priv_key_attach.eml

+ 204
- 92
src/message_api.c View File

@ -849,13 +849,15 @@ enomem:
return NULL;
}
static message* wrap_message_as_attachment(message* envelope,
message* attachment, message_wrap_type wrap_type,
static PEP_STATUS wrap_message_as_attachment(message* envelope,
message* attachment, message** new_message, message_wrap_type wrap_type,
bool keep_orig_subject, stringlist_t* extra_keys,
unsigned int max_major, unsigned int max_minor) {
*new_message = NULL;
if (!attachment)
return NULL;
return PEP_ILLEGAL_VALUE;
message* _envelope = envelope;
@ -874,7 +876,7 @@ static message* wrap_message_as_attachment(message* envelope,
status = generate_message_id(_envelope);
if (status != PEP_STATUS_OK)
goto enomem;
goto pEp_error;
const char* inner_type_string = "";
switch (wrap_type) {
@ -895,6 +897,26 @@ static message* wrap_message_as_attachment(message* envelope,
"to view it, or better yet, consider using p≡p!\n"
);
}
if (max_major <= 0 || max_minor < 0) {
max_major = 1;
max_minor = 0;
}
// // I hate this. Wish it were extensible.
// // 2 to cover logs, one for period, one for null termination = + 4
// int buf_size = floor(log10(max_major)) + (max_minor == 0 ? 0 : floor(log10(max_minor))) + 4;
// char* msg_ver = (char*)calloc(buf_size, 1);
int buf_size = 100;
char msg_ver[100];
// if (!msg_ver)
// goto enomem;
snprintf(msg_ver, buf_size, "%d%s%d", max_major, ".", max_minor);
replace_opt_field(attachment, X_PEP_MSG_VER_KEY, msg_ver, true);
// free(msg_ver);
// 2.1, to replace the above
add_opt_field(attachment, X_PEP_MSG_WRAP_KEY, inner_type_string);
}
@ -902,17 +924,18 @@ static message* wrap_message_as_attachment(message* envelope,
// 2.1 - how do we peel this particular union when we get there?
_envelope->longmsg = encapsulate_message_wrap_info("TRANSPORT", _envelope->longmsg);
}
else {
return NULL;
}
else {
status = PEP_UNKNOWN_ERROR;
goto pEp_error;
}
if (!attachment->id || attachment->id[0] == '\0') {
free(attachment->id);
if (!_envelope->id) {
status = generate_message_id(_envelope);
if (status != PEP_STATUS_OK)
goto enomem;
goto pEp_error;
}
attachment->id = strdup(_envelope->id);
@ -938,23 +961,31 @@ static message* wrap_message_as_attachment(message* envelope,
status = mime_encode_message(attachment, false, &message_text, false);
if (status != PEP_STATUS_OK)
goto enomem;
goto pEp_error;
size_t message_len = strlen(message_text);
bloblist_t* message_blob = new_bloblist(message_text, message_len,
"message/rfc822", NULL);
if (!message_blob)
goto enomem;
_envelope->attachments = message_blob;
if (keep_orig_subject && attachment->shortmsg)
_envelope->shortmsg = strdup(attachment->shortmsg);
return _envelope;
*new_message = _envelope;
return status;
enomem:
status = PEP_OUT_OF_MEMORY;
pEp_error:
if (!envelope) {
free_message(_envelope);
}
return NULL;
*new_message = NULL;
return status;
}
static PEP_STATUS encrypt_PGP_inline(
@ -975,7 +1006,7 @@ static PEP_STATUS encrypt_PGP_inline(
dst->enc_format = src->enc_format;
// shortmsg is being copied
// shortmsg is copied
if (src->shortmsg) {
dst->shortmsg = strdup(src->shortmsg);
assert(dst->shortmsg);
@ -983,7 +1014,7 @@ static PEP_STATUS encrypt_PGP_inline(
return PEP_OUT_OF_MEMORY;
}
// id is staying the same
// id stays the same
if (src->id) {
dst->id = strdup(src->id);
assert(dst->id);
@ -2175,9 +2206,13 @@ DYNAMIC_API PEP_STATUS encrypt_message(
message_wrap_type wrap_type = PEP_message_unwrapped;
if ((enc_format != PEP_enc_inline) && (enc_format != PEP_enc_inline_EA) && (!force_v_1) && ((max_comm_type | PEP_ct_confirmed) == PEP_ct_pEp)) {
wrap_type = ((flags & PEP_encrypt_flag_key_reset_only) ? PEP_message_key_reset : PEP_message_default);
_src = wrap_message_as_attachment(NULL, src, wrap_type, false, extra, max_version_major, max_version_minor);
if (!_src)
status = wrap_message_as_attachment(NULL, src, &_src, wrap_type, false, extra, max_version_major, max_version_minor);
if (status != PEP_STATUS_OK)
goto pEp_error;
else if (!_src) {
status = PEP_UNKNOWN_ERROR;
goto pEp_error;
}
}
else {
// hide subject
@ -2544,9 +2579,13 @@ DYNAMIC_API PEP_STATUS encrypt_message_for_self(
unsigned int major_ver, minor_ver;
pEp_version_major_minor(PEP_VERSION, &major_ver, &minor_ver);
_src = wrap_message_as_attachment(NULL, src, PEP_message_default, false, extra, major_ver, minor_ver);
if (!_src)
status = wrap_message_as_attachment(NULL, src, &_src, PEP_message_default, false, extra, major_ver, minor_ver);
if (status != PEP_STATUS_OK)
goto pEp_error;
else if (!_src) {
status = PEP_UNKNOWN_ERROR;
goto pEp_error;
}
msg = clone_to_empty_message(_src);
if (msg == NULL)
@ -3749,6 +3788,20 @@ static void get_protocol_version_from_headers(
pEp_version_major_minor(pEp_protocol_version->value->value, major_ver, minor_ver);
}
static void get_message_version_from_headers(
stringpair_list_t* field_list,
unsigned int* major_ver,
unsigned int* minor_ver
)
{
*major_ver = 0;
*minor_ver = 0;
const stringpair_list_t* pEp_protocol_version = stringpair_list_find(field_list, X_PEP_MSG_VER_KEY);
if (pEp_protocol_version && pEp_protocol_version->value)
pEp_version_major_minor(pEp_protocol_version->value->value, major_ver, minor_ver);
}
// CAN return PASS errors
static PEP_STATUS set_default_key_fpr_if_valid(
PEP_SESSION session,
@ -3813,6 +3866,7 @@ static PEP_STATUS _decrypt_message(
stringlist_t *_keylist = NULL;
bool is_pEp_msg = is_a_pEpmessage(src);
bool myself_read_only = (src->dir == PEP_dir_incoming);
bool breaks_protocol = false;
unsigned int major_ver = 0;
unsigned int minor_ver = 0;
unsigned int msg_major_ver = 0;
@ -3933,6 +3987,10 @@ static PEP_STATUS _decrypt_message(
// it is fully manipulable on-the-wire. It'll be recalculated if we have inner headers.
get_protocol_version_from_headers(src->opt_fields, &major_ver, &minor_ver);
if (major_ver == 0) {
msg_major_ver = 1;
msg_minor_ver = 0;
}
// Check for and deal with unencrypted messages
if (src->enc_format == PEP_enc_none) {
@ -3952,16 +4010,17 @@ static PEP_STATUS _decrypt_message(
// Set a default key if there isn't one, if we have one
if (status == PEP_STATUS_OK && EMPTYSTR(src->from->fpr) && !EMPTYSTR(hk_fpr)) {
const char* check_key = NULL;
if (imported_sender_key_fpr)
if (imported_sender_key_fpr) // pEp message version 2.2 or greater
check_key = imported_sender_key_fpr;
else if (header_key_imported)
else if (header_key_imported) // autocrypt
check_key = _imported_key_list->value;
else {
// We do this only with pEp messages 2.1 or less, or OpenPGP messages
if (!is_pEp_msg || (major_ver == 2 && minor_ver < 2) || major_ver < 2) {
if (_imported_key_list && !(_imported_key_list->next))
check_key = _imported_key_list->value;
}
}
} // Otherwise, too bad.
if (EMPTYSTR(hk_fpr) && !EMPTYSTR(check_key)) {
status = set_default_key_fpr_if_valid(session, src->from, check_key);
if (status != PEP_OUT_OF_MEMORY)
@ -4046,20 +4105,33 @@ static PEP_STATUS _decrypt_message(
&_changed_keys,
&imported_sender_key_fpr);
if (status == PEP_STATUS_OK && major_ver < 2) {
// pEp key or no, we only take this key if it's the only one.
if (*start && !((*start)->next)) {
const char* check_key = (*start)->value;
status = update_identity(session, src->from);
if (status == PEP_STATUS_OK && EMPTYSTR(src->from->fpr) && !EMPTYSTR(check_key)) {
status = set_default_key_fpr_if_valid(session, src->from, check_key);
if (status != PEP_OUT_OF_MEMORY)
status = PEP_STATUS_OK;
if (src->from && !is_me(session, src->from)) {
if (status == PEP_STATUS_OK && !has_inner) {
// If we're claiming to have a pEp version 2.2 or greater, we only take it
// if it had the right name during the import and if it was the ONLY key on the message?
// (This was Volker's first assertion, but then it may have been walked back.
// FIXME: verify)
// pEp key or no, we only take this key if it's the only one.
if (*start && !((*start)->next)) {
const char* check_key = NULL;
status = update_identity(session, src->from);
// In case we're claiming 2.2 or greater, though, the following must hold
if ((major_ver == 2 && minor_ver > 1) || major_ver > 2) {
if (imported_sender_key_fpr)
check_key = imported_sender_key_fpr;
}
else
check_key = (*start)->value;
if (status == PEP_STATUS_OK && EMPTYSTR(src->from->fpr) && !EMPTYSTR(check_key)) {
status = set_default_key_fpr_if_valid(session, src->from, check_key);
if (status != PEP_OUT_OF_MEMORY)
status = PEP_STATUS_OK;
}
free(imported_sender_key_fpr);
imported_sender_key_fpr = NULL;
}
free(imported_sender_key_fpr);
imported_sender_key_fpr = NULL;
}
}
} // else, it needs to get set from INNER keys.
if (status != PEP_STATUS_OK)
@ -4148,12 +4220,23 @@ static PEP_STATUS _decrypt_message(
&_changed_keys,
&imported_sender_key_fpr);
if (status == PEP_STATUS_OK && major_ver < 2) {
if (status == PEP_STATUS_OK && src->from && !is_me(session, src->from)) {
// If we're claiming to have a pEp version 2.2 or greater, we only take it
// if it had the right name during the import and if it was the ONLY key on the message?
// (This was Volker's first assertion, but then it may have been walked back.
// FIXME: verify)
// pEp key or no, we only take this key if it's the only one.
if (*start && !((*start)->next)) {
const char* check_key = (*start)->value;
status = update_identity(session, msg->from);
const char* check_key = NULL;
status = update_identity(session, src->from);
// In case we're claiming 2.2 or greater, though, the following must hold
if ((major_ver == 2 && minor_ver > 1) || major_ver > 2) {
if (imported_sender_key_fpr)
check_key = imported_sender_key_fpr;
}
else
check_key = (*start)->value;
if (status == PEP_STATUS_OK && EMPTYSTR(src->from->fpr) && !EMPTYSTR(check_key)) {
status = set_default_key_fpr_if_valid(session, src->from, check_key);
if (status != PEP_OUT_OF_MEMORY)
@ -4162,8 +4245,7 @@ static PEP_STATUS _decrypt_message(
free(imported_sender_key_fpr);
imported_sender_key_fpr = NULL;
}
} // else, it needs to get set from INNER keys.
}
break;
default:
@ -4258,17 +4340,20 @@ static PEP_STATUS _decrypt_message(
wrap_info = NULL;
inner_message->enc_format = src->enc_format;
const stringpair_list_t* pEp_protocol_version = NULL;
pEp_protocol_version = stringpair_list_find(inner_message->opt_fields, "X-pEp-Version");
// const stringpair_list_t* pEp_protocol_version = NULL;
// pEp_protocol_version = stringpair_list_find(inner_message->opt_fields, "X-pEp-Version");
if (pEp_protocol_version && pEp_protocol_version->value)
pEp_version_major_minor(pEp_protocol_version->value->value, &major_ver, &minor_ver);
// if (pEp_protocol_version && pEp_protocol_version->value)
// pEp_version_major_minor(pEp_protocol_version->value->value, &major_ver, &minor_ver);
get_protocol_version_from_headers(inner_message->opt_fields, &major_ver, &minor_ver);
if (major_ver > 2 || (major_ver == 2 && minor_ver > 1))
get_message_version_from_headers(inner_message->opt_fields, &msg_major_ver, &msg_minor_ver);
// Sort out pEp user status and version number based on INNER message.
bool is_inner = false;
// Deal with plaintext modification in 1.0 and 2.0 messages
// Deal with plaintext modification in 2.0 messages
status = unencapsulate_hidden_fields(inner_message, NULL, &wrap_info);
if (status == PEP_OUT_OF_MEMORY)
@ -4276,7 +4361,27 @@ static PEP_STATUS _decrypt_message(
if (status != PEP_STATUS_OK)
goto pEp_error;
if (major_ver > 2 || (major_ver == 2 && minor_ver > 0)) {
// Crap - this is broken. Ok. Work this through.
// Any client 2.1 or above could send a 2.0 or 2.1 message.
// A 2.0 client can only send a 2.0 message here.
// So first off: if not 2.2 or greater, infer version:
if (major_ver == 2 && minor_ver < 2) {
stringpair_list_t* searched = stringpair_list_find(inner_message->opt_fields, X_PEP_MSG_WRAP_KEY);
if (searched) {
// 2.1 message
msg_major_ver = 2;
msg_minor_ver = 1;
}
else if (wrap_info) {
msg_major_ver = 2;
msg_minor_ver = 0;
}
else {
breaks_protocol = true;
}
} // else msg_major/minor_ver must have been set.
if (msg_major_ver > 2 || (msg_major_ver == 2 && msg_minor_ver > 0)) {
stringpair_list_t* searched = stringpair_list_find(inner_message->opt_fields, "X-pEp-Sender-FPR");
inner_message->_sender_fpr = ((searched && searched->value && searched->value->value) ? strdup(searched->value->value) : NULL);
searched = stringpair_list_find(inner_message->opt_fields, X_PEP_MSG_WRAP_KEY);
@ -4288,18 +4393,18 @@ static PEP_STATUS _decrypt_message(
inner_message->opt_fields = stringpair_list_delete_by_key(inner_message->opt_fields, X_PEP_MSG_WRAP_KEY);
}
}
else {
else if (msg_major_ver == 2 && msg_minor_ver == 0) {
is_inner = (strcmp(wrap_info, "INNER") == 0);
if (!is_inner)
is_key_reset = (strcmp(wrap_info, "KEY_RESET") == 0);
}
}
// check for private key in decrypted message attachment while importing
// N.B. Apparently, we always import private keys into the keyring; however,
// we do NOT always allow those to be used for encryption. THAT is controlled
// by setting it as an own identity associated with the key in the DB.
// If we have a message 2.0 message, we are ONLY going to be ok with keys
// If we have a message 2.x message, we are ONLY going to act on keys
// we imported from THIS part of the message.
bool ignore_msg = false;
@ -4335,10 +4440,10 @@ static PEP_STATUS _decrypt_message(
free(imported_sender_key_fpr);
imported_sender_key_fpr = NULL;
// import keys from decrypted INNER source
status = import_keys_from_decrypted_msg(session, msg,
status = import_keys_from_decrypted_msg(session, inner_message,
&keys_were_imported,
&imported_private_key_address,
private_il,
@ -4348,45 +4453,44 @@ static PEP_STATUS _decrypt_message(
if (status != PEP_STATUS_OK)
goto pEp_error;
// Set default key if there isn't one
if (inner_message->from && !is_me(session, inner_message->from)) {
status = update_identity(session, inner_message->from);
if (status == PEP_STATUS_OK && EMPTYSTR(inner_message->from->fpr)) {
const char* check_key = NULL;
if ((major_ver == 2 && minor_ver > 0) || major_ver > 2)
check_key = inner_message->_sender_fpr;
else if (major_ver == 2 && minor_ver == 0 && _keylist && _keylist->value)
check_key = _keylist->value;
// Set a default key if there isn't one, if we have one
if (!EMPTYSTR(check_key)) {
status = set_default_key_fpr_if_valid(session, src->from, check_key);
free(imported_sender_key_fpr);
}
}
if (status == PEP_OUT_OF_MEMORY)
goto enomem;
}
}
else {
// Simply put, we bail. We should not be returning ANYTHERE here.
status = decrypt_status;
goto pEp_error;
if (!breaks_protocol) {
// Set default key if there isn't one
if (inner_message->from && !is_me(session, inner_message->from)) {
status = update_identity(session, inner_message->from);
if (status == PEP_STATUS_OK && EMPTYSTR(inner_message->from->fpr)) {
const char* check_key = NULL;
if ((msg_major_ver == 2 && msg_minor_ver > 0) || msg_major_ver > 2)
check_key = inner_message->_sender_fpr;
else if (msg_major_ver == 2 && msg_minor_ver == 0 && _keylist && _keylist->value)
check_key = _keylist->value;
// Set a default key if there isn't one, if we have one
if (!EMPTYSTR(check_key)) {
status = set_default_key_fpr_if_valid(session, src->from, check_key);
free(imported_sender_key_fpr);
}
}
if (status == PEP_OUT_OF_MEMORY)
goto enomem;
}
}
}
if (is_key_reset) {
if (decrypt_status == PEP_DECRYPTED || decrypt_status == PEP_DECRYPTED_AND_VERIFIED) {
status = receive_key_reset(session,
inner_message);
if (status != PEP_STATUS_OK) {
free_message(inner_message);
goto pEp_error;
}
if (!ignore_msg) {
status = receive_key_reset(session,
inner_message);
if (status != PEP_STATUS_OK) {
free_message(inner_message);
goto pEp_error;
}
}
*flags |= PEP_decrypt_flag_consume;
calculated_src = msg = inner_message;
}
}
else if (is_inner) {
else if (is_inner || breaks_protocol) {
// THIS is our message
// Now, let's make sure we've copied in
@ -4473,7 +4577,13 @@ static PEP_STATUS _decrypt_message(
if (status != PEP_STATUS_OK)
goto pEp_error;
}
}
// Ok, one last thing - if the message didn't follow the protocol, amend rating again.
if (breaks_protocol) {
if (*rating > PEP_rating_b0rken)
*rating = PEP_rating_b0rken;
}
/* We decrypted ok, hallelujah. */
msg->enc_format = PEP_enc_none;
@ -4750,12 +4860,14 @@ static PEP_STATUS _decrypt_message(
// Double-check for message 2.1+: (note, we don't do this for already-reencrypted-messages)
if (!(reencrypt && reenc_signer_key_is_own_key)) {
if (major_ver > 2 || (major_ver == 2 && minor_ver > 0)) {
if (EMPTYSTR((*dst)->_sender_fpr) ||
(!EMPTYSTR(_keylist->value) && (strcasecmp((*dst)->_sender_fpr, _keylist->value) != 0))) {
if (decrypt_status == PEP_DECRYPTED_AND_VERIFIED)
decrypt_status = PEP_DECRYPTED;
if (*rating > PEP_rating_unreliable)
*rating = PEP_rating_unreliable;
if (msg_major_ver > 2 || (msg_major_ver == 2 && msg_minor_ver > 0)) {
if (EMPTYSTR((*dst)->_sender_fpr) ||
(!EMPTYSTR(_keylist->value) && (strcasecmp((*dst)->_sender_fpr, _keylist->value) != 0))) {
if (decrypt_status == PEP_DECRYPTED_AND_VERIFIED)
decrypt_status = PEP_DECRYPTED;
if (*rating > PEP_rating_unreliable)
*rating = PEP_rating_unreliable;
}
}
}
}


+ 8
- 0
src/pEp_internal.h View File

@ -54,6 +54,14 @@
#define X_PEP_SNDR_FPR_KEY "X-pEp-Sender-FPR"
#endif
#ifndef X_PEP_MSG_VER_KEY
#define X_PEP_MSG_VER_KEY "X-pEp-Message-Version"
#endif
#define VER_1_0 "1.0"
#define VER_2_0 "2.0"
#define VER_2_1 "2.1"
#include "platform.h"
#ifdef WIN32


+ 7
- 3
test/src/ElevatedAttachmentsTest.cc View File

@ -255,8 +255,9 @@ TEST_F(ElevatedAttachmentsTest, check_encrypt_decrypt_message) {
// attached key is encrypted
ASSERT_TRUE(is_PGP_message_text(ad->value));
ASSERT_STREQ(ad->mime_type, "application/octet-stream");
ASSERT_STREQ(ad->filename, "file://pEpkey.asc.pgp");
// ASSERT_STREQ(ad->filename, "file://pEpkey.asc.pgp");
// As of ENGINE-633:
ASSERT_STREQ(ad->filename, "file://sender_key.asc.pgp");
// decrypt this message
message *dec_msg = NULL;
@ -346,7 +347,10 @@ TEST_F(ElevatedAttachmentsTest, check_encrypt_decrypt_message_elevated) {
// attached key is encrypted
ASSERT_TRUE(is_PGP_message_text(ad->value));
ASSERT_STREQ(ad->mime_type, "application/octet-stream");
ASSERT_STREQ(ad->filename, "file://pEpkey.asc.pgp");
// ASSERT_STREQ(ad->filename, "file://pEpkey.asc.pgp");
// As of ENGINE-633:
ASSERT_STREQ(ad->filename, "file://sender_key.asc.pgp");
// decrypt this message
char *ct = strdup(ad->value);


+ 182
- 182
test/test_mails/priv_key_attach.eml View File

@ -1,184 +1,184 @@
Message-ID: <pEp.P74JAT.0V8ST1NR4QM24.AF3319ED-96D4-45AA-94C6-91640DAAF536@darthmama.cool>
From: PrivateKey Import Test <priv-key-import-test-main@darthmama.cool>
To: PrivateKey Import Test <priv-key-import-test-main@darthmama.cool>
Subject: =?utf-8?Q?p=E2=89=A1p?=
X-pEp-Version: 2.0
MIME-Version: 1.0
Content-Type: multipart/encrypted; boundary="1bf5eb907b76716d2b9eab6525e9c2ea";
protocol="application/pgp-encrypted"
--1bf5eb907b76716d2b9eab6525e9c2ea
Content-Type: application/pgp-encrypted
Version: 1
--1bf5eb907b76716d2b9eab6525e9c2ea
Content-Type: application/octet-stream
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="msg.asc"
-----BEGIN PGP MESSAGE-----
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
=QAOv
-----END PGP MESSAGE-----
--1bf5eb907b76716d2b9eab6525e9c2ea--
Message-ID: <pEp.P74JAT.0V8ST1NR4QM24.AF3319ED-96D4-45AA-94C6-91640DAAF536@darthmama.cool>
From: PrivateKey Import Test <priv-key-import-test-main@darthmama.cool>
To: PrivateKey Import Test <priv-key-import-test-main@darthmama.cool>
Subject: =?utf-8?Q?p=E2=89=A1p?=
X-pEp-Version: 2.0
MIME-Version: 1.0
Content-Type: multipart/encrypted; boundary="1bf5eb907b76716d2b9eab6525e9c2ea";
protocol="application/pgp-encrypted"
--1bf5eb907b76716d2b9eab6525e9c2ea
Content-Type: application/pgp-encrypted
Version: 1
--1bf5eb907b76716d2b9eab6525e9c2ea
Content-Type: application/octet-stream
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="msg.asc"
-----BEGIN PGP MESSAGE-----
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
=QAOv
-----END PGP MESSAGE-----
--1bf5eb907b76716d2b9eab6525e9c2ea--

Loading…
Cancel
Save