Código de autenticação de mensagem
Os fluxos de mensagens são usados para configurar a seleção de áudio. Consulte Mensagens da seleção de áudio. Para essas configurações importantes, o provedor precisa garantir que a mensagem seja enviada pelo GMSCore (módulo de pareamento rápido) e não por outro app no buscador.
Gerar MAC (código de autenticação de mensagem)
O buscador de FP adiciona um código de autenticação de mensagem para mensagens de configuração de dispositivo usando HMAC-SHA256. O MAC da mensagem consiste nos primeiros 8 bytes de:
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, message)))))
onde
- K é gerado por concat(chave da conta, ZEROs de 48 bytes).
- message são os dados extras do fluxo de mensagens.
- nonce é gerado por concat(session_nonce, message_nonce); o nonce da sessão e o nonce da mensagem são definidos na seção a seguir.
- opad são 64 bytes de preenchimento externo, consistindo em bytes repetidos com valor
0x5C. - ipad são 64 bytes de preenchimento interno, consistindo em bytes repetidos com valor
0x36.
Nonce da sessão e nonce da mensagem
Para evitar um ataque repetido, o provedor precisa garantir que um nonce não seja repetido. Como manter a sincronização do relógio ou do contador no provedor e no buscador não é simples, o provedor gera o nonce da sessão (por conexão), que é compartilhado com todas as mensagens durante a conexão, enquanto o buscador gera o nonce da mensagem (por mensagem), que é gerado aleatoriamente para cada mensagem. O nonce para gerar o MAC de cada mensagem é a combinação do nonce da sessão e do nonce da mensagem, ou seja, concat(session_nonce, message_nonce).
Adicionamos um nonce de sessão ao grupo de eventos de informações do dispositivo:
| Nome do grupo de mensagens | Valor |
|---|---|
| Evento de informações do dispositivo | 0x03 |
| Nome do código da mensagem | Valor |
|---|---|
| Nonce da sessão | 0x0A |
O nonce da sessão precisa ser gerado e enviado ao buscador quando o fluxo de mensagens se conecta:
| Octeto | Tipo de dados | Descrição | Valor |
|---|---|---|---|
| 0 | uint8 | Evento de informações do dispositivo | 0x03 |
| 1 | uint8 | Nonce da sessão | 0x0A |
| 2 - 3 | uint16 | Comprimento de dados extras | 0x0008 |
| 4 - 11 | Nonce da sessão | varia |
Para enviar uma mensagem quando um MAC é necessário, o buscador envia um nonce de mensagem e o MAC junto com a mensagem.
| Octeto | Tipo de dados | Descrição | Valor |
|---|---|---|---|
| 0 | uint8 | Grupo de mensagens | varia |
| 1 | uint8 | Código da mensagem | varia |
| 2 - 3 | uint16 | Comprimento de dados extras(o comprimento de dados extras + 16) | varia |
| 4 - n | Dados extras | varia | |
| n + 1 - n + 8 | Nonce da mensagem | varia | |
| n + 9 - n + 16 | Código de autenticação de mensagem | varia |
Verificar MAC (código de autenticação de mensagem)
Ao receber uma mensagem com o código de autenticação de mensagem, o provedor precisa verificá-la usando a mesma função da função de geração. Ou seja, o MAC recebido precisa ser igual aos primeiros 8 bytes de
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(section_nonce, message_nonce, message)))))
onde:
- K é gerado por
concat(account key, 48-byte ZEROs), e o provedor precisa percorrer todas as chaves de conta armazenadas para verificar o MAC. - message são os dados extras (excluindo o nonce da mensagem e o MAC) de o fluxo de mensagens.
Se o MAC estiver correto, o provedor vai seguir a instrução da mensagem. Caso contrário, o provedor vai enviar um NAK com o motivo do erro, 0x3: não permitido devido ao código de autenticação de mensagem incorreto.