Características
Serviço de pareamento rápido
O Provedor de Pareamento rápido precisa ter o seguinte serviço GATT.
Serviço | UUID |
---|---|
Serviço de pareamento rápido | 0xFE2C |
Esse serviço terá as características a seguir.
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 baseado 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 | Gravar | FE2C1236-8366-4814-8EB0-01DE32100BEA |
Serviço de informações do dispositivo
O provedor de Pareamento rápido também precisa oferecer suporte ao Serviço de informações do dispositivo.
Serviço | UUID |
---|---|
Serviço de informações do dispositivo | 0x180A |
A busca de pareamento rápido usa as características a seguir.
Nome | Criptografado | Permissões | UUID |
---|---|---|---|
Revisão do firmware | Não | Ler | 0x2A26 |
Característica: ID do modelo
Essa característica permite que o usuário leia o ID do modelo conforme necessário, fora do momento em que o dispositivo está anunciando no modo detectável. Ela precisa sempre retornar os seguintes dados:
Octeto | Tipo de dados | Descrição | Valor |
---|---|---|---|
0 – 2 | uint24 |
ID do modelo | varia |
Característica: pareamento baseado em chaves
Essa característica controla o procedimento de pareamento baseado em chave. Neste procedimento, um certo nível de confiança é estabelecido ao verificar se o Buscador e o Provedor têm uma chave pré-compartilhada. O segredo é diferente em cada caso:
Caso 1: a chave pré-compartilhada é baseada no par de chaves pública/privada antispoofing e no próprio par de chaves pública/privada do Seeker, que será alterado a cada tentativa de pareamento.
- O provedor está no modo de pareamento.
- O Seeker verifica se o provedor tem a chave privada antispoofing.
No modo de pareamento, o provedor também pode, naturalmente, fazer o pareamento da maneira normal, por exemplo, com um dispositivo que não oferece suporte ao Pareamento rápido baseado em chaves.
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 oferecer suporte ao uso de uma chave de conta mesmo no modo de pareamento.
- Tanto o buscador quanto o provedor verificam se o outro está de posse da chave da conta.
Como os dois casos são extremamente semelhantes, exceto a chave pré-compartilhada que é usada, eles são combinados em procedimento.
Formato de dados
Consulte o procedimento para saber como cada formato é usado.
Octeto | Tipo de dados | 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 de acordo com a característica do buscador.
Octeto | Tipo de dados | Descrição | Valor | Obrigatório? |
---|---|---|---|---|
0 | uint8 |
Tipo de mensagem | 0x00 = solicitação de pareamento baseado em chaves |
Obrigatório |
1 | uint8 |
Sinalizações
|
varia | Obrigatório |
2 a 7 | uint48 |
Ter um dos seguintes:
|
varia | Obrigatório |
8 a 13 | uint48 |
Endereço BR/EDR do buscador | varia | Presente apenas se as flags 1 ou 3 estiverem definidas |
n - 15 | Valor aleatório (sal) | varia | Obrigatório |
Tabela 1.2.1:solicitação bruta (tipo 0x00). Descriptografado da solicitação criptografada na Tabela 1.1.
Octeto | Tipo de dados | 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 a 7 | uint48 |
Ter um dos seguintes:
|
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 | Dados extras | varia | Opcional | |
n - 15 | Valor aleatório (sal) | varia | Obrigatório |
Tabela 1.2.2:solicitação bruta (tipo 0x10). Descriptografado da solicitação criptografada na Tabela 1.1.
Octeto | Tipo de dados | Descrição | Valor |
---|---|---|---|
0 | uint8 |
Tipo de mensagem | 0x01 = resposta de pareamento baseada em teclas |
1 a 6 | uint48 |
Endereço público do provedor (BR/EDR) | varia |
7 a 15 | Valor aleatório (sal) | varia |
Tabela 1.3:Resposta bruta. Criptografado para produzir a Resposta criptografada na Tabela 1.4.
Octeto | Tipo de dados | 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 chaves.
Octeto | Tipo de dados | Descrição | Valor |
---|---|---|---|
0 a 15 | uint128 |
Bloco de chaves de acesso criptografado | varia |
Tabela 2.1:bloco de chave de acesso criptografada. Consulte o procedimento de pareamento baseado em chaves para conferir o uso.
Octeto | Tipo de dados | Descrição | Valor |
---|---|---|---|
0 | uint8 |
Tipo de mensagem | Um de:
|
1 a 3 | unit32 |
Chave de acesso de 6 dígitos | varia |
4 a 15 | Valor aleatório (sal) | varia |
Tabela 2.2:bloco bruto de chave de acesso. Versão descriptografada da Tabela 2.1.
Característica: chave da conta
Após o pareamento, o Buscador de pareamento rápido grava uma chave da conta no provedor de pareamento rápido.
Octeto | Tipo de dados | 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 deve fazer o seguinte:
- Descriptografe a chave da conta usando a senha secreta gerada na etapa 4 do
procedimento.
- Para provedores que exigem vinculação (comum):
- Antes de descriptografar, verifique se a chave secreta compartilhada foi usada para descriptografar a solicitação da chave de acesso da etapa 12. Se esta etapa não foi transmitida usando esse secret, ignore esta gravação e saia.
- A partir desse momento, a senha secreta (K no procedimento) não será usada novamente para este pareamento. Todas as solicitações criptografadas com essa chave sem reiniciar o procedimento serão rejeitadas.
- Para provedores que exigem vinculação (comum):
- Verifique se o valor descriptografado começa com
0x04
. Caso contrário, ignore essa gravação e saia. - Verifique se a lista de chaves da conta mantida tem espaço para o novo valor.
- Caso contrário, exclua da lista o valor usado menos recentemente.
- Adicione o novo valor à lista.
As chaves de conta na lista são usadas durante o pareamento baseado em chaves.
Característica: revisão do firmware
Essa característica permite que o Seeker leia a revisão de firmware do provedor conforme necessário. Ela deve sempre retornar os seguintes dados:
Octeto | Tipo de dados | 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 direito e o estojo) no provedor. O provedor também pode retornar as strings específicas para casos especiais:
status-refresh: se o provedor está atualizando para um novo firmware. Como alternativa, o provedor pode retornar a versão do firmware preparado.
status-abnormal: se o provedor estiver em um estado anormal. Por exemplo, ele fez com defeito porque a atualização do firmware falhou. Esse valor fará com que o Seeker mostre uma mensagem para informar ao usuário que precisa ser atualizado agora.
O provedor precisa limitar o acesso à característica de revisão do firmware para impedir o rastreamento do dispositivo. Restrições sugeridas:
- os dispositivos vinculados precisam ter acesso a qualquer momento
- qualquer dispositivo deve ter acesso quando o provedor for detectável
Característica: dados adicionais
Esse serviço deve ter as características a seguir.
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 (a previsão 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 que haja um handshake pela característica FE2C1234-8366-4814-8EB0-01DE32100BEA
para ter uma chave secreta compartilhada. O AES-CTR será usado para criptografar dados que fluem por essa característica, cujo algoritmo é definido abaixo. Esse modo é mais
seguro em dados que se estendem além de um único bloco de 16 bytes. O HMAC-SHA256 será usado para garantir a integridade dos dados, que também está definida abaixo.
Octeto | Descrição | Valor |
---|---|---|
0 - 7 | Os primeiros 8 bytes do HMAC-SHA256. | varia |
8 a 15 | Valor de uso único, 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 dados | 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. Descriptografados dos dados criptografados na Tabela 3.1.
Quando uma notificação é solicitada, por exemplo, para solicitar um nome personalizado usando o Bit 2 na Tabela 1.2.1, o provedor de Pareamento rápido precisa fazer o seguinte:
- Gera 8 bytes criptograficamente aleatórios para o valor de uso único.
Criptografar os dados usando AES-CTR, no qual cada bloco de 16 bytes é gerado usando
encryptedBlock[i] = clearBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))
onde
- A chave AES é a chave secreta compartilhada da etapa 4 do procedimento.
- clearBlock[i] é um bloco de 16 bytes a partir de data[i * 16]. O último bloco pode ter menos de 16 bytes.
Execute o comando concat(encryptedBlock[0], encryptionBlock[1],...) para criar os dados criptografados.
Gerar HMAC-SHA256 por
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 vem da etapa 4 do procedimento.
- opad tem um preenchimento externo de 64 bytes, composto de bytes repetidos com valor
0x5C
. - O ipad tem preenchimento interno de 64 bytes, composto de bytes repetidos, valorizados como
0x36
.
Use 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 deve fazer o seguinte:
- Verifique a integridade dos dados conferindo os primeiros 8 bytes do HMAC-SHA256.
Descriptografar os dados criptografados usando o AES-CTR, onde cada bloco é gerado usando
clearBlock[i] = encryptedBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))
onde
- encryptionBlock[i] é um bloco de início de 16 bytes de encryption_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, a origem é ECDH e não será usada novamente para este pareamento. Todas as solicitações criptografadas com essa chave sem reiniciar o procedimento serão rejeitadas.
- no fluxo de nomenclatura 2, é a chave da conta.
Execute o comando concat(clearBlock[0], clearBlock[1],...) para criar os dados brutos.