Indicador de publicidad del proveedor

Publicidad: cuando es detectable

Cuando el dispositivo del proveedor sea detectable de BR/EDR (es decir, en modo de vinculación), anunciará los datos de ID de modelo de vinculación rápida en BLE, y la dirección BLE no se rotará.

Intervalo de publicidad: cuando es detectable

El intervalo entre anuncios no debe superar los 100 ms (10 Hz). Una velocidad rápida permite que el usuario encuentre al proveedor con rapidez, incluso cuando escanea en modo de bajo consumo.

Carga útil de publicidad: Datos de ID de modelo de vinculación rápida

El anuncio debe contener el tipo de datos de datos de servicio, ibid. Artículo 1.11. El UUID será el UUID del servicio de vinculación rápida de 0xFE2C. Los datos del servicio contendrán lo siguiente:

Octeta Tipo de dato Descripción Valor
0-2 uint24 ID de modelo de 24 bits varía

Publicidad: cuando no es detectable

Cuando no sea detectable (es decir, no esté en modo de vinculación), el dispositivo del proveedor anunciará datos de la cuenta de vinculación rápida según los siguientes lineamientos.

Anunciar los datos de la cuenta permite a los usuarios cercanos reconocer cuando un proveedor pertenece a su cuenta e iniciar la vinculación sin tener que forzar nuevamente al proveedor al modo de vinculación, lo cual es una causa común para los reclamos del usuario. Los usuarios que realicen una búsqueda brindarán la oportunidad de ignorar esta transmisión en caso de que no esperen vincularse con el proveedor o la transmisión no sea relevante (por ejemplo, si ya la sincronizaron). Los usuarios también filtrarán las transmisiones obviamente incorrectas de forma automática, por ejemplo, cuando los datos de la cuenta estén mal configurados.

Intervalo de publicidad: cuando no es detectable

El intervalo entre anuncios debe ser de 250 ms como máximo (4 Hz).

Carga útil de publicidad: Datos de cuenta de vinculación rápida

El anuncio debe contener el tipo de datos de los datos del servicio, Ibid. Artículo 1.11. El UUID será el UUID del servicio de vinculación rápida de 0xFE2C. Los datos del servicio contendrán lo siguiente:

Octeta Tipo de dato Descripción Valor
0 uint8 Versión y marcas
0bVVVVFFFF
  • V = versión
  • F = marcas
0x00
(reservada para uso futuro)
1 - varía Datos clave de la cuenta varía
o 0x00 si la lista de claves de cuentas está vacía.

Los Datos clave de la cuenta contienen:

Octeta Tipo de dato Descripción Valor
0 uint8 Longitud y tipo del campo
0bLLLLTTT
  • L = Longitud del filtro de claves de la cuenta en bytes
  • T = tipo
0bLLLL0000
  • length = 0bllLL = varía
  • tipo = 0b0000 (mostrar indicación de la IU) o 0b0010 (ocultar la indicación de la IU), filtro de clave de la cuenta
1: s Filtro de clave de la cuenta varía
s + 1 uint8 Longitud y tipo del campo
0bLLLLTTT
  • L = longitud en bytes
  • T = tipo
0b00100001
  • longitud = 0b0010 = 2
  • tipo = 0b0001, sal
s + 2 - s + 3 uint16 Salt varía

Filtro de clave de la cuenta

El Filtro de claves de cuenta anunciado permite que un usuario verifique rápidamente si un proveedor puede poseer una clave de cuenta determinada (con una probabilidad baja de falsos positivos, en promedio mucho menor que el 0.5%), antes de más interacciones. El usuario puede conectarse y, luego, intentar iniciar el procedimiento de forma automática cuando ve un filtro que se emite con un tipo 0, es decir, que muestra una indicación de la IU que podría incluir una de las claves de su cuenta a fin de reducir aún más la tasa de falsos positivos. En algunas situaciones, es posible que el proveedor quiera que se lo reconozca cuando no está listo para vincularse. Por ejemplo, cuando los auriculares vuelven a colocarse en la caja, queremos dejar de mostrar la notificación de sincronización posterior, ya que los auriculares podrían rechazarla.

El filtro de clave de la cuenta es un filtro de Bloom de longitud variable, construido de la siguiente manera:

  1. Deja que n sea el número de claves de cuenta (n >= 1) en la lista de claves de cuenta persistente.
  2. Deje que s, el tamaño del filtro en bytes, sea (1.2*n + 3) truncado. Por ejemplo, si la clave es 1, s = 4 bytes.
    uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3);
  3. Inicializa el filtro F como un arreglo de s bytes, cada uno establecido en 0.
    uint8_t F[s] = {0};
  4. Para cada clave de cuenta K en la lista de claves de cuenta persistente:
    Deja que V sea 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. Genera un hash V con SHA256 y obtén un valor de 32 bytes H = {H0, ..., H31}.

    uint8_t H[32] = {0};
    SHA256_hash_function(V, H);
    

    c. Divide H en ocho números enteros sin firma de 4 bytes en big-endian, X = {X0, ..., X7}, donde 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. Para cada Xi:
    i. Deja que M sea el módulo Xi de la cantidad de bits en el filtro, (s * 8).
    II. Obtiene el byte de F en el índice (M / 8), redondeado hacia abajo.
    III. Dentro del byte, establece el bit en el índice (M % 8) a 1.
    IV. En otras palabras:

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

Incluya el filtro F como el campo de clave de la cuenta en el filtro de datos de anuncios. Ten en cuenta que este valor no tiene un “endianness”, ya que no hay más o menos bytes significativos, no alteres el orden de los bytes.

Campo de sal

La sal es un valor aleatorio que se agrega a las claves de cuenta cuando se compila el filtro de Bloom. Esta sal se debe volver a generar cada vez que se actualice el RPA para que el proveedor evite el seguimiento en la rotación de la dirección.

Sigue estos pasos para generar el filtro de clave de la cuenta con la sal:

  1. Genera un S aleatorio de 2 bytes. Ten en cuenta que este valor no tiene un “endianity”, ya que no hay más o menos bytes significativos; no alteres el orden de los bytes.
  2. Usa la S de 2 bytes como sal.
  3. En los datos de la cuenta de Vinculación rápida anunciados, incluye el filtro generado en el campo Filtro de clave de la cuenta y S en el campo Sal.