From b1fc682e4d107ba4b6ffcd9edf968db540b1b056 Mon Sep 17 00:00:00 2001
From: zzz <zzz@i2pmail.org>
Date: Tue, 21 Jan 2025 16:36:16 -0500
Subject: [PATCH] new proposal 169

---
 i2p2www/spec/proposals/169-pq-crypto.rst | 762 +++++++++++++++++++++++
 1 file changed, 762 insertions(+)
 create mode 100644 i2p2www/spec/proposals/169-pq-crypto.rst

diff --git a/i2p2www/spec/proposals/169-pq-crypto.rst b/i2p2www/spec/proposals/169-pq-crypto.rst
new file mode 100644
index 00000000..8d8eee3a
--- /dev/null
+++ b/i2p2www/spec/proposals/169-pq-crypto.rst
@@ -0,0 +1,762 @@
+===================================
+Post-Quantum Crypto Protocols
+===================================
+.. meta::
+    :author: zzz
+    :created: 2025-01-21
+    :thread: http://zzz.i2p/topics/3294
+    :lastupdated: 2025-01-21
+    :status: Open
+    :target: 0.9.80
+
+.. contents::
+
+
+
+
+
+
+Overview
+========
+
+While research and competition for suitable post-quantum (PQ)
+cryptography has been proceeding for a decade, the choices
+have not become clear until recently.
+
+We started looking at the implications of PQ crypto
+in 2022 [FORUM]_.
+
+SSL added hybrid encryption support in the last two years and it now
+is used for a significant portion of encrypted traffic on the internet [CLOUDFLARE]_.
+
+NIST recently finalized and published the recommended algorithms
+for post-quantum cryptography [NIST-PQ]_.
+
+Both [CLOUDFLARE]_ and [NIST-PQ]_ recommend that migration start immediately.
+See also the 2022 NSA PQ FAQ [NSA-PQ]_.
+I2P should be a leader in security and cryptography.
+Now is the time to implement the recommended algorithms.
+Using our flexible crypto type and signature type system,
+we will add types for hybrid crypto, and for PQ and hybrid signatures.
+
+
+Goals
+=====
+
+- Select PQ-resistant algorithms
+- Add PQ-only and hybrid algorithms to I2P protocols where appropriate
+- Select best variants after implementation, testing, analysis, and research
+- Add support incrementally and with backward compatibility
+
+
+Non-Goals
+=========
+
+TBD
+
+
+
+Design
+======
+
+We will support the NIST FIPS 203 and 204 standards [FIPS203]_ [FIPS204]_
+which are based on, but NOT compatible with,
+CRYSTALS-Kyber and CRYSTALS-Dilithium (versions 3.1, 3, and older).
+
+
+
+Key Exchange
+-------------
+
+We will support key exchange in the following protocols:
+
+=======  ==========  ==============  ===============
+Proto    Noise Type  Support PQ?     Support Hybrid?
+=======  ==========  ==============  ===============
+NTCP2       XK       no              yes
+SSU2        XK       no              yes
+Ratchet     IK       no              yes
+TBM          N       no              no
+NetDB        N       no              no
+=======  ==========  ==============  ===============
+
+PQ KEM provides ephemeral keys only, and does not directly support
+static-key handshakes such as Noise XK and IK.
+While there is some recent research [PQ-WIREGUARD]_ on adapting Wireguard (IK)
+for pure PQ crypto, there are several open questions, and
+this approach is unproven.
+
+Noise N does not use a two-way key exchange and so it is not suitable
+for hybrid encryption.
+
+So we will support hybrid encryption only, for NTCP2, SSU2, and Ratchet.
+We will define the three ML-KEM variants as in [FIPS203]_,
+for 3 new encryption types total.
+Hybrid types will only be defined in combination with X25519.
+
+Overhead will be substantial. Typical message 1 and 2 sizes (for XK and IK)
+are currently around 100 bytes (before any additional payload).
+This will increase by 8x to 15x depending on algorithm.
+
+
+Signatures
+-----------
+
+We will support PQ and hybrid signatures in the following structures:
+
+==========================  ==============  ===============
+Type                        Support PQ?     Support Hybrid?
+==========================  ==============  ===============
+RouterInfo                  yes             yes
+LeaseSet                    yes             yes
+Streaming SYN/SYNACK/Close  yes             yes
+Repliable Datagrams         yes             yes
+I2CP create session msg     yes             yes
+SU3 files                   yes             yes
+X.509 certificates          yes             yes
+Java keystores              yes             yes
+==========================  ==============  ===============
+
+
+So we will support both PQ-only and hybrid signatures.
+We will define the three ML-DSA variants as in [FIPS204]_,
+for 6 new signature types total.
+Hybrid types will only be defined in combination with Ed25519.
+We will use the standard ML-DSA, NOT the pre-hash variants (HashML-DSA).
+
+X.509 certificates and other DER encodings will use the
+composite structures and OIDs defined in [COMPOSITE-SIGS]_.
+
+Overhead will be substantial. Typical Ed25519 destination and router identity
+sizes are 391 bytes.
+These will increase by 3.5x to 6.8x depending on algorithm.
+Ed25519 signatures are 64 bytes.
+These will increase by 38x to 76x depending on algorithm.
+Typical signed RouterInfo, LeaseSet, repliable datagrams, and signed streaming messages are about 1KB.
+These will increase by 3x to 8x depending on algorithm.
+
+As the new destination and router identity types will not contain padding,
+they will not be compressible. Sizes of destinations and router identities
+that are gzipped in-transit will increase by 12x - 38x depending on algorithm.
+
+TODO: Add RSA4096 hybrid types for su3?
+
+
+New Crypto Required
+-------------------
+
+- ML-KEM (formerly CRYSTALS-Kyber) [FIPS203]_
+- ML-DSA (formerly CRYSTALS-Dilithium) [FIPS204]_
+- SHA3-128 (formerly Keccak-256) [FIPS202]_
+- SHA3-256 (formerly Keccak-512) [FIPS202]_
+- SHAKE128 and SHAKE256 (XOF extensions to SHA3-128 and SHA3-256) [FIPS202]_
+
+
+
+Alternatives
+-------------
+
+We will not support [FIPS205]_ (Sphincs+), it is much much slower and bigger than ML-DSA.
+We will not support the upcoming FIPS206 (Falcon), it is not yet standardized.
+
+
+
+Specification
+=============
+
+Common Structures
+-----------------
+
+PublicKey
+----------------
+
+================    ================= ======  =====
+  Type              Public Key Length Since   Usage
+================    ================= ======  =====
+MLKEM512_X25519               32      0.9.xx  See proposal 169, for Leasesets only, not for RIs or Destinations
+MLKEM768_X25519               32      0.9.xx  See proposal 169, for Leasesets only, not for RIs or Destinations
+MLKEM1024_X25519              32      0.9.xx  See proposal 169, for Leasesets only, not for RIs or Destinations
+MLKEM512                     800      0.9.xx  See proposal 169, for handshakes only, not for Leasesets, RIs or Destinations
+MLKEM768                    1184      0.9.xx  See proposal 169, for handshakes only, not for Leasesets, RIs or Destinations
+MLKEM1024                   1568      0.9.xx  See proposal 169, for handshakes only, not for Leasesets, RIs or Destinations
+NULL                           0      0.9.xx  See proposal 169, for destinations with PQ sig types only, not for RIs or Leasesets
+================    ================= ======  =====
+
+Hybrid public keys are the X25519 key.
+KEM public keys are the ephemeral PQ key sent from Alice to Bob.
+
+
+PrivateKey
+----------------
+
+================    ================== ======  =====
+  Type              Private Key Length Since   Usage
+================    ================== ======  =====
+MLKEM512_X25519               32       0.9.xx  See proposal 169, for Leasesets only, not for RIs or Destinations
+MLKEM768_X25519               32       0.9.xx  See proposal 169, for Leasesets only, not for RIs or Destinations
+MLKEM1024_X25519              32       0.9.xx  See proposal 169, for Leasesets only, not for RIs or Destinations
+MLKEM512                    1632       0.9.xx  See proposal 169, for handshakes only, not for Leasesets, RIs or Destinations
+MLKEM768                    2400       0.9.xx  See proposal 169, for handshakes only, not for Leasesets, RIs or Destinations
+MLKEM1024                   3168       0.9.xx  See proposal 169, for handshakes only, not for Leasesets, RIs or Destinations
+NULL                           0       0.9.xx  See proposal 169, for destinations with PQ sig types only, not for RIs or Leasesets
+================    ================== ======  =====
+
+Hybrid private keys are the X25519 key followed by the PQ key.
+KEM private keys are the ciphertext sent from Bob to Alice.
+
+
+
+
+SigningPublicKey
+----------------
+
+
+============================   ==============  ======  =====
+         Type                  Length (bytes)  Since   Usage
+============================   ==============  ======  =====
+MLDSA44_EdDSA_SHA512_Ed25519         1344      0.9.xx  See proposal 169
+MLDSA65_EdDSA_SHA512_Ed25519         1984      0.9.xx  See proposal 169
+MLDSA87_EdDSA_SHA512_Ed25519         2616      0.9.xx  See proposal 169
+MLDSA44                              1312      0.9.xx  See proposal 169
+MLDSA65                              1952      0.9.xx  See proposal 169
+MLDSA87                              2592      0.9.xx  See proposal 169
+============================   ==============  ======  =====
+
+Hybrid signing public keys are the Ed25519 key followed by the PQ key.
+
+
+SigningPrivateKey
+`````````````````
+
+============================   ==============  ======  =====
+         Type                  Length (bytes)  Since   Usage
+============================   ==============  ======  =====
+MLDSA44_EdDSA_SHA512_Ed25519         2592      0.9.xx  See proposal 169
+MLDSA65_EdDSA_SHA512_Ed25519         4064      0.9.xx  See proposal 169
+MLDSA87_EdDSA_SHA512_Ed25519         4928      0.9.xx  See proposal 169
+MLDSA44                              2560      0.9.xx  See proposal 169
+MLDSA65                              4032      0.9.xx  See proposal 169
+MLDSA87                              4896      0.9.xx  See proposal 169
+============================   ==============  ======  =====
+
+Hybrid signing private keys are the Ed25519 key followed by the PQ key.
+
+
+Signature
+``````````
+============================   ==============  ======  =====
+         Type                  Length (bytes)  Since   Usage
+============================   ==============  ======  =====
+MLDSA44_EdDSA_SHA512_Ed25519         2484      0.9.xx  See proposal 169
+MLDSA65_EdDSA_SHA512_Ed25519         4096      0.9.xx  See proposal 169
+MLDSA87_EdDSA_SHA512_Ed25519         4960      0.9.xx  See proposal 169
+MLDSA44                              2420      0.9.xx  See proposal 169
+MLDSA65                              4032      0.9.xx  See proposal 169
+MLDSA87                              4896      0.9.xx  See proposal 169
+============================   ==============  ======  =====
+
+Hybrid signatures are the Ed25519 signature followed by the PQ signature.
+Hybrid signatures are verified by verifying both signatures, and failing
+if either one fails.
+
+
+
+Key Certificates
+````````````````
+
+The defined Signing Public Key types are:
+
+============================  ===========  =======================  ======  =====
+        Type                  Type Code    Total Public Key Length  Since   Usage
+============================  ===========  =======================  ======  =====
+MLDSA44_EdDSA_SHA512_Ed25519      15                 1344           0.9.xx  See proposal 169
+MLDSA65_EdDSA_SHA512_Ed25519      16                 1984           0.9.xx  See proposal 169
+MLDSA87_EdDSA_SHA512_Ed25519      17                 2616           0.9.xx  See proposal 169
+MLDSA44                           12                 1312           0.9.xx  See proposal 169
+MLDSA65                           13                 1952           0.9.xx  See proposal 169
+MLDSA87                           14                 2592           0.9.xx  See proposal 169
+============================  ===========  =======================  ======  =====
+
+
+
+The defined Crypto Public Key types are:
+
+================    ===========  ======================= ======  =====
+  Type              Type Code    Total Public Key Length Since   Usage
+================    ===========  ======================= ======  =====
+MLKEM512_X25519          5                 32            0.9.xx  See proposal 169, for Leasesets only, not for RIs or Destinations
+MLKEM768_X25519          6                 32            0.9.xx  See proposal 169, for Leasesets only, not for RIs or Destinations
+MLKEM1024_X25519         7                 32            0.9.xx  See proposal 169, for Leasesets only, not for RIs or Destinations
+NULL                   255                  0            0.9.xx  See proposal 169, for destinations with PQ sig types only, not for RIs or Leasesets
+================    ===========  ======================= ======  =====
+
+
+Hybrid key types are NEVER included in key certificates; only in leasesets.
+
+The NULL key type is ONLY for destinations or router identities with Hybrid or PQ signature types.
+Never in leasesets.
+This is used to indicate to KeysAndCert parsers that there is no crypto key, and the
+entire 384-byte main section is for the signing key.
+
+
+Destination sizes
+``````````````````
+
+Here are lengths for the new Destination types.
+Enc type for all is NULL (255).
+The entire 384-byte section is used for the first part of the signing public key.
+No padding.
+Total length is 7 + total key length.
+Key certificate length is 4 + excess key length.
+
+Example 1319-byte destination byte stream for MLDSA44:
+
+skey[0:383] 5 (932 >> 8) (932 & 0xff) 00 12 00 255 skey[384:1311]
+
+
+
+============================  ===========  =======================  ======  ======  =====
+        Type                  Type Code    Total Public Key Length  Main    Excess  Total Dest Length
+============================  ===========  =======================  ======  ======  =====
+MLDSA44_EdDSA_SHA512_Ed25519      12                 1344           384      960    1351
+MLDSA65_EdDSA_SHA512_Ed25519      13                 1984           384     1600    1991
+MLDSA87_EdDSA_SHA512_Ed25519      14                 2616           384     2648    2623
+MLDSA44                           15                 1312           384      928    1319
+MLDSA65                           16                 1952           384     1568    1959
+MLDSA87                           17                 2592           384     2208    2599
+============================  ===========  =======================  ======  ======  =====
+
+
+
+RouterIdent sizes
+``````````````````
+
+Here are lengths for the new Destination types.
+Enc type for all is X25519 (4).
+The entire 352-byte section after the X28819 public key is used for the first part of the signing public key.
+No padding.
+Total length is 39 + total key length.
+Key certificate length is 4 + excess key length.
+
+Example 1351-byte router identity byte stream for MLDSA44:
+
+enckey[0:31] skey[0:351] 5 (960 >> 8) (960 & 0xff) 00 12 00 4 skey[352:1311]
+
+
+
+============================  ===========  =======================  ======  ======  =====
+        Type                  Type Code    Total Public Key Length  Main    Excess  Total RouterIdent Length
+============================  ===========  =======================  ======  ======  =====
+MLDSA44_EdDSA_SHA512_Ed25519      12                 1344           352      992    1383
+MLDSA65_EdDSA_SHA512_Ed25519      13                 1984           352     1632    2023
+MLDSA87_EdDSA_SHA512_Ed25519      14                 2616           352     2660    2655
+MLDSA44                           15                 1312           352      960    1351
+MLDSA65                           16                 1952           352     1600    1991
+MLDSA87                           17                 2592           352     2240    2631
+============================  ===========  =======================  ======  ======  =====
+
+
+
+Handshake Patterns
+------------------
+
+Handshakes use [Noise]_ handshake patterns.
+
+The following letter mapping is used:
+
+- e = one-time ephemeral key
+- s = static key
+- p = message payload
+- e1 = one-time ephemeral PQ key, sent from Alice to Bob
+- ekem1 = the KEM ciphertext, sent from Bob to Alice
+
+The following modifications to XK and IK for hybrid forward secrecy (hfs) are:
+
+.. raw:: html
+
+  {% highlight lang='dataspec' %}
+
+XK:                       XKhfs:
+  <- s                      <- s
+  ...                       ...
+  -> e, es, p               -> e, es, e1, p
+  <- e, ee, p               <- e, ee, ekem1, p
+  -> s, se                  -> s, se
+  <- p                      <- p
+  p ->                      p ->
+
+  e1 is encrypted together with the message 1 payload p
+  ekem1 is encrypted together with the message 2 payload p
+
+
+  IK:                       IKhfs:
+  <- s                      <- s
+  ...                       ...
+  -> e, es, s, ss, p       -> e, es, e1, s, ss, p
+  <- tag, e, ee, se, p     <- tag, e, ee, ekem1, se, p
+  <- p                     <- p
+  p ->                     p ->
+
+  e1 is encrypted together with the message 1 alice static key s
+  ekem1 is encrypted with the message 2 ee DH result state FIXME
+
+{% endhighlight %}
+
+
+
+
+Noise Handshake KDF
+---------------------
+
+The KEM 32-byte shared secret is combined or mixHash()ed or HKDF()ed into the
+final Noise shared secret, before split(), for a final 32-byte shared secret.
+Not concatenated with the DH shared secret for a 64-byte final shared secret,
+which is what TLS does [TLS-HYBRID]_.
+
+
+Ratchet
+---------
+
+Noise identifiers:
+
+- "Noise_IKhfselg2_25519+MLKEM512_ChaChaPoly_SHA256"
+- "Noise_IKhfselg2_25519+MLKEM768_ChaChaPoly_SHA256"
+- "Noise_IKhfselg2_25519+MLKEM1024_ChaChaPoly_SHA256"
+
+Details TODO
+
+
+
+NTCP2
+------
+
+Noise identifiers:
+
+- "Noise_XKhfsaesobfse+hs2+hs3_25519+MLKEM512_ChaChaPoly_SHA256"
+- "Noise_XKhfsaesobfse+hs2+hs3_25519+MLKEM768_ChaChaPoly_SHA256"
+- "Noise_XKhfsaesobfse+hs2+hs3_25519+MLKEM1024_ChaChaPoly_SHA256"
+
+Details TODO
+
+SSU2
+----
+
+Noise identifiers:
+
+- "Noise_XKhfschaobfse+hs1+hs2+hs3_25519+MLKEM512_ChaChaPoly_SHA256"
+- "Noise_XKhfschaobfse+hs1+hs2+hs3_25519+MLKEM768_ChaChaPoly_SHA256"
+- "Noise_XKhfschaobfse+hs1+hs2+hs3_25519+MLKEM1024_ChaChaPoly_SHA256"
+
+Details TODO
+
+Issues:
+
+For messages 1 and 2, MLKEM768 would increase packet sizes close to or 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.
+This would require fragmenting messages 1 and 2, and it would be a big complication.
+Probably won't do it.
+
+Other Specs
+-----------
+
+The new maximum Destination size will be 2599 (3468 in base 64).
+
+Update other documents that give guidance on Destination sizes, including:
+
+- SAMv3
+- Bittorrent
+- Developer guidelines
+- Naming / addressbook / jump servers
+- Other docs
+
+
+Overhead Analysis
+=================
+
+Key Exchange
+-------------
+
+Size increase (bytes):
+
+================    ==============  =============
+  Type              Pubkey (Msg 1)  Cipertext (Msg 2)
+================    ==============  =============
+MLKEM512_X25519       +800               +768
+MLKEM768_X25519      +1184              +1088
+MLKEM1024_X25519     +1568              +1568
+================    ==============  =============
+
+Speed:
+
+================    ==============
+  Type              Relative speed
+================    ==============
+X25519 DH/keygen    baseline
+MLKEM512            2.25x faster
+MLKEM768            1.5x faster
+MLKEM1024           1x (same)
+XK                  4x DH (keygen + 3 DH)
+MLKEM512_X25519     4x DH + 2x PQ (keygen + enc/dec) = 4.9x DH = 22% slower
+MLKEM768_X25519     4x DH + 2x PQ (keygen + enc/dec) = 5.3x DH = 32% slower
+MLKEM1024_X25519    4x DH + 2x PQ (keygen + enc/dec) = 6x DH = 50% slower
+================    ==============
+
+Speeds as reported by [CLOUDFLARE]_.
+
+
+Signatures
+-----------
+
+Size:
+
+Typical key, sig, RIdent, Dest sizes or size increases (Ed25519 included for reference)
+assuming X25519 encryption type for RIs.
+Added size for a Router Info, LeaseSet, repliable datagrams, and each of the two streaming (SYN and SYN ACK) packets listed.
+Current Destinations and Leasesets contain repeated padding and are compressible in-transit.
+New types do not contain padding and will not be compressible,
+resulting in a much higher size increase in-transit.
+See design section above.
+
+
+============================  =======  ====  =======  ======  ======  ========  =====
+        Type                  Pubkey   Sig   Key+Sig  RIdent  Dest    RInfo     LS/Streaming/Datagram (each msg)
+============================  =======  ====  =======  ======  ======  ========  =====
+EdDSA_SHA512_Ed25519              32     64     96      391     391   baseline  baseline
+MLDSA44_EdDSA_SHA512_Ed25519    1344   2484   3828     1383    1351   +3412     +3380
+MLDSA65_EdDSA_SHA512_Ed25519    1984   4096   5357     2023    1991   +5668     +5632
+MLDSA87_EdDSA_SHA512_Ed25519    2616   4960   7315     2655    2673   +7160     +7128
+MLDSA44                         1312   2420   3732     1351    1319   +3316     +3284
+MLDSA65                         1952   4032   5261     1991    1959   +5668     +5636
+MLDSA87                         2592   4896   7219     2631    2599   +7072     +7040
+============================  =======  ====  =======  ======  ======  ========  =====
+
+Speed:
+
+====================  ===================  ======
+  Type                Relative speed sign  verify
+====================  ===================  ======
+EdDSA_SHA512_Ed25519        baseline       baseline
+MLDSA44                     5x slower      2x faster
+MLDSA65                       ???          ???
+MLDSA87                       ???          ???
+====================  ===================  ======
+
+
+Speeds as reported by [CLOUDFLARE]_.
+
+
+
+Type Preferences
+=================
+
+While we will define and implement 3 crypto and 6 signature types, we
+plan to measure performance during development, and further analyze
+the effects of increased structure sizes. We will also continue
+to research and monitor developments in other projects and protocols.
+
+After a year or more of development we will attempt to settle on
+a preferred type or default for each use case.
+Selection will require making tradeoffs of bandwidth, CPU, and estimated security level.
+All types may not be suitable or allowed for all use cases.
+
+
+Preliminary preferences are as follows, subject to change:
+
+Encryption: MLKEM768_X25519
+
+Signatures: MLDSA44_EdDSA_SHA512_Ed25519
+
+Preliminary restrictions are as follows, subject to change:
+
+Encryption: MLKEM1024_X25519 not allowed for SSU2
+
+Signatures: MLDSA87 and hybrid variant probably too large;
+MLDSA65 and hybrid variant may be too large
+
+
+
+
+Implementation Notes
+=====================
+
+Reliability
+-----------
+
+Size increase will result in much more tunnel fragmentation
+for NetDB stores, streaming handshakes, and other messages.
+Check for performance and reliability changes.
+
+
+Structure Sizes
+---------------
+
+Find and check any code that limits the byte size of router infos and leasesets.
+
+
+NetDB
+-----
+
+Review and possibly reduce maximum LS/RI stored in RAM or on disk,
+to limit storage increase.
+Increase minimum bandwidth requirements for floodfills?
+
+
+Ratchet
+--------
+Auto-classify/detect on same tunnels?
+If not, destinations would be hybrid-only, no support for regular ratchet.
+
+TODO
+
+
+NTCP2
+-----
+Need different transport address/port,
+would be hard to run both on the same port, we have no header or flags
+for message 1, it is fixed size (before padding).
+So probably a protocol name such as "PQTCP".
+
+TODO
+
+
+SSU2
+-----
+MAY Need different transport address/port,
+but hopefully not, we have a header with flags for message 1.
+Maybe just v=2,3 in the address would be sufficient.
+But we need identifiers for all 3 new flavors: 3a, 3b, 3c?
+
+Check and verify that SSU2 can handle the RI fragmented across
+multiple packets (6-8?)
+
+TODO
+
+
+
+Security Analysis
+=================
+
+Handshakes
+----------
+Probably need to prefer MLKEM768; MLKEM512 is not secure enough.
+
+
+
+
+Signatures
+----------
+MLDSA44 hybrid is preferable to MLDSA65 PQ-only.
+The keys and sig sizes for MLDSA65 and MLDSA87 are probably too big for us, at least at first.
+
+
+
+Compatibility
+===============
+
+
+Priorities and Rollout
+======================
+
+The most valuable data are the end-to-end traffic, encrypted with ratchet.
+As an external observer between tunnel hops, that's encrypted twice more, with tunnel encryption and transport encryption.
+As an external observer between OBEP and IBGW, it's encrypted only once more, with transport encryption.
+As a OBEP or IBGW participant, ratchet is the only encryption.
+
+The most worrisome PQ threat model right now is storing traffic today, for decryption many many years from now.
+A hybrid approach would protect that.
+
+The PQ threat model of breaking the authentication keys in some reasonable period of time
+(say a few months) and then impersonating the authentication or decrypting in almost-real-time,
+is much farther off? And that's when we'd want to migrate to PQC static keys.
+
+So, the earliest PQ threat model is OBEP/IBGW storing traffic for later decryption.
+We should implement hybrid ratchet first.
+
+Ratchet is the highest priority.
+Transports are next.
+Signatures are the lowest priority.
+
+
+======================   ====
+Milestone                Target
+======================   ====
+Ratchet beta             Late 2025
+Select best enc type     Early 2026
+NTCP2 beta               Early 2026
+SSU2 beta                Mid 2026
+Ratchet production       Mid 2026
+Ratchet default          Late 2026
+Signature beta           Late 2026
+NTCP2 production         Late 2026
+SSU2 production          Early 2027
+Select best sig type     Early 2027
+NTCP2 default            Early 2027
+SSU2 default             Mid 2027
+Signature production     Mid 2027
+======================   ====
+
+
+
+Migration
+=========
+
+If we can't support both old and new ratchet protocols on the same tunnels,
+migration will be much more difficult.
+
+TODO
+
+
+
+
+Issues
+=========
+
+TODO
+
+
+
+
+References
+==========
+
+
+.. [CLOUDFLARE]
+   https://blog.cloudflare.com/pq-2024/
+
+.. [COMPOSITE-SIGS]
+   https://datatracker.ietf.org/doc/draft-ietf-lamps-pq-composite-sigs/
+
+.. [FORUM]
+   http://zzz.i2p/topics/3294
+
+.. [FIPS202]
+   https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf
+
+.. [FIPS203]
+   https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.203.pdf
+
+.. [FIPS204]
+   https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.204.pdf
+
+.. [FIPS205]
+   https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.205.pdf
+
+.. [NIST-PQ]
+   https://www.nist.gov/news-events/news/2024/08/nist-releases-first-3-finalized-post-quantum-encryption-standards
+
+.. [Noise]
+   https://noiseprotocol.org/noise.html
+
+.. [Noise-Hybrid]
+   https://github.com/noiseprotocol/noise_hfs_spec/blob/master/output/noise_hfs.pdf
+
+.. [NSA-PQ]
+   https://media.defense.gov/2022/Sep/07/2003071836/-1/-1/0/CSI_CNSA_2.0_FAQ\_.PDF
+
+.. [PQ-WIREGUARD]
+   https://eprint.iacr.org/2020/379.pdf
+
+.. [TLS-HYBRID]
+   https://www.ietf.org/archive/id/draft-tls-westerbaan-xyber768d00-03.html
-- 
GitLab