fota lib for mdot

Dependents:   UQ_LoraWAN

Committer:
Jenkins@KEILDM1.dc.multitech.prv
Date:
Fri Sep 14 15:39:09 2018 -0500
Revision:
3:63d10f2375ea
fota lib updates

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 1 /* ______ _
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 2 / _____) _ | |
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 3 ( (____ _____ ____ _| |_ _____ ____| |__
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 4 \____ \| ___ | (_ _) ___ |/ ___) _ \
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 5 _____) ) ____| | | || |_| ____( (___| | | |
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 6 (______/|_____)_|_|_| \__)_____)\____)_| |_|
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 7 (C)2013 Semtech
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 8
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 9 Description: LoRa MAC layer implementation
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 10
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 11 License: Revised BSD License, see LICENSE.TXT file include in the project
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 12
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 13 Maintainer: Miguel Luis and Gregory Cristian
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 14 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 15 #ifndef __LORA_CRYPTO_H__
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 16 #define __LORA_CRYPTO_H__
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 17
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 18 #include "casado/aes.h"
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 19 #include "gladman/cmac.h"
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 20 #include <cstring>
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 21 #include <inttypes.h>
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 22
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 23 namespace lora {
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 24
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 25 class Crypto
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 26 {
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 27 public:
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 28 Crypto(void);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 29
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 30 /*!
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 31 * Computes the LoRaMAC frame MIC field
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 32 *
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 33 * \param [IN] buffer Data buffer
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 34 * \param [IN] size Data buffer size
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 35 * \param [IN] key AES key to be used
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 36 * \param [IN] address Frame address
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 37 * \param [IN] dir Frame direction [0: uplink, 1: downlink, 2:peer]
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 38 * \param [IN] sequenceCounter Frame sequence counter
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 39 * \param [OUT] mic Computed MIC field
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 40 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 41 void ComputeMic(uint8_t *buffer, uint16_t size, uint8_t *key, uint32_t address, uint8_t dir, uint32_t sequenceCounter, uint32_t *mic);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 42
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 43 /*!
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 44 * Computes the LoRaMAC payload encryption
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 45 *
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 46 * \param [IN] buffer Data buffer
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 47 * \param [IN] size Data buffer size
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 48 * \param [IN] key AES key to be used
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 49 * \param [IN] address Frame address
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 50 * \param [IN] dir Frame direction [0: uplink, 1: downlink, 2:peer]
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 51 * \param [IN] sequenceCounter Frame sequence counter
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 52 * \param [OUT] encBuffer Encrypted buffer
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 53 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 54 void PayloadEncrypt(const uint8_t *buffer, uint16_t size, uint8_t *key, uint32_t address, uint8_t dir, uint32_t sequenceCounter, uint8_t *encBuffer);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 55
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 56 /*!
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 57 * Computes the LoRaMAC payload decryption
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 58 *
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 59 * \param [IN] buffer Data buffer
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 60 * \param [IN] size Data buffer size
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 61 * \param [IN] key AES key to be used
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 62 * \param [IN] address Frame address
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 63 * \param [IN] dir Frame direction [0: uplink, 1: downlink, 2:peer]
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 64 * \param [IN] sequenceCounter Frame sequence counter
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 65 * \param [OUT] decBuffer Decrypted buffer
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 66 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 67 void PayloadDecrypt(uint8_t *buffer, uint16_t size, uint8_t *key, uint32_t address, uint8_t dir, uint32_t sequenceCounter, uint8_t *decBuffer);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 68
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 69 /*!
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 70 * Computes the LoRaMAC Join Request frame MIC field
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 71 *
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 72 * \param [IN] buffer Data buffer
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 73 * \param [IN] size Data buffer size
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 74 * \param [IN] key AES key to be used
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 75 * \param [OUT] mic Computed MIC field
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 76 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 77 void JoinComputeMic(const uint8_t *buffer, uint16_t size, const uint8_t *key, uint32_t *mic);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 78
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 79 /*!
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 80 * Computes the LoRaMAC join frame decryption
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 81 *
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 82 * \param [IN] buffer Data buffer
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 83 * \param [IN] size Data buffer size
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 84 * \param [IN] key AES key to be used
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 85 * \param [OUT] decBuffer Decrypted buffer
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 86 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 87 void JoinDecrypt(uint8_t *buffer, uint16_t size, uint8_t *key, uint8_t *decBuffer);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 88
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 89 /*!
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 90 * Computes the LoRaMAC join frame decryption
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 91 *
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 92 * \param [IN] key AES key to be used
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 93 * \param [IN] appNonce Application nonce
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 94 * \param [IN] devNonce Device nonce
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 95 * \param [OUT] nwkSKey Network session key
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 96 * \param [OUT] appSKey Application session key
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 97 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 98 void DeriveSessionKeys(uint8_t *key, uint8_t *appNonce, uint8_t *netID, uint16_t devNonce, uint8_t *nwkSKey, uint8_t *appSKey);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 99
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 100 /*!
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 101 * Compute ping slot for current beacon frame
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 102 * \param [IN] beaconTime Time of current beacon
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 103 * \param [IN] devAddr Device Address
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 104 * \param [IN] period Period of downlink
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 105 * \return current pinslot
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 106 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 107 uint32_t ComputePingSlot(uint32_t beaconTime, uint32_t devAddr, uint32_t period);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 108
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 109 /*!
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 110 * Helper to copy mic bytes onto buffer
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 111 * \param [IN] mic integer mic value
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 112 * \param [IN] buff location to copy to
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 113 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 114 void CopyMicToArray(uint32_t mic, uint8_t* buff);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 115
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 116 void DeriveMcKEKey(uint8_t *mcKEKey, uint8_t *appKey, uint8_t *EUI);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 117
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 118 void DeriveMcKey(uint8_t *mcKey, uint8_t *mcKeyEncrypt, uint8_t *mcKEKey);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 119
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 120 void DeriveMcSessionKeys(uint8_t *mcAppKey, uint8_t *mcNetKey, uint8_t *mcKey, uint8_t *mcAddr);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 121
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 122 private:
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 123 /*!
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 124 * MIC field computation initial data
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 125 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 126 uint8_t MicBlockB0[16];
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 127
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 128 /*!
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 129 * Contains the computed MIC field.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 130 *
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 131 * \remark Only the 4 first bytes are used
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 132 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 133 uint8_t Mic[16];
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 134
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 135 /*!
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 136 * Encryption aBlock and sBlock
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 137 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 138 uint8_t aBlock[16];
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 139 uint8_t sBlock[16];
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 140
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 141 /*!
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 142 * AES computation context variable
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 143 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 144 aes_context AesContext;
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 145
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 146 /*!
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 147 * CMAC computation context variable
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 148 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 149 AES_CMAC_CTX AesCmacCtx[1];
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 150 };
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 151
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 152 }
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 153 #endif // __LORAMAC_CRYPTO_H__