Merge branch 'ikev1-clean' into ikev1-master
Conflicts: configure.in man/ipsec.conf.5.in src/libcharon/daemon.c src/libcharon/plugins/eap_ttls/eap_ttls_peer.c src/libcharon/plugins/eap_radius/eap_radius_accounting.c src/libcharon/plugins/eap_radius/eap_radius_forward.c src/libcharon/plugins/farp/farp_listener.c src/libcharon/sa/ike_sa.c src/libcharon/sa/keymat.c src/libcharon/sa/task_manager.c src/libcharon/sa/trap_manager.c src/libstrongswan/plugins/x509/x509_cert.c src/libstrongswan/utils.h Applied lost changes of moved files keymat.c and task_manager.c. Updated listener_t.message hook signature in new plugins.
This commit is contained in:
@@ -15,6 +15,9 @@
|
||||
|
||||
#include "ha_ike.h"
|
||||
|
||||
#include <sa/ikev2/keymat_v2.h>
|
||||
#include <sa/ikev1/keymat_v1.h>
|
||||
|
||||
typedef struct private_ha_ike_t private_ha_ike_t;
|
||||
|
||||
/**
|
||||
@@ -69,7 +72,8 @@ static ike_extension_t copy_extension(ike_sa_t *ike_sa, ike_extension_t ext)
|
||||
|
||||
METHOD(listener_t, ike_keys, bool,
|
||||
private_ha_ike_t *this, ike_sa_t *ike_sa, diffie_hellman_t *dh,
|
||||
chunk_t nonce_i, chunk_t nonce_r, ike_sa_t *rekey)
|
||||
chunk_t dh_other, chunk_t nonce_i, chunk_t nonce_r, ike_sa_t *rekey,
|
||||
shared_key_t *shared)
|
||||
{
|
||||
ha_message_t *m;
|
||||
chunk_t secret;
|
||||
@@ -86,14 +90,15 @@ METHOD(listener_t, ike_keys, bool,
|
||||
}
|
||||
|
||||
m = ha_message_create(HA_IKE_ADD);
|
||||
m->add_attribute(m, HA_IKE_VERSION, ike_sa->get_version(ike_sa));
|
||||
m->add_attribute(m, HA_IKE_ID, ike_sa->get_id(ike_sa));
|
||||
|
||||
if (rekey)
|
||||
if (rekey && rekey->get_version(rekey) == IKEV2)
|
||||
{
|
||||
chunk_t skd;
|
||||
keymat_t *keymat;
|
||||
keymat_v2_t *keymat;
|
||||
|
||||
keymat = rekey->get_keymat(rekey);
|
||||
keymat = (keymat_v2_t*)rekey->get_keymat(rekey);
|
||||
m->add_attribute(m, HA_IKE_REKEY_ID, rekey->get_id(rekey));
|
||||
m->add_attribute(m, HA_ALG_OLD_PRF, keymat->get_skd(keymat, &skd));
|
||||
m->add_attribute(m, HA_OLD_SKD, skd);
|
||||
@@ -120,6 +125,17 @@ METHOD(listener_t, ike_keys, bool,
|
||||
m->add_attribute(m, HA_NONCE_R, nonce_r);
|
||||
m->add_attribute(m, HA_SECRET, secret);
|
||||
chunk_clear(&secret);
|
||||
if (ike_sa->get_version(ike_sa) == IKEV1)
|
||||
{
|
||||
dh->get_my_public_value(dh, &secret);
|
||||
m->add_attribute(m, HA_LOCAL_DH, secret);
|
||||
chunk_free(&secret);
|
||||
m->add_attribute(m, HA_REMOTE_DH, dh_other);
|
||||
if (shared)
|
||||
{
|
||||
m->add_attribute(m, HA_PSK, shared->get_key(shared));
|
||||
}
|
||||
}
|
||||
|
||||
this->socket->push(this->socket, m);
|
||||
this->cache->cache(this->cache, ike_sa, m);
|
||||
@@ -159,7 +175,9 @@ METHOD(listener_t, ike_updown, bool,
|
||||
| copy_condition(ike_sa, COND_EAP_AUTHENTICATED)
|
||||
| copy_condition(ike_sa, COND_CERTREQ_SEEN)
|
||||
| copy_condition(ike_sa, COND_ORIGINAL_INITIATOR)
|
||||
| copy_condition(ike_sa, COND_STALE);
|
||||
| copy_condition(ike_sa, COND_STALE)
|
||||
| copy_condition(ike_sa, COND_INIT_CONTACT_SEEN)
|
||||
| copy_condition(ike_sa, COND_XAUTH_AUTHENTICATED);
|
||||
|
||||
extension = copy_extension(ike_sa, EXT_NATT)
|
||||
| copy_extension(ike_sa, EXT_MOBIKE)
|
||||
@@ -167,7 +185,9 @@ METHOD(listener_t, ike_updown, bool,
|
||||
| copy_extension(ike_sa, EXT_MULTIPLE_AUTH)
|
||||
| copy_extension(ike_sa, EXT_STRONGSWAN)
|
||||
| copy_extension(ike_sa, EXT_EAP_ONLY_AUTHENTICATION)
|
||||
| copy_extension(ike_sa, EXT_MS_WINDOWS);
|
||||
| copy_extension(ike_sa, EXT_MS_WINDOWS)
|
||||
| copy_extension(ike_sa, EXT_XAUTH)
|
||||
| copy_extension(ike_sa, EXT_DPD);
|
||||
|
||||
id = ike_sa->get_id(ike_sa);
|
||||
|
||||
@@ -222,49 +242,116 @@ METHOD(listener_t, ike_state_change, bool,
|
||||
}
|
||||
|
||||
METHOD(listener_t, message_hook, bool,
|
||||
private_ha_ike_t *this, ike_sa_t *ike_sa, message_t *message, bool incoming)
|
||||
private_ha_ike_t *this, ike_sa_t *ike_sa, message_t *message,
|
||||
bool incoming, bool plain)
|
||||
{
|
||||
if (this->tunnel && this->tunnel->is_sa(this->tunnel, ike_sa))
|
||||
{ /* do not sync SA between nodes */
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (message->get_exchange_type(message) != IKE_SA_INIT &&
|
||||
message->get_request(message))
|
||||
{ /* we sync on requests, but skip it on IKE_SA_INIT */
|
||||
ha_message_t *m;
|
||||
if (plain && ike_sa->get_version(ike_sa) == IKEV2)
|
||||
{
|
||||
if (message->get_exchange_type(message) != IKE_SA_INIT &&
|
||||
message->get_request(message))
|
||||
{ /* we sync on requests, but skip it on IKE_SA_INIT */
|
||||
ha_message_t *m;
|
||||
|
||||
if (incoming)
|
||||
{
|
||||
m = ha_message_create(HA_IKE_MID_RESPONDER);
|
||||
}
|
||||
else
|
||||
{
|
||||
m = ha_message_create(HA_IKE_MID_INITIATOR);
|
||||
}
|
||||
m->add_attribute(m, HA_IKE_ID, ike_sa->get_id(ike_sa));
|
||||
m->add_attribute(m, HA_MID, message->get_message_id(message) + 1);
|
||||
this->socket->push(this->socket, m);
|
||||
this->cache->cache(this->cache, ike_sa, m);
|
||||
}
|
||||
if (ike_sa->get_state(ike_sa) == IKE_ESTABLISHED &&
|
||||
message->get_exchange_type(message) == IKE_AUTH &&
|
||||
!message->get_request(message))
|
||||
{ /* After IKE_SA has been established, sync peers virtual IP.
|
||||
* We cannot sync it in the state_change hook, it is installed later.
|
||||
* TODO: where to sync local VIP? */
|
||||
ha_message_t *m;
|
||||
host_t *vip;
|
||||
|
||||
vip = ike_sa->get_virtual_ip(ike_sa, FALSE);
|
||||
if (vip)
|
||||
{
|
||||
m = ha_message_create(HA_IKE_UPDATE);
|
||||
if (incoming)
|
||||
{
|
||||
m = ha_message_create(HA_IKE_MID_RESPONDER);
|
||||
}
|
||||
else
|
||||
{
|
||||
m = ha_message_create(HA_IKE_MID_INITIATOR);
|
||||
}
|
||||
m->add_attribute(m, HA_IKE_ID, ike_sa->get_id(ike_sa));
|
||||
m->add_attribute(m, HA_REMOTE_VIP, vip);
|
||||
m->add_attribute(m, HA_MID, message->get_message_id(message) + 1);
|
||||
this->socket->push(this->socket, m);
|
||||
this->cache->cache(this->cache, ike_sa, m);
|
||||
}
|
||||
if (ike_sa->get_state(ike_sa) == IKE_ESTABLISHED &&
|
||||
message->get_exchange_type(message) == IKE_AUTH &&
|
||||
!message->get_request(message))
|
||||
{ /* After IKE_SA has been established, sync peers virtual IP.
|
||||
* We cannot sync it in the state_change hook, it is installed later.
|
||||
* TODO: where to sync local VIP? */
|
||||
ha_message_t *m;
|
||||
host_t *vip;
|
||||
|
||||
vip = ike_sa->get_virtual_ip(ike_sa, FALSE);
|
||||
if (vip)
|
||||
{
|
||||
m = ha_message_create(HA_IKE_UPDATE);
|
||||
m->add_attribute(m, HA_IKE_ID, ike_sa->get_id(ike_sa));
|
||||
m->add_attribute(m, HA_REMOTE_VIP, vip);
|
||||
this->socket->push(this->socket, m);
|
||||
this->cache->cache(this->cache, ike_sa, m);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!plain && ike_sa->get_version(ike_sa) == IKEV1)
|
||||
{
|
||||
ha_message_t *m;
|
||||
keymat_v1_t *keymat;
|
||||
u_int32_t mid;
|
||||
chunk_t iv;
|
||||
host_t *vip;
|
||||
|
||||
mid = message->get_message_id(message);
|
||||
if (mid == 0)
|
||||
{
|
||||
keymat = (keymat_v1_t*)ike_sa->get_keymat(ike_sa);
|
||||
iv = keymat->get_iv(keymat, mid);
|
||||
m = ha_message_create(HA_IKE_IV);
|
||||
m->add_attribute(m, HA_IKE_ID, ike_sa->get_id(ike_sa));
|
||||
m->add_attribute(m, HA_IV, iv);
|
||||
free(iv.ptr);
|
||||
this->socket->push(this->socket, m);
|
||||
this->cache->cache(this->cache, ike_sa, m);
|
||||
}
|
||||
if (!incoming && message->get_exchange_type(message) == TRANSACTION)
|
||||
{
|
||||
vip = ike_sa->get_virtual_ip(ike_sa, FALSE);
|
||||
if (vip)
|
||||
{
|
||||
m = ha_message_create(HA_IKE_UPDATE);
|
||||
m->add_attribute(m, HA_IKE_ID, ike_sa->get_id(ike_sa));
|
||||
m->add_attribute(m, HA_REMOTE_VIP, vip);
|
||||
this->socket->push(this->socket, m);
|
||||
this->cache->cache(this->cache, ike_sa, m);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (plain && ike_sa->get_version(ike_sa) == IKEV1 &&
|
||||
message->get_exchange_type(message) == INFORMATIONAL_V1)
|
||||
{
|
||||
ha_message_t *m;
|
||||
notify_payload_t *notify;
|
||||
chunk_t data;
|
||||
u_int32_t seq;
|
||||
|
||||
notify = message->get_notify(message, DPD_R_U_THERE);
|
||||
if (notify)
|
||||
{
|
||||
data = notify->get_notification_data(notify);
|
||||
if (data.len == 4)
|
||||
{
|
||||
seq = untoh32(data.ptr);
|
||||
if (incoming)
|
||||
{
|
||||
m = ha_message_create(HA_IKE_MID_RESPONDER);
|
||||
}
|
||||
else
|
||||
{
|
||||
m = ha_message_create(HA_IKE_MID_INITIATOR);
|
||||
}
|
||||
m->add_attribute(m, HA_IKE_ID, ike_sa->get_id(ike_sa));
|
||||
m->add_attribute(m, HA_MID, seq + 1);
|
||||
this->socket->push(this->socket, m);
|
||||
this->cache->cache(this->cache, ike_sa, m);
|
||||
}
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user