diff options
author | Martin Willi <martin@revosec.ch> | 2011-11-16 18:24:47 +0100 |
---|---|---|
committer | Martin Willi <martin@revosec.ch> | 2012-03-20 17:30:41 +0100 |
commit | 2e897fe30acfdde96209317e38419cda0e83b8cc (patch) | |
tree | 766fa61bc53784df1b4e583d1a32860b26f40343 /src | |
parent | 3a470f303542dfb127eb8b17553da06a92892ebb (diff) | |
download | strongswan-2e897fe30acfdde96209317e38419cda0e83b8cc.tar.bz2 strongswan-2e897fe30acfdde96209317e38419cda0e83b8cc.tar.xz |
Handle first exchange in IKEv1 main mode as responder
Diffstat (limited to 'src')
-rw-r--r-- | src/libcharon/sa/tasks/main_mode.c | 37 |
1 files changed, 33 insertions, 4 deletions
diff --git a/src/libcharon/sa/tasks/main_mode.c b/src/libcharon/sa/tasks/main_mode.c index d208896e4..e8bd62554 100644 --- a/src/libcharon/sa/tasks/main_mode.c +++ b/src/libcharon/sa/tasks/main_mode.c @@ -23,7 +23,6 @@ #include <encoding/payloads/ke_payload.h> #include <encoding/payloads/nonce_payload.h> - typedef struct private_main_mode_t private_main_mode_t; /** @@ -50,6 +49,11 @@ struct private_main_mode_t { * IKE config to establish */ ike_cfg_t *config; + + /** + * selected IKE proposal + */ + proposal_t *proposal; }; METHOD(task_t, build_i, status_t, @@ -66,15 +70,39 @@ METHOD(task_t, process_r, status_t, DBG0(DBG_IKE, "%H is initiating a Main Mode", message->get_source(message)); this->ike_sa->set_state(this->ike_sa, IKE_CONNECTING); - /* TODO-IKEv1: process mainmode request */ + if (!this->proposal) + { + linked_list_t *list; + sa_payload_t *sa_payload; + + sa_payload = (sa_payload_t*)message->get_payload(message, + SECURITY_ASSOCIATION_V1); + if (!sa_payload) + { + DBG1(DBG_IKE, "SA payload missing"); + return FAILED; + } + list = sa_payload->get_proposals(sa_payload); + this->proposal = this->config->select_proposal(this->config, list, FALSE); + + if (!this->proposal) + { + DBG1(DBG_IKE, "no proposal found"); + return FAILED; + } + } return NEED_MORE; } METHOD(task_t, build_r, status_t, private_main_mode_t *this, message_t *message) { - /* TODO-IKEv1: build mainmode response */ - return FAILED; + sa_payload_t *sa_payload; + + sa_payload = sa_payload_create_from_proposal(SECURITY_ASSOCIATION_V1, + this->proposal); + message->add_payload(message, &sa_payload->payload_interface); + return NEED_MORE; } METHOD(task_t, process_i, status_t, @@ -99,6 +127,7 @@ METHOD(task_t, migrate, void, METHOD(task_t, destroy, void, private_main_mode_t *this) { + DESTROY_IF(this->proposal); free(this); } |