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
  • V = version
  • F = indicateurs
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
  • L = longueur du filtre de clé de compte en octets
  • T = type
0bLLLL0000
  • length = 0bLLLL = varie
  • type = 0b0000 (afficher l'indication dans l'UI) ou 0b0010 (masquer l'indication dans l'UI), filtre de clé de compte
1 - s Filtre de clé de compte varie
s + 1 uint8 Longueur et type de champ
0bLLLLTTTT
  • L = longueur en octets
  • T = type
0b00100001
  • longueur = 0b0010 = 2
  • type = 0b0001, sel
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:

  1. Soit n le nombre de clés de compte (n >= 1) dans la liste des clés de compte persistante.
  2. 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);
  3. Initialisez le filtre F en tant que tableau d'octets s, chacun défini sur 0.
    uint8_t F[s] = {0};
  4. 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:

  1. 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.
  2. Utilisez S à 2 octets comme sel.
  3. 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".