Commit 11241a8379 for strongswan.org
commit 11241a837902da354074729eca357e35ef4fbee1
Author: Tobias Brunner <tobias@strongswan.org>
Date: Mon Jul 20 12:29:21 2026 +0200
encrypted-payload: Do basic decryption check only once
The check only references the original chunk, so for each parsed payload
it checks the same thing. The length of each individual payload is
checked by the parser anyway. So I think this was primarily added for
the IKEv1 "wrong PSK" use case. Let's keep it for now.
Fixes: dd5c3787dc38 ("Give a hint that decryption failed if payload length invalid")
diff --git a/src/libcharon/encoding/payloads/encrypted_payload.c b/src/libcharon/encoding/payloads/encrypted_payload.c
index 4ac7aba94e..1e22d0831e 100644
--- a/src/libcharon/encoding/payloads/encrypted_payload.c
+++ b/src/libcharon/encoding/payloads/encrypted_payload.c
@@ -575,22 +575,22 @@ METHOD(encrypted_payload_t, encrypt_v1, status_t,
static status_t parse(private_encrypted_payload_t *this, chunk_t plain)
{
parser_t *parser;
- payload_type_t type;
+ payload_type_t type = this->next_payload;
+
+ if (type != PL_NONE &&
+ (plain.len < 4 || untoh16(plain.ptr + 2) > plain.len))
+ {
+ DBG1(DBG_ENC, "invalid %N payload length, decryption failed?",
+ payload_type_names, type);
+ return PARSE_ERROR;
+ }
parser = parser_create(plain);
parser->set_major_version(parser, this->type == PLV1_ENCRYPTED ? 1 : 2);
- type = this->next_payload;
while (type != PL_NONE)
{
payload_t *payload;
- if (plain.len < 4 || untoh16(plain.ptr + 2) > plain.len)
- {
- DBG1(DBG_ENC, "invalid %N payload length, decryption failed?",
- payload_type_names, type);
- parser->destroy(parser);
- return PARSE_ERROR;
- }
if (parser->parse_payload(parser, type, &payload) != SUCCESS)
{
parser->destroy(parser);