ikev2: Include fragment number into message ID passed to IV gen
[strongswan.git] / src / libcharon / encoding / payloads / encrypted_payload.c
index 5c574c3..d1a2678 100644 (file)
@@ -502,6 +502,8 @@ METHOD(encrypted_payload_t, encrypt, status_t,
        generator = generator_create();
        plain = generate(this, generator);
        assoc = append_header(this, assoc);
+       /* lower 32-bits are for fragment number, if used */
+       mid <<= 32;
        status = encrypt_content("encrypted payload", this->aead, mid, plain, assoc,
                                                         &this->encrypted);
        generator->destroy(generator);
@@ -561,6 +563,7 @@ static status_t parse(private_encrypted_payload_t *this, chunk_t plain)
        payload_type_t type;
 
        parser = parser_create(plain);
+       parser->set_major_version(parser, this->type == PLV1_ENCRYPTED ? 1 : 2);
        type = this->next_payload;
        while (type != PL_NONE)
        {
@@ -931,6 +934,9 @@ METHOD(encrypted_payload_t, frag_encrypt, status_t,
        }
        free(this->encrypted.ptr);
        assoc = append_header_frag(this, assoc);
+       /* IKEv2 message IDs are not unique if fragmentation is used, hence include
+        * the fragment number to make it unique */
+       mid = mid << 32 | this->fragment_number;
        status = encrypt_content("encrypted fragment payload", this->aead, mid,
                                                         this->plain, assoc, &this->encrypted);
        free(assoc.ptr);