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

4. The DTLS Record Layer (DTLSレコード層)

4. The DTLS Record Layer (DTLSレコード層)

DTLS 1.3レコード層は, TLS 1.3レコード層とは異なり, DTLS 1.2レコード層とも異なります。

  1. DTLSCiphertext構造体は, 余分なバージョン番号とタイプフィールドを省略します。

  2. DTLSは, TLSレコードヘッダーにエポックとシーケンス番号を追加します。このシーケンス番号により, 受信者はDTLSレコードを正しく復号化および検証できます。ただし, DTLSCiphertext構造体のエポックおよびシーケンス番号フィールドに使用されるビット数は, 以前のバージョンから削減されています。

  3. DTLSPlaintextでシリアライズされたDTLSエポックは, DTLS 1.2との互換性のために2オクテット長です。ただし, この値は接続エポックの最下位2オクテットとして設定され, 接続エポックはKeyUpdateごとに増分される8オクテットカウンターです。詳細は第4.2節を参照してください。シーケンス番号は, 64ビットシーケンス番号の下位48ビットに設定されます。プレーンテキストレコードは, 2^48-1を超えるシーケンス番号で送信してはなりません。したがって, 上位16ビットは常に0になります。

  4. DTLSCiphertext構造体は, 可変長ヘッダーを持ちます。

DTLSPlaintextレコードは保護されていないレコードの送信に使用され, DTLSCiphertextレコードは保護されたレコードの送信に使用されます。

DTLSレコード形式を以下に示します。明示的に記載されていない限り, フィールドの意味は以前のTLS/DTLSバージョンから変更されていません。

struct {
ContentType type;
ProtocolVersion legacy_record_version;
uint16 epoch = 0
uint48 sequence_number;
uint16 length;
opaque fragment[DTLSPlaintext.length];
} DTLSPlaintext;

struct {
opaque content[DTLSPlaintext.length];
ContentType type;
uint8 zeros[length_of_padding];
} DTLSInnerPlaintext;

struct {
opaque unified_hdr[variable];
opaque encrypted_record[length];
} DTLSCiphertext;

図2: DTLS 1.3レコード形式

legacy_record_version: 初期ClientHello(つまり, HelloRetryRequest後に生成されていないもの)以外のすべてのレコードについて, この値は{254, 253}に設定しなければなりません。互換性の目的で, 初期ClientHelloでは{254, 255}でもかまいません。すべての目的で無視しなければなりません。この根拠については, [TLS13]付録D.1を参照してください。

epoch: 接続エポック値の最下位2バイト。

unified_hdr: 統合ヘッダー(unified_hdr)は, 図3に示す可変長の構造体です。

encrypted_record: シリアライズされたDTLSInnerPlaintext構造体の暗号化形式。

  0 1 2 3 4 5 6 7
+-+-+-+-+-+-+-+-+
|0|0|1|C|S|L|E E|
+-+-+-+-+-+-+-+-+
| Connection ID | 凡例:
| (if any, |
/ length as / C - Connection ID (CID) present
| negotiated) | S - Sequence number length
+-+-+-+-+-+-+-+-+ L - Length present
| 8 or 16 bit | E - Epoch
|Sequence Number|
+-+-+-+-+-+-+-+-+
| 16 bit Length |
| (if present) |
+-+-+-+-+-+-+-+-+

図3: DTLS 1.3統合ヘッダー

Fixed Bits: 統合ヘッダーの最初のバイトの上位3ビットは001に設定されます。これにより, [RFC7983]で説明されているように多重化が実行される際に, 値がDTLS領域内に収まることが保証されます。また, 暗号化されたDTLS 1.3レコードと暗号化されたDTLS 1.2レコードが同じホスト/ポート4つ組で伝送される場合に, それらを区別できることも保証されます。このような多重化は, CID [RFC9146]が使用されている場合にのみ可能であり, その場合DTLS 1.2レコードはコンテンツタイプtls12_cid (25)を持ちます。

C: Connection IDが存在する場合, Cビット(0x10)が設定されます。

S: Sビット(0x08)は, シーケンス番号のサイズを示します。0は8ビットシーケンス番号を意味し, 1は16ビットを意味します。実装は, 同じ接続で異なる長さのシーケンス番号を混在させてもかまいません。

L: 長さが存在する場合, Lビット(0x04)が設定されます。

E: 下位2ビット(0x03)には, エポックの下位2ビットが含まれます。

Connection ID: 可変長CID。CID機能は[RFC9146]で説明されています。例は第9.1節にあります。

Sequence Number: レコードシーケンス番号の下位8ビットまたは16ビット。Sビットが1に設定されている場合, この値は16ビットであり, Sビットが0の場合は8ビットです。

Length: TLS 1.3レコードの長さフィールドと同一です。

以前のバージョンのDTLSと同様に, 複数のDTLSPlaintextおよびDTLSCiphertextレコードを同じ基礎となるトランスポートデータグラムに含めることができます。

図4は, さまざまなレコードヘッダーを示しています。

 0 1 2 3 4 5 6 7       0 1 2 3 4 5 6 7       0 1 2 3 4 5 6 7
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
| Content Type | |0|0|1|1|1|1|E E| |0|0|1|0|0|0|E E|
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
| 16 bit | | | |8 bit Seq. No. |
| Version | / Connection ID / +-+-+-+-+-+-+-+-+
+-+-+-+-+-+-+-+-+ | | | |
| 16 bit | +-+-+-+-+-+-+-+-+ | Encrypted |
| Epoch | | 16 bit | / Record /
+-+-+-+-+-+-+-+-+ |Sequence Number| | |
| | +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
| | | 16 bit |
| 48 bit | | Length | DTLSCiphertext
|Sequence Number| +-+-+-+-+-+-+-+-+ Structure
| | | | (minimal)
| | | Encrypted |
+-+-+-+-+-+-+-+-+ / Record /
| 16 bit | | |
| Length | +-+-+-+-+-+-+-+-+
+-+-+-+-+-+-+-+-+
| | DTLSCiphertext
| | Structure
/ Fragment / (full)
| |
+-+-+-+-+-+-+-+-+

DTLSPlaintext
Structure

図4: DTLS 1.3ヘッダー例

Lビットをクリアすることで長さフィールドを省略してもかまいません。これは, レコードが下位レベルトランスポートのデータグラムの残り全体を消費することを意味します。この場合, 同じデータグラム内に長さフィールドのない複数のDTLSCiphertext形式レコードを持つことはできません。長さフィールドの省略は, データグラムの最後のレコードにのみ使用しなければなりません。実装は, 同じ接続で長さフィールドのあるレコードとないレコードを混在させてもかまいません。

Connection IDがネゴシエートされた場合, すべてのデータグラムに含めなければなりません。送信実装は, 同じデータグラム内に複数のDTLSアソシエーションからのレコードを混在させてはなりません。2番目以降のレコードが以前のレコードに使用されたアソシエーションに対応しないconnection IDを持つ場合, データグラムの残りは破棄しなければなりません。

拡張すると, エポックとシーケンス番号は, 以下に示すように展開されたRecordNumber構造体に結合できます。

struct {
uint64 epoch;
uint64 sequence_number;
} RecordNumber;

この128ビット値は, ACKメッセージおよび関連データ付き認証暗号化(AEAD)関数への"record_sequence_number"入力で使用されます。図4に示されているヘッダー値全体(ただしレコード番号暗号化の前, 第4.2.3節参照)は, AEAD関数の追加データ値として使用されます。たとえば, 最小バリアントが使用される場合, 関連データ(AD)は2オクテット長です。この設計は, DTLS 1.2およびConnection ID付きDTLS 1.2の追加データ計算とは異なることに注意してください。DTLS 1.3では, 64ビットsequence_numberがAEAD計算のシーケンス番号として使用されます。DTLS 1.2とは異なり, エポックは含まれません。