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
|
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 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
|
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
|
0b01101011
|
| 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:
|
| 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 = 0xe3b0c44298fc1c149afbf4c8996fb924SHA256(SIRK) = 0x2646036bb22781536be710245c8cbb04b92842c587f845996ce8ab542592a25eExtrae 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
|
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
|
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 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:
- Supongamos que n es la cantidad de claves de cuenta (n >= 1) en la lista de claves de cuenta persistente.
- 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); - 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. 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:
- 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.
- Usa el valor 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 Filtro de clave de cuenta y S en el campo Salt.