@@ -90,6 +90,14 @@ uint32_t mac_mcps_sap_get_phy_timestamp(protocol_interface_rf_mac_setup_s *rf_ma
90
90
return timestamp ;
91
91
}
92
92
93
+ static bool mac_data_counter_too_small (uint32_t current_counter , uint32_t packet_counter )
94
+ {
95
+ if ((current_counter - packet_counter ) >= 2 ) {
96
+ return true;
97
+ }
98
+ return false;
99
+ }
100
+
93
101
static bool mac_data_request_confirmation_finnish (protocol_interface_rf_mac_setup_s * rf_mac_setup , mac_pre_build_frame_t * buffer )
94
102
{
95
103
if (!buffer -> asynch_request ) {
@@ -583,10 +591,14 @@ static uint8_t mac_data_interface_decrypt_packet(mac_pre_parsed_frame_t *b, mlme
583
591
return MLME_UNAVAILABLE_KEY ;
584
592
}
585
593
586
- if (b -> neigh_info && neighbour_validation .frameCounter < b -> neigh_info -> FrameCounter ) {
587
- tr_debug ("MLME_COUNTER_ERROR" );
588
- return MLME_COUNTER_ERROR ;
594
+ if (b -> neigh_info ) {
595
+ uint32_t min_accepted_frame_counter = mac_mib_key_device_frame_counter_get (key_description , b -> neigh_info , device_descriptor_handle );
596
+ if (neighbour_validation .frameCounter < min_accepted_frame_counter ) {
597
+ tr_debug ("MLME_COUNTER_ERROR" );
598
+ return MLME_COUNTER_ERROR ;
599
+ }
589
600
}
601
+
590
602
}
591
603
592
604
key = key_description -> Key ;
@@ -620,10 +632,15 @@ static uint8_t mac_data_interface_decrypt_packet(mac_pre_parsed_frame_t *b, mlme
620
632
621
633
//Update key device and key description tables
622
634
if (!security_by_pass ) {
623
- b -> neigh_info -> FrameCounter = neighbour_validation .frameCounter + 1 ;
635
+
636
+ mac_sec_mib_key_device_frame_counter_set (key_description , b -> neigh_info , neighbour_validation .frameCounter + 1 , device_descriptor_handle );
637
+
624
638
if (!key_device_description ) {
625
- // Black list old used keys by this device
626
- mac_sec_mib_device_description_blacklist (rf_mac_setup , device_descriptor_handle );
639
+ if (!rf_mac_setup -> secFrameCounterPerKey ) {
640
+ // Black list old used keys by this device
641
+ mac_sec_mib_device_description_blacklist (rf_mac_setup , device_descriptor_handle );
642
+ }
643
+
627
644
key_device_description = mac_sec_mib_key_device_description_list_update (key_description );
628
645
if (key_device_description ) {
629
646
tr_debug ("Set new device user %u for key" , device_descriptor_handle );
@@ -1230,21 +1247,21 @@ void mcps_sap_prebuild_frame_buffer_free(mac_pre_build_frame_t *buffer)
1230
1247
1231
1248
}
1232
1249
1233
- static bool mac_frame_security_parameters_init ( ccm_globals_t * ccm_ptr , protocol_interface_rf_mac_setup_s * rf_ptr , mac_pre_build_frame_t * buffer )
1250
+ static mlme_key_descriptor_t * mac_frame_security_key_get ( protocol_interface_rf_mac_setup_s * rf_ptr , mac_pre_build_frame_t * buffer )
1234
1251
{
1235
1252
/* Encrypt the packet payload if AES encyption bit is set */
1236
1253
mlme_security_t key_source ;
1237
1254
key_source .KeyIdMode = buffer -> aux_header .KeyIdMode ;
1238
1255
key_source .KeyIndex = buffer -> aux_header .KeyIndex ;
1239
1256
key_source .SecurityLevel = buffer -> aux_header .securityLevel ;
1240
1257
memcpy (key_source .Keysource , buffer -> aux_header .Keysource , 8 );
1241
- mlme_key_descriptor_t * key_description = mac_sec_key_description_get (rf_ptr , & key_source , buffer -> fcf_dsn .DstAddrMode , buffer -> DstAddr , buffer -> DstPANId );
1258
+ return mac_sec_key_description_get (rf_ptr , & key_source , buffer -> fcf_dsn .DstAddrMode , buffer -> DstAddr , buffer -> DstPANId );
1259
+ }
1242
1260
1243
- if (!key_description ) {
1244
- buffer -> status = MLME_UNAVAILABLE_KEY ;
1245
- return false;
1246
1261
1247
- }
1262
+ static bool mac_frame_security_parameters_init (ccm_globals_t * ccm_ptr , protocol_interface_rf_mac_setup_s * rf_ptr , mac_pre_build_frame_t * buffer , mlme_key_descriptor_t * key_description )
1263
+ {
1264
+ /* Encrypt the packet payload if AES encyption bit is set */
1248
1265
mlme_device_descriptor_t * device_description ;
1249
1266
uint8_t * nonce_ext_64_ptr ;
1250
1267
@@ -1518,21 +1535,30 @@ static int8_t mcps_generic_packet_build(protocol_interface_rf_mac_setup_s *rf_pt
1518
1535
mac_header_information_elements_preparation (buffer );
1519
1536
1520
1537
mcps_generic_sequence_number_allocate (rf_ptr , buffer );
1521
-
1538
+ mlme_key_descriptor_t * key_desc ;
1522
1539
if (buffer -> fcf_dsn .securityEnabled ) {
1523
1540
bool increment_framecounter = false;
1524
1541
//Remember to update security counter here!
1525
- uint32_t new_frameCounter = mac_mlme_framecounter_get (rf_ptr );
1542
+ key_desc = mac_frame_security_key_get (rf_ptr , buffer );
1543
+ if (!key_desc ) {
1544
+ buffer -> status = MLME_UNAVAILABLE_KEY ;
1545
+ return -2 ;
1546
+ }
1547
+
1548
+ //GET Counter
1549
+ uint32_t new_frameCounter = mac_sec_mib_key_outgoing_frame_counter_get (rf_ptr , key_desc );
1526
1550
// If buffer frame counter is set, this is FHSS channel retry, update frame counter only if something was sent after failure
1527
- if ((buffer -> aux_header .frameCounter == 0xffffffff ) || buffer -> asynch_request || (( new_frameCounter - buffer -> aux_header .frameCounter ) > 1 )) {
1551
+ if ((buffer -> aux_header .frameCounter == 0xffffffff ) || buffer -> asynch_request || mac_data_counter_too_small ( new_frameCounter , buffer -> aux_header .frameCounter )) {
1528
1552
buffer -> aux_header .frameCounter = new_frameCounter ;
1529
1553
increment_framecounter = true;
1530
1554
}
1531
- if (!mac_frame_security_parameters_init (& ccm_ptr , rf_ptr , buffer )) {
1555
+
1556
+ if (!mac_frame_security_parameters_init (& ccm_ptr , rf_ptr , buffer , key_desc )) {
1532
1557
return -2 ;
1533
1558
}
1559
+ //Increment security counter
1534
1560
if (increment_framecounter ) {
1535
- mac_mlme_framecounter_increment (rf_ptr );
1561
+ mac_sec_mib_key_outgoing_frame_counter_increment (rf_ptr , key_desc );
1536
1562
}
1537
1563
}
1538
1564
@@ -1566,7 +1592,9 @@ static int8_t mcps_generic_packet_build(protocol_interface_rf_mac_setup_s *rf_pt
1566
1592
tr_debug ("Too Long %u, %u pa %u header %u mic %u" , frame_length , mac_payload_length , buffer -> mac_header_length_with_security , buffer -> security_mic_len , dev_driver -> phy_MTU );
1567
1593
buffer -> status = MLME_FRAME_TOO_LONG ;
1568
1594
//decrement security counter
1569
- mac_mlme_framecounter_decrement (rf_ptr );
1595
+ if (buffer -> fcf_dsn .securityEnabled ) {
1596
+ mac_sec_mib_key_outgoing_frame_counter_decrement (rf_ptr , key_desc );
1597
+ }
1570
1598
return -1 ;
1571
1599
}
1572
1600
@@ -1680,19 +1708,24 @@ int8_t mcps_generic_ack_build(protocol_interface_rf_mac_setup_s *rf_ptr, bool in
1680
1708
1681
1709
ccm_globals_t ccm_ptr ;
1682
1710
mac_pre_build_frame_t * buffer = & rf_ptr -> enhanced_ack_buffer ;
1683
-
1711
+ mlme_key_descriptor_t * key_desc ;
1684
1712
1685
1713
if (buffer -> fcf_dsn .securityEnabled ) {
1686
1714
//Remember to update security counter here!
1715
+ key_desc = mac_frame_security_key_get (rf_ptr , buffer );
1716
+ if (!key_desc ) {
1717
+ buffer -> status = MLME_UNAVAILABLE_KEY ;
1718
+ return -2 ;
1719
+ }
1687
1720
if (init_build ) {
1688
- buffer -> aux_header .frameCounter = mac_mlme_framecounter_get (rf_ptr );
1721
+ buffer -> aux_header .frameCounter = mac_sec_mib_key_outgoing_frame_counter_get (rf_ptr , key_desc );
1689
1722
}
1690
- if (!mac_frame_security_parameters_init (& ccm_ptr , rf_ptr , buffer )) {
1723
+ if (!mac_frame_security_parameters_init (& ccm_ptr , rf_ptr , buffer , key_desc )) {
1691
1724
return -2 ;
1692
1725
}
1693
1726
if (init_build ) {
1694
1727
//Increment security counter
1695
- mac_mlme_framecounter_increment (rf_ptr );
1728
+ mac_sec_mib_key_outgoing_frame_counter_increment (rf_ptr , key_desc );
1696
1729
}
1697
1730
}
1698
1731
@@ -1716,7 +1749,7 @@ int8_t mcps_generic_ack_build(protocol_interface_rf_mac_setup_s *rf_ptr, bool in
1716
1749
1717
1750
if (buffer -> fcf_dsn .securityEnabled ) {
1718
1751
//decrement security counter
1719
- mac_mlme_framecounter_decrement (rf_ptr );
1752
+ mac_sec_mib_key_outgoing_frame_counter_decrement (rf_ptr , key_desc );
1720
1753
ccm_free (& ccm_ptr );
1721
1754
}
1722
1755
return -1 ;
@@ -1777,7 +1810,14 @@ static int8_t mcps_generic_packet_rebuild(protocol_interface_rf_mac_setup_s *rf_
1777
1810
}
1778
1811
1779
1812
if (buffer -> fcf_dsn .securityEnabled ) {
1780
- if (!mac_frame_security_parameters_init (& ccm_ptr , rf_ptr , buffer )) {
1813
+
1814
+ mlme_key_descriptor_t * key_desc = mac_frame_security_key_get (rf_ptr , buffer );
1815
+ if (!key_desc ) {
1816
+ buffer -> status = MLME_UNAVAILABLE_KEY ;
1817
+ return -2 ;
1818
+ }
1819
+
1820
+ if (!mac_frame_security_parameters_init (& ccm_ptr , rf_ptr , buffer , key_desc )) {
1781
1821
return -2 ;
1782
1822
}
1783
1823
}
@@ -2325,3 +2365,17 @@ int mcps_packet_ingress_rate_limit_by_memory(uint8_t free_heap_percentage)
2325
2365
2326
2366
return -1 ;
2327
2367
}
2368
+
2369
+ void mcps_pending_packet_counter_update_check (protocol_interface_rf_mac_setup_s * rf_mac_setup , mac_pre_build_frame_t * buffer )
2370
+ {
2371
+ if (buffer -> fcf_dsn .securityEnabled ) {
2372
+ mlme_key_descriptor_t * key_desc = mac_frame_security_key_get (rf_mac_setup , buffer );
2373
+ if (key_desc ) {
2374
+ uint32_t current_counter = mac_sec_mib_key_outgoing_frame_counter_get (rf_mac_setup , key_desc );
2375
+ if (mac_data_counter_too_small (current_counter , buffer -> aux_header .frameCounter )) {
2376
+ buffer -> aux_header .frameCounter = current_counter ;
2377
+ mac_sec_mib_key_outgoing_frame_counter_increment (rf_mac_setup , key_desc );
2378
+ }
2379
+ }
2380
+ }
2381
+ }
0 commit comments