Cette traduction a été générée par apprentissage automatique et peut ne pas être exacte à 100%. Voir la version anglaise

Protocoles de Cryptographie Post-Quantique

Proposal 169
Ouvrir
Author zzz, orignal, drzed, eyedeekay
Created 2025-01-21
Last Updated 2026-03-12
Target Version 0.9.80

Statut

Protocole / FonctionnalitéStatut
RatchetComplet dans Java I2P et i2pd
NTCP2Bêta T1 2026
SSU2Implémentation bientôt commencée, Bêta T2-T3 2026
MLDSA SigTypesPriorité faible, probablement 2027+

Aperçu

Bien que la recherche et la compétition pour une cryptographie post-quantique (PQ) appropriée se poursuivent depuis une décennie, les choix ne sont devenus clairs que récemment.

Nous avons commencé à examiner les implications de la cryptographie PQ en 2022 zzz.i2p .

Les standards TLS ont ajouté le support du chiffrement hybride au cours des deux dernières années et il est maintenant utilisé pour une portion significative du trafic chiffré sur internet grâce au support dans Chrome et Firefox Cloudflare .

Le NIST a récemment finalisé et publié les algorithmes recommandés pour la cryptographie post-quantique NIST . Plusieurs bibliothèques cryptographiques courantes prennent désormais en charge les standards NIST ou publieront leur support dans un avenir proche.

Cloudflare et NIST recommandent tous deux que la migration commence immédiatement. Voir également la FAQ PQ 2022 de la NSA . I2P devrait être un leader en sécurité et cryptographie. Il est temps maintenant d’implémenter les algorithmes recommandés. En utilisant notre système flexible de types cryptographiques et de types de signature, nous ajouterons des types pour la cryptographie hybride, et pour les signatures PQ et hybrides.

Objectifs

  • Sélectionner des algorithmes résistants PQ
  • Ajouter des algorithmes PQ uniquement et hybrides aux protocoles I2P selon les besoins
  • Définir plusieurs variantes
  • Sélectionner les meilleures variantes après implémentation, tests, analyse et recherche
  • Ajouter le support de manière incrémentale et avec rétrocompatibilité

Non-objectifs

  • Ne pas modifier les protocoles de chiffrement unidirectionnel (Noise N)
  • Ne pas abandonner SHA256, pas menacé à court terme par PQ
  • Ne pas sélectionner les variantes préférées finales à ce stade

Modèle de menace

  • Routers au OBEP ou IBGW, possiblement en collusion, stockant les messages garlic pour un déchiffrement ultérieur (forward secrecy)
  • Observateurs réseau stockant les messages de transport pour un déchiffrement ultérieur (forward secrecy)
  • Participants réseau falsifiant les signatures pour RI, LS, streaming, datagrams, ou autres structures

Protocoles affectés

Nous modifierons les protocoles suivants, approximativement dans l’ordre de développement. Le déploiement global aura probablement lieu de fin 2025 à mi-2027. Consultez la section Priorités et déploiement ci-dessous pour plus de détails.

Protocole / FonctionnalitéStatut
Ratchet hybride MLKEM et LSApprouvé en 2025-06 ; version bêta en 2025-08 ; sortie prévue en 2025-11
NTCP2 hybride MLKEMTesté sur le réseau en production, approuvé en 2026-02 ; cible bêta en 2026-02 ; sortie ciblée en 2026-05
SSU2 hybride MLKEMApprouvé en 2026-02 ; cible bêta en 2026-05 ; sortie ciblée en 2026-08
SigTypes MLDSA 12-14Préliminaire, en attente jusqu’en 2027
Destinations MLDSAPréliminaire, en attente jusqu’en 2027, testé sur le réseau en production, nécessite une mise à jour du réseau pour le support floodfill
SigTypes hybrides 15-17Préliminaire, en attente jusqu’en 2027
Destinations hybrides

Conception

Nous prendrons en charge les standards NIST FIPS 203 et 204 FIPS 203 FIPS 204 qui sont basés sur, mais PAS compatibles avec, CRYSTALS-Kyber et CRYSTALS-Dilithium (versions 3.1, 3, et antérieures).

Échange de clés

Nous prendrons en charge l’échange de clés hybride dans les protocoles suivants :

ProtoType NoiseSupport PQ uniquement ?Support hybride ?
NTCP2XKnonoui
SSU2XKnonoui
RatchetIKnonoui
TBMNnonnon
NetDBNnonnon
PQ KEM fournit uniquement des clés éphémères et ne prend pas directement en charge les échanges de clés statiques tels que Noise XK et IK.

Noise N n’utilise pas d’échange de clés bidirectionnel et n’est donc pas adapté au chiffrement hybride.

Nous ne prendrons donc en charge que le chiffrement hybride, pour NTCP2, SSU2 et Ratchet. Nous définirons les trois variantes ML-KEM comme dans FIPS 203 , pour un total de 3 nouveaux types de chiffrement. Les types hybrides ne seront définis qu’en combinaison avec X25519.

Les nouveaux types de chiffrement sont :

TypeCode
MLKEM512_X255195
MLKEM768_X255196
MLKEM1024_X255197
La surcharge sera substantielle. Les tailles typiques des messages 1 et 2 (pour XK et IK) sont actuellement d’environ 100 octets (avant toute charge utile supplémentaire). Cela augmentera de 8x à 15x selon l’algorithme.

Signatures

Nous prendrons en charge les signatures PQ et hybrides dans les structures suivantes :

Nous prendrons donc en charge les signatures PQ uniquement et hybrides. Nous définirons les trois variantes ML-DSA comme dans FIPS 204 , trois variantes hybrides avec Ed25519, et trois variantes PQ uniquement avec pré-hachage pour les fichiers SU3 seulement, soit 9 nouveaux types de signature au total. Les types hybrides ne seront définis qu’en combinaison avec Ed25519. Nous utiliserons le ML-DSA standard, PAS les variantes de pré-hachage (HashML-DSA), sauf pour les fichiers SU3.

TypeSupport PQ seulement ?Support Hybride ?
RouterInfoouioui
LeaseSetouioui
Streaming SYN/SYNACK/Closeouioui
Repliable Datagramsouioui
Datagram2 (prop. 163)ouioui
I2CP create session msgouioui
SU3 filesouioui
X.509 certificatesouioui
Java keystoresouioui
Nous utiliserons la variante de signature “hedged” ou randomisée, et non la variante “déterministe”, telle que définie dans la section 3.4 de FIPS 204 . Cela garantit que chaque signature est différente, même sur les mêmes données, et fournit une protection supplémentaire contre les attaques par canaux auxiliaires. Voir la section des notes d’implémentation ci-dessous pour des détails supplémentaires sur les choix d’algorithmes, y compris l’encodage et le contexte.

Les nouveaux types de signature sont :

Les certificats X.509 et autres encodages DER utiliseront les structures composites et OID définis dans le projet IETF .

TypeCode
MLDSA4412
MLDSA6513
MLDSA8714
MLDSA44_EdDSA_SHA512_Ed2551915
MLDSA65_EdDSA_SHA512_Ed2551916
MLDSA87_EdDSA_SHA512_Ed2551917
MLDSA44ph18
MLDSA65ph19
MLDSA87ph20
La surcharge sera substantielle. Les tailles typiques des destinations Ed25519 et des identités de router sont de 391 octets. Celles-ci augmenteront de 3,5x à 6,8x selon l’algorithme. Les signatures Ed25519 font 64 octets. Celles-ci augmenteront de 38x à 76x selon l’algorithme. Les RouterInfo signés typiques, leaseSet, datagrammes avec réponse possible, et messages de streaming signés font environ 1KB. Ceux-ci augmenteront de 3x à 8x selon l’algorithme.

Comme les nouveaux types d’identité de destination et de router ne contiendront pas de remplissage, ils ne seront pas compressibles. Les tailles des destinations et des identités de router qui sont compressées en gzip pendant le transit augmenteront de 12x à 38x selon l’algorithme.

Pour les Destinations, les nouveaux types de signature sont pris en charge avec tous les types de chiffrement dans le leaseSet. Définissez le type de chiffrement dans le certificat de clé sur NONE (255).

Combinaisons légales

Pour les RouterIdentities, le type de chiffrement ElGamal est déprécié. Les nouveaux types de signature ne sont pris en charge qu’avec le chiffrement X25519 (type 4). Les nouveaux types de chiffrement seront indiqués dans les RouterAddresses. Le type de chiffrement dans le certificat de clé continuera d’être le type 4.

Les vecteurs de test pour SHA3-256, SHAKE128 et SHAKE256 sont disponibles sur NIST .

Nouvelle cryptographie requise

  • ML-KEM (anciennement CRYSTALS-Kyber) FIPS 203
  • ML-DSA (anciennement CRYSTALS-Dilithium) FIPS 204
  • SHA3-128 (anciennement Keccak-256) FIPS 202 Utilisé uniquement pour SHAKE128
  • SHA3-256 (anciennement Keccak-512) FIPS 202
  • SHAKE128 et SHAKE256 (extensions XOF pour SHA3-128 et SHA3-256) FIPS 202

Notez que la bibliothèque Java bouncycastle prend en charge tout ce qui précède. La prise en charge de la bibliothèque C++ est dans OpenSSL 3.5 OpenSSL .

Nous ne prendrons pas en charge FIPS 205 (Sphincs+), il est beaucoup plus lent et volumineux que ML-DSA. Nous ne prendrons pas en charge le prochain FIPS206 (Falcon), il n’est pas encore standardisé. Nous ne prendrons pas en charge NTRU ou d’autres candidats PQ qui n’ont pas été standardisés par le NIST.

Alternatives

Il existe des recherches paper sur l’adaptation de Wireguard (IK) pour la cryptographie PQ pure, mais il y a plusieurs questions ouvertes dans cet article. Plus tard, cette approche a été implémentée sous le nom de Rosenpass Rosenpass whitepaper pour PQ Wireguard.

Rosenpass

Rosenpass utilise un handshake similaire à Noise KK avec des clés statiques Classic McEliece 460896 pré-partagées (500 Ko chacune) et des clés éphémères Kyber-512 (essentiellement MLKEM-512). Comme les textes chiffrés Classic McEliece ne font que 188 octets, et que les clés publiques et textes chiffrés Kyber-512 ont une taille raisonnable, les deux messages de handshake tiennent dans un MTU UDP standard. La clé partagée de sortie (osk) du handshake PQ KK est utilisée comme clé pré-partagée d’entrée (psk) pour le handshake Wireguard IK standard. Il y a donc deux handshakes complets au total, un purement PQ et un purement X25519.

Nous ne pouvons faire aucune de ces choses pour remplacer nos handshakes XK et IK car :

Il y a beaucoup de bonnes informations dans le livre blanc, et nous l’examinerons pour des idées et de l’inspiration. TODO.

  • Nous ne pouvons pas faire KK, Bob n’a pas la clé statique d’Alice
  • Les clés statiques de 500KB sont bien trop importantes
  • Nous ne voulons pas d’un aller-retour supplémentaire

Mettez à jour les sections et tableaux dans le document des structures communes /docs/specs/common-structures/ comme suit :

Spécification

Structures communes

Les nouveaux types de clés publiques sont :

PublicKey

Les clés publiques hybrides sont la clé X25519. Les clés publiques KEM sont la clé PQ éphémère envoyée d’Alice à Bob. L’encodage et l’ordre des octets sont définis dans FIPS 203 .

TypeLongueur de Clé PubliqueDepuisUsage
MLKEM512_X25519320.9.xxVoir proposition 169, pour leasesets uniquement, pas pour les RI ou Destinations
MLKEM768_X25519320.9.xxVoir proposition 169, pour leasesets uniquement, pas pour les RI ou Destinations
MLKEM1024_X25519320.9.xxVoir proposition 169, pour leasesets uniquement, pas pour les RI ou Destinations
MLKEM5128000.9.xxVoir proposition 169, pour handshakes uniquement, pas pour leasesets, RI ou Destinations
MLKEM76811840.9.xxVoir proposition 169, pour handshakes uniquement, pas pour leasesets, RI ou Destinations
MLKEM102415680.9.xxVoir proposition 169, pour handshakes uniquement, pas pour leasesets, RI ou Destinations
MLKEM512_CT7680.9.xxVoir proposition 169, pour handshakes uniquement, pas pour leasesets, RI ou Destinations
MLKEM768_CT10880.9.xxVoir proposition 169, pour handshakes uniquement, pas pour leasesets, RI ou Destinations
MLKEM1024_CT15680.9.xxVoir proposition 169, pour handshakes uniquement, pas pour leasesets, RI ou Destinations
NONE00.9.xxVoir proposition 169, pour destinations avec types de signature PQ uniquement, pas pour RI ou leasesets
Les clés MLKEM*_CT ne sont pas vraiment des clés publiques, elles sont le “texte chiffré” envoyé de Bob à Alice dans la négociation Noise. Elles sont listées ici par souci d’exhaustivité.

Les nouveaux types de clés privées sont :

PrivateKey

Les clés privées hybrides sont les clés X25519. Les clés privées KEM sont uniquement pour Alice. L’encodage KEM et l’ordre des octets sont définis dans FIPS 203 .

TypeLongueur de clé privéeDepuisUtilisation
MLKEM512_X25519320.9.xxVoir proposition 169, pour les leasesets uniquement, pas pour les RI ou Destinations
MLKEM768_X25519320.9.xxVoir proposition 169, pour les leasesets uniquement, pas pour les RI ou Destinations
MLKEM1024_X25519320.9.xxVoir proposition 169, pour les leasesets uniquement, pas pour les RI ou Destinations
MLKEM51216320.9.xxVoir proposition 169, pour les négociations uniquement, pas pour les leasesets, RI ou Destinations
MLKEM76824000.9.xxVoir proposition 169, pour les négociations uniquement, pas pour les leasesets, RI ou Destinations
MLKEM102431680.9.xxVoir proposition 169, pour les négociations uniquement, pas pour les leasesets, RI ou Destinations
Les nouveaux types de clés publiques de signature sont :

SigningPublicKey

Les clés publiques de signature hybrides sont la clé Ed25519 suivie de la clé PQ, comme dans le brouillon IETF . L’encodage et l’ordre des octets sont définis dans FIPS 204 .

TypeLongueur (octets)DepuisUtilisation
MLDSA4413120.9.xxVoir proposition 169
MLDSA6519520.9.xxVoir proposition 169
MLDSA8725920.9.xxVoir proposition 169
MLDSA44_EdDSA_SHA512_Ed2551913440.9.xxVoir proposition 169
MLDSA65_EdDSA_SHA512_Ed2551919840.9.xxVoir proposition 169
MLDSA87_EdDSA_SHA512_Ed2551926240.9.xxVoir proposition 169
MLDSA44ph13440.9.xxUniquement pour les fichiers SU3, pas pour les structures netDb
MLDSA65ph19840.9.xxUniquement pour les fichiers SU3, pas pour les structures netDb
MLDSA87ph26240.9.xxUniquement pour les fichiers SU3, pas pour les structures netDb
Les nouveaux types de clés privées de signature sont :

SigningPrivateKey

Les clés privées de signature hybrides sont la clé Ed25519 suivie de la clé PQ, comme dans le brouillon IETF . L’encodage et l’ordre des octets sont définis dans FIPS 204 .

TypeLongueur (octets)DepuisUsage
MLDSA4425600.9.xxVoir proposition 169
MLDSA6540320.9.xxVoir proposition 169
MLDSA8748960.9.xxVoir proposition 169
MLDSA44_EdDSA_SHA512_Ed2551925920.9.xxVoir proposition 169
MLDSA65_EdDSA_SHA512_Ed2551940640.9.xxVoir proposition 169
MLDSA87_EdDSA_SHA512_Ed2551949280.9.xxVoir proposition 169
MLDSA44ph25920.9.xxUniquement pour les fichiers SU3, pas pour les structures netDb. Voir proposition 169
MLDSA65ph40640.9.xxUniquement pour les fichiers SU3, pas pour les structures netDb. Voir proposition 169
MLDSA87ph49280.9.xxUniquement pour les fichiers SU3, pas pour les structures netDb. Voir proposition 169
Les nouveaux types de signature sont :

Signature

Les signatures hybrides sont la signature Ed25519 suivie de la signature PQ, comme dans le projet IETF . Les signatures hybrides sont vérifiées en vérifiant les deux signatures, et échouent si l’une d’entre elles échoue. L’encodage et l’ordre des octets sont définis dans FIPS 204 .

TypeLongueur (octets)DepuisUsage
MLDSA4424200.9.xxVoir proposition 169
MLDSA6533090.9.xxVoir proposition 169
MLDSA8746270.9.xxVoir proposition 169
MLDSA44_EdDSA_SHA512_Ed2551924840.9.xxVoir proposition 169
MLDSA65_EdDSA_SHA512_Ed2551933730.9.xxVoir proposition 169
MLDSA87_EdDSA_SHA512_Ed2551946910.9.xxVoir proposition 169
MLDSA44ph24840.9.xxUniquement pour les fichiers SU3, pas pour les structures netDb. Voir proposition 169
MLDSA65ph33730.9.xxUniquement pour les fichiers SU3, pas pour les structures netDb. Voir proposition 169
MLDSA87ph46910.9.xxUniquement pour les fichiers SU3, pas pour les structures netDb. Voir proposition 169
Les nouveaux types de clés publiques de signature sont :

Certificats de clés

Les clés publiques de signature hybrides sont la clé Ed25519 suivie de la clé PQ, comme dans le brouillon IETF . L’encodage et l’ordre des octets sont définis dans FIPS 204 .

TypeCode de TypeLongueur Totale de la Clé PubliqueDepuisUtilisation
MLDSA441213120.9.xxVoir proposition 169
MLDSA651319520.9.xxVoir proposition 169
MLDSA871425920.9.xxVoir proposition 169
MLDSA44_EdDSA_SHA512_Ed255191513440.9.xxVoir proposition 169
MLDSA65_EdDSA_SHA512_Ed255191619840.9.xxVoir proposition 169
MLDSA87_EdDSA_SHA512_Ed255191726240.9.xxVoir proposition 169
MLDSA44ph18n/a0.9.xxUniquement pour les fichiers SU3
MLDSA65ph19n/a0.9.xxUniquement pour les fichiers SU3
MLDSA87ph20n/a0.9.xxUniquement pour les fichiers SU3
Les nouveaux types de clés publiques cryptographiques sont :
TypeCode de TypeLongueur Totale de Clé PubliqueDepuisUtilisation
MLKEM512_X255195320.9.xxVoir proposition 169, pour les leaseSets uniquement, pas pour les RI ou Destinations
MLKEM768_X255196320.9.xxVoir proposition 169, pour les leaseSets uniquement, pas pour les RI ou Destinations
MLKEM1024_X255197320.9.xxVoir proposition 169, pour les leaseSets uniquement, pas pour les RI ou Destinations
NONE25500.9.xxVoir proposition 169
Les types de clés hybrides ne sont JAMAIS inclus dans les certificats de clé ; seulement dans les leaseSets.

Pour les destinations avec des types de signature Hybrid ou PQ, utilisez NONE (type 255) pour le type de chiffrement, mais il n’y a pas de clé cryptographique, et toute la section principale de 384 octets est destinée à la clé de signature.

Tailles de destination

Voici les longueurs pour les nouveaux types de Destination. Le type de chiffrement pour tous est NONE (type 255) et la longueur de la clé de chiffrement est traitée comme 0. Toute la section de 384 octets est utilisée pour la première partie de la clé publique de signature. NOTE : Ceci est différent de la spécification pour les types de signature ECDSA_SHA512_P521 et RSA, où nous avons maintenu la clé ElGamal de 256 octets dans la destination même si elle n’était pas utilisée.

Aucun remplissage. La longueur totale est de 7 + longueur totale de la clé. La longueur du certificat de clé est de 4 + longueur de clé excédentaire.

Exemple de flux d’octets de destination de 1319 octets pour MLDSA44 :

skey[0:383] 5 (932 » 8) (932 & 0xff) 00 12 00 255 skey[384:1311]

TypeCode TypeLongueur Totale de Clé PubliquePrincipalExcèsLongueur Totale Dest
MLDSA441213123849281319
MLDSA6513195238415681959
MLDSA8714259238422082599
MLDSA44_EdDSA_SHA512_Ed255191513443849601351
MLDSA65_EdDSA_SHA512_Ed2551916198438416001991
MLDSA87_EdDSA_SHA512_Ed2551917262438422402631

Tailles des RouterIdent

Voici les longueurs pour les nouveaux types de Destination. Le type de chiffrement pour tous est X25519 (type 4). La section entière de 352 octets après la clé publique X25519 est utilisée pour la première partie de la clé publique de signature. Pas de remplissage. La longueur totale est 39 + longueur totale de la clé. La longueur du certificat de clé est 4 + longueur excédentaire de la clé.

Exemple de flux d’octets d’identité de router de 1351 octets pour MLDSA44 :

enckey[0:31] skey[0:351] 5 (960 » 8) (960 & 0xff) 00 12 00 4 skey[352:1311]

TypeCode de TypeLongueur Totale de Clé PubliquePrincipalExcèsLongueur Totale de RouterIdent
MLDSA441213123529601351
MLDSA6513195235216001991
MLDSA8714259235222402631
MLDSA44_EdDSA_SHA512_Ed255191513443529921383
MLDSA65_EdDSA_SHA512_Ed2551916198435216322023
MLDSA87_EdDSA_SHA512_Ed2551917262435222722663

Modèles de négociation

Les handshakes utilisent les modèles de handshake du Noise Protocol .

Le mappage de lettres suivant est utilisé :

  • e = clé éphémère à usage unique
  • s = clé statique
  • p = charge utile du message
  • e1 = clé PQ éphémère à usage unique, envoyée d’Alice à Bob
  • ekem1 = le texte chiffré KEM, envoyé de Bob à Alice

Les modifications suivantes à XK et IK pour le secret de transmission hybride (hfs) sont spécifiées dans la spécification Noise HFS section 5 :

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 ->


  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 and ekem1 are encrypted. See pattern definitions below.
  NOTE: e1 and ekem1 are different sizes (unlike X25519)

Le motif e1 est défini comme suit, tel que spécifié dans la section 4 de la spécification Noise HFS :

For Alice:
  (encap_key, decap_key) = PQ_KEYGEN()

  // EncryptAndHash(encap_key)
  ciphertext = ENCRYPT(k, n, encap_key, ad)
  n++
  MixHash(ciphertext)

  For Bob:

  // DecryptAndHash(ciphertext)
  encap_key = DECRYPT(k, n, ciphertext, ad)
  n++
  MixHash(ciphertext)

Le motif ekem1 est défini comme suit, tel que spécifié dans la section 4 de la spécification Noise HFS :

For Bob:

  (kem_ciphertext, kem_shared_key) = ENCAPS(encap_key)

  // EncryptAndHash(kem_ciphertext)
  ciphertext = ENCRYPT(k, n, kem_ciphertext, ad)
  MixHash(ciphertext)

  // MixKey
  MixKey(kem_shared_key)


  For Alice:

  // DecryptAndHash(ciphertext)
  kem_ciphertext = DECRYPT(k, n, ciphertext, ad)
  MixHash(ciphertext)

  // MixKey
  kem_shared_key = DECAPS(kem_ciphertext, decap_key)
  MixKey(kem_shared_key)

KDF de handshake Noise

Problèmes

  • Devrions-nous changer la fonction de hachage de handshake ? Voir comparaison . SHA256 n’est pas vulnérable à PQ, mais si nous voulons mettre à niveau notre fonction de hachage, c’est le moment, pendant que nous changeons d’autres choses. La proposition SSH IETF actuelle brouillon IETF est d’utiliser MLKEM768 avec SHA256, et MLKEM1024 avec SHA384. Cette proposition inclut une discussion des considérations de sécurité.
  • Devrions-nous arrêter d’envoyer des données ratchet 0-RTT (autres que le leaseSet) ?
  • Devrions-nous passer le ratchet d’IK à XK si nous n’envoyons pas de données 0-RTT ?

Aperçu

Cette section s’applique aux protocoles IK et XK.

Le handshake hybride est défini dans la spécification Noise HFS . Le premier message, d’Alice vers Bob, contient e1, la clé d’encapsulation, avant la charge utile du message. Celle-ci est traitée comme une clé statique supplémentaire ; appelez EncryptAndHash() dessus (en tant qu’Alice) ou DecryptAndHash() (en tant que Bob). Ensuite, traitez la charge utile du message comme d’habitude.

Le second message, de Bob à Alice, contient ekem1, le texte chiffré, avant la charge utile du message. Ceci est traité comme une clé statique supplémentaire ; appelez EncryptAndHash() dessus (en tant que Bob) ou DecryptAndHash() (en tant qu’Alice). Ensuite, calculez la kem_shared_key et appelez MixKey(kem_shared_key). Puis traitez la charge utile du message comme d’habitude.

Opérations ML-KEM définies

Nous définissons les fonctions suivantes correspondant aux blocs de construction cryptographiques utilisés tels que définis dans FIPS 203 .

(encap_key, decap_key) = PQ_KEYGEN()

Alice creates the encapsulation and decapsulation keys
The encapsulation key is sent in message 1.
encap_key and decap_key sizes vary based on ML-KEM variant.

(ciphertext, kem_shared_key) = ENCAPS(encap_key)

Bob calculates the ciphertext and shared key,
using the ciphertext received in message 1.
The ciphertext is sent in message 2.
ciphertext size varies based on ML-KEM variant.
The kem_shared_key is always 32 bytes.

kem_shared_key = DECAPS(ciphertext, decap_key)

Alice calculates the shared key,
using the ciphertext received in message 2.
The kem_shared_key is always 32 bytes.

Notez que la encap_key et le ciphertext sont tous deux chiffrés à l’intérieur des blocs ChaCha/Poly dans les messages 1 et 2 de la négociation Noise. Ils seront déchiffrés dans le cadre du processus de négociation.

La kem_shared_key est mélangée dans la clé de chaînage avec MixHash(). Voir ci-dessous pour les détails.

KDF d’Alice pour le Message 1

Pour XK : Après le motif de message ’es’ et avant la charge utile, ajouter :

OU

Pour IK : Après le motif de message ’es’ et avant le motif de message ’s’, ajouter :

This is the "e1" message pattern:
  (encap_key, decap_key) = PQ_KEYGEN()

  // EncryptAndHash(encap_key)
  // AEAD parameters
  k = keydata[32:63]
  n = 0
  ad = h
  ciphertext = ENCRYPT(k, n, encap_key, ad)
  n++

  // MixHash(ciphertext)
  h = SHA256(h || ciphertext)


  End of "e1" message pattern.

  NOTE: For the next section (payload for XK or static key for IK),
  the keydata and chain key remain the same,
  and n now equals 1 (instead of 0 for non-hybrid).

KDF de Bob pour le Message 1

Pour XK : Après le motif de message ’es’ et avant la charge utile, ajouter :

OU

Pour IK : Après le motif de message ’es’ et avant le motif de message ’s’, ajouter :

This is the "e1" message pattern:

  // DecryptAndHash(encap_key_section)
  // AEAD parameters
  k = keydata[32:63]
  n = 0
  ad = h
  encap_key = DECRYPT(k, n, encap_key_section, ad)
  n++

  // MixHash(encap_key_section)
  h = SHA256(h || encap_key_section)

  End of "e1" message pattern.

  NOTE: For the next section (payload for XK or static key for IK),
  the keydata and chain key remain the same,
  and n now equals 1 (instead of 0 for non-hybrid).

KDF de Bob pour le Message 2

Pour XK : Après le motif de message ’ee’ et avant la charge utile, ajouter :

OU

Pour IK : Après le motif de message ’ee’ et avant le motif de message ‘se’, ajouter :

This is the "ekem1" message pattern:

  (kem_ciphertext, kem_shared_key) = ENCAPS(encap_key)

  // EncryptAndHash(kem_ciphertext)
  // AEAD parameters
  k = keydata[32:63]
  n = 0
  ad = h
  ciphertext = ENCRYPT(k, n, kem_ciphertext, ad)

  // MixHash(ciphertext)
  h = SHA256(h || ciphertext)

  // MixKey(kem_shared_key)
  keydata = HKDF(chainKey, kem_shared_key, "", 64)
  chainKey = keydata[0:31]

  End of "ekem1" message pattern.

  // AEAD parameters for payload section
  ... as in standard SSU2 ...
  k = keydata[32:63]
  ...

Alice KDF pour le Message 2

Après le motif de message ’ee’ (et avant le motif de message ‘ss’ pour IK), ajouter :

This is the "ekem1" message pattern:

  // DecryptAndHash(kem_ciphertext_section)
  // AEAD parameters
  k = keydata[32:63]
  n = 0
  ad = h
  kem_ciphertext = DECRYPT(k, n, kem_ciphertext_section, ad)

  // MixHash(kem_ciphertext_section)
  h = SHA256(h || kem_ciphertext_section)

  // MixKey(kem_shared_key)
  kem_shared_key = DECAPS(kem_ciphertext, decap_key)
  keydata = HKDF(chainKey, kem_shared_key, "", 64)
  chainKey = keydata[0:31]

  End of "ekem1" message pattern.

  // AEAD parameters for payload section
  ... as in standard SSU2 ...
  k = keydata[32:63]
  ...

KDF pour le Message 3 (XK uniquement)

inchangé

KDF pour split()

inchangé

Ratchet

Mettre à jour la spécification ECIES-Ratchet /docs/specs/ecies/ comme suit :

Identificateurs Noise

  • “Noise_IKhfselg2_25519+MLKEM512_ChaChaPoly_SHA256”
  • “Noise_IKhfselg2_25519+MLKEM768_ChaChaPoly_SHA256”
  • “Noise_IKhfselg2_25519+MLKEM1024_ChaChaPoly_SHA256”

1b) Nouveau format de session (avec liaison)

Changements : Le ratchet actuel contenait la clé statique dans la première section ChaCha, et la charge utile dans la seconde section. Avec ML-KEM, il y a maintenant trois sections. La première section contient la clé publique PQ chiffrée. La deuxième section contient la clé statique. La troisième section contient la charge utile.

Format chiffré :

  +----+----+----+----+----+----+----+----+
  |                                       |
  +                                       +
  |   New Session Ephemeral Public Key    |
  +             32 bytes                  +
  |     Encoded with Elligator2           |
  +                                       +
  |                                       |
  +----+----+----+----+----+----+----+----+
  |                                       |
  +           ML-KEM encap_key            +
  |       ChaCha20 encrypted data         |
  +      (see table below for length)     +
  |                                       |
  ~                                       ~
  |                                       |
  +----+----+----+----+----+----+----+----+
  |  Poly1305 Message Authentication Code |
  +    (MAC) for encap_key Section        +
  |             16 bytes                  |
  +----+----+----+----+----+----+----+----+
  |                                       |
  +           X25519 Static Key           +
  |       ChaCha20 encrypted data         |
  +             32 bytes                  +
  |                                       |
  +                                       +
  |                                       |
  +----+----+----+----+----+----+----+----+
  |  Poly1305 Message Authentication Code |
  +    (MAC) for Static Key Section       +
  |             16 bytes                  |
  +----+----+----+----+----+----+----+----+
  |                                       |
  +            Payload Section            +
  |       ChaCha20 encrypted data         |
  ~                                       ~
  |                                       |
  +                                       +
  |                                       |
  +----+----+----+----+----+----+----+----+
  |  Poly1305 Message Authentication Code |
  +         (MAC) for Payload Section     +
  |             16 bytes                  |
  +----+----+----+----+----+----+----+----+

Format décrypté :

Payload Part 1:

  +----+----+----+----+----+----+----+----+
  |                                       |
  +       ML-KEM encap_key                +
  |                                       |
  +      (see table below for length)     +
  |                                       |
  ~                                       ~
  |                                       |
  +----+----+----+----+----+----+----+----+

  Payload Part 2:

  +----+----+----+----+----+----+----+----+
  |                                       |
  +       X25519 Static Key               +
  |                                       |
  +      (32 bytes)                       +
  |                                       |
  +                                       +
  |                                       |
  +----+----+----+----+----+----+----+----+

  Payload Part 3:

  +----+----+----+----+----+----+----+----+
  |                                       |
  +            Payload Section            +
  |                                       |
  ~                                       ~
  |                                       |
  +                                       +
  |                                       |
  +----+----+----+----+----+----+----+----+

Tailles :

TypeCode TypeLong XLong Msg 1Long Msg 1 ChifLong Msg 1 DéchifLong clé PQLong pl
X2551943296+pl64+plplpl
MLKEM512_X25519532912+pl880+pl800+pl800pl
MLKEM768_X255196321296+pl1360+pl1184+pl1184pl
MLKEM1024_X255197321680+pl1648+pl1568+pl1568pl
Notez que la charge utile doit contenir un bloc DateTime, donc la taille minimale de la charge utile est de 7. Les tailles minimales du message 1 peuvent être calculées en conséquence.

1g) Format de réponse pour nouvelle session

Modifications : Le ratchet actuel a une charge utile vide pour la première section ChaCha, et la charge utile dans la deuxième section. Avec ML-KEM, il y a maintenant trois sections. La première section contient le texte chiffré PQ chiffré. La deuxième section a une charge utile vide. La troisième section contient la charge utile.

Format chiffré :

  +----+----+----+----+----+----+----+----+
  |       Session Tag   8 bytes           |
  +----+----+----+----+----+----+----+----+
  |                                       |
  +        Ephemeral Public Key           +
  |                                       |
  +            32 bytes                   +
  |     Encoded with Elligator2           |
  +                                       +
  |                                       |
  +----+----+----+----+----+----+----+----+
  |                                       |
  +                                       +
  | ChaCha20 encrypted ML-KEM ciphertext  |
  +      (see table below for length)     +
  ~                                       ~
  +                                       +
  |                                       |
  +----+----+----+----+----+----+----+----+
  |  Poly1305 Message Authentication Code |
  +  (MAC) for ciphertext Section         +
  |             16 bytes                  |
  +----+----+----+----+----+----+----+----+
  |  Poly1305 Message Authentication Code |
  +  (MAC) for key Section (no data)      +
  |             16 bytes                  |
  +----+----+----+----+----+----+----+----+
  |                                       |
  +            Payload Section            +
  |       ChaCha20 encrypted data         |
  ~                                       ~
  |                                       |
  +                                       +
  |                                       |
  +----+----+----+----+----+----+----+----+
  |  Poly1305 Message Authentication Code |
  +         (MAC) for Payload Section     +
  |             16 bytes                  |
  +----+----+----+----+----+----+----+----+

Format décrypté :

Payload Part 1:


  +----+----+----+----+----+----+----+----+
  |                                       |
  +       ML-KEM ciphertext               +
  |                                       |
  +      (see table below for length)     +
  |                                       |
  ~                                       ~
  |                                       |
  +----+----+----+----+----+----+----+----+

  Payload Part 2:

  empty

  Payload Part 3:

  +----+----+----+----+----+----+----+----+
  |                                       |
  +            Payload Section            +
  |                                       |
  ~                                       ~
  |                                       |
  +                                       +
  |                                       |
  +----+----+----+----+----+----+----+----+

Tailles :

TypeCode TypeY lenMsg 2 lenMsg 2 Enc lenMsg 2 Dec lenPQ CT lenopt len
X2551943272+pl32+plplpl
MLKEM512_X25519532856+pl816+pl768+pl768pl
MLKEM768_X255196321176+pl1136+pl1088+pl1088pl
MLKEM1024_X255197321656+pl1616+pl1568+pl1568pl
Notez que bien que le message 2 ait normalement une charge utile non nulle, la spécification ratchet /docs/specs/ecies/ ne l’exige pas, donc la taille minimale de la charge utile est 0. Les tailles minimales du message 2 peuvent être calculées en conséquence.

NTCP2

Mettre à jour la spécification NTCP2 /docs/specs/ntcp2/ comme suit :

Identifiants Noise

  • “Noise_XKhfsaesobfse+hs2+hs3_25519+MLKEM512_ChaChaPoly_SHA256”
  • “Noise_XKhfsaesobfse+hs2+hs3_25519+MLKEM768_ChaChaPoly_SHA256”
  • “Noise_XKhfsaesobfse+hs2+hs3_25519+MLKEM1024_ChaChaPoly_SHA256”

1) SessionRequest

Modifications : Le NTCP2 actuel ne contient que les options de la section ChaCha. Avec ML-KEM, la section ChaCha contiendra également la clé publique PQ chiffrée.

Afin que NTCP2 PQ et non-PQ puissent être pris en charge sur la même adresse et le même port de router, nous utilisons le bit le plus significatif de la valeur X (clé publique éphémère X25519) pour marquer qu’il s’agit d’une connexion PQ. Ce bit est toujours désactivé pour les connexions non-PQ.

Pour Alice, après que le message soit chiffré par Noise, mais avant l’obfuscation AES de X, définir X[31] |= 0x7f.

Pour Bob, après la dé-obfuscation AES de X, tester X[31] & 0x80. Si le bit est défini, l’effacer avec X[31] &= 0x7f, et déchiffrer via Noise comme une connexion PQ. Si le bit n’est pas défini, déchiffrer via Noise comme une connexion non-PQ comme d’habitude.

Pour PQ NTCP2 annoncé sur une adresse et un port de router différents, cela n’est pas requis.

Pour des informations supplémentaires, voir la section Adresses publiées ci-dessous.

Contenu brut :

  +----+----+----+----+----+----+----+----+
  |        MS bit set to 1 and then       |
  +        obfuscated with RH_B           +
  |       AES-CBC-256 encrypted X         |
  +             (32 bytes)                +
  |                                       |
  +                                       +
  |                                       |
  +----+----+----+----+----+----+----+----+
  |   ChaChaPoly encrypted data (MLKEM)   |
  +      (see table below for length)     +
  |   k defined in KDF for message 1      |
  +   n = 0                               +
  |   see KDF for associated data         |
  ~                                       ~
  +----+----+----+----+----+----+----+----+
  |                                       |
  +        Poly1305 MAC (16 bytes)        +
  |                                       |
  +----+----+----+----+----+----+----+----+
  |                                       |
  +                                       +
  |   ChaCha20 encrypted data (options)   |
  +         16 bytes                      +
  |   k defined in KDF for message 1      |
  +   n = 0                               +
  |   see KDF for associated data         |
  +----+----+----+----+----+----+----+----+
  |                                       |
  +        Poly1305 MAC (16 bytes)        +
  |                                       |
  +----+----+----+----+----+----+----+----+
  |     unencrypted authenticated         |
  ~         padding (optional)            ~
  |     length defined in options block   |
  +----+----+----+----+----+----+----+----+

  Same as current specification except add a second ChaChaPoly frame

Données non chiffrées (étiquette d’authentification Poly1305 non affichée) :

  +----+----+----+----+----+----+----+----+
  |                                       |
  +                                       +
  |                   X                   |
  +              (32 bytes)               +
  |                                       |
  +                                       +
  |                                       |
  +----+----+----+----+----+----+----+----+
  |           ML-KEM encap_key            |
  +      (see table below for length)     +
  |                                       |
  +----+----+----+----+----+----+----+----+
  |               options                 |
  +              (16 bytes)               +
  |                                       |
  +----+----+----+----+----+----+----+----+
  |     unencrypted authenticated         |
  +         padding (optional)            +
  |     length defined in options block   |
  ~               .   .   .               ~
  |                                       |
  +----+----+----+----+----+----+----+----+

Note : le champ version dans le bloc d’options du message 1 doit être défini sur 2, même pour les connexions PQ.

Tailles :

TypeCode TypeX lenMsg 1 lenMsg 1 Enc lenMsg 1 Dec lenPQ key lenopt len
X2551943264+pad321616
MLKEM512_X25519532880+pad84881680016
MLKEM768_X255196321264+pad12321200118416
MLKEM1024_X255197321648+pad16161584156816
Note : Les codes de type sont uniquement à usage interne. Les routeurs resteront de type 4, et la prise en charge sera indiquée dans les adresses de routeur.

2) SessionCreated

Contenu brut :

Contenu brut :

  +----+----+----+----+----+----+----+----+
  |                                       |
  +        obfuscated with RH_B           +
  |       AES-CBC-256 encrypted Y         |
  +              (32 bytes)               +
  |                                       |
  +                                       +
  |                                       |
  +----+----+----+----+----+----+----+----+
  |   ChaCha20 encrypted data (MLKEM)     |
  -      (see table below for length)     -
  +   k defined in KDF for message 2      +
  |  (before mixKey)                      |
  +  n = 0; see KDF for associated data   +
  |                                       |
  +----+----+----+----+----+----+----+----+
  |                                       |
  +        Poly1305 MAC (16 bytes)        +
  |                                       |
  +----+----+----+----+----+----+----+----+
  |   ChaCha20 encrypted data (options)   |
  +         16 bytes                      +
  +   k defined in KDF for message 2      +
  |  (after mixKey)                       |
  +  n = 0; see KDF for associated data   +
  |                                       |
  +----+----+----+----+----+----+----+----+
  |                                       |
  +        Poly1305 MAC (16 bytes)        +
  |                                       |
  +----+----+----+----+----+----+----+----+
  |     unencrypted authenticated         |
  +         padding (optional)            +
  |     length defined in options block   |
  ~               .   .   .               ~
  |                                       |
  +----+----+----+----+----+----+----+----+

  Same as current specification except add a second ChaChaPoly frame

Données non chiffrées (étiquette d’authentification Poly1305 non affichée) :

  +----+----+----+----+----+----+----+----+
  |                                       |
  +                                       +
  |                  Y                    |
  +              (32 bytes)               +
  |                                       |
  +                                       +
  |                                       |
  +----+----+----+----+----+----+----+----+
  |           ML-KEM Ciphertext           |
  +      (see table below for length)     +
  |                                       |
  +----+----+----+----+----+----+----+----+
  |               options                 |
  +              (16 bytes)               +
  |                                       |
  +----+----+----+----+----+----+----+----+
  |     unencrypted authenticated         |
  +         padding (optional)            +
  |     length defined in options block   |
  ~               .   .   .               ~
  |                                       |
  +----+----+----+----+----+----+----+----+

Tailles :

TypeCode TypeY lenMsg 2 lenMsg 2 Enc lenMsg 2 Dec lenPQ CT lenopt len
X2551943264+pad321616
MLKEM512_X25519532848+pad81678476816
MLKEM768_X255196321136+pad11041104108816
MLKEM1024_X255197321616+pad15841584156816
Note : Les codes de type sont uniquement à usage interne. Les routeurs resteront de type 4, et la prise en charge sera indiquée dans les adresses de routeur.

3) SessionConfirmed

Inchangé

Fonction de dérivation de clé (KDF) (pour la phase de données)

Inchangé

Adresses Publiées

Dans tous les cas, utilisez le nom de transport NTCP2 comme d’habitude.

Une adresse/port différente en tant que non-PQ, ou PQ uniquement, non-firewallé n’est PAS prise en charge. Ceci ne sera pas implémenté tant que NTCP2 non-PQ ne sera pas désactivé, dans plusieurs années. Lorsque le non-PQ sera désactivé, plusieurs variantes PQ pourront être prises en charge, mais seulement une par adresse. Dans l’adresse du router, publier v=[3|4|5] pour indiquer MLKEM 512/768/1024. Alice ne définit pas le MSB de la clé éphémère. Les anciens routers vérifieront le paramètre v et ignoreront cette adresse comme non prise en charge.

Adresses derrière pare-feu (aucune IP publiée) : Dans l’adresse du router, publier v=2 (comme d’habitude). Il n’est pas nécessaire de publier un paramètre pq.

Alice peut se connecter à un Bob PQ en utilisant la variante PQ que Bob publie, que Alice annonce ou non le support pq dans ses informations de router, ou qu’elle annonce la même variante.

Dans la spécification actuelle, les messages 1 et 2 sont définis comme ayant une quantité “raisonnable” de remplissage, avec une plage de 0-31 octets recommandée, et aucun maximum spécifié.

Padding Maximum

Jusqu’à l’API 0.9.68 (version 2.11.0), Java I2P implémentait un maximum de 256 octets de remplissage pour les connexions non-PQ, cependant cela n’était pas documenté auparavant. À partir de l’API 0.9.69 (version 2.12.0), Java I2P implémente le même remplissage maximum pour les connexions non-PQ que pour MLKEM-512. Voir le tableau ci-dessous.

Utiliser la taille de message définie comme rembourrage maximum, c’est-à-dire que le rembourrage maximum doublera la taille du message pour les connexions PQ, comme suit :

Mettre à jour la spécification SSU2 /docs/specs/ssu2/ comme suit :

Remplissage Max du Messagenon-PQ (jusqu’à 0.9.68)non-PQ (à partir de 0.9.69)MLKEM-512MLKEM-768MLKEM-1024
Session Request25688088012641648
Session Created25684884811361616

SSU2

Notez que MLKEM-1024 n’est PAS pris en charge pour SSU2, car les clés sont trop volumineuses pour tenir dans un datagramme standard de 1500 octets.

Identifiants Noise

  • “Noise_XKhfschaobfse+hs1+hs2+hs3_25519+MLKEM512_ChaChaPoly_SHA256”
  • “Noise_XKhfschaobfse+hs1+hs2+hs3_25519+MLKEM768_ChaChaPoly_SHA256”

L’en-tête long fait 32 octets. Il est utilisé avant qu’une session soit créée, pour Token Request, SessionRequest, SessionCreated, et Retry. Il est également utilisé pour les messages Peer Test et Hole Punch hors session.

En-tête Long

Dans les messages suivants, définissez le champ ver (version) dans l’en-tête long à 3 ou 4, pour indiquer MLKEM-512 ou MLKEM-768.

Dans les messages suivants, définissez le champ ver (version) dans l’en-tête long à 2, comme d’habitude, même si MLKEM-512 ou MLKEM-768 est pris en charge. Les implémentations peuvent également définir la valeur à 3 ou 4, si l’autre extrémité le prend en charge, mais cela n’est pas nécessaire. Les implémentations devraient accepter toute valeur de 2 à 4.

  • (0) Demande de session
  • (1) Session créée
  • (9) Nouvelle tentative
  • (10) Demande de jeton
  • (11) Perforation de trou

Discussion : Définir le champ version à 3 ou 4 peut ne pas être strictement nécessaire pour tous les types de messages, mais cela aide à la détection précoce des échecs pour les connexions post-quantiques non supportées. Les messages Token Request et Retry (types 9 et 10) devraient avoir les versions 3/4 pour la cohérence. Les messages Hole Punch (type 11) peuvent ne pas nécessiter ce traitement mais nous suivrons le même modèle pour l’uniformité. Les messages Peer Test (type 7) sont hors session et n’indiquent pas l’intention d’initier une session.

  • (7) Test de pair (messages hors session 5-7)

Avant le chiffrement de l’en-tête :

inchangé


  +----+----+----+----+----+----+----+----+
  |      Destination Connection ID        |
  +----+----+----+----+----+----+----+----+
  |   Packet Number   |type| ver| id |flag|
  +----+----+----+----+----+----+----+----+
  |        Source Connection ID           |
  +----+----+----+----+----+----+----+----+
  |                 Token                 |
  +----+----+----+----+----+----+----+----+

  Destination Connection ID :: 8 bytes, unsigned big endian integer

  Packet Number :: 4 bytes, unsigned big endian integer

  type :: The message type = 0, 1, 7, 9, 10, or 11

  ver :: The protocol version = 2, 3, or 4 for non-PQ, MLKEM512, MLKEM768

  id :: 1 byte, the network ID (currently 2, except for test networks)

  flag :: 1 byte, unused, set to 0 for future compatibility

  Source Connection ID :: 8 bytes, unsigned big endian integer

  Token :: 8 bytes, unsigned big endian integer

En-tête Court

inchangé

SessionRequest (Type 0)

Modification du KDF pour la protection contre l’usurpation : Pour répondre aux problèmes soulevés dans la Proposition 165 [Prop165]_, mais avec une solution différente, nous modifions le KDF pour la Session Request. Ceci concerne uniquement les sessions PQ. Le KDF pour les sessions non-PQ reste inchangé.

Contenu brut :


// End of KDF for initial chain key (unchanged)
  // Bob static key
  // MixHash(bpk)
  h = SHA256(h || bpk);

  // Start of KDF for session request
  // NEW for PQ only
  // bhash = Bob router hash (32 bytes)
  // MixHash(bhash)
  h = SHA256(h || bhash);

  // Rest of KDF for session request, unchanged, as in SSU2 spec
  // MixHash(header)
  h = SHA256(h || header)

  ...

Contenu brut :

  +----+----+----+----+----+----+----+----+
  |  Long Header bytes 0-15, ChaCha20     |
  +  encrypted with Bob intro key         +
  |    See Header Encryption KDF          |
  +----+----+----+----+----+----+----+----+
  |  Long Header bytes 16-31, ChaCha20    |
  +  encrypted with Bob intro key n=0     +
  |                                       |
  +----+----+----+----+----+----+----+----+
  |                                       |
  +       X, ChaCha20 encrypted           +
  |       with Bob intro key n=0          |
  +              (32 bytes)               +
  |                                       |
  +                                       +
  |                                       |
  +----+----+----+----+----+----+----+----+
  |                                       |
  +                                       +
  |   ChaCha20 encrypted data (MLKEM)     |
  +          (length varies)              +
  |  k defined in KDF for Session Request |
  +  n = 0                                +
  |  see KDF for associated data          |
  +----+----+----+----+----+----+----+----+
  |                                       |
  +        Poly1305 MAC (16 bytes)        +
  |                                       |
  +----+----+----+----+----+----+----+----+
  |                                       |
  +                                       +
  |   ChaCha20 encrypted data (payload)   |
  +          (length varies)              +
  |  k defined in KDF for Session Request |
  +  n = 0                                +
  |  see KDF for associated data          |
  +----+----+----+----+----+----+----+----+
  |                                       |
  +        Poly1305 MAC (16 bytes)        +
  |                                       |
  +----+----+----+----+----+----+----+----+

Données non chiffrées (étiquette d’authentification Poly1305 non affichée) :

  +----+----+----+----+----+----+----+----+
  |      Destination Connection ID        |
  +----+----+----+----+----+----+----+----+
  |   Packet Number   |type| ver| id |flag|
  +----+----+----+----+----+----+----+----+
  |        Source Connection ID           |
  +----+----+----+----+----+----+----+----+
  |                 Token                 |
  +----+----+----+----+----+----+----+----+
  |                                       |
  +                                       +
  |                   X                   |
  +              (32 bytes)               +
  |                                       |
  +                                       +
  |                                       |
  +----+----+----+----+----+----+----+----+
  |           ML-KEM encap_key            |
  +      (see table below for length)     +
  |                                       |
  +----+----+----+----+----+----+----+----+
  |     Noise payload (block data)        |
  +          (length varies)              +
  |     see below for allowed blocks      |
  +----+----+----+----+----+----+----+----+

Tailles, sans inclure la surcharge IP :

TypeCode TypeLongueur XLongueur Msg 1Longueur Msg 1 ChiffréLongueur Msg 1 DéchiffréLongueur clé PQLongueur pl
X2551943280+pl16+plplpl
MLKEM512_X25519532896+pl832+pl800+pl800pl
MLKEM768_X255196321280+pl1216+pl1184+pl1184pl
MLKEM1024_X255197n/dtrop gros
Note : Les codes de type sont uniquement à usage interne. Les routeurs resteront de type 4, et la prise en charge sera indiquée dans les adresses de routeur.

MTU minimum pour MLKEM768_X25519 : Environ 1316 pour IPv4 et 1336 pour IPv6.

SessionCreated (Type 1)

Contenu brut :

Contenu brut :

  +----+----+----+----+----+----+----+----+
  |  Long Header bytes 0-15, ChaCha20     |
  +  encrypted with Bob intro key and     +
  | derived key, see Header Encryption KDF|
  +----+----+----+----+----+----+----+----+
  |  Long Header bytes 16-31, ChaCha20    |
  +  encrypted with derived key n=0       +
  |  See Header Encryption KDF            |
  +----+----+----+----+----+----+----+----+
  |                                       |
  +       Y, ChaCha20 encrypted           +
  |       with derived key n=0            |
  +              (32 bytes)               +
  |       See Header Encryption KDF       |
  +                                       +
  |                                       |
  +----+----+----+----+----+----+----+----+
  |   ChaCha20 encrypted data (MLKEM)     |
  ~  length varies                        ~
  +  k defined in KDF for Session Created +
  |  (before mixKey)                      |
  +  n = 0; see KDF for associated data   +
  |                                       |
  +----+----+----+----+----+----+----+----+
  |                                       |
  +        Poly1305 MAC (16 bytes)        +
  |                                       |
  +----+----+----+----+----+----+----+----+
  |   ChaCha20 encrypted data (payload)   |
  ~  length varies                        ~
  +  k defined in KDF for Session Created +
  |  (after mixKey)                       |
  +  n = 0; see KDF for associated data   +
  |                                       |
  +----+----+----+----+----+----+----+----+
  |                                       |
  +        Poly1305 MAC (16 bytes)        +
  |                                       |
  +----+----+----+----+----+----+----+----+

Données non chiffrées (étiquette d’authentification Poly1305 non affichée) :

  +----+----+----+----+----+----+----+----+
  |      Destination Connection ID        |
  +----+----+----+----+----+----+----+----+
  |   Packet Number   |type| ver| id |flag|
  +----+----+----+----+----+----+----+----+
  |        Source Connection ID           |
  +----+----+----+----+----+----+----+----+
  |                 Token                 |
  +----+----+----+----+----+----+----+----+
  |                                       |
  +                                       +
  |                  Y                    |
  +              (32 bytes)               +
  |                                       |
  +                                       +
  |                                       |
  +----+----+----+----+----+----+----+----+
  |           ML-KEM Ciphertext           |
  +      (see table below for length)     +
  |                                       |
  +----+----+----+----+----+----+----+----+
  |     Noise payload (block data)        |
  +          (length varies)              +
  |      see below for allowed blocks     |
  +----+----+----+----+----+----+----+----+

Tailles, sans inclure la surcharge IP :

TypeCode de TypeY lenMsg 2 lenMsg 2 Enc lenMsg 2 Dec lenPQ CT lenpl len
X2551943280+pl16+plplpl
MLKEM512_X25519532864+pl800+pl768+pl768pl
MLKEM768_X255196321184+pl1118+pl1088+pl1088pl
MLKEM1024_X255197n/atrop gros
Note : Les codes de type sont uniquement à usage interne. Les routeurs resteront de type 4, et la prise en charge sera indiquée dans les adresses de routeur.

MTU minimum pour MLKEM768_X25519 : Environ 1316 pour IPv4 et 1336 pour IPv6.

SessionConfirmed (Type 2)

inchangé

KDF pour la phase de données

inchangé

Relais et Test de Pairs

Les blocs suivants contiennent des champs de version. Ils resteront en version 2 (pour la compatibilité avec un Bob non-PQ), et ne passeront pas à la version 3/4 pour PQ.

  • Demande de relais
  • Réponse de relais
  • Introduction de relais
  • Test de pair

Dans tous les cas, utilisez le nom de transport SSU2 comme d’habitude. MLKEM-1024 n’est pas pris en charge.

Adresses Publiées

Utilisez la même adresse/port que pour non-PQ, non-firewalled. Une ou les deux variantes PQ sont prises en charge. Dans l’adresse du router, publiez v=2 (comme d’habitude) et le nouveau paramètre pq=[3|4|3,4] pour indiquer MLKEM 512/768/les deux. Les anciens routers ignoreront le paramètre pq et se connecteront en non-pq comme d’habitude.

Une adresse/port différente comme non-PQ, ou PQ uniquement, non-firewall n’est PAS prise en charge. Cela ne sera pas implémenté jusqu’à ce que SSU2 non-PQ soit désactivé, dans plusieurs années. Quand non-PQ est désactivé, une ou les deux variantes PQ sont prises en charge. Dans l’adresse du router, publier v=[3|4|3,4] pour indiquer MLKEM 512/768/les deux. Les anciens routers vérifieront le paramètre v et ignoreront cette adresse comme non prise en charge.

Adresses derrière pare-feu (aucune IP publiée) : Dans l’adresse du router, publier v=2 (comme d’habitude). Le paramètre pq DOIT être publié dans les adresses derrière pare-feu, pour supporter le relais.

Alice peut se connecter à un Bob PQ en utilisant la variante PQ que Bob publie, qu’Alice annonce ou non le support pq dans ses informations de router, ou qu’elle annonce la même variante.

Dans la spécification actuelle, les messages 1 et 2 sont définis comme ayant une quantité “raisonnable” de remplissage, avec une plage de 0-31 octets recommandée, et aucun maximum spécifié.

MTU

Faites attention à ne pas dépasser la MTU avec MLKEM768. La MTU minimale pour SSU2 est de 1280, qui correspond à la taille du message 1 sans padding. N’incluez pas de padding dans le message 1 si la MTU d’Alice ou Bob est de 1280.

Streaming

Pour les messages 1 et 2, MLKEM768 augmenterait la taille des paquets au-delà du MTU minimum de 1280. On ne le supporterait probablement tout simplement pas pour cette connexion si le MTU était trop faible.

Fichiers SU3

Pour les messages 1 et 2, MLKEM1024 augmenterait la taille des paquets au-delà du MTU maximum de 1500. Cela nécessiterait de fragmenter les messages 1 et 2, et ce serait une complication majeure. Probablement que nous ne le ferons pas.

Relais et test de pair : Voir ci-dessus

TODO : Y a-t-il un moyen plus efficace de définir la signature/vérification pour éviter de copier la signature ?

À FAIRE

La section 8.1 du projet IETF interdit l’utilisation de HashML-DSA dans les certificats X.509 et n’attribue pas d’OID pour HashML-DSA, en raison de complexités d’implémentation et de sécurité réduite.

Autres spécifications

Pour les signatures PQ uniquement des fichiers SU3, utilisez les OID définis dans le brouillon IETF des variantes sans pré-hachage pour les certificats. Nous ne définissons pas de signatures hybrides des fichiers SU3, car nous pourrions devoir hacher les fichiers deux fois (bien que HashML-DSA et X2559 utilisent la même fonction de hachage SHA512). De plus, concaténer deux clés et signatures dans un certificat X.509 serait complètement non standard.

Notez que nous interdisons la signature Ed25519 des fichiers SU3, et bien que nous ayons défini la signature Ed25519ph, nous ne nous sommes jamais mis d’accord sur un OID pour celle-ci, ni ne l’avons utilisée.

  • SAMv3
  • Bittorrent
  • Directives pour développeurs
  • Nommage / carnet d’adresses / serveurs de redirection
  • Autres documents

Analyse des frais généraux

Échange de clés

Les types de signature normaux ne sont pas autorisés pour les fichiers SU3 ; utilisez les variantes ph (prehash).

TypePubkey (Msg 1)Texte chiffré (Msg 2)
MLKEM512_X25519+816+784
MLKEM768_X25519+1200+1104
MLKEM1024_X25519+1584+1584
La nouvelle taille maximale de Destination sera de 2599 (3468 en base 64).

Mettre à jour les autres documents qui donnent des conseils sur les tailles de Destination, notamment :

TypeVitesse relative
X25519 DH/keygenréférence
MLKEM5122,25x plus rapide
MLKEM7681,5x plus rapide
MLKEM10241x (identique)
XK4x DH (keygen + 3 DH)
MLKEM512_X255194x DH + 2x PQ (keygen + enc/dec) = 4,9x DH = 22% plus lent
MLKEM768_X255194x DH + 2x PQ (keygen + enc/dec) = 5,3x DH = 32% plus lent
MLKEM1024_X255194x DH + 2x PQ (keygen + enc/dec) = 6x DH = 50% plus lent
Augmentation de taille (octets) :
TypeDH/encaps relatifDH/decapskeygen
X25519référenceréférenceréférence
MLKEM51229x plus rapide22x plus rapide17x plus rapide
MLKEM76817x plus rapide14x plus rapide9x plus rapide
MLKEM102412x plus rapide10x plus rapide6x plus rapide

Signatures

Vitesse :

Vitesses rapportées par Cloudflare :

TypeClé publiqueSigClé+SigRIdentDestRInfoLS/Streaming/Datagram (chaque msg)
EdDSA_SHA512_Ed25519326496391391baselinebaseline
MLDSA4413122420373213511319+3316+3284
MLDSA6519523309526119911959+5668+5636
MLDSA8725924627721926312599+7072+7040
MLDSA44_EdDSA_SHA512_Ed2551913442484382813831351+3412+3380
MLDSA65_EdDSA_SHA512_Ed2551919843373535720231991+5668+5636
MLDSA87_EdDSA_SHA512_Ed2551926244691731526632631+7488+7456
La nouvelle taille maximale de Destination sera de 2599 (3468 en base 64).

Mettre à jour les autres documents qui donnent des conseils sur les tailles de Destination, notamment :

TypeSigne de vitesse relativevérification
EdDSA_SHA512_Ed25519référenceréférence
MLDSA445x plus lent2x plus rapide
MLDSA65??????
MLDSA87??????
Augmentation de taille (octets) :
TypeSigne de vitesse relativevérifykeygen
EdDSA_SHA512_Ed25519référenceréférenceréférence
MLDSA444.6x plus lent1.7x plus rapide2.6x plus rapide
MLDSA658.1x plus lentidentique1.5x plus rapide
MLDSA8711.1x plus lent1.5x plus lentidentique

Analyse de Sécurité

Tailles typiques des clés, signatures, RIdent, Dest ou augmentations de taille (Ed25519 inclus pour référence) en supposant un type de chiffrement X25519 pour les RI. Taille ajoutée pour une Router Info, LeaseSet, datagrammes avec réponse, et chacun des deux paquets de streaming (SYN et SYN ACK) listés. Les Destinations et Leasesets actuels contiennent un remplissage répété et sont compressibles en transit. Les nouveaux types ne contiennent pas de remplissage et ne seront pas compressibles, résultant en une augmentation de taille beaucoup plus importante en transit. Voir la section conception ci-dessus.

CatégorieAussi Sécurisé Que
1AES128
2SHA256
3AES192
4SHA384
5AES256

Poignées de main

Vitesses rapportées par Cloudflare :

Résultats de tests préliminaires en Java :

AlgorithmeCatégorie de sécurité
MLKEM5121
MLKEM7683
MLKEM10245

Signatures

Les catégories de sécurité NIST sont résumées dans la présentation NIST diapositive 10. Critères préliminaires : Notre catégorie de sécurité NIST minimale devrait être 2 pour les protocoles hybrides et 3 pour PQ uniquement.

Ce sont tous des protocoles hybrides. Les implémentations devraient privilégier MLKEM768 ; MLKEM512 n’est pas suffisamment sécurisé.

AlgorithmeCatégorie de sécurité
MLDSA442
MLKEM673
MLKEM875

Préférences de type

Catégories de sécurité NIST FIPS 203 :

Cette proposition définit à la fois des types de signature hybrides et uniquement PQ. MLDSA44 hybride est préférable à MLDSA65 uniquement PQ. Les tailles des clés et signatures pour MLDSA65 et MLDSA87 sont probablement trop importantes pour nous, du moins au début.

Catégories de sécurité NIST FIPS 204 :

Bien que nous définirons et implémenterons 3 types de cryptographie et 9 types de signatures, nous prévoyons de mesurer les performances pendant le développement et d’analyser davantage les effets de l’augmentation de la taille des structures. Nous continuerons également à rechercher et surveiller les développements dans d’autres projets et protocoles.

Après une année ou plus de développement, nous tenterons de nous fixer sur un type préféré ou par défaut pour chaque cas d’usage. La sélection nécessitera de faire des compromis entre la bande passante, le CPU et le niveau de sécurité estimé. Tous les types peuvent ne pas être appropriés ou autorisés pour tous les cas d’usage.

Les préférences préliminaires sont les suivantes, sous réserve de modifications :

Chiffrement : MLKEM768_X25519

Notes d’implémentation

Support de bibliothèque

Signatures : MLDSA44_EdDSA_SHA512_Ed25519

Les restrictions préliminaires sont les suivantes, sous réserve de modification :

Variantes de signature

Chiffrement : MLKEM1024_X25519 non autorisé pour SSU2

Signatures : MLDSA87 et la variante hybride probablement trop volumineuses ; MLDSA65 et la variante hybride peuvent être trop volumineuses

Fiabilité

Les bibliothèques Bouncycastle, BoringSSL et WolfSSL prennent désormais en charge MLKEM et MLDSA. La prise en charge d’OpenSSL sera disponible dans leur version 3.5 le 8 avril 2025 OpenSSL .

Tailles des structures

La bibliothèque Noise de southernstorm.com adaptée par Java I2P contenait un support préliminaire pour les négociations hybrides, mais nous l’avons supprimé car il n’était pas utilisé ; nous devrons le rajouter et le mettre à jour pour correspondre à la spécification Noise HFS .

NetDB

Nous utiliserons la variante de signature “hedged” ou randomisée, et non la variante “déterministe”, telle que définie dans la section 3.4 de FIPS 204 . Cela garantit que chaque signature est différente, même sur les mêmes données, et offre une protection supplémentaire contre les attaques par canaux auxiliaires. Bien que FIPS 204 spécifie que la variante “hedged” est celle par défaut, cela peut ou non être vrai dans diverses bibliothèques. Les implémenteurs doivent s’assurer que la variante “hedged” est utilisée pour la signature.

Ratchet

Problèmes

Nous utilisons le processus de signature normal (appelé Pure ML-DSA Signature Generation) qui encode le message en interne comme 0x00 || len(ctx) || ctx || message, où ctx est une valeur optionnelle de taille 0x00..0xFF. Nous n’utilisons aucun contexte optionnel. len(ctx) == 0. Ce processus est défini dans FIPS 204 Algorithme 2 étape 10 et Algorithme 3 étape 5. Notez que certains vecteurs de test publiés peuvent nécessiter la définition d’un mode où le message n’est pas encodé.

L’augmentation de la taille entraînera beaucoup plus de fragmentation de tunnel pour les stockages NetDB, les poignées de main de streaming et autres messages. Vérifiez les changements de performance et de fiabilité.

  • Si le message 1 fait moins de 919 octets, c’est le protocole ratchet actuel.
  • Si le message 1 fait 919 octets ou plus, c’est probablement MLKEM512_X25519. Essayez d’abord MLKEM512_X25519, et si cela échoue, essayez le protocole ratchet actuel.

Trouvez et vérifiez tout code qui limite la taille en octets des informations de routeur et des leaseSets.

Examiner et possiblement réduire le maximum de LS/RI stockés en RAM ou sur disque, pour limiter l’augmentation du stockage. Augmenter les exigences minimales de bande passante pour les floodfills ?

  • X25519 + MLKEM512
  • X25519 + MLKEM768
  • X25519 + MLKEM1024

La classification/détection automatique de multiples protocoles sur les mêmes tunnels devrait être possible en se basant sur une vérification de la longueur du message 1 (New Session Message). En utilisant MLKEM512_X25519 comme exemple, la longueur du message 1 est de 816 octets plus grande que le protocole ratchet actuel, et la taille minimale du message 1 (avec seulement une charge utile DateTime incluse) est de 919 octets. La plupart des tailles de message 1 avec le ratchet actuel ont une charge utile de moins de 816 octets, elles peuvent donc être classifiées comme ratchet non-hybride. Les messages volumineux sont probablement des POST qui sont rares.

  • Plus d’un MLKEM
  • ElG + un ou plusieurs MLKEM
  • X25519 + un ou plusieurs MLKEM
  • ElG + X25519 + un ou plusieurs MLKEM

Ainsi, la stratégie recommandée est :

Cela devrait nous permettre de prendre en charge efficacement le ratchet standard et le ratchet hybride sur la même destination, tout comme nous avons précédemment pris en charge ElGamal et ratchet sur la même destination. Par conséquent, nous pouvons migrer vers le protocole hybride MLKEM beaucoup plus rapidement que si nous ne pouvions pas prendre en charge les protocoles duaux pour la même destination, car nous pouvons ajouter la prise en charge MLKEM aux destinations existantes.

Les combinaisons prises en charge requises sont :

Les combinaisons suivantes peuvent être complexes, et ne sont PAS obligatoires d’être supportées, mais peuvent l’être, selon l’implémentation :

Tunnels partagés

Nous ne pourrions pas tenter de supporter plusieurs algorithmes MLKEM (par exemple, MLKEM512_X25519 et MLKEM_768_X25519) sur la même destination. Choisissez-en un seul ; cependant, cela dépend de notre sélection d’une variante MLKEM préférée, pour que les tunnels clients HTTP puissent en utiliser une. Dépendant de l’implémentation.

Confidentialité persistante

Nous POUVONS tenter de prendre en charge trois algorithmes (par exemple X25519, MLKEM512_X25519, et MLKEM769_X25519) sur la même destination. La classification et la stratégie de nouvelle tentative peuvent être trop complexes. La configuration et l’interface utilisateur de configuration peuvent être trop complexes. Dépendant de l’implémentation.

NTCP2

Nous ne tenterons probablement PAS de prendre en charge les algorithmes ElGamal et hybrides sur la même destination. ElGamal est obsolète, et ElGamal + hybride uniquement (pas de X25519) n’a pas beaucoup de sens. De plus, les messages de nouvelle session ElGamal et hybrides sont tous deux volumineux, donc les stratégies de classification devraient souvent essayer les deux déchiffrements, ce qui serait inefficace. Dépendant de l’implémentation.

Taille de Nouvelle Session

Les clients peuvent utiliser les mêmes clés statiques X25519 ou des clés différentes pour les protocoles X25519 et hybride sur les mêmes tunnels, selon l’implémentation.

La spécification ECIES permet les Garlic Messages dans la charge utile du New Session Message, ce qui permet la livraison 0-RTT du paquet de streaming initial, généralement un HTTP GET, avec le leaseSet du client. Cependant, la charge utile du New Session Message ne dispose pas de confidentialité persistante. Comme cette proposition met l’accent sur une confidentialité persistante renforcée pour le ratchet, les implémentations peuvent ou devraient reporter l’inclusion de la charge utile de streaming, ou du message de streaming complet, jusqu’au premier Existing Session Message. Ceci serait au détriment de la livraison 0-RTT. Les stratégies peuvent également dépendre du type de trafic ou du type de tunnel, ou de GET vs. POST, par exemple. Dépendant de l’implémentation.

MLKEM, MLDSA, ou les deux sur la même destination, augmenteront considérablement la taille du Message de Nouvelle Session, comme décrit ci-dessus. Cela peut réduire significativement la fiabilité de la livraison des Messages de Nouvelle Session à travers les tunnels, où ils doivent être fragmentés en plusieurs messages de tunnel de 1024 octets. Le succès de livraison est proportionnel au nombre exponentiel de fragments. Les implémentations peuvent utiliser diverses stratégies pour limiter la taille du message, au détriment de la livraison 0-RTT. Dépendant de l’implémentation.

Note : Les codes de type sont uniquement à usage interne. Les routeurs resteront de type 4, et la prise en charge sera indiquée dans les adresses de routeur.

SSU2

Nous définissons le MSB de la clé éphémère (key[31] & 0x80) dans la demande de session pour indiquer qu’il s’agit d’une connexion hybride. Cela nous permet d’exécuter à la fois NTCP standard et NTCP hybride sur le même port. Une seule variante hybride serait prise en charge et annoncée dans l’adresse du router. Par exemple, v=2,3 ou v=2,4 ou v=2,5.

En tant que Bob, testez si (X[31] & 0x80) != 0 après dé-obfuscation. Si c’est le cas, c’est une connexion PQ.

Note : Les codes de type sont uniquement à usage interne. Les routeurs resteront de type 4, et la prise en charge sera indiquée dans les adresses de routeur.

Compatibilité des routeurs

Noms de Transport

La version minimale du router requise pour NTCP2-PQ est à déterminer.

Types de chiffrement du router

Nous utilisons le champ version dans l’en-tête long et le définissons à 3 pour MLKEM512 et 4 pour MLKEM768. v=2,3,4 dans l’adresse serait suffisant.

Obfuscation

Vérifier que SSU2 peut gérer les RI signés MLDSA fragmentés sur plusieurs paquets (6-8 ?).

Routeurs de type 5/6/7

Note : Les codes de type sont uniquement à usage interne. Les routeurs resteront de type 4, et le support sera indiqué dans les adresses de routeur.

Routers de type 4

Dans tous les cas, utilisez les noms de transport NTCP2 et SSU2 comme d’habitude.

Types de signatures de router

Recommandations

Nous avons plusieurs alternatives à considérer :

Non recommandé. Utilisez uniquement les nouveaux transports listés ci-dessus qui correspondent au type de router. Les anciens routers ne peuvent pas se connecter, construire des tunnels à travers, ou envoyer des messages netDb vers ceux-ci. Il faudrait plusieurs cycles de version pour déboguer et assurer le support avant d’activer par défaut. Pourrait prolonger le déploiement d’un an ou plus par rapport aux alternatives ci-dessous.

Types de chiffrement LS

Routers de Type 12-17

Recommandé. Comme PQ n’affecte pas la clé statique X25519 ou les protocoles de handshake N, nous pourrions laisser les routers comme type 4, et simplement annoncer de nouveaux transports. Les anciens routers pourraient toujours se connecter, construire des tunnels à travers, ou envoyer des messages netDb vers.

MLKEM-768 est recommandé pour Ratchet, NTCP2, et SSU2, comme le meilleur équilibre entre sécurité et longueur de clé.

Types de Sig. Dest.

Clés LS de type 5-7

Les routers plus anciens vérifient les RI et ne peuvent donc pas se connecter, construire des tunnels ou envoyer des messages netDb. Cela prendrait plusieurs cycles de version pour déboguer et assurer la compatibilité avant d’activer par défaut. Ce seraient les mêmes problèmes que le déploiement des types de chiffrement 5/6/7 ; cela pourrait prolonger le déploiement d’un an ou plus par rapport à l’alternative de déploiement du type de chiffrement 4 listée ci-dessus.

Non recommandé. Utilisez uniquement les nouveaux transports listés ci-dessus qui correspondent au type de router. Les anciens routers ne peuvent pas se connecter, construire des tunnels à travers, ou envoyer des messages netDb vers ceux-ci. Il faudrait plusieurs cycles de version pour déboguer et assurer le support avant d’activer par défaut. Pourrait prolonger le déploiement d’un an ou plus par rapport aux alternatives ci-dessous.

Priorités et déploiement

Aucune alternative.

Les destinations peuvent prendre en charge plusieurs types de clés, mais seulement en effectuant des déchiffrements d’essai du message 1 avec chaque clé. La surcharge peut être atténuée en maintenant des compteurs de déchiffrements réussis pour chaque clé, et en essayant d’abord la clé la plus utilisée. Java I2P utilise cette stratégie pour ElGamal+X25519 sur la même destination.

Les routers vérifient les signatures de leaseSet et ne peuvent donc pas se connecter ou recevoir des leaseSets pour les destinations de type 12-17. Il faudrait plusieurs cycles de publication pour déboguer et assurer la prise en charge avant l’activation par défaut.

Aucune alternative.

Les données les plus précieuses sont le trafic de bout en bout, chiffré avec ratchet. En tant qu’observateur externe entre les sauts de tunnel, cela est chiffré deux fois de plus, avec le chiffrement de tunnel et le chiffrement de transport. En tant qu’observateur externe entre OBEP et IBGW, cela n’est chiffré qu’une fois de plus, avec le chiffrement de transport. En tant que participant OBEP ou IBGW, ratchet est le seul chiffrement. Cependant, comme les tunnels sont unidirectionnels, capturer les deux messages dans l’échange ratchet nécessiterait des routers complices, à moins que les tunnels ne soient construits avec l’OBEP et l’IBGW sur le même router.

Le déploiement des signatures interviendra également un an ou plus tard par rapport au déploiement du chiffrement, car aucune compatibilité descendante n’est possible.

Les travaux sur la prise en charge des signatures MLDSA dans I2P sont suspendus jusqu’à la fin 2027 ou 2028, en attendant que les organismes de standardisation choisissent les algorithmes, éventuellement réduisent la taille des clés et/ou des signatures, et encouragent l’adoption par l’industrie. Voir CABFORUM et PLANTS . En outre, l’adoption de MLDSA par l’industrie sera normalisée par le CA/Browser Forum et les autorités de certification (CA). Les CAs ont besoin d’abord d’un support par des modules matériels de sécurité (HSM), qui n’est pas disponible actuellement CA/Browser Forum . Nous nous attendons à ce que le CA/Browser Forum oriente les décisions concernant les choix spécifiques de paramètres, notamment sur la prise en charge ou l’exigence de signatures composites IETF draft .

ObjectifDate prévue
Bêta de RatchetFin 2025
Sélection du meilleur type de chiffrementFin 2025
Bêta NTCP2Début 2026
Bêta SSU2Début 2026
Version finale de RatchetDébut 2026
Ratchet activé par défautDébut 2026
Bêta des signaturesFin 2027 ?
Version finale NTCP2Milieu 2026
Version finale SSU2Milieu 2026
Sélection du meilleur type de signature2028 ?
Version finale des signatures2028 ?

Migration

Si nous ne pouvons pas prendre en charge à la fois les anciens et nouveaux protocoles ratchet sur les mêmes tunnels, la migration sera beaucoup plus difficile.

Nous devrions pouvoir simplement essayer l’un puis l’autre, comme nous l’avons fait avec X25519, pour être prouvé.

Problèmes

  • Sélection de Hash Noise - conserver SHA256 ou mettre à niveau ? SHA256 devrait être bon pour encore 20-30 ans, pas menacé par PQ, Voir présentation NIST et présentation NCCOE . Si SHA256 est cassé, nous avons des problèmes plus graves (netdb).
  • NTCP2 port séparé, adresse router séparée
  • SSU2 relay / test de pair
  • Champ de version SSU2
  • Version d’adresse router SSU2

Références