Service d'Association express
Le fournisseur d'Association express doit implémenter le service d'Association express (UUID 0xFE2C), qui présente les caractéristiques suivantes.
| Nom | Chiffré | Autorisations | UUID | Obligatoire ? |
|---|---|---|---|---|
| ID du modèle | Non | Lecture | FE2C1233-8366-4814-8EB0-01DE32100BEA |
Obligatoire |
| Association basée sur une clé | Non | Écrire et notifier | FE2C1234-8366-4814-8EB0-01DE32100BEA |
Obligatoire |
| Clé d'accès | Non | Écrire et notifier | FE2C1235-8366-4814-8EB0-01DE32100BEA |
Obligatoire |
| Clé de compte | Non | Écriture | FE2C1236-8366-4814-8EB0-01DE32100BEA |
Obligatoire |
| Données supplémentaires | Non | Écrire et notifier | FE2C1237-8366-4814-8EB0-01DE32100BEA |
*C1 |
| PSM du flux de messages | Oui | Lecture | FE2C1239-8366-4814-8EB0-01DE32100BEA |
*C2 |
| Clé d'accès supplémentaire | Non | Lecture, écriture et notification | FE2C123A-8366-4814-8EB0-01DE32100BEA |
*C3 |
| Action de l'appareil FP | Non | Écrire et notifier | FE2C123B-8366-4814-8EB0-01DE32100BEA |
*C4 |
Obligatoire sous certaines conditions
- C1 : si le fournisseur est compatible avec la fonctionnalité d'attribution de nom et n'implémente pas la caractéristique Action sur l'appareil FP
- C2 : si le fournisseur est compatible avec le flux de messages : L2CAP
- C3 : si le fournisseur dispose d'un canal de communication interne entre les composants
- C4 : si le fournisseur doit échanger des informations supplémentaires pendant le processus d'association, par exemple un fournisseur sans canal de communication interne entre les composants
Caractéristique : ID du modèle
Cette caractéristique permet au Chercheur de lire l'ID du modèle si nécessaire, en dehors des moments où l'appareil diffuse des annonces en mode visible. Elle doit toujours renvoyer les données suivantes :
| Octet | Type de données | Description | Valeur |
|---|---|---|---|
| 0 - 2 | uint24 |
ID du modèle | Variable |
Caractéristique : Association basée sur une clé
Cette caractéristique contrôle la procédure d'association basée sur une clé. Dans cette procédure, un certain niveau de confiance est établi en vérifiant que le demandeur et le fournisseur sont tous deux en possession d'une clé pré-partagée. La clé est différente dans chaque cas :
Cas 1 : La clé pré-partagée est basée sur la paire de clés publique/privée anti-spoofing et sur la paire de clés publique/privée du Seeker, qui change à chaque tentative d'association.
- Le fournisseur est en mode association.
- Le chercheur vérifie que le fournisseur est en possession de la clé privée anti-spoofing.
Notez qu'en mode association, le fournisseur peut également s'associer de la manière habituelle, par exemple pour s'associer à un appareil qui n'est pas compatible avec l'association basée sur une clé de l'Association express.
Cas 2 : La clé prépartagée est l'une des clés de compte.
- Le fournisseur n'est généralement pas en mode association. (Toutefois, il ne s'agit pas d'une exigence. Le fournisseur doit accepter l'utilisation d'une clé de compte, même en mode association.)
- Le demandeur et le fournisseur vérifient chacun que l'autre est en possession de la clé de compte.
Étant donné que les deux cas sont extrêmement similaires, à l'exception de la clé pré-partagée utilisée, ils sont combinés dans la procédure.
Format des données
Consultez la procédure pour savoir comment chaque format est utilisé.
| Octet | Type de données | Description | Valeur | Obligatoire ? |
|---|---|---|---|---|
| 0 à 15 | uint128 |
Requête chiffrée | Variable | Obligatoire |
| 16 à 79 | Clé publique | Variable | Facultatif |
Tableau 1.1 : requête chiffrée, écrite dans la caractéristique par le chercheur.
| Octet | Type de données | Description | Valeur | Obligatoire ? |
|---|---|---|---|---|
| 0 | uint8 |
Type de message | 0x00 = demande d'association basée sur une clé |
Obligatoire |
| 1 | uint8 |
Options
|
varie | Obligatoire |
| 2 - 7 | uint48 |
Soit :
|
varie | Obligatoire |
| 8 - 13 | uint48 |
Adresse BR/EDR du Seeker | varie | Présent uniquement si le bit 1 ou 3 de l'indicateur est défini |
| n - 15 | Valeur aléatoire (salage) | varie | Obligatoire |
Tableau 1.2.1 : Requête brute (type 0x00). Déchiffré à partir de la requête chiffrée dans le tableau 1.1.
| Octet | Type de données | Description | Valeur | Obligatoire ? |
|---|---|---|---|---|
| 0 | uint8 |
Type de message | 0x10 = Demande d'action |
Obligatoire |
| 1 | uint8 |
Options
|
varie | Obligatoire |
| 2 - 7 | uint48 |
Soit :
|
varie | Obligatoire |
| 8 | uint8 |
Message de groupe | varie | Obligatoire si le bit d'indicateur 0 est défini |
| 9 | uint8 |
Code du message | varie | Obligatoire si le bit d'indicateur 0 est défini |
| 10 | uint8 |
Dépend des options :
|
varie | Obligatoire si le bit d'indicateur 0 ou 1 est défini |
| 11 - n | Données supplémentaires | varie | Facultatif | |
| n - 15 | Valeur aléatoire (salage) | varie | Obligatoire |
Tableau 1.2.2 : requête brute (type 0x10). Déchiffré à partir de la requête chiffrée dans le tableau 1.1.
| Octet | Type de données | Description | Valeur |
|---|---|---|---|
| 0 | uint8 |
Type de message | 0x01 = réponse d'association basée sur une clé |
| 1 - 6 | uint48 |
Adresse publique (BR/EDR) du fournisseur | varie |
| 7 à 15 | Valeur aléatoire (salage) | varie |
Tableau 1.3 : Réponse brute (type 0x01). Chiffré pour produire la réponse chiffrée dans le tableau 1.4.
| Octet | Type de données | Description | Valeur |
|---|---|---|---|
| 0 | uint8 |
Type de message | 0x02 = Key-based Pairing Extended Response |
| 1 | uint8 |
Options
|
varie |
| 2 | uint8 |
Nombre d'adresses du fournisseur Les valeurs valides sont 1 et 2. |
varie |
| 3 à 8 ou 3 à 14 |
|
varie | |
| 9-15 ou 15 | Valeur aléatoire (salage) | varie |
Tableau 1.3.2 : Réponse brute (type 0x02). Chiffré pour produire la réponse chiffrée dans le tableau 1.4.
| Octet | Type de données | Description | Valeur |
|---|---|---|---|
| 0 à 15 | uint128 |
Réponse chiffrée | varie |
Tableau 1.4 : Réponse chiffrée, envoyée par le fournisseur au chercheur via une notification.
Caractéristique : clé d'accès
Cette caractéristique est utilisée lors de la procédure d'association basée sur une clé.
| Octet | Type de données | Description | Valeur |
|---|---|---|---|
| 0 à 15 | uint128 |
Bloc de clé d'accès chiffré | varie |
Tableau 2.1 : Bloc de clé d'accès chiffré. Pour en savoir plus sur l'utilisation, consultez la procédure d'association basée sur une clé.
| Octet | Type de données | Description | Valeur |
|---|---|---|---|
| 0 | uint8 |
Type de message | Au choix :
|
| 1 - 3 | unit32 |
Clé d'accès à six chiffres | varie |
| 4 à 15 | Valeur aléatoire (salage) | varie |
Tableau 2.2 : Bloc de clé d'accès brut. Version déchiffrée du tableau 2.1.
Caractéristique : clé de compte
Après l'association, le chercheur d'Association express écrit une clé de compte dans le fournisseur d'Association express.
| Octet | Type de données | Description | Valeur |
|---|---|---|---|
| 0 à 15 | uint128 |
Clé de compte (chiffrée) | varie |
Lorsqu'il reçoit une requête d'écriture, le fournisseur d'Association express doit effectuer les opérations suivantes :
- Déchiffrez la clé de compte à l'aide du secret partagé généré à l'étape 4 de la procédure.
- Pour les fournisseurs qui exigent un cautionnement (courant) :
- Avant de déchiffrer, vérifiez que le secret partagé a été utilisé pour déchiffrer la requête de clé d'accès de l'étape 12. Si cette étape n'a pas été effectuée à l'aide de ce secret, ignorez cette écriture et quittez.
- À ce stade, le secret partagé (K dans la procédure) ne sera plus utilisé pour cette association. Toute requête chiffrée avec cette clé qui arrive sans redémarrage de la procédure doit être rejetée.
- Pour les fournisseurs qui exigent un cautionnement (courant) :
- Vérifiez que la valeur déchiffrée commence par
0x04ou0xFF. Si ce n'est pas le cas, ignorez cette écriture et quittez.- Si la valeur est
0x04:- Vérifiez si la liste des clés de compte persistante dispose d'un espace pour la nouvelle valeur.
- Si ce n'est pas le cas, supprimez de la liste la valeur la moins récemment utilisée.
- Ajoutez la nouvelle valeur à la liste.
- Si la valeur est
0xFF:- Considérez cela comme une session d'association temporaire et n'effectuez aucune opération.
- Cela peut se produire avec le flux Écriture rétroactive de la clé de compte.
- Ne stockez pas la clé et ne l'utilisez pas dans la liste des clés de compte, le chiffrement ou les calculs MAC.
- La suppression de l'association est déclenchée par un événement ou un délai d'expiration spécifique à la fonctionnalité. Pour le partage audio LE, il est vivement recommandé de supprimer la liaison BLE et la clé de liaison 10 minutes après la déconnexion de la session temporaire.
- Si la valeur est
Les clés de compte de la liste sont utilisées lors de l'association basée sur des clés.
Caractéristique : Données supplémentaires
Ce service doit présenter les caractéristiques suivantes.
| Caractéristique du service d'Association express | Chiffré | Autorisations | UUID |
|---|---|---|---|
| Données | Non | Écrire et notifier | FE2C1237-8366-4814-8EB0-01DE32100BEA |
| Ancienne caractéristique du service Association express (obsolescence prévue le 01/01/2021) | Chiffré | Autorisations | UUID |
|---|---|---|---|
| Données | Non | Écrire et notifier | 0x1237 |
Avant d'écrire ou d'envoyer une notification à cette caractéristique, un handshake doit être effectué via la caractéristique FE2C1234-8366-4814-8EB0-01DE32100BEA pour obtenir un secret partagé. AES-CTR sera utilisé pour chiffrer les données transitant par cette caractéristique, dont l'algorithme est défini ci-dessous. Ce mode est plus sécurisé pour les données qui s'étendent au-delà d'un seul bloc de 16 octets. HMAC-SHA256 sera utilisé pour garantir l'intégrité des données, qui est également définie ci-dessous.
| Octet | Description | Valeur |
|---|---|---|
| 0 - 7 | Les huit premiers octets de HMAC-SHA256. | varie |
| 8 - 15 | Nonce, utilisé par le chiffrement AES-CTR. | varie |
| 16 - var | Données chiffrées. | varie |
Tableau 3.1 : Paquet de données, envoyé par le fournisseur au chercheur via une notification ou envoyé par le chercheur au fournisseur via une écriture.
| Octet | Type de données | Description | Valeur |
|---|---|---|---|
| 0 - var | byte array |
Données | varie, décodez-le en fonction de l'ID de données du tableau 1.2.2 :
|
Tableau 3.2 : Données brutes. Déchiffré à partir des données chiffrées du tableau 3.1.
Lorsqu'une notification est demandée (par exemple, demander un nom personnalisé via le bit 2 du tableau 1.2.1), le fournisseur d'Association express doit procéder comme suit :
- Générez 8 octets aléatoires de manière cryptographique pour le nonce.
Chiffrez les données à l'aide d'AES-CTR, où chaque bloc de 16 octets est généré à l'aide de
encryptedBlock[i] = clearBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))où
- La clé AES est le secret partagé de l'étape 4 de la procédure.
- clearBlock[i] est un bloc de 16 octets commençant à data[i * 16]. Le dernier bloc peut être inférieur à 16 octets.
Exécutez concat(encryptedBlock[0], encryptedBlock[1],...) pour créer les données chiffrées.
Générer un HMAC-SHA256 par
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, encrypted_data)))))où
- K est généré par concat(shared_secret, 48-byte ZEROs), où shared_secret provient de l'étape 4 de la procédure.
- opad est un remplissage externe de 64 octets, composé d'octets répétés d'une valeur de
0x5C. - "ipad" est un remplissage interne de 64 octets, composé d'octets répétés d'une valeur de
0x36.
Prenez les huit premiers octets du HMAC-SHA256 comme préfixe du paquet de données.
Lorsqu'il reçoit une requête d'écriture, le fournisseur d'Association express doit effectuer les opérations suivantes :
- Vérifiez l'intégrité des données en contrôlant les huit premiers octets de HMAC-SHA256.
Déchiffrez les données chiffrées à l'aide d'AES-CTR, où chaque bloc est généré à l'aide de
clearBlock[i] = encryptedBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))où
- encryptedBlock[i] est un bloc de 16 octets commençant à encrypted_data[i * 16]. Le dernier bloc peut faire moins de 16 octets.
- La clé AES est générée ou identifiée à partir du handshake, par exemple :
- Dans le flux de dénomination 1, elle provient d'ECDH et ne sera plus utilisée pour cette association. Toute requête chiffrée avec cette clé sans redémarrage de la procédure doit être rejetée.
- Dans le flux de dénomination 2, il s'agit de la clé de compte.
Effectuez concat(clearBlock[0], clearBlock[1],...) pour créer les données brutes.
Caractéristique : PSM du flux de messages
Consultez Appareil BLE : PSM du flux de messages.
Caractéristique : clé d'accès supplémentaire
Consultez Appareil BLE : clé d'accès supplémentaire.
Caractéristique : action sur l'appareil FP
| Caractéristique du service d'Association express | Chiffré | Autorisations | UUID |
|---|---|---|---|
| Action sur l'appareil FP | Non | Écrire et notifier | FE2C123B-8366-4814-8EB0-01DE32100BEA |
| Octet | Description | Valeur |
|---|---|---|
| 0 - 7 | Les huit premiers octets de HMAC-SHA256. | varie |
| 8 - 15 | Nonce, utilisé par le chiffrement AES-CTR. | varie |
| 16 - var | Données chiffrées. | varie |
Tableau 4.1 : Paquet de données, envoyé par le fournisseur au chercheur sous forme de notification, ou par le chercheur au fournisseur sous forme d'écriture.
| Octet | Type de données | Description | Valeur |
|---|---|---|---|
| 0 - var | byte array |
Demande d'action | Au choix :
|
Tableau 4.2 : Données brutes. Déchiffré à partir des données chiffrées du tableau 4.1 envoyées par le demandeur au fournisseur en tant qu'écriture.
| Octet | Type de données | Description | Valeur |
|---|---|---|---|
| 0 - var | byte array |
Réponse à l'action | Au choix :
|
Tableau 4.3 : Données brutes. Déchiffré à partir des données chiffrées du tableau 4.1 envoyé par le fournisseur au demandeur sous forme de notification.
| Octet | Type de données | Description | Valeur |
|---|---|---|---|
| 0 | uint8 |
Identifiant de l'action | 0x01 |
| 1 - var | utf8s |
Nom personnalisé | Variable |
Tableau 4.3.1 : format de nom personnalisé
| Octet | Type de données | Description | Valeur |
|---|---|---|---|
| 0 | uint8 |
Identifiant de l'action | 0x02 |
| 1 | uint8 |
Type de membre de l'ensemble coordonné d'Association express |
|
| 2 | uint8 |
Taille de l'ensemble coordonné | nombre de composants |
| 3 | uint8 |
Définir le type de clé de résolution d'identité | 0x01 (SIRK en texte brut) |
| 4 - 19 | uint128 |
Définir la valeur de la clé de résolution d'identité | Données de 16 octets, consultez Service d'identification d'ensemble coordonné. |
Tableau 4.3.2 : Format des informations sur les ensembles coordonnés
| Octet | Type de données | Description | Valeur |
|---|---|---|---|
| 0 | uint8 |
Identifiant de l'action | 0x03 |
| 1 - 2 | uint16 |
Fonctionnalités de l'appareil |
|
Tableau 4.3.3 : Format des fonctionnalités de l'appareil
Opérations d'Association express
Deux opérations principales sont définies pour cette caractéristique
- Lecture de l'Association express : lire les données du fournisseur
- Seeker : activer la notification GATT
- Fournisseur : notification GATT enregistrée
- Chercheur : requête d'écriture GATT, les données brutes ne contiennent que
Action ID - Fournisseur : réponse d'écriture GATT
- Fournisseur : GATT Notify, les données brutes contiennent
- Identifiant de l'action
- Données pour l'identifiant de l'action
- Seeker : notification GATT reçue
- Écriture de l'Association express : écrire des données dans le fournisseur
- Seeker : requête d'écriture GATT, les données brutes contiennent
- Identifiant de l'action
- Données pour l'identifiant de l'action
- Fournisseur : réponse d'écriture GATT
- Seeker : requête d'écriture GATT, les données brutes contiennent
ID d'action de lecture compatible avec l'Association express
- 0x01 (nom personnalisé)
- 0x02 (informations sur l'ensemble coordonné)
- 0x03 (Fonctionnalités de l'appareil)
ID d'action d'écriture compatible avec l'Association express
- 0x01 (nom personnalisé)
- Pour toute autre commande où une requête d'écriture comporte un identifiant de l'action suivi de données, le fournisseur doit répondre par une notification GATT contenant "Invalid Request" (0x81), comme décrit dans le tableau 4.3.
Si le fournisseur ne comprend pas un identifiant de l'action, il répond par une notification GATT contenant "Requête non compatible" (0x80), comme décrit dans le tableau 4.3.
Algorithme de chiffrement
.Lorsqu'une notification est demandée, le fournisseur de l'Association express doit effectuer les opérations suivantes :
- Générez 8 octets aléatoires de manière cryptographique pour le nonce.
Chiffrez les données à l'aide d'AES-CTR, où chaque bloc de 16 octets est généré à l'aide de
encryptedBlock[i] = clearBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))où
- La clé AES est le secret partagé de l'étape 4 de la procédure.
clearBlock[i]est un bloc de 16 octets commençant àdata[i * 16]. Le dernier bloc peut être inférieur à 16 octets.
Exécutez
concat(encryptedBlock[0], encryptedBlock[1],...)pour créer les données chiffrées.Générer un HMAC-SHA256 par
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, encrypted_data)))))où
- K est généré par concat(shared_secret, 48-byte ZEROs), où shared_secret provient de l'étape 4 de la procédure.
- opad est un remplissage externe de 64 octets, composé d'octets répétés d'une valeur de
0x5C. - "ipad" est un remplissage interne de 64 octets, composé d'octets répétés d'une valeur de
0x36.
Prenez les huit premiers octets du HMAC-SHA256 comme préfixe du paquet de données.
Lorsqu'il reçoit une requête d'écriture, le fournisseur d'Association express doit effectuer les opérations suivantes :
- Vérifiez l'intégrité des données en contrôlant les huit premiers octets de HMAC-SHA256.
Déchiffrez les données chiffrées à l'aide d'AES-CTR, où chaque bloc est généré à l'aide de
clearBlock[i] = encryptedBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))où
encryptedBlock[i]est un bloc de 16 octets commençant àencrypted_data[i * 16]. Le dernier bloc peut faire moins de 16 octets.- La clé AES est générée ou identifiée à partir du handshake, par exemple :
- Dans le flux de dénomination 1, elle provient d'ECDH et ne sera plus utilisée pour cette association. Toute requête chiffrée avec cette clé sans redémarrage de la procédure doit être rejetée.
- Dans le flux de dénomination 2, il s'agit de la clé de compte.
Exécutez
concat(clearBlock[0], clearBlock[1],...)pour créer les données brutes.
Service d'informations sur l'appareil
Le fournisseur d'Association express doit également être compatible avec le service d'informations sur l'appareil (UUID 0x180A). Le chercheur d'Association express utilise les caractéristiques suivantes.
| Nom | Chiffré | Autorisations | UUID |
|---|---|---|---|
| Révision du micrologiciel | Non | Lecture | 0x2A26 |
Caractéristique : révision du micrologiciel
Cette caractéristique permet au chercheur de lire la révision du micrologiciel du fournisseur si nécessaire. Elle doit toujours renvoyer les données suivantes :
| Octet | Type de données | Description | Valeur |
|---|---|---|---|
| 0 - var | utf8s |
Code de révision du micrologiciel | varie |
Il doit être encapsulé dans une seule chaîne UTF-8, même s'il existe plusieurs micrologiciels (par exemple, trois micrologiciels pour l'écouteur gauche, l'écouteur droit et l'étui) sur le fournisseur. Le fournisseur peut également renvoyer des chaînes spécifiques pour des cas particuliers :
status-updating : si le fournisseur est en train de mettre à jour le micrologiciel. Le fournisseur peut également renvoyer la version du micrologiciel préparé.
status-abnormal : si le fournisseur est dans un état anormal. Par exemple, il ne fonctionne pas correctement, car la mise à jour du micrologiciel a échoué. Cette valeur entraîne l'affichage d'un message par le Seeker pour informer l'utilisateur qu'il doit être mis à jour maintenant.
Le fournisseur doit limiter l'accès à la caractéristique "Firmware Revision" (Révision du micrologiciel) pour empêcher le suivi de l'appareil. Restrictions suggérées :
- les appareils associés doivent avoir accès à tout moment
- Tous les appareils doivent avoir accès lorsque le fournisseur est visible
Si le fournisseur est compatible avec Find Hub, une implémentation supplémentaire est requise. Pour en savoir plus, consultez Mises à jour du micrologiciel Localiser.