RFC9001 A.2. Client Initial のQUICパケットの暗号化とQUICヘッダーの保護をやってみる

今回は、RFC9001 A.2. Client Initial にある、QUICのパケットの暗号化と、QUICヘッダ―の保護のサンプルを実際に行ってみます。

このサンプルでは、Initialパケットの暗号化とヘッダーの保護のサンプルを提示しています。

本記事では、最初にQUICパケットの暗号化とQUICヘッダーの保護がどのように行われているかを確認し、そのあとに実装を説明します。

Initialパケットのヘッダーは以下のようになっています。

c300000001088394c8f03e5157080000449e00000002

Initialパケットのペイロードは以下のようになっています。ここはCRYPTOフレームしか含まれていませんが、この後に1162バイトになるまでPADDINGフレームが含まれます。

060040f1010000ed0303ebf8fa56f129 39b9584a3896472ec40bb863cfd3e868
04fe3a47f06a2b69484c000004130113 02010000c000000010000e00000b6578
616d706c652e636f6dff01000100000a 00080006001d00170018001000070005
04616c706e0005000501000000000033 00260024001d00209370b2c9caa47fba
baf4559fedba753de171fa71f50f1ce1 5d43e994ec74d748002b000302030400
0d0010000e0403050306030203080408 050806002d00020101001c0002400100
3900320408ffffffffffffffff050480 00ffff07048000ffff08011001048000
75300901100f088394c8f03e51570806 048000ffff
続きを読む

RFC9001のA.2. Client Initial にあるCRYPTOフレームのサンプルを読み解いてみる

RFC9001 A.2. Client Initial にある以下のCRYPTO Frameを読み解いてみます。

060040f1010000ed0303ebf8fa56f129 39b9584a3896472ec40bb863cfd3e868
04fe3a47f06a2b69484c000004130113 02010000c000000010000e00000b6578
616d706c652e636f6dff01000100000a 00080006001d00170018001000070005
04616c706e0005000501000000000033 00260024001d00209370b2c9caa47fba
baf4559fedba753de171fa71f50f1ce1 5d43e994ec74d748002b000302030400
0d0010000e0403050306030203080408 050806002d00020101001c0002400100
3900320408ffffffffffffffff050480 00ffff07048000ffff08011001048000
75300901100f088394c8f03e51570806 048000ffff

先に結果を書くと、以下のようになります。

CRYPTOフレームの定義があります。そのあとに、TLS1.3のClientHelloが含まれます。ClientHelloの拡張の中には、QUIC Transport Paramter 拡張も含まれています。

060040f1: CRYPTOフレームの定義
010000ed: Handshakeの定義
0303ebf8fa56f129 39b9584a3896472ec40bb863cfd3e868: 
0303ebf8fa56f129 39b9584a3896472ec40bb863cfd3e86804fe3a47f06a2b69484c00000413011302010000c0 : Client Helloの定義(extensionの長さを示す部分まで)
00000010000e00000b6578616d706c652e636f6d: server_name拡張の定義
ff01000100:  Renegotiation Indication 拡張
000a00080006001d00170018: supported group 拡張
00100007000504616c706e: ALPN拡張
000500050100000000: status request 拡張
003300260024001d00209370b2c9caa47fbabaf4559fedba753de171fa71f50f1ce1 5d43e994ec74d748: key share拡張
002b0003020304: supported versions拡張
000d0010000e0403050306030203080408050806: signature algorithms 拡張
002d00020101:  Pre-Shared Key Exchange Modes 拡張
001c00024001: Record Size Limit 拡張
003900320408ffffffffffffffff05048000ffff07048000ffff0801100104800075300901100f088394c8f03e51570806048000ffff: QUIC Transport Parameter 拡張
続きを読む

Improving the reliability of the QUIC Handshake のメモ

Huitema氏が投稿していたImproving the reliability of the QUIC Handshakeという記事のメモです。

QUIC Interop Runner でのテストの中でも、しばしば失敗が検出されたものを紹介しています。

そのケースに対して、問題の起こり方、RFCに対してどのように反映されたのかが書かれています。

続きを読む

It’s Over 9000: Analyzing Early QUIC Deployments with the Standardization on the Horizon

「It’s Over 9000: Analyzing Early QUIC Deployments with the Standardization on the Horizon」はQUICのデプロイ状況を調査した論文です。

論文のリンク: https://www.net.in.tum.de/fileadmin/bibtex/publications/papers/zirngibl2021over9000.pdf

紹介記事のページ: 2.6 million addresses support QUIC | APNIC Blog

データなど: quicimc.github.io

論文の調査が行われた時点で、QUICをサポートする230万のipv4ホストと30万のipv6を発見しています。

また、トランスポートパラメータの種類も調査しており、合計で45の異なるコンフィギュレーションが見つかりました。

実際に発見されたトランスポートパラメータの種類は以下のリンクから見ることが可能です。

github.com

デプロイされているホストの数と比べるとパラメータの設定の種類が少ないように見えます。これは、デプロイしているプロパイダ数がそこまで多くないことが影響しているようです。

s2n-quicとpcap2qlogを使ってqlogを生成してみた

ツイッターで、pcap2qlogというpcapをqlogに変換するツールを教えていただきました。

今回は、s2n-quic と pcap2qlog を組み合わせて、qlogを生成してみたので紹介します。

続きを読む

s2n-quicのecho exampleを動かしてみた

s2n-quicAWS が公開したRust のQUIC実装です。サンプルのエコーを動かしてみました。

aws.amazon.com

echoのexampleは https://github.com/aws/s2n-quic/tree/main/examples/echo に用意されています。

リポジトリをクローンして、リリースビルドをします。

$ git clone https://github.com/aws/s2n-quic.git
$ cd s2n-quic/examples/echo/
$ cargo build --release

サーバーとクライアントを別のターミナルで開きます。

サーバーを実行します。

$ ./target/release/quic_echo_server 
Connection accepted from Ok(127.0.0.1:40591)
Stream opened from Ok(127.0.0.1:40591)

クライアントを実行します

$ ./target/release/quic_echo_client 
aaaa←これは自分で入力した
aaaa←返ってきた出力

テスト用の証明書が用意されているので、すぐに使えたのが良かったです。 https://github.com/aws/s2n-quic/tree/main/quic/s2n-quic-core/certs

qlogの出力方法はgithubを眺めただけではわかりませんでした。そういうテストがありそうなのですが。。。

Client::builder() あるいは Server::Builder() 呼び出し時に、with_event を呼ぶとできる仕組みがありそうな気もします。

余談ですが、ちょっと前に読んでいたIt’s Over 9000: Analyzing Early QUIC Deployments with the Standardization on the Horizon という論文で、Amazon もQUICをデプロイしているという情報があったので、自前で作っている可能性は想像できたかもしれないです。。。