I2P Address: [http://git.idk.i2p]

Skip to content
Snippets Groups Projects
Unverified Commit 10e298b1 authored by zzz's avatar zzz
Browse files

Prop. 159 updates

parent c727cd14
No related branches found
No related tags found
No related merge requests found
......@@ -2644,7 +2644,8 @@ Each datagram (or packet) contains a single message (unlike QUIC, where
a datagram may contain multiple QUIC packets).
The "packet header" is the part after the IP/UDP header.
All SSU2 messages are at least 32 bytes in length, except for Hole Punch which is empty.
All SSU2 messages are at least 40 bytes in length, except for Hole Punch which is empty.
Any message of length 1-39 bytes is invalid.
All SSU2 messages are less than or equal to 1472 (IPv4) or 1452 (IPv6) bytes in length. The message
format is based on Noise messages, with modifications for framing and indistinguishability.
Implementations using standard Noise libraries must pre-process received
......@@ -2715,6 +2716,28 @@ Alice Bob
SessionConfirmed ----------------->
{% endhighlight %}
Bob may reject a Session or Token Request by replying with a Retry message
containing a Termination block with a reason code.
Based on the reason code, Alice should not attempt another
request for some period of time:
.. raw:: html
{% highlight %}
Alice Bob
SessionRequest ------------------->
<--------------------------- Retry containing a Termination block
or
TokenRequest --------------------->
<--------------------------- Retry containing a Termination block
{% endhighlight %}
Using Noise terminology, the establishment and data sequence is as follows:
(Payload Security Properties)
......@@ -2967,6 +2990,7 @@ There are six header protection key phases:
- Retry
- Session Confirmed
- Data Phase
- Peer Test
================= =================== ====================
......@@ -2984,9 +3008,44 @@ Peer Test 6 Charlie Intro Key Charlie Intro Key
Header encryption is designed to allow rapid classification of
inbound packets, without complex heuristics or fallbacks.
This is accomplished by using the same k_header_1 key
for almost all inbound messages.
Even when the source IP or port of a connection changes
due to an actual IP change or NAT behavior, the packet may be
rapidly mapped to a session with a single lookup of the connection ID.
Note that Session Created and Retry are the ONLY messages that require fallback processing
for k_header_1 to decrypt the Connection ID, because they use the sender's (Bob's) intro key.
ALL other messages use the receiver's intro key for k_header_1.
The fallback processing need only look up pending outbound connections by
source IP/port.
If the fallback processing by source IP/port fails to find a pending
outbound connection, there could be several causes:
- Not an SSU2 message
- A corrupted SSU2 message
- The reply is spoofed or modified by an attacker
- Bob has a symmetric NAT
- Bob changed IP or port during processing of the message
- Bob sent the reply out a different interface
While additional fallback processing is possible to attempt to find
the pending outbound connection and decrypt the connection ID
using the k_header_1 for that connection, it is probably not necessary.
If Bob has issues with his NAT or packet routing, it is probably
better to let the connection fail.
See the Inbound Packet Handling sesion below for additional guidelines.
See the individual KDF sections below for the derivation of the header encryption keys for that phase.
Header Encryption KDF:
Header Encryption KDF
````````````````````````
.. raw:: html
......@@ -3050,8 +3109,34 @@ If it is a long header, the receiver must validate the version and netid fields.
If the version is != 2, or the netid is != the expected value (generally 2, except in test networks),
the receiver should drop the message.
In limited situations (after sending a Session Request but before receiving a Session Created),
the receiver should retry header decryption with the retry key, to check for a Retry message.
Packet Integrity
------------------------
All message contain either three or four parts:
- The message header
- For Session Request and Session Created only, an ephemeral key
- A ChaCha20-encrypted payload
- A Poly1305 MAC
In all cases, the header (and if present, the ephemeral key) is bound
to the authentication MAC to ensure that the entire message is intact.
- For handshake messages Session Request, Session Created, and Session Confirmed,
the message header is mixHash()ed before the Noise processing phase
- The ephemeral key, if present, is covered by a standard Noise misHash()
- For messages outside the Noise handshake, the header is used
as Associated Data for the ChaCha20/Poly1305 encryption.
Inbound packet handlers must always decrypt the ChaCha20 payload and validate
the MAC before processing the message, with one exception:
To mitigate DoS attacks from address-spoofed packets containing
apparent Session Request messages with an invalid token, a handler need NOT
attempt to decrypt and validate the full message
(requiring an expensive DH operation in addition to the ChaCha2o/Poly1305 decryption).
The handler may respond with a Retry message using the values found in the header
of the Session Request message.
Authenticated Encryption
......@@ -4421,6 +4506,16 @@ The minimum payload size is 8 bytes. Since the DateTime and Address blocks
total more than that, the requirement is met with only those two blocks.
Notes
`````
- To limit the magnitude of any amplification attack that can be mounted using spoofed source addresses,
the Retry message must not contain large amounts of padding.
It is recommended that the Retry message be no larger than three times the size
of the message it is responding to.
Alternatively, use a simple method such as adding a random amount of padding
in the range 1-64 bytes.
KDF for Token Request
--------------------------
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment