Signal publicitaire du fournisseur

Publicité: lorsqu'elle est visible

Lorsque l'appareil du fournisseur est détectable BR/EDR (c'est-à-dire en mode association), il doit annoncer les données d'ID du modèle Association express via BLE, et l'adresse BLE ne doit pas faire l'objet d'une rotation.

Intervalle publicitaire: si visible

L'intervalle entre les annonces ne doit pas dépasser 100 ms (10 Hz). Un débit rapide permet au Seeker de trouver rapidement le fournisseur, même lors de la recherche en mode économie d'énergie.

Charge utile publicitaire: données d'ID du modèle Association express

L'annonce doit contenir le type de données des données du service, ibid., § 1.11. L'UUID sera l'UUID du service d'Association express de 0xFE2C. Les données du service doivent contenir les éléments suivants:

Octet Type de données Description Valeur
0-2 uint24 ID du modèle 24 bits varie

Publicité: lorsqu'elle n'est pas visible

Lorsqu'il n'est pas visible (c'est-à-dire en mode association), l'appareil du fournisseur doit annoncer les données du compte Association express, en respectant les consignes suivantes.

Diffuser les données du compte permet aux demandeurs à proximité de reconnaître quand un fournisseur appartient à leur compte et de lancer l'association sans avoir à forcer le fournisseur à repasser en mode association, ce qui est une cause fréquente de réclamation des utilisateurs. Les demandeurs offriront aux utilisateurs la possibilité d'ignorer cette diffusion s'ils n'attendent pas d'être associés au fournisseur ou s'ils ne sont pas pertinents (par exemple, s'ils ont déjà effectué l'association). Les demandeurs filtrent également automatiquement les diffusions manifestement incorrectes, par exemple lorsque les données du compte sont mal configurées.

Intervalle publicitaire: lorsqu'il n'est pas visible

L'intervalle entre les annonces ne doit pas dépasser 250 ms (4 Hz).

Charge utile publicitaire: données du compte Association express

L'annonce doit contenir le type de données Données du service, Ibid., § 1.11. L'UUID sera l'UUID du service d'Association express 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 future)
1 - varie Données de clé de compte varie
ou 0x00 si la liste de clés de compte est vide

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
  • longueur = 0bLLLL = varie
  • type = 0b0000 (afficher l'indication de l'interface utilisateur) ou 0b0010 (masquer l'indication de l'interface utilisateur), 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, Salt
s + 2 - s + 3 uint16 Salt varie

Filtre de clé de compte

Le filtre de clé de compte annoncé permet à un demandeur de vérifier rapidement si un fournisseur peut posséder une certaine clé de compte (avec une faible probabilité de faux positifs, en moyenne nettement inférieure à 0,5%), avant d'autres interactions. Le demandeur peut se connecter automatiquement et tenter de lancer la procédure lorsqu'il voit un filtre de type 0 diffusé, c'est-à-dire une indication d'UI qui contient potentiellement l'une de ses clés de compte, afin de réduire davantage le taux de faux positifs. Dans certains cas, il se peut que le fournisseur souhaite être reconnu par le chercheur alors qu'il n'est pas prêt pour l'association. Par exemple, lorsque les écouteurs sont remis dans leur étui, nous voulons arrêter d'afficher la notification d'association suivante, car le casque peut refuser l'association.

Le filtre de clé de compte est un filtre Floraison de longueur variable construit comme suit:

  1. Soit n correspond au nombre de clés de compte (n >= 1) figurant dans la liste de clés de compte persistante.
  2. Regardons s, la taille du filtre en octets, tronquée (1,2*n + 3). Par exemple, si une clé est persistante, s = 4 octets.
    uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3);
  3. Initialisez le filtre F sous la forme d'un tableau de s octets, 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. Laissez V être concaténé(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 H de 32 octets = {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 mode 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 soit Xi modulo le nombre de bits du filtre, (s * 8).
    ii. Obtenez l'octet dans F avec l'indice (M / 8), arrondi au chiffre inférieur.
    iii. Dans l'octet, définissez le bit au niveau de l'index (M % 8) sur 1.
    iv. En d'autres termes:

        // 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));
        }
    

Ajoutez 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 "endiance" 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 ajoutée aux clés de compte lors de la création du filtre "Bloom". Ce salage doit être régénéré chaque fois que le RPA est mis à jour pour le fournisseur afin d'éviter le suivi de la rotation des adresses.

Pour générer le filtre de clé de compte à l'aide de la valeur salt:

  1. Générez un S aléatoire de 2 octets. Notez qu'il n'y a pas de "endiance" pour cette valeur, car il n'y a pas d'octet plus ou moins significatif. Ne modifiez pas l'ordre des octets.
  2. Utilisez le S de deux octets comme salage.
  3. Dans les données de compte Association express annoncées, incluez le filtre généré dans le champ Filtre de clé de compte et S dans le champ Salt.