LoRaWAN MAC layer implementation

Dependents:   LoRaWAN-demo-72_tjm LoRaWAN-demo-72_jlc LoRaWAN-demo-elmo frdm_LoRa_Connect_Woodstream_Demo_tjm ... more

LoRAWAN-lib is a port of the GitHub LoRaMac-node LoRaWAN MAC layer implementation.

This library depends on the SX1276Lib or SX1272Lib radio drivers depending on the used mbed component shield.

This library depends also on some cryptographic helper functions as well as helper functions for the timers management. These can be found on the example projects under the system directory.

The example projects are:

  1. LoRaWAN-demo-72
  2. LoRaWAN-demo-76
  3. LoRaWAN-demo-NAMote72

The LoRaWAN specification specifies different ISM bands operating parameters. These are all implemented under the LoRaMac-board.h file.

In order to select which band to use, please change line 24 of board.h file provided on the examples projects as follows:


EU868

board.h

#define USE_BAND_868


US915

board.h

#define USE_BAND_915


US915 - Hybrid

board.h

#define USE_BAND_915_HYBRID


CN780

board.h

#define USE_BAND_780


EU433

board.h

#define USE_BAND_433
Committer:
ubhat
Date:
Tue Jul 17 22:48:35 2018 +0000
Revision:
11:2426a05fe29e
Parent:
2:14a5d6ad92d5
Fix bug where FCnt get incremented twice in the case of ADRACKReq with D/L ACK

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mluis 2:14a5d6ad92d5 1 /*!
mluis 2:14a5d6ad92d5 2 * \file LoRaMacCrypto.h
mluis 2:14a5d6ad92d5 3 *
mluis 2:14a5d6ad92d5 4 * \brief LoRa MAC layer cryptography implementation
mluis 2:14a5d6ad92d5 5 *
mluis 2:14a5d6ad92d5 6 * \copyright Revised BSD License, see section \ref LICENSE.
mluis 2:14a5d6ad92d5 7 *
mluis 2:14a5d6ad92d5 8 * \code
mluis 2:14a5d6ad92d5 9 * ______ _
mluis 2:14a5d6ad92d5 10 * / _____) _ | |
mluis 2:14a5d6ad92d5 11 * ( (____ _____ ____ _| |_ _____ ____| |__
mluis 2:14a5d6ad92d5 12 * \____ \| ___ | (_ _) ___ |/ ___) _ \
mluis 2:14a5d6ad92d5 13 * _____) ) ____| | | || |_| ____( (___| | | |
mluis 2:14a5d6ad92d5 14 * (______/|_____)_|_|_| \__)_____)\____)_| |_|
mluis 2:14a5d6ad92d5 15 * (C)2013 Semtech
mluis 2:14a5d6ad92d5 16 *
mluis 2:14a5d6ad92d5 17 * ___ _____ _ ___ _ _____ ___ ___ ___ ___
mluis 2:14a5d6ad92d5 18 * / __|_ _/_\ / __| |/ / __/ _ \| _ \/ __| __|
mluis 2:14a5d6ad92d5 19 * \__ \ | |/ _ \ (__| ' <| _| (_) | / (__| _|
mluis 2:14a5d6ad92d5 20 * |___/ |_/_/ \_\___|_|\_\_| \___/|_|_\\___|___|
mluis 2:14a5d6ad92d5 21 * embedded.connectivity.solutions===============
mluis 2:14a5d6ad92d5 22 *
mluis 2:14a5d6ad92d5 23 * \endcode
mluis 2:14a5d6ad92d5 24 *
mluis 2:14a5d6ad92d5 25 * \author Miguel Luis ( Semtech )
mluis 2:14a5d6ad92d5 26 *
mluis 2:14a5d6ad92d5 27 * \author Gregory Cristian ( Semtech )
mluis 2:14a5d6ad92d5 28 *
mluis 2:14a5d6ad92d5 29 * \author Daniel Jäckle ( STACKFORCE )
mluis 2:14a5d6ad92d5 30 *
mluis 2:14a5d6ad92d5 31 * \defgroup LORAMAC_CRYPTO LoRa MAC layer cryptography implementation
mluis 2:14a5d6ad92d5 32 * This module covers the implementation of cryptographic functions
mluis 2:14a5d6ad92d5 33 * of the LoRaMAC layer.
mluis 2:14a5d6ad92d5 34 * \{
mluis 2:14a5d6ad92d5 35 */
mluis 0:91d1a7783bb9 36 #ifndef __LORAMAC_CRYPTO_H__
mluis 0:91d1a7783bb9 37 #define __LORAMAC_CRYPTO_H__
mluis 0:91d1a7783bb9 38
mluis 0:91d1a7783bb9 39 /*!
mluis 2:14a5d6ad92d5 40 * Computes the LoRaMAC frame MIC field
mluis 0:91d1a7783bb9 41 *
mluis 2:14a5d6ad92d5 42 * \param [IN] buffer - Data buffer
mluis 2:14a5d6ad92d5 43 * \param [IN] size - Data buffer size
mluis 2:14a5d6ad92d5 44 * \param [IN] key - AES key to be used
mluis 2:14a5d6ad92d5 45 * \param [IN] address - Frame address
mluis 2:14a5d6ad92d5 46 * \param [IN] dir - Frame direction [0: uplink, 1: downlink]
mluis 2:14a5d6ad92d5 47 * \param [IN] sequenceCounter - Frame sequence counter
mluis 2:14a5d6ad92d5 48 * \param [OUT] mic - Computed MIC field
mluis 0:91d1a7783bb9 49 */
mluis 0:91d1a7783bb9 50 void LoRaMacComputeMic( const uint8_t *buffer, uint16_t size, const uint8_t *key, uint32_t address, uint8_t dir, uint32_t sequenceCounter, uint32_t *mic );
mluis 0:91d1a7783bb9 51
mluis 0:91d1a7783bb9 52 /*!
mluis 2:14a5d6ad92d5 53 * Computes the LoRaMAC payload encryption
mluis 0:91d1a7783bb9 54 *
mluis 2:14a5d6ad92d5 55 * \param [IN] buffer - Data buffer
mluis 2:14a5d6ad92d5 56 * \param [IN] size - Data buffer size
mluis 2:14a5d6ad92d5 57 * \param [IN] key - AES key to be used
mluis 2:14a5d6ad92d5 58 * \param [IN] address - Frame address
mluis 2:14a5d6ad92d5 59 * \param [IN] dir - Frame direction [0: uplink, 1: downlink]
mluis 2:14a5d6ad92d5 60 * \param [IN] sequenceCounter - Frame sequence counter
mluis 2:14a5d6ad92d5 61 * \param [OUT] encBuffer - Encrypted buffer
mluis 0:91d1a7783bb9 62 */
mluis 0:91d1a7783bb9 63 void LoRaMacPayloadEncrypt( const uint8_t *buffer, uint16_t size, const uint8_t *key, uint32_t address, uint8_t dir, uint32_t sequenceCounter, uint8_t *encBuffer );
mluis 0:91d1a7783bb9 64
mluis 0:91d1a7783bb9 65 /*!
mluis 2:14a5d6ad92d5 66 * Computes the LoRaMAC payload decryption
mluis 0:91d1a7783bb9 67 *
mluis 2:14a5d6ad92d5 68 * \param [IN] buffer - Data buffer
mluis 2:14a5d6ad92d5 69 * \param [IN] size - Data buffer size
mluis 2:14a5d6ad92d5 70 * \param [IN] key - AES key to be used
mluis 2:14a5d6ad92d5 71 * \param [IN] address - Frame address
mluis 2:14a5d6ad92d5 72 * \param [IN] dir - Frame direction [0: uplink, 1: downlink]
mluis 2:14a5d6ad92d5 73 * \param [IN] sequenceCounter - Frame sequence counter
mluis 2:14a5d6ad92d5 74 * \param [OUT] decBuffer - Decrypted buffer
mluis 0:91d1a7783bb9 75 */
mluis 0:91d1a7783bb9 76 void LoRaMacPayloadDecrypt( const uint8_t *buffer, uint16_t size, const uint8_t *key, uint32_t address, uint8_t dir, uint32_t sequenceCounter, uint8_t *decBuffer );
mluis 0:91d1a7783bb9 77
mluis 0:91d1a7783bb9 78 /*!
mluis 2:14a5d6ad92d5 79 * Computes the LoRaMAC Join Request frame MIC field
mluis 0:91d1a7783bb9 80 *
mluis 2:14a5d6ad92d5 81 * \param [IN] buffer - Data buffer
mluis 2:14a5d6ad92d5 82 * \param [IN] size - Data buffer size
mluis 2:14a5d6ad92d5 83 * \param [IN] key - AES key to be used
mluis 2:14a5d6ad92d5 84 * \param [OUT] mic - Computed MIC field
mluis 0:91d1a7783bb9 85 */
mluis 0:91d1a7783bb9 86 void LoRaMacJoinComputeMic( const uint8_t *buffer, uint16_t size, const uint8_t *key, uint32_t *mic );
mluis 0:91d1a7783bb9 87
mluis 0:91d1a7783bb9 88 /*!
mluis 2:14a5d6ad92d5 89 * Computes the LoRaMAC join frame decryption
mluis 0:91d1a7783bb9 90 *
mluis 2:14a5d6ad92d5 91 * \param [IN] buffer - Data buffer
mluis 2:14a5d6ad92d5 92 * \param [IN] size - Data buffer size
mluis 2:14a5d6ad92d5 93 * \param [IN] key - AES key to be used
mluis 2:14a5d6ad92d5 94 * \param [OUT] decBuffer - Decrypted buffer
mluis 0:91d1a7783bb9 95 */
mluis 0:91d1a7783bb9 96 void LoRaMacJoinDecrypt( const uint8_t *buffer, uint16_t size, const uint8_t *key, uint8_t *decBuffer );
mluis 0:91d1a7783bb9 97
mluis 0:91d1a7783bb9 98 /*!
mluis 2:14a5d6ad92d5 99 * Computes the LoRaMAC join frame decryption
mluis 0:91d1a7783bb9 100 *
mluis 2:14a5d6ad92d5 101 * \param [IN] key - AES key to be used
mluis 2:14a5d6ad92d5 102 * \param [IN] appNonce - Application nonce
mluis 2:14a5d6ad92d5 103 * \param [IN] devNonce - Device nonce
mluis 2:14a5d6ad92d5 104 * \param [OUT] nwkSKey - Network session key
mluis 2:14a5d6ad92d5 105 * \param [OUT] appSKey - Application session key
mluis 0:91d1a7783bb9 106 */
mluis 0:91d1a7783bb9 107 void LoRaMacJoinComputeSKeys( const uint8_t *key, const uint8_t *appNonce, uint16_t devNonce, uint8_t *nwkSKey, uint8_t *appSKey );
mluis 0:91d1a7783bb9 108
mluis 2:14a5d6ad92d5 109 /*! \} defgroup LORAMAC */
mluis 2:14a5d6ad92d5 110
mluis 0:91d1a7783bb9 111 #endif // __LORAMAC_CRYPTO_H__