Cette page explique comment une trame ZigBee est construite. L'exemple utilisé sur cette page est une trame écoutée sur un réseau Xiaomi domotique composé d'une passerelle Xiaomi GateWay version 2 et d'un bouton Aqara sans fil :
Le réseau a été espionné avec un AT86RF233 pour les trames brutes cryptées et une clé USB NXP OM15020 pour les trames décryptées comme expliqué sur cette page.
La clé de chiffrage (réseau) a été préalablement interceptée sur le réseau :
Network key: : AD 8E BB C4 F9 6A E7 00 05 06 D3 FC D1 62 7F B8
Le matériel utilisé permet d'écouter les trames cryptées et décryptée. Voici la trame cryptée interceptée par l'AT86RF233. La trame se compose de 53 octets :
Trame brute cryptée : 61 88 64 47 24 00 00 8A 5C 48 02 00 00 8A 5C 1E 5D 28 E1 00 00 00 01 3C E8 01 00 8D 15 00 01 EA 59 DE 1F 96 0E EA 8A EE 18 5A 11 89 30 96 41 4E 05 A2 43 8A FB
Voici maintenant la même trame après déchiffrage (même longueur de 53 octets) :
Trame brute décryptée : 61 88 64 47 24 00 00 8A 5C 48 02 00 00 8A 5C 1E 5D 28 E1 00 00 00 01 3C E8 01 00 8D 15 00 01 00 01 12 00 04 01 01 62 18 C3 0A 55 00 21 01 00 AC 4C 76 AF 8A FB
Cette trame est composée de 4 couches (MAC, NWK, APS et ZCL) qui sont encapsulée selon le schéma suivant :
Sur la figure suivante, les couches ont été séparées pour plus de clareté :
En s'appuyant sur les diagrammes ci-dessus, il est possible de décomposer les 53 octets de la trames brute selon cette répartition :
61 88 64 47 24 00 00 8A 5C
48 02 00 00 8A 5C 1E 5D
28 E1 00 00 00 01 3C E8 01 00 8D 15 00 01
00 01 12 00 04 01 01 62
18 C3 0A
55 00 21 01 00
AC 4C 76 AF
8A FB
L'en-tête MAC (Medium access control / Contrôle d'accès au support) est composée
de 9 octets (61 88 64 47 24 00 00 8A 5C
) détaillés ci-dessous :
Frame Control: 0x8861
···· ···· ···· ·001 = Frame Type: [0x1] Data
···· ···· ···· 0··· = Security Enabled: [0x0] No
···· ···· ···0 ···· = Frame Pending: [0x0] No
···· ···· ··1· ···· = Acknowledgement Request: [0x1] Yes
···· ···· ·1·· ···· = Intra-PAN: [0x1] Yes
···· ··00 0··· ···· = Reserved: 0x0
···· 10·· ···· ···· = Destination Addr Mode: [0x2] 16-bit Short Address
··00 ···· ···· ···· = Reserved: 0x0
10·· ···· ···· ···· = Source Addr Mode: [0x2] 16-bit Short Address
Sequence Number: 0x64 (100)
Destination PAN ID: 0x2447
Destination Address: 0x0000
Source Address: 0x5C8A
Les données utiles de la couche MAC sont copomposées de 42 octets qui contiennent la couche réseau :
48 02 00 00 8A 5C 1E 5D
28 E1 00 00 00 01 3C E8 01 00 8D 15 00 01
00 01 12 00 04 01 01 62
18 C3 0A 55 00 21 01 00
AC 4C 76 AF
L'en-tête NWK (de la couche réseau) ets composée de 8 octets (48 02 00 00 8A 5C 1E 5D
)
détaillés ci-dessous :
NWK Header: 0x5D1E5C8A00000248
Frame Control: 0x0248
···· ···· ···· ··00 = Frame Type: [0x0] Data
···· ···· ··00 10·· = Protocol Version: [0x2] Zigbee Pro
···· ···· 01·· ···· = Route Discovery: [0x1] Enabled
···· ···0 ···· ···· = Multicast Flag: [0x0] Unicast or Broadcast
···· ··1· ···· ···· = Security Enabled: [0x1] Yes
···· ·0·· ···· ···· = Source Route Included: [0x0] No
···· 0··· ···· ···· = Destination IEEE Address Included: [0x0] No
···0 ···· ···· ···· = Source IEEE Address Included: [0x0] No
··0· ···· ···· ···· = End Device Initiator: [0x0] No
00·· ···· ···· ···· = Reserved: 0x0
Destination Address: 0x0000
Source Address: 0x5C8A
Radius: 0x1E
Sequence Number: 0x5D (93)
L'en-tête réseau auxilière (ou l'en-tête de sécurité) est composée de 14 octets
(28 (ou 2D) E1 00 00 00 01 3C E8 01 00 8D 15 00 01
) détaillés ci-dessous :
NWK Aux Header: (14 bytes)
Network Security Control: 0x28 (ou 0x2D)
···· ·000 = Network Security Level: [0x0] None (devrait être 101)
···0 1··· = Key NWK ID: [0x1] Network Key
··1· ···· = Extended Nonce: [0x1] Yes
00·· ···· = Reserved: 0x0
NWK Frame Counter: 0xE1 (225)
Source Address: 00:15:8D:00:01:E8:3C:01
NWK Key Sequence Number: 0x01 (1)
Notons que les 3 bits network security level
ont été écrasés avant transmission et devraient
être remplacés par le niveau de sécurité défini dans l'attribut nwkSecurityLevel du NIB
(page 382 de la spécification ZigBee).
Dans la trame présentée ici, le niveau de sécurité devrait être 0x05 (0b101 ou ENC-MIC-32) d'après la
page 425de la spécification ZigBee).
Les données utiles de la couche réseau sont composées de 16 octets (00 01 12 00 04 01 01 62 18 C3 0A 55 00 21 01 00
)
qui encapsulent la couche APS (Application support sub-layer) :
00 01 12 00 04 01 01 62
18 C3 0A 55 00 21 01 00
APS Header: 0x6201010400120100
Frame Control: 0x00
···· ··00 = Frame Type: [0x0] Data
···· 00·· = Delivery Mode: [0x0] Normal Unicast Delivery
···0 ···· = Acknowledgement Format: 0x0
Format: [0x0] Data Frame
··0· ···· = Security Enabled: [0x0] No
·0·· ···· = Acknowledgement Request: 0x0
Request: [0x0] No
0··· ···· = Extended Header Present: [0x0] No
Destination Endpoint: 0x01
Cluster ID: [0x0012] General: Multistate Input (Basic)
Profile ID: [0x0104] Zigbee Home Automation
Source Endpoint: 0x01
APS Counter: 0x62 (98)
Les données utiles de la couche APS sont composée de 8 octets (18 C3 0A 55 00 21 01 00
):
ZCL Header: 0x0AC318
Frame Control: 0x18
···· ··00 = Frame Type: [0x0] Command Acts Across the Entire Profile
···· ·0·· = Manufacturer Specific: [0x0] Manufacturer Code Not Included in the ZCL Frame
···· 1··· = Direction: [0x1] From Server to Client
···1 ···· = Disable Default Response: [0x1] Yes
000· ···· = Reserved: 0x0
Transaction Sequence Number: 195
Command ID: 0x0A
General Command Frame: [0x0A] Report Attributes
ZCL Payload: 0x0001210055
Attributes 0: 0x0001210055
Attribute ID: [0x0055] Present Value
Data Type: [0x21] Unsigned 16-bit Integer
Data: 0x0001
Value: [1] Yes
Le code d'intégrité du message (message integrity code / MIC) est utilisé pour vérifier l'intégrité de la trame dans le processus de sécurisation des données :
NWK MIC: 0xAC4C76AF
MAC Footer: 0xFB8A
Frame Check Sequence: 0xFB8A