Indicador de publicidad del proveedor

Publicidad: Cuándo es detectable

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

Intervalo de publicidad: Cuando es detectable

El intervalo entre los anuncios no debe ser superior a 100 ms (10 Hz). Una velocidad rápida permite que el buscador encuentre rápidamente al proveedor, incluso cuando se escanea en modo de baja potencia.

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

El anuncio debe contener el tipo de datos de los Datos del Servicio, ibid., § 1.11. El UUID debe 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: Cuando no es detectable

Cuando no sea detectable (es decir, no esté en modo de vinculación), el dispositivo del proveedor deberá 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 buscadores cercanos reconozcan cuando un proveedor pertenece a su cuenta y comiencen a vincularlo sin tener que forzar al proveedor a volver al modo de vinculación, lo que es un motivo común de quejas de los usuarios. Los buscadores brindarán la oportunidad a los usuarios de poder ignorar esta transmisión en caso de que no esperen para vincularse con el proveedor o si la transmisión no es relevante (por ejemplo, si ya se vincularon). Los buscadores también filtrarán automáticamente las transmisiones claramente deficientes, como cuando los datos de la cuenta están mal configurados.

Intervalo de publicidad: Cuando no es detectable

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

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

El anuncio debe incluir el tipo de datos de los Datos del Servicio, ídem. § 1.11. El UUID debe 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 de la clave de la cuenta varía

Los datos de la clave de la cuenta contienen lo siguiente:

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

Filtro de claves de la cuenta

El filtro de claves de cuenta anunciado permite que un buscador verifique rápidamente si un proveedor podría poseer una clave de cuenta determinada (con una baja probabilidad de falso positivo, en promedio, mucho menos del 0.5%) antes de realizar más interacciones. Es posible que el buscador se conecte automáticamente y que intente iniciar el procedimiento cuando vea que se transmite un filtro con el tipo 0, es decir, que muestra una indicación de la IU que potencialmente 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 buscador lo reconozca cuando aún no está listo para la vinculación. Un ejemplo es que, cuando los auriculares se vuelven a colocar en la funda, queremos dejar de mostrar la notificación de vinculación posterior, ya que el auricular podría rechazar esa vinculación.

El filtro de claves de cuenta es un filtro Bloom de longitud variable que se construye de la siguiente manera:

  1. Sea n la cantidad de claves de cuenta (n >= 1) en la lista de claves de cuenta persistente.
  2. Supongamos que s, el tamaño del filtro en bytes, es (1.2*n + 3) truncado. Por ejemplo, si se conserva 1 clave, s = 4 bytes.
    uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3);
  3. Inicializa el filtro F como un array de bytes s, 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:
    a. Sea V concat(K, Sal).

    // 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. Se genera un hash de V con SHA256, y se obtiene 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 signo de 4 bytes en formato 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. Sea M Xi módulo la cantidad de bits en el filtro, (s * 8).
    ii. Obtén el byte en 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));
        }
    

Incluye el filtro F como el campo de filtro de clave de cuenta en los datos publicitarios. Ten en cuenta que no hay "endianidad" en este valor, ya que no hay un byte más o menos significativo. No alteres el orden de bytes.

Campo de sal

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

Para generar el filtro de claves de cuenta con la sal, sigue estos pasos:

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