Indicador de publicidad del proveedor

Publicidad: Cuando sea detectable

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

Intervalo de publicidad: cuando sea detectable

El intervalo entre anuncios no debe ser superior a 100 ms (10 Hz). Una tasa rápida permite que Seeker encuentre rápidamente al proveedor, incluso cuando realiza búsquedas en modo de bajo consumo.

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

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

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

Publicidad: Cuándo no es detectable

Cuando no sea detectable (es decir, cuando no se encuentre en el modo de vinculación), el dispositivo del proveedor anunciará los Datos de la cuenta de Vinculación rápida según los siguientes lineamientos.

Anunciar los datos de la cuenta permite que los Seekers cercanos reconozcan cuando un proveedor pertenece a su cuenta e inicien la vinculación sin tener que forzar al proveedor nuevamente al modo de vinculación, lo cual es una causa común de quejas de los usuarios. Los buscadores darán la oportunidad de que los usuarios puedan ignorar esta transmisión en caso de que no esperen para vincularse con el proveedor o la transmisión no sea relevante (por ejemplo, si ya se sincronizaron). Los solicitantes también filtrarán automáticamente las transmisiones claramente incorrectas, como cuando los datos de la cuenta están mal configurados.

Intervalo de publicidad: Cuándo no es detectable

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

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

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

Octeto Tipo de datos Descripción Valor
0 uint8 Versión y marcas
0bVVVVFFFF
  • V = versión
  • F = marcas
0x00
(reservado para uso futuro)
1: varía Datos clave de la cuenta varía
o 0x00 si la lista de claves de la cuenta está vacía

Los datos clave de la cuenta contienen lo siguiente:

Octeto Tipo de datos Descripción Valor
0 uint8 Longitud y tipo del campo
0bLLLLTTTT
  • L = longitud del filtro de clave de cuenta en bytes
  • T = tipo
0bLLLL0000
  • longitud = 0bLLLL = varía
  • tipo = 0b0000 (mostrar indicación de IU) o 0b0010 (ocultar indicación de IU), filtro de clave de cuenta
De 1 a s Filtro de la clave de la cuenta varía
s + 1 uint8 Longitud y tipo del campo
0bLLLLTTTT
  • L = longitud en bytes
  • T = tipo

  • longitud = 0b0010 = 2
  • tipo = 0b0001, Salt
s + 2 - s + 3 uint16 Salt varía

Filtro de la clave de la cuenta

El filtro de clave de cuenta anunciada permite que un buscador verifique rápidamente si un proveedor posee una clave de cuenta determinada (con una baja probabilidad de falsos positivos, en promedio, mucho menos del 0.5%) antes de realizar más interacciones. El buscador puede conectarse automáticamente e intentar iniciar el procedimiento cuando ve un filtro que se transmite con el tipo 0, es decir, muestra la indicación de la IU que posiblemente contiene una de sus claves de cuenta, para reducir aún más la tasa de falsos positivos. En algunas situaciones, es posible que el proveedor desee que el Seeker reconozca al proveedor que no está listo para la vinculación. Un ejemplo es que, cuando se vuelven a colocar los auriculares en la funda, queremos dejar de mostrar la notificación de vinculación subsiguiente, ya que los auriculares podrían rechazar esa vinculación.

El filtro de clave de cuenta es un filtro 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 guardada.
  2. Permita que s, el tamaño del filtro en bytes, se trunque (1.2*n + 3). Por ejemplo, si 1 clave es persistente, 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 configurado en 0.
    uint8_t F[s] = {0};
  4. Para cada clave de cuenta K en la lista de claves de cuenta guardada:
    a. Deja que V sea concatal(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 de 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 de 4 bytes sin firma 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 Xi módulo la cantidad de bits en el filtro (s * 8).
    II. Obtén el byte de F en el índice (M / 8), redondeado hacia abajo.
    III. Dentro del byte, establece el bit en el índice (M % 8) en 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));
        }
    

En los datos de anuncios, incluya el filtro F como el campo Filtro de la clave de la cuenta. Ten en cuenta que no hay "endian" para este valor, ya que no hay más o menos byte significativo. No alteres el orden de los bytes.

Salinas

La sal es un valor aleatorio que se agrega a las claves de cuenta cuando se compila el filtro de floración. Esta sal debe regenerarse cada vez que se actualiza la RPA para que el proveedor evite el seguimiento en la rotación de direcciones.

Para generar el filtro de clave de cuenta con la sal:

  1. Genera una S aleatoria de 2 bytes. Ten en cuenta que no hay "endian" para este valor, ya que no hay un byte más o menos significativo. 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 cuenta y la S en el campo de sal.