メインコンテンツまでスキップ

付録 A. パケット保護のサンプル (Sample Packet Protection)

本セクションでは、実装を段階的に検証できるように、パケット保護の例を示します。クライアントとサーバーからの Initial パケットのサンプルと、Retry パケットが定義されています。これらのパケットは、8バイトのクライアント選択の宛先接続 ID 0x8394c8f03e515708 を使用します。いくつかの中間値が含まれています。すべての値は16進数で示されています。

A.1. 鍵 (Keys)

HKDF-Expand-Label 関数の実行中に生成されるラベル(つまり、HkdfLabel.label)と、出力を生成するために HKDF-Expand 関数に提供される値の一部は次のとおりです:

client in:  00200f746c73313320636c69656e7420696e00
server in: 00200f746c7331332073657276657220696e00
quic key: 00100e746c7331332071756963206b657900
quic iv: 000c0d746c733133207175696320697600
quic hp: 00100d746c733133207175696320687000

初期シークレットは共通です:

initial_secret = HKDF-Extract(initial_salt, cid)
= 7db5df06e7a69e432496adedb0085192
3595221596ae2ae9fb8115c1e9ed0a44

クライアントパケットを保護するための鍵:

client_initial_secret
= HKDF-Expand-Label(initial_secret, "client in", "", 32)
= c00cf151ca5be075ed0ebfb5c80323c4
2d6b7db67881289af4008f1f6c357aea

key = HKDF-Expand-Label(client_initial_secret, "quic key", "", 16)
= 1f369613dd76d5467730efcbe3b1a22d

iv = HKDF-Expand-Label(client_initial_secret, "quic iv", "", 12)
= fa044b2f42a3fd3b46fb255c

hp = HKDF-Expand-Label(client_initial_secret, "quic hp", "", 16)
= 9f50449e04a0e810283a1e9933adedd2

サーバーパケットを保護するための鍵:

server_initial_secret
= HKDF-Expand-Label(initial_secret, "server in", "", 32)
= 3c199828fd139efd216c155ad844cc81
fb82fa8d7446fa7d78be803acdda951b

key = HKDF-Expand-Label(server_initial_secret, "quic key", "", 16)
= cf3a5331653c364c88f0f379b6067e37

iv = HKDF-Expand-Label(server_initial_secret, "quic iv", "", 12)
= 0ac1493ca1905853b0bba03e

hp = HKDF-Expand-Label(server_initial_secret, "quic hp", "", 16)
= c206b8d9b9f0f37644430b490eeaa314

A.2. クライアント Initial パケット

クライアントは Initial パケットを送信します。このパケットの保護されていないペイロードには、以下の CRYPTO フレームと、1162バイトのペイロードを作成するのに十分な PADDING フレームが含まれています。

(16進数データは省略 - 原文参照)

保護されていないヘッダーは1182バイトの長さを示します:4バイトのパケット番号、1162バイトのフレーム、および16バイトの認証タグ。ヘッダーには接続 ID とパケット番号2が含まれています。

ペイロードを保護すると、ヘッダー保護のためにサンプリングされる出力が生成されます。ヘッダーは4バイトのパケット番号エンコーディングを使用するため、保護されたペイロードの最初の16バイトがサンプリングされ、次のようにヘッダーに適用されます:

sample = d1b1c98dd7689fb8ec11d242b123dc9b
mask = AES-ECB(hp, sample)[0..4] = 437b9aec36
header[0] ^= mask[0] & 0x0f = c0
header[18..21] ^= mask[1..4] = 7b9aec34
header = c000000001088394c8f03e5157080000449e7b9aec34

(完全な保護されたパケットは省略 - 原文参照)

A.3. サーバー Initial パケット

サーバーは、ACK フレーム、CRYPTO フレームを含み、PADDING フレームを含まない以下のペイロードを応答として送信します。

(詳細は省略 - 原文参照)

A.4. Retry パケット

付録 A.2 の Initial パケットへの応答として送信される可能性のある Retry パケットを示します。完全性チェックには、クライアントが選択した接続 ID 値 0x8394c8f03e515708 が含まれますが、その値は最終的な Retry パケットには含まれません。

ff000000010008f067a5502a4262b574 6f6b656e04a265ba2eff4d829058fb3f
0f2496ba

A.5. ChaCha20-Poly1305 短ヘッダーパケット

この例は、短ヘッダーでパケットを保護するために必要ないくつかのステップを示しています。この例では AEAD_CHACHA20_POLY1305 を使用します。

(詳細な鍵導出とパケット保護の手順は省略 - 原文参照)

保護されたパケットは21バイトの最小可能パケットサイズです:

packet = 4cfe4189655e5cd55c41f69080575d7999c25a5bfb