From dc5db6aab64b6736ea5d5947f0d865b82d0c1071 Mon Sep 17 00:00:00 2001 From: zzz <zzz@i2pmail.org> Date: Sun, 12 Jun 2022 13:26:01 -0400 Subject: [PATCH] prop. 159 updates --- i2p2www/spec/proposals/159-ssu2.rst | 106 ++++++++++++++++++---------- 1 file changed, 67 insertions(+), 39 deletions(-) diff --git a/i2p2www/spec/proposals/159-ssu2.rst b/i2p2www/spec/proposals/159-ssu2.rst index 0c673d6ef..653b48356 100644 --- a/i2p2www/spec/proposals/159-ssu2.rst +++ b/i2p2www/spec/proposals/159-ssu2.rst @@ -5,7 +5,7 @@ SSU2 :author: eyedeekay, orignal, zlatinb, zzz :created: 2021-09-12 :thread: http://zzz.i2p/topics/2612 - :lastupdated: 2022-06-06 + :lastupdated: 2022-06-12 :status: Open :target: 0.9.56 @@ -2421,9 +2421,11 @@ The possible version combinations are: ========= =========== ============= ============= Alice/Bob Bob/Charlie Alice/Charlie Supported ========= =========== ============= ============= +1 1 1 SSU 1 1 1 2 no, use 1/1/1 1 2 1 Relay: yes? Peer Test: no 1 2 2 no, use 1/2/1 +2 1 1 Relay: yes? Peer Test: no 2 1 2 Relay: yes? Peer Test: no 2 2 1 no, use 2/2/2 2 2 2 yes @@ -5025,8 +5027,11 @@ Payload Format ---------------- There are one or more blocks in the encrypted payload. +A block is a simple Tag-Length-Value (TLV) format. Each block contains a one-byte identifier, a two-byte length, and zero or more bytes of data. +This format is identical to that in [NTCP2]_ and [ECIES]_, +however the block definitions are different. For extensibility, receivers must ignore blocks with unknown identifiers, and treat them as padding. @@ -5103,7 +5108,7 @@ Peer Test 10 varies Next Nonce 11 TBD ACK 12 varies Address 13 9 or 21 -Intro Key 14 35 +reserved 14 -- Relay Tag Request 15 3 Relay Tag 16 7 New Token 17 15 @@ -5662,7 +5667,7 @@ Notes: Signature: -If Charlie agrees, +If Charlie agrees (response code 0) or rejects (response code 64 or higher), Charlie signs the response and includes it in this block; Bob forwards it in the Relay Response block to Alice. Signature algorithm: Sign the following data with the Charlie's router signing key: @@ -5675,6 +5680,16 @@ Signature algorithm: Sign the following data with the Charlie's router signing k - CharliePort: 2 byte Charlie's port number - Charlie IP: (csz - 2) byte Charlie IP address +If Bob rejects (response code 1-63), +Bob signs the response and includes it in this block. +Signature algorithm: Sign the following data with the Bob's router signing key: + +- prologue: 16 bytes "RelayAgreementOK", not null-terminated (not included in the message) +- bhash: Bob's 32-byte router hash (not included in the message) +- nonce: 4 byte nonce +- timestamp: 4 byte timestamp (seconds) +- ver: 1 byte SSU version +- csz: 1 byte = 0 RelayIntro @@ -6059,34 +6074,6 @@ or Bob's address, sent to Bob by Alice. -Intro Key -`````````````` -UNUSED, to be removed - -.. raw:: html - - {% highlight lang='dataspec' %} -+----+----+----+----+----+----+----+----+ - | 14 | 32 | Intro Key | - +----+----+----+ + - | | - + + - | | - + + - | | - + +----+----+----+----+----+ - | | - +----+----+----+ - - blk :: 14 - size :: 32 - key :: 32-byte introduction key - -{% endhighlight %} - - - - Relay Tag Request ``````````````````````` This may be sent by Alice in a Session Request, Session Confirmed, or Data message. @@ -6363,10 +6350,10 @@ Handshake Retransmission Session Request ---------------- -If no Session Created is received by Alice: +If no Session Created or Retry is received by Alice: Maintain same source and connection IDs, ephemeral key, and packet number 0. -Or, just retain the encrypted packet. +Or, just retain and retransmit the same encrypted packet. Packet number must not be incremented, because that would change the chained hash value used to encrypt the Session Created message. @@ -6428,17 +6415,39 @@ If this is too complex, Bob may just drop the undecryptable Data messages, as Alice will retransmit them. +Token Request +---------------- +If no Retry is received by Alice: + +Maintain same source and connection IDs. +An implementation may generate a new random packet number and encrypt a new packet; +Or it may reuse the same packet number or just retain and retransmit the same encrypted packet. +Packet number must not be incremented, because that would change +the chained hash value used to encrypt the Session Created message. + +Recommended retransmission intervals: 3 and 6 seconds (3 and 9 seconds after first sent). +Recommended timeout: 15 seconds total + Retry --------- -TODO: Resend or not? If so, same packet number or not? +If no Session Confirmed is received by Bob: -A Retry message is never retransmitted, except (optionally) in response to a repeated -Session Request message being received. +A Retry message is not retransmitted on timeout, to reduce the impacts +of spoofed source addresses. + +However, a Retry message may be retransmitted in response to a repeated +Session Request message being received with the original (invalid) token, +or in response to a repeated Token Request message. +In either case, this indicates that the Retry message was lost. + +If a second Session Request message is received with a different +but still-invalid token, drop the pending session and do not respond. If resending the Retry message: -Maintain same source and connection IDs. Increment packet number. -Re-encrypt the header, as the packet number changed. +Maintain same source and connection IDs and token. +An implementation may generate a new random packet number and encrypt a new packet; +Or it may reuse the same packet number or just retain and retransmit the same encrypted packet. @@ -6447,6 +6456,21 @@ Total Timeout Recommended total timeout for the handshake is 20 seconds. + +Duplicates and Error Handling +----------------------------- +Duplicates of the three Noise handshake messages +Session Request, Session Created, and Session Confirmed +must be detected before MixHash() of the header. +While the Noise AEAD processing will presumably fail after that, +the handshake hash would already be corrupted. + +If any of the three messages is corrupted and fails AEAD, +the handshake cannot subsequently be recovered even with retransmission, +because MixHash() was already called on the corrupted message. + + + Tokens ============= @@ -7024,7 +7048,7 @@ When message 5 arrives before message 4, Alice cannot immediately send message 6, because she does not yet have Charlie's intro key to encrypt the header. When message 4 arrives before message 5, -should not immediately send message 6, because she should wait +Alice should not immediately send message 6, because she should wait to see if message 5 arrives without opening the firewall with message 6. @@ -7048,9 +7072,11 @@ The only allowed version combination is where all peers are version 2. ========= =========== ============= ============= Alice/Bob Bob/Charlie Alice/Charlie Supported ========= =========== ============= ============= +1 1 1 SSU 1 1 1 2 no, use 1/1/1 1 2 1 no, Bob must select a version 1 Charlie 1 2 2 no, Bob must select a version 1 Charlie +2 1 1 no, Bob must select a version 2 Charlie 2 1 2 no, Bob must select a version 2 Charlie 2 2 1 no, use 2/2/2 2 2 2 yes @@ -7153,9 +7179,11 @@ The allowed version combinations are (TODO): ========= =========== ============= ============= Alice/Bob Bob/Charlie Alice/Charlie Supported ========= =========== ============= ============= +1 1 1 SSU 1 1 1 2 no, use 1/1/1 1 2 1 yes? 1 2 2 no, use 1/2/1 +2 1 1 yes? 2 1 2 yes? 2 2 1 no, use 2/2/2 2 2 2 yes -- GitLab