Skip to content

Commit

Permalink
improved naming
Browse files Browse the repository at this point in the history
- MAC now requests eirp instead of dbm
- MAC applies eirp limit instead of passing it to radio
- removed unused SM update begin/end functions
- hardened LDL_MAC_init against null eui fields
- hardened LDL_SM_init against null keys
  • Loading branch information
cjhdev committed Feb 19, 2021
1 parent 940e97c commit 450ae80
Show file tree
Hide file tree
Showing 14 changed files with 55 additions and 161 deletions.
3 changes: 1 addition & 2 deletions include/ldl_radio.h
Original file line number Diff line number Diff line change
Expand Up @@ -101,8 +101,7 @@ struct ldl_radio_tx_setting {
uint32_t freq;
enum ldl_signal_bandwidth bw;
enum ldl_spreading_factor sf;
int16_t dbm;
int16_t max_eirp;
int16_t eirp;
};

struct ldl_radio_rx_setting {
Expand Down
27 changes: 0 additions & 27 deletions include/ldl_sm_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,6 @@ enum ldl_sm_key {
struct ldl_sm_interface {

void (*update_session_key)(struct ldl_sm *self, enum ldl_sm_key key_desc, enum ldl_sm_key root_desc, const void *iv);
void (*begin_update_session_key)(struct ldl_sm *self);
void (*end_update_session_key)(struct ldl_sm *self);
uint32_t (*mic)(struct ldl_sm *self, enum ldl_sm_key desc, const void *hdr, uint8_t hdrLen, const void *data, uint8_t dataLen);
void (*ecb)(struct ldl_sm *self, enum ldl_sm_key desc, void *b);
void (*ctr)(struct ldl_sm *self, enum ldl_sm_key desc, const void *iv, void *data, uint8_t len);
Expand Down Expand Up @@ -100,31 +98,6 @@ const struct ldl_sm_interface *LDL_SM_getInterface(void);
* */
void LDL_SM_updateSessionKey(struct ldl_sm *self, enum ldl_sm_key keyDesc, enum ldl_sm_key rootDesc, const void *iv);

/** Signal the beginning of session key update transaction
*
* SM implementations that perform batch updates can use
* this signal to initialise a cache prior to receiving multiple
* LDL_SM_updateSessionKey() calls.
*
* @param[in] self
*
* */
void LDL_SM_beginUpdateSessionKey(struct ldl_sm *self);

/** Signal the end session key update transaction
*
* Always follows a previous call to LDL_SM_beginUpdateSessionKey().
*
* SM implementations that perform batch updates can use
* this signal to perform the actual update operation on the cached
* key material.
*
* @param[in] self
*
*
* */
void LDL_SM_endUpdateSessionKey(struct ldl_sm *self);

/** Lookup a key and use it to produce a MIC
*
* The MIC is the four least-significant bytes of an AES-128 CMAC digest of (hdr|data), intepreted
Expand Down
24 changes: 11 additions & 13 deletions src/ldl_mac.c
Original file line number Diff line number Diff line change
Expand Up @@ -151,9 +151,6 @@ void LDL_MAC_init(struct ldl_mac *self, enum ldl_region region, const struct ldl
LDL_PEDANTIC(self != NULL)
LDL_PEDANTIC(arg != NULL)

LDL_PEDANTIC(arg->joinEUI != NULL)
LDL_PEDANTIC(arg->devEUI != NULL)
LDL_PEDANTIC(arg->devEUI != NULL)
LDL_PEDANTIC(arg->ticks != NULL)

LDL_PEDANTIC(arg->radio_interface != NULL);
Expand Down Expand Up @@ -198,8 +195,8 @@ void LDL_MAC_init(struct ldl_mac *self, enum ldl_region region, const struct ldl
self->devNonce = arg->devNonce;
self->joinNonce = arg->joinNonce;

(void)memcpy(self->devEUI, arg->devEUI, sizeof(self->devEUI));
(void)memcpy(self->joinEUI, arg->joinEUI, sizeof(self->joinEUI));
(void)memcpy(self->devEUI, arg->devEUI, (arg->devEUI != NULL) ? sizeof(self->devEUI) : 0U);
(void)memcpy(self->joinEUI, arg->joinEUI, (arg->joinEUI != NULL) ? sizeof(self->joinEUI) : 0U);

if((arg->session != NULL) && (arg->session->magic == sessionMagicNumber) && (arg->session->region == region)){

Expand Down Expand Up @@ -1089,7 +1086,7 @@ static void processStartRadioForTX(struct ldl_mac *self, enum ldl_mac_sme event)

LDL_Region_convertRate(self->ctx.region, self->tx.rate, &tx_setting.sf, &tx_setting.bw, &mtu);

tx_setting.dbm = LDL_Region_getTXPower(self->ctx.region, self->tx.power);
tx_setting.eirp = LDL_Region_getTXPower(self->ctx.region, self->tx.power);

#ifndef LDL_DISABLE_TX_PARAM_SETUP
if(LDL_Region_txParamSetupImplemented(self->ctx.region)){
Expand All @@ -1113,15 +1110,16 @@ static void processStartRadioForTX(struct ldl_mac *self, enum ldl_mac_sme event)
36
};

tx_setting.max_eirp = (int16_t)maxEIRP[self->ctx.tx_param_setup & 0xfU];
tx_setting.max_eirp *= 100;
int16_t max_eirp = (int16_t)maxEIRP[self->ctx.tx_param_setup & 0xfU];

max_eirp *= 100;

if(tx_setting.eirp > max_eirp){

tx_setting.eirp = max_eirp;
}
}
else
#endif
{
tx_setting.max_eirp = INT16_MAX;
}

tx_setting.freq = self->tx.freq;

ms = LDL_Radio_getAirTime(tx_setting.bw, tx_setting.sf, self->bufferLen, true);
Expand Down
80 changes: 36 additions & 44 deletions src/ldl_ops.c
Original file line number Diff line number Diff line change
Expand Up @@ -78,46 +78,42 @@ void LDL_OPS_deriveKeys(struct ldl_mac *self)

(void)memset(&iv, 0, sizeof(iv));

self->sm_interface->begin_update_session_key(self->sm);
{
if(SESS_VERSION(self->ctx) == 0U){

/* ptr[0] below */
pos = 1;
pos += putU24(&ptr[pos], self->ctx.joinNonce);
pos += putU24(&ptr[pos], self->ctx.netID);
(void)putU16(&ptr[pos], self->ctx.devNonce);

ptr[0] = 2;
self->sm_interface->update_session_key(self->sm, LDL_SM_KEY_APPS, LDL_SM_KEY_NWK, &iv);

ptr[0] = 1;
self->sm_interface->update_session_key(self->sm, LDL_SM_KEY_FNWKSINT, LDL_SM_KEY_NWK, &iv);
self->sm_interface->update_session_key(self->sm, LDL_SM_KEY_SNWKSINT, LDL_SM_KEY_NWK, &iv);
self->sm_interface->update_session_key(self->sm, LDL_SM_KEY_NWKSENC, LDL_SM_KEY_NWK, &iv);
}
else{
if(SESS_VERSION(self->ctx) == 0U){

/* ptr[0] below */
pos = 1;
pos += putU24(&ptr[pos], self->ctx.joinNonce);
pos += putEUI(&ptr[pos], self->joinEUI);
(void)putU16(&ptr[pos], self->ctx.devNonce);
/* ptr[0] below */
pos = 1;
pos += putU24(&ptr[pos], self->ctx.joinNonce);
pos += putU24(&ptr[pos], self->ctx.netID);
(void)putU16(&ptr[pos], self->ctx.devNonce);

ptr[0] = 2;
self->sm_interface->update_session_key(self->sm, LDL_SM_KEY_APPS, LDL_SM_KEY_NWK, &iv);

ptr[0] = 1;
self->sm_interface->update_session_key(self->sm, LDL_SM_KEY_FNWKSINT, LDL_SM_KEY_NWK, &iv);
self->sm_interface->update_session_key(self->sm, LDL_SM_KEY_SNWKSINT, LDL_SM_KEY_NWK, &iv);
self->sm_interface->update_session_key(self->sm, LDL_SM_KEY_NWKSENC, LDL_SM_KEY_NWK, &iv);
}
else{

ptr[0] = 1;
self->sm_interface->update_session_key(self->sm, LDL_SM_KEY_FNWKSINT, LDL_SM_KEY_NWK, &iv);
/* ptr[0] below */
pos = 1;
pos += putU24(&ptr[pos], self->ctx.joinNonce);
pos += putEUI(&ptr[pos], self->joinEUI);
(void)putU16(&ptr[pos], self->ctx.devNonce);

ptr[0] = 2;
self->sm_interface->update_session_key(self->sm, LDL_SM_KEY_APPS, LDL_SM_KEY_APP, &iv);
ptr[0] = 1;
self->sm_interface->update_session_key(self->sm, LDL_SM_KEY_FNWKSINT, LDL_SM_KEY_NWK, &iv);

ptr[0] = 3;
self->sm_interface->update_session_key(self->sm, LDL_SM_KEY_SNWKSINT, LDL_SM_KEY_NWK, &iv);
ptr[0] = 2;
self->sm_interface->update_session_key(self->sm, LDL_SM_KEY_APPS, LDL_SM_KEY_APP, &iv);

ptr[0] = 4;
self->sm_interface->update_session_key(self->sm, LDL_SM_KEY_NWKSENC, LDL_SM_KEY_NWK, &iv);
}
ptr[0] = 3;
self->sm_interface->update_session_key(self->sm, LDL_SM_KEY_SNWKSINT, LDL_SM_KEY_NWK, &iv);

ptr[0] = 4;
self->sm_interface->update_session_key(self->sm, LDL_SM_KEY_NWKSENC, LDL_SM_KEY_NWK, &iv);
}
self->sm_interface->end_update_session_key(self->sm);
}

#if defined(LDL_ENABLE_L2_1_1)
Expand All @@ -132,18 +128,14 @@ void LDL_OPS_deriveJoinKeys(struct ldl_mac *self)

(void)memset(&iv, 0, sizeof(iv));

self->sm_interface->begin_update_session_key(self->sm);
{
/* ptr[0] below */
(void)putEUI(&ptr[1U], self->devEUI);
/* ptr[0] below */
(void)putEUI(&ptr[1U], self->devEUI);

ptr[0] = 5U;
self->sm_interface->update_session_key(self->sm, LDL_SM_KEY_JSENC, LDL_SM_KEY_NWK, &iv);
ptr[0] = 5U;
self->sm_interface->update_session_key(self->sm, LDL_SM_KEY_JSENC, LDL_SM_KEY_NWK, &iv);

ptr[0] = 6U;
self->sm_interface->update_session_key(self->sm, LDL_SM_KEY_JSINT, LDL_SM_KEY_NWK, &iv);
}
self->sm_interface->end_update_session_key(self->sm);
ptr[0] = 6U;
self->sm_interface->update_session_key(self->sm, LDL_SM_KEY_JSINT, LDL_SM_KEY_NWK, &iv);
}
#endif

Expand Down
18 changes: 3 additions & 15 deletions src/ldl_sm.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,6 @@ static void *getKey(struct ldl_sm *self, enum ldl_sm_key desc);

static const struct ldl_sm_interface interface = {
.update_session_key = LDL_SM_updateSessionKey,
.begin_update_session_key = LDL_SM_beginUpdateSessionKey,
.end_update_session_key = LDL_SM_endUpdateSessionKey,
.mic = LDL_SM_mic,
.ecb = LDL_SM_ecb,
.ctr = LDL_SM_ctr
Expand All @@ -47,16 +45,16 @@ static const struct ldl_sm_interface interface = {
void LDL_SM_init(struct ldl_sm *self, const void *appKey)
{
/* not a mistake, internally we call this LDL_SM_KEY_NWK */
(void)memcpy(getKey(self, LDL_SM_KEY_NWK), appKey, LDL_KEY_SIZE);
(void)memcpy(getKey(self, LDL_SM_KEY_NWK), appKey, (appKey != NULL) ? LDL_KEY_SIZE : 0U);
}
#endif

#if defined(LDL_ENABLE_L2_1_1)
/* LoRaWAN 1.1 */
void LDL_SM_init(struct ldl_sm *self, const void *appKey, const void *nwkKey)
{
(void)memcpy(getKey(self, LDL_SM_KEY_APP), appKey, LDL_KEY_SIZE);
(void)memcpy(getKey(self, LDL_SM_KEY_NWK), nwkKey, LDL_KEY_SIZE);
(void)memcpy(getKey(self, LDL_SM_KEY_APP), appKey, (appKey != NULL) ? LDL_KEY_SIZE : 0U);
(void)memcpy(getKey(self, LDL_SM_KEY_NWK), nwkKey, (nwkKey != NULL) ? LDL_KEY_SIZE : 0U);
}
#endif

Expand All @@ -65,16 +63,6 @@ const struct ldl_sm_interface *LDL_SM_getInterface(void)
return &interface;
}

void LDL_SM_beginUpdateSessionKey(struct ldl_sm *self)
{
(void)self;
}

void LDL_SM_endUpdateSessionKey(struct ldl_sm *self)
{
(void)self;
}

void LDL_SM_updateSessionKey(struct ldl_sm *self, enum ldl_sm_key keyDesc, enum ldl_sm_key rootDesc, const void *iv)
{
struct ldl_aes_ctx ctx;
Expand Down
7 changes: 1 addition & 6 deletions src/ldl_sx126x.c
Original file line number Diff line number Diff line change
Expand Up @@ -498,12 +498,7 @@ void LDL_SX126X_transmit(struct ldl_radio *self, const struct ldl_radio_tx_setti
bool ok;

/* note this is dbm x 100 */
int16_t dbm = settings->dbm - self->tx_gain;

if(dbm > settings->max_eirp){

dbm = settings->max_eirp;
}
int16_t dbm = settings->eirp - self->tx_gain;

do{

Expand Down
7 changes: 1 addition & 6 deletions src/ldl_sx127x.c
Original file line number Diff line number Diff line change
Expand Up @@ -383,17 +383,12 @@ void LDL_SX127X_transmit(struct ldl_radio *self, const struct ldl_radio_tx_setti
.crc = true
};

int16_t dbm = settings->dbm - self->tx_gain;
int16_t dbm = settings->eirp - self->tx_gain;

#ifdef LDL_ENABLE_RADIO_DEBUG
debugLogReset(self);
#endif

if(dbm > settings->max_eirp){

dbm = settings->max_eirp;
}

#ifdef LDL_ENABLE_SX1272
if(self->type == LDL_RADIO_SX1272){

Expand Down
12 changes: 0 additions & 12 deletions wrappers/mbed/default_sm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,18 +49,6 @@ DefaultSM::DefaultSM(const void *app_key, const void *nwk_key)

/* protected **********************************************************/

void
DefaultSM::begin_update_session_key()
{
LDL_SM_beginUpdateSessionKey(&state);
}

void
DefaultSM::end_update_session_key()
{
LDL_SM_endUpdateSessionKey(&state);
}

void
DefaultSM::update_session_key(enum ldl_sm_key key_desc, enum ldl_sm_key root_desc, const void *iv)
{
Expand Down
2 changes: 0 additions & 2 deletions wrappers/mbed/default_sm.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,6 @@ namespace LDL {

struct ldl_sm state;

void begin_update_session_key();
void end_update_session_key();
void update_session_key(enum ldl_sm_key key_desc, enum ldl_sm_key root_desc, const void *iv);
uint32_t mic(enum ldl_sm_key desc, const void *hdr, uint8_t hdrLen, const void *data, uint8_t dataLen);
void ecb(enum ldl_sm_key desc, void *b);
Expand Down
2 changes: 1 addition & 1 deletion wrappers/mbed/default_store.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ namespace LDL {
dev_eui(dev_eui),
join_eui(join_eui)
{
next_dev_nonce = 0xf1ff;
next_dev_nonce = 0xffff;
}

void get_init_params(struct init_params *params)
Expand Down
14 changes: 0 additions & 14 deletions wrappers/mbed/sm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,6 @@ using namespace LDL;

const struct ldl_sm_interface SM::interface = {
.update_session_key = SM::_update_session_key,
.begin_update_session_key = SM::_begin_update_session_key,
.end_update_session_key = SM::_end_update_session_key,
.mic = SM::_mic,
.ecb = SM::_ecb,
.ctr = SM::_ctr
Expand All @@ -42,18 +40,6 @@ SM::to_obj(void *self)
return static_cast<SM *>(self);
}

void
SM::_begin_update_session_key(struct ldl_sm *self)
{
to_obj(self)->begin_update_session_key();
}

void
SM::_end_update_session_key(struct ldl_sm *self)
{
to_obj(self)->end_update_session_key();
}

void
SM::_update_session_key(struct ldl_sm *self, enum ldl_sm_key key_desc, enum ldl_sm_key root_desc, const void *iv)
{
Expand Down
4 changes: 0 additions & 4 deletions wrappers/mbed/sm.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,15 +47,11 @@ namespace LDL {

static SM *to_obj(void *self);

static void _begin_update_session_key(struct ldl_sm *self);
static void _end_update_session_key(struct ldl_sm *self);
static void _update_session_key(struct ldl_sm *self, enum ldl_sm_key key_desc, enum ldl_sm_key root_desc, const void *iv);
static uint32_t _mic(struct ldl_sm *self, enum ldl_sm_key desc, const void *hdr, uint8_t hdrLen, const void *data, uint8_t dataLen);
static void _ecb(struct ldl_sm *self, enum ldl_sm_key desc, void *b);
static void _ctr(struct ldl_sm *self, enum ldl_sm_key desc, const void *iv, void *data, uint8_t len);

virtual void begin_update_session_key() = 0;
virtual void end_update_session_key() = 0;
virtual void update_session_key(enum ldl_sm_key key_desc, enum ldl_sm_key root_desc, const void *iv) = 0;
virtual uint32_t mic(enum ldl_sm_key desc, const void *hdr, uint8_t hdrLen, const void *data, uint8_t dataLen) = 0;
virtual void ecb(enum ldl_sm_key desc, void *b) = 0;
Expand Down
2 changes: 1 addition & 1 deletion wrappers/ruby/ext/ldl/ext_ldl/ext_radio.c
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ static void transmit(struct ldl_radio *self, const struct ldl_radio_tx_setting *
VALUE params = rb_hash_new();

rb_hash_aset(params, ID2SYM(rb_intern("freq")), UINT2NUM(settings->freq));
rb_hash_aset(params, ID2SYM(rb_intern("dbm")), rb_float_new(settings->dbm / 100));
rb_hash_aset(params, ID2SYM(rb_intern("dbm")), rb_float_new(settings->eirp / 100));
rb_hash_aset(params, ID2SYM(rb_intern("bw")), bw_to_number(settings->bw));
rb_hash_aset(params, ID2SYM(rb_intern("sf")), sf_to_number(settings->sf));

Expand Down
Loading

0 comments on commit 450ae80

Please sign in to comment.