xpc: add support for initiate simple IKEv2 EAP connections
This commit is contained in:
@@ -57,6 +57,131 @@ static xpc_object_t get_version(private_xpc_dispatch_t *this,
|
|||||||
return reply;
|
return reply;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create peer config with associated ike config
|
||||||
|
*/
|
||||||
|
static peer_cfg_t* create_peer_cfg(char *name, char *host)
|
||||||
|
{
|
||||||
|
ike_cfg_t *ike_cfg;
|
||||||
|
peer_cfg_t *peer_cfg;
|
||||||
|
u_int16_t local_port, remote_port = IKEV2_UDP_PORT;
|
||||||
|
|
||||||
|
local_port = charon->socket->get_port(charon->socket, FALSE);
|
||||||
|
if (local_port != IKEV2_UDP_PORT)
|
||||||
|
{
|
||||||
|
remote_port = IKEV2_NATT_PORT;
|
||||||
|
}
|
||||||
|
ike_cfg = ike_cfg_create(IKEV2, TRUE, FALSE, "0.0.0.0", FALSE, local_port,
|
||||||
|
host, FALSE, remote_port, FRAGMENTATION_NO, 0);
|
||||||
|
ike_cfg->add_proposal(ike_cfg, proposal_create_default(PROTO_IKE));
|
||||||
|
peer_cfg = peer_cfg_create(name, ike_cfg,
|
||||||
|
CERT_SEND_IF_ASKED, UNIQUE_REPLACE, 1, /* keyingtries */
|
||||||
|
36000, 0, /* rekey 10h, reauth none */
|
||||||
|
600, 600, /* jitter, over 10min */
|
||||||
|
TRUE, FALSE, /* mobike, aggressive */
|
||||||
|
30, 0, /* DPD delay, timeout */
|
||||||
|
FALSE, NULL, NULL); /* mediation */
|
||||||
|
peer_cfg->add_virtual_ip(peer_cfg, host_create_from_string("0.0.0.0", 0));
|
||||||
|
|
||||||
|
return peer_cfg;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a single auth cfg of given class to peer cfg
|
||||||
|
*/
|
||||||
|
static void add_auth_cfg(peer_cfg_t *peer_cfg, bool local,
|
||||||
|
char *id, auth_class_t class)
|
||||||
|
{
|
||||||
|
auth_cfg_t *auth;
|
||||||
|
|
||||||
|
auth = auth_cfg_create();
|
||||||
|
auth->add(auth, AUTH_RULE_AUTH_CLASS, class);
|
||||||
|
auth->add(auth, AUTH_RULE_IDENTITY, identification_create_from_string(id));
|
||||||
|
peer_cfg->add_auth_cfg(peer_cfg, auth, local);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attach child config to peer config
|
||||||
|
*/
|
||||||
|
static child_cfg_t* create_child_cfg(char *name)
|
||||||
|
{
|
||||||
|
child_cfg_t *child_cfg;
|
||||||
|
traffic_selector_t *ts;
|
||||||
|
lifetime_cfg_t lifetime = {
|
||||||
|
.time = {
|
||||||
|
.life = 10800 /* 3h */,
|
||||||
|
.rekey = 10200 /* 2h50min */,
|
||||||
|
.jitter = 300 /* 5min */
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
child_cfg = child_cfg_create(name, &lifetime,
|
||||||
|
NULL, FALSE, MODE_TUNNEL, /* updown, hostaccess */
|
||||||
|
ACTION_NONE, ACTION_NONE, ACTION_NONE, FALSE,
|
||||||
|
0, 0, NULL, NULL, 0);
|
||||||
|
child_cfg->add_proposal(child_cfg, proposal_create_default(PROTO_ESP));
|
||||||
|
ts = traffic_selector_create_dynamic(0, 0, 65535);
|
||||||
|
child_cfg->add_traffic_selector(child_cfg, TRUE, ts);
|
||||||
|
ts = traffic_selector_create_from_string(0, TS_IPV4_ADDR_RANGE,
|
||||||
|
"0.0.0.0", 0, "255.255.255.255", 65535);
|
||||||
|
child_cfg->add_traffic_selector(child_cfg, FALSE, ts);
|
||||||
|
|
||||||
|
return child_cfg;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Controller initiate callback
|
||||||
|
*/
|
||||||
|
static bool initiate_cb(u_int32_t *sa, debug_t group, level_t level,
|
||||||
|
ike_sa_t *ike_sa, const char *message)
|
||||||
|
{
|
||||||
|
if (ike_sa)
|
||||||
|
{
|
||||||
|
*sa = ike_sa->get_unique_id(ike_sa);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start initiating an IKE connection
|
||||||
|
*/
|
||||||
|
xpc_object_t start_connection(private_xpc_dispatch_t *this,
|
||||||
|
xpc_object_t request, xpc_connection_t client)
|
||||||
|
{
|
||||||
|
xpc_object_t reply;
|
||||||
|
peer_cfg_t *peer_cfg;
|
||||||
|
child_cfg_t *child_cfg;
|
||||||
|
char *name, *id, *host;
|
||||||
|
u_int32_t sa = 0;
|
||||||
|
|
||||||
|
name = (char*)xpc_dictionary_get_string(request, "name");
|
||||||
|
host = (char*)xpc_dictionary_get_string(request, "host");
|
||||||
|
id = (char*)xpc_dictionary_get_string(request, "id");
|
||||||
|
reply = xpc_dictionary_create_reply(request);
|
||||||
|
|
||||||
|
if (name && id && host)
|
||||||
|
{
|
||||||
|
peer_cfg = create_peer_cfg(name, host);
|
||||||
|
|
||||||
|
add_auth_cfg(peer_cfg, TRUE, id, AUTH_CLASS_EAP);
|
||||||
|
add_auth_cfg(peer_cfg, FALSE, host, AUTH_CLASS_ANY);
|
||||||
|
|
||||||
|
child_cfg = create_child_cfg(name);
|
||||||
|
peer_cfg->add_child_cfg(peer_cfg, child_cfg->get_ref(child_cfg));
|
||||||
|
|
||||||
|
if (charon->controller->initiate(charon->controller, peer_cfg, child_cfg,
|
||||||
|
(controller_cb_t)initiate_cb, &sa, 0) != SUCCESS)
|
||||||
|
{
|
||||||
|
sa = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
xpc_dictionary_set_uint64(reply, "connection", sa);
|
||||||
|
|
||||||
|
return reply;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* XPC command dispatch table
|
* XPC command dispatch table
|
||||||
*/
|
*/
|
||||||
@@ -66,6 +191,7 @@ static struct {
|
|||||||
xpc_object_t request, xpc_connection_t client);
|
xpc_object_t request, xpc_connection_t client);
|
||||||
} commands[] = {
|
} commands[] = {
|
||||||
{ "get_version", get_version },
|
{ "get_version", get_version },
|
||||||
|
{ "start_connection", start_connection },
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user