Skip to content

Commit b933cc6

Browse files
author
Kimmo Vaisanen
committed
Lora: Change LoRaCrypto to a C++ class
In order to get rid of static variables, LoRaCrypto functionality is now in a C++ class.
1 parent 42d77ec commit b933cc6

File tree

5 files changed

+265
-203
lines changed

5 files changed

+265
-203
lines changed

features/lorawan/lorastack/mac/LoRaMac.cpp

Lines changed: 61 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ SPDX-License-Identifier: BSD-3-Clause
2424
#include <stdlib.h>
2525

2626
#include "LoRaMac.h"
27-
#include "LoRaMacCrypto.h"
2827

2928
#if defined(FEATURE_COMMON_PAL)
3029
#include "mbed_trace.h"
@@ -37,6 +36,13 @@ SPDX-License-Identifier: BSD-3-Clause
3736

3837
using namespace events;
3938

39+
40+
/*
41+
* LoRaWAN spec 6.2: AppKey is AES-128 key
42+
*/
43+
#define APPKEY_KEY_LENGTH 128
44+
45+
4046
/*!
4147
* Maximum length of the fOpts field
4248
*/
@@ -311,17 +317,22 @@ void LoRaMac::on_radio_rx_done(uint8_t *payload, uint16_t size, int16_t rssi,
311317
return;
312318
}
313319

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)) {
317325
_mcps_indication.status = LORAMAC_EVENT_INFO_STATUS_CRYPTO_FAIL;
318326
return;
319327
}
320328

321329
_params.payload[0] = mac_hdr.value;
322330

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)) {
325336
_mcps_indication.status = LORAMAC_EVENT_INFO_STATUS_CRYPTO_FAIL;
326337
return;
327338
}
@@ -333,11 +344,12 @@ void LoRaMac::on_radio_rx_done(uint8_t *payload, uint16_t size, int16_t rssi,
333344

334345
if (mic_rx == mic) {
335346

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)) {
341353
_mcps_indication.status = LORAMAC_EVENT_INFO_STATUS_CRYPTO_FAIL;
342354
return;
343355
}
@@ -436,15 +448,17 @@ void LoRaMac::on_radio_rx_done(uint8_t *payload, uint16_t size, int16_t rssi,
436448

437449
if (sequence_counter_diff < (1 << 15)) {
438450
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);
441454
if (mic_rx == mic) {
442455
is_mic_ok = true;
443456
}
444457
} else {
445458
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);
448462

449463
if (mic_rx == mic ) {
450464
is_mic_ok = true;
@@ -539,13 +553,14 @@ void LoRaMac::on_radio_rx_done(uint8_t *payload, uint16_t size, int16_t rssi,
539553

540554
if (port == 0) {
541555
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)) {
549564
_mcps_indication.status = LORAMAC_EVENT_INFO_STATUS_CRYPTO_FAIL;
550565
}
551566

@@ -575,13 +590,14 @@ void LoRaMac::on_radio_rx_done(uint8_t *payload, uint16_t size, int16_t rssi,
575590
}
576591
}
577592

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)) {
585601
_mcps_indication.status = LORAMAC_EVENT_INFO_STATUS_CRYPTO_FAIL;
586602
}
587603

@@ -1563,9 +1579,11 @@ lorawan_status_t LoRaMac::prepare_frame(loramac_mhdr_t *machdr,
15631579
_params.buffer[_params.buffer_pkt_len++] = _params.dev_nonce & 0xFF;
15641580
_params.buffer[_params.buffer_pkt_len++] = (_params.dev_nonce >> 8) & 0xFF;
15651581

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)) {
15691587
return LORAWAN_STATUS_CRYPTO_FAIL;
15701588
}
15711589

@@ -1646,23 +1664,27 @@ lorawan_status_t LoRaMac::prepare_frame(loramac_mhdr_t *machdr,
16461664
_params.buffer[pkt_header_len++] = frame_port;
16471665

16481666
uint8_t *key = _params.keys.app_skey;
1667+
uint32_t key_length = sizeof(_params.keys.app_skey)*8;
16491668
if (frame_port == 0) {
16501669
mac_commands.clear_command_buffer();
16511670
key = _params.keys.nwk_skey;
1671+
key_length = sizeof(_params.keys.nwk_skey)*8;
16521672
}
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])) {
16571678
status = LORAWAN_STATUS_CRYPTO_FAIL;
16581679
}
16591680
}
16601681

16611682
_params.buffer_pkt_len = pkt_header_len + _params.payload_length;
16621683

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)) {
16661688
status = LORAWAN_STATUS_CRYPTO_FAIL;
16671689
}
16681690

features/lorawan/lorastack/mac/LoRaMac.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@
5050

5151
#include "LoRaMacChannelPlan.h"
5252
#include "LoRaMacCommand.h"
53+
#include "LoRaMacCrypto.h"
54+
5355

5456
class LoRaMac {
5557

@@ -542,6 +544,11 @@ class LoRaMac {
542544
*/
543545
LoRaMacChannelPlan channel_plan;
544546

547+
/**
548+
* Crypto handling subsystem
549+
*/
550+
LoRaMacCrypto _lora_crypto;
551+
545552
/**
546553
* Central MAC layer data storage
547554
*/

0 commit comments

Comments
 (0)