Caractéristiques
Service Association express
Le fournisseur Association express doit disposer du service GATT suivant.
| Service | UUID |
|---|---|
| Service Association express | 0xFE2C |
Ce service doit présenter les caractéristiques suivantes.
| Caractéristique du service 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 envoyer une notification | FE2C1234-8366-4814-8EB0-01DE32100BEA |
| Clé d'accès | Non | Écrire et envoyer une notification | 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. Il 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-usurpation et sur la propre paire de clés publique/privée du demandeur, qui change à chaque tentative d'association.
- Le fournisseur est en mode association.
- Le demandeur vérifie que le fournisseur possède la clé privée anti-usurpation.
Notez que, en mode association, le fournisseur peut également s'associer de la manière habituelle, par exemple à un appareil qui ne prend pas en charge l'association basée sur une clé de l'Association express.
Cas de figure 2 : La clé prépartagée est l'une des clés du compte.
- Le fournisseur n'est généralement pas en mode association. (Mais ce n'est pas une exigence : le fournisseur doit permettre 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 demandeur.
| 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 |
Indicateurs
|
variable | Obligatoire |
| 2 - 7 | uint48 |
Soit :
|
variable | Obligatoire |
| 8 - 13 | uint48 |
Adresse BR/EDR du demandeur | variable | Ne les présentez que si le bit 1 ou 3 des indicateurs est défini. |
| n – 15 | Valeur aléatoire (salt) | variable | Obligatoire |
Tableau 1.2.1 : requête brute (type 0x00). Déchiffré à partir de la demande chiffrée dans Tableau 1.1.
| Octet | Type de données | Description | Valeur | Obligatoire ? |
|---|---|---|---|---|
| 0 | uint8 |
Type de message | 0x10 = Demande d'action |
Obligatoire |
| 1 | uint8 |
Indicateurs
|
variable | Obligatoire |
| 2 - 7 | uint48 |
Soit :
|
variable | Obligatoire |
| 8 | uint8 |
Message de groupe | variable | Obligatoire si le bit 0 des indicateurs est défini |
| 9 | uint8 |
Code du message | variable | Obligatoire si le bit 0 des indicateurs est défini |
| 10 | uint8 |
Dépend des indicateurs :
|
variable | Obligatoire si les bits 0 ou 1 des indicateurs sont définis |
| 11 – n | Données supplémentaires | variable | Facultatif | |
| n – 15 | Valeur aléatoire (salt) | variable | Obligatoire |
Tableau 1.2.2 : requête brute (type 0x10). Déchiffré à partir de la demande chiffrée dans 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 du fournisseur (BR/EDR) | variable |
| 7 à 15 | Valeur aléatoire (salt) | variable |
Tableau 1.3 : réponse brute. chiffrée 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 | variable |
Tableau 1.4 : Réponse chiffrée, envoyée par le fournisseur au demandeur 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é | variable |
Tableau 2.1 : bloc de clé d'accès chiffré. Pour en savoir plus sur l'utilisation de la procédure d'association basée sur une clé, consultez.
| Octet | Type de données | Description | Valeur |
|---|---|---|---|
| 0 | uint8 |
Type de message | Au choix :
|
| 1 - 3 | unit32 |
Clé d'accès à six chiffres | variable |
| 4 à 15 | Valeur aléatoire (salt) | variable |
Tableau 2.2 : bloc de clé d'accès brute. Version décryptée du Tableau 2.1.
Caractéristique : clé de compte
Après l'association, le chercheur Association express écrit une clé de compte dans le fournisseur Association express.
| Octet | Type de données | Description | Valeur |
|---|---|---|---|
| 0 à 15 | uint128 |
Clé de compte (chiffrée) | variable |
Lorsqu'il reçoit une requête d'écriture, le fournisseur 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 nécessitent l'association (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é validée avec ce code secret, ignorez cette écriture et quittez.
- À ce stade, le secret partagé (K dans la procédure) ne sera plus utilisé pour cette association. Toutes les demandes chiffrées avec cette clé qui arrivent sans redémarrage de la procédure doivent être refusées.
- Pour les fournisseurs qui nécessitent l'association (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 la valeur la moins récemment utilisée de la liste.
- 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 une clé.
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 | variable |
Il doit être encapsulé dans une seule chaîne utf8, même s'il existe plusieurs micrologiciels (par exemple, trois micrologiciels pour l'écouteur gauche, l'écouteur droit et l'étui) chez le fournisseur. Le fournisseur peut également renvoyer les chaînes spécifiques pour les cas particuliers :
status-updating : si le fournisseur est en train de passer à un nouveau micrologiciel. Le fournisseur peut également renvoyer la version du micrologiciel intermédiaire.
status-abnormal : si le fournisseur est dans un état anormal. Par exemple, il a mal fonctionné parce que la mise à jour du micrologiciel a échoué. Cette valeur entraînera l'affichage d'un message dans Seeker pour informer l'utilisateur qu'il doit effectuer la mise à 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 pouvoir y accéder à tout moment.
- tout appareil devrait y avoir accès lorsque le fournisseur est détectable.
Caractéristique : données supplémentaires
Ce service doit présenter la caractéristique suivante.
| Caractéristique du service Association express | Chiffré | Autorisations | UUID |
|---|---|---|---|
| Données | Non | Écrire et envoyer une notification | FE2C1237-8366-4814-8EB0-01DE32100BEA |
| Ancienne caractéristique du service Association express (sera obsolète le 1er janvier 2021) | Chiffré | Autorisations | UUID |
|---|---|---|---|
| Données | Non | Écrire et envoyer une notification | 0x1237 |
Avant d'écrire ou d'envoyer une notification à cette caractéristique, une prise de contact doit avoir lieu 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. | variable |
| 8 - 15 | Nonce utilisé par le chiffrement AES-CTR. | variable |
| 16 – var | Données chiffrées. | variable |
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 dans 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 Association express doit effectuer les opérations suivantes :
- Générez 8 octets aléatoires générés par chiffrement 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.
Effectuez concat(encryptedBlock[0], encryptedBlock[1],...) pour créer les données chiffrées.
Générer 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 dont la valeur est
0x5C. - ipad est un remplissage interne de 64 octets, composé d'octets répétés dont la valeur est
0x36.
Prenez les 8 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 examinant 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 de l'établissement de liaison, par exemple :
- Dans le flux de dénomination 1, il provient d'ECDH et ne sera plus utilisé pour cette association. Toutes les demandes chiffrées avec cette clé qui arrivent sans redémarrage de la procédure doivent être refusées.
- 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.