Counter-Mode/CBC-Mac protocol
# Counter-Mode/CBC-Mac protocol

En cryptologie, CCMP (Counter-Mode/CBC-Mac protocol) est un protocole de chiffrement défini dans le standard IEEE 802.11i. CCMP gère les clés et l'intégrité des messages.

Il s'agit d'une alternative considérée comme plus sûre que TKIP qui est utilisé dans WPA sur ce système basé sur AES.

## Fonctionnement

Le protocole utilise le chiffrement par bloc AES dans un mode d'opération de type "compteur" couplé à code d'authentification MAC (CBC-MAC). Le compteur sert à assurer un chiffrement sûr en évitant d'avoir un vecteur d'initialisation identique pour chaque message alors que le code d'authentification permet de vérifier que le message n'a pas été altéré.

La spécification de CCM prévoit un chiffrement utilisant des blocs de 128 bits. Deux paramètres doivent être définis :

* M, soit la taille du champ destiné à recevoir le code d'authentification. Des multiples de 2 octets (entre 4 et 16 octets) sont les valeurs autorisées. Le choix de la longueur dépend de la résistance désirée contre les attaques et la longueur du message final.
* L, la longueur du champ destiné à recevoir la taille du message. La valeur est comprise entre 2 et 8 octets et doit être adaptée en fonction de M.

Le compteur (Packet number) passe à 48 bits, soit le double des 24 bits présents dans le WEP. L'espace du vecteur d'initialisation est donc considérablement augmenté. Des clés temporaires de 128 bits sont extraites automatiquement de la clé principale et d'autres valeurs.

### Authentification

La première étape consiste à générer un code d'authentification pour le paquet 802.11. Ce code, le MIC (message integrity code) est produit avec les étapes suivantes qui hachent le message selon une clé d'authentification :

* chiffrer un premier bloc de données de 128 bits avec AES grâce à une clé d'authentification
* faire un XOR entre ce résultat et les 128 bits suivants de données
* chiffrer ce nouveau résultat avec AES (toujours avec la même clé d'authentification)
* faire un XOR entre ce résultat et les 128 bits suivants de données

On répète les deux dernières opérations pour traiter tous les blocs. On tronque ensuite le résultat final de 128 bits pour extraire les 64 bits de poids fort. C'est le MIC. L'intégrité se fait également sur les champs fixes de l'en-tête du paquet (contrairement à WEP et à WPA).

### Chiffrement

L'en-tête du paquet CCMP contient la valeur initiale du compteur (128 bits) utilisé pour le mode d'opération. Le chiffrement se fait bloc par bloc selon la procédure suivante :

* chiffrer la valeur initiale du compteur avec AES et la clé de chiffrement
* procéder à un XOR entre ce compteur chiffré et les 128 bits de données, on obtient le premier bloc chiffré
* incrémenter le compteur et le chiffrer avec AES (toujours avec la même clé)
* procéder à un XOR entre ce compteur chiffré et les 128 bits suivants de données, on obtient un autre bloc chiffré

On continue avec les deux dernières étapes jusqu'à avoir traité tous les blocs. Pour le dernier bloc, on conserve le résultat d'un XOR entre le compteur et les derniers bits de données.

