| @@ -16,34 +16,62 @@ reprocess the messages. The more complicated part is dealing w/ a | |||||
| missed confirmed reply, as the state will need to be back tracked (saved) | missed confirmed reply, as the state will need to be back tracked (saved) | ||||
| to decode the repeated confirm request. | to decode the repeated confirm request. | ||||
| both sides: | |||||
| meta-AD('com.funkthat.lora.irrigation.<type>.v0.0.1') | |||||
| key(<defined by type>) | |||||
| Key Negotiation | |||||
| ------------- | |||||
| Where type is to be: | |||||
| shared - shared secret | |||||
| ecdh - Results of an ECDH exchange, key = K || K_A || K_B | |||||
| ecdhe - Results of an ECDHE exchange, key = TBD | |||||
| ### shared | |||||
| Both sides initalize: | |||||
| ``` | |||||
| meta-AD('com.funkthat.lora.irrigation.shared.v0.0.1') | |||||
| key(<preshared key>) | |||||
| ``` | |||||
| The `preshared key` was agreed/preloaded on both sides. They should be a | |||||
| minimum of 16 bytes, but longer, such as pass phrases are allowed, as | |||||
| the key will be properly compressed by Keccak. | |||||
| The following exchange is required by protocols that are not PFS | The following exchange is required by protocols that are not PFS | ||||
| safe, that is shared and ecdh (defined below). This is to prevent | |||||
| safe, that is shared and ecdh (not yet defined). This is to prevent | |||||
| replay attacks and ensure that both sides have integrated random data | replay attacks and ensure that both sides have integrated random data | ||||
| into the protocol, AND that the connection reset was requested by the | 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 | initiator. This is described in the second paragraph of § C.2 in the | ||||
| [strobe paper](strobe/www/papers/strobe-20191114.pdf). | [strobe paper](strobe/www/papers/strobe-20191114.pdf). | ||||
| initiator: | initiator: | ||||
| ``` | |||||
| send_enc(<16 bytes random data> + 'reqreset') # nonce injection | send_enc(<16 bytes random data> + 'reqreset') # nonce injection | ||||
| send_mac(8) | send_mac(8) | ||||
| ``` | |||||
| respondent: | respondent: | ||||
| ``` | |||||
| send_enc(<16 bytes random data>) # nonce injection | send_enc(<16 bytes random data>) # nonce injection | ||||
| send_mac(8) | send_mac(8) | ||||
| ``` | |||||
| both: | |||||
| ``` | |||||
| ratchet() # prevent backtracking | ratchet() # prevent backtracking | ||||
| ``` | |||||
| initiator: | initiator: | ||||
| ``` | |||||
| send_enc('confirm') | send_enc('confirm') | ||||
| send_mac(8) | send_mac(8) | ||||
| ``` | |||||
| respondent: | respondent: | ||||
| ``` | |||||
| send_enc('confirmed') | send_enc('confirmed') | ||||
| send_mac(8) | send_mac(8) | ||||
| ``` | |||||
| It seems odd to respond to the confirm message, BUT, as using strobe | 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 | requires explicit hand off (similar to a token), in order for the | ||||
| @@ -55,12 +83,10 @@ 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. | session, if any is maintained till the completion of a reset request. | ||||
| Only after that, does the old connection key get removed. This does | Only after that, does the old connection key get removed. This does | ||||
| mean that after a reset request, it is required that both sides attempt | mean that after a reset request, it is required that both sides attempt | ||||
| to decode each packet w/ both keys. | |||||
| to decode each packet w/ both states. | |||||
| 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 | |||||
| Command Phase | |||||
| ------------- | |||||
| Once the session has been established, the initiator will send commands of the | Once the session has been established, the initiator will send commands of the | ||||
| following format: | following format: | ||||
| @@ -71,10 +97,26 @@ format. Additional types may be added later. | |||||
| The following commands are defined: | The following commands are defined: | ||||
| TERMINATE: 1 -- no args: terminate the session, reply confirms | TERMINATE: 1 -- no args: terminate the session, reply confirms | ||||
| WAITFOR: 2 -- args: (length): waits for length seconds | |||||
| RUNFOR: 3 -- args: (chan, length): turns on chan for length seconds | |||||
| WAITFOR: 2 -- args: (length): enqueues a waits for length seconds | |||||
| RUNFOR: 3 -- args: (chan, length): enqueues a turn on chan for length seconds | |||||
| PING: 4 -- args: (): No op, verify connection is functional | |||||
| SETUNSET: 5 -- args: (chan, val): sets chan to val | |||||
| ADV: 6 -- args: ([cnt]): Advances to the next cnt (default 1) command | |||||
| CLEAR: 7 -- args: (): Clears all future commands, but keeps current running | |||||
| When the responder receives a command, it will process it, and send back | When the responder receives a command, it will process it, and send back | ||||
| a response w/ the same command byte as an acknowledgment. | a response w/ the same command byte as an acknowledgment. | ||||
| Note that the commands WAITFOR and RUNFOR are enqueued on the run queue. | |||||
| If there is not a running enqueued command, it will be started, and only | |||||
| when the current enqueued command finishes will the next one be run. | |||||
| The other commands are run immediately. | |||||
| To clear any pending enqueued commands, and end the current command, a | |||||
| CLEAR command followed by an ADV command must be sent. This will clear | |||||
| out any scheduled commands, and then end the current command so that any | |||||
| future scheduled commands will be started, as opposed to waiting till | |||||
| the current scheduled command finishes. | |||||
| Note: look at: https://monocypher.org/manual/advanced/elligator when doing ECDHE | Note: look at: https://monocypher.org/manual/advanced/elligator when doing ECDHE | ||||