Signal publicitaire du fournisseur

Publicité: lorsqu'elle est visible

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

Intervalle publicitaire: si visible

L'intervalle entre les annonces ne doit pas dépasser 100 ms (10 Hz). A Le débit rapide permet au demandeur de trouver rapidement le fournisseur, même lorsqu'il recherche dans mode économie d'énergie.

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

L'annonce doit contenir le type de données des Données des Services, ibid., § 1.11. La L'UUID doit être l'UUID du service d'association express de 0xFE2C. Les données du service contiennent les éléments suivants:

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

Publicité: lorsqu'elle n'est pas visible

S'il n'est pas visible (autrement dit, en mode association), l'appareil du Fournisseur doit : pour diffuser des données de compte Association express, en respectant les consignes ci-dessous.

Faire la promotion des données du compte permet aux internautes à proximité de savoir quand un fournisseur appartenant à son compte et lancer l'association sans avoir à forcer repassent d'abord en mode association, ce qui est une cause fréquente une plainte. Les utilisateurs auront la possibilité d'ignorer cette annonce s'il n'attend pas d'être associé au fournisseur l'annonce n'est pas pertinente (par exemple, s'ils ont déjà couplé). Ils excluent également automatiquement les annonces manifestement mauvaises, telles que 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 de compte Association express

L'annonce doit contenir le type de données des Données des Services, Ibid., § 1.11. La L'UUID doit être l'UUID du service d'association express de 0xFE2C. Les données du service contiennent les éléments suivants:

Octet Type de données Description Valeur
0 uint8 Version et options
0bVVVVFFFF
  • V = version
  • F = indicateurs
0x00
(réservé à une utilisation ultérieure)
1 - varie Données de la clé du compte varie
ou 0x00 si la liste des clés de compte est vide

Les données de la 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
0 bLL0000
  • longueur = 0 bLLLL = 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 Le fournisseur peut posséder une certaine clé de compte (avec un faible taux de faux positifs moyenne, nettement inférieure à 0,5%), avant d'autres interactions. La L'appli peut se connecter automatiquement et tenter de lancer la procédure un filtre diffusé de type 0, c'est-à-dire qui affiche une indication d'interface utilisateur, que peut contenir l'une de ses clés de compte, de façon à réduire le taux de fausses les points positifs. Dans certains cas, le fournisseur peut vouloir être reconnu par l'utilisateur lorsque vous n'êtes pas prêt pour l'association. Par exemple, lorsque les écouteurs sont mis 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 Filtre Fleur construit comme ce qui suit:

  1. Soit n le nombre de clés de compte (n >= 1) dans la table Liste des clés de compte :
  2. Soit s, qui correspond à la taille du filtre en octets, soit (1,2*n + 3) tronqué. Pour exemple, si une clé est persistante, s = 4 octets.
    uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3);
  3. Initialisez le filtre F en tant que tableau de s octets, chacun étant défini sur 0.
    uint8_t F[s] = {0};
  4. Pour chaque clé de compte K dans la liste de 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. Hachage V à l'aide de SHA256, obtention d'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 du filtre, (s x 8).
    ii. Obtenez l'octet dans F au niveau de l'index (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));
        }
    

Incluez le filtre F en tant que champ de filtre de clé de compte dans les données publicitaires. Notez qu'il n'existe pas de "endianness" à cette valeur, puisqu'il n'y a plus ou moins octet important (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 fleur. Ce salage doit être régénéré à chaque fois que le RPA est mis à jour pour au Fournisseur pour éviter le suivi de la rotation des adresses.

Pour générer le filtre de clé de compte à l'aide du salage:

  1. Générez un S aléatoire de 2 octets. Notez qu'il n'existe pas de "endianness" à ce , puisqu'il n'y a plus ou moins d'octets significatifs. Ne modifiez pas l'octet. commande.
  2. Utilisez le S de 2 octets comme valeur de sel.
  3. Dans les données du compte pour l'Association express annoncées, incluez le filtre généré dans le champ de filtre de clé de compte et S dans le champ Salt.