CCMP
# CCMP

Il CCMP, sigla di Counter-Mode/CBC-Mac Protocol, è un metodo di cifratura utilizzato dallo standard IEEE 802.11i per la gestione delle chiavi e dell'integrità dei messaggi. Il CCMP fa parte del programma di certificazione WPA2, che sostituisce l'insicuro WEP e rappresenta un'alternativa più sicura del metodo crittografico TKIP implementato nella prima versione del WPA.

Il CCMP è basato sul cifrario a blocchi AES.

## Funzionamento

Nel CCMP l'AES viene utilizzato in una particolare modalità operativa definita CCM (Counter with CBC-MAC) in cui all'algoritmo crittografico, che opera in modalità Counter Mode (CTR), viene accoppiato un codice di autenticazione MAC (CBC-MAC).

Come vettore di inizializzazione (VI) del cifrario viene utilizzato un contatore di 48 bit (il doppio di quello del WEP) così da assicurare di avere sempre un VI diverso per ogni messaggio. Il CCMP opera su blocchi di dati di 128 bit e con chiavi lunghe 128 bit

### Autenticazione ed Integrità

Il primo passo è la generazione di un codice di autenticazione per il pacchetto 802.11. Questo codice, definito MIC (Message Integrity Code), è creato nel modo seguente:

* si cifra un primo blocco di 128 bit con l'AES ed una chiave di autenticazione;
* si esegue uno XOR fra il risultato della precedente operazione ed i successivi 128 bit del messaggio;
* si cifra nuovamente il risultato con l'AES e la stessa chiave di autenticazione;
* si esegue uno XOR fra il risultato del passo precedente ed i successivi 128 bit del messaggio;
* si continuano ad eseguire i punti 3 e 4 finché non si è operato su tutti i bit del messaggio da cifrare.
* alla fine si troncano i 128 bit finali prendendone solo 64: questo è il MIC

Contrariamente al WEP ed al WPA, il calcolo per l'integrità viene eseguito anche sui campi dell'intestazione del pacchetto.

### Cifratura

L'intestazione del pacchetto CCMP contiene il valore iniziale del contatore utilizzato nel processo crittografico. La cifratura si esegue blocco per blocco secondo il seguente schema:

* si cifra il valore iniziale del contatore con l'AES e la chiave di cifratura;
* si esegue uno XOR tra il valore cifrato del contatore ed i 128 bit del blocco, ottenendo il primo blocco cifrato;
* si incrementa il contatore e si cifra con l'AES, sempre utilizzando la stessa chiave di cifratura;
* si esegue uno XOR fra il valore cifrato del contatore ed i 128 bit del blocco successivo, ottenendo un altro blocco cifrato;
* si continua dal punto 3 fino a che non sono stati trattati tutti i blocchi;
* per l'ultimo blocco, si conserva il risultato di uno XOR fra il contatore e gli ultimi bit di dati.
