Indicador de publicidad del proveedor
Publicidad: Cuando se puede encontrar
Cuando el dispositivo proveedor es detectable por BR/EDR (es decir, está en modo de vinculación), debe anunciar los datos del ID del modelo de Vinculación rápida a través de BLE, y la dirección BLE no debe rotarse.
Intervalo de publicidad: 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 modo de bajo consumo.
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 de Servicio, ibid., Artículo 1, sección 11 El UUID debe ser el UUID del servicio de Vinculación rápida de 0xFE2C. Los datos de servicio deben contener lo siguiente:
| Octeto | Tipo de datos | Descripción | Valor |
|---|---|---|---|
| 0-2 | uint24 |
ID del modelo de 24 bits | varía |
Carga útil de publicidad de uso compartido de audio LE: Datos del ID del modelo de Vinculación rápida y mapa de capacidades de FP
Los datos de servicio deben contener lo siguiente:
| Octeto | Tipo de datos | Descripción | Valor |
|---|---|---|---|
| 0 | uint8 |
Versión y marcas 0bVVVVFFFF
|
0x00 |
| 1 | uint8 |
Longitud y tipo de campo 0bLLLLTTTT
|
0bLLLL0111
|
| 2: s | ID de modelo | varía | |
| s + 1 | uint8 |
Longitud y tipo de campo 0bLLLLTTTT
|
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 qué funciones de FP 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. Por el momento, el buscador lo ignorará y se establecerá en 0. S: Bit de compatibilidad con el uso compartido de audio LE de FP (se establece en 1 si está habilitado y en 0 si no lo está). O: Bit de dispositivo nuevo (OOB). Se establece en 1 si el dispositivo es nuevo de fábrica. |
Si el proveedor admite la especificación de LE Audio Sharing de FP (es decir, admite vinculación temporal, carga útil de publicidad de LE Audio Sharing y versión 2 de control de dispositivos auditivos), establece el bit de compatibilidad de LE Audio Sharing de FP 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 OOB en 1; de lo contrario, establécelo en 0.
Publicidad: Cuando no se puede encontrar
Cuando no se pueda detectar (es decir, cuando no esté en modo de vinculación), el dispositivo de 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 buscadores cercanos reconozcan cuando un proveedor pertenece a su cuenta y que inicien la vinculación sin tener que forzar primero al proveedor a que vuelva al modo de vinculación, lo que suele ser motivo de quejas de los usuarios. Los buscadores brindarán la oportunidad a los usuarios de ignorar esta transmisión en el caso de que no esperen a vincularse con el proveedor o la transmisión no sea pertinente (por ejemplo, si ya se vincularon). Los buscadores también filtrarán automáticamente las transmisiones obviamente malas, por ejemplo, cuando los datos de la cuenta estén mal configurados.
Intervalo de publicidad: 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 de Datos de Servicio, Ibid., Artículo 1, sección 11 El UUID debe ser el UUID del servicio de Vinculación rápida de 0xFE2C. Los datos de 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 clave de 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 clave de cuenta | varía | |
| s + 1 | uint8 |
Longitud y tipo de campo 0bLLLLTTTT
|
0b00100001
|
| 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 podría poseer una determinada clave de cuenta (con una baja probabilidad de falsos positivos, en promedio mucho menor que el 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 de 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 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 la cuenta es un filtro de Bloom de longitud variable que se construye de la siguiente manera:
- Sea n la cantidad de claves de la cuenta (n >= 1) en la lista de claves de la cuenta persistente.
- Sea s, el tamaño del filtro en bytes, igual a (1.2*n + 3) truncado. Por ejemplo, si se persiste 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, haz lo siguiente:
a. Sea V igual a 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 de 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 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 igual a 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 la cuenta en los datos de publicidad. Ten en cuenta que este valor no tiene "endianness", ya que no hay bytes más o menos significativos. No alteres el orden de los bytes.
Campo de sal
El valor de sal es un valor aleatorio que se agrega a las claves de la cuenta cuando se compila el filtro de Bloom. Este valor de salt se debe volver a generar cada vez que se actualice el RPA para el proveedor, de modo que se evite el seguimiento en la rotación de direcciones.
Para generar el filtro de claves de la cuenta con la sal, haz lo siguiente:
- Genera un S aleatorio de 2 bytes. Ten en cuenta que este valor no tiene "endianness", ya que no hay bytes más o menos significativos. No alteres el orden de los bytes.
- Usa la S de 2 bytes como sal.
- En los datos de la cuenta de Vinculación rápida anunciados, incluye el filtro generado en el campo Account Key Filter y S en el campo Salt.