Mantenha tudo organizado com as coleções Salve e categorize o conteúdo com base nas suas preferências.
Código de autenticação da mensagem
Fluxos de mensagens são usados para configurar a seleção de áudio. Consulte Mensagens de seleção de áudio. Para essas configurações importantes, o provedor precisa para garantir que a mensagem seja enviada pelo GMSCore (módulo de Pareamento rápido) e não por nenhum outro aplicativo no Seeker.
Gerar MAC (código de autenticação de mensagem)
O FP Seeker adiciona um código de autenticação de mensagem para mensagens de configuração do 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 de conta, ZEROs de 48 bytes).
- message são os dados adicionais do fluxo de mensagens.
- nonce é gerado por concat(session_nonce, message_nonce); sessão os valores de uso único e de valor de uso único da mensagem são definidos na seção a seguir.
- opad tem 64 bytes de preenchimento externo, consistindo em bytes repetidos com valor
0x5C
- ipad tem 64 bytes de preenchimento interno, consistindo em bytes repetidos com valor
0x36
Valor de uso único da sessão e da mensagem
Para evitar um ataque de repetição, o provedor precisa garantir que um valor de uso único não seja repetido. Como a sincronização do relógio ou do contador é mantida e o Seeker não for simples, o provedor gera o valor de uso único da sessão (por conexão), que é compartilhada com todas as mensagens durante a conexão, enquanto o buscador gera o valor de uso único da mensagem (por mensagem), que é gerado para cada mensagem. O valor de uso único para gerar o MAC de cada mensagem é a combinação de valor de uso único da sessão e da mensagem, ou seja, concat(session_nonce, message_nonce).
Adicionamos um valor de uso único da sessão ao grupo de eventos "Informações do dispositivo":
Nome do grupo de mensagens | Valor |
Evento de informações do dispositivo | 0x03 |
Nome do código da mensagem | Valor |
Valor de uso único da sessão | 0x0A |
O nonce da sessão deve ser gerado e enviado ao buscador quando RFCOMM conecta:
Octeto | Tipo de dados | Descrição | Valor |
0 | uint8 | Evento de informações do dispositivo | 0x03 |
1 | uint8 | Valor de uso único da sessão | 0x0A |
2 a 3 | uint16 | Tamanho dos dados adicionais | 0x0008 |
4 a 11 | | valor de uso único da sessão | varia |
Para enviar uma mensagem quando um MAC for necessário, o Seeker enviará uma mensagem de valor de uso único 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 a 3 | uint16 | Comprimento de dados adicional(o tamanho dos dados adicionais + 16) | varia |
4 – N | | Outros dados | varia |
n + 1 - n + 8 | | Valor de uso único da mensagem | varia |
n + 9 - n + 16 | | Código de autenticação de mensagens | varia |
Verificar MAC (código de autenticação da mensagem)
Ao receber uma mensagem com o código de autenticação, o provedor deve verificá-lo usando a mesma função que a função geradora. Ou seja, o MAC recebido deve ser igual aos primeiros 8 bytes do
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(section_nonce, message_nonce, message)))))
em que:
- K é gerado por
concat(account key, 48-byte ZEROs)
, e o provedor deve transferir todas as chaves de conta armazenadas para verificar o MAC. - message são os dados adicionais (excluindo o valor de uso único da mensagem e o MAC) de o fluxo de mensagens.
Se o MAC estiver correto, o Provedor seguirá as instruções do mensagem. Caso contrário, o Provedor enviará um NAK com o motivo do erro, 0x3 - não permitido devido ao código de autenticação de mensagem incorreto.
Exceto em caso de indicação contrária, o conteúdo desta página é licenciado de acordo com a Licença de atribuição 4.0 do Creative Commons, e as amostras de código são licenciadas de acordo com a Licença Apache 2.0. Para mais detalhes, consulte as políticas do site do Google Developers. Java é uma marca registrada da Oracle e/ou afiliadas.
Última atualização 2025-08-13 UTC.
[[["Fácil de entender","easyToUnderstand","thumb-up"],["Meu problema foi resolvido","solvedMyProblem","thumb-up"],["Outro","otherUp","thumb-up"]],[["Não contém as informações de que eu preciso","missingTheInformationINeed","thumb-down"],["Muito complicado / etapas demais","tooComplicatedTooManySteps","thumb-down"],["Desatualizado","outOfDate","thumb-down"],["Problema na tradução","translationIssue","thumb-down"],["Problema com as amostras / o código","samplesCodeIssue","thumb-down"],["Outro","otherDown","thumb-down"]],["Última atualização 2025-08-13 UTC."],[[["\u003cp\u003eMessage Authentication Codes (MACs) are used to verify that Fast Pair configuration messages originate from Google Mobile Services (GMSCore) and not other apps.\u003c/p\u003e\n"],["\u003cp\u003eMACs are generated using HMAC-SHA256, incorporating session and message nonces to prevent replay attacks.\u003c/p\u003e\n"],["\u003cp\u003eProviders initiate a session nonce upon RFCOMM connection and seekers generate a unique message nonce for each message.\u003c/p\u003e\n"],["\u003cp\u003eTo verify a message, providers compute the MAC using the received data and compare it with the received MAC, using stored account keys for verification.\u003c/p\u003e\n"],["\u003cp\u003eIf MAC verification fails, the provider sends a NAK message indicating an incorrect authentication code.\u003c/p\u003e\n"]]],["Message Authentication Code (MAC) ensures messages originate from GMSCore. The Seeker generates a MAC using HMAC-SHA256, derived from a key (K), nonce, and message data. The nonce combines a per-connection session nonce (Provider-generated) and a per-message nonce (Seeker-generated). The Seeker transmits the message nonce and MAC with each message. The Provider verifies the MAC using the same function and stored keys, acting on the message only if the MAC is correct. If not, a NAK is sent.\n"],null,["Message Authentication Code\n\n[Message streams](/nearby/fast-pair/specifications/extensions/messagestream#MessageStream \"message stream\") are used to configure Audio switch, see\n[Audio switch messages](/nearby/fast-pair/specifications/extensions/sass#MacOfSassMessages \"MAC of Audio switch Messages\"). For these important configurations, the Provider needs\nto ensure that the message is sent by GMSCore (Fast Pair module) and not any\nother app on the Seeker.\n| **Note:** Google recommends implementing the [Cryptographic Test Cases](/nearby/fast-pair/specifications/appendix/cryptotestcases \"Link to the Cryptographic Test Cases.\") to ease verification of these requirements.\n\nGenerate MAC (message authentication code)\n\nFP Seeker adds a message authentication code for device configuration messages\nusing HMAC-SHA256. The MAC of the message consists of the first 8 bytes of: \n\n sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, message)))))\n\nwhere\n\n1. *K* is generated by concat(account key, 48-byte ZEROs).\n2. *message* is the additional data of Message stream.\n3. *nonce* is generated by concat(session_nonce, message_nonce); session nonce and message nonce are defined in the following section.\n4. *opad* is 64 bytes of outer padding, consisting of repeated bytes valued `0x5C`.\n5. *ipad* is 64 bytes of inner padding, consisting of repeated bytes valued `0x36`.\n\nSession nonce and message nonce\n\nTo prevent a replay attack, the Provider needs to ensure that a nonce is not\nrepeated. Since maintaining clock or counter synchronization on both Provider\nand Seeker is not straightforward, the Provider generates the session nonce\n(per connection), which is shared with all messages during the connection,\nwhile the Seeker generates the message nonce (per message), which is randomly\ngenerated for each message. The nonce for generating the MAC of each message is\nthe combination of session nonce and message nonce, i.e.\nconcat(session_nonce, message_nonce).\n\nWe add a session nonce to the Device information event group:\n\n| Message Group Name | Value |\n|--------------------------|-------|\n| Device information event | 0x03 |\n\n| Message Code Name | Value |\n|-------------------|-------|\n| Session nonce | 0x0A |\n\nThe session nonce should be generated and sent to the Seeker when RFCOMM\nconnects:\n\n| Octet | Data Type | Description | Value |\n|--------|-----------|--------------------------|----------|\n| 0 | uint8 | Device information event | 0x03 |\n| 1 | uint8 | Session nonce | 0x0A |\n| 2 - 3 | uint16 | Additional data length | 0x0008 |\n| 4 - 11 | | session nonce | *varies* |\n\nTo send a message when a MAC is required, the Seeker will send a message nonce\nand the MAC together with the message.\n\n| Octet | Data Type | Description | Value |\n|----------------|-----------|---------------------------------------------------------|----------|\n| 0 | uint8 | Message group | *varies* |\n| 1 | uint8 | Message code | *varies* |\n| 2 - 3 | uint16 | Additional data length(the additional data length + 16) | *varies* |\n| 4 - n | | Additional data | *varies* |\n| n + 1 - n + 8 | | Message nonce | *varies* |\n| n + 9 - n + 16 | | Message authentication code | *varies* |\n\nVerify MAC (message authentication code)\n\nUpon receiving a message with the message authentication code, the Provider\nshall verify it by using the same function as the generating function. That is,\nthe received MAC should be equal to the first 8 bytes of \n\n sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(section_nonce, message_nonce, message)))))\n\nwhere:\n\n1. *K* is generated by `concat(account key, 48-byte ZEROs)`, and the Provider shall traverse all stored account keys to verify the MAC.\n2. *message* is the additional data (excluding message nonce and MAC) of the Message stream.\n\nIf the MAC is correct, then the Provider shall follow the instruction of the\nmessage. Otherwise, the Provider shall send a NAK with the error reason, 0x3 -\nnot allowed due to incorrect message authentication code."]]