@@ -0,0 +1,65 @@ | |||
Notes | |||
===== | |||
This file contains various notes about the development of this | |||
repository. | |||
This is based upon the PingPong code from heltec for Node 151[1]. | |||
The STM32Cube packages are undocumented as far as I can tell. Various | |||
files were copied from the PingPong code. | |||
MIT licensed code for the SX1276 is available at https://github.com/HelTecAutomation/Heltec_ESP32/tree/master/src/lora . | |||
BSD licensed code for the SX1276 is available at https://github.com/Lora-net/LoRaMac-node . | |||
It includes support for the STM32 micros, and so was used as the basis. | |||
Biggest issue is that it adds yet another HAL layer to the whole | |||
thing. | |||
mscgen for message diagram generation | |||
ECDH: https://tools.ietf.org/html/rfc7748#section-6.1 | |||
Command to find and copy various files into the tree. Almost all files | |||
were pulled from the STM32CubeL1 tree, but there was one or two that | |||
was pulled from LoRaMac-node tree. | |||
``` | |||
cp $(find /tmp/Pingpong_CDC/ -name cmsis_gcc.h) stm32/ | |||
``` | |||
The following command can be used to strip CR's, and to remove any | |||
trailing new lines. Note that in order to save my sanity, the files | |||
are committed after cleaning. The repo does NOT contain (if it can be | |||
avoided) the pre-cleaned files. The diff options `-w -b` may be used | |||
to ignore these cleanups. | |||
``` | |||
# there is a ^V^I and a ^V^M in the following: | |||
LANG=C sed -i '' -e 's/[ ]*^M$//' $(find stm32/ -type f) | |||
``` | |||
Running gdb | |||
----------- | |||
First, just run openocd, but w/o any needed command, or you can reset it: | |||
``` | |||
sudo openocd -f interface/ftdi/digilent-hs1.cfg -f interface/ftdi/swd-resistor-hack.cfg -f target/stm32l1.cfg -c "init" -c "reset init" | |||
``` | |||
Then run `arm-none-eabi-gdb` with the elf binary, and attach to OpenOCD | |||
with the command: | |||
``` | |||
target remote localhost:3333 | |||
``` | |||
The gdb monitor command allows control of the device. For example: | |||
``` | |||
monitor reset halt | |||
``` | |||
will reset the device, and halt it immediately, allowing setting a break | |||
point for main, or earlier. | |||
[1] https://heltec-automation-docs.readthedocs.io/en/latest/stm32/lora_node_151/pingpong_test.html |
@@ -0,0 +1,57 @@ | |||
Protocol | |||
======== | |||
The responder will be the node under control (irrigation controler), and | |||
the initiator will be the server. | |||
The responder will always respond with one and only one packet. That | |||
is, all timeout mechanisms will be handled by the initiator. If the | |||
initiator does not receive a response to it's query, it will resend the | |||
request until it does. It is required that the responder be able to | |||
detect this, and resend the last response. | |||
both sides: | |||
meta-AD('com.funkthat.lora.irrigation.<type>.v0.0.1') | |||
key(<defined by type>) | |||
The following exchange is required by protocols that are not PFS | |||
safe, that is shared and ecdh (defined below). This is to prevent | |||
replay attacks and ensure that both sides have integrated random data | |||
into the protocol, AND that the connection reset was requested by the | |||
initiator. This is described in the second paragraph of § C.2 in the | |||
[strobe paper](strobe/www/papers/strobe-20191114.pdf). | |||
initiator: | |||
send_enc(<16 bytes random data> + 'reqreset') # nonce injection | |||
send_mac(8) | |||
respondant: | |||
send_enc(<16 bytes random data>) # nonce injection | |||
send_mac(8) | |||
initiator: | |||
send_enc('confirm') | |||
send_mac(8) | |||
respondant: | |||
send_enc('confirmed') | |||
send_mac(8) | |||
It seems odd to respond to the confirm message, BUT, as using strobe | |||
requires explicit hand off (similar to a token), in order for the | |||
initiator to send any commands it needs to be "passed back". | |||
The new key/session does not become active till this point. | |||
In order to handle a reset and prevent a replay attack, the existing | |||
session, if any is maintained till the completion of a reset request. | |||
Only after that, does the old conenction key get removed. This does | |||
mean that after a reset request, it is required that both sides attempt | |||
to decode each packet w/ both keys. | |||
Where type is to be: | |||
shared - shared secret: key = common set of bytes, should be min 16 bytes. | |||
ecdh - Results of an ECDH exchange, key = K || K_A || K_B | |||
ecdhe - Results of an ECDHE exchange, key = TBD | |||
Note: look at: https://monocypher.org/manual/advanced/elligator when doing ECDHE |