Indicador de publicidad del proveedor

Publicidad: Cuando se puede descubrir

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

Intervalo de anuncio: cuando es detectable

El intervalo entre 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 realiza un análisis en el modo de bajo consumo.

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

El anuncio debe contener el tipo de datos de datos de servicio, ibíd., § 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:

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

Carga útil de publicidad de uso compartido de audio LE: Datos de ID de modelo de Vinculación rápida y mapa de capacidades de Vinculación rápida

Los datos del servicio deben contener lo siguiente:

Octet Tipo de datos Descripción Valor
0 uint8 Versión y marcas
0bVVVVFFFF
  • V = versión
  • F = marcas
0x00
1 uint8 Longitud y tipo de campo
0bLLLLTTTT
  • L = longitud del ID del modelo en bytes
  • T = tipo
0bLLLL0111
  • length = 0bLLLL = varía
  • type = 0b0111, ID del modelo
2 - s ID de modelo varía
s + 1 uint8 Longitud y tipo de campo
0bLLLLTTTT
  • L = longitud en bytes
  • T = tipo
0bLLLL1000
s + 2 uint8 Mapa de capacidades de FP varía
Mapa de capacidades de FP

El mapa de capacidades de FP es un mapa de bits que representa las funciones de FP que admite el proveedor. El primer byte del mapa de bits se define de la siguiente manera:

Mapa de bits Descripción
0bRRRRRRSO R: Bit reservado, el buscador lo ignorará por ahora y se establecerá como 0.
S: Compatibilidad con el uso compartido de audio de FP LE Audio (se establece en 1 si está habilitado; de lo contrario, en 0).
O: Bit de configuración rápida (OOB), se establece en 1 si el dispositivo es nuevo de fábrica.

Si el proveedor admite la especificación de uso compartido de audio de FP LE Audio (lo que significa que admite la vinculación temporal, la carga útil de publicidad de uso compartido de audio de LE Audio y la versión 2 del control de audífonos), establece el bit de compatibilidad con el uso compartido de audio de FP LE Audio en 1. De lo contrario, establécelo en 0.

Si el proveedor no se vinculó con ningún buscador de FP y es nuevo de fábrica (es decir, no hay claves de cuenta de FP en el proveedor), establece el bit de OOB en 1; de lo contrario, establécelo en 0.

Carga útil de publicidad de información del conjunto coordinado: Datos del ID del modelo de Vinculación rápida y la información del conjunto coordinado de Vinculación rápida

Los datos del servicio deben contener lo siguiente:

Octet Tipo de datos Descripción Valor
0 uint8 Versión y marcas
0bVVVVFFFF
  • V = versión
  • F = marcas
0x00
1 uint8 Longitud y tipo de campo
0bLLLLTTTT
  • L = longitud del ID del modelo en bytes
  • T = tipo
0bLLLL0111
  • length = 0bLLLL = varía
  • type = 0b0111, ID del modelo
2 - s ID de modelo varía
s + 1 uint8 Longitud y tipo de campo
0bLLLLTTTT
  • L = longitud de los datos del conjunto coordinado
  • T = tipo
0b01101011
  • length = 0b0110
  • type = 0b1011
s + 2 - s + 7 uint48 Datos del conjunto coordinado de FP Datos de 6 bytes, consulta Información del conjunto coordinado de FP
Información del conjunto coordinado de FP

La información del conjunto coordinado de FP se usa para identificar si el dispositivo de publicidad está en el mismo conjunto coordinado o no.

Octet Tipo de datos Descripción Valor
0 uint8 Tamaño del conjunto coordinado varía
1 uint8 Tipo de miembro del conjunto coordinado de Vinculación rápida Puede ser uno de los siguientes:
  • 0x00 : componente izquierdo
  • 0x01 : componente derecho
2-5 uint32 Establece el hash de la clave de resolución de identidad varía

El algoritmo para generar el valor de hash de la clave de resolución de identidad establecida es

  • Usa SHA256 para generar un hash del valor de SIRK.

    SIRK = 0xe3b0c44298fc1c149afbf4c8996fb924
    
    SHA256(SIRK) = 0x2646036bb22781536be710245c8cbb04b92842c587f845996ce8ab542592a25e
    
  • Extrae los primeros cuatro bytes como el valor de hash

    Hash Value of Set Identity Resolving Key = 0x2646036b
    

Para configurar la clave de resolución de identidad, consulta Servicio de identificación de conjuntos coordinados para obtener más información.

Publicidad: Cuando no se puede descubrir

Cuando no se pueda detectar (es decir, no esté en modo de vinculación), el dispositivo proveedor anunciará los datos de la cuenta de Vinculación rápida con los siguientes lineamientos.

Anunciar los datos de la cuenta permite que los Buscadores cercanos reconozcan cuando un Proveedor pertenece a su cuenta y, así, iniciar la vinculación sin tener que forzar al Proveedor a volver al modo de vinculación, lo que suele ser motivo de quejas de los usuarios. Los buscadores brindarán la oportunidad para 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 vincularon). Los buscadores también filtrarán automáticamente las transmisiones que sean claramente incorrectas, como cuando los datos de la cuenta estén mal configurados.

Intervalo de anuncios: Cuando no se puede detectar

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 Service Data, 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:

Octet 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 claves de cuentas varía

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

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

Filtro de clave de cuenta

El filtro de clave de cuenta anunciado permite que un buscador verifique rápidamente si un proveedor puede poseer una determinada clave de cuenta (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 y tratar de iniciar el procedimiento cuando ve que se transmite un filtro con el tipo 0, es decir, que muestra una indicación de la IU, que podría contener 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 quiera que el buscador lo reconozca, aunque no esté listo para la vinculación. Un ejemplo es que, cuando los auriculares se vuelven a colocar en el estuche, queremos dejar de mostrar la notificación de vinculación posterior, ya que los auriculares podrían rechazar esa vinculación.

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

  1. Supongamos que n es la cantidad de claves de cuenta (n >= 1) en la lista de claves de cuenta persistente.
  2. Sea s, el tamaño del filtro en bytes, (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. 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. Aplica el hash V con SHA256 para obtener 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. Supongamos que M es 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 Filtro de clave de cuenta en los datos publicitarios. Ten en cuenta que no hay un "endianness" para este valor, ya que no hay un byte más o menos significativo; 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 actualiza la RPA para el proveedor, de modo que se evite el seguimiento en la rotación de direcciones.

Para generar el filtro de clave de cuenta con la sal, haz lo siguiente:

  1. Genera un S aleatorio de 2 bytes. Ten en cuenta que no hay "endianness" en este valor, ya que no hay un byte más o menos significativo; no alteres el orden de los bytes.
  2. Usa el valor 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 S en el campo Salt.