Características

Serviço de Pareamento Rápido

O provedor do Pareamento Rápido precisa ter o seguinte serviço GATT.

Serviço UUID
Serviço de Pareamento Rápido 0xFE2C

Esse serviço precisa ter as seguintes características:

Característica do serviço de Pareamento Rápido Criptografado Permissões UUID
ID do modelo Não Ler FE2C1233-8366-4814-8EB0-01DE32100BEA
Pareamento com base em chaves Não Escrever e notificar FE2C1234-8366-4814-8EB0-01DE32100BEA
Chave de acesso Não Escrever e notificar FE2C1235-8366-4814-8EB0-01DE32100BEA
Chave da conta Não Gravação FE2C1236-8366-4814-8EB0-01DE32100BEA

Serviço de informações do dispositivo

O provedor de Pareamento rápido também precisa ser compatível com o serviço de informações do dispositivo.

Serviço UUID
Serviço de informações do dispositivo 0x180A

O Fast Pair Seeker usa as seguintes características.

Nome Criptografado Permissões UUID
Revisão do firmware Não Ler 0x2A26

Característica: ID do modelo

Essa característica permite que o Seeker leia o ID do modelo conforme necessário, fora do período em que o dispositivo está anunciando no modo detectável. Ele sempre vai retornar os seguintes dados:

Octet Tipo de dado Descrição Valor
0 a 2 uint24 ID do modelo varia

Característica: pareamento baseado em chave

Essa característica controla o procedimento de pareamento baseado em chaves. Neste procedimento, um determinado nível de confiança é estabelecido ao verificar se o solicitante e o provedor têm uma chave pré-compartilhada. A chave é diferente em cada caso:

  • Caso 1: a chave pré-compartilhada é baseada no par de chaves pública/privada antispam e no par de chaves pública/privada do próprio Seeker, que muda a cada tentativa de pareamento.

    • O provedor está no modo de pareamento.
    • O Seeker verifica se o provedor tem a chave privada antifalsificação.

    No modo de pareamento, o provedor também pode fazer o pareamento da maneira usual, por exemplo, com um dispositivo que não oferece suporte ao pareamento baseado em chaves do Pareamento Rápido.

  • Caso 2: a chave pré-compartilhada é uma das chaves da conta.

    • O provedor geralmente não está no modo de pareamento. No entanto, isso não é um requisito. O provedor precisa oferecer suporte ao uso de uma chave de conta mesmo no modo de pareamento.
    • O requerente e o provedor verificam se o outro está na posse da chave da conta.

Como os dois casos são extremamente semelhantes, exceto pela chave pré-compartilhada usada, eles são combinados no procedimento.

Formato de dados

Consulte o procedimento para saber como cada formato é usado.

Octet Tipo de dado Descrição Valor Obrigatório?
0 a 15 uint128 Solicitação criptografada varia Obrigatório
16 a 79 Chave pública varia Opcional

Tabela 1.1:solicitação criptografada, gravada na característica pelo Seeker.

Octet Tipo de dado Descrição Valor Obrigatório?
0 uint8 Tipo de mensagem 0x00 = Solicitação de pareamento com base em chave Obrigatório
1 uint8 Flags
  • Bit 0 (MSB): descontinuado e ignorado pelo Seeker.
  • Bit 1: 1 se o Seeker solicitar que o Provider inicie a vinculação, e essa solicitação contiver o endereço BR/EDR do Seeker. Caso contrário, 0.
  • Bit 2: 1 se o Seeker solicitar que o Provider notifique o nome atual. Caso contrário, 0.
  • Bit 3: 1 se for para gravar a chave da conta retroativamente. Caso contrário, 0.
  • Os bits 4 a 7 são reservados para uso futuro e devem ser ignorados.
varies Obrigatório
2 a 7 uint48 Uma das seguintes opções:
  • Endereço BLE atual do provedor
  • Endereço público do provedor
varies Obrigatório
8 a 13 uint48 Endereço de BR/EDR do requerente varies Presente apenas se o bit 1 ou 3 das flags estiver definido
n - 15 Valor aleatório (salt) varies Obrigatório

Tabela 1.2.1:solicitação bruta (tipo 0x00). Descriptografado da solicitação criptografada na Tabela 1.1.

Octet Tipo de dado Descrição Valor Obrigatório?
0 uint8 Tipo de mensagem 0x10 = solicitação de ação Obrigatório
1 uint8 Flags varies Obrigatório
2 a 7 uint48 Uma das seguintes opções:
  • Endereço BLE atual do provedor
  • Endereço público do provedor
varies Obrigatório
8 uint8 Grupo de mensagens varies Obrigatório se o bit 0 das flags estiver definido
9 uint8 Código da mensagem varies Obrigatório se o bit 0 das flags estiver definido
10 uint8 Depende de flags:
  • Bit 0 definido: comprimento de dados adicionais, menos de 6
  • Bit 1 definido: ID de dados
varies Obrigatório se o bit 0 ou 1 das flags estiver definido
11 - n Outros dados varies Opcional
n - 15 Valor aleatório (salt) varies Obrigatório

Tabela 1.2.2:solicitação bruta (tipo 0x10). Descriptografado da solicitação criptografada na Tabela 1.1.

Octet Tipo de dado Descrição Valor
0 uint8 Tipo de mensagem 0x01 = Resposta de pareamento com base em chave
1 a 6 uint48 Endereço público do provedor (BR/EDR) varies
7 a 15 Valor aleatório (salt) varies

Tabela 1.3:resposta bruta. Criptografado para produzir a resposta criptografada na Tabela 1.4.

Octet Tipo de dado Descrição Valor
0 a 15 uint128 Resposta criptografada varies

Tabela 1.4:resposta criptografada, enviada pelo provedor ao solicitante por uma notificação.

Característica: chave de acesso

Essa característica é usada durante o procedimento de pareamento baseado em chave (em inglês).

Octet Tipo de dado Descrição Valor
0 a 15 uint128 Bloco de chave de acesso criptografada varies

Tabela 2.1:bloco de chaves de acesso criptografadas. Consulte o procedimento de pareamento baseado em chaves para uso.

Octet Tipo de dado Descrição Valor
0 uint8 Tipo de mensagem Uma destas opções:
  • 0x02 = chave de acesso do buscador
  • 0x03 = chave de acesso do provedor
1 a 3 unit32 Chave de acesso de seis dígitos varies
4 a 15 Valor aleatório (salt) varies

Tabela 2.2:bloco de chaves de acesso bruto. Versão descriptografada da Tabela 2.1.

Característica: chave da conta

Depois do pareamento rápido, o Fast Pair Seeker vai gravar uma chave de conta no Fast Pair Provider.

Octet Tipo de dado Descrição Valor
0 a 15 uint128 Chave da conta (criptografada) varies

Ao receber uma solicitação de gravação, o provedor de pareamento rápido precisa fazer o seguinte:

  1. Descriptografe a chave da conta usando a senha secreta compartilhada gerada na etapa 4 do procedimento.
    • Para provedores que exigem vinculação (comum):
      • Antes de descriptografar, verifique se a senha secreta foi usada para descriptografar a solicitação de chave de acesso da etapa 12. Se essa etapa não tiver sido concluída usando esse segredo, ignore essa gravação e saia.
    • Neste ponto, a senha secreta (K no procedimento) não será usada novamente para esse pareamento. Todas as solicitações criptografadas com essa chave sem reiniciar o procedimento precisam ser rejeitadas.
  2. Verifique se o valor descriptografado começa com 0x04 ou 0xFF. Se não for, ignore esta gravação e saia.
    • Se o valor for 0x04:
      • Verifique se a lista de chaves da conta persistente tem espaço para o novo valor.
      • Caso contrário, exclua o valor menos usado recentemente da lista.
      • Adicione o novo valor à lista.
    • Se o valor for 0xFF:
      • Trate isso como uma sessão de pareamento temporária e não realize nenhuma operação.
      • Isso pode acontecer com o fluxo Gravar chave da conta de forma retroativa.
      • Não armazene nem use a chave na lista de chaves da conta, na criptografia ou nos cálculos de MAC.
      • A remoção da vinculação é acionada por um evento ou tempo limite específico do recurso. Para o Compartilhamento de áudio LE, é altamente recomendável remover a vinculação BLE e a chave de link 10 minutos após a desconexão da sessão temporária.

As chaves de conta na lista são usadas durante o pareamento baseado em chaves.

Característica: revisão de firmware

Essa característica permite que o Seeker leia a revisão de firmware do Provider conforme necessário. Ele sempre vai retornar os seguintes dados:

Octet Tipo de dado Descrição Valor
0 - var utf8s Código de revisão do firmware varies

Ele precisa ser encapsulado em uma única string utf8, mesmo que haja mais de um firmware (por exemplo, três firmwares para o fone esquerdo, o direito e o estojo) no provedor. O provedor também pode retornar as strings específicas para casos especiais:

  1. status-updating: se o provedor estiver atualizando para um novo firmware. Como alternativa, o provedor pode retornar a versão do firmware em staging.

  2. status-abnormal: se o provedor estiver em um estado anormal. Por exemplo, ele apresentou falha porque a atualização de firmware não foi concluída. Esse valor fará com que o Seeker mostre uma mensagem informando ao usuário que ele precisa ser atualizado agora.

O provedor precisa limitar o acesso à característica "Revisão de firmware" para evitar o rastreamento do dispositivo. Restrições sugeridas:

  • dispositivos pareados devem ter acesso a qualquer momento
  • qualquer dispositivo deve ter acesso quando o provedor é detectável

Característica: dados adicionais

Esse serviço precisa ter a seguinte característica.

Característica do serviço de Pareamento Rápido Criptografado Permissões UUID
Dados Não Escrever e notificar FE2C1237-8366-4814-8EB0-01DE32100BEA
Característica do serviço de pareamento rápido antigo (a ser descontinuada em 01/01/2021) Criptografado Permissões UUID
Dados Não Escrever e notificar 0x1237

Antes de gravar ou notificar essa característica, é necessário fazer um handshake pela característica FE2C1234-8366-4814-8EB0-01DE32100BEA para ter uma chave secreta compartilhada. O AES-CTR será usado para criptografar os dados que fluem por essa característica. O algoritmo é definido abaixo. Esse modo é mais seguro para dados que se estendem além de um único bloco de 16 bytes. O HMAC-SHA256 será usado para garantir a integridade de dados, que também é definida abaixo.

Octet Descrição Valor
0 - 7 Os primeiros 8 bytes do HMAC-SHA256. varies
8 a 15 Nonce, usado pela criptografia AES-CTR. varies
16 - var Dados criptografados. varies

Tabela 3.1:pacote de dados enviado pelo provedor ao solicitante por uma notificação ou enviado pelo solicitante ao provedor por uma gravação.

Octet Tipo de dado Descrição Valor
0 - var byte array Dados varia, decodifique de acordo com o ID de dados da Tabela 1.2.2:
  • 0x01(nome personalizado): utf8s

Tabela 3.2:dados brutos. Descriptografado dos dados criptografados na Tabela 3.1.

Quando uma notificação é solicitada (por exemplo, solicite um nome personalizado usando o bit 2 na Tabela 1.2.1), o provedor do pareamento rápido precisa fazer o seguinte:

  1. Gere 8 bytes criptograficamente aleatórios para o valor de uso único.
  2. Criptografe os dados usando AES-CTR, em que cada bloco de 16 bytes é gerado usando

    encryptedBlock[i] = clearBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))
    

    onde

    1. A chave AES é a senha secreta da etapa 4 do procedimento.
    2. clearBlock[i] é um bloco de 16 bytes que começa em data[i * 16]. O último bloco pode ter menos de 16 bytes.
  3. Execute concat(encryptedBlock[0], encryptedBlock[1],...) para criar os dados criptografados.

  4. Gere HMAC-SHA256 por

    sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, encrypted_data)))))
    

    onde

    1. K é gerado por concat(shared_secret, 48-byte ZEROs), e o shared_secret é da etapa 4 no procedimento.
    2. opad é um padding externo de 64 bytes, consistindo em bytes repetidos com valor 0x5C.
    3. O ipad tem padding interno de 64 bytes, consistindo em bytes repetidos com valor 0x36.
  5. Pegue os primeiros 8 bytes do HMAC-SHA256 como o prefixo do pacote de dados.

Ao receber uma solicitação de gravação, o provedor de pareamento rápido precisa fazer o seguinte:

  1. Verifique a integridade dos dados conferindo os primeiros 8 bytes de HMAC-SHA256.
  2. Descriptografe os dados criptografados usando AES-CTR, em que cada bloco é gerado usando

    clearBlock[i] = encryptedBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))
    

    onde

    1. encryptedBlock[i] é um bloco de 16 bytes que começa em encrypted_data[i * 16]. O último bloco pode ter menos de 16 bytes.
    2. A chave AES é gerada ou identificada no handshake, por exemplo,
      1. No fluxo de nomenclatura 1, ele é do ECDH e não será usado novamente para esse pareamento. Todas as solicitações criptografadas com essa chave sem reiniciar o procedimento devem ser rejeitadas.
      2. No fluxo de nomenclatura 2, é a chave da conta.
  3. Execute concat(clearBlock[0], clearBlock[1],...) para criar os dados brutos.