作ったもの
HTTP/3について
以下の資料が参考になります。多分HTTP/2をそれなりに理解していたほうがいいと思います。
実装について
cli.cを参考に実装しています。QPACKについては実装していません。
試験方法
ビルド方法
依存ライブラリの以下部分を修正しないとC++だとエラーになります。
- quicly/deps/picotls/t/util.h:306
// uint8_t *へのキャストを追加する
uint8_t *info = (uint8_t *) malloc(info_prefix.len + end - (src - 4));
- quicly/deps/picotls/t/util.h:350
// uint8_t *へのキャストを追加する
ech.config_list.base = (uint8_t *) malloc(65536);
試験ツール
とりあえずcloudflareのツールが使えるようなので、それで試します。--wire-version 1
を指定しないとうまくいかないです。
git clone --recursive https://github.com/cloudflare/quiche
cd quiche/
cargo build
./target/debug/quiche-client --http-version HTTP/3 --wire-version 1 --no-verify http://127.0.0.1:4433/hoge1.html http://127.0.0.1:4433/hoge2.html
パケットキャプチャしてみる
上記のquiche-clientはSSLKEYLOGFILE
変数に指定されたファイルに秘密鍵を出力するので、このファイルを使えば復号化することができます。
SSLKEYLOGFILE=hoge.txt ./target/debug/quiche-client --wire-version 1 --no-verify http://127.0.0.1:4433/hoge1.html http://127.0.0.1:4433/hoge2.html
このhoge.txtをwiresharkの「設定→Protocols→TLS」の「(Pre)-Master-Secret log filename」に指定すればOK。