end node on synchronous star LoRa network.
Dependencies: SX127x sx12xx_hal TSL2561
radio chip selection
Radio chip driver is not included, allowing choice of radio device.
If you're using SX1272 or SX1276, then import sx127x driver into your program.
if you're using SX1261 or SX1262, then import sx126x driver into your program.
if you're using SX1280, then import sx1280 driver into your program.
If you're using NAmote72 or Murata discovery, then you must import only sx127x driver.
This project for use with LoRaWAN_singlechannel_gateway project.
Alternately gateway running on raspberry pi can be used as gateway.
LoRaWAN on single radio channel
Network description is at gateway project page. Synchronous star network.
Hardware Support
This project supports SX1276 and SX1272, sx126x kit, sx126x shield, and sx128x 2.4GHz. The ST board B-L072Z-LRWAN1 is also supported (TypeABZ module). When B-L072Z-LRWAN1
target is selected, TARGET_DISCO_L072CZ_LRWAN1
is defined by tools, allowing correct radio driver configuration for this platform. Alternately, any mbed board that can use LoRa radio shield board should work, but NUCLEO boards are tested.
End-node Unique ID
DevEUI is created from CPU serial number. AppEUI and AppKey are declared as software constants.
End-node Configuration
Data rate definition LORAMAC_DEFAULT_DATARATE
configured in LoRaMac-definitions.h
. See gateway project page for configuration of gateway.
LoRaWAN addressing is configured in Comissioning.h
; only OTA mode is functional.
Header file board/lora_config.h
, selects application layer options (i.e. sensors) to be compiled in.
Serial Interface
Serial port operates at 115200bps.
Application layer single_us915_main.cpp
User button triggers uplink (i.e. blue button on nucleo board), or jumper enables continuously sends repeated uplink packets. The MAC layer holds each uplink request until the allocated timeslot.
command | arguments | description |
---|---|---|
? | - | print available commands |
. (period) | - | print status (DevEUI, DevAddr, etc) |
ul | length integer | set payload length of test uplink packets |
sensor demo
Selected grove sensors may be plugged into SX1272 shield.
To enable, edit lora_config.h
to define SENSORS
.
Sensor connections on SX1272MB2xAS:
D8 D9: button | RX TX: (unused) | A3 A4: Rotary Angle Sensor |
D6 D7: RGB LED | SCL SDA: digital light sensor | A1 A2: Rotary Angle Sensor |
Digital input pin, state reported via uplink: PC8
Digital output pin, controlled via downlink: PC6
PWM out: PB_10
Jumper enables auto-repeated transmit: PC10
and PC12
on NUCLEO board, located on end of morpho headers nearby JP4.
system/crypto/gladman_cmac.cpp@0:8f0d0ae0a077, 2017-05-18 (annotated)
- Committer:
- dudmuck
- Date:
- Thu May 18 15:11:53 2017 -0700
- Revision:
- 0:8f0d0ae0a077
initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dudmuck | 0:8f0d0ae0a077 | 1 | /************************************************************************** |
dudmuck | 0:8f0d0ae0a077 | 2 | Copyright (C) 2009 Lander Casado, Philippas Tsigas |
dudmuck | 0:8f0d0ae0a077 | 3 | |
dudmuck | 0:8f0d0ae0a077 | 4 | All rights reserved. |
dudmuck | 0:8f0d0ae0a077 | 5 | |
dudmuck | 0:8f0d0ae0a077 | 6 | Permission is hereby granted, free of charge, to any person obtaining |
dudmuck | 0:8f0d0ae0a077 | 7 | a copy of this software and associated documentation files |
dudmuck | 0:8f0d0ae0a077 | 8 | (the "Software"), to deal with the Software without restriction, including |
dudmuck | 0:8f0d0ae0a077 | 9 | without limitation the rights to use, copy, modify, merge, publish, |
dudmuck | 0:8f0d0ae0a077 | 10 | distribute, sublicense, and/or sell copies of the Software, and to |
dudmuck | 0:8f0d0ae0a077 | 11 | permit persons to whom the Software is furnished to do so, subject to |
dudmuck | 0:8f0d0ae0a077 | 12 | the following conditions: |
dudmuck | 0:8f0d0ae0a077 | 13 | |
dudmuck | 0:8f0d0ae0a077 | 14 | Redistributions of source code must retain the above copyright notice, |
dudmuck | 0:8f0d0ae0a077 | 15 | this list of conditions and the following disclaimers. Redistributions in |
dudmuck | 0:8f0d0ae0a077 | 16 | binary form must reproduce the above copyright notice, this list of |
dudmuck | 0:8f0d0ae0a077 | 17 | conditions and the following disclaimers in the documentation and/or |
dudmuck | 0:8f0d0ae0a077 | 18 | other materials provided with the distribution. |
dudmuck | 0:8f0d0ae0a077 | 19 | |
dudmuck | 0:8f0d0ae0a077 | 20 | In no event shall the authors or copyright holders be liable for any special, |
dudmuck | 0:8f0d0ae0a077 | 21 | incidental, indirect or consequential damages of any kind, or any damages |
dudmuck | 0:8f0d0ae0a077 | 22 | whatsoever resulting from loss of use, data or profits, whether or not |
dudmuck | 0:8f0d0ae0a077 | 23 | advised of the possibility of damage, and on any theory of liability, |
dudmuck | 0:8f0d0ae0a077 | 24 | arising out of or in connection with the use or performance of this software. |
dudmuck | 0:8f0d0ae0a077 | 25 | |
dudmuck | 0:8f0d0ae0a077 | 26 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
dudmuck | 0:8f0d0ae0a077 | 27 | OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
dudmuck | 0:8f0d0ae0a077 | 28 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
dudmuck | 0:8f0d0ae0a077 | 29 | CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
dudmuck | 0:8f0d0ae0a077 | 30 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
dudmuck | 0:8f0d0ae0a077 | 31 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
dudmuck | 0:8f0d0ae0a077 | 32 | DEALINGS WITH THE SOFTWARE |
dudmuck | 0:8f0d0ae0a077 | 33 | |
dudmuck | 0:8f0d0ae0a077 | 34 | *****************************************************************************/ |
dudmuck | 0:8f0d0ae0a077 | 35 | //#include <sys/param.h> |
dudmuck | 0:8f0d0ae0a077 | 36 | //#include <sys/systm.h> |
dudmuck | 0:8f0d0ae0a077 | 37 | #include <stdint.h> |
dudmuck | 0:8f0d0ae0a077 | 38 | #include "gladman_aes.h" |
dudmuck | 0:8f0d0ae0a077 | 39 | #include "gladman_cmac.h" |
dudmuck | 0:8f0d0ae0a077 | 40 | #include "utilities.h" |
dudmuck | 0:8f0d0ae0a077 | 41 | |
dudmuck | 0:8f0d0ae0a077 | 42 | #define LSHIFT(v, r) do { \ |
dudmuck | 0:8f0d0ae0a077 | 43 | int32_t i; \ |
dudmuck | 0:8f0d0ae0a077 | 44 | for (i = 0; i < 15; i++) \ |
dudmuck | 0:8f0d0ae0a077 | 45 | (r)[i] = (v)[i] << 1 | (v)[i + 1] >> 7; \ |
dudmuck | 0:8f0d0ae0a077 | 46 | (r)[15] = (v)[15] << 1; \ |
dudmuck | 0:8f0d0ae0a077 | 47 | } while (0) |
dudmuck | 0:8f0d0ae0a077 | 48 | |
dudmuck | 0:8f0d0ae0a077 | 49 | #define XOR(v, r) do { \ |
dudmuck | 0:8f0d0ae0a077 | 50 | int32_t i; \ |
dudmuck | 0:8f0d0ae0a077 | 51 | for (i = 0; i < 16; i++) \ |
dudmuck | 0:8f0d0ae0a077 | 52 | { \ |
dudmuck | 0:8f0d0ae0a077 | 53 | (r)[i] = (r)[i] ^ (v)[i]; \ |
dudmuck | 0:8f0d0ae0a077 | 54 | } \ |
dudmuck | 0:8f0d0ae0a077 | 55 | } while (0) \ |
dudmuck | 0:8f0d0ae0a077 | 56 | |
dudmuck | 0:8f0d0ae0a077 | 57 | |
dudmuck | 0:8f0d0ae0a077 | 58 | void AES_CMAC_Init(AES_CMAC_CTX *ctx) |
dudmuck | 0:8f0d0ae0a077 | 59 | { |
dudmuck | 0:8f0d0ae0a077 | 60 | memset1(ctx->X, 0, sizeof ctx->X); |
dudmuck | 0:8f0d0ae0a077 | 61 | ctx->M_n = 0; |
dudmuck | 0:8f0d0ae0a077 | 62 | memset1(ctx->rijndael.ksch, '\0', 240); |
dudmuck | 0:8f0d0ae0a077 | 63 | } |
dudmuck | 0:8f0d0ae0a077 | 64 | |
dudmuck | 0:8f0d0ae0a077 | 65 | void AES_CMAC_SetKey(AES_CMAC_CTX *ctx, const uint8_t key[AES_CMAC_KEY_LENGTH]) |
dudmuck | 0:8f0d0ae0a077 | 66 | { |
dudmuck | 0:8f0d0ae0a077 | 67 | //rijndael_set_key_enc_only(&ctx->rijndael, key, 128); |
dudmuck | 0:8f0d0ae0a077 | 68 | aes_set_key( key, AES_CMAC_KEY_LENGTH, &ctx->rijndael); |
dudmuck | 0:8f0d0ae0a077 | 69 | } |
dudmuck | 0:8f0d0ae0a077 | 70 | |
dudmuck | 0:8f0d0ae0a077 | 71 | void AES_CMAC_Update(AES_CMAC_CTX *ctx, const uint8_t *data, uint32_t len) |
dudmuck | 0:8f0d0ae0a077 | 72 | { |
dudmuck | 0:8f0d0ae0a077 | 73 | uint32_t mlen; |
dudmuck | 0:8f0d0ae0a077 | 74 | uint8_t in[16]; |
dudmuck | 0:8f0d0ae0a077 | 75 | |
dudmuck | 0:8f0d0ae0a077 | 76 | if (ctx->M_n > 0) { |
dudmuck | 0:8f0d0ae0a077 | 77 | mlen = MIN(16 - ctx->M_n, len); |
dudmuck | 0:8f0d0ae0a077 | 78 | memcpy1(ctx->M_last + ctx->M_n, data, mlen); |
dudmuck | 0:8f0d0ae0a077 | 79 | ctx->M_n += mlen; |
dudmuck | 0:8f0d0ae0a077 | 80 | if (ctx->M_n < 16 || len == mlen) |
dudmuck | 0:8f0d0ae0a077 | 81 | return; |
dudmuck | 0:8f0d0ae0a077 | 82 | XOR(ctx->M_last, ctx->X); |
dudmuck | 0:8f0d0ae0a077 | 83 | //rijndael_encrypt(&ctx->rijndael, ctx->X, ctx->X); |
dudmuck | 0:8f0d0ae0a077 | 84 | aes_encrypt( ctx->X, ctx->X, &ctx->rijndael); |
dudmuck | 0:8f0d0ae0a077 | 85 | data += mlen; |
dudmuck | 0:8f0d0ae0a077 | 86 | len -= mlen; |
dudmuck | 0:8f0d0ae0a077 | 87 | } |
dudmuck | 0:8f0d0ae0a077 | 88 | while (len > 16) { /* not last block */ |
dudmuck | 0:8f0d0ae0a077 | 89 | |
dudmuck | 0:8f0d0ae0a077 | 90 | XOR(data, ctx->X); |
dudmuck | 0:8f0d0ae0a077 | 91 | //rijndael_encrypt(&ctx->rijndael, ctx->X, ctx->X); |
dudmuck | 0:8f0d0ae0a077 | 92 | |
dudmuck | 0:8f0d0ae0a077 | 93 | memcpy1(in, &ctx->X[0], 16); //Bestela ez du ondo iten |
dudmuck | 0:8f0d0ae0a077 | 94 | aes_encrypt( in, in, &ctx->rijndael); |
dudmuck | 0:8f0d0ae0a077 | 95 | memcpy1(&ctx->X[0], in, 16); |
dudmuck | 0:8f0d0ae0a077 | 96 | |
dudmuck | 0:8f0d0ae0a077 | 97 | data += 16; |
dudmuck | 0:8f0d0ae0a077 | 98 | len -= 16; |
dudmuck | 0:8f0d0ae0a077 | 99 | } |
dudmuck | 0:8f0d0ae0a077 | 100 | /* potential last block, save it */ |
dudmuck | 0:8f0d0ae0a077 | 101 | memcpy1(ctx->M_last, data, len); |
dudmuck | 0:8f0d0ae0a077 | 102 | ctx->M_n = len; |
dudmuck | 0:8f0d0ae0a077 | 103 | } |
dudmuck | 0:8f0d0ae0a077 | 104 | |
dudmuck | 0:8f0d0ae0a077 | 105 | void AES_CMAC_Final(uint8_t digest[AES_CMAC_DIGEST_LENGTH], AES_CMAC_CTX *ctx) |
dudmuck | 0:8f0d0ae0a077 | 106 | { |
dudmuck | 0:8f0d0ae0a077 | 107 | uint8_t K[16]; |
dudmuck | 0:8f0d0ae0a077 | 108 | uint8_t in[16]; |
dudmuck | 0:8f0d0ae0a077 | 109 | /* generate subkey K1 */ |
dudmuck | 0:8f0d0ae0a077 | 110 | memset1(K, '\0', 16); |
dudmuck | 0:8f0d0ae0a077 | 111 | |
dudmuck | 0:8f0d0ae0a077 | 112 | //rijndael_encrypt(&ctx->rijndael, K, K); |
dudmuck | 0:8f0d0ae0a077 | 113 | |
dudmuck | 0:8f0d0ae0a077 | 114 | aes_encrypt( K, K, &ctx->rijndael); |
dudmuck | 0:8f0d0ae0a077 | 115 | |
dudmuck | 0:8f0d0ae0a077 | 116 | if (K[0] & 0x80) { |
dudmuck | 0:8f0d0ae0a077 | 117 | LSHIFT(K, K); |
dudmuck | 0:8f0d0ae0a077 | 118 | K[15] ^= 0x87; |
dudmuck | 0:8f0d0ae0a077 | 119 | } else |
dudmuck | 0:8f0d0ae0a077 | 120 | LSHIFT(K, K); |
dudmuck | 0:8f0d0ae0a077 | 121 | |
dudmuck | 0:8f0d0ae0a077 | 122 | |
dudmuck | 0:8f0d0ae0a077 | 123 | if (ctx->M_n == 16) { |
dudmuck | 0:8f0d0ae0a077 | 124 | /* last block was a complete block */ |
dudmuck | 0:8f0d0ae0a077 | 125 | XOR(K, ctx->M_last); |
dudmuck | 0:8f0d0ae0a077 | 126 | |
dudmuck | 0:8f0d0ae0a077 | 127 | } else { |
dudmuck | 0:8f0d0ae0a077 | 128 | /* generate subkey K2 */ |
dudmuck | 0:8f0d0ae0a077 | 129 | if (K[0] & 0x80) { |
dudmuck | 0:8f0d0ae0a077 | 130 | LSHIFT(K, K); |
dudmuck | 0:8f0d0ae0a077 | 131 | K[15] ^= 0x87; |
dudmuck | 0:8f0d0ae0a077 | 132 | } else |
dudmuck | 0:8f0d0ae0a077 | 133 | LSHIFT(K, K); |
dudmuck | 0:8f0d0ae0a077 | 134 | |
dudmuck | 0:8f0d0ae0a077 | 135 | /* padding(M_last) */ |
dudmuck | 0:8f0d0ae0a077 | 136 | ctx->M_last[ctx->M_n] = 0x80; |
dudmuck | 0:8f0d0ae0a077 | 137 | while (++ctx->M_n < 16) |
dudmuck | 0:8f0d0ae0a077 | 138 | ctx->M_last[ctx->M_n] = 0; |
dudmuck | 0:8f0d0ae0a077 | 139 | |
dudmuck | 0:8f0d0ae0a077 | 140 | XOR(K, ctx->M_last); |
dudmuck | 0:8f0d0ae0a077 | 141 | |
dudmuck | 0:8f0d0ae0a077 | 142 | |
dudmuck | 0:8f0d0ae0a077 | 143 | } |
dudmuck | 0:8f0d0ae0a077 | 144 | XOR(ctx->M_last, ctx->X); |
dudmuck | 0:8f0d0ae0a077 | 145 | |
dudmuck | 0:8f0d0ae0a077 | 146 | //rijndael_encrypt(&ctx->rijndael, ctx->X, digest); |
dudmuck | 0:8f0d0ae0a077 | 147 | |
dudmuck | 0:8f0d0ae0a077 | 148 | memcpy1(in, &ctx->X[0], 16); //Bestela ez du ondo iten |
dudmuck | 0:8f0d0ae0a077 | 149 | aes_encrypt(in, digest, &ctx->rijndael); |
dudmuck | 0:8f0d0ae0a077 | 150 | memset1(K, 0, sizeof K); |
dudmuck | 0:8f0d0ae0a077 | 151 | |
dudmuck | 0:8f0d0ae0a077 | 152 | } |
dudmuck | 0:8f0d0ae0a077 | 153 |