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
- C1: se o provedor for compatível com o recurso de nomenclatura e não implementar a característica Ação do dispositivo de Pareamento rápido.
- C2: se o provedor for compatível com o fluxo de mensagens: L2CAP
- C3: se o Provedor tiver um canal de comunicação interno entre os componentes
- C4: se o Provedor precisar trocar mais informações durante o processo de pareamento, por exemplo, um Provedor sem um canal de comunicação interna entre componentes.
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
|
varia | Obrigatório |
| 2 - 7 | uint48 |
Você pode:
|
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:
|
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:
|
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
|
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 |
|
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:
|
| 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:
- 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.
- Para provedores que exigem fiança (comum):
- Verifique se o valor descriptografado começa com
0x04ou0xFF. 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.
- Se o valor for
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:
|
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:
- Gere 8 bytes criptograficamente aleatórios para o valor de uso único.
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
- A chave AES é o secret compartilhado da etapa 4 do procedimento.
- clearBlock[i] é um bloco de 16 bytes que começa em data[i * 16]. O último bloco pode ter menos de 16 bytes.
Execute concat(encryptedBlock[0], encryptedBlock[1],...) para criar os dados criptografados.
Gere HMAC-SHA256
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, encrypted_data)))))onde
- K é gerado por concat(shared_secret, ZEROs de 48 bytes), o shared_secret é da etapa 4 no procedimento.
- opad é um preenchimento externo de 64 bytes, que consiste em bytes repetidos com valor
0x5C. - ipad é um preenchimento interno de 64 bytes, que consiste em bytes repetidos com valor
0x36.
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:
- Verifique a integridade dos dados conferindo os primeiros 8 bytes do HMAC-SHA256.
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
- encryptedBlock[i] é um bloco de 16 bytes que começa em encrypted_data[i * 16]. O último bloco pode ter menos de 16 bytes.
- A chave AES é gerada ou identificada pelo handshake, por exemplo,
- 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.
- No fluxo de nomenclatura 2, é a chave da conta.
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:
|
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:
|
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 |
|
| 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 |
|
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
- Buscador: ativar a notificação GATT
- Provedor: notificação GATT registrada
- Buscador: solicitação de gravação GATT, os dados brutos contêm apenas
Action ID - Provedor: resposta de gravação GATT
- Provedor: GATT Notify, os dados brutos contêm
- ID da ação
- Dados do ID da ação
- Buscador: notificação GATT recebida
- Gravação do Pareamento rápido: gravar dados no provedor
- Buscador: solicitação de gravação GATT, os dados brutos contêm
- ID da ação
- Dados do ID da ação
- Provedor: resposta de gravação do GATT
- Buscador: solicitação de gravação GATT, os dados brutos contêm
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
- 0x01 (nome personalizado)
- Para qualquer outro comando em que uma solicitação de gravação tenha um ID de ação seguido por dados, o Provedor vai responder com uma notificação do GATT contendo Solicitação Inválida (0x81), conforme descrito na Tabela 4.3.
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:
- Gere 8 bytes criptograficamente aleatórios para o valor de uso único.
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
- A chave AES é o secret compartilhado da etapa 4 do procedimento.
clearBlock[i]é um bloco de 16 bytes que começa emdata[i * 16]. O último bloco pode ter menos de 16 bytes.
Execute
concat(encryptedBlock[0], encryptedBlock[1],...)para criar os dados criptografados.Gere HMAC-SHA256
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, encrypted_data)))))onde
- K é gerado por concat(shared_secret, ZEROs de 48 bytes), o shared_secret é da etapa 4 no procedimento.
- opad é um preenchimento externo de 64 bytes, que consiste em bytes repetidos com valor
0x5C. - ipad é um preenchimento interno de 64 bytes, que consiste em bytes repetidos com valor
0x36.
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:
- Verifique a integridade dos dados conferindo os primeiros 8 bytes do HMAC-SHA256.
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
encryptedBlock[i]é um bloco de 16 bytes que começa emencrypted_data[i * 16]. O último bloco pode ter menos de 16 bytes.- A chave AES é gerada ou identificada no handshake, por exemplo:
- 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.
- No fluxo de nomenclatura 2, é a chave da conta.
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:
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.
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.