4. Coppie Attributo-Valore dei Messaggi di Controllo
Per massimizzare l'estensibilità pur consentendo l'interoperabilità, in tutto L2TP viene utilizzato un metodo uniforme per la codifica dei tipi di messaggio e dei corpi. Questa codifica sarà denominata AVP (Attribute-Value Pair, Coppia Attributo-Valore) nel resto di questo documento.
4.1 Formato AVP
Ogni AVP è codificato come segue:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|M|H| rsvd | Length | Vendor ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Attribute Type | Attribute Value...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
[fino a quando Length è raggiunto]... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
I primi sei bit sono una maschera di bit che descrive gli attributi generali dell'AVP.
In questo documento sono definiti due bit, i restanti sono riservati per estensioni future. I bit riservati DEVONO essere impostati a 0. Un AVP ricevuto con un bit riservato impostato a 1 DEVE essere trattato come un AVP non riconosciuto.
Bit Mandatory (M): Controlla il comportamento richiesto di un'implementazione che riceve un AVP che non riconosce. Se il bit M è impostato su un AVP non riconosciuto all'interno di un messaggio associato a una particolare sessione, la sessione associata a questo messaggio DEVE essere terminata. Se il bit M è impostato su un AVP non riconosciuto all'interno di un messaggio associato all'intero tunnel, l'intero tunnel (e tutte le sessioni al suo interno) DEVE essere terminato. Se il bit M non è impostato, un AVP non riconosciuto DEVE essere ignorato. Il messaggio di controllo deve quindi continuare a essere elaborato come se l'AVP non fosse stato presente.
Bit Hidden (H): Identifica l'occultamento dei dati nel campo Attribute Value di un AVP. Questa capacità può essere utilizzata per evitare il passaggio di dati sensibili, come le password degli utenti, in chiaro in un AVP. La sezione 4.3 descrive la procedura per eseguire l'occultamento dell'AVP.
Length: Codifica il numero di ottetti (inclusi i campi Overall Length e maschera di bit) contenuti in questo AVP. La Length può essere calcolata come 6 + la lunghezza del campo Attribute Value in ottetti. Il campo stesso è di 10 bit, consentendo un massimo di 1023 ottetti di dati in un singolo AVP. La lunghezza minima di un AVP è 6. Se la lunghezza è 6, il campo Attribute Value è assente.
Vendor ID: Il valore IANA assegnato "SMI Network Management Private Enterprise Codes" [RFC1700]. Il valore 0, corrispondente ai valori degli attributi adottati dall'IETF, viene utilizzato per tutti gli AVP definiti in questo documento. Qualsiasi fornitore che desideri implementare le proprie estensioni L2TP può utilizzare il proprio Vendor ID insieme a valori Attribute privati, garantendo che non entreranno in collisione con le estensioni di altri fornitori, né con future estensioni IETF. Si noti che sono allocati 16 bit per il Vendor ID, limitando così questa funzionalità alle prime 65.535 imprese.
Attribute Type: Un valore di 2 ottetti con un'interpretazione unica in tutti gli AVP definiti sotto un dato Vendor ID.
Attribute Value: Questo è il valore effettivo come indicato dal Vendor ID e dall'Attribute Type. Segue immediatamente dopo il campo Attribute Type e si estende per gli ottetti rimanenti indicati in Length (cioè Length meno 6 ottetti di intestazione). Questo campo è assente se Length è 6.
4.2 AVP Obbligatori
La ricezione di un AVP sconosciuto con il bit M impostato è catastrofica per la sessione o il tunnel a cui è associato. Pertanto, il bit M dovrebbe essere definito solo per gli AVP che sono assolutamente cruciali per il corretto funzionamento della sessione o del tunnel. Inoltre, nel caso in cui il LAC o LNS riceva un AVP sconosciuto con il bit M impostato e chiuda di conseguenza la sessione o il tunnel, è piena responsabilità del peer che invia l'AVP obbligatorio accettare la colpa per aver causato una situazione non interoperabile. Prima di definire un AVP con il bit M impostato, in particolare un AVP specifico del fornitore, assicurarsi che questa sia la conseguenza prevista.
Quando esiste un'alternativa adeguata all'uso del bit M, dovrebbe essere utilizzata. Ad esempio, piuttosto che inviare semplicemente un AVP con il bit M impostato per determinare se esiste un'estensione specifica, la disponibilità può essere identificata inviando un AVP in un messaggio di richiesta e aspettandosi un AVP corrispondente in un messaggio di risposta.
L'uso del bit M con nuovi AVP (quelli non definiti in questo documento) DEVE fornire la capacità di configurare la funzionalità associata come disattivata, in modo che l'AVP non venga inviato o venga inviato senza il bit M impostato.
4.3 Occultamento dei Valori degli Attributi AVP
Il bit H nell'intestazione di ogni AVP fornisce un meccanismo per indicare al peer ricevente se il contenuto dell'AVP è nascosto o presente in chiaro. Questa funzionalità può essere utilizzata per nascondere dati sensibili dei messaggi di controllo come password utente o ID utente.
Il bit H DEVE essere impostato solo se esiste un segreto condiviso tra LAC e LNS. Il segreto condiviso è lo stesso segreto utilizzato per l'autenticazione del tunnel (vedere sezione 5.1.1). Se il bit H è impostato in uno o più AVP in un dato messaggio di controllo, un AVP Random Vector deve essere presente anche nel messaggio e DEVE precedere il primo AVP con un bit H di 1.
L'occultamento di un valore AVP viene eseguito in diversi passaggi. Il primo passaggio consiste nel prendere i campi lunghezza e valore dell'AVP originale (in chiaro) e codificarli in un sottoformato AVP nascosto come segue:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Length of Original Value | Original Attribute Value ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
... | Padding ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Length of Original Attribute Value: Questa è la lunghezza del valore dell'attributo originale da oscurare in ottetti. Questo è necessario per determinare la lunghezza originale del valore dell'attributo che viene persa quando viene aggiunto il padding aggiuntivo.
Original Attribute Value: Valore dell'attributo che deve essere oscurato.
Padding: Ottetti aggiuntivi casuali utilizzati per oscurare la lunghezza del valore dell'attributo che viene nascosto.
Per mascherare la dimensione dei dati nascosti, il sottoformato risultante PUÒ essere riempito come mostrato sopra. Il padding NON altera il valore inserito nel campo Length of Original Attribute Value, ma altera la lunghezza dell'AVP risultante che viene creato.
Successivamente, viene eseguito un hash MD5 sulla concatenazione di:
- il numero di attributo di 2 ottetti dell'AVP
- il segreto condiviso
- un vettore casuale di lunghezza arbitraria
Il valore del vettore casuale utilizzato in questo hash viene passato nel campo valore di un AVP Random Vector. Questo AVP Random Vector deve essere inserito nel messaggio dal mittente prima di qualsiasi AVP nascosto.
Il valore hash MD5 viene quindi sottoposto a XOR con il primo segmento di 16 ottetti (o meno) del sottoformato AVP nascosto e inserito nel campo Attribute Value dell'AVP nascosto.
Se il sottoformato è più lungo di 16 ottetti, viene calcolato un secondo hash MD5 unidirezionale su un flusso di ottetti costituito dal segreto condiviso seguito dal risultato del primo XOR. Tale hash viene sottoposto a XOR con il secondo segmento di 16 ottetti (o meno) del sottoformato e inserito negli ottetti corrispondenti del campo Value dell'AVP nascosto.
Se necessario, questa operazione viene ripetuta, con il segreto condiviso utilizzato insieme a ogni risultato XOR per generare l'hash successivo per eseguire lo XOR del segmento successivo del valore.
Il metodo di occultamento è stato adattato da RFC 2138 [RFC2138] che è stato preso dalla sezione "Mixing in the Plaintext" nel libro "Network Security" di Kaufman, Perlman e Speciner [KPS]. Segue una spiegazione dettagliata del metodo:
Chiamiamo il segreto condiviso S, il vettore casuale RV e il valore dell'attributo AV. Suddividiamo il campo valore in blocchi di 16 ottetti p1, p2, ecc. con l'ultimo riempito alla fine con dati casuali fino a un confine di 16 ottetti. Chiamiamo i blocchi di testo cifrato c(1), c(2), ecc. Definiremo anche i valori intermedi b1, b2, ecc.
b1 = MD5(AV + S + RV) c(1) = p1 xor b1
b2 = MD5(S + c(1)) c(2) = p2 xor b2
. .
. .
. .
bi = MD5(S + c(i-1)) c(i) = pi xor bi
La stringa conterrà c(1)+c(2)+...+c(i) dove + denota concatenazione.
Alla ricezione, il vettore casuale viene prelevato dall'ultimo AVP Random Vector incontrato nel messaggio prima dell'AVP da svelare. Il processo sopra viene quindi invertito per ottenere il valore originale.
4.4 Riepilogo AVP
Le seguenti sezioni contengono un elenco di tutti gli AVP L2TP definiti in questo documento.
Dopo il nome dell'AVP segue un elenco che indica i tipi di messaggio che utilizzano ciascun AVP. Dopo ogni titolo AVP segue una breve descrizione dello scopo dell'AVP, un dettaglio (inclusa una grafica) del formato per il valore dell'attributo e qualsiasi informazione aggiuntiva necessaria per l'uso corretto dell'AVP.
4.4.1 AVP Applicabili a Tutti i Messaggi di Controllo
Message Type (Tutti i messaggi)
L'AVP Message Type, Attribute Type 0, identifica il messaggio di controllo e definisce il contesto in cui verrà determinato il significato esatto degli AVP seguenti.
Il campo Attribute Value per questo AVP ha il seguente formato:
0 1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Message Type |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Il Message Type è un intero senza segno di 2 ottetti.
L'AVP Message Type DEVE essere il primo AVP in un messaggio, immediatamente dopo l'intestazione del messaggio di controllo (definita nella sezione 3.1). Vedere la sezione 3.2 per l'elenco dei tipi di messaggio di controllo definiti e dei relativi identificatori.
Il bit Mandatory (M) all'interno dell'AVP Message Type ha un significato speciale. Piuttosto che un'indicazione sul fatto che l'AVP stesso debba essere ignorato se non riconosciuto, è un'indicazione sul fatto che il messaggio di controllo stesso debba essere ignorato. Pertanto, se il bit M è impostato all'interno dell'AVP Message Type e il Message Type è sconosciuto all'implementazione, il tunnel DEVE essere cancellato. Se il bit M non è impostato, l'implementazione può ignorare un tipo di messaggio sconosciuto. Il bit M DEVE essere impostato a 1 per tutti i tipi di messaggio definiti in questo documento. Questo AVP non può essere nascosto (il bit H DEVE essere 0). La lunghezza di questo AVP è 8.
Random Vector (Tutti i messaggi)
L'AVP Random Vector, Attribute Type 36, viene utilizzato per abilitare l'occultamento dell'Attribute Value di AVP arbitrari.
Il campo Attribute Value per questo AVP ha il seguente formato:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Random Octet String ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
La stringa di ottetti casuali può essere di lunghezza arbitraria, sebbene sia consigliato un vettore casuale di almeno 16 ottetti. La stringa contiene il vettore casuale da utilizzare nel calcolo dell'hash MD5 per recuperare o nascondere l'Attribute Value di un AVP nascosto (vedere sezione 4.2).
In un messaggio può apparire più di un AVP Random Vector, nel qual caso un AVP nascosto utilizza l'AVP Random Vector che lo precede più da vicino. Questo AVP DEVE precedere il primo AVP con il bit H impostato.
Il bit M per questo AVP DEVE essere impostato a 1. Questo AVP NON DEVE essere nascosto (il bit H DEVE essere 0). La lunghezza di questo AVP è 6 più la lunghezza della stringa di ottetti casuali.
(Continua: Seguono ulteriori definizioni AVP...)