@@ -24,7 +24,6 @@ SPDX-License-Identifier: BSD-3-Clause
24
24
#include < stdlib.h>
25
25
26
26
#include " LoRaMac.h"
27
- #include " LoRaMacCrypto.h"
28
27
29
28
#if defined(FEATURE_COMMON_PAL)
30
29
#include " mbed_trace.h"
@@ -37,6 +36,13 @@ SPDX-License-Identifier: BSD-3-Clause
37
36
38
37
using namespace events ;
39
38
39
+
40
+ /*
41
+ * LoRaWAN spec 6.2: AppKey is AES-128 key
42
+ */
43
+ #define APPKEY_KEY_LENGTH 128
44
+
45
+
40
46
/* !
41
47
* Maximum length of the fOpts field
42
48
*/
@@ -311,17 +317,22 @@ void LoRaMac::on_radio_rx_done(uint8_t *payload, uint16_t size, int16_t rssi,
311
317
return ;
312
318
}
313
319
314
- if (0 != decrypt_join_frame (payload + 1 , size - 1 ,
315
- _params.keys .app_key ,
316
- _params.payload + 1 )) {
320
+ if (0 != _lora_crypto.decrypt_join_frame (payload + 1 ,
321
+ size - 1 ,
322
+ _params.keys .app_key ,
323
+ APPKEY_KEY_LENGTH,
324
+ _params.payload + 1 )) {
317
325
_mcps_indication.status = LORAMAC_EVENT_INFO_STATUS_CRYPTO_FAIL;
318
326
return ;
319
327
}
320
328
321
329
_params.payload [0 ] = mac_hdr.value ;
322
330
323
- if (0 != compute_join_frame_mic (_params.payload , size - LORAMAC_MFR_LEN,
324
- _params.keys .app_key , &mic)) {
331
+ if (0 != _lora_crypto.compute_join_frame_mic (_params.payload ,
332
+ size - LORAMAC_MFR_LEN,
333
+ _params.keys .app_key ,
334
+ APPKEY_KEY_LENGTH,
335
+ &mic)) {
325
336
_mcps_indication.status = LORAMAC_EVENT_INFO_STATUS_CRYPTO_FAIL;
326
337
return ;
327
338
}
@@ -333,11 +344,12 @@ void LoRaMac::on_radio_rx_done(uint8_t *payload, uint16_t size, int16_t rssi,
333
344
334
345
if (mic_rx == mic) {
335
346
336
- if (0 != compute_skeys_for_join_frame (_params.keys .app_key ,
337
- _params.payload + 1 ,
338
- _params.dev_nonce ,
339
- _params.keys .nwk_skey ,
340
- _params.keys .app_skey )) {
347
+ if (0 != _lora_crypto.compute_skeys_for_join_frame (_params.keys .app_key ,
348
+ APPKEY_KEY_LENGTH,
349
+ _params.payload + 1 ,
350
+ _params.dev_nonce ,
351
+ _params.keys .nwk_skey ,
352
+ _params.keys .app_skey )) {
341
353
_mcps_indication.status = LORAMAC_EVENT_INFO_STATUS_CRYPTO_FAIL;
342
354
return ;
343
355
}
@@ -436,15 +448,17 @@ void LoRaMac::on_radio_rx_done(uint8_t *payload, uint16_t size, int16_t rssi,
436
448
437
449
if (sequence_counter_diff < (1 << 15 )) {
438
450
downlink_counter += sequence_counter_diff;
439
- compute_mic (payload, size - LORAMAC_MFR_LEN, nwk_skey,
440
- address, DOWN_LINK, downlink_counter, &mic);
451
+ _lora_crypto.compute_mic (payload, size - LORAMAC_MFR_LEN,
452
+ nwk_skey, sizeof (_params.keys .nwk_skey )*8 , // sizeof nws_skey must be the same as _params.keys.nwk_skey
453
+ address, DOWN_LINK, downlink_counter, &mic);
441
454
if (mic_rx == mic) {
442
455
is_mic_ok = true ;
443
456
}
444
457
} else {
445
458
uint32_t downlink_counter_tmp = downlink_counter + 0x10000 + (int16_t )sequence_counter_diff;
446
- compute_mic (payload, size - LORAMAC_MFR_LEN, nwk_skey,
447
- address, DOWN_LINK, downlink_counter_tmp, &mic);
459
+ _lora_crypto.compute_mic (payload, size - LORAMAC_MFR_LEN,
460
+ nwk_skey, sizeof (_params.keys .nwk_skey )*8 , // sizeof nws_skey must be the same as _params.keys.nwk_skey
461
+ address, DOWN_LINK, downlink_counter_tmp, &mic);
448
462
449
463
if (mic_rx == mic ) {
450
464
is_mic_ok = true ;
@@ -539,13 +553,14 @@ void LoRaMac::on_radio_rx_done(uint8_t *payload, uint16_t size, int16_t rssi,
539
553
540
554
if (port == 0 ) {
541
555
if (fctrl.bits .fopts_len == 0 ) {
542
- if (0 != decrypt_payload (payload + app_payload_start_index,
543
- frame_len,
544
- nwk_skey,
545
- address,
546
- DOWN_LINK,
547
- downlink_counter,
548
- _params.payload )) {
556
+ if (0 != _lora_crypto.decrypt_payload (payload + app_payload_start_index,
557
+ frame_len,
558
+ nwk_skey,
559
+ sizeof (_params.keys .nwk_skey )*8 , // sizeof nws_skey must be the same as _params.keys.nwk_skey
560
+ address,
561
+ DOWN_LINK,
562
+ downlink_counter,
563
+ _params.payload )) {
549
564
_mcps_indication.status = LORAMAC_EVENT_INFO_STATUS_CRYPTO_FAIL;
550
565
}
551
566
@@ -575,13 +590,14 @@ void LoRaMac::on_radio_rx_done(uint8_t *payload, uint16_t size, int16_t rssi,
575
590
}
576
591
}
577
592
578
- if (0 != decrypt_payload (payload + app_payload_start_index,
579
- frame_len,
580
- app_skey,
581
- address,
582
- DOWN_LINK,
583
- downlink_counter,
584
- _params.payload )) {
593
+ if (0 != _lora_crypto.decrypt_payload (payload + app_payload_start_index,
594
+ frame_len,
595
+ app_skey,
596
+ sizeof (_params.keys .app_skey )*8 , // sizeof app_skey must be the same as _params.keys.app_skey
597
+ address,
598
+ DOWN_LINK,
599
+ downlink_counter,
600
+ _params.payload )) {
585
601
_mcps_indication.status = LORAMAC_EVENT_INFO_STATUS_CRYPTO_FAIL;
586
602
}
587
603
@@ -1563,9 +1579,11 @@ lorawan_status_t LoRaMac::prepare_frame(loramac_mhdr_t *machdr,
1563
1579
_params.buffer [_params.buffer_pkt_len ++] = _params.dev_nonce & 0xFF ;
1564
1580
_params.buffer [_params.buffer_pkt_len ++] = (_params.dev_nonce >> 8 ) & 0xFF ;
1565
1581
1566
- if (0 != compute_join_frame_mic (_params.buffer ,
1567
- _params.buffer_pkt_len & 0xFF ,
1568
- _params.keys .app_key , &mic)) {
1582
+ if (0 != _lora_crypto.compute_join_frame_mic (_params.buffer ,
1583
+ _params.buffer_pkt_len & 0xFF ,
1584
+ _params.keys .app_key ,
1585
+ APPKEY_KEY_LENGTH,
1586
+ &mic)) {
1569
1587
return LORAWAN_STATUS_CRYPTO_FAIL;
1570
1588
}
1571
1589
@@ -1646,23 +1664,27 @@ lorawan_status_t LoRaMac::prepare_frame(loramac_mhdr_t *machdr,
1646
1664
_params.buffer [pkt_header_len++] = frame_port;
1647
1665
1648
1666
uint8_t *key = _params.keys .app_skey ;
1667
+ uint32_t key_length = sizeof (_params.keys .app_skey )*8 ;
1649
1668
if (frame_port == 0 ) {
1650
1669
mac_commands.clear_command_buffer ();
1651
1670
key = _params.keys .nwk_skey ;
1671
+ key_length = sizeof (_params.keys .nwk_skey )*8 ;
1652
1672
}
1653
- if (0 != encrypt_payload ((uint8_t *) payload, _params.payload_length ,
1654
- key, _params.dev_addr , UP_LINK,
1655
- _params.ul_frame_counter ,
1656
- &_params.buffer [pkt_header_len])) {
1673
+ if (0 != _lora_crypto.encrypt_payload ((uint8_t *) payload, _params.payload_length ,
1674
+ key, key_length,
1675
+ _params.dev_addr , UP_LINK,
1676
+ _params.ul_frame_counter ,
1677
+ &_params.buffer [pkt_header_len])) {
1657
1678
status = LORAWAN_STATUS_CRYPTO_FAIL;
1658
1679
}
1659
1680
}
1660
1681
1661
1682
_params.buffer_pkt_len = pkt_header_len + _params.payload_length ;
1662
1683
1663
- if (0 != compute_mic (_params.buffer , _params.buffer_pkt_len ,
1664
- _params.keys .nwk_skey , _params.dev_addr ,
1665
- UP_LINK, _params.ul_frame_counter , &mic)) {
1684
+ if (0 != _lora_crypto.compute_mic (_params.buffer , _params.buffer_pkt_len ,
1685
+ _params.keys .nwk_skey , sizeof (_params.keys .nwk_skey )*8 ,
1686
+ _params.dev_addr ,
1687
+ UP_LINK, _params.ul_frame_counter , &mic)) {
1666
1688
status = LORAWAN_STATUS_CRYPTO_FAIL;
1667
1689
}
1668
1690
0 commit comments