Serviço de Pareamento Rápido

O provedor de Pareamento rápido precisa implementar o serviço de Pareamento rápido (UUID 0xFE2C), que contém as características a seguir.

Nome Criptografado Permissões UUID Obrigatório?
ID do modelo Não Ler FE2C1233-8366-4814-8EB0-01DE32100BEA Obrigatório
Pareamento baseado em chave Não Escrever e notificar FE2C1234-8366-4814-8EB0-01DE32100BEA Obrigatório
Chave de acesso Não Escrever e notificar FE2C1235-8366-4814-8EB0-01DE32100BEA Obrigatório
Chave da conta Não Gravação FE2C1236-8366-4814-8EB0-01DE32100BEA Obrigatório
Dados adicionais Não Escrever e notificar FE2C1237-8366-4814-8EB0-01DE32100BEA *C1
PSM do fluxo de mensagens Sim Ler FE2C1239-8366-4814-8EB0-01DE32100BEA *C2
Chave de acesso adicional Não Ler, gravar e notificar FE2C123A-8366-4814-8EB0-01DE32100BEA *C3
Ação no dispositivo FP Não Escrever e notificar FE2C123B-8366-4814-8EB0-01DE32100BEA *C4

Obrigatório sob certas condições

Característica: ID do modelo

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

Octeto 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 chave. Nesse procedimento, um certo nível de confiança é estabelecido ao verificar se o Buscador 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 anti-spoofing e no par de chaves pública/privada do buscador, que muda a cada tentativa de pareamento.

    • O provedor está no modo de pareamento.
    • O Buscador verifica se o Provedor está em posse da chave privada anti-spoofing.

    No modo de pareamento, o Provedor também pode fazer o pareamento da maneira usual, por exemplo, com um dispositivo que não é compatível com o pareamento baseado em chave do Pareamento rápido.

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

    • O provedor geralmente não está no modo de pareamento. No entanto, isso não é um requisito. O Provedor precisa aceitar o uso de uma chave de conta mesmo no modo de pareamento.
    • O buscador e o provedor verificam se o outro tem a 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.

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

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

Octeto 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 Sinalizações
  • Bit 0 (MSB): descontinuado e ignorado pelo Seeker.
  • Bit 1: 1 se o Buscador solicitar que o Provedor inicie a vinculação e essa solicitação contiver o endereço BR/EDR do Buscador. Caso contrário, 0.
  • Bit 2: 1 se o Buscador solicitar que o Provedor notifique o nome atual. Caso contrário, 0.
  • Bit 3: 1 se for para gravar retroativamente a chave da conta. Caso contrário, 0.
  • Bit 4: 1 se o Buscador for compatível com o dispositivo BLE. Caso contrário, 0.
  • Bit 5: 1 se o Buscador for compatível com LE Audio. Caso contrário, 0.
  • Os bits 6 e 7 são reservados para uso futuro e devem ser ignorados.
varia Obrigatório
2 - 7 uint48 Você pode:
  • Endereço BLE atual do provedor
  • Endereço de identidade do provedor
varia Obrigatório
8 - 13 uint48 Endereço BR/EDR do buscador varia Presente apenas se o bit 1 ou 3 das flags estiver definido.
n - 15 Valor aleatório (salt) varia Obrigatório

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

Octeto Tipo de dado Descrição Valor Obrigatório?
0 uint8 Tipo de mensagem 0x10 = Solicitação de ação Obrigatório
1 uint8 Sinalizações varia Obrigatório
2 - 7 uint48 Você pode:
  • Endereço BLE atual do provedor
  • Endereço de identidade do provedor
varia Obrigatório
8 uint8 Grupo de mensagens varia Obrigatório se o bit 0 das flags estiver definido
9 uint8 Código da mensagem varia Obrigatório se o bit 0 das flags estiver definido
10 uint8 Depende das flags:
  • O bit 0 está definido: tamanho dos dados adicionais, menor que 6
  • O bit 1 está definido: ID de dados
varia Obrigatório se o bit 0 ou 1 das flags estiver definido
11 - n Outros dados varia Opcional
n - 15 Valor aleatório (salt) varia Obrigatório

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

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

Tabela 1.3: resposta bruta (tipo 0x01). criptografada para produzir a resposta criptografada na Tabela 1.4.

Octeto Tipo de dado Descrição Valor
0 uint8 Tipo de mensagem 0x02 = Key-based Pairing Extended Response
1 uint8 Sinalizações
  • Bit 0 (MSB): 1 se o Provedor for um dispositivo somente LE, 0 caso contrário. Se o bit 0 estiver definido como 1, o Buscador vai presumir que o bit 1 está definido como 1.
  • Bit 1: 1 se o Provedor preferir a vinculação LE, 0 caso contrário.
  • Bit 2: 1 se o tipo do segundo endereço for aleatório, 0 se for público.
  • Os bits 3 a 7 são reservados para uso futuro e serão ignorados.
varia
2 uint8 Número de endereços do provedor
Os valores válidos são 1 e 2.
varia
3 a 8 ou
3 a 14
  • O primeiro endereço será o endereço de identidade do dispositivo principal e poderá ser vinculado se a vinculação BR/EDR for preferencial.
  • O segundo endereço será o endereço vinculável do secundário, se ele estiver disponível.
varia
9 - 15 ou 15 Valor aleatório (salt) varia

Tabela 1.3.2: resposta bruta (tipo 0x02). criptografada para produzir a resposta criptografada na Tabela 1.4.

Octeto Tipo de dado Descrição Valor
0 a 15 uint128 Resposta criptografada varia

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

Característica: chave de acesso

Essa característica é usada durante o procedimento de pareamento baseado em chave.

Octeto Tipo de dado Descrição Valor
0 a 15 uint128 Bloco de chave de acesso criptografado varia

Tabela 2.1: bloco de chave de acesso criptografado. Consulte o procedimento de pareamento baseado em chave para uso.

Octeto Tipo de dado Descrição Valor
0 uint8 Tipo de mensagem Uma destas:
  • 0x02 = Chave de acesso do buscador
  • 0x03 = chave de acesso do provedor
1 - 3 unit32 Chave de acesso de 6 dígitos varia
4 a 15 Valor aleatório (salt) varia

Tabela 2.2: bloco de chave de acesso bruta. Versão descriptografada da Tabela 2.1.

Característica: chave da conta

Após o pareamento, o buscador do Pareamento rápido vai gravar uma chave de conta no provedor do Pareamento rápido.

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

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 chave secreta compartilhada gerada na etapa 4 do procedimento.
    • Para provedores que exigem fiança (comum):
      • Antes de descriptografar, verifique se o secret compartilhado foi usado para descriptografar a solicitação de chave de acesso da etapa 12. Se essa etapa não tiver sido aprovada usando esse secret, ignore essa gravação e saia.
    • Nesse ponto, o secret compartilhado (K no procedimento) não será usado 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, ignore essa gravação e saia.
    • Se o valor for 0x04:
      • Verifique se a lista de chaves de conta persistente tem espaço para o novo valor.
      • Se não, exclua da lista o valor menos usado recentemente.
      • 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 de conta retroativamente.
      • Não armazene a chave nem a use na lista de chaves de conta, criptografia ou cálculos de MAC.
      • A remoção do vínculo é acionada por um evento ou tempo limite específico do recurso. Para o compartilhamento de áudio LE, é altamente recomendável remover a chave de vínculo e link BLE 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 chave.

Característica: dados adicionais

Este serviço terá as seguintes características.

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 antiga do serviço de Pareamento rápido (descontinuação prevista para 01/01/2021) Criptografado Permissões UUID
Dados Não Escrever e notificar 0x1237

Antes de gravar ou notificar essa característica, é necessário que haja um handshake pela característica FE2C1234-8366-4814-8EB0-01DE32100BEA para ter um secret compartilhado. O AES-CTR será usado para criptografar os dados que fluem por essa característica, cujo 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.

Octeto Descrição Valor
0 - 7 Os primeiros 8 bytes de HMAC-SHA256. varia
8 - 15 Nonce, usado pela criptografia AES-CTR. varia
16 - var Dados criptografados. varia

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

Octeto Tipo de dado Descrição Valor
0 - var byte array Dados varia, decodifique-o 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, solicitação de nome personalizado pelo bit 2 na Tabela 1.2.1), o provedor de 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 é o secret compartilhado 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

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

    onde

    1. K é gerado por concat(shared_secret, ZEROs de 48 bytes), o shared_secret é da etapa 4 no procedimento.
    2. opad é um preenchimento externo de 64 bytes, que consiste em bytes repetidos com valor 0x5C.
    3. ipad é um preenchimento interno de 64 bytes, que consiste 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 do 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 pelo handshake, por exemplo,
      1. No fluxo de nomenclatura 1, ela é do ECDH e não será usada novamente para esse pareamento. Todas as solicitações criptografadas com essa chave sem reiniciar o procedimento precisam ser rejeitadas.
      2. No fluxo de nomenclatura 2, é a chave da conta.
  3. Execute concat(clearBlock[0], clearBlock[1],...) para criar os dados brutos.

Característica: PSM do fluxo de mensagens

Consulte Dispositivo BLE: PSM do fluxo de mensagens.

Característica: chave de acesso adicional

Consulte Dispositivo BLE: chave de acesso adicional.

Característica: ação do dispositivo FP

Característica do serviço de Pareamento Rápido Criptografado Permissões UUID
Ação do dispositivo FP Não Escrever e notificar FE2C123B-8366-4814-8EB0-01DE32100BEA

Octeto Descrição Valor
0 - 7 Os primeiros 8 bytes de HMAC-SHA256. varia
8 - 15 Nonce, usado pela criptografia AES-CTR. varia
16 - var Dados criptografados. varia

Tabela 4.1: pacote de dados, enviado pelo provedor ao buscador como uma notificação ou pelo buscador ao provedor como uma gravação.

Octeto Tipo de dado Descrição Valor
0 - var byte array Solicitação de ação Uma destas:
  • Ler nome personalizado, 0x01
  • Nome personalizado de gravação, consulte a Tabela 4.3.1
  • Ler informações do conjunto coordenado, 0x02
  • Ler recursos do dispositivo, 0x03

Tabela 4.2: dados brutos. Descriptografado dos dados criptografados na Tabela 4.1 enviada pelo Buscador ao Provedor como uma gravação.

Octeto Tipo de dado Descrição Valor
0 - var byte array Resposta da ação Uma destas:
  • Nome personalizado, consulte a Tabela 4.3.1
  • Informações do conjunto coordenado, consulte a Tabela 4.3.2
  • Recursos do dispositivo, consulte a Tabela 4.3.3
  • Código do erro
    • 0x80 (solicitação não compatível)
    • 0x81 (solicitação inválida)

Tabela 4.3: dados brutos. Descriptografado dos dados criptografados na Tabela 4.1 enviada pelo Provedor ao Buscador como uma notificação.

Octeto Tipo de dado Descrição Valor
0 uint8 ID da ação 0x01
1 - var utf8s Nome personalizado varia

Tabela 4.3.1: formato de nome personalizado

Octeto Tipo de dado Descrição Valor
0 uint8 ID da ação 0x02
1 uint8 Tipo de membro do conjunto coordenado de Pareamento Rápido
  • 0x00: componente esquerdo
  • 0x01: componente direito
2 uint8 Tamanho do conjunto coordenado contagem de componentes
3 uint8 Definir o tipo de chave de resolução de identidade 0x01 (SIRK de texto simples)
4 a 19 uint128 Definir o valor da chave de resolução de identidade Dados de 16 bytes, consulte Serviço de identificação de conjunto coordenado

Tabela 4.3.2: formato de informações do conjunto coordenado

Octeto Tipo de dado Descrição Valor
0 uint8 ID da ação 0x03
1 - 2 uint16 Recursos do dispositivo
  • Bits 0 a 15: reservados, precisam ser definidos como 0

Tabela 4.3.3: formato dos recursos do dispositivo

Operações de Pareamento Rápido

Duas operações principais são definidas para essa característica

  • Leitura de Pareamento Rápido: ler dados do Provedor
    1. Buscador: ativar a notificação GATT
    2. Provedor: notificação GATT registrada
    3. Buscador: solicitação de gravação GATT, os dados brutos contêm apenas Action ID
    4. Provedor: resposta de gravação GATT
    5. Provedor: GATT Notify, os dados brutos contêm
      • ID da ação
      • Dados do ID da ação
    6. Buscador: notificação GATT recebida
  • Gravação do Pareamento rápido: gravar dados no provedor
    1. Buscador: solicitação de gravação GATT, os dados brutos contêm
      • ID da ação
      • Dados do ID da ação
    2. Provedor: resposta de gravação do GATT

ID da ação de leitura de suporte do Pareamento Rápido

  • 0x01 (nome personalizado)
  • 0x02 (informações do conjunto coordenado)
  • 0x03 (recursos do dispositivo)

ID da ação de gravação com suporte do Pareamento Rápido

Se o Provedor não entender um ID da ação, ele vai responder com uma notificação GATT contendo Solicitação sem suporte (0x80), conforme descrito na Tabela 4.3.

Algoritmo de criptografia

Quando uma notificação é solicitada, o provedor de 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 é o secret compartilhado 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

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

    onde

    1. K é gerado por concat(shared_secret, ZEROs de 48 bytes), o shared_secret é da etapa 4 no procedimento.
    2. opad é um preenchimento externo de 64 bytes, que consiste em bytes repetidos com valor 0x5C.
    3. ipad é um preenchimento interno de 64 bytes, que consiste 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 do 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, ela é do ECDH e não será usada novamente para esse pareamento. Todas as solicitações criptografadas com essa chave sem reiniciar o procedimento precisam ser rejeitadas.
      2. No fluxo de nomenclatura 2, é a chave da conta.
  3. Execute concat(clearBlock[0], clearBlock[1],...) para criar os dados brutos.

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 (UUID 0x180A). O buscador de Pareamento rápido usa as seguintes características.

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

Característica: revisão de firmware

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

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

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 fone 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 fase de teste.

  2. status-abnormal: se o provedor estiver em um estado anormal. Por exemplo, ele não funciona porque a atualização de firmware falhou. Esse valor faz com que o Seeker mostre uma mensagem para informar ao usuário que ele precisa ser atualizado agora.

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

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

Se o provedor for compatível com o Localizador, será necessária uma implementação adicional. Consulte as atualizações de firmware do Localizador para mais detalhes.