handshake: remove handshake related netdev events
Handshake related netdev events were removed in favor of handshake events. Now events will be emitted on the handshake object related to the 4-way handshake and key settings. Events are: HANDSHAKE_EVENT_STARTED HANDSHAKE_EVENT_SETTING_KEYS HANDSHAKE_EVENT_COMPLETE HANDSHAKE_EVENT_FAILED Right now, since netdev only operates in station mode, nothing listens for COMPLETE/FAILED, as device/wsc gets notified by the connect_cb when the connection was successful. The COMPLETE/ FAILED were added in preperation for AP moving into eapol/netdev.
This commit is contained in:
parent
c5893f7da8
commit
aac00bf33a
42
src/device.c
42
src/device.c
|
@ -640,6 +640,34 @@ static enum ie_rsn_akm_suite device_select_akm_suite(struct network *network,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void device_handshake_event(struct handshake_state *hs,
|
||||||
|
enum handshake_event event,
|
||||||
|
void *event_data, void *user_data)
|
||||||
|
{
|
||||||
|
struct device *device = user_data;
|
||||||
|
struct network *network = device->connected_network;
|
||||||
|
|
||||||
|
switch (event) {
|
||||||
|
case HANDSHAKE_EVENT_STARTED:
|
||||||
|
l_debug("Handshaking");
|
||||||
|
break;
|
||||||
|
case HANDSHAKE_EVENT_SETTING_KEYS:
|
||||||
|
l_debug("Setting keys");
|
||||||
|
|
||||||
|
/* If we got here, then our PSK works. Save if required */
|
||||||
|
network_sync_psk(network);
|
||||||
|
break;
|
||||||
|
case HANDSHAKE_EVENT_COMPLETE:
|
||||||
|
case HANDSHAKE_EVENT_FAILED:
|
||||||
|
/*
|
||||||
|
* currently we dont care about any other events. The
|
||||||
|
* netdev_connect_cb will notify us when the connection is
|
||||||
|
* complete.
|
||||||
|
*/
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static struct handshake_state *device_handshake_setup(struct device *device,
|
static struct handshake_state *device_handshake_setup(struct device *device,
|
||||||
struct network *network,
|
struct network *network,
|
||||||
struct scan_bss *bss)
|
struct scan_bss *bss)
|
||||||
|
@ -651,6 +679,8 @@ static struct handshake_state *device_handshake_setup(struct device *device,
|
||||||
|
|
||||||
hs = netdev_handshake_state_new(device->netdev);
|
hs = netdev_handshake_state_new(device->netdev);
|
||||||
|
|
||||||
|
handshake_state_set_event_func(hs, device_handshake_event, device);
|
||||||
|
|
||||||
if (security == SECURITY_PSK || security == SECURITY_8021X) {
|
if (security == SECURITY_PSK || security == SECURITY_8021X) {
|
||||||
const struct l_settings *settings = iwd_get_config();
|
const struct l_settings *settings = iwd_get_config();
|
||||||
struct ie_rsn_info bss_info;
|
struct ie_rsn_info bss_info;
|
||||||
|
@ -1579,12 +1609,10 @@ static void device_signal_agent_release(struct signal_agent *agent,
|
||||||
l_dbus_send(dbus_get_bus(), msg);
|
l_dbus_send(dbus_get_bus(), msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void device_netdev_event(struct netdev *netdev, enum netdev_event event,
|
static void device_netdev_event(struct netdev *netdev, enum netdev_event event,
|
||||||
void *user_data)
|
void *user_data)
|
||||||
{
|
{
|
||||||
struct device *device = user_data;
|
struct device *device = user_data;
|
||||||
struct network *network = device->connected_network;
|
|
||||||
|
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case NETDEV_EVENT_AUTHENTICATING:
|
case NETDEV_EVENT_AUTHENTICATING:
|
||||||
|
@ -1592,16 +1620,6 @@ static void device_netdev_event(struct netdev *netdev, enum netdev_event event,
|
||||||
break;
|
break;
|
||||||
case NETDEV_EVENT_ASSOCIATING:
|
case NETDEV_EVENT_ASSOCIATING:
|
||||||
l_debug("Associating");
|
l_debug("Associating");
|
||||||
break;
|
|
||||||
case NETDEV_EVENT_4WAY_HANDSHAKE:
|
|
||||||
l_debug("Handshaking");
|
|
||||||
break;
|
|
||||||
case NETDEV_EVENT_SETTING_KEYS:
|
|
||||||
l_debug("Setting keys");
|
|
||||||
|
|
||||||
/* If we got here, then our PSK works. Save if required */
|
|
||||||
network_sync_psk(network);
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case NETDEV_EVENT_LOST_BEACON:
|
case NETDEV_EVENT_LOST_BEACON:
|
||||||
device_lost_beacon(device);
|
device_lost_beacon(device);
|
||||||
|
|
|
@ -740,6 +740,8 @@ static void eapol_sm_write(struct eapol_sm *sm, const struct eapol_frame *ef,
|
||||||
|
|
||||||
static inline void handshake_failed(struct eapol_sm *sm, uint16_t reason_code)
|
static inline void handshake_failed(struct eapol_sm *sm, uint16_t reason_code)
|
||||||
{
|
{
|
||||||
|
handshake_event(sm->handshake, HANDSHAKE_EVENT_FAILED, &reason_code);
|
||||||
|
|
||||||
if (deauthenticate)
|
if (deauthenticate)
|
||||||
deauthenticate(sm->handshake->ifindex,
|
deauthenticate(sm->handshake->ifindex,
|
||||||
sm->handshake->aa, sm->handshake->spa,
|
sm->handshake->aa, sm->handshake->spa,
|
||||||
|
@ -799,6 +801,8 @@ static void send_eapol_start(struct l_timeout *timeout, void *user_data)
|
||||||
uint8_t buf[sizeof(struct eapol_frame)];
|
uint8_t buf[sizeof(struct eapol_frame)];
|
||||||
struct eapol_frame *frame = (struct eapol_frame *) buf;
|
struct eapol_frame *frame = (struct eapol_frame *) buf;
|
||||||
|
|
||||||
|
handshake_event(sm->handshake, HANDSHAKE_EVENT_STARTED, NULL);
|
||||||
|
|
||||||
l_timeout_remove(sm->eapol_start_timeout);
|
l_timeout_remove(sm->eapol_start_timeout);
|
||||||
sm->eapol_start_timeout = NULL;
|
sm->eapol_start_timeout = NULL;
|
||||||
|
|
||||||
|
|
|
@ -187,11 +187,6 @@ bool handshake_state_set_own_wpa(struct handshake_state *s,
|
||||||
return handshake_state_setup_own_ciphers(s, &info);
|
return handshake_state_setup_own_ciphers(s, &info);
|
||||||
}
|
}
|
||||||
|
|
||||||
void handshake_state_set_user_data(struct handshake_state *s, void *user_data)
|
|
||||||
{
|
|
||||||
s->user_data = user_data;
|
|
||||||
}
|
|
||||||
|
|
||||||
void handshake_state_set_ssid(struct handshake_state *s, const uint8_t *ssid,
|
void handshake_state_set_ssid(struct handshake_state *s, const uint8_t *ssid,
|
||||||
size_t ssid_len)
|
size_t ssid_len)
|
||||||
{
|
{
|
||||||
|
@ -225,6 +220,14 @@ void handshake_state_set_kh_ids(struct handshake_state *s,
|
||||||
memcpy(s->r1khid, r1khid, 6);
|
memcpy(s->r1khid, r1khid, 6);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void handshake_state_set_event_func(struct handshake_state *s,
|
||||||
|
handshake_event_func_t func,
|
||||||
|
void *user_data)
|
||||||
|
{
|
||||||
|
s->event_func = func;
|
||||||
|
s->user_data = user_data;
|
||||||
|
}
|
||||||
|
|
||||||
void handshake_state_new_snonce(struct handshake_state *s)
|
void handshake_state_new_snonce(struct handshake_state *s)
|
||||||
{
|
{
|
||||||
get_nonce(s->snonce);
|
get_nonce(s->snonce);
|
||||||
|
@ -336,6 +339,8 @@ void handshake_state_install_ptk(struct handshake_state *s)
|
||||||
uint32_t cipher = ie_rsn_cipher_suite_to_cipher(
|
uint32_t cipher = ie_rsn_cipher_suite_to_cipher(
|
||||||
s->pairwise_cipher);
|
s->pairwise_cipher);
|
||||||
|
|
||||||
|
handshake_event(s, HANDSHAKE_EVENT_SETTING_KEYS, NULL);
|
||||||
|
|
||||||
install_tk(s, ptk->tk, cipher);
|
install_tk(s, ptk->tk, cipher);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -622,3 +627,10 @@ bool handshake_decode_fte_key(struct handshake_state *s, const uint8_t *wrapped,
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void handshake_event(struct handshake_state *hs,
|
||||||
|
enum handshake_event event, void *event_data)
|
||||||
|
{
|
||||||
|
if (hs->event_func)
|
||||||
|
hs->event_func(hs, event, event_data, hs->user_data);
|
||||||
|
}
|
||||||
|
|
|
@ -42,6 +42,17 @@ enum handshake_kde {
|
||||||
HANDSHAKE_KDE_MULTIBAND_KEY_ID = 0x000fac0c,
|
HANDSHAKE_KDE_MULTIBAND_KEY_ID = 0x000fac0c,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum handshake_event {
|
||||||
|
HANDSHAKE_EVENT_STARTED,
|
||||||
|
HANDSHAKE_EVENT_SETTING_KEYS,
|
||||||
|
HANDSHAKE_EVENT_COMPLETE,
|
||||||
|
HANDSHAKE_EVENT_FAILED
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef void (*handshake_event_func_t)(struct handshake_state *hs,
|
||||||
|
enum handshake_event event,
|
||||||
|
void *event_data, void *user_data);
|
||||||
|
|
||||||
typedef bool (*handshake_get_nonce_func_t)(uint8_t nonce[]);
|
typedef bool (*handshake_get_nonce_func_t)(uint8_t nonce[]);
|
||||||
typedef void (*handshake_install_tk_func_t)(struct handshake_state *hs,
|
typedef void (*handshake_install_tk_func_t)(struct handshake_state *hs,
|
||||||
const uint8_t *tk, uint32_t cipher);
|
const uint8_t *tk, uint32_t cipher);
|
||||||
|
@ -96,6 +107,8 @@ struct handshake_state {
|
||||||
void *user_data;
|
void *user_data;
|
||||||
|
|
||||||
void (*free)(struct handshake_state *s);
|
void (*free)(struct handshake_state *s);
|
||||||
|
|
||||||
|
handshake_event_func_t event_func;
|
||||||
};
|
};
|
||||||
|
|
||||||
void handshake_state_free(struct handshake_state *s);
|
void handshake_state_free(struct handshake_state *s);
|
||||||
|
@ -104,7 +117,6 @@ void handshake_state_set_supplicant_address(struct handshake_state *s,
|
||||||
const uint8_t *spa);
|
const uint8_t *spa);
|
||||||
void handshake_state_set_authenticator_address(struct handshake_state *s,
|
void handshake_state_set_authenticator_address(struct handshake_state *s,
|
||||||
const uint8_t *aa);
|
const uint8_t *aa);
|
||||||
void handshake_state_set_user_data(struct handshake_state *s, void *user_data);
|
|
||||||
void handshake_state_set_pmk(struct handshake_state *s, const uint8_t *pmk,
|
void handshake_state_set_pmk(struct handshake_state *s, const uint8_t *pmk,
|
||||||
size_t pmk_len);
|
size_t pmk_len);
|
||||||
void handshake_state_set_8021x_config(struct handshake_state *s,
|
void handshake_state_set_8021x_config(struct handshake_state *s,
|
||||||
|
@ -128,6 +140,10 @@ void handshake_state_set_kh_ids(struct handshake_state *s,
|
||||||
const uint8_t *r0khid, size_t r0khid_len,
|
const uint8_t *r0khid, size_t r0khid_len,
|
||||||
const uint8_t *r1khid);
|
const uint8_t *r1khid);
|
||||||
|
|
||||||
|
void handshake_state_set_event_func(struct handshake_state *s,
|
||||||
|
handshake_event_func_t func,
|
||||||
|
void *user_data);
|
||||||
|
|
||||||
void handshake_state_new_snonce(struct handshake_state *s);
|
void handshake_state_new_snonce(struct handshake_state *s);
|
||||||
void handshake_state_new_anonce(struct handshake_state *s);
|
void handshake_state_new_anonce(struct handshake_state *s);
|
||||||
void handshake_state_set_anonce(struct handshake_state *s,
|
void handshake_state_set_anonce(struct handshake_state *s,
|
||||||
|
@ -164,3 +180,6 @@ const uint8_t *handshake_util_find_igtk_kde(const uint8_t *data,
|
||||||
size_t data_len, size_t *out_igtk_len);
|
size_t data_len, size_t *out_igtk_len);
|
||||||
const uint8_t *handshake_util_find_pmkid_kde(const uint8_t *data,
|
const uint8_t *handshake_util_find_pmkid_kde(const uint8_t *data,
|
||||||
size_t data_len);
|
size_t data_len);
|
||||||
|
|
||||||
|
void handshake_event(struct handshake_state *hs, enum handshake_event event,
|
||||||
|
void *event_data);
|
||||||
|
|
15
src/netdev.c
15
src/netdev.c
|
@ -943,6 +943,7 @@ static void netdev_setting_keys_failed(struct netdev_handshake_state *nhs,
|
||||||
nhs->set_station_cmd_id = 0;
|
nhs->set_station_cmd_id = 0;
|
||||||
|
|
||||||
netdev->result = NETDEV_RESULT_KEY_SETTING_FAILED;
|
netdev->result = NETDEV_RESULT_KEY_SETTING_FAILED;
|
||||||
|
|
||||||
msg = netdev_build_cmd_disconnect(netdev,
|
msg = netdev_build_cmd_disconnect(netdev,
|
||||||
MMPDU_REASON_CODE_UNSPECIFIED);
|
MMPDU_REASON_CODE_UNSPECIFIED);
|
||||||
netdev->disconnect_cmd_id = l_genl_family_send(nl80211, msg,
|
netdev->disconnect_cmd_id = l_genl_family_send(nl80211, msg,
|
||||||
|
@ -972,6 +973,8 @@ static void netdev_set_station_cb(struct l_genl_msg *msg, void *user_data)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
handshake_event(&nhs->super, HANDSHAKE_EVENT_COMPLETE, NULL);
|
||||||
|
|
||||||
done:
|
done:
|
||||||
netdev_connect_ok(netdev);
|
netdev_connect_ok(netdev);
|
||||||
}
|
}
|
||||||
|
@ -1248,10 +1251,6 @@ static void netdev_set_tk(struct handshake_state *hs,
|
||||||
|
|
||||||
l_debug("%d", netdev->index);
|
l_debug("%d", netdev->index);
|
||||||
|
|
||||||
if (netdev->event_filter)
|
|
||||||
netdev->event_filter(netdev, NETDEV_EVENT_SETTING_KEYS,
|
|
||||||
netdev->user_data);
|
|
||||||
|
|
||||||
rc = MMPDU_REASON_CODE_INVALID_PAIRWISE_CIPHER;
|
rc = MMPDU_REASON_CODE_INVALID_PAIRWISE_CIPHER;
|
||||||
if (!netdev_copy_tk(tk_buf, tk, cipher, false))
|
if (!netdev_copy_tk(tk_buf, tk, cipher, false))
|
||||||
goto invalid_key;
|
goto invalid_key;
|
||||||
|
@ -1599,15 +1598,9 @@ static void netdev_connect_event(struct l_genl_msg *msg,
|
||||||
if (!eapol_start(netdev->sm))
|
if (!eapol_start(netdev->sm))
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
if (!netdev->in_ft) {
|
if (!netdev->in_ft)
|
||||||
if (netdev->event_filter)
|
|
||||||
netdev->event_filter(netdev,
|
|
||||||
NETDEV_EVENT_4WAY_HANDSHAKE,
|
|
||||||
netdev->user_data);
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (netdev->in_ft) {
|
if (netdev->in_ft) {
|
||||||
bool is_rsn = netdev->handshake->own_ie != NULL;
|
bool is_rsn = netdev->handshake->own_ie != NULL;
|
||||||
|
|
|
@ -40,8 +40,6 @@ enum netdev_result {
|
||||||
enum netdev_event {
|
enum netdev_event {
|
||||||
NETDEV_EVENT_AUTHENTICATING,
|
NETDEV_EVENT_AUTHENTICATING,
|
||||||
NETDEV_EVENT_ASSOCIATING,
|
NETDEV_EVENT_ASSOCIATING,
|
||||||
NETDEV_EVENT_4WAY_HANDSHAKE,
|
|
||||||
NETDEV_EVENT_SETTING_KEYS,
|
|
||||||
NETDEV_EVENT_LOST_BEACON,
|
NETDEV_EVENT_LOST_BEACON,
|
||||||
NETDEV_EVENT_DISCONNECT_BY_AP,
|
NETDEV_EVENT_DISCONNECT_BY_AP,
|
||||||
NETDEV_EVENT_DISCONNECT_BY_SME,
|
NETDEV_EVENT_DISCONNECT_BY_SME,
|
||||||
|
|
|
@ -367,9 +367,6 @@ static void wsc_netdev_event(struct netdev *netdev, enum netdev_event event,
|
||||||
case NETDEV_EVENT_AUTHENTICATING:
|
case NETDEV_EVENT_AUTHENTICATING:
|
||||||
case NETDEV_EVENT_ASSOCIATING:
|
case NETDEV_EVENT_ASSOCIATING:
|
||||||
break;
|
break;
|
||||||
case NETDEV_EVENT_4WAY_HANDSHAKE:
|
|
||||||
l_info("Running EAP-WSC");
|
|
||||||
break;
|
|
||||||
case NETDEV_EVENT_LOST_BEACON:
|
case NETDEV_EVENT_LOST_BEACON:
|
||||||
l_debug("Lost beacon");
|
l_debug("Lost beacon");
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue