@@ -65,15 +65,15 @@ typedef enum {
65
65
#define KEY_INFO_SECURED_KEY_FRAME 0x08
66
66
67
67
typedef struct {
68
- sec_prot_common_t common ; /**< Common data */
69
- eapol_pdu_t recv_eapol_pdu ; /**< Received EAPOL PDU */
70
- fwh_sec_prot_msg_e recv_msg ; /**< Received message */
71
- uint8_t snonce [FWH_NONCE_LENGTH ]; /**< Supplicant nonce */
72
- uint8_t anonce [FWH_NONCE_LENGTH ]; /**< Authenticator nonce */
73
- uint8_t new_ptk [48 ]; /**< PTK (384 bits) */
74
- void * recv_pdu ;
75
- uint16_t recv_size ;
76
- uint64_t recv_replay_cnt ;
68
+ sec_prot_common_t common ; /**< Common data */
69
+ eapol_pdu_t recv_eapol_pdu ; /**< Received EAPOL PDU */
70
+ fwh_sec_prot_msg_e recv_msg ; /**< Received message */
71
+ uint8_t snonce [EAPOL_KEY_NONCE_LEN ]; /**< Supplicant nonce */
72
+ uint8_t anonce [EAPOL_KEY_NONCE_LEN ]; /**< Authenticator nonce */
73
+ uint8_t new_ptk [PTK_LEN ]; /**< PTK (384 bits) */
74
+ void * recv_pdu ; /**< received pdu */
75
+ uint16_t recv_size ; /**< received pdu size */
76
+ uint64_t recv_replay_cnt ; /**< received replay counter */
77
77
} fwh_sec_prot_int_t ;
78
78
79
79
static const trickle_params_t fwh_trickle_params = {
@@ -380,7 +380,8 @@ static void supp_fwh_sec_prot_state_machine(sec_prot_t *prot)
380
380
case FWH_STATE_FINISH :
381
381
tr_debug ("4WH finish" );
382
382
383
- // KMP-FINISHED.indication,
383
+ // KMP-FINISHED.indication
384
+ memcpy (prot -> sec_keys -> ptk , data -> new_ptk , PTK_LEN );
384
385
prot -> finished_ind (prot , sec_prot_result_get (& data -> common ), prot -> sec_keys );
385
386
sec_prot_state_set (prot , & data -> common , FWH_STATE_FINISHED );
386
387
break ;
@@ -469,18 +470,7 @@ static int8_t supp_fwh_sec_prot_ptk_generate(sec_prot_t *prot, sec_prot_keys_t *
469
470
static int8_t supp_fwh_sec_prot_mic_validate (sec_prot_t * prot )
470
471
{
471
472
fwh_sec_prot_int_t * data = fwh_sec_prot_get (prot );
472
-
473
- uint8_t recv_mic [16 ];
474
- memcpy (recv_mic , data -> recv_eapol_pdu .msg .key .key_mic , 16 );
475
-
476
- eapol_write_key_packet_mic (data -> recv_pdu , 0 );
477
- uint8_t mic [20 ];
478
- hmac_sha1_calc (data -> new_ptk , 16 , data -> recv_pdu , data -> recv_size , mic );
479
- if (memcmp (recv_mic , mic , 16 ) != 0 ) {
480
- return -1 ;
481
- }
482
-
483
- return 0 ;
473
+ return sec_prot_lib_mic_validate (data -> new_ptk , data -> recv_eapol_pdu .msg .key .key_mic , data -> recv_pdu , data -> recv_size );
484
474
}
485
475
486
476
static void supp_fwh_sec_prot_recv_replay_counter_store (sec_prot_t * prot )
@@ -492,13 +482,13 @@ static void supp_fwh_sec_prot_recv_replay_counter_store(sec_prot_t *prot)
492
482
static void supp_fwh_sec_prot_anonce_store (sec_prot_t * prot )
493
483
{
494
484
fwh_sec_prot_int_t * data = fwh_sec_prot_get (prot );
495
- memcpy (data -> anonce , data -> recv_eapol_pdu .msg .key .key_nonce , FWH_NONCE_LENGTH );
485
+ memcpy (data -> anonce , data -> recv_eapol_pdu .msg .key .key_nonce , EAPOL_KEY_NONCE_LEN );
496
486
}
497
487
498
488
static int8_t supp_fwh_sec_prot_anonce_validate (sec_prot_t * prot )
499
489
{
500
490
fwh_sec_prot_int_t * data = fwh_sec_prot_get (prot );
501
- if (memcmp (data -> anonce , data -> recv_eapol_pdu .msg .key .key_nonce , FWH_NONCE_LENGTH ) != 0 ) {
491
+ if (memcmp (data -> anonce , data -> recv_eapol_pdu .msg .key .key_nonce , EAPOL_KEY_NONCE_LEN ) != 0 ) {
502
492
return -1 ;
503
493
}
504
494
return 0 ;
@@ -514,30 +504,15 @@ static int8_t supp_fwh_kde_handle(sec_prot_t *prot)
514
504
{
515
505
fwh_sec_prot_int_t * data = fwh_sec_prot_get (prot );
516
506
517
- eapol_pdu_t * eapol_pdu = & data -> recv_eapol_pdu ;
518
-
519
- if (eapol_pdu -> msg . key . key_data_length == 0 || eapol_pdu -> msg . key . key_data == NULL ) {
507
+ uint16_t kde_len ;
508
+ uint8_t * kde = sec_prot_lib_message_handle ( data -> new_ptk , & kde_len , & data -> recv_eapol_pdu );
509
+ if (! kde ) {
520
510
return -1 ;
521
511
}
522
512
523
- uint8_t * ptk = data -> new_ptk ;
524
- uint16_t kde_len = eapol_pdu -> msg .key .key_data_length ;
525
- uint8_t * kde = ns_dyn_mem_temporary_alloc (kde_len );
526
-
527
- uint8_t * key_data = eapol_pdu -> msg .key .key_data ;
528
- uint16_t key_data_len = eapol_pdu -> msg .key .key_data_length ;
529
-
530
- if (eapol_pdu -> msg .key .key_information .encrypted_key_data ) {
531
- size_t output_len = kde_len ;
532
- if (nist_aes_key_wrap (0 , & ptk [16 ], 128 , key_data , key_data_len , kde , & output_len ) < 0 || output_len != (size_t ) key_data_len - 8 ) {
533
- goto error ;
534
- }
535
- } else {
536
- memcpy (kde , key_data , kde_len );
537
- }
538
-
539
513
switch (data -> recv_msg ) {
540
- case FWH_MESSAGE_1 : {
514
+ case FWH_MESSAGE_1 :
515
+ {
541
516
uint8_t recv_pmkid [PMKID_LEN ];
542
517
uint8_t calc_pmkid [PMKID_LEN ];
543
518
if (kde_pmkid_read (kde , kde_len , recv_pmkid ) < 0 ) {
@@ -549,55 +524,15 @@ static int8_t supp_fwh_kde_handle(sec_prot_t *prot)
549
524
if (memcmp (recv_pmkid , calc_pmkid , PMKID_LEN ) != 0 ) {
550
525
goto error ;
551
526
}
552
- }
553
- break ;
527
+ }
528
+ break ;
554
529
555
- case FWH_MESSAGE_3 : {
530
+ case FWH_MESSAGE_3 :
556
531
// If a valid new GTK value present, insert it
557
- prot -> sec_keys -> gtk_set_index = -1 ;
558
-
559
- uint8_t key_id ;
560
- uint8_t gtk [16 ];
561
- sec_prot_gtk_keys_t * gtks = prot -> sec_keys -> gtks ;
562
-
563
- if (kde_gtk_read (kde , kde_len , & key_id , gtk ) >= 0 ) {
564
- // A new GTK value
565
- if (!gtks -> gtk [key_id ].set || memcmp (gtks -> gtk [key_id ].key , gtk , 16 ) != 0 ) {
566
- gtks -> gtk [key_id ].set = true;
567
- gtks -> gtk [key_id ].live = false; // Set from GTKL, if not set on GTKL then what?
568
- gtks -> gtk [key_id ].hash = false; // Not verified yet
569
- gtks -> gtk [key_id ].lifetime = 0 ; // Should be provided by authenticator
570
- memcpy (gtks -> gtk [key_id ].key , gtk , 16 );
571
- prot -> sec_keys -> gtk_set_index = key_id ; // Insert
572
- }
573
- uint32_t lifetime ;
574
- if (kde_lifetime_read (kde , kde_len , & lifetime ) >= 0 ) {
575
- if (gtks -> gtk [key_id ].set ) {
576
- gtks -> gtk [key_id ].lifetime = lifetime ;
577
- }
578
- }
579
- }
580
- uint8_t gtkl [4 ];
581
- if (kde_gtkl_read (kde , kde_len , & gtkl [0 ], & gtkl [1 ], & gtkl [2 ], & gtkl [3 ]) >= 0 ) {
582
- for (uint8_t i = 0 ; i < 4 ; i ++ ) {
583
- if (gtkl [i ]) {
584
- gtks -> gtk [i ].live = true; // Live on authenticator
585
- } else {
586
- gtks -> gtk [i ].live = false;
587
- }
588
- }
589
- } else {
532
+ if (sec_prot_lib_gtk_read (kde , kde_len , prot -> sec_keys -> gtks , & prot -> sec_keys -> gtk_set_index ) < 0 ) {
590
533
goto error ;
591
534
}
592
-
593
- // Sanity checks
594
- if (prot -> sec_keys -> gtk_set_index >= 0 ) {
595
- if (!gtks -> gtk [prot -> sec_keys -> gtk_set_index ].live ) {
596
- prot -> sec_keys -> gtk_set_index = -1 ;
597
- }
598
- }
599
- }
600
- break ;
535
+ break ;
601
536
602
537
default :
603
538
break ;
0 commit comments