4.3.1. Key Derivation Algorithm (Algoritmo di derivazione della chiave)
4.3.1. Key Derivation Algorithm (Algoritmo di derivazione della chiave)
Indipendentemente dalla trasformazione di crittografia o autenticazione dei messaggi impiegata (può essere una trasformazione predefinita SRTP o di nuova introduzione secondo la sezione 6), le implementazioni SRTP interoperabili DEVONO utilizzare la derivazione della chiave SRTP per generare le chiavi di sessione. Una volta che il tasso di derivazione della chiave è correttamente segnalato all'inizio della sessione, non è necessaria alcuna comunicazione aggiuntiva tra le parti che utilizzano la derivazione della chiave SRTP.
packet index ---+
|
v
+-----------+ master +--------+ session encr_key
| ext | key | |---------->
| key mgmt |-------->| key | session auth_key
| (optional | | deriv |---------->
| rekey) |-------->| | session salt_key
| | master | |---------->
+-----------+ salt +--------+
Figura 5: Derivazione della chiave SRTP.
Almeno una derivazione iniziale della chiave DEVE essere eseguita da SRTP, cioè la prima derivazione della chiave è RICHIESTA. Ulteriori applicazioni della derivazione della chiave POSSONO essere eseguite, secondo il valore key_derivation_rate nel contesto crittografico. La funzione di derivazione della chiave DEVE essere inizialmente invocata prima del primo pacchetto e poi, quando r è maggiore di zero, viene eseguita una derivazione della chiave ogni volta che index mod r è uguale a zero. Questo può essere considerato come un "aggiornamento" delle chiavi di sessione. Il valore di key_derivation_rate DEVE rimanere fisso per tutta la durata della chiave master associata.
Le implementazioni SRTP interoperabili POSSONO anche derivare chiavi di salting di sessione per le trasformazioni di crittografia, come viene fatto in entrambe le trasformazioni predefinite.
Siano m e n numeri interi positivi. Una famiglia di funzioni pseudocasuali è un insieme di funzioni con chiave PRF_n(k,x) tale che per la chiave casuale (segreta) k, dato x di m bit, PRF_n(k,x) è una stringa di n bit, computazionalmente indistinguibile da stringhe di n bit casuali, vedere [HAC]. Per lo scopo della derivazione della chiave in SRTP, DEVE essere utilizzata una PRF sicura con m = 128 (o più), e una trasformazione PRF predefinita è definita nella sezione 4.3.3.
Sia "a DIV t" la divisione intera di a per t, arrotondata per difetto, e con la convenzione che "a DIV 0 = 0" per ogni a. Adottiamo anche la convenzione di trattare "a DIV t" come una stringa di bit della stessa lunghezza di a, e quindi "a DIV t" avrà in generale zeri iniziali.
La derivazione della chiave DEVE essere definita come segue in termini di <label>, una costante a 8 bit (vedere sotto), master_salt e key_derivation_rate, come determinato nel contesto crittografico, e index, l'indice del pacchetto (cioè il ROC || SEQ a 48 bit per SRTP):
-
Sia
r = index DIV key_derivation_rate(con DIV come definito sopra). -
Sia
key_id = <label> || r. -
Sia
x = key_id XOR master_salt, dovekey_idemaster_saltsono allineati in modo che i loro bit meno significativi coincidano (allineamento a destra).
<label> DEVE essere univoco per ogni tipo di chiave da derivare. Attualmente definiamo <label> da 0x00 a 0x05 (vedere sotto), e le estensioni future POSSONO specificare nuovi valori nell'intervallo da 0x06 a 0xff per altri scopi. La chiave SRTP (o salt) a n bit per questo pacchetto DEVE quindi essere derivata dalla chiave master, k_master come segue:
PRF_n(k_master, x).
(La PRF può specificare internamente ulteriore formattazione e riempimento di x, vedere ad esempio la sezione 4.3.3 per la PRF predefinita.)
Le chiavi e il salt di sessione DEVONO ora essere derivati utilizzando:
-
k_e(crittografia SRTP): <label> = 0x00,n = n_e. -
k_a(autenticazione del messaggio SRTP): <label> = 0x01,n = n_a. -
k_s(chiave di salting SRTP): <label> = 0x02,n = n_s.
dove n_e, n_s e n_a provengono dal contesto crittografico.
La chiave master e il salt master DEVONO essere casuali, ma il salt master PUÒ essere pubblico.
Si noti che per un key_derivation_rate pari a 0, l'applicazione della derivazione della chiave DEVE avvenire esattamente una volta.
La definizione di DIV sopra è puramente per comodità notazionale. Per un t non nullo tra l'insieme dei tassi di derivazione della chiave consentiti, "a DIV t" può essere implementato come uno spostamento a destra del logaritmo in base 2 di t. L'operazione di derivazione è ulteriormente facilitata se i tassi sono scelti come potenze di 256, ma tale granularità è stata considerata troppo grossolana per essere un requisito di questa specifica.
Il limite superiore sul numero di pacchetti che possono essere protetti utilizzando la stessa chiave master (vedere sezione 9.2) è indipendente dalla derivazione della chiave.