Indicador de publicidade do provedor
Anúncio: quando detectável
Quando o dispositivo do provedor é detectável por BR/EDR (ou seja, no modo de pareamento), ele precisa anunciar os dados do ID do modelo de Pareamento Rápido por BLE, e o endereço BLE não pode ser alternado.
Intervalo de anúncio: quando detectável
O intervalo entre os anúncios não pode ser maior que 100 ms (10 Hz). Uma taxa rápida permite que o Buscador encontre rapidamente o Provedor, mesmo ao verificar no modo de baixo consumo de energia.
Payload de publicidade: dados do ID do modelo de Pareamento rápido
O anúncio precisa conter o tipo de dados de dados de serviço, ibid., § 1.11. O
UUID será o UUID do serviço de Pareamento rápido de 0xFE2C. Os dados de serviço vão
conter o seguinte:
| Octeto | Tipo de dado | Descrição | Valor |
|---|---|---|---|
| 0-2 | uint24 |
ID do modelo de 24 bits | varia |
Payload de publicidade do compartilhamento de áudio LE: dados de ID do modelo de Pareamento rápido e mapa de recursos de FP
Os dados de serviço devem conter o seguinte:
| Octeto | Tipo de dado | Descrição | Valor |
|---|---|---|---|
| 0 | uint8 |
Versão e flags 0bVVVVFFFF
|
0x00 |
| 1 | uint8 |
Comprimento e tipo do campo 0bLLLLTTTT
|
0bLLLL0111
|
| 2 - s | ID do modelo | varia | |
| s + 1 | uint8 |
Comprimento e tipo do campo 0bLLLLTTTT
|
0bLLLL1000
|
| s + 2 | uint8 |
Mapa de recursos de FP | varia |
Mapa de recursos de FP
O mapa de recursos de FP é um bitmap que representa os recursos de FP compatíveis com o provedor. O primeiro byte do bitmap é definido da seguinte forma:
| Bitmap | Descrição |
|---|---|
| 0bRRRRRRSO | R: bit reservado, será ignorado pelo buscador por enquanto e definido como 0. S: suporte ao compartilhamento de áudio LE do FP (definido como 1 se ativado, caso contrário, 0). O: bit pronto para uso (OOB, na sigla em inglês), definido como 1 se o dispositivo for novo de fábrica. |
Se o provedor for compatível com a especificação de compartilhamento de áudio LE do FP (ou seja, com o pareamento temporário, o payload de publicidade de compartilhamento de áudio LE e o controle de fones de ouvido versão 2), defina o bit de suporte ao compartilhamento de áudio LE do FP como 1. Caso contrário, defina como 0.
Se o Provedor não tiver sido pareado com nenhum Buscador de FP e for novo de fábrica (ou seja, não houver chaves de conta de FP no provedor), defina o bit OOB como 1. Caso contrário, defina-o como 0.
Payload de publicidade de informações do conjunto coordenado: dados do ID do modelo de Pareamento rápido e informações do conjunto coordenado de Pareamento rápido
Os dados de serviço devem conter o seguinte:
| Octeto | Tipo de dado | Descrição | Valor |
|---|---|---|---|
| 0 | uint8 |
Versão e flags 0bVVVVFFFF
|
0x00 |
| 1 | uint8 |
Comprimento e tipo do campo 0bLLLLTTTT
|
0bLLLL0111
|
| 2 - s | ID do modelo | varia | |
| s + 1 | uint8 |
Comprimento e tipo do campo 0bLLLLTTTT
|
0b01101011
|
| s + 2 - s + 7 | uint48 |
Dados do conjunto coordenado de FP | Dados de 6 bytes, consulte Informações do conjunto coordenado de FP |
Informações do conjunto coordenado de FP
As informações do conjunto coordenado do FP são usadas para identificar se o dispositivo de publicidade está no mesmo conjunto coordenado ou não.
| Octeto | Tipo de dado | Descrição | Valor |
|---|---|---|---|
| 0 | uint8 |
Tamanho do conjunto coordenado | varia |
| 1 | uint8 |
Tipo de membro do conjunto coordenado de Pareamento Rápido | Pode ser um dos seguintes:
|
| Dois a cinco | uint32 |
Definir o hash da chave de resolução de identidade | varia |
O algoritmo para gerar o valor de hash da chave de resolução de identidade definida é
Usar SHA256 para gerar o hash do valor do SIRK
SIRK = 0xe3b0c44298fc1c149afbf4c8996fb924SHA256(SIRK) = 0x2646036bb22781536be710245c8cbb04b92842c587f845996ce8ab542592a25eExtrair os primeiros quatro bytes como o valor de hash
Hash Value of Set Identity Resolving Key = 0x2646036b
Para a chave de resolução de conjunto de identidade, consulte Serviço de identificação de conjunto coordenado para mais informações.
Anúncio: quando não detectável
Quando não estiver detectável (ou seja, não estiver no modo de pareamento), o dispositivo provedor vai anunciar os dados da conta de Pareamento rápido, usando as diretrizes a seguir.
Anunciar os dados da conta permite que os Seekers por perto reconheçam quando um provedor pertence à conta deles e iniciem o pareamento sem precisar forçar o provedor a voltar ao modo de pareamento primeiro, o que é uma causa comum de reclamações dos usuários. Os buscadores vão oferecer aos usuários a oportunidade de ignorar essa transmissão caso eles não queiram parear com o provedor ou se a transmissão não for relevante (por exemplo, se eles já tiverem feito o pareamento). Os Seekers também filtram automaticamente transmissões obviamente ruins, como quando os dados da conta estão configurados incorretamente.
Intervalo de anúncio: quando não detectável
O intervalo entre os anúncios precisa ser de no máximo 250 ms (4 Hz).
Payload de publicidade: dados da conta de Pareamento rápido
O anúncio precisa conter o tipo de dados de dados de serviço, Ibid., § 1.11. O
UUID será o UUID do serviço de Pareamento rápido de 0xFE2C. Os dados de serviço vão
conter o seguinte:
| Octeto | Tipo de dado | Descrição | Valor |
|---|---|---|---|
| 0 | uint8 |
Versão e flags 0bVVVVFFFF
|
0x00(reservado para uso futuro) |
| 1 - varia | Dados da chave da conta | varia |
Os dados da chave de conta contêm:
| Octeto | Tipo de dado | Descrição | Valor |
|---|---|---|---|
| 0 | uint8 |
Comprimento e tipo do campo 0bLLLLTTTT
|
0bLLLL0000
|
| 1 - s | Filtro de chave de conta | varia | |
| s + 1 | uint8 |
Comprimento e tipo do campo 0bLLLLTTTT
|
0b00100001
|
| s + 2 - s + 3 | uint16 |
Salt | varia |
Filtro de chave de conta
O filtro de chave de conta anunciado permite que um buscador verifique rapidamente se um provedor pode ter uma determinada chave de conta (com uma baixa probabilidade de falso positivo, em média, muito menor que 0,5%) antes de outras interações. O Buscador pode se conectar automaticamente e tentar iniciar o procedimento quando vê um filtro sendo transmitido com o tipo 0, ou seja, mostrando uma indicação de interface que pode conter uma das chaves de conta, para reduzir ainda mais a taxa de falsos positivos. Em algumas situações, o Provedor pode querer ser reconhecido pelo Buscador, mesmo que não esteja pronto para o pareamento. Por exemplo, quando os fones de ouvido são colocados de volta no estojo, queremos parar de mostrar a notificação de pareamento subsequente, já que esse pareamento pode ser rejeitado pelo fone de ouvido.
O filtro de chave de conta é um filtro de Bloom de comprimento variável construído da seguinte maneira:
- Considere n como o número de chaves de conta (n >= 1) na lista de chaves de conta persistente.
- Seja s, o tamanho do filtro em bytes, (1,2*n + 3) truncado. Por
exemplo, se uma chave for mantida, s = 4 bytes.
uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3); - Inicialize o filtro F como uma matriz de bytes s, cada um definido como 0.
uint8_t F[s] = {0}; Para cada chave de conta K na lista de chaves de conta persistente:
a. Considere V como 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. Gere o hash de V usando SHA256, obtendo um valor de 32 bytes H = {H0, …, H31}.
uint8_t H[32] = {0}; SHA256_hash_function(V, H);c. Divida H em oito números inteiros sem sinal de 4 bytes em big-endian, X = {X0, …, X7}, em que 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. Seja M o módulo de Xi do número de bits no filtro, (s * 8).
ii. Receba o byte em F no índice (M / 8), arredondado para baixo.
iii. No byte, defina o bit no índice (M % 8) como 1.
iv. Em outras palavras:// 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)); }
Inclua o filtro F como o campo "Filtro de chave da conta" nos dados de publicidade. Não há "endianness" para esse valor, já que não há byte mais ou menos significativo. Não altere a ordem dos bytes.
Campo de sal
O sal é um valor aleatório anexado às chaves de conta ao criar o filtro de Bloom. Esse salt precisa ser gerado novamente sempre que o RPA for atualizado para o provedor, para evitar o rastreamento na rotação de endereços.
Para gerar o filtro de chave de conta usando o salt:
- Gere um S aleatório de 2 bytes. Não há "endianness" nesse valor, já que não há byte mais ou menos significativo. Não altere a ordem dos bytes.
- Use o S de 2 bytes como o salt.
- Nos dados da conta do Pareamento rápido anunciados, inclua o filtro gerado no campo Filtro de chave da conta e S no campo Salt.