<div dir="ltr"><div><div><div><div><div><div><div><div>After posting my previous message, I thought a bit more about re-negotiation of keys during a session.<br><br>Using resumption keys and a completely new NoisePSK_NN handshake may be a bit heavy.  And it is difficult to co-ordinate between the two directions when they should stop using the previous keys and re-negotiate.<br><br></div>CipherState.Rekey():<br></div>  - If k is empty or n is 2^64-1, then signal and error and fail.<br></div>  - Set temp to the first 32 bytes of ENCRYPT(k, n, [], zeroes) where zeroes is a sequence of 32 zero bytes.<br></div>  - InitializeKey(temp)<br><br></div><div>Essentially, this is generating a resumption key with an earlier nonce value than the special 2^64-1 value for generating cross-session PSK's.<br></div><div><br></div>This makes it easier to implement re-negotiation in a direction-independent manner.  For example:<br><br></div>Sender:<br></div>  - If the total number of bytes sent so far in this direction is >1Gb, then call Rekey() and send the next packet with type 2 instead of type 0.  And reset the byte count for this direction to 0.<br><br></div><div>Receiver:<br></div><div>  - If the incoming packet has type 2, then call Rekey() for the direction and reset the byte count to zero.<br></div><div>  - If the total number of bytes received so far in this direction is >(1Gb + 64K), then abort the connection because an expected re-negotiation did not occur.<br><br></div><div>Thoughts?<br><br></div><div>Cheers,<br><br></div><div>Rhys.<br><br></div></div>