Passa al contenuto principale

4. The DTLS Record Layer (Il livello record DTLS)

4. The DTLS Record Layer (Il livello record DTLS)

Il livello record DTLS 1.3 è diverso dal livello record TLS 1.3 ed è anche diverso dal livello record DTLS 1.2.

  1. La struttura DTLSCiphertext omette i campi superflui del numero di versione e del tipo.

  2. DTLS aggiunge un'epoca e un numero di sequenza all'intestazione del record TLS. Questo numero di sequenza consente al destinatario di decifrare e verificare correttamente i record DTLS. Tuttavia, il numero di bit utilizzati per i campi epoca e numero di sequenza nella struttura DTLSCiphertext è stato ridotto rispetto alle versioni precedenti.

  3. L'epoca DTLS serializzata in DTLSPlaintext è lunga 2 ottetti per compatibilità con DTLS 1.2. Tuttavia, questo valore è impostato come i 2 ottetti meno significativi dell'epoca di connessione, che è un contatore a 8 ottetti incrementato ad ogni KeyUpdate. Vedere la sezione 4.2 per i dettagli. Il numero di sequenza è impostato come i 48 bit di ordine inferiore del numero di sequenza a 64 bit. I record in chiaro NON DEVONO essere inviati con numeri di sequenza che supererebbero 2^48-1, quindi i 16 bit superiori saranno sempre 0.

  4. La struttura DTLSCiphertext ha un'intestazione a lunghezza variabile.

I record DTLSPlaintext vengono utilizzati per inviare record non protetti e i record DTLSCiphertext vengono utilizzati per inviare record protetti.

I formati dei record DTLS sono mostrati di seguito. A meno che non sia esplicitamente indicato, il significato dei campi è invariato rispetto alle versioni TLS/DTLS precedenti.

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;

Figura 2: Formati dei record DTLS 1.3

legacy_record_version: Questo valore DEVE essere impostato su {254, 253} per tutti i record diversi dal ClientHello iniziale (cioè, uno non generato dopo un HelloRetryRequest), dove può anche essere {254, 255} per scopi di compatibilità. DEVE essere ignorato per tutti gli scopi. Vedere [TLS13], Appendice D.1 per la motivazione.

epoch: I 2 byte meno significativi del valore dell'epoca di connessione.

unified_hdr: L'intestazione unificata (unified_hdr) è una struttura di lunghezza variabile, mostrata nella figura 3.

encrypted_record: La forma cifrata della struttura DTLSInnerPlaintext serializzata.

  0 1 2 3 4 5 6 7
+-+-+-+-+-+-+-+-+
|0|0|1|C|S|L|E E|
+-+-+-+-+-+-+-+-+
| Connection ID | Legenda:
| (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) |
+-+-+-+-+-+-+-+-+

Figura 3: Intestazione unificata DTLS 1.3

Fixed Bits: I tre bit alti del primo byte dell'intestazione unificata sono impostati su 001. Questo garantisce che il valore si adatti alla regione DTLS quando viene eseguito il multiplexing come descritto in [RFC7983]. Garantisce inoltre che sia possibile distinguere i record DTLS 1.3 cifrati dai record DTLS 1.2 cifrati quando vengono trasportati sullo stesso quartetto host/porta; tale multiplexing è possibile solo quando sono in uso i CID [RFC9146], nel qual caso i record DTLS 1.2 avranno il tipo di contenuto tls12_cid (25).

C: Il bit C (0x10) è impostato se è presente il Connection ID.

S: Il bit S (0x08) indica la dimensione del numero di sequenza. 0 significa un numero di sequenza a 8 bit, 1 significa 16 bit. Le implementazioni POSSONO mescolare numeri di sequenza di lunghezze diverse sulla stessa connessione.

L: Il bit L (0x04) è impostato se è presente la lunghezza.

E: I due bit bassi (0x03) includono i due bit di ordine inferiore dell'epoca.

Connection ID: CID a lunghezza variabile. La funzionalità CID è descritta in [RFC9146]. Un esempio si trova nella sezione 9.1.

Sequence Number: Gli 8 o 16 bit di ordine inferiore del numero di sequenza del record. Questo valore è di 16 bit se il bit S è impostato su 1 e di 8 bit se il bit S è 0.

Length: Identico al campo lunghezza in un record TLS 1.3.

Come con le versioni precedenti di DTLS, più record DTLSPlaintext e DTLSCiphertext possono essere inclusi nello stesso datagramma di trasporto sottostante.

La figura 4 illustra diverse intestazioni di record.

 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

Figura 4: Esempi di intestazioni DTLS 1.3

Il campo lunghezza PUÒ essere omesso azzerando il bit L, il che significa che il record consuma l'intero resto del datagramma nel trasporto di livello inferiore. In questo caso, non è possibile avere più record in formato DTLSCiphertext senza campi di lunghezza nello stesso datagramma. L'omissione del campo lunghezza DEVE essere utilizzata solo per l'ultimo record in un datagramma. Le implementazioni POSSONO mescolare record con e senza campi di lunghezza sulla stessa connessione.

Se viene negoziato un Connection ID, allora DEVE essere contenuto in tutti i datagrammi. Le implementazioni mittente NON DEVONO mescolare record da più associazioni DTLS nello stesso datagramma. Se il secondo o successivo record ha un connection ID che non corrisponde alla stessa associazione utilizzata per i record precedenti, il resto del datagramma DEVE essere scartato.

Quando espansi, l'epoca e il numero di sequenza possono essere combinati in una struttura RecordNumber non compressa, come mostrato di seguito:

struct {
uint64 epoch;
uint64 sequence_number;
} RecordNumber;

Questo valore a 128 bit viene utilizzato nel messaggio ACK così come nell'input "record_sequence_number" alla funzione Authenticated Encryption with Associated Data (AEAD). L'intero valore dell'intestazione mostrato nella figura 4 (ma prima della crittografia del numero di record; vedere la sezione 4.2.3) viene utilizzato come valore dei dati aggiuntivi per la funzione AEAD. Ad esempio, se viene utilizzata la variante minima, i dati associati (AD) sono lunghi 2 ottetti. Si noti che questo design è diverso dal calcolo dei dati aggiuntivi per DTLS 1.2 e per DTLS 1.2 con Connection ID. In DTLS 1.3 il sequence_number a 64 bit viene utilizzato come numero di sequenza per il calcolo AEAD; a differenza di DTLS 1.2, l'epoca non è inclusa.