QUICや詠み人知らず。QUICの実装の難しさに絶望した心境が詠まれたと伝う。序章2017年の7月ごろ、QUICの実装を始めました。ライブラリから、バッファ操作の部分を切り出して、network-byte-orderというライブラリを作るところから始めました。」という訳で、QUICの開発は中断されました。2018年4月に開発室が立ち上がりました。1.3を片付ける必要があり、根気強く上流にマージました。2019年の年明けからQUICの実装を再開しました。QUIC分科会の相互接続試験イベントと中間ミーティングが東京で開催されるので、それに間に合わせるためです。これは一ヶ月間のQUIC実装奮闘記です。再開まずQUICの仕様を読むところから再開しました。transport/tls草稿の番号は17になっていました。巨大な仕様なので、まったく頭に入ってきません。気分が滅入っているところに、次の18ではテストベクタが追加されることが分かり、俄然やる気が出てきました。最初の目標は、テストベクタに載っているネットワーク上のバイナリをデコードすることです。ライブラリから非公開の関数を公開する必要がありました。興味がある人は、quicブランチを見てください。ライブラリを育てていく必要もありました。QUICパケットのデコードQUICパケットをデコードするには以下の手順を踏みます。保護されたヘッダをパースする暗号化されたペイロードを用いてヘッダの保護を外し、パケット番号を取り出すヘッダとパケット番号などを用いてペイロードを復号化するヘッダのパースには、整数デコーダが2つ必要になります。可変長の整数デコーダパケット番号に用いられる差分変数のデコーダこれらはQUICに特有なので、自分で実装する必要があります。1.3の鍵交換をする前のInitialパケットの例であり、自明な鍵でペイロードを復号化できます。この辺りまでは、面倒でしたが特に問題なく実装できました。パケットのエンコードは、この逆をやります。ヘッダを組み立てるヘッダとパケット番号を用いてペイロードを暗号化する暗号化されたペイロードを用いてヘッダを保護する分かりやすい図があるので、ペイロードの暗号化についてもう少し詳しく見てみましょう。一意である必要があります。一意になるように設計されていることが分かります。ヘッダの保護の方も図で見てみましょう。ヘッダの保護サンプルを暗号ペイロードの先頭付近からとってきます。「付近」なのは、パケットの差分が最大4バイトで表されるからです。最大の4バイトに重ならない部分からサンプリングします。ちなみに、パケットの差分が何バイトになるかは、ヘッダの保護されるビットに指定します。書きましたが、すべてきちんと順に実装していかないと、パケットを組み立てたり解析したりはできないのです。1.3次の目標はハンドシェクです。1.3を従来の方法で使うことになっていました。入出力を伴うソケット層として使うのです。1.3のハンドシェイクメッセージが入ったTLSレコードは、QUICパケットに格納して運ぶ必要があります。何を言っているか分からないかもしれませんが、実はこれは簡単に実装できます。いうのは、通常のTLSライブラリにはIOバックエンドを指定する方法があるからです。QUICが、TLSライブラリのハンドシェイクAPIを呼ぶときに、QUICをバックエンドに指定しておけばいいのです。Secretとして提供されます。ちゃぶ台は見事にひっくり返されました。1.3をソケット層ではなく、IOを伴わないエンコーダ/デコーダとして使うように再設計されたのです。QUICとTLSの間では、TLSハンドシェイクメッセージは平文で交換され、ネットワークに送信する前に暗号化/復号化するのはQUIC側になります。Validationを読んでください。ライブラリの大幅改造が必要です。APIからIOを分離する必要があります。僕はしばらくTLS沼でもがいていましたが、どれくらい大変だったかは、このプルリクを見ていただくと感じ取れるかもしれません。ACK[0]UDPの部分を付け足して、なんとかQUICパケットをネットワークに送信できるようになりました。辻川さんが隣にいたので、最初の相手としてngtcp2サーバに話しかけます。以降が復号化できません。TLSライブラリでもできなくはないんです。TLSのAPIから「TLSパケットをパースしている途中の状態」を返すのは避けたいのです。一晩悩みましたが、TLSハンドシェイクメッセージは平文であり、TLVの形が見える、そう、型と長さが分かることに気づきました。そこで、TLSのAPIを呼ぶ前に、TLSハンドシェイクメッセージを組み立てて完全な形にすことができるようになりました。Finishedは、まだ送れていません。continued2月は報告書の作業が忙しいので、再び中断です。再考NewSessionTicketをいつ送るかの議論です。2016の25日目の記事です。2016の24日目の記事です。山本和彦id:kazu-yamamoto子育て真っ最中のHaskeller。Haskell月別アーカイブはてなブログをはじめよう!kazu-yamamotoさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。