Signal publicitaire du fournisseur
Annonce : lorsque l'appareil est détectable
Lorsque l'appareil du fournisseur est visible en BR/EDR (c'est-à-dire en mode association), il doit annoncer les données d'ID de modèle d'Association express via BLE, et l'adresse BLE ne doit pas être alternée.
Intervalle d'annonce : lorsque l'appareil est détectable
L'intervalle entre les annonces ne doit pas dépasser 100 ms (10 Hz). Un débit rapide permet au chercheur de trouver rapidement le fournisseur, même lors d'une analyse en mode basse consommation.
Charge utile publicitaire : données d'ID de modèle d'Association express
L'annonce doit contenir le type de données "Service Data", ibid., § 1.11. L'UUID doit être l'UUID du service d'association express de 0xFE2C. Les données de service doivent contenir les éléments suivants :
| Octet | Type de données | Description | Valeur |
|---|---|---|---|
| 0-2 | uint24 |
ID de modèle 24 bits | varie |
Charge utile de l'annonce de partage audio LE : données d'ID de modèle d'Association express et carte des fonctionnalités d'Association express
Les données de service doivent contenir les éléments suivants :
| Octet | Type de données | Description | Valeur |
|---|---|---|---|
| 0 | uint8 |
Version et indicateurs 0bVVVVFFFF
|
0x00 |
| 1 | uint8 |
Longueur et type du champ 0bLLLLTTTT
|
0bLLLL0111
|
| 2 – s | ID du modèle | varie | |
| s + 1 | uint8 |
Longueur et type du champ 0bLLLLTTTT
|
0bLLLL1000
|
| s + 2 | uint8 |
Carte des fonctionnalités FP | varie |
Carte des fonctionnalités FP
Le bitmap des fonctionnalités FP représente les fonctionnalités FP prises en charge par le fournisseur. Le premier octet du bitmap est défini comme suit :
| Bitmap | Description |
|---|---|
| 0bRRRRRRSO | R : bit réservé, ignoré par le chercheur pour le moment et défini sur 0. S : compatibilité avec le partage audio FP LE (défini sur 1 si activé, sinon sur 0). O : bit OOB (Out of Box), défini sur 1 si l'appareil est neuf. |
Si le fournisseur est compatible avec la spécification de partage audio FP LE (ce qui signifie qu'il est compatible avec l'association temporaire, la charge utile de l'annonce de partage audio LE et la version 2 du contrôle des écouteurs), définissez le bit de compatibilité avec le partage audio FP LE sur 1. Sinon, définissez-le sur 0.
Si le fournisseur n'a été associé à aucun chercheur FP et qu'il est neuf (ce qui signifie qu'il n'y a pas de clés de compte FP sur le fournisseur), définissez le bit OOB sur 1. Sinon, définissez-le sur 0.
Charge utile de l'annonce d'informations sur l'ensemble coordonné : données d'ID de modèle d'Association express et informations sur l'ensemble coordonné d'Association express
Les données de service doivent contenir les éléments suivants :
| Octet | Type de données | Description | Valeur |
|---|---|---|---|
| 0 | uint8 |
Version et indicateurs 0bVVVVFFFF
|
0x00 |
| 1 | uint8 |
Longueur et type du champ 0bLLLLTTTT
|
0bLLLL0111
|
| 2 – s | ID du modèle | varie | |
| s + 1 | uint8 |
Longueur et type du champ 0bLLLLTTTT
|
0b01101011
|
| s + 2 - s + 7 | uint48 |
Données de l'ensemble coordonné FP | Données de 6 octets, voir Informations sur l'ensemble coordonné FP |
Informations sur l'ensemble coordonné FP
Les informations sur l'ensemble coordonné FP permettent d'identifier si l'appareil publicitaire se trouve ou non dans le même ensemble coordonné.
| Octet | Type de données | Description | Valeur |
|---|---|---|---|
| 0 | uint8 |
Taille de l'ensemble coordonné | Variable |
| 1 | uint8 |
Type de membre de l'ensemble coordonné d'Association express | Peut être l'une des valeurs suivantes :
|
| 2 à 5 | uint32 |
Définir le hachage de la clé de résolution d'identité | Variable |
L'algorithme permettant de générer la valeur de hachage de la clé de résolution d'identité définie est
Utilisez SHA256 pour hacher la valeur SIRK.
SIRK = 0xe3b0c44298fc1c149afbf4c8996fb924SHA256(SIRK) = 0x2646036bb22781536be710245c8cbb04b92842c587f845996ce8ab542592a25eExtraire les quatre premiers octets en tant que valeur de hachage
Hash Value of Set Identity Resolving Key = 0x2646036b
Pour en savoir plus sur la clé de résolution d'ensemble d'identités, consultez Service d'identification d'ensemble coordonné.
Annonce : quand l'appareil n'est pas détectable
Lorsqu'il n'est pas visible (c'est-à-dire qu'il n'est pas en mode association), l'appareil du fournisseur doit annoncer les données du compte d'Association express en suivant les consignes ci-dessous.
La diffusion des données du compte permet aux Seekers à proximité de reconnaître quand un Provider appartient à leur compte et de lancer l'association sans avoir à forcer d'abord le Provider à revenir en mode association, ce qui est une cause fréquente de réclamation des utilisateurs. Les chercheurs permettront aux utilisateurs d'ignorer cette diffusion s'ils ne souhaitent pas s'associer au fournisseur ou si la diffusion n'est pas pertinente (par exemple, s'ils sont déjà associés). Les Seekers filtrent également automatiquement les diffusions manifestement incorrectes, par exemple lorsque les données du compte sont mal configurées.
Intervalle de diffusion : lorsque l'appareil n'est pas détectable
L'intervalle entre les annonces doit être de 250 ms (4 Hz) au maximum.
Charge utile publicitaire : données du compte Association express
L'annonce doit contenir le type de données "Service Data", Ibid., § 1.11. L'UUID doit être l'UUID du service d'association express de 0xFE2C. Les données de service doivent contenir les éléments suivants :
| Octet | Type de données | Description | Valeur |
|---|---|---|---|
| 0 | uint8 |
Version et indicateurs 0bVVVVFFFF
|
0x00(réservé pour une utilisation ultérieure) |
| 1 - varie | Données des clés de compte | varie |
Les données de clé de compte contiennent :
| Octet | Type de données | Description | Valeur |
|---|---|---|---|
| 0 | uint8 |
Longueur et type du champ 0bLLLLTTTT
|
0bLLLL0000
|
| 1 s | Filtre de clé de compte | varie | |
| s + 1 | uint8 |
Longueur et type du champ 0bLLLLTTTT
|
0b00100001
|
| s + 2 - s + 3 | uint16 |
Salt | varie |
Filtre de clé de compte
Le filtre de clé de compte annoncé permet à un chercheur de vérifier rapidement si un fournisseur possède une certaine clé de compte (avec une faible probabilité de faux positif, en moyenne bien inférieure à 0,5 %) avant d'effectuer d'autres interactions. Le chercheur peut se connecter automatiquement et tenter de démarrer la procédure lorsqu'il voit un filtre diffusé avec le type 0, c'est-à-dire affichant une indication d'interface utilisateur, qui contient potentiellement l'une de ses clés de compte, afin de réduire davantage le taux de faux positifs. Dans certains cas, le fournisseur peut vouloir être reconnu par le chercheur, même s'il n'est pas prêt pour l'association. Par exemple, lorsque les écouteurs sont remis dans l'étui, nous voulons arrêter d'afficher la notification d'association suivante, car cette association pourrait être refusée par le casque.
Le filtre de clé de compte est un filtre de Bloom de longueur variable construit comme suit :
- Soit n le nombre de clés de compte (n >= 1) dans la liste des clés de compte persistante.
- Soit s, la taille du filtre en octets, tronquée à (1,2*n + 3). Par exemple, si une clé est conservée, s = 4 octets.
uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3); - Initialisez le filtre F en tant que tableau d'octets s, chacun défini sur 0.
uint8_t F[s] = {0}; Pour chaque clé de compte K de la liste des clés de compte persistante :
a. Soit V = concat(K, Salt).// In the sample code, the size of salt is 2 bytes. #define SALT_SIZE 2 uint8_t V[FASTPAIR_ACCOUNT_KEY_SIZE + SALT_SIZE]; for (uint8_t keyIndex = 0; keyIndex < n; keyIndex++) { // concat (K, Salt) fastpair_get_account_key_by_index(keyIndex, V); uint8_t randomSalt = (uint8_t)rand(); V[FASTPAIR_ACCOUNT_KEY_SIZE] = randomSalt; ... }b. Hachez V à l'aide de SHA256 pour obtenir une valeur de 32 octets H = {H0, …, H31}.
uint8_t H[32] = {0}; SHA256_hash_function(V, H);c. Divisez H en huit entiers non signés de 4 octets en big-endian, X = {X0, …, X7}, où X0 = 0xH0H1H2H3.
uint32_t X[8]; for (index = 0; index < 8; index++) { X[index] = (((uint32_t)(H[index * 4])) << 24) | (((uint32_t)(H[index * 4 + 1])) << 16) | (((uint32_t)(H[index * 4 + 2])) << 8) | (((uint32_t)(H[index * 4 + 3])) << 0); }d. Pour chaque Xi :
i. Soit M = Xi modulo le nombre de bits dans le filtre, (s * 8).
ii. Récupérez l'octet dans F à l'index (M / 8), arrondi à l'entier inférieur.
iii. Dans l'octet, définissez le bit à l'index (M % 8) sur 1.
iv. Autrement dit :// M = Xi % (s * 8) // F[M/8] = F[M/8] | (1 << (M % 8)) for (index = 0; index < 8; index++) { uint32_t M = X[index] % (s * 8); F[M / 8] = F[M / 8] | (1 << (M % 8)); }
Incluez le filtre F en tant que champ "Filtre de clé de compte" dans les données publicitaires. Notez qu'il n'y a pas de "boutisme" pour cette valeur, car il n'y a pas d'octet plus ou moins significatif. Ne modifiez pas l'ordre des octets.
Champ de sel
Le salage est une valeur aléatoire qui est ajoutée aux clés de compte lors de la création du filtre de Bloom. Ce salage doit être régénéré chaque fois que l'adresse RPA est mise à jour pour le fournisseur afin d'éviter le suivi lors de la rotation des adresses.
Pour générer le filtre de clé de compte à l'aide du salage :
- Générez un S aléatoire de 2 octets. Notez que cette valeur n'a pas de "boutisme", car il n'y a pas d'octet plus ou moins significatif. Ne modifiez pas l'ordre des octets.
- Utilisez la valeur S de deux octets comme valeur de salage.
- Dans les données de compte de l'Association express annoncées, incluez le filtre généré dans le champ "Filtre de clé de compte" et S dans le champ "Salt".