Caractéristiques
Service Association express
Le fournisseur d'Association express doit disposer du service GATT suivant.
| Service | UUID |
|---|---|
| Service d'Association express | 0xFE2C |
Ce service doit présenter les caractéristiques suivantes.
| Caractéristique du service d'Association express | Chiffré | Autorisations | UUID |
|---|---|---|---|
| ID du modèle | Non | Lecture | FE2C1233-8366-4814-8EB0-01DE32100BEA |
| Association basée sur une clé | Non | Écrire et notifier | FE2C1234-8366-4814-8EB0-01DE32100BEA |
| Clé d'accès | Non | Écrire et notifier | FE2C1235-8366-4814-8EB0-01DE32100BEA |
| Clé de compte | Non | Écriture | FE2C1236-8366-4814-8EB0-01DE32100BEA |
Service d'informations sur l'appareil
Le fournisseur d'Association express doit également être compatible avec le service d'informations sur l'appareil.
| Service | UUID |
|---|---|
| Service d'informations sur l'appareil | 0x180A |
Fast Pair Seeker utilise les caractéristiques suivantes.
| Nom | Chiffré | Autorisations | UUID |
|---|---|---|---|
| Révision du micrologiciel | Non | Lecture | 0x2A26 |
Caractéristique : ID du modèle
Cette caractéristique permet au Seeker de lire l'ID du modèle si nécessaire, en dehors du moment où l'appareil diffuse en mode détectable. 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 possèdent tous deux 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 Chercheur, 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.
Comme 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 utiliser chaque format.
| 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 |
Flags
|
varies | Obligatoire |
| 2 - 7 | uint48 |
Soit :
|
varie | Obligatoire |
| 8 - 13 | uint48 |
Adresse BR/EDR du chercheur | varies | Ne les présentez que si le bit 1 ou 3 des indicateurs est défini. |
| n – 15 | Valeur aléatoire (salt) | 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 |
Flags
|
varie | Obligatoire |
| 2 - 7 | uint48 |
Soit :
|
varie | Obligatoire |
| 8 | uint8 |
Message de groupe | varie | Obligatoire si le bit 0 des indicateurs est défini |
| 9 | uint8 |
Code du message | varie | Obligatoire si le bit d'indicateur 0 est défini |
| 10 | uint8 |
Dépend des indicateurs :
|
varie | Obligatoire si le bit 0 ou 1 de l'indicateur est défini |
| 11 - n | Données supplémentaires | varie | Facultatif | |
| n – 15 | Valeur aléatoire (salt) | 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 | varies |
| 7 - 15 | Valeur aléatoire (salage) | varies |
Tableau 1.3 : Réponse brute. 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é | varies |
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 Fast Pair 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 une caution (courant) :
- Avant de déchiffrer, vérifiez que le secret partagé a été utilisé pour déchiffrer la demande 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 une caution (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 persistantes dispose d'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 Écrire la clé de compte de manière rétroactive.
- Ne stockez pas la clé et ne l'utilisez pas dans la liste des clés de compte, pour le chiffrement ni pour les calculs MAC.
- La suppression d'un lien est déclenchée par un événement ou un délai d'inactivité spécifique à une fonctionnalité. Pour le partage audio LE, il est fortement recommandé de supprimer l'association 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 : révision du micrologiciel
Cette caractéristique permet au demandeur de lire la révision du micrologiciel du fournisseur si nécessaire. Il doit toujours renvoyer les données suivantes :
| Octet | Type de données | Description | Valeur |
|---|---|---|---|
| 0 - var | utf8s |
Code de révision du micrologiciel | varies |
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 un nouveau 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 "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
- tout appareil doit avoir accès lorsque le fournisseur est visible.
Si le fournisseur est compatible avec la fonctionnalité Localiser mon hub, une implémentation supplémentaire est requise. Pour en savoir plus, consultez Mises à jour du micrologiciel Localiser.
Caractéristique : Données supplémentaires
Ce service doit présenter la caractéristique suivante.
| 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 (sera obsolète 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. | varies |
| 16 - var | Données chiffrées. | varies |
Tableau 3.1 : Paquet de données envoyé par le fournisseur au demandeur via une notification ou envoyé par le demandeur au fournisseur via une écriture.
| Octet | Type de données | Description | Valeur |
|---|---|---|---|
| 0 - var | byte array |
Données | varies, 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érez un HMAC-SHA256 en
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). 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 dont la valeur est
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 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 être inférieur à 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, il provient d'ECDH et ne sera plus utilisé 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 d'attribution de nom 2, il s'agit de la clé de compte.
Exécutez concat(clearBlock[0], clearBlock[1],...) pour créer les données brutes.