Indicador de publicidade do provedor

Publicidade: quando detectável

Quando o dispositivo do provedor for detectável por BR/EDR (ou seja, no modo de pareamento), ele vai anunciar dados de ID do modelo de pareamento rápido por BLE, e o endereço BLE não poderá ser alternado.

Intervalo de publicidade: quando detectável

O intervalo entre os anúncios não pode ser maior do que 100 ms (10 Hz). Uma taxa rápida permite que o usuário encontre rapidamente o provedor, mesmo durante a busca no modo de baixo consumo de energia.

Payload de publicidade: dados de ID do modelo de pareamento rápido

O anúncio precisa conter o tipo de dados dos dados do serviço, ibid. § 1.11. O UUID será o UUID do Serviço de Pareamento rápido de 0xFE2C. Os dados de serviço precisam conter o seguinte:

Octeto Tipo de dados Descrição Valor
0-2 uint24 ID do modelo de 24 bits varia

Publicidade: quando não detectável

Quando não detectável (ou seja, fora do modo de pareamento), o dispositivo do provedor anuncia os dados da conta de Pareamento rápido, usando as diretrizes a seguir.

A divulgação dos dados da conta permite que os usuários por perto reconheçam quando um provedor pertence à conta e iniciem o pareamento sem ter que forçar o provedor a voltar ao modo de pareamento, o que é uma causa comum para reclamações dos usuários. Os usuários vão poder ignorar essa transmissão quando não esperarem para parear com o provedor ou a transmissão não for relevante (por exemplo, se já tiver sido pareada). Os usuários também filtram transmissões obviamente ruins de forma automática, por exemplo, quando os dados da conta estão configurados incorretamente.

Intervalo de publicidade: 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 dos dados do serviço, Ibid. § 1.11. O UUID será o UUID do Serviço de Pareamento rápido de 0xFE2C. Os dados de serviço precisam conter o seguinte:

Octeto Tipo de dados Descrição Valor
0 uint8 Versão e sinalizações
0bVVVVFFFF
  • V = versão
  • F = sinalizações
0x00
(reservado para uso futuro)
1 - varia Dados da chave da conta varia
ou 0x00 se a lista de chaves da conta estiver vazia

Os dados da chave da conta contêm:

Octeto Tipo de dados Descrição Valor
0 uint8 Comprimento e tipo de campo
0bLLLLTTTT
  • L = comprimento do filtro da chave da conta em bytes
  • T = tipo
0bLLLL0000
  • comprimento = 0bLLLL = varia
  • type = 0b0000 (mostrar indicação da IU) ou 0b0010 (ocultar indicação da IU), filtro da chave da conta
1 - s Filtro de chave da conta varia
s + 1 uint8 Comprimento e tipo de campo
0bLLLLTTTT
  • L = comprimento em bytes
  • T = tipo
0b00100001
  • comprimento = 0b0010 = 2
  • tipo = 0b0001, Sal
s + 2 - s + 3 uint16 Salt varia

Filtro de chave da conta

O filtro de chave de conta anunciada permite que um usuário confira rapidamente se um provedor tem uma determinada chave de conta (com uma baixa probabilidade de falsos positivos, em média, muito menos de 0,5%), antes de outras interações. O Buscador pode se conectar automaticamente e tentar iniciar o procedimento ao detectar um filtro sendo transmitido com o tipo 0, ou seja, mostrando a indicação da IU, que possivelmente contém uma das chaves de conta, para reduzir ainda mais a taxa de falsos positivos. Em algumas situações, o provedor pode querer ser reconhecido pela busca enquanto não está pronto para o pareamento. Por exemplo, quando os fones 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 da conta é um filtro de Bloom de tamanho variável criado da seguinte maneira:

  1. Deixe n ser o número de chaves de conta (n >= 1) na lista de chaves de conta mantida.
  2. Permita que s, o tamanho do filtro em bytes, seja truncado (1,2*n + 3). Por exemplo, se uma chave for mantida, s = 4 bytes.
    uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3);
  3. Inicialize o filtro F como uma matriz de s bytes, cada um definido como 0.
    uint8_t F[s] = {0};
  4. Para cada chave de conta K na lista de chaves de conta mantida:
    a. Permita que V seja 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. Faça o hash de V usando SHA256, recebendo 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 assinatura 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. Permita que M seja Xi módulo do número de bits no filtro, (s * 8).
    ii. Receba o byte em F no índice (M / 8), arredondado para baixo.
    iii. Dentro do 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. Observe que não há "endianness" nesse 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 da conta ao criar o filtro de flor. Esse sal precisa ser gerado novamente sempre que o RPA é atualizado para o provedor para evitar o rastreamento na rotação de endereços.

Para gerar o filtro de chave da conta usando o sal:

  1. Gere um S aleatório de 2 bytes. Observe que não há "endianness" nesse valor, já que não há byte mais ou menos significativo. Não altere a ordem dos bytes.
  2. Use o S de 2 bytes como o sal.
  3. Nos dados da conta de Pareamento rápido anunciados, inclua o filtro gerado no campo "Filtro de chave da conta" e S no campo "Sal".