From 35e18dc26024db46f1ff45d00b7f808a8619bf32 Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Mon, 14 May 2018 19:09:29 +0000 Subject: [PATCH] prop. 111 updates --- i2p2www/spec/proposals/111-ntcp-2.rst | 93 ++++++++++++++++----------- 1 file changed, 56 insertions(+), 37 deletions(-) diff --git a/i2p2www/spec/proposals/111-ntcp-2.rst b/i2p2www/spec/proposals/111-ntcp-2.rst index d48d04298..bada92d8c 100644 --- a/i2p2www/spec/proposals/111-ntcp-2.rst +++ b/i2p2www/spec/proposals/111-ntcp-2.rst @@ -6,7 +6,7 @@ NTCP 2 :editor: manas, str4d :created: 2014-02-13 :thread: http://zzz.i2p/topics/1577 - :lastupdated: 2018-05-07 + :lastupdated: 2018-05-14 :status: Open :supercedes: 106 @@ -32,6 +32,10 @@ identification are discussed. An appendix discussing a generic attack on common padding schemes is also included, as well as an appendix containing a number of candidates for the authenticated cipher. +As with other I2P transports, NTCP2 is defined solely +for point-to-point (router-to-router) transport of I2NP messages. +It is not a general-purpose data pipe. + Motivation ========== @@ -366,6 +370,20 @@ Noise_XK_25519_ChaChaPoly_SHA256. These generally follow the guidelines in It of course is not defined in Noise. +New Cryptographic Primitives for I2P +==================================== + +Existing I2P router implementations will require implementations for +the following standard cryptographic primitives, +which are not required for current I2P protocols: + +1) X25519 key generation and DH + +2) ChaCha/Poly1305 AEAD + +3) SipHash + + Processing overhead estimate ============================ @@ -373,12 +391,12 @@ Message sizes for the 3 messages: 1) 64 bytes + padding (NTCP was 288 bytes) 2) 56 bytes + padding (NTCP was 304 bytes) -3) 66 bytes + Alice router info + padding Average router info is about 750 - bytes Total average 816 bytes (NTCP was 448 bytes) +3) approx. 64 bytes + Alice router info + padding Average router info is about 750 + bytes Total average 814 bytes (NTCP was 448 bytes) 4) not required in NTCP2 (NTCP was 48 bytes) Total before padding: -NTCP2: 936 bytes +NTCP2: 934 bytes NTCP: 1088 bytes Note that if Alice connected to Bob for the purpose of sending a DatabaseStore Message of her RouterInfo, that message is not required, @@ -392,8 +410,8 @@ the handshake and start the data phase: all connections) (not including HMAC-SHA256) - HMAC-SHA256: 15 - ChaCha/Poly: 4 +- X25519 Keygen: 1 - X25519 DH: 3 -- SipHash: 1 - Signature verification: 1 (Bob) (Alice previously signed when generating her RI) Presumably Ed25519 (dependent on RI sigtype) @@ -759,7 +777,7 @@ Raw contents: + (32 bytes) + | k = KDF from KDF for msg 1 | + n = 0 + - | | + | see KDF for associated data | +----+----+----+----+----+----+----+----+ | unencrypted, authenticated | ~ padding (optional) ~ @@ -943,7 +961,6 @@ Key Derivation Function (KDF) (for handshake message 2) {% highlight lang='text' %} -// probably do this also: h = SHA256(h || random padding from message 1) This is the "e" message pattern: @@ -1072,7 +1089,7 @@ Raw contents: + Encrypted and authenticated data + | 24 bytes | + k from KDF for msg 2 + - | n = 0 | + | n = 0; see KDF for associated data | +----+----+----+----+----+----+----+----+ | unencrypted, authenticated | + padding (optional) + @@ -1185,7 +1202,6 @@ Encryption for for handshake message 3 part 1, using message 1 KDF) {% highlight lang='text' %} -// probably do this also: h = SHA256(h || random padding from message 2) // h is used as the associated data for the AEAD in message 3 part 1, below @@ -1253,16 +1269,6 @@ This is the "se" message pattern: End of "se" message pattern. - KDF for SipHash for length field: - SipHash uses two 8-byte keys (big endian) and 8 byte IV for first data. - - Alice to Bob SipHash k1, k2, IV: - - sipkeys_ab = HMAC-SHA256(temp_key, k_ba || byte(0x03)). - sipk1_ab = sipkeys[0:7] - sipk2_ab = sipkeys[8:15] - sipiv_ab = sipkeys[16:23] - // overwrite the temp_key in memory, no longer needed temp_key = (all zeros) @@ -1333,7 +1339,7 @@ Raw contents: + + | k from KDF for msg 1 | + n = 1 + - | | + | see KDF for associated data | + + | | +----+----+----+----+----+----+----+----+ @@ -1351,7 +1357,7 @@ Raw contents: + + | k from KDF for msg 3 part 2 | + n = 0 + - | | + | see KDF for associated data | ~ . . . ~ | | +----+----+----+----+----+----+----+----+ @@ -1511,8 +1517,8 @@ ck = from handshake phase -4) Data and TimeSync --------------------- +4) Data Phase +------------- Noise payload: As defined below, including random padding Non-noise payload: none @@ -1567,8 +1573,8 @@ Notes -SipHash obfuscated length? -`````````````````````````` +SipHash obfuscated length +````````````````````````` Reference: [SipHash]_ @@ -1632,8 +1638,8 @@ Raw contents + k = KDF for data phase + | n starts at 0 and increments | + for each frame + - | 16 bytes minimum | - + + + | no associated data | + + 16 bytes minimum + | | ~ . . . ~ | | @@ -1792,7 +1798,7 @@ Used optionally in the data phase. +----+----+----+----+----+----+----+----+ blk :: 2 - size :: size of router info to follow + size :: size of flag + router info to follow flg :: 1 byte flag bit order: 76543210 bit 0: 0 for local store, 1 for flood request @@ -1820,6 +1826,10 @@ Notes must not flood the RouterInfo unless there are published RouterAddresses in it. +- Implementers must ensure that when reading a block, + malformed or malicious data will not cause reads to + overrun into the next block. + Issues `````` @@ -1835,10 +1845,11 @@ An single I2NP message with a modified header. I2NP messages may not be fragmented across blocks or across chacha/poly frames. -This removes 7 bytes from the NTCP I2NP header: -The one-byte SHA-256 checksum, -go from 8 to 4 bytes for expiration, -and remove the 2 byte length (use the block size - 9). +This uses the first 9 bytes from the standard NTCP I2NP header, +and removes the last 7 bytes of the header, as follows: +truncate the expiration from 8 to 4 bytes, +remove the 2 byte length (use the block size - 9), +and remove the one-byte SHA-256 checksum. .. raw:: html @@ -1855,7 +1866,7 @@ and remove the 2 byte length (use the block size - 9). +----+----+----+----+----+----+----+----+ blk :: 3 - size :: size of type + msg id + exp + data to follow + size :: size of type + msg id + exp + message to follow I2NP message body size is (size - 9). type :: I2NP msg type, see I2NP spec msg id :: I2NP msg id, 4 bytes @@ -1865,6 +1876,13 @@ and remove the 2 byte length (use the block size - 9). {% endhighlight %} +Notes +````` +- Implementers must ensure that when reading a block, + malformed or malicious data will not cause reads to + overrun into the next block. + + Termination ``````````` @@ -1878,13 +1896,13 @@ This should be the last non-padding block. {% highlight lang='dataspec' %} +----+----+----+----+----+----+----+----+ - | 4 | 1 |rsn | last valid + | 4 | 9 |rsn | last valid +----+----+----+----+----+----+----+----+ nonce received | +----+----+----+----+ blk :: 4 - size :: 0 + size :: 9 rsn :: reason, 1 byte: 0: unspecified 1: termination received @@ -1902,7 +1920,7 @@ This should be the last non-padding block. 8 bytes Note: Not all reasons may actually be used; handshake failures will - generally result in immediate close with TCP RST instead. + generally result in a close with TCP RST instead. {% endhighlight %} @@ -1957,7 +1975,8 @@ Padding Issues Other block types ````````````````` Implementations should ignore unknown block types for -forward compatibility. +forward compatibility, except in message 3 part 2, where +unknown blocks are not allowed. Future work -- GitLab