diff options
author | Tobias Brunner <tobias@strongswan.org> | 2014-12-15 14:25:04 +0100 |
---|---|---|
committer | Andreas Steffen <andreas.steffen@strongswan.org> | 2014-12-23 15:40:01 +0100 |
commit | 691d00f1662d6195cb35f02742fb4d4b4aa589ea (patch) | |
tree | 4169065ac722835d5270342abdaf5a67c8c3573d | |
parent | e13ef5c43416304f0e750af3bb87fd2fad3eee41 (diff) | |
download | strongswan-691d00f1662d6195cb35f02742fb4d4b4aa589ea.tar.bz2 strongswan-691d00f1662d6195cb35f02742fb4d4b4aa589ea.tar.xz |
ikev2: Only touch the DH object if we have a matching proposal
-rw-r--r-- | src/libcharon/sa/ikev2/tasks/ike_init.c | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/src/libcharon/sa/ikev2/tasks/ike_init.c b/src/libcharon/sa/ikev2/tasks/ike_init.c index 71c5f22fa..b3e92d8ca 100644 --- a/src/libcharon/sa/ikev2/tasks/ike_init.c +++ b/src/libcharon/sa/ikev2/tasks/ike_init.c @@ -183,6 +183,7 @@ static void process_payloads(private_ike_init_t *this, message_t *message) { enumerator_t *enumerator; payload_t *payload; + ke_payload_t *ke_payload = NULL; enumerator = message->create_payload_enumerator(message); while (enumerator->enumerate(enumerator, &payload)) @@ -211,19 +212,9 @@ static void process_payloads(private_ike_init_t *this, message_t *message) } case PLV2_KEY_EXCHANGE: { - ke_payload_t *ke_payload = (ke_payload_t*)payload; + ke_payload = (ke_payload_t*)payload; this->dh_group = ke_payload->get_dh_group_number(ke_payload); - if (!this->initiator) - { - this->dh = this->keymat->keymat.create_dh( - &this->keymat->keymat, this->dh_group); - } - if (this->dh) - { - this->dh->set_other_public_value(this->dh, - ke_payload->get_key_exchange_data(ke_payload)); - } break; } case PLV2_NONCE: @@ -248,6 +239,21 @@ static void process_payloads(private_ike_init_t *this, message_t *message) } } enumerator->destroy(enumerator); + + if (ke_payload && this->proposal && + this->proposal->has_dh_group(this->proposal, this->dh_group)) + { + if (!this->initiator) + { + this->dh = this->keymat->keymat.create_dh( + &this->keymat->keymat, this->dh_group); + } + if (this->dh) + { + this->dh->set_other_public_value(this->dh, + ke_payload->get_key_exchange_data(ke_payload)); + } + } } METHOD(task_t, build_i, status_t, |