Skip to content

Commit dfe52d9

Browse files
author
Mika Leppänen
committed
Added 4WH,GKH and EAP-TLS module and modified kmp service
1 parent 782f3fb commit dfe52d9

26 files changed

+1477
-273
lines changed

source/6LoWPAN/ws/ws_bootstrap.c

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1566,6 +1566,10 @@ static void ws_bootstrap_rpl_callback(rpl_event_t event, void *handle)
15661566
if (instance && rpl_control_read_dodag_info(instance, &dodag_info)) {
15671567
tr_debug("Enable DHCPv6 relay");
15681568
dhcp_relay_agent_enable(cur->id, dodag_info.dodag_id);
1569+
1570+
tr_debug("Enable EAPOL relay");
1571+
ws_eapol_supp_relay_init(cur);
1572+
ws_eapol_supp_relay_start(dodag_info.dodag_id);
15691573
}
15701574

15711575
ws_set_fhss_hop(cur);
@@ -2087,12 +2091,6 @@ static void ws_bootstrap_event_handler(arm_event_s *event)
20872091
cur->ws_info->trickle_pcs_running = false;
20882092

20892093
ws_bootstrap_advertise_start(cur);
2090-
2091-
if (cur->bootsrap_mode != ARM_NWK_BOOTSRAP_MODE_6LoWPAN_BORDER_ROUTER) {
2092-
ws_eapol_supp_relay_init(cur);
2093-
ws_eapol_supp_relay_start();
2094-
}
2095-
20962094
ws_bootstrap_state_change(cur, ER_BOOTSRAP_DONE);
20972095
break;
20982096
case WS_ADDRESS_ADDED:

source/6LoWPAN/ws/ws_eapol_auth_relay.c

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,14 +121,12 @@ static int8_t ws_eapol_auth_relay_socket_pdu_receive(const ns_address_t *src_add
121121

122122
static int8_t ws_eapol_auth_relay_send_to_kmp(const uint8_t *eui_64, const uint8_t *ip_addr, uint16_t port, const void *data, uint16_t data_len)
123123
{
124-
125-
126124
ns_address_t dest_addr;
125+
127126
if (ws_eapol_relay_kmp_ll_address_get(&dest_addr) < 0) {
128127
return -1;
129128
}
130129

131-
132130
int8_t socket_id = ws_eapol_relay_socket_id_get();
133131
if (socket_id >= 0) {
134132
uint8_t temp_array[26];
@@ -159,4 +157,3 @@ static int8_t ws_eapol_auth_relay_send_to_kmp(const uint8_t *eui_64, const uint8
159157
}
160158

161159
#endif /* HAVE_WS */
162-

source/6LoWPAN/ws/ws_eapol_relay.c

Lines changed: 8 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
* limitations under the License.
1616
*/
1717

18-
1918
#include "nsconfig.h"
2019
#include <string.h>
2120
#include "ns_types.h"
@@ -58,11 +57,15 @@ int8_t ws_eapol_relay_init(protocol_interface_info_entry_t *interface_ptr)
5857
if (!eapol_relay_data) {
5958
return -1;
6059
}
60+
eapol_relay_data->relay_socket_id = -1;
6161
}
6262
eapol_relay_data->interface_ptr = interface_ptr;
63-
eapol_relay_data->relay_socket_id = socket_open(IPV6_NH_UDP, 10253, &ws_eapol_relay_socket_cb);
64-
if (eapol_relay_data->relay_socket_id < 0) {
65-
return -1;
63+
64+
if (eapol_relay_data->relay_socket_id < 0) {
65+
eapol_relay_data->relay_socket_id = socket_open(IPV6_NH_UDP, 10253, &ws_eapol_relay_socket_cb);
66+
if (eapol_relay_data->relay_socket_id < 0) {
67+
return -1;
68+
}
6669
}
6770

6871
return 0;
@@ -78,24 +81,6 @@ int8_t ws_eapol_relay_cb_register(ws_eapol_relay_socket_pdu_receive *sock_pdu_re
7881
return 0;
7982
}
8083

81-
int8_t ws_eapol_relay_border_router_addr_get(uint8_t *addr)
82-
{
83-
if (!eapol_relay_data) {
84-
return -1;
85-
}
86-
87-
rpl_dodag_info_t dodag_info;
88-
struct rpl_instance *instance = rpl_control_enumerate_instances(eapol_relay_data->interface_ptr->rpl_domain, NULL);
89-
90-
if (instance && rpl_control_read_dodag_info(instance, &dodag_info)) {
91-
// Route to border router
92-
memcpy(addr, dodag_info.dodag_id, 16);
93-
return 0;
94-
} else {
95-
return -1;
96-
}
97-
}
98-
9984
int8_t ws_eapol_relay_send_to_relay(const uint8_t *eui_64, const uint8_t *ip_addr, uint16_t port, const void *data, uint16_t data_len)
10085
{
10186

@@ -128,7 +113,6 @@ int8_t ws_eapol_relay_kmp_ll_address_get(ns_address_t *addr)
128113
}
129114
addr->type = ADDRESS_IPV6;
130115
addr->identifier = 10254;
131-
132116
return 0;
133117
}
134118

@@ -138,7 +122,7 @@ int8_t ws_eapol_relay_socket_pdu_send(const ns_address_t *addr, const void *data
138122
return -1;
139123
}
140124

141-
if (socket_sendto(eapol_relay_data->relay_socket_id , addr, data, len) != len) {
125+
if (socket_sendto(eapol_relay_data->relay_socket_id, addr, data, len) != len) {
142126
return -1;
143127
}
144128
return 0;

source/6LoWPAN/ws/ws_eapol_relay.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ int8_t ws_eapol_relay_init(protocol_interface_info_entry_t *interface_ptr);
2323
typedef int8_t ws_eapol_relay_socket_pdu_receive(const ns_address_t *src_addr, void *data, uint16_t len);
2424
int8_t ws_eapol_relay_cb_register(ws_eapol_relay_socket_pdu_receive *sock_pdu_recv);
2525

26-
int8_t ws_eapol_relay_border_router_addr_get(uint8_t *addr);
2726
int8_t ws_eapol_relay_kmp_ll_address_get(ns_address_t *addr);
2827
int8_t ws_eapol_relay_socket_pdu_send(const ns_address_t *addr, const void *data, uint16_t len);
2928
int8_t ws_eapol_relay_socket_id_get(void);

source/6LoWPAN/ws/ws_eapol_supp_relay.c

Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ static int8_t ws_eapol_supp_relay_eapol_pdu_address_check(const uint8_t *eui_64)
4343
static int8_t ws_eapol_supp_relay_eapol_pdu_receive(const uint8_t *eui_64, const void *pdu, uint16_t size);
4444
static int8_t ws_eapol_supp_relay_socket_pdu_receive(const ns_address_t *src_addr, void *data, uint16_t len);
4545

46-
static ws_eapol_supp_relay_address_get *br_relay_addr_get;
46+
static uint8_t supp_br_addr[16];
4747

4848
int8_t ws_eapol_supp_relay_init(protocol_interface_info_entry_t *interface_ptr)
4949
{
@@ -67,14 +67,9 @@ int8_t ws_eapol_supp_relay_init(protocol_interface_info_entry_t *interface_ptr)
6767
return 0;
6868
}
6969

70-
int8_t ws_eapol_supp_relay_start(void)
70+
int8_t ws_eapol_supp_relay_start(uint8_t *br_addr)
7171
{
72-
return 0;
73-
}
74-
75-
int8_t ws_eapol_supp_relay_cb_register(ws_eapol_supp_relay_address_get *addr_get)
76-
{
77-
br_relay_addr_get = addr_get;
72+
memcpy(supp_br_addr, br_addr, 16);
7873
return 0;
7974
}
8075

@@ -88,22 +83,7 @@ static int8_t ws_eapol_supp_relay_eapol_pdu_address_check(const uint8_t *eui_64)
8883

8984
static int8_t ws_eapol_supp_relay_eapol_pdu_receive(const uint8_t *eui_64, const void *pdu, uint16_t size)
9085
{
91-
#if 0
92-
const uint8_t *relay_addr = 0;
93-
if (br_relay_addr_get) {
94-
relay_addr = br_relay_addr_get();
95-
} else {
96-
return -1;
97-
}
98-
#endif
99-
100-
uint8_t br_addr[16];
101-
102-
if (ws_eapol_relay_border_router_addr_get(br_addr) < 0) {
103-
return -1;
104-
}
105-
106-
ws_eapol_relay_send_to_relay(eui_64, br_addr, 10253, pdu, size);
86+
ws_eapol_relay_send_to_relay(eui_64, supp_br_addr, 10253, pdu, size);
10787

10888
return 0;
10989
}

source/6LoWPAN/ws/ws_eapol_supp_relay.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,6 @@
1919
#define WS_EAPOL_SUPP_RELAY_H_
2020

2121
int8_t ws_eapol_supp_relay_init(protocol_interface_info_entry_t *interface_ptr);
22-
int8_t ws_eapol_supp_relay_start(void);
23-
24-
typedef const uint8_t *ws_eapol_supp_relay_address_get(void);
25-
int8_t ws_eapol_supp_relay_cb_register(ws_eapol_supp_relay_address_get *addr_get);
22+
int8_t ws_eapol_supp_relay_start(uint8_t *br_addr);
2623

2724
#endif /* WS_EAPOL_SUPP_RELAY_H_ */

source/6LoWPAN/ws/ws_pae_auth.c

Lines changed: 63 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@
2727
#include "Security/kmp/kmp_addr.h"
2828
#include "Security/kmp/kmp_api.h"
2929
#include "Security/kmp/kmp_socket_if.h"
30+
#include "Security/kmp/sec_prot.h"
31+
#include "Security/kmp/key_sec_prot.h"
32+
#include "Security/kmp/eap_tls_sec_prot.h"
33+
#include "Security/kmp/fwh_sec_prot.h"
34+
#include "Security/kmp/gkh_sec_prot.h"
3035
#include "6LoWPAN/ws/ws_pae_controller.h"
3136
#include "6LoWPAN/ws/ws_pae_auth.h"
3237
#include "6LoWPAN/ws/ws_pae_lib.h"
@@ -36,15 +41,16 @@
3641
#define TRACE_GROUP "wspsu"
3742

3843
typedef struct {
39-
kmp_addr_t *addr; /**< Supplicant EUI-64, Relay IP address, Relay port */
4044
kmp_list_t kmp_list; /**< Ongoing KMP negotations */
45+
kmp_addr_t *addr; /**< Supplicant EUI-64, Relay IP address, Relay port */
4146
kmp_sec_keys_t *sec_keys; /**< Supplicant security keys */
4247
ns_list_link_t link;
4348
} supp_entry_t;
4449

4550
typedef NS_LIST_HEAD(supp_entry_t, link) supp_list_t;
4651

4752
typedef struct {
53+
kmp_service_t *kmp_service; /**< KMP service */
4854
protocol_interface_info_entry_t *interface_ptr; /**< Interface pointer */
4955
supp_list_t supp_list; /**< List of supplicants */
5056
} pae_auth_data_t;
@@ -56,7 +62,7 @@ static supp_entry_t *ws_pae_auth_supp_list_add(supp_list_t *supp_list, const kmp
5662
//static int8_t ws_pae_auth_supp_list_remove(supp_list_t *supp_list, supp_entry_t *supp);
5763
static supp_entry_t *ws_pae_auth_supp_list_entry_eui_64_get(const supp_list_t *supp_list, const uint8_t *eui_64);
5864

59-
static kmp_api_t *ws_pae_auth_kmp_incoming_ind(kmp_type_e type, const kmp_addr_t *addr);
65+
static kmp_api_t *ws_pae_auth_kmp_incoming_ind(kmp_service_t *service, kmp_type_e type, const kmp_addr_t *addr);
6066

6167
static void ws_pae_auth_kmp_api_create_confirm(kmp_api_t *kmp, kmp_result_e result);
6268
static void ws_pae_auth_kmp_api_create_indication(kmp_api_t *kmp, kmp_type_e type, kmp_addr_t *addr);
@@ -115,21 +121,54 @@ static supp_entry_t *ws_pae_auth_supp_list_entry_eui_64_get(const supp_list_t *s
115121
return 0;
116122
}
117123

118-
void ws_pae_auth_init(protocol_interface_info_entry_t *interface_ptr)
124+
int8_t ws_pae_auth_init(protocol_interface_info_entry_t *interface_ptr)
119125
{
120126
if (!auth_data) {
121127
auth_data = ns_dyn_mem_alloc(sizeof(pae_auth_data_t));
128+
if (!auth_data) {
129+
return -1;
130+
}
122131
}
123132
auth_data->interface_ptr = interface_ptr;
124133
ws_pae_auth_supp_list_init(&auth_data->supp_list);
125134

126-
kmp_socket_if_init(interface_ptr);
135+
if (kmp_service_init() < 0) {
136+
return -1;
137+
}
138+
139+
auth_data->kmp_service = kmp_service_create(interface_ptr);
140+
if (!auth_data->kmp_service) {
141+
return -1;
142+
}
143+
144+
if (kmp_service_cb_register(auth_data->kmp_service, ws_pae_auth_kmp_incoming_ind)) {
145+
return -1;
146+
}
147+
148+
if (kmp_socket_if_register(auth_data->kmp_service, interface_ptr) < 0) {
149+
return -1;
150+
}
151+
152+
if (key_sec_prot_register(auth_data->kmp_service) < 0) {
153+
return -1;
154+
}
155+
156+
if (eap_tls_sec_prot_register(auth_data->kmp_service) < 0) {
157+
return -1;
158+
}
159+
160+
if (fwh_sec_prot_register(auth_data->kmp_service) < 0) {
161+
return -1;
162+
}
163+
164+
if (gkh_sec_prot_register(auth_data->kmp_service) < 0) {
165+
return -1;
166+
}
127167

128-
kmp_service_init(interface_ptr, 27);
129-
kmp_service_cb_register(ws_pae_auth_kmp_incoming_ind, kmp_socket_if_send);
168+
return 0;
130169
}
131170

132-
static kmp_api_t *ws_pae_auth_kmp_incoming_ind(kmp_type_e type, const kmp_addr_t *addr)
171+
static kmp_api_t *ws_pae_auth_kmp_incoming_ind(kmp_service_t *service, kmp_type_e type, const kmp_addr_t *addr)
133172
{
134173
// Find supplicant
135174
supp_entry_t *supp = ws_pae_auth_supp_list_entry_eui_64_get(&auth_data->supp_list, kmp_address_eui_64_get(addr));
@@ -142,16 +181,16 @@ static kmp_api_t *ws_pae_auth_kmp_incoming_ind(kmp_type_e type, const kmp_addr_t
142181
}
143182
}
144183

145-
// Get kmp for supplicant
184+
// Get KMP for supplicant
146185
kmp_api_t *kmp = ws_pae_lib_kmp_list_type_get(&supp->kmp_list, type);
147186
if (kmp) {
148187
return kmp;
149188
}
150189

151190
// For further study: make needed validations here
152191

153-
// Create a new kmp for initial eapol-key
154-
kmp = kmp_api_create(type + IEEE_802_1X_INITIAL_KEY);
192+
// Create a new KMP for initial eapol-key
193+
kmp = kmp_api_create(service, type + IEEE_802_1X_INITIAL_KEY);
155194
kmp_api_data_set(kmp, supp);
156195

157196
if (!kmp) {
@@ -199,22 +238,28 @@ static void ws_pae_auth_kmp_api_finished_indication(kmp_api_t *kmp, kmp_result_e
199238
// Gets type
200239
kmp_type_e type = kmp_api_type_get(kmp);
201240

202-
if (type < IEEE_802_1X_INITIAL_KEY) {
203-
// For now, just stop for MKA, 4WH and GTK
241+
if (type > IEEE_802_1X_INITIAL_KEY) {
242+
// For EAPOL-key, start EAP-TLS towards supplicant
243+
type = IEEE_802_1X_MKA;
244+
} else if (type == IEEE_802_1X_MKA) {
245+
// After EAP-TLS start 4WH towards supplicant
246+
type = IEEE_802_11_4WH;
247+
} else if (type == IEEE_802_11_4WH) {
248+
// After 4WH start GKH towards supplicant
249+
type = IEEE_802_11_GKH;
250+
} else if (type == IEEE_802_11_GKH) {
251+
// After GKH end
204252
return;
205253
}
206254

207-
// For eapol-key, start 4WH towards supplicant
208-
type = IEEE_802_11_4WH;
209-
210255
supp_entry_t *supp = kmp_api_data_get(kmp);
211256
if (!supp) {
212257
// Should not be possible
213258
return;
214259
}
215260

216-
// Create kmp instance for 4WH authentication
217-
kmp_api_t *new_kmp = kmp_api_create(type);
261+
// Create KMP instance for new authentication
262+
kmp_api_t *new_kmp = kmp_api_create(auth_data->kmp_service, type);
218263
kmp_api_data_set(new_kmp, supp);
219264

220265
if (!new_kmp) {
@@ -243,7 +288,7 @@ static void ws_pae_auth_kmp_api_finished(kmp_api_t *kmp)
243288
return;
244289
}
245290

246-
// Delete kmp
291+
// Delete KMP
247292
ws_pae_lib_kmp_list_delete(&supp->kmp_list, kmp);
248293
}
249294

source/6LoWPAN/ws/ws_pae_auth.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,6 @@
1818
#ifndef WS_PAE_AUTH_H_
1919
#define WS_PAE_AUTH_H_
2020

21-
void ws_pae_auth_init(protocol_interface_info_entry_t *interface_ptr);
21+
int8_t ws_pae_auth_init(protocol_interface_info_entry_t *interface_ptr);
2222

2323
#endif /* WS_PAE_AUTH_H_ */

0 commit comments

Comments
 (0)