Indicador de publicidade do provedor

Publicidade: quando detectável

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

Intervalo de publicidade: quando detectável

O intervalo entre anúncios não deve ser maior do que 100 ms (10 Hz). Um a taxa rápida permite que o buscador encontre rapidamente o provedor, mesmo ao digitalizar modo de baixo consumo de energia.

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

O anúncio deverá conter o tipo de dados de Dados de Serviços, ibid., § 1.11. A UUID será o UUID do serviço de Pareamento rápido de 0xFE2C. Os dados de serviço devem contêm o seguinte:

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

Publicidade: quando não for detectável

Quando não detectável (ou seja, não no modo de pareamento), o dispositivo do Provedor deve anunciar dados da conta com Pareamento rápido de acordo com as diretrizes a seguir.

Com a divulgação dos dados da conta, os usuários que estão por perto podem reconhecer quando um provedor pertence à conta dele e iniciar o pareamento sem ter que forçar o provedor de volta ao modo de pareamento, o que é comum para que o usuário reclamação. Quem procura oferecer a oportunidade de ignorar essa transmissão no caso em que não espera para parear com o provedor ou a transmissão não será relevante (por exemplo, se eles já tiverem pareado). Os buscadores também filtram automaticamente transmissões ruins, como quando os dados da conta estão configurados incorretamente.

Intervalo de publicidade: quando não detectável

O intervalo entre publicidades deve ser de no máximo 250 ms (4 Hz).

Payload de publicidade: Pareamento rápido de dados da conta

O anúncio deverá conter o tipo de dados de Dados de Serviços, Ibid., § 1.11. A UUID será o UUID do serviço de Pareamento rápido de 0xFE2C. Os dados de serviço devem contêm o seguinte:

Octeto Tipo de dado Descrição Valor
0 uint8 Versão e sinalizações
0bVVVVFFFF
  • V = versão
  • F = sinalizações
0x00
(reservada 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 dado Descrição Valor
0 uint8 Comprimento e tipo do campo
0bLLLLTTTT
  • L = comprimento do filtro de chave de conta em bytes
  • T = tipo
0bLLLL0000
  • comprimento = 0bLLLL = varia
  • type = 0b0000 (mostrar indicação da interface) ou 0b0010 (ocultar indicação de interface), filtro de chave da conta
1 – s Filtro de chave da conta varia
s + 1 uint8 Comprimento e tipo do campo
0bLLLLTTTT
  • L = comprimento em bytes
  • T = tipo
0b00100001
  • length = 0b0010 = 2
  • tipo = 0b0001, Salt
s + 2 - s + 3 uint16 Salt varia

Filtro de chave da conta

O Filtro de chave de conta anunciado permite que um usuário verifique rapidamente se uma O provedor pode ter determinada chave de conta (com um índice baixo de falso positivo probabilidade, em média muito menos do que 0,5%), antes de outras interações. A O usuário poderá se conectar e tentar iniciar o procedimento automaticamente se encontrar um filtro sendo transmitido com o tipo 0, ou seja, mostrando uma indicação da interface, contém uma das chaves de conta dele, de modo a reduzir a taxa de false gera mais positivos. Em algumas situações, o Provedor pode querer ser reconhecido pelo buscador enquanto não estiver pronto para o pareamento. Por exemplo, quando os fones de ouvido são colocados de novo, queremos parar de mostrar a notificação de pareamento subsequente já que o pareamento pode ser rejeitado pelo fone de ouvido.

O filtro da chave de conta é um filtro de tamanho variável Filtro Bloom criado como da seguinte forma:

  1. Permita que n seja o número de chaves da conta (n >= 1) no Lista de chaves da conta.
  2. Permita que s, o tamanho do filtro em bytes, seja (1,2*n + 3) truncado. Para 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 bytes s, 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, 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. Hash V usando SHA256, conseguindo 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 de 4 bytes não assinados 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 o número de bits no filtro, (s * 8).
    ii. Consiga 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 no campo "Filtro da chave da conta" nos dados de publicidade. Observe que não há "endianness", para esse valor, já que não há mais nem menos byte significativo) não altere a ordem dos bytes.

Campo de sal

O sal é um valor aleatório que é anexado às chaves de conta ao criar o filtro de flores. Esse sal precisa ser gerado novamente toda vez que o RPA for atualizado para o provedor para evitar o rastreamento durante a 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", para esta valor, já que não há mais ou menos byte significativo. Não altere o byte ordem.
  2. Use o S de 2 bytes como o sal.
  3. Nos dados da conta de Pareamento rápido anunciados, inclua o filtro gerado na campo "Filtro da chave da conta" e S no campo "Sal".