Caractéristiques
Service Association express
Le Fournisseur d'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 d'association express | Chiffré | Autorisations | UUID |
---|---|---|---|
ID du modèle | Non | Lire | FE2C1233-8366-4814-8EB0-01DE32100BEA |
Association basée sur des clés | Non | Écriture et notification | FE2C1234-8366-4814-8EB0-01DE32100BEA |
Clé d'accès | Non | Écriture et notification | FE2C1235-8366-4814-8EB0-01DE32100BEA |
Clé de compte | Non | Écriture | FE2C1236-8366-4814-8EB0-01DE32100BEA |
Service d'informations provenant des appareils
Le fournisseur d'association express doit également prendre en charge le service d'informations provenant des appareils.
Service | UUID |
---|---|
Service d'informations provenant des appareils | 0x180A |
L'utilisateur qui cherche à faire l'association express utilise les caractéristiques suivantes.
Nom | Chiffré | Autorisations | UUID |
---|---|---|---|
Révision du micrologiciel | Non | Lire | 0x2A26 |
Caractéristique: ID du modèle
Cette caractéristique permet à l'utilisateur de lire l'ID du modèle si nécessaire, en dehors de Lorsque 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 les clés
Cette caractéristique contrôle la procédure d'association basée sur les clés. Dans cette procédure, un certain niveau de confiance est établi en vérifiant que le demandeur et Le fournisseur possède 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 clé publique/privée anti-spoofing et sa propre paire de clés publique/privée, qui changera tentative d'association.
- L'opérateur est en mode association.
- Le demandeur vérifie que le Fournisseur est en possession du de clé privée anti-spoofing.
Notez qu'en mode association, l'opérateur peut aussi, bien sûr, procéder à l'association comme d'habitude (par exemple, pour associer un appareil qui n'est pas compatible avec Association basée sur les clés de la paire.
Cas 2: la clé pré-partagée est l'une des clés de compte.
- L'opérateur n'est généralement pas en mode association. Il ne s'agit toutefois pas exigence : le fournisseur doit permettre l'utilisation d'une clé de compte, même mode association.)
- Le demandeur et le fournisseur vérifient chacun que l'autre est en possession du clé de compte Google Cloud.
Étant donné que les deux cas sont extrêmement similaires, sauf pour quelle clé pré-partagée est utilisée, ils sont combinés dans une 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 demandeur.
Octet | Type de données | Description | Valeur | Obligatoire ? |
---|---|---|---|---|
0 | uint8 |
Type de message | 0x00 = requête d'association basée sur une clé |
Obligatoire |
1 | uint8 |
Indicateurs
|
varie | Obligatoire |
2 – 7 | uint48 |
Soit:
|
varie | Obligatoire |
8 – 13 | uint48 |
Adresse BR/EDR du demandeur | varie | Présent uniquement si le bit 1 ou 3 d'indicateurs est défini |
n - 15 | Valeur aléatoire (sel) | varie | Obligatoire |
Tableau 1.2.1:requête brute (type 0x00). déchiffré à partir de la couche requête figurant 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 |
Indicateurs
|
varie | Obligatoire |
2 – 7 | uint48 |
Soit:
|
varie | Obligatoire |
8 | uint8 |
Groupe de messages | varie | Obligatoire si le bit 0 d'indicateurs est défini |
9 | uint8 |
Code du message | varie | Obligatoire si le bit 0 d'indicateurs est défini |
10 | uint8 |
Dépend des indicateurs:
|
varie | Obligatoire si le bit 0 ou 1 d'indicateurs est défini |
11 - n | Données supplémentaires | varie | Facultatif | |
n - 15 | Valeur aléatoire (sel) | varie | Obligatoire |
Tableau 1.2.2:requête brute (type 0x10). déchiffré à partir de la couche requête figurant dans le Tableau 1.1.
Octet | Type de données | Description | Valeur |
---|---|---|---|
0 | uint8 |
Type de message | 0x01 = réponse de couplage basée sur des clés |
1 – 6 | uint48 |
Adresse publique (BR/EDR) du fournisseur | varie |
7 – 15 | Valeur aléatoire (sel) | varie |
Tableau 1.3:réponse brute. Chiffré pour générer la réponse chiffrée dans 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 demandeur via un avertir.
Caractéristique: clé d'accès
Cette caractéristique est utilisée lors de l' association basée sur des clés procédure.
Octet | Type de données | Description | Valeur |
---|---|---|---|
0 à 15 | uint128 |
Blocage de clés d'accès chiffrées | varie |
Tableau 2.1:Bloc de clé d'accès chiffré Voir Procédure d'association basée sur des clés.
Octet | Type de données | Description | Valeur |
---|---|---|---|
0 | uint8 |
Type de message | Au choix:
|
1 – 3 | unit32 |
Clé d'accès à 6 chiffres | varie |
4 – 15 | Valeur aléatoire (sel) | varie |
Tableau 2.2:bloc de clé d'accès brute. Version déchiffrée du Tableau 2.1.
Caractéristique: clé de compte
Après l'association, l'utilisateur qui cherche à associer l'Association express écrit une clé de compte pour l'Association express Fournisseur.
Octet | Type de données | Description | Valeur |
---|---|---|---|
0 à 15 | uint128 |
Clé de compte (chiffrée) | varie |
À la réception d'une requête d'écriture, le fournisseur Fast Pair doit procéder comme suit:
- Déchiffrez la clé de compte à l'aide de la clé secrète partagée générée à l'étape 4 de la
procédure.
- Pour les fournisseurs nécessitant une liaison (courant):
<ph type="x-smartling-placeholder">
- </ph>
- Avant de procéder au déchiffrement, vérifiez que la clé secrète partagée a bien été utilisée pour déchiffrer la de clé d'accès de l'étape 12. Si vous n'avez pas réussi cette étape en utilisant vous pouvez ignorer cette étape d'écriture et quitter.
- À ce stade, la clé secrète partagée (K dans la procédure) ne sera pas utilisée pour cette association. Toutes les requêtes qui sont chiffrées avec cette clé sans redémarrage, la procédure doit être refusée.
- Pour les fournisseurs nécessitant une liaison (courant):
<ph type="x-smartling-placeholder">
- Vérifiez que la valeur déchiffrée commence par
0x04
. Si ce n'est pas le cas, ignorez effectuer cette écriture et quitter. - Vérifiez si la liste de clés de compte persistante contient de l'espace pour les nouvelles .
- Si ce n'est pas le cas, supprimez de la liste la valeur utilisée le moins récemment.
- Ajoutez la nouvelle valeur à la liste.
Les clés de compte de la liste sont utilisées lors de l'association basée sur les clés.
Caractéristique: révision du micrologiciel
Cette caractéristique permet à l'utilisateur de ou au fournisseur de services, selon les besoins. 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 utf8, même s'il y en a plusieurs (par exemple, trois micrologiciels pour l'écouteur gauche, l'écouteur droit et l'étui) sur le fournisseur. Le fournisseur peut également renvoyer les chaînes spécifiques pour des cas particuliers:
status-updates (mise à jour du statut) : si le fournisseur effectue actuellement une mise à jour vers un nouveau micrologiciel. Le fournisseur peut également renvoyer la version du micrologiciel en préproduction.
status-anormal: si l'état du fournisseur est anormal. Par exemple, il peut a rencontré un dysfonctionnement suite à l'échec de la mise à jour du micrologiciel. Cette valeur entraîne l'utilisateur doit afficher un message pour indiquer à l'utilisateur qu'il doit être mis à jour maintenant.
Le Fournisseur doit limiter l'accès à la caractéristique Révision du micrologiciel à empêcher le suivi de l'appareil. Restrictions suggérées:
- les appareils liés doivent pouvoir y accéder à tout moment
- n'importe quel appareil doit avoir accès lorsque le fournisseur est visible
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 | Écriture et notification | FE2C1237-8366-4814-8EB0-01DE32100BEA |
Ancienne caractéristique du service de paire rapide (abandon prévu le 01/01/2021) | Chiffré | Autorisations | UUID |
---|---|---|---|
Données | Non | Écriture et notification | 0x1237 |
Avant d'écrire ou d'informer cette caractéristique,
un handshake via la caractéristique FE2C1234-8366-4814-8EB0-01DE32100BEA
pour
un secret partagé. L'algorithme AES-CTR sera utilisé pour chiffrer les données qui transitent
caractéristique, dont l'algorithme est défini ci-dessous. Ce mode est plus
des données s'étendant au-delà
d'un seul bloc de 16 octets. HMAC-SHA256
pour garantir l'intégrité des données, é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 demandeur via un notifiées ou envoyées par le demandeur au Fournisseur par écriture.
Octet | Type de données | Description | Valeur |
---|---|---|---|
0 – var | byte array |
Données | varie, vous devez le décoder en fonction de l'ID de données du Tableau 1.2.2:
|
Tableau 3.2:données brutes. Déchiffrement à partir des données chiffrées dans Tableau 3.1.
Lorsqu'une notification est demandée (par exemple, demande un nom personnalisé via Bit 2 dans Tableau 1.2.1), le Fournisseur de Association express doit procéder comme suit:
- Générer 8 octets aléatoires de manière cryptographique pour Nonce.
Chiffrez les données à l'aide de l'algorithme 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 correspond au secret partagé de l'étape 4 de la procédure.
- clearBlock[i] est un bloc de 16 octets commençant par data[i * 16]. Le dernier peut être inférieure à 16 octets.
Exécutez concat(encryptedBlock[0], encryptedBlock[1],...) pour créer le Données chiffrées.
Générer 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, zéros de 48 octets), le shared_secret provient de l'étape 4 de la procédure.
- opad correspond à une marge intérieure extérieure de 64 octets, composée d'octets répétés de valeur
0x5C
- La marge intérieure interne de l'ipad est de 64 octets, composée d'octets répétés de valeur
0x36
Prenez les huit premiers octets du code HMAC-SHA256 en tant que préfixe du champ Data paquet.
À la réception d'une requête d'écriture, le fournisseur Fast Pair doit procéder comme suit:
- Vérifiez l'intégrité des données en vérifiant les 8 premiers octets des HMAC-SHA256
Déchiffrer 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ù
- chiffréeBloc[i] est un bloc de 16 octets commençant par chiffré_data[i * 16]. Le dernier bloc peut comporter moins de 16 octets.
- Une clé AES est générée ou identifiée à partir du handshake, par exemple
<ph type="x-smartling-placeholder">
- </ph>
- dans le flux de nommage 1, elles proviennent d'ECDH et ne peuvent pas être utilisé à nouveau pour cette association. Toutes les requêtes qui sont chiffrées avec cette clé sans que la procédure soit redémarrée refusé.
- dans le flux de nommage 2, il s'agit de la clé de compte.
Exécutez la commande concat(clearBlock[0], clearBlock[1],...) pour créer les données brutes.