Use different return values in payload decryption to distinguish between integrity and syntax errors

This commit is contained in:
Martin Willi
2010-08-25 15:29:53 +02:00
parent f1a74a3cab
commit e5c6ebb697
3 changed files with 16 additions and 12 deletions
+2 -2
View File
@@ -1224,9 +1224,9 @@ static status_t decrypt_payloads(private_message_t *this, aead_t *aead)
break; break;
} }
chunk.len -= encryption->get_length(encryption); chunk.len -= encryption->get_length(encryption);
if (!encryption->decrypt(encryption, chunk)) status = encryption->decrypt(encryption, chunk);
if (status != SUCCESS)
{ {
status = VERIFY_ERROR;
break; break;
} }
@@ -352,7 +352,7 @@ static status_t parse(private_encryption_payload_t *this, chunk_t plain)
if (parser->parse_payload(parser, type, &payload) != SUCCESS) if (parser->parse_payload(parser, type, &payload) != SUCCESS)
{ {
parser->destroy(parser); parser->destroy(parser);
return FALSE; return PARSE_ERROR;
} }
if (payload->verify(payload) != SUCCESS) if (payload->verify(payload) != SUCCESS)
{ {
@@ -360,17 +360,17 @@ static status_t parse(private_encryption_payload_t *this, chunk_t plain)
payload_type_names, payload->get_type(payload)); payload_type_names, payload->get_type(payload));
payload->destroy(payload); payload->destroy(payload);
parser->destroy(parser); parser->destroy(parser);
return FALSE; return VERIFY_ERROR;
} }
type = payload->get_next_type(payload); type = payload->get_next_type(payload);
this->payloads->insert_last(this->payloads, payload); this->payloads->insert_last(this->payloads, payload);
} }
parser->destroy(parser); parser->destroy(parser);
DBG2(DBG_ENC, "parsed content of encryption payload"); DBG2(DBG_ENC, "parsed content of encryption payload");
return TRUE; return SUCCESS;
} }
METHOD(encryption_payload_t, decrypt, bool, METHOD(encryption_payload_t, decrypt, status_t,
private_encryption_payload_t *this, chunk_t assoc) private_encryption_payload_t *this, chunk_t assoc)
{ {
chunk_t iv, plain, padding, icv, crypt; chunk_t iv, plain, padding, icv, crypt;
@@ -379,7 +379,7 @@ METHOD(encryption_payload_t, decrypt, bool,
if (this->aead == NULL) if (this->aead == NULL)
{ {
DBG1(DBG_ENC, "decrypting encryption payload failed, transform missing"); DBG1(DBG_ENC, "decrypting encryption payload failed, transform missing");
return FALSE; return INVALID_STATE;
} }
/* prepare data to authenticate-decrypt: /* prepare data to authenticate-decrypt:
@@ -402,7 +402,7 @@ METHOD(encryption_payload_t, decrypt, bool,
(crypt.len - icv.len) % bs) (crypt.len - icv.len) % bs)
{ {
DBG1(DBG_ENC, "decrypting encryption payload failed, invalid length"); DBG1(DBG_ENC, "decrypting encryption payload failed, invalid length");
return FALSE; return FAILED;
} }
assoc = append_header(this, assoc); assoc = append_header(this, assoc);
@@ -417,7 +417,7 @@ METHOD(encryption_payload_t, decrypt, bool,
{ {
DBG1(DBG_ENC, "verifying encryption payload integrity failed"); DBG1(DBG_ENC, "verifying encryption payload integrity failed");
free(assoc.ptr); free(assoc.ptr);
return FALSE; return FAILED;
} }
free(assoc.ptr); free(assoc.ptr);
@@ -427,7 +427,7 @@ METHOD(encryption_payload_t, decrypt, bool,
{ {
DBG1(DBG_ENC, "decrypting encryption payload failed, " DBG1(DBG_ENC, "decrypting encryption payload failed, "
"padding invalid %B", &crypt); "padding invalid %B", &crypt);
return FAILED; return PARSE_ERROR;
} }
plain.len -= padding.len; plain.len -= padding.len;
padding.ptr = plain.ptr + plain.len; padding.ptr = plain.ptr + plain.len;
@@ -85,9 +85,13 @@ struct encryption_payload_t {
* Decrypt, verify and parse contained payloads. * Decrypt, verify and parse contained payloads.
* *
* @param assoc associated data * @param assoc associated data
* @return TRUE if decrypted and verified successfully * - SUCCESS if parsing successful
* - PARSE_ERROR if sub-payload parsing failed
* - VERIFY_ERROR if sub-payload verification failed
* - FAILED if integrity check failed
* - INVALID_STATE if aead not supplied, but needed
*/ */
bool (*decrypt) (encryption_payload_t *this, chunk_t assoc); status_t (*decrypt) (encryption_payload_t *this, chunk_t assoc);
/** /**
* Destroys an encryption_payload_t object. * Destroys an encryption_payload_t object.