ClientHello
クライアントが接続を開始します。TLS 1.3 を提案し、AES/ChaCha の暗号スイートを 3 つ提示し、対応する鍵交換グループを X25519MLKEM768 を先頭にして列挙します。さらに、優先する 2 つのグループそれぞれのキーシェアを送ります。その中には 1216 バイトのハイブリッドのキーシェアも含まれます。このメッセージは平文で送られ、この時点ではまだ何も秘密ではありません。
通信上のバイト列 · 1,483 バイト
- この 1,478 バイトは、OpenSSL が -msg を付けてこのレコードについて出力した内容と一致します。
計算方法クライアントのキーシェア
クライアントは、最初のメッセージを送る前に、提示する一時鍵を生成します。ハイブリッドのグループでは ML-KEM-768 の鍵ペアと X25519 の鍵ペアを生成し、それぞれの公開鍵を連結して 1216 バイトの 1 つのキーシェアにします。単独の X25519 グループには、これとは別の鍵を用意します。
定義
d, z ←$ B^32 FIPS 203 §7.1 (ek, dk) = ML-KEM-768.KeyGen_internal(d, z) FIPS 203 §6.1 x_c ←$ B^32, X_c = X25519(x_c, 9) RFC 7748 §5 share = ek ‖ X_c 1184 + 32 = 1216 RFC 10024 §4.1 y_c ←$ B^32, Y_c = X25519(y_c, 9) key_share: x25519 (0x001d)
このセッションの値
- d(32 バイト):秘密ベクトルに展開される値
- 84745c7adf177dfb94e15c7cdef6f8006897b295bdafaadd090ef050c004b212
- z(32 バイト):暗黙的拒否に使う秘密の値
- 921eb10b6b41e8f0221e0f7f164aadef44f4cba1139edd522c9f0860db6b0cde
- 1184 バイトのカプセル化鍵の SHA-256
- 4a2903bee32a7a18d3294d93a4d24d6ecc8c07bc098bab31899689f87a572be8
- クライアントの X25519 秘密鍵(ハイブリッドのキーシェア)
- 784edfa4400a57540a7cbd71957c8ab182ae801a5c519755abe69f553b9e8c5d
- クライアントの X25519 公開鍵(ハイブリッドのキーシェア)
- 09e0802926363ed192b02f5261520f2056ba7af9a0acd1eee5bbe50181e0cf29
- クライアントの X25519 秘密鍵(単独のキーシェア)
- d81df8305a5f24f9077b3d669885d0d7b93ec55fe405ccde814bac62e778f656
- クライアントの X25519 公開鍵(単独のキーシェア)
- 67aab4deeec206fa89034014d772bdd47cedd7930610e81f634871565424f14d
これで証明されること
- シードから ML-KEM-768 の鍵を生成すると、クライアントのキーシェアにあるカプセル化鍵が再現されます。
- カプセル化鍵の 768 個の係数はすべて q = 3329 未満(最大値 3326)のため、サーバーはこの鍵を受け入れます(FIPS 203 §7.2)。
- X25519 の秘密鍵から、クライアントのハイブリッドのキーシェアにある公開値が再現されます。
- 単独の X25519 のキーシェアは、ハイブリッドのキーシェアとは異なる独自の鍵を使っています。
自分で再現する
printf '%s' 3054020100300b06096086480165030404020442804084745c7adf177dfb94e15c7cdef6f8006897b295bdafaadd090ef050c004b212921eb10b6b41e8f0221e0f7f164aadef44f4cba1139edd522c9f0860db6b0cde | unhex > client-mlkem.der openssl pkey -inform DER -in client-mlkem.der -pubout -outform DER | tail -c 1184 | openssl dgst -sha256 -binary | tohex
出力 4a2903bee32a7a18d3294d93a4d24d6ecc8c07bc098bab31899689f87a572be8
printf '%s' 302e020100300506032b656e04220420784edfa4400a57540a7cbd71957c8ab182ae801a5c519755abe69f553b9e8c5d | unhex > x25519.der openssl pkey -inform DER -in x25519.der -pubout -outform DER | tail -c 32 | tohex
出力 09e0802926363ed192b02f5261520f2056ba7af9a0acd1eee5bbe50181e0cf29