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
|
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
|
0bLLLL0000
|
1 - s | Filtro de claves de la cuenta | varía | |
s + 1 | uint8 |
Longitud y tipo de campo 0bLLLLTTTT
|
0b00100001
|
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:
- Sea n la cantidad de claves de cuenta (n >= 1) en la lista de claves de cuenta persistente.
- 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);
- Inicializa el filtro F como un array de bytes s, cada uno establecido en 0.
uint8_t F[s] = {0};
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:
- 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.
- Usa el S de 2 bytes como la sal.
- 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.