Signal publicitaire du fournisseur

Publicité : lorsque l'appareil est détectable

Lorsque l'appareil fournisseur est détectable en mode BR/EDR (c'est-à-dire en mode association), il doit diffuser les données d'ID de modèle Association express via BLE, et l'adresse BLE ne doit pas être modifiée.

Intervalle de publicité : quand l'appareil est détectable

L'intervalle entre les annonces ne doit pas dépasser 100 ms (10 Hz). Un taux rapide permet au demandeur de trouver rapidement le fournisseur, même en mode basse consommation.

Charge utile publicitaire : données de l'ID du modèle Fast Pair

L'annonce doit contenir le type de données "Service Data", ibid., § 1.11. L'UUID doit être l'UUID du service Association express, à savoir 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 variable

Charge utile publicitaire du partage audio LE : données de l'ID de modèle Association express et carte des fonctionnalités FP

Les données de 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
1 uint8 Longueur et type du champ
0bLLLLTTTT
  • L = longueur de l'ID du modèle en octets
  • T = type
0bLLLL0111
  • length = 0bLLLL = varie
  • type = 0b0111, ID du modèle
2 – s ID du modèle variable
s + 1 uint8 Longueur et type du champ
0bLLLLTTTT
  • L = longueur en octets
  • T = type
0bLLLL1000
s + 2 uint8 Carte des fonctionnalités FP variable
Carte des fonctionnalités FP

La carte des fonctionnalités FP est un bitmap représentant 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é, qui sera ignoré par le chercheur pour le moment et qui doit être défini sur 0.
S : compatibilité avec le partage audio LE FP (défini sur 1 si activé, sinon sur 0).
O : bit "Out of Box" (OOB), défini sur 1 si l'appareil est neuf.

Si le fournisseur est compatible avec la spécification FP LE Audio Sharing (c'est-à-dire qu'il est compatible avec Temporary Pairing, LE Audio Sharing Advertising Payload et Hearable control version 2), définissez le bit de compatibilité FP LE Audio Sharing sur 1. Sinon, définissez-le sur 0.

Si le fournisseur n'a été associé à aucun demandeur d'empreinte digitale et qu'il est neuf (c'est-à-dire qu'il ne contient aucune clé de compte d'empreinte digitale), définissez le bit OOB sur 1. Sinon, définissez-le sur 0.

Publicité : lorsque le profil n'est pas détectable

Lorsqu'il n'est pas détectable (c'est-à-dire en mode association), l'appareil fournisseur doit diffuser les données de compte Association express en suivant les consignes ci-dessous.

La publicité 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, ce qui est une cause fréquente de réclamation des utilisateurs. Les Seekers permettront aux utilisateurs d'ignorer cette diffusion s'ils ne souhaitent pas attendre pour s'associer au fournisseur ou si la diffusion n'est pas pertinente (par exemple, s'ils sont déjà associés). Les chercheurs filtreront également automatiquement les diffusions manifestement mauvaises, par exemple lorsque les données du compte sont mal configurées.

Intervalle de publicité : lorsque l'appareil n'est pas détectable

L'intervalle entre les annonces doit être de 250 ms (4 Hz) maximum.

Charge utile publicitaire : données de compte Association express

L'annonce doit contenir le type de données "Données de service", Ibid., § 1.11. L'UUID doit être l'UUID du service Association express, à savoir 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
  • V = version
  • F = indicateurs
0x00
(réservé pour une utilisation ultérieure)
1 – variable Données de clé de compte variable

Les données de la clé de compte contiennent les informations suivantes :

Octet Type de données Description Valeur
0 uint8 Longueur et type du 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 variable
s + 1 uint8 Longueur et type du champ
0bLLLLTTTT
  • L = longueur en octets
  • T = type
0b00100001
  • length = 0b0010 = 2
  • type = 0b0001, Salt
s+2 – s+3 uint16 Salt variable

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 positif, en moyenne beaucoup moins de 0,5%), avant d'autres interactions. Le Seeker 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'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, le fournisseur peut souhaiter être reconnu par le demandeur sans être 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 peut être refusée par le casque.

Le filtre de clé de compte est un filtre Bloom de 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. Soit s la taille du filtre en octets, qui est égale à (1, 2*n + 3) tronqué. Par exemple, si une 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 de s octets, chacun défini sur 0.
    uint8_t F[s] = {0};
  4. Pour chaque clé de compte K dans la liste des clés de compte persistante :
    a. Soit V la concaténation de K et de 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 égal à Xi modulo le nombre de bits dans le filtre, (s * 8).
    ii. Obtenez 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 dans le champ "Filtre de clé de compte" des données publicitaires. Notez qu'il n'y a pas d'endianness 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 sel est une valeur aléatoire 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'APR 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 aléatoire de deux octets. Notez qu'il n'y a pas d'endianité 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 sel.
  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".