fota lib for mdot
mdot/Lora/Crypto.h@3:63d10f2375ea, 2018-09-14 (annotated)
- 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?
User | Revision | Line number | New 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__ |