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

  1. K é gerado por concat(chave da conta, ZEROs de 48 bytes).
  2. message são os dados extras do fluxo de mensagens.
  3. 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.
  4. opad são 64 bytes de preenchimento externo, consistindo em bytes repetidos com valor 0x5C.
  5. 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:

  1. K é gerado por concat(account key, 48-byte ZEROs), e o provedor precisa percorrer todas as chaves de conta armazenadas para verificar o MAC.
  2. 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.