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
|
varies | Obrigatório |
| 2 a 7 | uint48 |
Uma das seguintes opções:
|
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:
|
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:
|
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:
|
| 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:
- 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.
- Para provedores que exigem vinculação (comum):
- Verifique se o valor descriptografado começa com
0x04ou0xFF. 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.
- Se o valor for
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:
status-updating: se o provedor estiver atualizando para um novo firmware. Como alternativa, o provedor pode retornar a versão do firmware em staging.
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:
|
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:
- 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 é a senha secreta 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 por
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, encrypted_data)))))onde
- K é gerado por concat(shared_secret, 48-byte ZEROs), e o shared_secret é da etapa 4 no procedimento.
- opad é um padding externo de 64 bytes, consistindo em bytes repetidos com valor
0x5C. - O ipad tem padding interno de 64 bytes, consistindo 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 de 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 no handshake, por exemplo,
- 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.
- No fluxo de nomenclatura 2, é a chave da conta.
Execute concat(clearBlock[0], clearBlock[1],...) para criar os dados brutos.