From cb78cbc4648d54ea8043382dc162fd1067b75b98 Mon Sep 17 00:00:00 2001 From: zzz <zzz@i2pmail.org> Date: Thu, 23 Jan 2025 09:37:44 -0500 Subject: [PATCH] more handshake details --- i2p2www/spec/proposals/169-pq-crypto.rst | 203 +++++++++++++++++++++-- 1 file changed, 190 insertions(+), 13 deletions(-) diff --git a/i2p2www/spec/proposals/169-pq-crypto.rst b/i2p2www/spec/proposals/169-pq-crypto.rst index bd606a4d..eff095ad 100644 --- a/i2p2www/spec/proposals/169-pq-crypto.rst +++ b/i2p2www/spec/proposals/169-pq-crypto.rst @@ -430,7 +430,10 @@ Noise identifiers: 1b) New session format (with binding) ````````````````````````````````````` -Length is 96 + payload length. +Changes: Current ratchet contained only the static key in the first ChaCha section. +With ML-KEM, the first ChaCha section will also contain the encrypted PQ public key. + + Encrypted format: .. raw:: html @@ -446,9 +449,9 @@ Encrypted format: | | +----+----+----+----+----+----+----+----+ | | - + Static Key + + + ML-KEM key and Static Key + | ChaCha20 encrypted data | - + 32 bytes + + + (see table below for length) + | | + + | | @@ -470,20 +473,68 @@ Encrypted format: | 16 bytes | +----+----+----+----+----+----+----+----+ - Public Key :: 32 bytes, little endian, Elligator2, cleartext - Static Key encrypted data :: 32 bytes +{% endhighlight %} + +Decrypted format: + +.. raw:: html +Payload Part 1: + - Payload Section encrypted data :: remaining data minus 16 bytes + +----+----+----+----+----+----+----+----+ + | | + + ML-KEM key + + | | + + (see table below for length) + + | | + ~ ~ + | | + +----+----+----+----+----+----+----+----+ + | | + + X25519 Static Key + + | | + + (32 bytes) + + | | + + + + | | + +----+----+----+----+----+----+----+----+ - MAC :: Poly1305 message authentication code, 16 bytes + Payload Part 2: + + +----+----+----+----+----+----+----+----+ + | | + + Payload Section + + | | + ~ ~ + | | + + + + | | + +----+----+----+----+----+----+----+----+ {% endhighlight %} +Sizes: + +================ ========= ===== ========= ============= ============= ========== ======= + Type Type Code X len Msg 1 len Msg 1 Enc len Msg 1 Dec len PQ key len pl len +================ ========= ===== ========= ============= ============= ========== ======= +X25519 4 32 96+pl 64+pl pl -- pl +MLKEM512_X25519 5 32 896+pl 864+pl 800+pl 800 pl +MLKEM768_X25519 6 32 1280+pl 1344+pl 1184+pl 1184 pl +MLKEM1024_X25519 7 32 1664+pl 1632+pl 1568+pl 1568 pl +================ ========= ===== ========= ============= ============= ========== ======= + 1g) New Session Reply format ```````````````````````````` +Changes: Current ratchet has an empty payload for the first ChaCha section. +With ML-KEM, the first ChaCha section will contain the encrypted PQ ciphertext. + + +Encrypted format: + .. raw:: html {% highlight lang='dataspec' %} @@ -498,8 +549,16 @@ Encrypted format: + + | | +----+----+----+----+----+----+----+----+ + | | + + + + | ChaCha20 encrypted PQ ciphertext | + + (see table below for length) + + ~ ~ + + + + | | + +----+----+----+----+----+----+----+----+ | Poly1305 Message Authentication Code | - + (MAC) for Key Section (no data) + + + (MAC) for Key Section + | 16 bytes | +----+----+----+----+----+----+----+----+ | | @@ -518,6 +577,47 @@ Encrypted format: {% endhighlight %} +Decrypted format: + +.. raw:: html +Payload Part 1: + + + +----+----+----+----+----+----+----+----+ + | | + + ML-KEM ciphertext + + | | + + (see table below for length) + + | | + ~ ~ + | | + +----+----+----+----+----+----+----+----+ + + Payload Part 2: + + +----+----+----+----+----+----+----+----+ + | | + + Payload Section + + | | + ~ ~ + | | + + + + | | + +----+----+----+----+----+----+----+----+ + +{% endhighlight %} + +Sizes: + +================ ========= ===== ========= ============= ============= ========== ======= + Type Type Code Y len Msg 2 len Msg 2 Enc len Msg 2 Dec len PQ CT len opt len +================ ========= ===== ========= ============= ============= ========== ======= +X25519 4 32 72+pl 32+pl pl -- pl +MLKEM512_X25519 5 32 872+pl 832+pl 800+pl 800 pl +MLKEM768_X25519 6 32 1256+pl 1216+pl 1184+pl 1184 pl +MLKEM1024_X25519 7 32 1664+pl 1600+pl 1568+pl 1568 pl +================ ========= ===== ========= ============= ============= ========== ======= + KDF for Payload Section Encrypted Contents `````````````````````````````````````````` @@ -553,6 +653,9 @@ Noise identifiers: 1) SessionRequest `````````````````` +Changes: Current NTCP2 contains only the options in the ChaCha section. +With ML-KEM, the ChaCha section will also contain the encrypted PQ public key. + Raw contents: @@ -571,7 +674,7 @@ Raw contents: | | + + | ChaChaPoly frame | - + (32 bytes) + + + (see table below for length) + | k defined in KDF for message 1 | + n = 0 + | see KDF for associated data | @@ -600,6 +703,10 @@ Unencrypted data (Poly1305 authentication tag not shown): + + | | +----+----+----+----+----+----+----+----+ + | ML-KEM Public Key | + + (see table below for length) + + | | + +----+----+----+----+----+----+----+----+ | options | + (16 bytes) + | | @@ -611,15 +718,28 @@ Unencrypted data (Poly1305 authentication tag not shown): | | +----+----+----+----+----+----+----+----+ - add key {% endhighlight %} +Sizes: + +================ ========= ===== ========= ============= ============= ========== ======= + Type Type Code X len Msg 1 len Msg 1 Enc len Msg 1 Dec len PQ key len opt len +================ ========= ===== ========= ============= ============= ========== ======= +X25519 4 32 64+pad 32 16 -- 16 +MLKEM512_X25519 5 32 864+pad 832 816 800 16 +MLKEM768_X25519 6 32 1248+pad 1216 1200 1184 16 +MLKEM1024_X25519 7 32 1632+pad 1600 1584 1568 16 +================ ========= ===== ========= ============= ============= ========== ======= + 2) SessionCreated `````````````````` +Changes: Current NTCP2 contains only the options in the ChaCha section. +With ML-KEM, the ChaCha section will also contain the encrypted PQ public key. + Raw contents: @@ -637,7 +757,7 @@ Raw contents: +----+----+----+----+----+----+----+----+ | ChaChaPoly frame | + Encrypted and authenticated data + - | 32 bytes | + - (see table below for length) - + k defined in KDF for message 2 + | n = 0; see KDF for associated data | + + @@ -668,6 +788,10 @@ Unencrypted data (Poly1305 auth tag not shown): + + | | +----+----+----+----+----+----+----+----+ + | ML-KEM Ciphertext | + + (see table below for length) + + | | + +----+----+----+----+----+----+----+----+ | options | + (16 bytes) + | | @@ -679,11 +803,22 @@ Unencrypted data (Poly1305 auth tag not shown): | | +----+----+----+----+----+----+----+----+ - add key {% endhighlight %} +Sizes: + +================ ========= ===== ========= ============= ============= ========== ======= + Type Type Code Y len Msg 2 len Msg 2 Enc len Msg 2 Dec len PQ CT len opt len +================ ========= ===== ========= ============= ============= ========== ======= +X25519 4 32 64+pad 32 16 -- 16 +MLKEM512_X25519 5 32 832+pad 800 784 768 16 +MLKEM768_X25519 6 32 1120+pad 1088 1104 1088 16 +MLKEM1024_X25519 7 32 1600+pad 1568 1584 1568 16 +================ ========= ===== ========= ============= ============= ========== ======= + + 3) SessionConfirmed ``````````````````` @@ -775,6 +910,9 @@ Before header encryption: SessionRequest (Type 0) ``````````````````````` +Changes: Current SSU2 contains only the block data in the ChaCha section. +With ML-KEM, the ChaCha section will also contain the encrypted PQ public key. + Raw contents: @@ -836,6 +974,10 @@ Unencrypted data (Poly1305 authentication tag not shown): + + | | +----+----+----+----+----+----+----+----+ + | ML-KEM Public Key | + + (see table below for length) + + | | + +----+----+----+----+----+----+----+----+ | Noise payload (block data) | + (length varies) + | see below for allowed blocks | @@ -844,9 +986,26 @@ Unencrypted data (Poly1305 authentication tag not shown): {% endhighlight %} +Sizes, not including IP overhead: + +================ ========= ===== ========= ============= ============= ========== ======= + Type Type Code X len Msg 1 len Msg 1 Enc len Msg 1 Dec len PQ key len pl len +================ ========= ===== ========= ============= ============= ========== ======= +X25519 4 32 80+pl 16+pl pl -- pl +MLKEM512_X25519 5 32 880+pl 816+pl 800+pl 800 pl +MLKEM768_X25519 6 32 1264+pl 1200+pl 1184+pl 1184 pl +MLKEM1024_X25519 7 n/a too big +================ ========= ===== ========= ============= ============= ========== ======= + +Minimum MTU for MLKEM768_X25519: +About 1300 for IPv4 and 1320 for IPv6. + + SessionCreated (Type 1) ```````````````````````` +Changes: Current SSU2 contains only the block data in the ChaCha section. +With ML-KEM, the ChaCha section will also contain the encrypted PQ public key. Raw contents: @@ -909,6 +1068,10 @@ Unencrypted data (Poly1305 auth tag not shown): + + | | +----+----+----+----+----+----+----+----+ + | ML-KEM Ciphertext | + + (see table below for length) + + | | + +----+----+----+----+----+----+----+----+ | Noise payload (block data) | + (length varies) + | see below for allowed blocks | @@ -916,6 +1079,20 @@ Unencrypted data (Poly1305 auth tag not shown): {% endhighlight %} +Sizes, not including IP overhead: + +================ ========= ===== ========= ============= ============= ========== ======= + Type Type Code Y len Msg 2 len Msg 2 Enc len Msg 2 Dec len PQ CT len pl len +================ ========= ===== ========= ============= ============= ========== ======= +X25519 4 32 80+pl 16+pl pl -- pl +MLKEM512_X25519 5 32 880+pl 816+pl 800+pl 800 pl +MLKEM768_X25519 6 32 1264+pl 1200+pl 1184+pl 1184 pl +MLKEM1024_X25519 7 n/a too big +================ ========= ===== ========= ============= ============= ========== ======= + +Minimum MTU for MLKEM768_X25519: +About 1300 for IPv4 and 1320 for IPv6. + SessionConfirmed (Type 2) ````````````````````````` @@ -955,7 +1132,7 @@ This is the split() function, exactly as defined in the Noise spec. Issues `````` -For messages 1 and 2, MLKEM768 would increase packet sizes close to or beyond the 1280 minimum MTU. +For messages 1 and 2, MLKEM768 would increase packet sizes beyond the 1280 minimum MTU. Probably would just not support it for that connection if the MTU was too low. For messages 1 and 2, MLKEM1024 would increase packet sizes beyond 1500 maximum MTU. -- GitLab