Signal de publicité du fournisseur
Publicité: quand elle est visible
Lorsque l'appareil du fournisseur est détectable par BR/EDR (c'est-à-dire en mode association), il doit diffuser des données d'ID de modèle Fast Pair via BLE, et l'adresse BLE ne doit pas être pivotée.
Intervalle publicitaire: quand l'annonce est visible
L'intervalle entre les annonces ne doit pas dépasser 100 ms (10 Hz). Un débit élevé permet au chercheur de trouver rapidement le fournisseur, même lors de la numérisation en mode basse consommation.
Charge utile publicitaire: données d'ID de modèle Fast Pair
L'annonce doit contenir le type de données "Données des services", ibid., § 1.11. L'UUID doit être l'UUID du service Fast Pair de 0xFE2C
. Les données du service doivent contenir les éléments suivants:
Octet | Type de données | Description | Valeur |
---|---|---|---|
0-2 | uint24 |
ID de modèle 24 bits | varie |
Publicité: lorsque l'application n'est pas visible
Lorsqu'il n'est pas détectable (c'est-à-dire qu'il n'est pas en mode association), l'appareil du fournisseur doit diffuser les données de compte Fast Pair en suivant les consignes suivantes.
La diffusion des données du compte permet aux chercheurs à proximité de reconnaître quand un fournisseur appartient à leur compte et de lancer l'association sans avoir à forcer le fournisseur à revenir en mode association au préalable, ce qui est une cause courante de réclamations des utilisateurs. Les requêtes de recherche permettent aux utilisateurs d'ignorer cette diffusion s'ils n'attendent pas d'être associés au fournisseur ou si la diffusion n'est pas pertinente (par exemple, s'ils sont déjà associés). Les chercheurs filtrent également automatiquement les diffusions manifestement incorrectes, par exemple lorsque les données du compte sont mal configurées.
Intervalle de diffusion des annonces : "When not discoverable" (Lorsque l'application n'est pas visible)
L'intervalle entre les annonces doit être de 250 ms maximum (4 Hz).
Charge utile publicitaire: données du compte Fast Pair
L'annonce doit indiquer le type de données "Données des services", Ibid., § 1.11. L'UUID doit être l'UUID du service Fast Pair de 0xFE2C
. Les données du 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 de clé de compte | varie |
Les données de clé de compte contiennent les éléments suivants:
Octet | Type de données | Description | Valeur |
---|---|---|---|
0 | uint8 |
Longueur et type de champ 0bLLLLTTTT
|
0bLLLL0000
|
1 - s | Filtre de clé de compte | varie | |
s + 1 | uint8 |
Longueur et type de 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 peut posséder une certaine clé de compte (avec une faible probabilité de faux positifs, en moyenne bien inférieure à 0,5%) avant 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 qu'il affiche 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 souhaiter être reconnu par le chercheur alors qu'il n'est pas prêt à l'association. Par exemple, lorsque les écouteurs sont remis dans l'étui, nous souhaitons arrêter d'afficher la notification d'association ultérieure, car cette association pourrait être refusée par le casque.
Le filtre de clé de compte est un filtre Bloom à 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.
- Supposons que s, la taille du filtre en octets, soit (1,2*n + 3) tronquée. Par exemple, si une seule 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 la valeur concat(K, Sel).// 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, ce qui vous donne 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 la valeur Xi modulo le nombre de bits du filtre (s * 8).
ii. Récupère l'octet dans F à l'index (M / 8), arrondi à l'entier inférieur.
iii. Dans l'octet, définissez le bit à l'indice (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 comme champ de filtre de clé de compte dans les données publicitaires. Notez qu'il n'y a pas d'ordre de grandeur pour cette valeur, car il n'y a pas d'octet plus ou moins significatif. N'altérez pas l'ordre des octets.
Marais salant
Le sel est une valeur aléatoire qui est ajoutée aux clés de compte lors de la création du filtre Bloom. Ce sel doit être régénéré chaque fois que l'RPA est mis à 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 sel:
- Générez un S de 2 octets aléatoire. Notez qu'il n'y a pas d'ordre des octets dans cette valeur, car il n'y a pas d'octet plus ou moins significatif. Ne modifiez pas l'ordre des octets.
- Utilisez S à 2 octets comme sel.
- Dans les données de compte Fast Pair annoncées, incluez le filtre généré dans le champ "Filtre de clé de compte" et S dans le champ "Salage".