Mantieni tutto organizzato con le raccolte
Salva e classifica i contenuti in base alle tue preferenze.
Codice di autenticazione del messaggio
Gli stream di messaggi vengono utilizzati per configurare Cambio Audio. Consulta:
Messaggi relativi al cambio audio. Per queste importanti configurazioni, il provider deve
per assicurare che il messaggio venga inviato da GMSCore (modulo di accoppiamento rapido) e non da
altra app sul dispositivo di ricerca.
Genera MAC (codice di autenticazione dei messaggi)
FP Seeker aggiunge un codice di autenticazione per i messaggi di configurazione del dispositivo
utilizzando HMAC-SHA256. Il MAC del messaggio è costituito dai primi 8 byte di:
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, message)))))
dove
- K viene generato da concat(chiave account, zeri a 48 byte).
- message sono i dati aggiuntivi dello stream di messaggi.
- nonce viene generato da concat(session_nonce, message_nonce); sessione
il nonce e il nonce del messaggio sono definiti nella sezione seguente.
- opad è 64 byte di spaziatura interna esterna, composta da byte ripetuti valutati
0x5C
.
- ipad è 64 byte di spaziatura interna interna, composta da byte ripetuti valutati
0x36
.
Nonce della sessione e nonce del messaggio
Per prevenire un attacco di ripetizione, il provider deve assicurarsi che un nonce non sia
ripetuto. Dal mantenimento della sincronizzazione dell'orologio o del contatore su entrambi i provider
e la funzionalità di ricerca non è immediata, il provider genera il nonce di sessione
(per connessione), che viene condiviso con tutti i messaggi durante la connessione.
mentre il ricercatore genera il nonce del messaggio (per messaggio), che viene
generate per ogni messaggio. Il nonce per generare il MAC di ciascun messaggio è
la combinazione di nonce di sessione e nonce del messaggio, ad esempio
concat(session_nonce, message_nonce).
Aggiungiamo un nonce di sessione al gruppo di eventi Informazioni del dispositivo:
Nome del gruppo di messaggi |
Valore |
Evento Informazioni dispositivo |
0x03 |
Nome codice messaggio |
Valore |
Nonce sessione |
0x0A |
Il nonce della sessione deve essere generato e inviato al cercatore quando RFCOMM
connette:
Ottetto |
Tipo di dati |
Descrizione |
Valore |
0 |
uint8 |
Evento Informazioni dispositivo |
0x03 |
1 |
uint8 |
Nonce sessione |
0x0A |
2 - 3 |
uint16 |
Dati aggiuntivi |
0x0008 |
4 - 11 |
|
nonce di sessione |
varia |
Per inviare un messaggio quando è richiesto un MAC, il ricercatore invierà un messaggio nonce
e MAC insieme al messaggio.
Ottetto |
Tipo di dati |
Descrizione |
Valore |
0 |
uint8 |
Gruppo di messaggi |
varia |
1 |
uint8 |
Codice messaggio |
varia |
2 - 3 |
uint16 |
Lunghezza dati aggiuntivi(lunghezza dei dati aggiuntivi + 16) |
varia |
4 - n |
|
Dati aggiuntivi |
varia |
N + 1 - n + 8 |
|
Nonce messaggio |
varia |
N + 9 - n + 16 |
|
Codice di autenticazione del messaggio |
varia |
Verifica MAC (codice di autenticazione dei messaggi)
Dopo aver ricevuto un messaggio con il codice di autenticazione del messaggio, il provider
deve verificarlo utilizzando la stessa funzione della funzione di generazione. Vale a dire che
l'indirizzo MAC ricevuto deve essere uguale ai primi 8 byte di
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(section_nonce, message_nonce, message)))))
dove:
- K viene generato da
concat(account key, 48-byte ZEROs)
e il provider
attraversa tutte le chiavi di account memorizzate per verificare il MAC.
- message sono i dati aggiuntivi (esclusi nonce e MAC dei messaggi) di
il flusso di messaggi.
Se il MAC è corretto, il fornitore dovrà seguire le istruzioni del
. Altrimenti, il provider invierà un NAK con il motivo dell'errore, 0x3 -
non consentito a causa di un codice di autenticazione del messaggio errato.
Salvo quando diversamente specificato, i contenuti di questa pagina sono concessi in base alla licenza Creative Commons Attribution 4.0, mentre gli esempi di codice sono concessi in base alla licenza Apache 2.0. Per ulteriori dettagli, consulta le norme del sito di Google Developers. Java è un marchio registrato di Oracle e/o delle sue consociate.
Ultimo aggiornamento 2025-08-13 UTC.
[[["Facile da capire","easyToUnderstand","thumb-up"],["Il problema è stato risolto","solvedMyProblem","thumb-up"],["Altra","otherUp","thumb-up"]],[["Mancano le informazioni di cui ho bisogno","missingTheInformationINeed","thumb-down"],["Troppo complicato/troppi passaggi","tooComplicatedTooManySteps","thumb-down"],["Obsoleti","outOfDate","thumb-down"],["Problema di traduzione","translationIssue","thumb-down"],["Problema relativo a esempi/codice","samplesCodeIssue","thumb-down"],["Altra","otherDown","thumb-down"]],["Ultimo aggiornamento 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\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\n### Generate 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\n### Session 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\n### Verify 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."]]