Skip to content

Commit 369c8a0

Browse files
author
Mika Leppänen
committed
Added 4WH integrity protection and encryption
Added 4WH MIC validation and KDE encryption Splitted 4WH handshake to supplicant and authenticator protocols Re-organised modules: KMP and security protocols to own directories Added KDE parser Added draft security protocol key module
1 parent ebae1d5 commit 369c8a0

37 files changed

+2477
-813
lines changed

source/6LoWPAN/ws/ws_bootstrap.c

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,12 @@ static uint16_t ws_bootstrap_routing_cost_calculate(protocol_interface_info_entr
9292
static uint16_t ws_bootstrap_rank_get(protocol_interface_info_entry_t *cur);
9393
static uint16_t ws_bootstrap_min_rank_inc_get(protocol_interface_info_entry_t *cur);
9494

95+
#if !defined(HAVE_PAE_SUPP) && !defined(HAVE_PAE_AUTH)
9596
static void ws_bootstrap_set_test_key(protocol_interface_info_entry_t *cur);
97+
#else
98+
#define ws_bootstrap_set_test_key(cur)
99+
#endif
100+
static void ws_bootstrap_key_insert(uint8_t gtk_index, uint8_t *gtk, protocol_interface_info_entry_t *cur);
96101
static void ws_bootstrap_authentication_completed(bool success, protocol_interface_info_entry_t *cur);
97102

98103
mac_neighbor_table_entry_t *ws_bootstrap_mac_neighbor_add(struct protocol_interface_info_entry *interface, const uint8_t *src64)
@@ -1370,7 +1375,7 @@ int ws_bootstrap_init(int8_t interface_id, net_6lowpan_mode_e bootstrap_mode)
13701375

13711376
//Init PAE controller and set callback
13721377
ws_pae_controller_init(cur);
1373-
ws_pae_controller_cb_register(&ws_bootstrap_authentication_completed);
1378+
ws_pae_controller_cb_register(&ws_bootstrap_authentication_completed, &ws_bootstrap_key_insert);
13741379

13751380
//Init EAPOL PDU handler and register it to MPX
13761381
ws_eapol_pdu_init(cur);
@@ -1733,7 +1738,21 @@ static void ws_bootstrap_start_discovery(protocol_interface_info_entry_t *cur)
17331738
// Start authentication
17341739
static void ws_bootstrap_start_authentication(void)
17351740
{
1736-
ws_pae_controller_supplicant_authenticate();
1741+
ws_pae_controller_authenticate();
1742+
}
1743+
1744+
1745+
static void ws_bootstrap_key_insert(uint8_t gtk_index, uint8_t *gtk, protocol_interface_info_entry_t *cur)
1746+
{
1747+
// Convert GTK to Group AES Key (GAK)
1748+
1749+
// Verify HASH etc.
1750+
1751+
mac_helper_security_key_clean(cur);
1752+
mac_helper_default_security_level_set(cur, AES_SECURITY_LEVEL_ENC_MIC64);
1753+
mac_helper_default_security_key_id_mode_set(cur, MAC_KEY_ID_MODE_IDX);
1754+
//Set Keys
1755+
mac_helper_security_default_key_set(cur, gtk, gtk_index + 1, MAC_KEY_ID_MODE_IDX);
17371756
}
17381757

17391758
static void ws_bootstrap_authentication_completed(bool success, protocol_interface_info_entry_t *cur)
@@ -1742,7 +1761,6 @@ static void ws_bootstrap_authentication_completed(bool success, protocol_interfa
17421761
tr_debug("authentication success");
17431762
ws_bootstrap_set_test_key(cur);
17441763

1745-
17461764
ws_bootstrap_event_configuration_start(cur);
17471765
} else {
17481766
tr_debug("authentication failed");
@@ -1970,6 +1988,7 @@ static bool ws_bootstrap_address_registration_ongoing(protocol_interface_info_en
19701988
return false;
19711989
}
19721990

1991+
#if !defined(HAVE_PAE_SUPP) && !defined(HAVE_PAE_AUTH)
19731992
static void ws_bootstrap_set_test_key(protocol_interface_info_entry_t *cur)
19741993
{
19751994
uint8_t key_material[16];
@@ -1982,6 +2001,7 @@ static void ws_bootstrap_set_test_key(protocol_interface_info_entry_t *cur)
19822001
//Set Keys
19832002
mac_helper_security_default_key_set(cur, key_material, 1, MAC_KEY_ID_MODE_IDX);
19842003
}
2004+
#endif
19852005

19862006
static void ws_bootstrap_event_handler(arm_event_s *event)
19872007
{

source/6LoWPAN/ws/ws_pae_auth.c

Lines changed: 59 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@
3030
#include "Security/kmp/kmp_addr.h"
3131
#include "Security/kmp/kmp_api.h"
3232
#include "Security/kmp/kmp_socket_if.h"
33-
#include "Security/kmp/sec_prot.h"
34-
#include "Security/kmp/key_sec_prot.h"
35-
#include "Security/kmp/eap_tls_sec_prot.h"
36-
#include "Security/kmp/fwh_sec_prot.h"
37-
#include "Security/kmp/gkh_sec_prot.h"
33+
#include "Security/protocols/sec_prot_keys.h"
34+
#include "Security/protocols/key_sec_prot/key_sec_prot.h"
35+
#include "Security/protocols/eap_tls_sec_prot/eap_tls_sec_prot.h"
36+
#include "Security/protocols/fwh_sec_prot/auth_fwh_sec_prot.h"
37+
#include "Security/protocols/gkh_sec_prot/gkh_sec_prot.h"
3838
#include "6LoWPAN/ws/ws_pae_controller.h"
3939
#include "6LoWPAN/ws/ws_pae_auth.h"
4040
#include "6LoWPAN/ws/ws_pae_lib.h"
@@ -58,6 +58,7 @@ typedef struct {
5858
supp_list_t inactive_supp_list; /**< List of inactive supplicants */
5959
int8_t tasklet_id; /**< Tasklet identifier */
6060
arm_event_storage_t *timer; /**< Timer */
61+
sec_prot_gtk_keys_t *gtks; /**< GTKs */
6162
} pae_auth_data_t;
6263

6364
static pae_auth_data_t *auth_data;
@@ -68,13 +69,14 @@ static int8_t ws_pae_auth_timer_if_start(kmp_api_t *kmp);
6869
static int8_t ws_pae_auth_timer_if_stop(kmp_api_t *kmp);
6970
static int8_t ws_pae_auth_timer_start(void);
7071
static int8_t ws_pae_auth_timer_stop(void);
72+
static void ws_pae_auth_kmp_service_addr_get(kmp_api_t *kmp, kmp_addr_t *local_addr, kmp_addr_t *remote_addr);
7173
static kmp_api_t *ws_pae_auth_kmp_incoming_ind(kmp_service_t *service, kmp_type_e type, const kmp_addr_t *addr);
7274
static void ws_pae_auth_kmp_api_create_confirm(kmp_api_t *kmp, kmp_result_e result);
7375
static void ws_pae_auth_kmp_api_create_indication(kmp_api_t *kmp, kmp_type_e type, kmp_addr_t *addr);
7476
static void ws_pae_auth_kmp_api_finished_indication(kmp_api_t *kmp, kmp_result_e result, kmp_sec_keys_t *sec_keys);
7577
static void ws_pae_auth_kmp_api_finished(kmp_api_t *kmp);
7678

77-
int8_t ws_pae_auth_init(protocol_interface_info_entry_t *interface_ptr)
79+
int8_t ws_pae_auth_init(protocol_interface_info_entry_t *interface_ptr, sec_prot_gtk_keys_t *gtks)
7880
{
7981
if (auth_data) {
8082
return 0;
@@ -95,6 +97,8 @@ int8_t ws_pae_auth_init(protocol_interface_info_entry_t *interface_ptr)
9597
return -1;
9698
}
9799

100+
auth_data->gtks = gtks;
101+
98102
if (kmp_service_init() < 0) {
99103
return -1;
100104
}
@@ -104,7 +108,7 @@ int8_t ws_pae_auth_init(protocol_interface_info_entry_t *interface_ptr)
104108
return -1;
105109
}
106110

107-
if (kmp_service_cb_register(auth_data->kmp_service, ws_pae_auth_kmp_incoming_ind)) {
111+
if (kmp_service_cb_register(auth_data->kmp_service, ws_pae_auth_kmp_incoming_ind, ws_pae_auth_kmp_service_addr_get)) {
108112
return -1;
109113
}
110114

@@ -128,7 +132,7 @@ int8_t ws_pae_auth_init(protocol_interface_info_entry_t *interface_ptr)
128132
return -1;
129133
}
130134

131-
if (fwh_auth_sec_prot_register(auth_data->kmp_service) < 0) {
135+
if (auth_fwh_sec_prot_register(auth_data->kmp_service) < 0) {
132136
return -1;
133137
}
134138

@@ -241,6 +245,27 @@ static int8_t ws_pae_auth_timer_stop(void)
241245
return 0;
242246
}
243247

248+
static void ws_pae_auth_kmp_service_addr_get(kmp_api_t *kmp, kmp_addr_t *local_addr, kmp_addr_t *remote_addr)
249+
{
250+
#if 0
251+
// Get own EUI-64
252+
link_layer_address_s mac_params;
253+
if (arm_nwk_mac_address_read(auth_data->interface_ptr->id, &mac_params) >= 0) {
254+
kmp_address_eui_64_set(local_addr, mac_params.mac_long);
255+
}
256+
#endif
257+
258+
// For now fixed since not yet support for EA-IE in supplicants
259+
uint8_t addr[8] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
260+
kmp_address_eui_64_set(local_addr, addr);
261+
262+
// Get supplicant address
263+
supp_entry_t *entry = kmp_api_data_get(kmp);
264+
if (entry && entry->addr) {
265+
kmp_address_copy(remote_addr, entry->addr);
266+
}
267+
}
268+
244269
static kmp_api_t *ws_pae_auth_kmp_incoming_ind(kmp_service_t *service, kmp_type_e type, const kmp_addr_t *addr)
245270
{
246271
// Find supplicant from list of active supplicants
@@ -261,6 +286,10 @@ static kmp_api_t *ws_pae_auth_kmp_incoming_ind(kmp_service_t *service, kmp_type_
261286
if (!supp_entry) {
262287
return 0;
263288
}
289+
sec_prot_keys_init(&supp_entry->sec_keys, auth_data->gtks);
290+
} else {
291+
// Updates relay address
292+
kmp_address_copy(supp_entry->addr, addr);
264293
}
265294

266295
// Increases waiting time for supplicant authentication
@@ -272,16 +301,20 @@ static kmp_api_t *ws_pae_auth_kmp_incoming_ind(kmp_service_t *service, kmp_type_
272301
return kmp;
273302
}
274303

275-
// For further study: make needed validations here
276-
277304
// Create a new KMP for initial eapol-key
278305
kmp = kmp_api_create(service, type + IEEE_802_1X_INITIAL_KEY);
279-
kmp_api_data_set(kmp, supp_entry);
280306

281307
if (!kmp) {
282308
return 0;
283309
}
284310

311+
kmp_api_data_set(kmp, supp_entry);
312+
// Sets address to KMP
313+
kmp_api_addr_set(kmp, supp_entry->addr);
314+
315+
// Sets security keys to KMP
316+
kmp_api_sec_keys_set(kmp, &supp_entry->sec_keys);
317+
285318
if (ws_pae_lib_kmp_list_add(&supp_entry->kmp_list, kmp) == NULL) {
286319
kmp_api_delete(kmp);
287320
return 0;
@@ -293,6 +326,11 @@ static kmp_api_t *ws_pae_auth_kmp_incoming_ind(kmp_service_t *service, kmp_type_
293326
ws_pae_auth_kmp_api_finished_indication,
294327
ws_pae_auth_kmp_api_finished);
295328

329+
if (kmp_api_start(kmp) < 0) {
330+
ws_pae_lib_kmp_list_delete(&supp_entry->kmp_list, kmp);
331+
return 0;
332+
}
333+
296334
return kmp;
297335
}
298336

@@ -336,10 +374,14 @@ static void ws_pae_auth_kmp_api_finished_indication(kmp_api_t *kmp, kmp_result_e
336374
} else if (type == IEEE_802_1X_MKA) {
337375
// After EAP-TLS start 4WH towards supplicant
338376
type = IEEE_802_11_4WH;
377+
// Insert GTK0
378+
supp_entry->sec_keys.gtk_set_index = 0;
339379
tr_debug("PAE start 4WH, eui-64: %s", trace_array(kmp_address_eui_64_get(supp_entry->addr), 8));
340380
} else if (type == IEEE_802_11_4WH) {
341381
// After 4WH start GKH towards supplicant
342382
type = IEEE_802_11_GKH;
383+
// Insert GTK1
384+
supp_entry->sec_keys.gtk_set_index = 1;
343385
tr_debug("PAE start GKH, eui-64: %s", trace_array(kmp_address_eui_64_get(supp_entry->addr), 8));
344386
} else if (type == IEEE_802_11_GKH) {
345387
tr_debug("PAE authenticated, eui-64: %s", trace_array(kmp_address_eui_64_get(supp_entry->addr), 8));
@@ -369,7 +411,12 @@ static void ws_pae_auth_kmp_api_finished_indication(kmp_api_t *kmp, kmp_result_e
369411
ws_pae_auth_kmp_api_finished_indication,
370412
ws_pae_auth_kmp_api_finished);
371413

372-
kmp_api_create_request(new_kmp, type, supp_entry->addr, NULL);
414+
if (kmp_api_start(kmp) < 0) {
415+
ws_pae_lib_kmp_list_delete(&supp_entry->kmp_list, kmp);
416+
return;
417+
}
418+
419+
kmp_api_create_request(new_kmp, type, supp_entry->addr, &supp_entry->sec_keys);
373420
}
374421

375422
static void ws_pae_auth_kmp_api_finished(kmp_api_t *kmp)

source/6LoWPAN/ws/ws_pae_auth.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
#ifdef HAVE_PAE_AUTH
2222

23-
int8_t ws_pae_auth_init(protocol_interface_info_entry_t *interface_ptr);
23+
int8_t ws_pae_auth_init(protocol_interface_info_entry_t *interface_ptr, sec_prot_gtk_keys_t *gtks);
2424

2525
#else
2626

source/6LoWPAN/ws/ws_pae_controller.c

Lines changed: 42 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,31 +25,35 @@
2525
#include "NWK_INTERFACE/Include/protocol.h"
2626
#include "6LoWPAN/ws/ws_config.h"
2727
#include "6LoWPAN/ws/ws_pae_controller.h"
28+
#include "Security/protocols/sec_prot_keys.h"
2829
#include "6LoWPAN/ws/ws_pae_supp.h"
2930
#include "6LoWPAN/ws/ws_pae_auth.h"
3031

3132
#ifdef HAVE_WS
3233

3334
#define TRACE_GROUP "wspsc"
3435

36+
static void ws_pae_controller_supp_key_insert(uint8_t gtk_index, uint8_t *gtk);
3537
static void ws_pae_controller_supp_auth_completed(bool success);
3638

3739
typedef struct {
38-
uint8_t target_eui_64[8];
39-
protocol_interface_info_entry_t *interface_ptr; /**< List link entry */
40-
ws_pae_controller_supplicant_auth_completed *auth_completed_cb; /**< Called on boostrap */ /**< List of KMP instances */
40+
uint8_t target_eui_64[8]; /**< EAPOL target */
41+
sec_prot_gtk_keys_t gtks; /**< GTKs */
42+
protocol_interface_info_entry_t *interface_ptr; /**< List link entry */
43+
ws_pae_controller_auth_completed *auth_completed; /**< Authentication completed callback, continue bootstrap */
44+
ws_pae_controller_key_insert *key_insert; /**< Key insert callback */
4145
} pae_controller_data_t;
4246

4347
static pae_controller_data_t *controller_data;
4448

45-
void ws_pae_controller_supplicant_authenticate(void)
49+
void ws_pae_controller_authenticate(void)
4650
{
4751
if (!controller_data) {
4852
return;
4953
}
5054

5155
ws_pae_supp_init(controller_data->interface_ptr);
52-
ws_pae_supp_cb_register(ws_pae_controller_supp_auth_completed);
56+
ws_pae_supp_cb_register(ws_pae_controller_supp_auth_completed, ws_pae_controller_supp_key_insert);
5357
if (ws_pae_supp_authenticate(controller_data->target_eui_64) > 0) {
5458
// Already authenticated
5559
ws_pae_controller_supp_auth_completed(true);
@@ -62,7 +66,31 @@ void ws_pae_controller_authenticator_start(void)
6266
return;
6367
}
6468

65-
ws_pae_auth_init(controller_data->interface_ptr);
69+
// Test data
70+
for (int i = 0; i < 16; i++) {
71+
controller_data->gtks.gtk[0].key[i] = 0xcf - i;
72+
controller_data->gtks.gtk[1].key[i] = 0xef - i;
73+
}
74+
controller_data->gtks.gtk[0].set = 1;
75+
controller_data->gtks.gtk[0].live = 1;
76+
77+
controller_data->gtks.gtk[1].set = 1;
78+
controller_data->gtks.gtk[1].live = 1;
79+
80+
ws_pae_auth_init(controller_data->interface_ptr, &controller_data->gtks);
81+
82+
controller_data->key_insert(0, controller_data->gtks.gtk[0].key, controller_data->interface_ptr);
83+
}
84+
85+
static void ws_pae_controller_supp_key_insert(uint8_t gtk_index, uint8_t *gtk)
86+
{
87+
if (!controller_data) {
88+
return;
89+
}
90+
91+
if (controller_data->key_insert) {
92+
controller_data->key_insert(gtk_index, gtk, controller_data->interface_ptr);
93+
}
6694
}
6795

6896
static void ws_pae_controller_supp_auth_completed(bool success)
@@ -71,18 +99,19 @@ static void ws_pae_controller_supp_auth_completed(bool success)
7199
return;
72100
}
73101

74-
if (controller_data->auth_completed_cb) {
75-
controller_data->auth_completed_cb(success, controller_data->interface_ptr);
102+
if (controller_data->auth_completed) {
103+
controller_data->auth_completed(success, controller_data->interface_ptr);
76104
}
77105
}
78106

79-
void ws_pae_controller_cb_register(ws_pae_controller_supplicant_auth_completed *completed_cb)
107+
void ws_pae_controller_cb_register(ws_pae_controller_auth_completed *completed, ws_pae_controller_key_insert *key_insert)
80108
{
81109
if (!controller_data) {
82110
return;
83111
}
84112

85-
controller_data->auth_completed_cb = completed_cb;
113+
controller_data->auth_completed = completed;
114+
controller_data->key_insert = key_insert;
86115
}
87116

88117
void ws_pae_controller_set_target(uint8_t *dest_eui_64)
@@ -97,8 +126,10 @@ void ws_pae_controller_init(protocol_interface_info_entry_t *interface_ptr)
97126
}
98127

99128
controller_data = ns_dyn_mem_alloc(sizeof(pae_controller_data_t));
100-
controller_data->auth_completed_cb = 0;
129+
controller_data->auth_completed = 0;
130+
controller_data->key_insert = 0;
101131
controller_data->interface_ptr = interface_ptr;
132+
sec_prot_keys_gtks_init(&controller_data->gtks);
102133
}
103134

104135
#endif /* HAVE_WS */

source/6LoWPAN/ws/ws_pae_controller.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,18 @@
1818
#ifndef WS_PAE_CONTROLLER_H_
1919
#define WS_PAE_CONTROLLER_H_
2020

21-
typedef void ws_pae_controller_supplicant_auth_completed(bool success, protocol_interface_info_entry_t *interface_ptr);
21+
typedef void ws_pae_controller_key_insert(uint8_t gtk_index, uint8_t *gtk, protocol_interface_info_entry_t *interface_ptr);
2222

23-
void ws_pae_controller_supplicant_authenticate(void);
23+
typedef void ws_pae_controller_auth_completed(bool success, protocol_interface_info_entry_t *interface_ptr);
24+
25+
void ws_pae_controller_authenticate(void);
2426

2527
void ws_pae_controller_authenticator_start(void);
2628

2729
void ws_pae_controller_set_target(uint8_t *dest_eui_64);
2830

2931
void ws_pae_controller_init(protocol_interface_info_entry_t *interface_ptr);
3032

31-
void ws_pae_controller_cb_register(ws_pae_controller_supplicant_auth_completed *completed_cb);
33+
void ws_pae_controller_cb_register(ws_pae_controller_auth_completed *completed, ws_pae_controller_key_insert *key_insert);
3234

3335
#endif /* WS_PAE_CONTROLLER_H_ */

0 commit comments

Comments
 (0)