Signal publicitaire du fournisseur

Annonce : lorsque l'appareil est détectable

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

Intervalle d'annonce : lorsque l'appareil est détectable

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

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

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

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

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 = flags (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 varie
s + 1 uint8 Longueur et type du champ
0bLLLLTTTT
  • L = longueur en octets
  • T = type
0bLLLL1000
s + 2 uint8 Carte des fonctionnalités FP varie
Carte des fonctionnalités FP

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

Si le fournisseur est compatible avec la spécification de partage audio FP LE (ce qui signifie qu'il est compatible avec l'association temporaire, la charge utile de l'annonce de partage audio LE et la version 2 du contrôle des écouteurs), définissez le bit de compatibilité avec le partage audio FP LE sur 1. Sinon, définissez-le sur 0.

Si le fournisseur n'a été associé à aucun chercheur FP et qu'il est neuf (ce qui signifie qu'il n'y a pas de clés de compte FP sur le fournisseur), définissez le bit OOB sur 1. Sinon, définissez-le sur 0.

Charge utile de l'annonce d'informations sur l'ensemble coordonné : données d'ID de modèle d'Association express et informations sur l'ensemble coordonné d'Association express

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 = flags (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 varie
s + 1 uint8 Longueur et type du champ
0bLLLLTTTT
  • L = longueur des données de l'ensemble de coordonnées
  • T = type
0b01101011
  • length = 0b0110
  • type = 0b1011
s + 2 - s + 7 uint48 Données de l'ensemble coordonné FP Données de 6 octets, voir Informations sur l'ensemble coordonné FP
Informations sur l'ensemble coordonné FP

Les informations sur l'ensemble coordonné FP permettent d'identifier si l'appareil publicitaire se trouve ou non dans le même ensemble coordonné.

Octet Type de données Description Valeur
0 uint8 Taille de l'ensemble coordonné Variable
1 uint8 Type de membre de l'ensemble coordonné d'Association express Peut être l'une des valeurs suivantes :
  • 0x00 : composant gauche
  • 0x01 : composant droit
2 à 5 uint32 Définir le hachage de la clé de résolution d'identité Variable

L'algorithme permettant de générer la valeur de hachage de la clé de résolution d'identité définie est

  • Utilisez SHA256 pour hacher la valeur SIRK.

    SIRK = 0xe3b0c44298fc1c149afbf4c8996fb924
    
    SHA256(SIRK) = 0x2646036bb22781536be710245c8cbb04b92842c587f845996ce8ab542592a25e
    
  • Extraire les quatre premiers octets en tant que valeur de hachage

    Hash Value of Set Identity Resolving Key = 0x2646036b
    

Pour en savoir plus sur la clé de résolution d'ensemble d'identités, consultez Service d'identification d'ensemble coordonné.

Annonce : quand l'appareil n'est pas détectable

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

La diffusion des données du compte permet aux Seekers à proximité de reconnaître quand un Provider appartient à leur compte et de lancer l'association sans avoir à forcer d'abord le Provider à revenir en mode association, ce qui est une cause fréquente de réclamation des utilisateurs. Les chercheurs permettront aux utilisateurs d'ignorer cette diffusion s'ils ne souhaitent pas s'associer au fournisseur ou si la diffusion n'est pas pertinente (par exemple, s'ils sont déjà associés). Les Seekers filtrent également automatiquement les diffusions manifestement incorrectes, par exemple lorsque les données du compte sont mal configurées.

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

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

Charge utile publicitaire : données du compte Association express

L'annonce doit contenir le type de données "Service Data", Ibid., § 1.11. L'UUID doit être l'UUID du service d'association express de 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 = flags (indicateurs)
0x00
(réservé pour une utilisation ultérieure)
1 - varie Données des clés de compte varie

Les données de clé de compte contiennent :

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 de l'UI) ou 0b0010 (masquer l'indication de l'UI), filtre de clé de compte
1 s Filtre de clé de compte varie
s + 1 uint8 Longueur et type du 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 chercheur de vérifier rapidement si un fournisseur possède une certaine clé de compte (avec une faible probabilité de faux positif, en moyenne bien inférieure à 0,5 %) avant d'effectuer 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 affichant 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 vouloir être reconnu par le chercheur, même s'il n'est pas 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 pourrait être refusée par le casque.

Le filtre de clé de compte est un filtre de 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, tronquée à (1,2*n + 3). 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 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 = 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. 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 = Xi modulo le nombre de bits dans le filtre, (s * 8).
    ii. Récupérez 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 en tant que champ "Filtre de clé de compte" dans les données publicitaires. Notez qu'il n'y a pas de "boutisme" 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 qui est ajoutée aux clés de compte lors de la création du filtre de Bloom. Ce salage doit être régénéré chaque fois que l'adresse RPA est mise à 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 salage :

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